diff --git a/backend/grant/app.py b/backend/grant/app.py index 259ecc11..90c02a7d 100644 --- a/backend/grant/app.py +++ b/backend/grant/app.py @@ -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": "You’ve 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 diff --git a/backend/grant/blockchain/views.py b/backend/grant/blockchain/views.py index 8216c1c8..80869e58 100644 --- a/backend/grant/blockchain/views.py +++ b/backend/grant/blockchain/views.py @@ -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 diff --git a/backend/grant/email/send.py b/backend/grant/email/send.py index d56b79ff..9202d526 100644 --- a/backend/grant/email/send.py +++ b/backend/grant/email/send.py @@ -1,5 +1,6 @@ import sendgrid from flask import render_template, Markup, current_app +from sentry_sdk import capture_exception from grant.settings import SENDGRID_API_KEY, SENDGRID_DEFAULT_FROM, UI from grant.utils.misc import make_url from python_http_client import HTTPError @@ -359,7 +360,7 @@ def send_email(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 try: @@ -375,9 +376,12 @@ def send_email(to, type, email_args): mail.add_content(Content('text/html', email['html'])) res = sg.client.mail.send.post(request_body=mail.get()) - print('Just sent an email to %s of type %s, response code: %s' % (to, 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' % (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' % (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) diff --git a/backend/grant/proposal/views.py b/backend/grant/proposal/views.py index 66482646..bb180a01 100644 --- a/backend/grant/proposal/views.py +++ b/backend/grant/proposal/views.py @@ -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_ @@ -530,7 +530,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: diff --git a/backend/grant/task/views.py b/backend/grant/task/views.py index c1f14908..28369826 100644 --- a/backend/grant/task/views.py +++ b/backend/grant/task/views.py @@ -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)) diff --git a/backend/grant/utils/auth.py b/backend/grant/utils/auth.py index 68bab2d5..88fb6985 100644 --- a/backend/grant/utils/auth.py +++ b/backend/grant/utils/auth.py @@ -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) diff --git a/backend/requirements/prod.txt b/backend/requirements/prod.txt index c25625bd..39ad3deb 100644 --- a/backend/requirements/prod.txt +++ b/backend/requirements/prod.txt @@ -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 diff --git a/blockchain/package.json b/blockchain/package.json index 9aa91ec6..d3c086fa 100755 --- a/blockchain/package.json +++ b/blockchain/package.json @@ -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", diff --git a/blockchain/yarn.lock b/blockchain/yarn.lock index 1810869e..ce57fd57 100755 --- a/blockchain/yarn.lock +++ b/blockchain/yarn.lock @@ -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" diff --git a/frontend/package.json b/frontend/package.json index 90231faf..af5c11d9 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -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", diff --git a/frontend/yarn.lock b/frontend/yarn.lock index f64632e5..fc0380f4 100644 --- a/frontend/yarn.lock +++ b/frontend/yarn.lock @@ -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"