Merge branch 'develop' into batch-emails

# Conflicts:
#	backend/grant/email/send.py
This commit is contained in:
Aaron 2019-03-13 15:11:54 -05:00
commit 0f055d6b39
No known key found for this signature in database
GPG Key ID: 3B5B7597106F0A0E
13 changed files with 187 additions and 127 deletions

View File

@ -1,12 +1,15 @@
# -*- coding: utf-8 -*-
"""The app module, containing the app factory function."""
import sentry_sdk
import logging
import traceback
from animal_case import animalify
from flask import Flask, Response, jsonify, request
from flask_cors import CORS
from flask_security import SQLAlchemyUserDatastore
from flask_sslify import SSLify
from sentry_sdk.integrations.flask import FlaskIntegration
from sentry_sdk.integrations.logging import LoggingIntegration
from grant import commands, proposal, user, comment, milestone, admin, email, blockchain, task, rfp
from grant.extensions import bcrypt, migrate, db, ma, security, limiter
@ -40,7 +43,7 @@ def create_app(config_objects=["grant.settings"]):
def handle_error(err):
headers = err.data.get("headers", None)
messages = err.data.get("messages", "Invalid request.")
error_message = "Something went wrong with your request. That's all we know"
error_message = "Something was wrong with your request"
if type(messages) == dict:
if 'json' in messages:
error_message = messages['json'][0]
@ -49,13 +52,24 @@ def create_app(config_objects=["grant.settings"]):
else:
return jsonify({"message": error_message}), err.code
@app.errorhandler(404)
def handle_notfound_error(err):
error_message = "Unknown route '{} {}'".format(request.method, request.path)
return jsonify({"message": error_message}), 404
@app.errorhandler(429)
def handle_limit_error(err):
print(f'Rate limited request to {request.method} {request.path} from ip {request.remote_addr}')
app.logger.warn(f'Rate limited request to {request.method} {request.path} from ip {request.remote_addr}')
return jsonify({"message": "Youve done that too many times, please wait and try again later"}), 429
@app.errorhandler(Exception)
def handle_exception(err):
sentry_sdk.capture_exception(err)
app.logger.debug(traceback.format_exc())
app.logger.debug("Uncaught exception at {} {}, see above for traceback".format(request.method, request.path))
return jsonify({"message": "Something went wrong"}), 500
for conf in config_objects:
@ -67,10 +81,14 @@ def create_app(config_objects=["grant.settings"]):
register_commands(app)
if not app.config.get("TESTING"):
sentry_logging = LoggingIntegration(
level=logging.INFO,
event_level=logging.ERROR
)
sentry_sdk.init(
environment=ENV,
release=SENTRY_RELEASE,
integrations=[FlaskIntegration()]
integrations=[FlaskIntegration(), sentry_logging]
)
# handle all AuthExceptions thusly

View File

@ -1,4 +1,4 @@
from flask import Blueprint
from flask import Blueprint, current_app
from grant.blockchain.bootstrap import send_bootstrap_data
from grant.utils.auth import internal_webhook
@ -9,6 +9,6 @@ blueprint = Blueprint("blockchain", __name__, url_prefix="/api/v1/blockchain")
@blueprint.route("/bootstrap", methods=["GET"])
@internal_webhook
def get_bootstrap_info():
print('Bootstrap data requested from blockchain watcher microservice...')
current_app.logger.info('Bootstrap data requested from blockchain watcher microservice...')
send_bootstrap_data()
return {"message": "ok"}, 200

View File

@ -1,8 +1,8 @@
import sendgrid
import time
from threading import Thread
from flask import render_template, Markup, current_app
from grant.settings import SENDGRID_API_KEY, SENDGRID_DEFAULT_FROM, UI
from grant.settings import SENDGRID_API_KEY, SENDGRID_DEFAULT_FROM, SENDGRID_DEFAULT_FROMNAME, UI
from sentry_sdk import capture_exception
from grant.utils.misc import make_url
from python_http_client import HTTPError
from sendgrid.helpers.mail import Email, Mail, Content
@ -35,8 +35,8 @@ def team_invite_info(email_args):
def recover_info(email_args):
return {
'subject': '{} account recovery'.format(UI['NAME']),
'title': '{} account recovery'.format(UI['NAME']),
'subject': 'Recover your account',
'title': 'Recover your account',
'preview': 'Use the link to recover your account.'
}
@ -366,13 +366,12 @@ def make_envelope(to, type, email_args):
if user and 'subscription' in info:
sub = info['subscription']
if user and not is_subscribed(user.settings.email_subscriptions, sub):
print(f'Ignoring send_email to {to} of type {type} because user is unsubscribed.')
app.logger.debug(f'Ignoring send_email to {to} of type {type} because user is unsubscribed.')
return None
email = generate_email(type, email_args, user)
mail = Mail(
from_email=Email(SENDGRID_DEFAULT_FROM),
from_email=Email(SENDGRID_DEFAULT_FROM, SENDGRID_DEFAULT_FROMNAME),
to_email=Email(to),
subject=email['info']['subject'],
)
@ -389,12 +388,17 @@ def sendgrid_send(mail):
try:
sg = sendgrid.SendGridAPIClient(apikey=SENDGRID_API_KEY)
res = sg.client.mail.send.post(request_body=mail.get())
print('Just sent an email to %s of type %s, response code: %s' % (mail.___to, mail.___type, res.status_code))
current_app.logger.info('Just sent an email to %s of type %s, response code: %s' % (to, type, res.status_code))
except HTTPError as e:
print('An HTTP error occured while sending an email to %s - %s: %s' % (mail.___to, e.__class__.__name__, e))
print(e.body)
current_app.logger.info('An HTTP error occured while sending an email to %s - %s: %s' %
(to, e.__class__.__name__, e))
current_app.logger.debug(e.body)
capture_exception(e)
except Exception as e:
print('An unknown error occured while sending an email to %s - %s: %s' % (mail.___to, e.__class__.__name__, e))
current_app.logger.info('An unknown error occured while sending an email to %s - %s: %s' %
(to, e.__class__.__name__, e))
current_app.logger.debug(e)
capture_exception(e)
class EmailSender(Thread):
@ -408,6 +412,5 @@ class EmailSender(Thread):
self.envelopes.append(env)
def run(self):
# time.sleep(5)
for envelope in self.envelopes:
sendgrid_send(envelope)

View File

@ -1,7 +1,7 @@
from datetime import datetime
from decimal import Decimal
from flask import Blueprint, g, request
from flask import Blueprint, g, request, current_app
from marshmallow import fields, validate
from sqlalchemy import or_
@ -532,7 +532,7 @@ def post_contribution_confirmation(contribution_id, to, amount, txid):
if not contribution:
# TODO: Log in sentry
print(f'Unknown contribution {contribution_id} confirmed with txid {txid}')
current_app.logger.warn(f'Unknown contribution {contribution_id} confirmed with txid {txid}')
return {"message": "No contribution matching id"}, 404
if contribution.status == ContributionStatus.CONFIRMED:

View File

@ -29,7 +29,8 @@ SQLALCHEMY_TRACK_MODIFICATIONS = False
SESSION_COOKIE_DOMAIN = env.str('SESSION_COOKIE_DOMAIN', default=None)
SENDGRID_API_KEY = env.str("SENDGRID_API_KEY", default="")
SENDGRID_DEFAULT_FROM = "noreply@zfnd.org"
SENDGRID_DEFAULT_FROM = "noreply@grants.zfnd.org"
SENDGRID_DEFAULT_FROMNAME = "ZF Grants"
SENTRY_DSN = env.str("SENTRY_DSN", default=None)
SENTRY_RELEASE = env.str("SENTRY_RELEASE", default=None)

View File

@ -1,6 +1,8 @@
from datetime import datetime
from flask import Blueprint, jsonify, current_app
from sentry_sdk import capture_exception
from traceback import format_exc
from flask import Blueprint, jsonify
from grant.task.jobs import JOBS
from grant.task.models import Task, tasks_schema
from grant.extensions import db
@ -17,7 +19,7 @@ def task():
each_task.completed = True
db.session.add(each_task)
except Exception as e:
# replace with Sentry logging
print("Oops, something went wrong: {}".format(e))
current_app.logger.info("Task #{} failed: {}".format(each_task.id, e))
capture_exception(e)
db.session.commit()
return jsonify(tasks_schema.dump(tasks))

View File

@ -2,7 +2,7 @@ from functools import wraps
from datetime import datetime, timedelta
import sentry_sdk
from flask import request, g, jsonify, session
from flask import request, g, jsonify, session, current_app
from flask_security.core import current_user
from flask_security.utils import logout_user
from grant.proposal.models import Proposal
@ -156,10 +156,10 @@ def internal_webhook(f):
def decorated(*args, **kwargs):
secret = request.headers.get('authorization')
if not secret:
print('Internal webhook missing "Authorization" header')
current_app.logger.warn('Internal webhook missing "Authorization" header')
return jsonify(message="Invalid 'Authorization' header"), 403
if BLOCKCHAIN_API_SECRET not in secret:
print(f'Internal webhook provided invalid "Authorization" header: {secret}')
current_app.logger.warn(f'Internal webhook provided invalid "Authorization" header: {secret}')
return jsonify(message="Invalid 'Authorization' header"), 403
return f(*args, **kwargs)

View File

@ -54,7 +54,7 @@ markdownify
sendgrid==5.6.0
#sentry
sentry-sdk[flask]==0.5.5
sentry-sdk[flask]==0.7.6
#boto3 (AWS sdk)
boto3==1.9.52

View File

@ -30,7 +30,7 @@
"typescript": "^3.2.1"
},
"dependencies": {
"@sentry/node": "4.4.2",
"@sentry/node": "4.6.4",
"@types/cors": "2.8.4",
"@types/dotenv": "^6.1.0",
"@types/ws": "^6.0.1",

View File

@ -2,62 +2,63 @@
# yarn lockfile v1
"@sentry/core@4.4.2":
version "4.4.2"
resolved "https://registry.yarnpkg.com/@sentry/core/-/core-4.4.2.tgz#562526bc634c087f04bbca68b09cedc4b41cc64d"
integrity sha512-hJyAodTCf4sZfVdf41Rtuzj4EsyzYq5rdMZ+zc2Vinwdf8D0/brHe91fHeO0CKXEb2P0wJsrjwMidG/ccq/M8A==
"@sentry/core@4.6.4":
version "4.6.4"
resolved "https://registry.yarnpkg.com/@sentry/core/-/core-4.6.4.tgz#7236e08115423b81b96a13c2c37f29bcc1477745"
integrity sha512-NGl2nkAaQ8dGqJAMS1Hb+7RyVjW4tmCbK6d7H/zKnOpBuU+qSW4XCm2NoGLLa8qb4SZUPIBRv6U0ByvEQlGtqw==
dependencies:
"@sentry/hub" "4.4.2"
"@sentry/minimal" "4.4.2"
"@sentry/types" "4.4.2"
"@sentry/utils" "4.4.2"
"@sentry/hub" "4.6.4"
"@sentry/minimal" "4.6.4"
"@sentry/types" "4.5.3"
"@sentry/utils" "4.6.4"
tslib "^1.9.3"
"@sentry/hub@4.4.2":
version "4.4.2"
resolved "https://registry.yarnpkg.com/@sentry/hub/-/hub-4.4.2.tgz#1399556fda06fb83c4f186c4aa842725f520159c"
integrity sha512-oe9ytXkTWyD+QmOpVzHAqTbRV4Hc0ee2Nt6HvrDtRmlXzQxfvTWG2F8KYT6w8kzqg5klnuRpnsmgTTV3KuNBVQ==
"@sentry/hub@4.6.4":
version "4.6.4"
resolved "https://registry.yarnpkg.com/@sentry/hub/-/hub-4.6.4.tgz#2bd5d67ccd43d4f5afc45005a330a11b14d46cea"
integrity sha512-R3ACxUZbrAMP6vyIvt1k4bE3OIyg1CzbEhzknKljPrk1abVmJVP7W/X1vBysdRtI3m/9RjOSO7Lxx3XXqoHoQg==
dependencies:
"@sentry/types" "4.4.2"
"@sentry/utils" "4.4.2"
"@sentry/types" "4.5.3"
"@sentry/utils" "4.6.4"
tslib "^1.9.3"
"@sentry/minimal@4.4.2":
version "4.4.2"
resolved "https://registry.yarnpkg.com/@sentry/minimal/-/minimal-4.4.2.tgz#13fffc6b17a2401b6a79947838a637626ab80b10"
integrity sha512-GEZZiNvVgqFAESZhAe3vjwTInn13lI2bSI3ItQN4RUWKL/W4n/fwVoDJbkb1U8aWxanuMnRDEpKwyQv6zYTZfw==
"@sentry/minimal@4.6.4":
version "4.6.4"
resolved "https://registry.yarnpkg.com/@sentry/minimal/-/minimal-4.6.4.tgz#dc4bb47df90dad6025d832852ac11fe29ed50147"
integrity sha512-jZa9mfzDzJI98tg6uxFG3gdVLyz0nOHpLP9H8Kn/BelZ7WEG/ogB8PDi1hI9JvCTXAr8kV81mEecldADa9L9Yg==
dependencies:
"@sentry/hub" "4.4.2"
"@sentry/types" "4.4.2"
"@sentry/hub" "4.6.4"
"@sentry/types" "4.5.3"
tslib "^1.9.3"
"@sentry/node@4.4.2":
version "4.4.2"
resolved "https://registry.yarnpkg.com/@sentry/node/-/node-4.4.2.tgz#549921d2df3cbf58ebcfb525c3005c3fec4739a3"
integrity sha512-8/KlSdfVhledZ6PS6muxZY5r2pqhw8MNSXP7AODR2qRrHwsbnirVgV21WIAYAjKXEfYQGbm69lyoaTJGazlQ3Q==
"@sentry/node@4.6.4":
version "4.6.4"
resolved "https://registry.yarnpkg.com/@sentry/node/-/node-4.6.4.tgz#933c2e3ce93bc7861de6d4310ed1fe66f85da301"
integrity sha512-nfaLB+cE0dddjWD0yI0nB/UqXkPw/6FKDRpB1NZ61amAM4QRXa4hRTdHvqjUovzV/5/pVMQYsOyCk0pNWMtMUQ==
dependencies:
"@sentry/core" "4.4.2"
"@sentry/hub" "4.4.2"
"@sentry/types" "4.4.2"
"@sentry/utils" "4.4.2"
"@sentry/core" "4.6.4"
"@sentry/hub" "4.6.4"
"@sentry/types" "4.5.3"
"@sentry/utils" "4.6.4"
"@types/stack-trace" "0.0.29"
cookie "0.3.1"
https-proxy-agent "^2.2.1"
https-proxy-agent "2.2.1"
lru_map "0.3.3"
lsmod "1.0.0"
stack-trace "0.0.10"
tslib "^1.9.3"
"@sentry/types@4.4.2":
version "4.4.2"
resolved "https://registry.yarnpkg.com/@sentry/types/-/types-4.4.2.tgz#f38dd3bc671cd2f5983a85553aebeac9c2286b17"
integrity sha512-QyQd6PKKIyjJgaq/RQjsxPJEWbXcuiWZ9RvSnhBjS5jj53HEzkM1qkbAFqlYHJ1DTJJ1EuOM4+aTmGzHe93zuA==
"@sentry/types@4.5.3":
version "4.5.3"
resolved "https://registry.yarnpkg.com/@sentry/types/-/types-4.5.3.tgz#3350dce2b7f9b936a8c327891c12e3aef7bd8852"
integrity sha512-7ll1PAFNjrBNX9rzy3P2qAQrpQwHaDO3uKj735qsnGw34OtAS8Xr8WYrjI14f9fMPa/XIeWvMPb4GMic28V/ag==
"@sentry/utils@4.4.2":
version "4.4.2"
resolved "https://registry.yarnpkg.com/@sentry/utils/-/utils-4.4.2.tgz#e05a47e135ecef29e63a996f59aee8c8f792c222"
integrity sha512-j/Ad8G1abHlJdD2q7aWWbSOSeWB5M5v1R1VKL8YPlwEbSvvmEQWePhBKFI0qlnKd2ObdUQsj86pHEXJRSFNfCw==
"@sentry/utils@4.6.4":
version "4.6.4"
resolved "https://registry.yarnpkg.com/@sentry/utils/-/utils-4.6.4.tgz#ca254c142b519b4f20d63c2f9edf1a89966be36f"
integrity sha512-Tc5R46z7ve9Z+uU34ceDoEUR7skfQgXVIZqjbrTQphgm6EcMSNdRfkK3SJYZL5MNKiKhb7Tt/O3aPBy5bTZy6w==
dependencies:
"@sentry/types" "4.4.2"
"@sentry/types" "4.5.3"
tslib "^1.9.3"
"@types/body-parser@*", "@types/body-parser@1.17.0":
@ -1005,7 +1006,7 @@ http-errors@1.6.3, http-errors@~1.6.2, http-errors@~1.6.3:
setprototypeof "1.1.0"
statuses ">= 1.4.0 < 2"
https-proxy-agent@^2.2.1:
https-proxy-agent@2.2.1:
version "2.2.1"
resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-2.2.1.tgz#51552970fa04d723e04c56d04178c3f92592bbc0"
integrity sha512-HPCTS1LW51bcyMYbxUIOO4HEOlQ1/1qRaFWcyxvwaqUS9TY88aoEuHUY33kuAh1YhVVaDQhLZsnPd+XNARWZlQ==
@ -1320,6 +1321,11 @@ lru-cache@^4.0.1:
pseudomap "^1.0.2"
yallist "^2.1.2"
lru_map@0.3.3:
version "0.3.3"
resolved "https://registry.yarnpkg.com/lru_map/-/lru_map-0.3.3.tgz#b5c8351b9464cbd750335a79650a0ec0e56118dd"
integrity sha1-tcg1G5Rky9dQM1p5ZQoOwOVhGN0=
lsmod@1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/lsmod/-/lsmod-1.0.0.tgz#9a00f76dca36eb23fa05350afe1b585d4299e64b"

View File

@ -46,13 +46,12 @@ class ProfileContribution extends React.Component<Props> {
);
} else if (isExpired) {
tag = <Tag color="red">Expired</Tag>;
// TODO: Link to support
actions = (
<>
<Popconfirm title="Are you sure?" onConfirm={this.deleteContribution}>
<a>Delete</a>
</Popconfirm>
<Link to="/support">Contact support</Link>
<Link to="/contact">Contact support</Link>
</>
);
} else {

View File

@ -42,8 +42,8 @@
"@loadable/component": "5.5.0",
"@loadable/server": "5.5.0",
"@loadable/webpack-plugin": "5.5.0",
"@sentry/browser": "^4.3.2",
"@sentry/node": "^4.3.2",
"@sentry/browser": "4.6.4",
"@sentry/node": "4.6.4",
"@svgr/webpack": "^2.4.0",
"@types/classnames": "^2.2.6",
"@types/cors": "^2.8.4",

View File

@ -1487,59 +1487,74 @@
dependencies:
any-observable "^0.3.0"
"@sentry/browser@^4.3.2":
version "4.3.2"
resolved "https://registry.yarnpkg.com/@sentry/browser/-/browser-4.3.2.tgz#430b83583c5c25d33041dd80bf6ed19216086f70"
"@sentry/browser@4.6.4":
version "4.6.4"
resolved "https://registry.yarnpkg.com/@sentry/browser/-/browser-4.6.4.tgz#94e376be7bb313b6faf9e40950405897dd1c1605"
integrity sha512-w2ITpQbs2vTKS5vtPXDgeDyr+5C4lCnTXugJrqn8u8w/XaDb3vRogfMWpQcaUENllO5xdZSItSAAHsQucY/LvA==
dependencies:
"@sentry/core" "4.3.2"
"@sentry/types" "4.3.2"
"@sentry/utils" "4.3.2"
"@sentry/core" "4.6.4"
"@sentry/types" "4.5.3"
"@sentry/utils" "4.6.4"
tslib "^1.9.3"
"@sentry/core@4.3.2":
version "4.3.2"
resolved "https://registry.yarnpkg.com/@sentry/core/-/core-4.3.2.tgz#e8a2850a11316d865ed7d3030ee2c4a1608bb1d8"
"@sentry/core@4.6.4":
version "4.6.4"
resolved "https://registry.yarnpkg.com/@sentry/core/-/core-4.6.4.tgz#7236e08115423b81b96a13c2c37f29bcc1477745"
integrity sha512-NGl2nkAaQ8dGqJAMS1Hb+7RyVjW4tmCbK6d7H/zKnOpBuU+qSW4XCm2NoGLLa8qb4SZUPIBRv6U0ByvEQlGtqw==
dependencies:
"@sentry/hub" "4.3.2"
"@sentry/minimal" "4.3.2"
"@sentry/types" "4.3.2"
"@sentry/utils" "4.3.2"
"@sentry/hub" "4.6.4"
"@sentry/minimal" "4.6.4"
"@sentry/types" "4.5.3"
"@sentry/utils" "4.6.4"
tslib "^1.9.3"
"@sentry/hub@4.3.2":
version "4.3.2"
resolved "https://registry.yarnpkg.com/@sentry/hub/-/hub-4.3.2.tgz#1ea10038e2080035d2bc09f5f26829cd106a1516"
"@sentry/hub@4.6.4":
version "4.6.4"
resolved "https://registry.yarnpkg.com/@sentry/hub/-/hub-4.6.4.tgz#2bd5d67ccd43d4f5afc45005a330a11b14d46cea"
integrity sha512-R3ACxUZbrAMP6vyIvt1k4bE3OIyg1CzbEhzknKljPrk1abVmJVP7W/X1vBysdRtI3m/9RjOSO7Lxx3XXqoHoQg==
dependencies:
"@sentry/types" "4.3.2"
"@sentry/utils" "4.3.2"
"@sentry/types" "4.5.3"
"@sentry/utils" "4.6.4"
tslib "^1.9.3"
"@sentry/minimal@4.3.2":
version "4.3.2"
resolved "https://registry.yarnpkg.com/@sentry/minimal/-/minimal-4.3.2.tgz#c0958e5858b2105a6a0b523787e459a03af603cc"
"@sentry/minimal@4.6.4":
version "4.6.4"
resolved "https://registry.yarnpkg.com/@sentry/minimal/-/minimal-4.6.4.tgz#dc4bb47df90dad6025d832852ac11fe29ed50147"
integrity sha512-jZa9mfzDzJI98tg6uxFG3gdVLyz0nOHpLP9H8Kn/BelZ7WEG/ogB8PDi1hI9JvCTXAr8kV81mEecldADa9L9Yg==
dependencies:
"@sentry/hub" "4.3.2"
"@sentry/types" "4.3.2"
"@sentry/hub" "4.6.4"
"@sentry/types" "4.5.3"
tslib "^1.9.3"
"@sentry/node@^4.3.2":
version "4.3.2"
resolved "https://registry.yarnpkg.com/@sentry/node/-/node-4.3.2.tgz#3c7cd3aff238f3b1eb3252147b963cbdf520aa45"
"@sentry/node@4.6.4":
version "4.6.4"
resolved "https://registry.yarnpkg.com/@sentry/node/-/node-4.6.4.tgz#933c2e3ce93bc7861de6d4310ed1fe66f85da301"
integrity sha512-nfaLB+cE0dddjWD0yI0nB/UqXkPw/6FKDRpB1NZ61amAM4QRXa4hRTdHvqjUovzV/5/pVMQYsOyCk0pNWMtMUQ==
dependencies:
"@sentry/core" "4.3.2"
"@sentry/hub" "4.3.2"
"@sentry/types" "4.3.2"
"@sentry/utils" "4.3.2"
"@sentry/core" "4.6.4"
"@sentry/hub" "4.6.4"
"@sentry/types" "4.5.3"
"@sentry/utils" "4.6.4"
"@types/stack-trace" "0.0.29"
cookie "0.3.1"
https-proxy-agent "2.2.1"
lru_map "0.3.3"
lsmod "1.0.0"
md5 "2.2.1"
stack-trace "0.0.10"
tslib "^1.9.3"
"@sentry/types@4.3.2":
version "4.3.2"
resolved "https://registry.yarnpkg.com/@sentry/types/-/types-4.3.2.tgz#28b143979482fcbc9f9e520250482dde015b13fa"
"@sentry/types@4.5.3":
version "4.5.3"
resolved "https://registry.yarnpkg.com/@sentry/types/-/types-4.5.3.tgz#3350dce2b7f9b936a8c327891c12e3aef7bd8852"
integrity sha512-7ll1PAFNjrBNX9rzy3P2qAQrpQwHaDO3uKj735qsnGw34OtAS8Xr8WYrjI14f9fMPa/XIeWvMPb4GMic28V/ag==
"@sentry/utils@4.3.2":
version "4.3.2"
resolved "https://registry.yarnpkg.com/@sentry/utils/-/utils-4.3.2.tgz#de14046eba972af9d62508f78cd998b0352d634a"
"@sentry/utils@4.6.4":
version "4.6.4"
resolved "https://registry.yarnpkg.com/@sentry/utils/-/utils-4.6.4.tgz#ca254c142b519b4f20d63c2f9edf1a89966be36f"
integrity sha512-Tc5R46z7ve9Z+uU34ceDoEUR7skfQgXVIZqjbrTQphgm6EcMSNdRfkK3SJYZL5MNKiKhb7Tt/O3aPBy5bTZy6w==
dependencies:
"@sentry/types" "4.3.2"
"@sentry/types" "4.5.3"
tslib "^1.9.3"
"@storybook/addons@4.0.0-alpha.22":
version "4.0.0-alpha.22"
@ -2001,6 +2016,11 @@
version "1.7.5"
resolved "https://registry.yarnpkg.com/@types/showdown/-/showdown-1.7.5.tgz#91061f2f16d5bdf66b186185999ed675a8908b6a"
"@types/stack-trace@0.0.29":
version "0.0.29"
resolved "https://registry.yarnpkg.com/@types/stack-trace/-/stack-trace-0.0.29.tgz#eb7a7c60098edb35630ed900742a5ecb20cfcb4d"
integrity sha512-TgfOX+mGY/NyNxJLIbDWrO9DjGoVSW9+aB8H2yy1fy32jsvxijhmyJI9fDFgvz3YP4lvJaq9DzdR/M1bOgVc9g==
"@types/storybook__react@^3.0.9":
version "3.0.9"
resolved "https://registry.yarnpkg.com/@types/storybook__react/-/storybook__react-3.0.9.tgz#aac193f0c037ddfc2342bd027d720553ac089a56"
@ -2243,6 +2263,13 @@ address@1.0.3, address@^1.0.1:
version "1.0.3"
resolved "https://registry.yarnpkg.com/address/-/address-1.0.3.tgz#b5f50631f8d6cec8bd20c963963afb55e06cbce9"
agent-base@^4.1.0:
version "4.2.1"
resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-4.2.1.tgz#d89e5999f797875674c07d87f260fc41e83e8ca9"
integrity sha512-JVwXMr9nHYTUXsBFKUqhJwvlcYU/blreOEUkhNR2eXZIvwd+c+o5V4MgDPKWnMS/56awN3TRzIP+KoPn+roQtg==
dependencies:
es6-promisify "^5.0.0"
"airbnb-js-shims@^1 || ^2":
version "2.1.1"
resolved "https://registry.yarnpkg.com/airbnb-js-shims/-/airbnb-js-shims-2.1.1.tgz#a509611480db7e6d9db62fe2acfaeb473b6842ac"
@ -3444,10 +3471,6 @@ chardet@^0.7.0:
version "0.7.0"
resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.7.0.tgz#90094849f0937f2eedc2425d0d28a9e5f0cbad9e"
charenc@~0.0.1:
version "0.0.2"
resolved "https://registry.yarnpkg.com/charenc/-/charenc-0.0.2.tgz#c0a1d2f3a7092e03774bfa83f14c0fc5790a8667"
check-types@^7.3.0:
version "7.4.0"
resolved "https://registry.yarnpkg.com/check-types/-/check-types-7.4.0.tgz#0378ec1b9616ec71f774931a3c6516fad8c152f4"
@ -3988,10 +4011,6 @@ cross-spawn@^3.0.0:
lru-cache "^4.0.1"
which "^1.2.9"
crypt@~0.0.1:
version "0.0.2"
resolved "https://registry.yarnpkg.com/crypt/-/crypt-0.0.2.tgz#88d7ff7ec0dfb86f713dc87bbb42d044d3e6c41b"
crypto-browserify@^3.11.0:
version "3.12.0"
resolved "https://registry.yarnpkg.com/crypto-browserify/-/crypto-browserify-3.12.0.tgz#396cf9f3137f03e4b8e532c58f698254e00f80ec"
@ -4784,6 +4803,13 @@ es6-promise@^4.0.3:
version "4.1.1"
resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-4.1.1.tgz#8811e90915d9a0dba36274f0b242dbda78f9c92a"
es6-promisify@^5.0.0:
version "5.0.0"
resolved "https://registry.yarnpkg.com/es6-promisify/-/es6-promisify-5.0.0.tgz#5109d62f3e56ea967c4b63505aef08291c8a5203"
integrity sha1-UQnWLz5W6pZ8S2NQWu8IKRyKUgM=
dependencies:
es6-promise "^4.0.3"
es6-shim@^0.35.3:
version "0.35.3"
resolved "https://registry.yarnpkg.com/es6-shim/-/es6-shim-0.35.3.tgz#9bfb7363feffff87a6cdb6cd93e405ec3c4b6f26"
@ -6152,6 +6178,14 @@ https-browserify@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/https-browserify/-/https-browserify-1.0.0.tgz#ec06c10e0a34c0f2faf199f7fd7fc78fffd03c73"
https-proxy-agent@2.2.1:
version "2.2.1"
resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-2.2.1.tgz#51552970fa04d723e04c56d04178c3f92592bbc0"
integrity sha512-HPCTS1LW51bcyMYbxUIOO4HEOlQ1/1qRaFWcyxvwaqUS9TY88aoEuHUY33kuAh1YhVVaDQhLZsnPd+XNARWZlQ==
dependencies:
agent-base "^4.1.0"
debug "^3.1.0"
https-proxy@0.0.2:
version "0.0.2"
resolved "https://registry.yarnpkg.com/https-proxy/-/https-proxy-0.0.2.tgz#9e7d542f1ce8d37c06e1f940a8a9a227bb48ddf0"
@ -6488,7 +6522,7 @@ is-binary-path@^1.0.0:
dependencies:
binary-extensions "^1.0.0"
is-buffer@^1.0.2, is-buffer@^1.1.5, is-buffer@~1.1.1:
is-buffer@^1.0.2, is-buffer@^1.1.5:
version "1.1.6"
resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be"
@ -7437,6 +7471,11 @@ lru-cache@^4.1.1:
pseudomap "^1.0.2"
yallist "^2.1.2"
lru_map@0.3.3:
version "0.3.3"
resolved "https://registry.yarnpkg.com/lru_map/-/lru_map-0.3.3.tgz#b5c8351b9464cbd750335a79650a0ec0e56118dd"
integrity sha1-tcg1G5Rky9dQM1p5ZQoOwOVhGN0=
lsmod@1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/lsmod/-/lsmod-1.0.0.tgz#9a00f76dca36eb23fa05350afe1b585d4299e64b"
@ -7493,14 +7532,6 @@ md5.js@^1.3.4:
hash-base "^3.0.0"
inherits "^2.0.1"
md5@2.2.1:
version "2.2.1"
resolved "https://registry.yarnpkg.com/md5/-/md5-2.2.1.tgz#53ab38d5fe3c8891ba465329ea23fac0540126f9"
dependencies:
charenc "~0.0.1"
crypt "~0.0.1"
is-buffer "~1.1.1"
mdn-data@~1.1.0:
version "1.1.4"
resolved "https://registry.yarnpkg.com/mdn-data/-/mdn-data-1.1.4.tgz#50b5d4ffc4575276573c4eedb8780812a8419f01"
@ -11341,7 +11372,7 @@ tslib@1.9.0:
version "1.9.0"
resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.9.0.tgz#e37a86fda8cbbaf23a057f473c9f4dc64e5fc2e8"
tslib@^1.7.1, tslib@^1.8.0, tslib@^1.8.1, tslib@^1.9.0, tslib@^1.9.2:
tslib@^1.7.1, tslib@^1.8.0, tslib@^1.8.1, tslib@^1.9.0, tslib@^1.9.2, tslib@^1.9.3:
version "1.9.3"
resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.9.3.tgz#d7e4dd79245d85428c4d7e4822a79917954ca286"