From f6d406a502bbfe6bc4c60aea83ac5c970b420db3 Mon Sep 17 00:00:00 2001 From: Samuel Yun Date: Sat, 5 Jan 2019 21:09:47 -0500 Subject: [PATCH] Add points support (#47) * Add note for PROXY variable (#36) * Include note about PROXY variable format * Updates SMS module for new Plivo structure (#41) Thanks @ribordy * Preliminary support for points booking * Add formatted pricing * Fix parsing * Tests, update dates/version, graph * Linted * linted * text formatting for points * Restore remote links * Throw Error object * missed text format * Disable PN/email fields if not enabled * Forgotten data --- LICENSE | 2 +- README.md | 3 + lib/apps/app.js | 20 +- lib/apps/email-handler.js | 8 +- lib/bot/alert.js | 48 +- lib/bot/get-price.js | 56 +- lib/bot/send-email.js | 4 +- lib/bot/send-sms.js | 2 +- lib/constants.js | 2 +- lib/history-graph.js | 67 +- lib/server.js | 4 +- lib/views/form.pug | 71 +- lib/views/list.pug | 6 +- lib/views/show.pug | 4 +- package.json | 44 +- static/style.css | 12 +- tasks/check.js | 14 +- test/bot/alert.js | 284 ++- test/bot/get-price-cash.js | 85 + .../bot/{get-price.js => get-price-points.js} | 31 +- yarn.lock | 1721 ++++++++++------- 21 files changed, 1464 insertions(+), 1024 deletions(-) create mode 100644 test/bot/get-price-cash.js rename test/bot/{get-price.js => get-price-points.js} (76%) diff --git a/LICENSE b/LICENSE index 4229af8..8258edb 100644 --- a/LICENSE +++ b/LICENSE @@ -1,7 +1,7 @@ The MIT License (MIT) Original work Copyright (c) 2017 Scott Hardy -Modified work Copyright (c) 2017 Sam Yun +Modified work Copyright (c) 2018 Sam Yun Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/README.md b/README.md index 3f6caa3..1e5da91 100644 --- a/README.md +++ b/README.md @@ -86,6 +86,9 @@ Instructions on deploying a proxy is outside the scope of this project. However, To configure the Price Drop Bot to use your proxy, define a new PROXY variable within the Heroku Config. The proxy format should just be IP:port. Example: 123.123.123.123:1234 ## Version history +### [3.3.0] - 2018-12-25 + - Add support for award flights (points) + - Updated dependencies to latest versions ### [3.2.1] - 2018-7-23 - Merge PR from @GC-Guy to fix proxy support in checks ### [3.2.0] - 2018-7-21 diff --git a/lib/apps/app.js b/lib/apps/app.js index 1594a77..142286f 100644 --- a/lib/apps/app.js +++ b/lib/apps/app.js @@ -43,7 +43,7 @@ app.post('/', async (req, res) => { message = [ `Alert created for Southwest flight #${alert.number} from `, `${alert.from} to ${alert.to} on ${alert.formattedDate}. `, - `We'll alert you if the price drops below $${alert.price}.` + `We'll alert you if the price drops below ${alert.formattedPrice}.` ].join(''); subject = [ `✈ Alert created for WN ${alert.number} `, @@ -53,7 +53,7 @@ app.post('/', async (req, res) => { message = [ `Alert created for any Southwest flight from `, `${alert.from} to ${alert.to} on ${alert.formattedDate}. `, - `We'll alert you if the price drops below $${alert.price}.` + `We'll alert you if the price drops below ${alert.formattedPrice}.` ].join(''); subject = [ `✈ Alert created for any WN flight `, @@ -68,8 +68,8 @@ app.post('/', async (req, res) => { return; } - if (mgEmail.enabled && alert.to_email) { - await mgEmail.sendEmail(alert.to_email, subject, message); + if (mgEmail.enabled && alert.toEmail) { + await mgEmail.sendEmail(alert.toEmail, subject, message); } if (sms.enabled && alert.phone) { @@ -86,10 +86,10 @@ app.get('/:id/edit', async (req, res) => { if (!data) { const errorMsg = 'Unable to edit flight. Invalid id: ' + req.params.id; console.warn(errorMsg); - res.send(render('error', req, {errorMsg: errorMsg})); + res.send(render('error', req, { errorMsg: errorMsg })); } else { const alert = new Alert(data); - res.send(render('edit', req, { alert })); + res.send(render('edit', req, { alert, mgIsEnabled: mgEmail.enabled, smsIsEnabled: sms.enabled })); } }); @@ -115,12 +115,12 @@ app.get('/:id/delete', async (req, res) => { // NEW-SINGLE app.get('/new-single', async (req, res) => { - res.send(render('new-single', req, { alertType: ALERT_TYPES.SINGLE })); + res.send(render('new-single', req, { alertType: ALERT_TYPES.SINGLE, mgIsEnabled: mgEmail.enabled, smsIsEnabled: sms.enabled })); }); // NEW-DAY app.get('/new-day', async (req, res) => { - res.send(render('new-day', req, { alertType: ALERT_TYPES.DAY })); + res.send(render('new-day', req, { alertType: ALERT_TYPES.DAY, mgIsEnabled: mgEmail.enabled, smsIsEnabled: sms.enabled })); }); // SHOW @@ -129,7 +129,7 @@ app.get('/:id', async (req, res) => { if (!data) { const errorMsg = 'Unable to display flight details. Invalid id: ' + req.params.id; console.warn(errorMsg); - res.send(render('error', req, {errorMsg: errorMsg})); + res.send(render('error', req, { errorMsg: errorMsg })); } else { const alert = new Alert(data); const graph = alert.data.priceHistory.length ? historyGraph(alert) : ''; @@ -143,7 +143,7 @@ app.get('/:id/change-price', async (req, res) => { if (!data) { const errorMsg = 'Unable to change price. Invalid id: ' + req.params.id; console.warn(errorMsg); - res.send(render('error', req, {errorMsg: errorMsg})); + res.send(render('error', req, { errorMsg: errorMsg })); } else { const alert = new Alert(data); const newPrice = parseInt(req.query.price, 10); diff --git a/lib/apps/email-handler.js b/lib/apps/email-handler.js index 5569763..2b87c54 100644 --- a/lib/apps/email-handler.js +++ b/lib/apps/email-handler.js @@ -122,7 +122,7 @@ async function parseEmailJSON (json) { // Validate everything if (flightDate && flightNumber && airportCodes.codeIsValid(airports[0]) && airportCodes.codeIsValid(airports[1])) { - flights.push({user: json.sender, to_email: json.sender, date: flightDate, number: flightNumber + ',', from: airports[0], to: airports[1]}); + flights.push({ user: json.sender, toEmail: json.sender, date: flightDate, number: flightNumber + ',', from: airports[0], to: airports[1] }); } else { console.log("Couldn't parse flight! Date: " + flightDate + ', ' + data[i + 1] + '; number: ' + flightNumber + ', ' + data[i + 2] + '; airports: ' + airports.join(', ') + ', ' + data[i + 3]); } @@ -146,15 +146,15 @@ async function parseEmailJSON (json) { const message = [ `Alert created for Southwest flight #${alert.number} from `, `${alert.from} to ${alert.to} on ${alert.formattedDate}. `, - `We'll alert you if the price drops below $${alert.price}.` + `We'll alert you if the price drops below ${alert.formattedPrice}.` ].join(''); const subject = [ `✈ Alert created for WN ${alert.number} `, `${alert.from} → ${alert.to} on ${alert.formattedDate}. ` ].join(''); - console.log('Sending email: ' + alert.to_email + ', ' + subject + ', ' + message); - mgEmail.sendEmail(alert.to_email, subject, message); + console.log('Sending email: ' + alert.toEmail + ', ' + subject + ', ' + message); + mgEmail.sendEmail(alert.toEmail, subject, message); alert.getLatestPrice(); redis.setAsync(alert.key(), alert.toJSON()); diff --git a/lib/bot/alert.js b/lib/bot/alert.js index ef5db49..7611d85 100644 --- a/lib/bot/alert.js +++ b/lib/bot/alert.js @@ -12,6 +12,20 @@ class Alert { this.data.id = this.data.id || shortid.generate(); this.data.from = this.data.from.toLocaleUpperCase(); this.data.to = this.data.to.toLocaleUpperCase(); + if (this.data.isPointsBooking) { + this.data.isPointsBooking = this.data.isPointsBooking; + } else if (this.data.bookingType) { + if (this.data.bookingType === 'cash') { + this.data.isPointsBooking = false; + } else if (this.data.bookingType === 'points') { + this.data.isPointsBooking = true; + } else { + console.warn('Unexpected booking type, defaulting to cash: ' + this.data.bookingType); + this.data.isPointsBooking = false; + } + } else { + this.data.isPointsBooking = false; + } try { this.data.number = this.data.number != null && this.data.number !== 'NaN' ? this.data.number.split(',').map(n => n.trim()).filter(n => n.length).join(',') : 'NaN'; } catch (err) { @@ -20,9 +34,9 @@ class Alert { } this.data.originalPrice = this.data.price ? parseInt(this.data.price, 10) : null; this.data.phone = this.data.phone ? this.data.phone.split('').filter(d => /\d/.test(d)).join('') : null; - this.data.to_email = this.data.to_email ? this.data.to_email.split('').filter(d => /\S/.test(d)).join('') : null; + this.data.toEmail = this.data.toEmail ? this.data.toEmail.split('').filter(d => /\S/.test(d)).join('') : null; this.data.priceHistory = Alert.compactPriceHistory(this.data.priceHistory || []); - this.data.alertType = this.data.alertType != null ? this.data.alertType : ALERT_TYPES.SINGLE; // If there's no alertType, assume Single + this.data.alertType = this.data.alertType != null ? this.data.alertType : ALERT_TYPES.SINGLE; // If there's no alertType, assume Single this.data.fetchingPrices = this.data.fetchingPrices || false; } @@ -31,10 +45,11 @@ class Alert { get date () { return new Date(this.data.date); } get from () { return this.data.from; } get to () { return this.data.to; } + get isPointsBooking () { return this.data.isPointsBooking; } get number () { return this.data.number; } get price () { return this.data.originalPrice; } get phone () { return this.data.phone; } - get to_email () { return this.data.to_email; } + get toEmail () { return this.data.toEmail; } get priceHistory () { return this.data.priceHistory; } get alertType () { return this.data.alertType; } get fetchingPrices () { return this.data.fetchingPrices; } @@ -56,7 +71,32 @@ class Alert { } get formattedEmail () { - return this.data.to_email; + return this.data.toEmail; + } + + get formattedPrice () { + if (this.data.isPointsBooking) { + return this.data.price + ' points'; + } else { + return '$' + this.data.price; + } + } + + get formattedLatestPrice () { + if (this.data.isPointsBooking) { + return this.latestPrice + ' points'; + } else { + return '$' + this.latestPrice; + } + } + + get formattedPriceDifference () { + const diff = this.data.price - this.latestPrice; + if (this.data.isPointsBooking) { + return diff + ' points'; + } else { + return '$' + diff; + } } get latestPrice () { diff --git a/lib/bot/get-price.js b/lib/bot/get-price.js index b2874f2..2f3ef71 100644 --- a/lib/bot/get-price.js +++ b/lib/bot/get-price.js @@ -3,11 +3,12 @@ const dateFormat = require('dateformat'); const puppeteer = require('puppeteer'); const { PROXY, ALERT_TYPES, MAX_PAGES } = require('../constants.js'); -async function getPriceForFlight ({ from, to, date, number, alertType }, browser, lock) { +async function getPriceForFlight ({ from, to, date, number, isPointsBooking, alertType }, browser, lock) { const flights = (await getFlights({ from, to, departDate: date, + isPointsBooking: isPointsBooking, browser, lock })).outbound; @@ -25,7 +26,7 @@ async function getPriceForFlight ({ from, to, date, number, alertType }, browser return Math.min(...prices); } -async function getFlights ({ from, to, departDate, returnDate, browser, lock }) { +async function getFlights ({ from, to, departDate, returnDate, isPointsBooking, browser, lock }) { const twoWay = Boolean(departDate && returnDate); const fares = { outbound: [] }; @@ -35,10 +36,10 @@ async function getFlights ({ from, to, departDate, returnDate, browser, lock }) let closeBrowserOnExit = false; if (browser === undefined) { if (PROXY === undefined) { - browser = await puppeteer.launch({args: ['--no-sandbox', '--disable-setuid-sandbox', '--disable-dev-shm-usage']}); + browser = await puppeteer.launch({ args: ['--no-sandbox', '--disable-setuid-sandbox', '--disable-dev-shm-usage'] }); closeBrowserOnExit = true; } else { - browser = await puppeteer.launch({args: ['--no-sandbox', '--disable-setuid-sandbox', '--disable-dev-shm-usage', '--proxy-server='+PROXY]}); + browser = await puppeteer.launch({ args: ['--no-sandbox', '--disable-setuid-sandbox', '--disable-dev-shm-usage', '--proxy-server=' + PROXY] }); closeBrowserOnExit = true; } } @@ -48,14 +49,18 @@ async function getFlights ({ from, to, departDate, returnDate, browser, lock }) console.debug('lock has available permits: ' + lock.getPermits()); await lock.wait(); console.debug('Entered lock, available permits: ' + lock.getPermits()); - html = await getPage(from, to, departDate, returnDate, browser); + html = await getPage(from, to, departDate, returnDate, isPointsBooking, browser); await lock.signal(); console.debug('Exited lock, available permits: ' + lock.getPermits()); } else { - html = await getPage(from, to, departDate, returnDate, browser); + html = await getPage(from, to, departDate, returnDate, isPointsBooking, browser); } } catch (e) { - console.error(e); + if (e.message.includes('ERR_INTERNET_DISCONNECTED')) { + console.error('Bot was unable to connect to the internet while checking Southwest. Check your connection and try again later.'); + } else { + console.error(e); + } if (lock) { const numPermits = lock.getPermits(); if (numPermits !== MAX_PAGES) { await lock.signal(); } @@ -87,7 +92,7 @@ async function getFlights ({ from, to, departDate, returnDate, browser, lock }) const flights = $(e).find('.select-detail--flight-numbers').find('.actionable--text') .text() - .substr(2) // remove "# " + .substr(2) // remove "# " .split(' / ') .join(','); console.log('flights: ', flights); @@ -96,8 +101,8 @@ async function getFlights ({ from, to, departDate, returnDate, browser, lock }) .text(); const duration = $(e).find('.flight-stops--duration-time').text(); const stops_ = durationAndStops - .split(duration)[1] // split on the duration -> eg 'Duration8h 5m1stop' -> ['Duration', '1 stop'] - .split(' '); // '1 stop' -> ['1', 'stop'] + .split(duration)[1] // split on the duration -> eg 'Duration8h 5m1stop' -> ['Duration', '1 stop'] + .split(' '); // '1 stop' -> ['1', 'stop'] const stops = stops_[0] === '' ? 0 : parseInt(stops_[0], 10); console.log('stops: ', stops); @@ -111,7 +116,7 @@ async function getFlights ({ from, to, departDate, returnDate, browser, lock }) let price = Infinity; if (Object.keys(priceStrDict).length > 0) { for (var key in priceStrDict) { - let price_ = parseInt(priceStrDict[key], 10); + let price_ = parseInt(priceStrDict[key].replace(/,/g, ''), 10); if (price_ < price) { price = price_; } } } else { console.error('There were no prices found!'); } @@ -125,7 +130,9 @@ async function getFlights ({ from, to, departDate, returnDate, browser, lock }) } } -function createUrl (from, to, departDate, returnDate, browser) { +function createUrl (from, to, departDate, returnDate, isPointsBooking) { + const fareType = (isPointsBooking) ? 'POINTS' : 'USD'; + return 'https://www.southwest.com/air/booking/select.html' + '?originationAirportCode=' + from + '&destinationAirportCode=' + to + @@ -136,7 +143,7 @@ function createUrl (from, to, departDate, returnDate, browser) { '&returnTimeOfDay=ALL_DAY' + '&adultPassengersCount=1' + '&seniorPassengersCount=0' + - '&fareType=USD' + + '&fareType=' + fareType + '&passengerType=ADULT' + '&tripType=oneway' + '&promoCode=' + @@ -146,19 +153,19 @@ function createUrl (from, to, departDate, returnDate, browser) { '&leapfrogRequest=true'; } -async function getPage (from, to, departDate, returnDate, browser) { +async function getPage (from, to, departDate, returnDate, isPointsBooking, browser) { const page = await browser.newPage(); - await page.setUserAgent('Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.113 Safari/537.36'); + await page.setUserAgent('Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.77 Safari/537.36'); try { - const url = createUrl(from, to, departDate, returnDate); + const url = createUrl(from, to, departDate, returnDate, isPointsBooking); console.log('URL: ', url); await page.goto(url); try { await page.waitForSelector('.price-matrix--details-titles'); await page.waitForSelector('.flight-stops'); - console.debug("Got flight page!"); + console.debug('Got flight page!'); } catch (err) { - console.error("Unable to get flights - trying again"); + console.error('Unable to get flights - trying again'); try { await page.goto(url); @@ -169,14 +176,11 @@ async function getPage (from, to, departDate, returnDate, browser) { const errHtml = await page.evaluate(() => document.body.outerHTML); await page.goto('about:blank'); await page.close(); - - if (errHtml.includes("Access Denied")) - { - throw 'ERROR! Access Denied Error! Unable to find flight information on page: ' + currentUrl + '\nhtml: ' + errHtml; - } - else - { - throw 'ERROR! Unknown error! Unable to find flight information on page: ' + currentUrl + '\nhtml: ' + errHtml; + + if (errHtml.includes('Access Denied')) { + throw new Error('ERROR! Access Denied Error! Unable to find flight information on page: ' + currentUrl + '\nhtml: ' + errHtml); + } else { + throw new Error('ERROR! Unknown error! Unable to find flight information on page: ' + currentUrl + '\nhtml: ' + errHtml); } } } diff --git a/lib/bot/send-email.js b/lib/bot/send-email.js index 7e00a70..7bf6fd9 100644 --- a/lib/bot/send-email.js +++ b/lib/bot/send-email.js @@ -8,14 +8,14 @@ async function sendEmail (to, subject, message, from = MAILGUN_EMAIL) { if (!enabled) return false; const mg = getMailgun(); - const to_domain = to.split('@')[1]; + const toDomain = to.split('@')[1]; const params = { from: from, to: to, text: message }; - if (SMS_GATEWAYS.indexOf(to_domain) === -1) { + if (SMS_GATEWAYS.indexOf(toDomain) === -1) { params.subject = subject; } diff --git a/lib/bot/send-sms.js b/lib/bot/send-sms.js index 6198329..d103c74 100755 --- a/lib/bot/send-sms.js +++ b/lib/bot/send-sms.js @@ -9,7 +9,7 @@ async function sendSms (to, message, from = PLIVO_NUMBER) { const plivo = getPlivo(); try { - response = await plivo.messages.create(from, to, message); + const response = await plivo.messages.create(from, to, message); console.log(response); return response; } catch (error) { diff --git a/lib/constants.js b/lib/constants.js index 7aaccb8..65bb9c9 100644 --- a/lib/constants.js +++ b/lib/constants.js @@ -2,7 +2,7 @@ const ENV = process.env; const ADMIN_NAME = ENV.ADMIN_NAME || ENV.USER_NAME; const PASSWORD = ENV.PASSWORD || ENV.USER_PASSWORD; -const PROXY = ENV.PROXY; +const PROXY = ENV.PROXY; const DEVELOPMENT = ENV.DEVELOPMENT === 'true'; diff --git a/lib/history-graph.js b/lib/history-graph.js index 781c902..a4b11f9 100644 --- a/lib/history-graph.js +++ b/lib/history-graph.js @@ -29,42 +29,43 @@ function render (alert) { const Graph = e('div', null, e(V.VictoryChart, { domainPadding: 20, - padding: { top: 10, right: 50, bottom: 50, left: 50 }, + padding: { top: 10, right: 50, bottom: 50, left: 60 }, theme: Theme }, - e(V.VictoryAxis, { - domainPadding: 0, - tickFormat: date => dateFormat(new Date(date), 'm/d', true) - }), - e(V.VictoryAxis, { - crossAxis: false, - dependentAxis: true, - domain: [ 0, maxPrice ], - tickFormat: tick => '$' + tick - }), - e(V.VictoryLine, { - data, - x: 'time', - y: 'price' - }), - e(V.VictoryLine, { - data: [ - [ minTime, alert.price ], - [ maxTime, alert.price ] - ], - labels: 'Alert\nprice', - style: { - data: { - stroke: '#d5152e', - strokeDasharray: '5,5' - }, - labels: { - fill: '#d5152e' - } + e(V.VictoryAxis, { + domainPadding: 0, + tickFormat: date => dateFormat(new Date(date), 'm/d', true) + }), + e(V.VictoryAxis, { + crossAxis: false, + dependentAxis: true, + domain: [ 0, maxPrice ], + tickFormat: tick => ((alert.isPointsBooking) ? '' : '$') + tick + }), + e(V.VictoryLine, { + data, + labels: ['Tracked\nprice'], + x: 'time', + y: 'price' + }), + e(V.VictoryLine, { + data: [ + [ minTime, alert.price ], + [ maxTime, alert.price ] + ], + labels: ['Alert\nprice'], + style: { + data: { + stroke: '#d5152e', + strokeDasharray: '5,5' }, - x: 0, - y: 1 - }) + labels: { + fill: '#d5152e' + } + }, + x: 0, + y: 1 + }) ) ); diff --git a/lib/server.js b/lib/server.js index 314d923..fcb70cb 100644 --- a/lib/server.js +++ b/lib/server.js @@ -11,8 +11,8 @@ const Email = require('./apps/email-handler.js'); const app = express(); app.set('trust proxy', true); app.use(cors()); -app.use(bodyParser.json({limit: '1mb'})); -app.use(bodyParser.urlencoded({limit: '1mb', extended: true})); +app.use(bodyParser.json({ limit: '1mb' })); +app.use(bodyParser.urlencoded({ limit: '1mb', extended: true })); app.use(express.static(path.join(__dirname, '../static'))); app.use('/', Email); diff --git a/lib/views/form.pug b/lib/views/form.pug index 7a71910..871290d 100644 --- a/lib/views/form.pug +++ b/lib/views/form.pug @@ -7,45 +7,42 @@ mixin form(alert) input#date.mdl-textfield__input( name='date' type='date' - readonly=alert + readonly=(typeof(alert) !== 'undefined') required pattern='(([12]\\d{3}[-/.]((0[1-9]|1[0-2])|([1-9]))[-/.]((0[1-9]|[12]\\d|3[01])|([1-9])))|(((0[1-9]|1[0-2])|([1-9]))[-/.]((0[1-9]|[12]\\d|3[01])|([1-9]))[-/.](([12]\\d{3})|(\\d{2}))))' - placeholder='YYYY-MM-DD' min=((new Date()).toISOString().substr(0, 10)) value=(alert && alert.date.toISOString().substr(0, 10)) ) label.mdl-textfield__label(for='date') Date - span.help Date should be in YYYY-MM-DD or MM/DD/YYYY, example: - code.example 2012-12-21 + span.help Date should be Y/M/D or M/D/Y, e.g. + code.example 2018-12-21 .mdl-textfield.mdl-js-textfield.mdl-textfield--floating-label input#from.mdl-textfield__input( name='from' type='text' - readonly=alert + readonly=(typeof(alert) !== 'undefined') required - placeholder='DEN' pattern='($^)|([A-Za-z]{3})' maxlength='3' value=(alert && alert.from) ) label.mdl-textfield__label(for='from') From - span.help The three-letter airport code, example: + span.help The three-letter airport code, e.g. code.example CLE .mdl-textfield.mdl-js-textfield.mdl-textfield--floating-label input#to.mdl-textfield__input( name='to' type='text' - readonly=alert + readonly=(typeof(alert) !== 'undefined') required - placeholder='SFO' pattern='[A-Za-z]{3}' maxlength='3' value=(alert && alert.to) ) label.mdl-textfield__label(for='to') To - span.help The three-letter airport code, example: + span.help The three-letter airport code, e.g. code.example SEA if (alert && (alert.alertType && alert.alertType == ALERT_TYPES.SINGLE)) || (alertType && alertType == ALERT_TYPES.SINGLE) @@ -54,49 +51,77 @@ mixin form(alert) input#number.mdl-textfield__input( name='number' type='text' - readonly=alert + readonly=(typeof(alert) !== 'undefined') required - placeholder='123, 456' pattern='[\\d,\\s*]+' value=(alert && alert.number) ) label.mdl-textfield__label(for='number') Flight number(s) - span.help If the flight has one or more stops, separate flight numbers with a comma, example: + span.help If the flight has one or more stops, separate flight numbers with a comma, e.g. code.example 123, 456 else input(type="hidden" name="alertType" value=ALERT_TYPES.DAY) + .bookingType + label.mdl-radio.mdl-js-radio.mdl-js-ripple-effect(for='cash') + input( + type="radio" + id="cash" + class="mdl-radio__button" + name="bookingType" + value="cash" + disabled=(typeof(alert) !== 'undefined') + checked=(!alert || (alert && !alert.isPointsBooking)) + ) + span.mdl-radio__label Cash + + label.mdl-radio.mdl-js-radio.mdl-js-ripple-effect(for='points') + input( + type="radio" + id="points" + class="mdl-radio__button" + value="points" + name="bookingType" + disabled=(typeof(alert) !== 'undefined') + checked=(alert && alert.isPointsBooking) + ) + span.mdl-radio__label Points + .mdl-textfield.mdl-js-textfield.mdl-textfield--floating-label input#price.mdl-textfield__input( name='price' type='number' required - placeholder='175' value=(alert && alert.price) ) label.mdl-textfield__label(for='price') Price threshold - span.help We'll text you if the price drops below this threshold, example: - code.example 160 + span.help Price to alert if below, e.g. + if (!alert || (alert && !alert.isPointsBooking)) + code.example 175 + else + code.example 5000 .mdl-textfield.mdl-js-textfield.mdl-textfield--floating-label input#phone.mdl-textfield__input( name='phone' type='tel' + disabled=!smsIsEnabled pattern='\\^(\+\d{1,2}\s)?\(?\d{3}\)?[\s.-]?\d{3}[\s.-]?\d{4}$' value=(alert && alert.phone || undefined) ) label.mdl-textfield__label(for='phone') Phone number - span.help Enter if you want to be texted your price drop + span.help Optional, number to text alert, e.g. code.example 2223334444 - .mdl-textfield.mdl-js-textfield.mdl-textfield--floating-label - input#to_email.mdl-textfield__input( - name='to_email' + .mdl-textfield.mdl-js-textfield.mdl-textfield--floating-label.last-field + input#toEmail.mdl-textfield__input( + name='toEmail' type='email' - value=(alert && alert.to_email || undefined) + disabled=!mgIsEnabled + value=(alert && alert.toEmail || undefined) ) - label.mdl-textfield__label(for='to_email') Email - span.help Enter if you want to be emailed your price drop, example: + label.mdl-textfield__label(for='toEmail') Email + span.help Optional, email address to email alert, e.g. code.example name@example.com .mdl-cell.mdl-cell--12-col diff --git a/lib/views/list.pug b/lib/views/list.pug index ff567fc..8b05f73 100644 --- a/lib/views/list.pug +++ b/lib/views/list.pug @@ -19,7 +19,7 @@ block content | Couldn't fetch price. Double-check inputs! if alert.priceHasDropped a.mdl-card__actions.mdl-card--border.flight-notification(href='/' + alert.id) - | Price drop alert! Re-book and save $#{alert.price - alert.latestPrice}! + | Price drop alert! Re-book and save #{alert.formattedPriceDifference}! .mdl-card__supporting-text .call-signs span.ticket= alert.from @@ -38,12 +38,12 @@ block content a.mdl-card__actions.mdl-card--border.flight-prices(href='/' + alert.id) .info-group - span.price= '$' + alert.price + span.price= alert.formattedPrice br span.description you paid if alert.latestPrice < Infinity .info-group - span.price= '$' + alert.latestPrice + span.price= alert.formattedLatestPrice br span.description currently diff --git a/lib/views/show.pug b/lib/views/show.pug index 18eb3d9..2f5c831 100644 --- a/lib/views/show.pug +++ b/lib/views/show.pug @@ -29,12 +29,12 @@ block content .graph!= graph .mdl-card__actions.mdl-card--border.flight-prices .info-group - span.price= '$' + alert.price + span.price= alert.formattedPrice br span.description you paid if alert.latestPrice < Infinity .info-group - span.price= `$${alert.latestPrice}` + span.price= alert.formattedLatestPrice br span.description currently .mdl-card__actions.mdl-card--border diff --git a/package.json b/package.json index 7b403c8..832e0fb 100644 --- a/package.json +++ b/package.json @@ -23,37 +23,37 @@ "test": "tape test/**/*.js" }, "dependencies": { - "bluebird": "^3.5.1", - "body-parser": "^1.18.2", + "bluebird": "^3.5.3", + "body-parser": "^1.18.3", "cheerio": "^1.0.0-rc.2", "chrono-node": "^1.3.5", "cookie-session": "^2.0.0-beta.3", - "cors": "^2.8.4", + "cors": "^2.8.5", "dateformat": "^3.0.3", - "dotenv": "^6.0.0", - "express": "^4.16.2", - "google-libphonenumber": "^3.1.8", - "load-json-file": "^5.0.0", + "dotenv": "^6.2.0", + "express": "^4.16.4", + "google-libphonenumber": "^3.2.1", + "load-json-file": "^5.1.0", "lodash.clonedeep": "^4.5.0", - "lodash.merge": "^4.6.0", - "mailgun-js": "^0.20.0", - "npm": "^6.2.0", + "lodash.merge": "^4.6.1", + "mailgun-js": "^0.22.0", + "npm": "^6.5.0", "package.json": "^2.0.1", - "plivo": "^4.0.1", - "pug": "^2.0.0-rc.4", - "puppeteer": "^1.3.0", - "react": "^16.4.1", - "react-dom": "^16.4.1", + "plivo": "^4.0.5", + "pug": "^2.0.3", + "puppeteer": "^1.11.0", + "react": "^16.7.0", + "react-dom": "^16.7.0", "redis": "^2.8.0", - "redis-server": "^1.1.0", + "redis-server": "^1.2.2", "semaphore-async-await": "^1.5.1", - "shortid": "^2.2.8", - "tape": "^4.8.0", - "victory": "^0.27.2", - "yarn": "^1.7.0" + "shortid": "^2.2.14", + "tape": "^4.9.1", + "victory": "^31.0.2", + "yarn": "^1.12.3" }, "devDependencies": { - "nodemon": "1.18.2", - "semistandard": "12.0.1" + "nodemon": "1.18.9", + "semistandard": "13.0.1" } } diff --git a/static/style.css b/static/style.css index 532f796..f62ff8a 100644 --- a/static/style.css +++ b/static/style.css @@ -99,8 +99,16 @@ a.flight-prices { text-transform: uppercase; } -.mdl-textfield { - margin-bottom: 20px; +.bookingType { + padding-top: 20px; +} + +.mdl-radio { + padding-right: 5px; +} + +.last-field { + padding-bottom: 25px; } .mdl-textfield span.help { diff --git a/tasks/check.js b/tasks/check.js index e0a499c..ea87768 100644 --- a/tasks/check.js +++ b/tasks/check.js @@ -13,9 +13,9 @@ const COOLDOWN = 1; (async () => { let browser; if (PROXY === undefined) { - browser = await puppeteer.launch({args: ['--no-sandbox', '--disable-setuid-sandbox', '--disable-dev-shm-usage']}); + browser = await puppeteer.launch({ args: ['--no-sandbox', '--disable-setuid-sandbox', '--disable-dev-shm-usage'] }); } else { - browser = await puppeteer.launch({args: ['--no-sandbox', '--disable-setuid-sandbox', '--disable-dev-shm-usage', '--proxy-server='+PROXY]}); + browser = await puppeteer.launch({ args: ['--no-sandbox', '--disable-setuid-sandbox', '--disable-dev-shm-usage', '--proxy-server=' + PROXY] }); } try { const basePath = await redis.getAsync('__BASE_PATH'); @@ -50,14 +50,14 @@ const COOLDOWN = 1; // send message if cheaper const less = alert.price - alert.latestPrice; if (less > 0) { - console.log(`${flight} dropped $${less} to $${alert.latestPrice}${cooldown ? ' (on cooldown)' : ''}`); + console.log(`${flight} dropped ${alert.formattedPriceDifference} to ${alert.formattedLatestPrice}${cooldown ? ' (on cooldown)' : ''}`); if (!cooldown) { let message; if (alert.alertType === ALERT_TYPES.SINGLE) { message = [ `WN flight #${alert.number} `, `${alert.from} to ${alert.to} on ${alert.formattedDate} `, - `was $${alert.price}, is now $${alert.latestPrice}. `, + `was ${alert.formattedPrice}, is now ${alert.formattedLatestPrice}. `, `\n\nOnce rebooked, tap link to lower alert threshold: `, `${basePath}/${alert.id}/change-price?price=${alert.latestPrice}` ].join(''); @@ -65,15 +65,15 @@ const COOLDOWN = 1; message = [ `A cheaper Southwest flight on ${alert.formattedDate} `, `${alert.from} to ${alert.to} was found! `, - `Was $${alert.price}, is now $${alert.latestPrice}. `, + `Was ${alert.formattedPrice}, is now ${alert.formattedLatestPrice}. `, `\n\nOnce rebooked, tap link to lower alert threshold: `, `${basePath}/${alert.id}/change-price?price=${alert.latestPrice}` ].join(''); } const subject = [ - `✈ Southwest Price Drop Alert: $${alert.price} → $${alert.latestPrice}. ` + `✈ Southwest Price Drop Alert: ${alert.formattedPrice} → ${alert.formattedLatestPrice}. ` ].join(''); - if (mgEmail.enabled && alert.to_email) { await mgEmail.sendEmail(alert.to_email, subject, message); } + if (mgEmail.enabled && alert.toEmail) { await mgEmail.sendEmail(alert.toEmail, subject, message); } if (sms.enabled && alert.phone) { await sms.sendSms(alert.phone, message); } await redis.setAsync(cooldownKey, ''); diff --git a/test/bot/alert.js b/test/bot/alert.js index 434c94e..fc11928 100644 --- a/test/bot/alert.js +++ b/test/bot/alert.js @@ -1,5 +1,4 @@ const test = require('tape'); -const PN = require('google-libphonenumber'); const Alert = require('../../lib/bot/alert.js'); const { ALERT_TYPES } = require('../../lib/constants.js'); @@ -10,8 +9,8 @@ test('Alert new day', async t => { to: 'sea', date: '2018/5/29', price: '200', - phone: '1234567890', - to_email: 'testing@example.com', + phone: '5555555555', + toEmail: 'testing@example.com', alertType: ALERT_TYPES.DAY, fetchingPrices: true }; @@ -19,25 +18,25 @@ test('Alert new day', async t => { const alert = new Alert(args); t.true(alert.user === args.user, 'user'); - t.true(typeof(alert.id) === "string", 'id'); + t.true(typeof (alert.id) === 'string', 'id'); t.true(+alert.date === +new Date(args.date), 'date'); t.true(alert.from === args.from.toLocaleUpperCase(), 'from'); t.true(alert.to === args.to.toLocaleUpperCase(), 'to'); - t.true(alert.number === "NaN", 'number'); + t.true(alert.number === 'NaN', 'number'); t.true(alert.price === parseInt(args.price, 10), 'price'); - t.true(alert.phone === args.phone !== "" ? args.phone.split('').filter(d => /\d/.test(d)).join('') : null, 'phone'); - t.true(alert.to_email === (args.to_email !== "" ? args.to_email.split('').filter(d => /\S/.test(d)).join('') : null), 'to_email'); + t.true(alert.phone === args.phone !== '' ? args.phone.split('').filter(d => /\d/.test(d)).join('') : null, 'phone'); + t.true(alert.toEmail === (args.toEmail !== '' ? args.toEmail.split('').filter(d => /\S/.test(d)).join('') : null), 'toEmail'); t.true(Object.keys(alert.priceHistory).length === 0, 'priceHistory'); t.true(alert.alertType === args.alertType, 'alertType'); t.true(alert.fetchingPrices === true, 'fetchingPrices'); - t.true(alert.formattedDate === new Date(args.date).toLocaleDateString('en-US', { timeZone: 'UTC' }), "formattedDate"); - t.true(alert.formattedNumber === 'WN ' + alert.number.split(',').join(', '), "formattedNumber"); - t.true(alert.formattedPhone === "+1 123-456-7890", "formattedPhone"); - t.true(alert.formattedEmail === alert.to_email, "formattedEmail"); + t.true(alert.formattedDate === new Date(args.date).toLocaleDateString('en-US', { timeZone: 'UTC' }), 'formattedDate'); + t.true(alert.formattedNumber === 'WN ' + alert.number.split(',').join(', '), 'formattedNumber'); + t.true(alert.formattedPhone === '+1 555-555-5555', 'formattedPhone'); + t.true(alert.formattedEmail === alert.toEmail, 'formattedEmail'); // t.true(alert.latestPrice === args.priceHistory.length ? (args.priceHistory[args.priceHistory.length - 1]).price : Infinity); - t.true(alert.latestPrice === Infinity, "latestPrice"); - t.true(alert.priceHasDropped === alert.latestPrice < args.price, "priceHasDropped"); - t.true(alert.signature === [ new Date(args.date).toLocaleDateString('en-US', { timeZone: 'UTC' }), args.from.toLocaleUpperCase(), args.to.toLocaleUpperCase(), args.number === undefined ? 'All' : args.number.split(',').map(n => n.trim()).filter(n => n.length).join(',') ].join('|'), "signature"); + t.true(alert.latestPrice === Infinity, 'latestPrice'); + t.true(alert.priceHasDropped === (alert.latestPrice < args.price), 'priceHasDropped'); + t.true(alert.signature === ([ new Date(args.date).toLocaleDateString('en-US', { timeZone: 'UTC' }), args.from.toLocaleUpperCase(), args.to.toLocaleUpperCase(), args.number === undefined ? 'All' : args.number.split(',').map(n => n.trim()).filter(n => n.length).join(',') ].join('|')), 'signature'); t.end(); }); @@ -49,8 +48,8 @@ test('Alert new single (one flight)', async t => { date: '2018/5/29', number: '123', price: '200', - phone: '1234567890', - to_email: 'testing@example.com', + phone: '5555555555', + toEmail: 'testing@example.com', alertType: ALERT_TYPES.SINGLE, fetchingPrices: true }; @@ -58,24 +57,24 @@ test('Alert new single (one flight)', async t => { const alert = new Alert(args); t.true(alert.user === args.user, 'user'); - t.true(typeof(alert.id) === "string", 'id'); + t.true(typeof (alert.id) === 'string', 'id'); t.true(+alert.date === +new Date(args.date), 'date'); t.true(alert.from === args.from.toLocaleUpperCase(), 'from'); t.true(alert.to === args.to.toLocaleUpperCase(), 'to'); t.true(alert.number === args.number.split(',').map(n => n.trim()).filter(n => n.length).join(','), 'number'); t.true(alert.price === parseInt(args.price, 10), 'price'); - t.true(alert.phone === (args.phone !== "" ? args.phone.split('').filter(d => /\d/.test(d)).join('') : null), 'phone'); - t.true(alert.to_email === (args.to_email !== "" ? args.to_email.split('').filter(d => /\S/.test(d)).join('') : null), 'to_email'); + t.true(alert.phone === (args.phone !== '' ? args.phone.split('').filter(d => /\d/.test(d)).join('') : null), 'phone'); + t.true(alert.toEmail === (args.toEmail !== '' ? args.toEmail.split('').filter(d => /\S/.test(d)).join('') : null), 'toEmail'); t.true(Object.keys(alert.priceHistory).length === 0, 'priceHistory'); t.true(alert.alertType === args.alertType, 'alertType'); t.true(alert.fetchingPrices === true, 'fetchingPrices'); - t.true(alert.formattedDate === new Date(args.date).toLocaleDateString('en-US', { timeZone: 'UTC' }), "formattedDate"); - t.true(alert.formattedNumber === 'WN ' + alert.number.split(',').join(', '), "formattedNumber"); - t.true(alert.formattedPhone === "+1 123-456-7890", "formattedPhone"); - t.true(alert.formattedEmail === alert.to_email, "formattedEmail"); - t.true(alert.latestPrice === Infinity, "latestPrice"); - t.true(alert.priceHasDropped === alert.latestPrice < args.price, "priceHasDropped"); - t.true(alert.signature === [ new Date(args.date).toLocaleDateString('en-US', { timeZone: 'UTC' }), args.from.toLocaleUpperCase(), args.to.toLocaleUpperCase(), args.number === undefined ? 'All' : args.number.split(',').map(n => n.trim()).filter(n => n.length).join(',') ].join('|'), "signature"); + t.true(alert.formattedDate === new Date(args.date).toLocaleDateString('en-US', { timeZone: 'UTC' }), 'formattedDate'); + t.true(alert.formattedNumber === 'WN ' + alert.number.split(',').join(', '), 'formattedNumber'); + t.true(alert.formattedPhone === '+1 555-555-5555', 'formattedPhone'); + t.true(alert.formattedEmail === alert.toEmail, 'formattedEmail'); + t.true(alert.latestPrice === Infinity, 'latestPrice'); + t.true(alert.priceHasDropped === (alert.latestPrice < args.price), 'priceHasDropped'); + t.true(alert.signature === [ new Date(args.date).toLocaleDateString('en-US', { timeZone: 'UTC' }), args.from.toLocaleUpperCase(), args.to.toLocaleUpperCase(), args.number === undefined ? 'All' : args.number.split(',').map(n => n.trim()).filter(n => n.length).join(',') ].join('|'), 'signature'); t.end(); }); @@ -87,8 +86,8 @@ test('Alert new single (two flights)', async t => { date: '2018/5/29', number: '123, 456', price: '200', - phone: '1234567890', - to_email: 'testing@example.com', + phone: '5555555555', + toEmail: 'testing@example.com', alertType: ALERT_TYPES.SINGLE, fetchingPrices: true }; @@ -96,23 +95,23 @@ test('Alert new single (two flights)', async t => { const alert = new Alert(args); t.true(alert.user === args.user, 'user'); - t.true(typeof(alert.id) === "string", 'id'); + t.true(typeof (alert.id) === 'string', 'id'); t.true(+alert.date === +new Date(args.date), 'date'); t.true(alert.from === args.from.toLocaleUpperCase(), 'from'); t.true(alert.to === args.to.toLocaleUpperCase(), 'to'); t.true(alert.number === args.number.split(',').map(n => n.trim()).filter(n => n.length).join(','), 'number'); t.true(alert.price === parseInt(args.price, 10), 'price'); - t.true(alert.phone === (args.phone !== "" ? args.phone.split('').filter(d => /\d/.test(d)).join('') : null), 'phone'); + t.true(alert.phone === (args.phone !== '' ? args.phone.split('').filter(d => /\d/.test(d)).join('') : null), 'phone'); t.true(Object.keys(alert.priceHistory).length === 0, 'priceHistory'); t.true(alert.alertType === args.alertType, 'alertType'); t.true(alert.fetchingPrices === true, 'fetchingPrices'); - t.true(alert.formattedDate === new Date(args.date).toLocaleDateString('en-US', { timeZone: 'UTC' }), "formattedDate"); - t.true(alert.formattedNumber === 'WN ' + alert.number.split(',').join(', '), "formattedNumber"); - t.true(alert.formattedPhone === "+1 123-456-7890", "formattedPhone"); - t.true(alert.formattedEmail === alert.to_email, "formattedEmail"); - t.true(alert.latestPrice === Infinity, "latestPrice"); - t.true(alert.priceHasDropped === alert.latestPrice < args.price, "priceHasDropped"); - t.true(alert.signature === [ new Date(args.date).toLocaleDateString('en-US', { timeZone: 'UTC' }), args.from.toLocaleUpperCase(), args.to.toLocaleUpperCase(), args.number === undefined ? 'All' : args.number.split(',').map(n => n.trim()).filter(n => n.length).join(',') ].join('|'), "signature"); + t.true(alert.formattedDate === new Date(args.date).toLocaleDateString('en-US', { timeZone: 'UTC' }), 'formattedDate'); + t.true(alert.formattedNumber === 'WN ' + alert.number.split(',').join(', '), 'formattedNumber'); + t.true(alert.formattedPhone === '+1 555-555-5555', 'formattedPhone'); + t.true(alert.formattedEmail === alert.toEmail, 'formattedEmail'); + t.true(alert.latestPrice === Infinity, 'latestPrice'); + t.true(alert.priceHasDropped === (alert.latestPrice < args.price), 'priceHasDropped'); + t.true(alert.signature === ([ new Date(args.date).toLocaleDateString('en-US', { timeZone: 'UTC' }), args.from.toLocaleUpperCase(), args.to.toLocaleUpperCase(), args.number === undefined ? 'All' : args.number.split(',').map(n => n.trim()).filter(n => n.length).join(',') ].join('|')), 'signature'); t.end(); }); @@ -124,7 +123,7 @@ test('Alert new day - no phone', async t => { date: '2018/5/29', price: '200', phone: '', - to_email: 'testing@example.com', + toEmail: 'testing@example.com', alertType: ALERT_TYPES.DAY, fetchingPrices: true }; @@ -132,24 +131,24 @@ test('Alert new day - no phone', async t => { const alert = new Alert(args); t.true(alert.user === args.user, 'user'); - t.true(typeof(alert.id) === "string", 'id'); + t.true(typeof (alert.id) === 'string', 'id'); t.true(+alert.date === +new Date(args.date), 'date'); t.true(alert.from === args.from.toLocaleUpperCase(), 'from'); t.true(alert.to === args.to.toLocaleUpperCase(), 'to'); - t.true(alert.number === "NaN", 'number'); + t.true(alert.number === 'NaN', 'number'); t.true(alert.price === parseInt(args.price, 10), 'price'); - t.true(alert.phone === (args.phone !== "" ? args.phone.split('').filter(d => /\d/.test(d)).join('') : null), 'phone'); - t.true(alert.to_email === (args.to_email !== "" ? args.to_email.split('').filter(d => /\S/.test(d)).join('') : null), 'to_email'); + t.true(alert.phone === (args.phone !== '' ? args.phone.split('').filter(d => /\d/.test(d)).join('') : null), 'phone'); + t.true(alert.toEmail === (args.toEmail !== '' ? args.toEmail.split('').filter(d => /\S/.test(d)).join('') : null), 'toEmail'); t.true(Object.keys(alert.priceHistory).length === 0, 'priceHistory'); t.true(alert.alertType === args.alertType, 'alertType'); t.true(alert.fetchingPrices === true, 'fetchingPrices'); - t.true(alert.formattedDate === new Date(args.date).toLocaleDateString('en-US', { timeZone: 'UTC' }), "formattedDate"); - t.true(alert.formattedNumber === 'WN ' + alert.number.split(',').join(', '), "formattedNumber"); - t.true(alert.formattedPhone === null, "formattedPhone"); - t.true(alert.formattedEmail === alert.to_email, "formattedEmail"); - t.true(alert.latestPrice === Infinity, "latestPrice"); - t.true(alert.priceHasDropped === alert.latestPrice < args.price, "priceHasDropped"); - t.true(alert.signature === [ new Date(args.date).toLocaleDateString('en-US', { timeZone: 'UTC' }), args.from.toLocaleUpperCase(), args.to.toLocaleUpperCase(), args.number === undefined ? 'All' : args.number.split(',').map(n => n.trim()).filter(n => n.length).join(',') ].join('|'), "signature"); + t.true(alert.formattedDate === new Date(args.date).toLocaleDateString('en-US', { timeZone: 'UTC' }), 'formattedDate'); + t.true(alert.formattedNumber === 'WN ' + alert.number.split(',').join(', '), 'formattedNumber'); + t.true(alert.formattedPhone === null, 'formattedPhone'); + t.true(alert.formattedEmail === alert.toEmail, 'formattedEmail'); + t.true(alert.latestPrice === Infinity, 'latestPrice'); + t.true(alert.priceHasDropped === (alert.latestPrice < args.price), 'priceHasDropped'); + t.true(alert.signature === ([ new Date(args.date).toLocaleDateString('en-US', { timeZone: 'UTC' }), args.from.toLocaleUpperCase(), args.to.toLocaleUpperCase(), args.number === undefined ? 'All' : args.number.split(',').map(n => n.trim()).filter(n => n.length).join(',') ].join('|')), 'signature'); t.end(); }); @@ -162,7 +161,7 @@ test('Alert new single (one flight) - no phone', async t => { number: '123', price: '200', phone: '', - to_email: 'testing@example.com', + toEmail: 'testing@example.com', alertType: ALERT_TYPES.SINGLE, fetchingPrices: true }; @@ -170,24 +169,24 @@ test('Alert new single (one flight) - no phone', async t => { const alert = new Alert(args); t.true(alert.user === args.user, 'user'); - t.true(typeof(alert.id) === "string", 'id'); + t.true(typeof (alert.id) === 'string', 'id'); t.true(+alert.date === +new Date(args.date), 'date'); t.true(alert.from === args.from.toLocaleUpperCase(), 'from'); t.true(alert.to === args.to.toLocaleUpperCase(), 'to'); t.true(alert.number === args.number.split(',').map(n => n.trim()).filter(n => n.length).join(','), 'number'); t.true(alert.price === parseInt(args.price, 10), 'price'); - t.true(alert.phone === (args.phone !== "" ? args.phone.split('').filter(d => /\d/.test(d)).join('') : null), 'phone'); - t.true(alert.to_email === (args.to_email !== "" ? args.to_email.split('').filter(d => /\S/.test(d)).join('') : null), 'to_email'); + t.true(alert.phone === (args.phone !== '' ? args.phone.split('').filter(d => /\d/.test(d)).join('') : null), 'phone'); + t.true(alert.toEmail === (args.toEmail !== '' ? args.toEmail.split('').filter(d => /\S/.test(d)).join('') : null), 'toEmail'); t.true(Object.keys(alert.priceHistory).length === 0, 'priceHistory'); t.true(alert.alertType === args.alertType, 'alertType'); t.true(alert.fetchingPrices === true, 'fetchingPrices'); - t.true(alert.formattedDate === new Date(args.date).toLocaleDateString('en-US', { timeZone: 'UTC' }), "formattedDate"); - t.true(alert.formattedNumber === 'WN ' + alert.number.split(',').join(', '), "formattedNumber"); - t.true(alert.formattedPhone === null, "formattedPhone"); - t.true(alert.formattedEmail === alert.to_email, "formattedEmail"); - t.true(alert.latestPrice === Infinity, "latestPrice"); - t.true(alert.priceHasDropped === alert.latestPrice < args.price, "priceHasDropped"); - t.true(alert.signature === [ new Date(args.date).toLocaleDateString('en-US', { timeZone: 'UTC' }), args.from.toLocaleUpperCase(), args.to.toLocaleUpperCase(), args.number === undefined ? 'All' : args.number.split(',').map(n => n.trim()).filter(n => n.length).join(',') ].join('|'), "signature"); + t.true(alert.formattedDate === new Date(args.date).toLocaleDateString('en-US', { timeZone: 'UTC' }), 'formattedDate'); + t.true(alert.formattedNumber === 'WN ' + alert.number.split(',').join(', '), 'formattedNumber'); + t.true(alert.formattedPhone === null, 'formattedPhone'); + t.true(alert.formattedEmail === alert.toEmail, 'formattedEmail'); + t.true(alert.latestPrice === Infinity, 'latestPrice'); + t.true(alert.priceHasDropped === (alert.latestPrice < args.price), 'priceHasDropped'); + t.true(alert.signature === ([ new Date(args.date).toLocaleDateString('en-US', { timeZone: 'UTC' }), args.from.toLocaleUpperCase(), args.to.toLocaleUpperCase(), args.number === undefined ? 'All' : args.number.split(',').map(n => n.trim()).filter(n => n.length).join(',') ].join('|')), 'signature'); t.end(); }); @@ -200,7 +199,7 @@ test('Alert new single (two flights) - no phone', async t => { number: '123, 456', price: '200', phone: '', - to_email: 'testing@example.com', + toEmail: 'testing@example.com', alertType: ALERT_TYPES.SINGLE, fetchingPrices: true }; @@ -208,24 +207,24 @@ test('Alert new single (two flights) - no phone', async t => { const alert = new Alert(args); t.true(alert.user === args.user, 'user'); - t.true(typeof(alert.id) === "string", 'id'); + t.true(typeof (alert.id) === 'string', 'id'); t.true(+alert.date === +new Date(args.date), 'date'); t.true(alert.from === args.from.toLocaleUpperCase(), 'from'); t.true(alert.to === args.to.toLocaleUpperCase(), 'to'); t.true(alert.number === args.number.split(',').map(n => n.trim()).filter(n => n.length).join(','), 'number'); t.true(alert.price === parseInt(args.price, 10), 'price'); - t.true(alert.phone === (args.phone !== "" ? args.phone.split('').filter(d => /\d/.test(d)).join('') : null), 'phone'); - t.true(alert.to_email === (args.to_email !== "" ? args.to_email.split('').filter(d => /\S/.test(d)).join('') : null), 'to_email'); + t.true(alert.phone === (args.phone !== '' ? args.phone.split('').filter(d => /\d/.test(d)).join('') : null), 'phone'); + t.true(alert.toEmail === (args.toEmail !== '' ? args.toEmail.split('').filter(d => /\S/.test(d)).join('') : null), 'toEmail'); t.true(Object.keys(alert.priceHistory).length === 0, 'priceHistory'); t.true(alert.alertType === args.alertType, 'alertType'); t.true(alert.fetchingPrices === true, 'fetchingPrices'); - t.true(alert.formattedDate === new Date(args.date).toLocaleDateString('en-US', { timeZone: 'UTC' }), "formattedDate"); - t.true(alert.formattedNumber === 'WN ' + alert.number.split(',').join(', '), "formattedNumber"); - t.true(alert.formattedPhone === null, "formattedPhone"); - t.true(alert.formattedEmail === alert.to_email, "formattedEmail"); - t.true(alert.latestPrice === Infinity, "latestPrice"); - t.true(alert.priceHasDropped === alert.latestPrice < args.price, "priceHasDropped"); - t.true(alert.signature === [ new Date(args.date).toLocaleDateString('en-US', { timeZone: 'UTC' }), args.from.toLocaleUpperCase(), args.to.toLocaleUpperCase(), args.number === undefined ? 'All' : args.number.split(',').map(n => n.trim()).filter(n => n.length).join(',') ].join('|'), "signature"); + t.true(alert.formattedDate === new Date(args.date).toLocaleDateString('en-US', { timeZone: 'UTC' }), 'formattedDate'); + t.true(alert.formattedNumber === 'WN ' + alert.number.split(',').join(', '), 'formattedNumber'); + t.true(alert.formattedPhone === null, 'formattedPhone'); + t.true(alert.formattedEmail === alert.toEmail, 'formattedEmail'); + t.true(alert.latestPrice === Infinity, 'latestPrice'); + t.true(alert.priceHasDropped === (alert.latestPrice < args.price), 'priceHasDropped'); + t.true(alert.signature === [ new Date(args.date).toLocaleDateString('en-US', { timeZone: 'UTC' }), args.from.toLocaleUpperCase(), args.to.toLocaleUpperCase(), args.number === undefined ? 'All' : args.number.split(',').map(n => n.trim()).filter(n => n.length).join(',') ].join('|'), 'signature'); t.end(); }); @@ -236,8 +235,8 @@ test('Alert new day - no email', async t => { to: 'sea', date: '2018/5/29', price: '200', - phone: '1234567890', - to_email: '', + phone: '5555555555', + toEmail: '', alertType: ALERT_TYPES.DAY, fetchingPrices: true }; @@ -245,24 +244,24 @@ test('Alert new day - no email', async t => { const alert = new Alert(args); t.true(alert.user === args.user, 'user'); - t.true(typeof(alert.id) === "string", 'id'); + t.true(typeof (alert.id) === 'string', 'id'); t.true(+alert.date === +new Date(args.date), 'date'); t.true(alert.from === args.from.toLocaleUpperCase(), 'from'); t.true(alert.to === args.to.toLocaleUpperCase(), 'to'); - t.true(alert.number === "NaN", 'number'); + t.true(alert.number === 'NaN', 'number'); t.true(alert.price === parseInt(args.price, 10), 'price'); - t.true(alert.phone === (args.phone !== "" ? args.phone.split('').filter(d => /\d/.test(d)).join('') : null), 'phone'); - t.true(alert.to_email === (args.to_email !== "" ? args.to_email.split('').filter(d => /\S/.test(d)).join('') : null), 'to_email'); + t.true(alert.phone === (args.phone !== '' ? args.phone.split('').filter(d => /\d/.test(d)).join('') : null), 'phone'); + t.true(alert.toEmail === (args.toEmail !== '' ? args.toEmail.split('').filter(d => /\S/.test(d)).join('') : null), 'toEmail'); t.true(Object.keys(alert.priceHistory).length === 0, 'priceHistory'); t.true(alert.alertType === args.alertType, 'alertType'); t.true(alert.fetchingPrices === true, 'fetchingPrices'); - t.true(alert.formattedDate === new Date(args.date).toLocaleDateString('en-US', { timeZone: 'UTC' }), "formattedDate"); - t.true(alert.formattedNumber === 'WN ' + alert.number.split(',').join(', '), "formattedNumber"); - t.true(alert.formattedPhone === "+1 123-456-7890", "formattedPhone"); - t.true(alert.formattedEmail === null, "formattedEmail"); - t.true(alert.latestPrice === Infinity, "latestPrice"); - t.true(alert.priceHasDropped === alert.latestPrice < args.price, "priceHasDropped"); - t.true(alert.signature === [ new Date(args.date).toLocaleDateString('en-US', { timeZone: 'UTC' }), args.from.toLocaleUpperCase(), args.to.toLocaleUpperCase(), args.number === undefined ? 'All' : args.number.split(',').map(n => n.trim()).filter(n => n.length).join(',') ].join('|'), "signature"); + t.true(alert.formattedDate === new Date(args.date).toLocaleDateString('en-US', { timeZone: 'UTC' }), 'formattedDate'); + t.true(alert.formattedNumber === 'WN ' + alert.number.split(',').join(', '), 'formattedNumber'); + t.true(alert.formattedPhone === '+1 555-555-5555', 'formattedPhone'); + t.true(alert.formattedEmail === null, 'formattedEmail'); + t.true(alert.latestPrice === Infinity, 'latestPrice'); + t.true(alert.priceHasDropped === (alert.latestPrice < args.price), 'priceHasDropped'); + t.true(alert.signature === [ new Date(args.date).toLocaleDateString('en-US', { timeZone: 'UTC' }), args.from.toLocaleUpperCase(), args.to.toLocaleUpperCase(), args.number === undefined ? 'All' : args.number.split(',').map(n => n.trim()).filter(n => n.length).join(',') ].join('|'), 'signature'); t.end(); }); @@ -274,8 +273,8 @@ test('Alert new single (one flight) - no email', async t => { date: '2018/5/29', number: '123', price: '200', - phone: '1234567890', - to_email: '', + phone: '5555555555', + toEmail: '', alertType: ALERT_TYPES.SINGLE, fetchingPrices: true }; @@ -283,24 +282,24 @@ test('Alert new single (one flight) - no email', async t => { const alert = new Alert(args); t.true(alert.user === args.user, 'user'); - t.true(typeof(alert.id) === "string", 'id'); + t.true(typeof (alert.id) === 'string', 'id'); t.true(+alert.date === +new Date(args.date), 'date'); t.true(alert.from === args.from.toLocaleUpperCase(), 'from'); t.true(alert.to === args.to.toLocaleUpperCase(), 'to'); t.true(alert.number === args.number.split(',').map(n => n.trim()).filter(n => n.length).join(','), 'number'); t.true(alert.price === parseInt(args.price, 10), 'price'); - t.true(alert.phone === (args.phone !== "" ? args.phone.split('').filter(d => /\d/.test(d)).join('') : null), 'phone'); - t.true(alert.to_email === (args.to_email !== "" ? args.to_email.split('').filter(d => /\S/.test(d)).join('') : null), 'to_email'); + t.true(alert.phone === (args.phone !== '' ? args.phone.split('').filter(d => /\d/.test(d)).join('') : null), 'phone'); + t.true(alert.toEmail === (args.toEmail !== '' ? args.toEmail.split('').filter(d => /\S/.test(d)).join('') : null), 'toEmail'); t.true(Object.keys(alert.priceHistory).length === 0, 'priceHistory'); t.true(alert.alertType === args.alertType, 'alertType'); t.true(alert.fetchingPrices === true, 'fetchingPrices'); - t.true(alert.formattedDate === new Date(args.date).toLocaleDateString('en-US', { timeZone: 'UTC' }), "formattedDate"); - t.true(alert.formattedNumber === 'WN ' + alert.number.split(',').join(', '), "formattedNumber"); - t.true(alert.formattedPhone === "+1 123-456-7890", "formattedPhone"); - t.true(alert.formattedEmail === null, "formattedEmail"); - t.true(alert.latestPrice === Infinity, "latestPrice"); - t.true(alert.priceHasDropped === alert.latestPrice < args.price, "priceHasDropped"); - t.true(alert.signature === [ new Date(args.date).toLocaleDateString('en-US', { timeZone: 'UTC' }), args.from.toLocaleUpperCase(), args.to.toLocaleUpperCase(), args.number === undefined ? 'All' : args.number.split(',').map(n => n.trim()).filter(n => n.length).join(',') ].join('|'), "signature"); + t.true(alert.formattedDate === new Date(args.date).toLocaleDateString('en-US', { timeZone: 'UTC' }), 'formattedDate'); + t.true(alert.formattedNumber === 'WN ' + alert.number.split(',').join(', '), 'formattedNumber'); + t.true(alert.formattedPhone === '+1 555-555-5555', 'formattedPhone'); + t.true(alert.formattedEmail === null, 'formattedEmail'); + t.true(alert.latestPrice === Infinity, 'latestPrice'); + t.true(alert.priceHasDropped === (alert.latestPrice < args.price), 'priceHasDropped'); + t.true(alert.signature === [ new Date(args.date).toLocaleDateString('en-US', { timeZone: 'UTC' }), args.from.toLocaleUpperCase(), args.to.toLocaleUpperCase(), args.number === undefined ? 'All' : args.number.split(',').map(n => n.trim()).filter(n => n.length).join(',') ].join('|'), 'signature'); t.end(); }); @@ -312,8 +311,8 @@ test('Alert new single (two flights) - no email', async t => { date: '2018/5/29', number: '123, 456', price: '200', - phone: '1234567890', - to_email: '', + phone: '5555555555', + toEmail: '', alertType: ALERT_TYPES.SINGLE, fetchingPrices: true }; @@ -321,24 +320,24 @@ test('Alert new single (two flights) - no email', async t => { const alert = new Alert(args); t.true(alert.user === args.user, 'user'); - t.true(typeof(alert.id) === "string", 'id'); + t.true(typeof (alert.id) === 'string', 'id'); t.true(+alert.date === +new Date(args.date), 'date'); t.true(alert.from === args.from.toLocaleUpperCase(), 'from'); t.true(alert.to === args.to.toLocaleUpperCase(), 'to'); t.true(alert.number === args.number.split(',').map(n => n.trim()).filter(n => n.length).join(','), 'number'); t.true(alert.price === parseInt(args.price, 10), 'price'); - t.true(alert.phone === (args.phone !== "" ? args.phone.split('').filter(d => /\d/.test(d)).join('') : null), 'phone'); - t.true(alert.to_email === (args.to_email !== "" ? args.to_email.split('').filter(d => /\S/.test(d)).join('') : null), 'to_email'); + t.true(alert.phone === (args.phone !== '' ? args.phone.split('').filter(d => /\d/.test(d)).join('') : null), 'phone'); + t.true(alert.toEmail === (args.toEmail !== '' ? args.toEmail.split('').filter(d => /\S/.test(d)).join('') : null), 'toEmail'); t.true(Object.keys(alert.priceHistory).length === 0, 'priceHistory'); t.true(alert.alertType === args.alertType, 'alertType'); t.true(alert.fetchingPrices === true, 'fetchingPrices'); - t.true(alert.formattedDate === new Date(args.date).toLocaleDateString('en-US', { timeZone: 'UTC' }), "formattedDate"); - t.true(alert.formattedNumber === 'WN ' + alert.number.split(',').join(', '), "formattedNumber"); - t.true(alert.formattedPhone === "+1 123-456-7890", "formattedPhone"); - t.true(alert.formattedEmail === null, "formattedEmail"); - t.true(alert.latestPrice === Infinity, "latestPrice"); - t.true(alert.priceHasDropped === alert.latestPrice < args.price, "priceHasDropped"); - t.true(alert.signature === [ new Date(args.date).toLocaleDateString('en-US', { timeZone: 'UTC' }), args.from.toLocaleUpperCase(), args.to.toLocaleUpperCase(), args.number === undefined ? 'All' : args.number.split(',').map(n => n.trim()).filter(n => n.length).join(',') ].join('|'), "signature"); + t.true(alert.formattedDate === new Date(args.date).toLocaleDateString('en-US', { timeZone: 'UTC' }), 'formattedDate'); + t.true(alert.formattedNumber === 'WN ' + alert.number.split(',').join(', '), 'formattedNumber'); + t.true(alert.formattedPhone === '+1 555-555-5555', 'formattedPhone'); + t.true(alert.formattedEmail === null, 'formattedEmail'); + t.true(alert.latestPrice === Infinity, 'latestPrice'); + t.true(alert.priceHasDropped === (alert.latestPrice < args.price), 'priceHasDropped'); + t.true(alert.signature === [ new Date(args.date).toLocaleDateString('en-US', { timeZone: 'UTC' }), args.from.toLocaleUpperCase(), args.to.toLocaleUpperCase(), args.number === undefined ? 'All' : args.number.split(',').map(n => n.trim()).filter(n => n.length).join(',') ].join('|'), 'signature'); t.end(); }); @@ -350,7 +349,7 @@ test('Alert new day - no email or phone', async t => { date: '2018/5/29', price: '200', phone: '', - to_email: '', + toEmail: '', alertType: ALERT_TYPES.DAY, fetchingPrices: true }; @@ -358,24 +357,24 @@ test('Alert new day - no email or phone', async t => { const alert = new Alert(args); t.true(alert.user === args.user, 'user'); - t.true(typeof(alert.id) === "string", 'id'); + t.true(typeof (alert.id) === 'string', 'id'); t.true(+alert.date === +new Date(args.date), 'date'); t.true(alert.from === args.from.toLocaleUpperCase(), 'from'); t.true(alert.to === args.to.toLocaleUpperCase(), 'to'); - t.true(alert.number === "NaN", 'number'); + t.true(alert.number === 'NaN', 'number'); t.true(alert.price === parseInt(args.price, 10), 'price'); - t.true(alert.phone === (args.phone !== "" ? args.phone.split('').filter(d => /\d/.test(d)).join('') : null), 'phone'); - t.true(alert.to_email === (args.to_email !== "" ? args.to_email.split('').filter(d => /\S/.test(d)).join('') : null), 'to_email'); + t.true(alert.phone === (args.phone !== '' ? args.phone.split('').filter(d => /\d/.test(d)).join('') : null), 'phone'); + t.true(alert.toEmail === (args.toEmail !== '' ? args.toEmail.split('').filter(d => /\S/.test(d)).join('') : null), 'toEmail'); t.true(Object.keys(alert.priceHistory).length === 0, 'priceHistory'); t.true(alert.alertType === args.alertType, 'alertType'); t.true(alert.fetchingPrices === true, 'fetchingPrices'); - t.true(alert.formattedDate === new Date(args.date).toLocaleDateString('en-US', { timeZone: 'UTC' }), "formattedDate"); - t.true(alert.formattedNumber === 'WN ' + alert.number.split(',').join(', '), "formattedNumber"); - t.true(alert.formattedPhone === null, "formattedPhone"); - t.true(alert.formattedEmail === null, "formattedEmail"); - t.true(alert.latestPrice === Infinity, "latestPrice"); - t.true(alert.priceHasDropped === alert.latestPrice < args.price, "priceHasDropped"); - t.true(alert.signature === [ new Date(args.date).toLocaleDateString('en-US', { timeZone: 'UTC' }), args.from.toLocaleUpperCase(), args.to.toLocaleUpperCase(), args.number === undefined ? 'All' : args.number.split(',').map(n => n.trim()).filter(n => n.length).join(',') ].join('|'), "signature"); + t.true(alert.formattedDate === new Date(args.date).toLocaleDateString('en-US', { timeZone: 'UTC' }), 'formattedDate'); + t.true(alert.formattedNumber === 'WN ' + alert.number.split(',').join(', '), 'formattedNumber'); + t.true(alert.formattedPhone === null, 'formattedPhone'); + t.true(alert.formattedEmail === null, 'formattedEmail'); + t.true(alert.latestPrice === Infinity, 'latestPrice'); + t.true(alert.priceHasDropped === (alert.latestPrice < args.price), 'priceHasDropped'); + t.true(alert.signature === [ new Date(args.date).toLocaleDateString('en-US', { timeZone: 'UTC' }), args.from.toLocaleUpperCase(), args.to.toLocaleUpperCase(), args.number === undefined ? 'All' : args.number.split(',').map(n => n.trim()).filter(n => n.length).join(',') ].join('|'), 'signature'); t.end(); }); @@ -388,7 +387,7 @@ test('Alert new single (one flight) - no email or phone', async t => { number: '123', price: '200', phone: '', - to_email: '', + toEmail: '', alertType: ALERT_TYPES.SINGLE, fetchingPrices: true }; @@ -396,24 +395,24 @@ test('Alert new single (one flight) - no email or phone', async t => { const alert = new Alert(args); t.true(alert.user === args.user, 'user'); - t.true(typeof(alert.id) === "string", 'id'); + t.true(typeof (alert.id) === 'string', 'id'); t.true(+alert.date === +new Date(args.date), 'date'); t.true(alert.from === args.from.toLocaleUpperCase(), 'from'); t.true(alert.to === args.to.toLocaleUpperCase(), 'to'); t.true(alert.number === args.number.split(',').map(n => n.trim()).filter(n => n.length).join(','), 'number'); t.true(alert.price === parseInt(args.price, 10), 'price'); - t.true(alert.phone === (args.phone !== "" ? args.phone.split('').filter(d => /\d/.test(d)).join('') : null), 'phone'); - t.true(alert.to_email === (args.to_email !== "" ? args.to_email.split('').filter(d => /\S/.test(d)).join('') : null), 'to_email'); + t.true(alert.phone === (args.phone !== '' ? args.phone.split('').filter(d => /\d/.test(d)).join('') : null), 'phone'); + t.true(alert.toEmail === (args.toEmail !== '' ? args.toEmail.split('').filter(d => /\S/.test(d)).join('') : null), 'toEmail'); t.true(Object.keys(alert.priceHistory).length === 0, 'priceHistory'); t.true(alert.alertType === args.alertType, 'alertType'); t.true(alert.fetchingPrices === true, 'fetchingPrices'); - t.true(alert.formattedDate === new Date(args.date).toLocaleDateString('en-US', { timeZone: 'UTC' }), "formattedDate"); - t.true(alert.formattedNumber === 'WN ' + alert.number.split(',').join(', '), "formattedNumber"); - t.true(alert.formattedPhone === null, "formattedPhone"); - t.true(alert.formattedEmail === null, "formattedEmail"); - t.true(alert.latestPrice === Infinity, "latestPrice"); - t.true(alert.priceHasDropped === alert.latestPrice < args.price, "priceHasDropped"); - t.true(alert.signature === [ new Date(args.date).toLocaleDateString('en-US', { timeZone: 'UTC' }), args.from.toLocaleUpperCase(), args.to.toLocaleUpperCase(), args.number === undefined ? 'All' : args.number.split(',').map(n => n.trim()).filter(n => n.length).join(',') ].join('|'), "signature"); + t.true(alert.formattedDate === new Date(args.date).toLocaleDateString('en-US', { timeZone: 'UTC' }), 'formattedDate'); + t.true(alert.formattedNumber === 'WN ' + alert.number.split(',').join(', '), 'formattedNumber'); + t.true(alert.formattedPhone === null, 'formattedPhone'); + t.true(alert.formattedEmail === null, 'formattedEmail'); + t.true(alert.latestPrice === Infinity, 'latestPrice'); + t.true(alert.priceHasDropped === (alert.latestPrice < args.price), 'priceHasDropped'); + t.true(alert.signature === [ new Date(args.date).toLocaleDateString('en-US', { timeZone: 'UTC' }), args.from.toLocaleUpperCase(), args.to.toLocaleUpperCase(), args.number === undefined ? 'All' : args.number.split(',').map(n => n.trim()).filter(n => n.length).join(',') ].join('|'), 'signature'); t.end(); }); @@ -426,7 +425,7 @@ test('Alert new single (two flights) - no email or phone', async t => { number: '123, 456', price: '200', phone: '', - to_email: '', + toEmail: '', alertType: ALERT_TYPES.SINGLE, fetchingPrices: true }; @@ -434,24 +433,23 @@ test('Alert new single (two flights) - no email or phone', async t => { const alert = new Alert(args); t.true(alert.user === args.user, 'user'); - t.true(typeof(alert.id) === "string", 'id'); + t.true(typeof (alert.id) === 'string', 'id'); t.true(+alert.date === +new Date(args.date), 'date'); t.true(alert.from === args.from.toLocaleUpperCase(), 'from'); t.true(alert.to === args.to.toLocaleUpperCase(), 'to'); t.true(alert.number === args.number.split(',').map(n => n.trim()).filter(n => n.length).join(','), 'number'); t.true(alert.price === parseInt(args.price, 10), 'price'); - t.true(alert.phone === (args.phone !== "" ? args.phone.split('').filter(d => /\d/.test(d)).join('') : null), 'phone'); - t.true(alert.to_email === (args.to_email !== "" ? args.to_email.split('').filter(d => /\S/.test(d)).join('') : null), 'to_email'); + t.true(alert.phone === (args.phone !== '' ? args.phone.split('').filter(d => /\d/.test(d)).join('') : null), 'phone'); + t.true(alert.toEmail === (args.toEmail !== '' ? args.toEmail.split('').filter(d => /\S/.test(d)).join('') : null), 'toEmail'); t.true(Object.keys(alert.priceHistory).length === 0, 'priceHistory'); t.true(alert.alertType === args.alertType, 'alertType'); t.true(alert.fetchingPrices === true, 'fetchingPrices'); - t.true(alert.formattedDate === new Date(args.date).toLocaleDateString('en-US', { timeZone: 'UTC' }), "formattedDate"); - t.true(alert.formattedNumber === 'WN ' + alert.number.split(',').join(', '), "formattedNumber"); - t.true(alert.formattedPhone === null, "formattedPhone"); - t.true(alert.formattedEmail === null, "formattedEmail"); - t.true(alert.latestPrice === Infinity, "latestPrice"); - t.true(alert.priceHasDropped === alert.latestPrice < args.price, "priceHasDropped"); - t.true(alert.signature === [ new Date(args.date).toLocaleDateString('en-US', { timeZone: 'UTC' }), args.from.toLocaleUpperCase(), args.to.toLocaleUpperCase(), args.number === undefined ? 'All' : args.number.split(',').map(n => n.trim()).filter(n => n.length).join(',') ].join('|'), "signature"); + t.true(alert.formattedDate === new Date(args.date).toLocaleDateString('en-US', { timeZone: 'UTC' }), 'formattedDate'); + t.true(alert.formattedNumber === 'WN ' + alert.number.split(',').join(', '), 'formattedNumber'); + t.true(alert.formattedPhone === null, 'formattedPhone'); + t.true(alert.formattedEmail === null, 'formattedEmail'); + t.true(alert.latestPrice === Infinity, 'latestPrice'); + t.true(alert.priceHasDropped === (alert.latestPrice < args.price), 'priceHasDropped'); + t.true(alert.signature === [ new Date(args.date).toLocaleDateString('en-US', { timeZone: 'UTC' }), args.from.toLocaleUpperCase(), args.to.toLocaleUpperCase(), args.number === undefined ? 'All' : args.number.split(',').map(n => n.trim()).filter(n => n.length).join(',') ].join('|'), 'signature'); t.end(); }); - diff --git a/test/bot/get-price-cash.js b/test/bot/get-price-cash.js new file mode 100644 index 0000000..a9e0acd --- /dev/null +++ b/test/bot/get-price-cash.js @@ -0,0 +1,85 @@ +const test = require('tape'); + +const { getFlights } = require('../../lib/bot/get-price.js'); + +test('getFlights domestic cash', async t => { + const tomorrow = (new Date()).setDate((new Date()).getDate() + 1); + const args = { + from: 'SEA', + to: 'CLE', + departDate: tomorrow, + isPointsBooking: false + }; + const flights = await getFlights(args); + + t.true(flights.outbound, 'flights.outbound'); + t.true(flights.outbound[0], 'flights.outbound[0]'); + if (flights.outbound[0]) { + t.true(flights.outbound[0].number, 'flights.outbound[0].number'); + t.true(flights.outbound[0].stops, 'flights.outbound[0].stops'); + t.true(flights.outbound[0].price, 'flights.outbound[0].price'); + } + t.end(); +}); + +test('getFlights international cash', async t => { + const tomorrow = (new Date()).setDate((new Date()).getDate() + 1); + const args = { + from: 'DEN', + to: 'MEX', + departDate: tomorrow, + isPointsBooking: false + }; + const flights = await getFlights(args); + + t.true(flights.outbound, 'flights.outbound'); + t.true(flights.outbound[0], 'flights.outbound[0]'); + if (flights.outbound[0]) { + t.true(flights.outbound[0].number, 'flights.outbound[0].number'); + t.true(flights.outbound[0].stops, 'flights.outbound[0].stops'); + t.true(flights.outbound[0].price, 'flights.outbound[0].price'); + } + t.end(); +}); + +test('getFlights fake FROM airport cash', async t => { + const tomorrow = (new Date()).setDate((new Date()).getDate() + 1); + const args = { + from: 'FOO', + to: 'CLE', + departDate: tomorrow, + isPointsBooking: false + }; + const flights = await getFlights(args); + + t.true(!Array.isArray(flights.outbound) || !flights.outbound.length, 'flights.outbound'); // check if this should be | or & + t.end(); +}); + +test('getFlights fake TO airport cash', async t => { + const tomorrow = (new Date()).setDate((new Date()).getDate() + 1); + const args = { + from: 'SEA', + to: 'FOO', + departDate: tomorrow, + isPointsBooking: false + }; + const flights = await getFlights(args); + + t.true(!Array.isArray(flights.outbound) || !flights.outbound.length, 'flights.outbound'); + t.end(); +}); + +test('getFlights previous date cash', async t => { + const yesterday = (new Date()).setDate((new Date()).getDate() - 2); + const args = { + from: 'SEA', + to: 'CLE', + departDate: yesterday, + isPointsBooking: false + }; + const flights = await getFlights(args); + + t.true(!Array.isArray(flights.outbound) || !flights.outbound.length, 'flights.outbound'); + t.end(); +}); diff --git a/test/bot/get-price.js b/test/bot/get-price-points.js similarity index 76% rename from test/bot/get-price.js rename to test/bot/get-price-points.js index 7c17ba2..daf156a 100644 --- a/test/bot/get-price.js +++ b/test/bot/get-price-points.js @@ -2,19 +2,19 @@ const test = require('tape'); const { getFlights } = require('../../lib/bot/get-price.js'); -test('getFlights domestic', async t => { +test('getFlights domestic points', async t => { const tomorrow = (new Date()).setDate((new Date()).getDate() + 1); const args = { from: 'SEA', to: 'CLE', - departDate: tomorrow + departDate: tomorrow, + isPointsBooking: true }; const flights = await getFlights(args); t.true(flights.outbound, 'flights.outbound'); t.true(flights.outbound[0], 'flights.outbound[0]'); - if (flights.outbound[0]) - { + if (flights.outbound[0]) { t.true(flights.outbound[0].number, 'flights.outbound[0].number'); t.true(flights.outbound[0].stops, 'flights.outbound[0].stops'); t.true(flights.outbound[0].price, 'flights.outbound[0].price'); @@ -22,19 +22,19 @@ test('getFlights domestic', async t => { t.end(); }); -test('getFlights international', async t => { +test('getFlights international points', async t => { const tomorrow = (new Date()).setDate((new Date()).getDate() + 1); const args = { from: 'DEN', to: 'MEX', - departDate: tomorrow + departDate: tomorrow, + isPointsBooking: true }; const flights = await getFlights(args); t.true(flights.outbound, 'flights.outbound'); t.true(flights.outbound[0], 'flights.outbound[0]'); - if (flights.outbound[0]) - { + if (flights.outbound[0]) { t.true(flights.outbound[0].number, 'flights.outbound[0].number'); t.true(flights.outbound[0].stops, 'flights.outbound[0].stops'); t.true(flights.outbound[0].price, 'flights.outbound[0].price'); @@ -42,12 +42,13 @@ test('getFlights international', async t => { t.end(); }); -test('getFlights fake FROM airport', async t => { +test('getFlights fake FROM airport points', async t => { const tomorrow = (new Date()).setDate((new Date()).getDate() + 1); const args = { from: 'FOO', to: 'CLE', - departDate: tomorrow + departDate: tomorrow, + isPointsBooking: true }; const flights = await getFlights(args); @@ -55,12 +56,13 @@ test('getFlights fake FROM airport', async t => { t.end(); }); -test('getFlights fake TO airport', async t => { +test('getFlights fake TO airport points', async t => { const tomorrow = (new Date()).setDate((new Date()).getDate() + 1); const args = { from: 'SEA', to: 'FOO', - departDate: tomorrow + departDate: tomorrow, + isPointsBooking: true }; const flights = await getFlights(args); @@ -68,12 +70,13 @@ test('getFlights fake TO airport', async t => { t.end(); }); -test('getFlights previous date', async t => { +test('getFlights previous date points', async t => { const yesterday = (new Date()).setDate((new Date()).getDate() - 2); const args = { from: 'SEA', to: 'CLE', - departDate: yesterday + departDate: yesterday, + isPointsBooking: true }; const flights = await getFlights(args); diff --git a/yarn.lock b/yarn.lock index 2859afb..1e8d1e2 100644 --- a/yarn.lock +++ b/yarn.lock @@ -6,9 +6,9 @@ version "10.5.2" resolved "https://registry.yarnpkg.com/@types/node/-/node-10.5.2.tgz#f19f05314d5421fe37e74153254201a7bf00a707" -JSONStream@^1.3.3: - version "1.3.3" - resolved "https://registry.yarnpkg.com/JSONStream/-/JSONStream-1.3.3.tgz#27b4b8fbbfeab4e71bcf551e7f27be8d952239bf" +JSONStream@^1.3.4: + version "1.3.5" + resolved "https://registry.yarnpkg.com/JSONStream/-/JSONStream-1.3.5.tgz#3208c1f08d3a4d99261ab64f92302bc15e111ca0" dependencies: jsonparse "^1.2.0" through ">=2.2.7 <3" @@ -23,11 +23,11 @@ abs@^1.2.1: dependencies: ul "^5.0.0" -accepts@~1.3.4: - version "1.3.4" - resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.4.tgz#86246758c7dd6d21a6474ff084a4740ec05eb21f" +accepts@~1.3.5: + version "1.3.5" + resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.5.tgz#eb777df6011723a3b14e8a72c0805c8e86746bd2" dependencies: - mime-types "~2.1.16" + mime-types "~2.1.18" negotiator "0.6.1" acorn-globals@^3.0.0: @@ -36,13 +36,11 @@ acorn-globals@^3.0.0: dependencies: acorn "^4.0.4" -acorn-jsx@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-3.0.1.tgz#afdf9488fb1ecefc8348f6fb22f464e32a58b36b" - dependencies: - acorn "^3.0.4" +acorn-jsx@^5.0.0: + version "5.0.1" + resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.0.1.tgz#32a064fd925429216a09b141102bfdd185fae40e" -acorn@^3.0.4, acorn@^3.1.0, acorn@~3.3.0: +acorn@^3.1.0, acorn@~3.3.0: version "3.3.0" resolved "https://registry.yarnpkg.com/acorn/-/acorn-3.3.0.tgz#45e37fb39e8da3f25baee3ff5369e2bb5f22017a" @@ -50,9 +48,9 @@ acorn@^4.0.4, acorn@~4.0.2: version "4.0.13" resolved "https://registry.yarnpkg.com/acorn/-/acorn-4.0.13.tgz#105495ae5361d697bd195c825192e1ad7f253787" -acorn@^5.5.0: - version "5.7.1" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.7.1.tgz#f095829297706a7c9776958c0afc8930a9b9d9d8" +acorn@^6.0.2: + version "6.0.4" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.0.4.tgz#77377e7353b72ec5104550aa2d2097a2fd40b754" agent-base@4: version "4.2.0" @@ -78,16 +76,9 @@ agentkeepalive@^3.4.1: dependencies: humanize-ms "^1.2.1" -ajv-keywords@^2.1.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-2.1.1.tgz#617997fc5f60576894c435f940d819e135b80762" - -ajv@^4.9.1: - version "4.11.8" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-4.11.8.tgz#82ffb02b29e662ae53bdc20af15947706739c536" - dependencies: - co "^4.6.0" - json-stable-stringify "^1.0.1" +ajv-keywords@^3.0.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.2.0.tgz#e86b819c602cf8821ad637413698f1dec021847a" ajv@^5.1.0: version "5.5.1" @@ -98,14 +89,14 @@ ajv@^5.1.0: fast-json-stable-stringify "^2.0.0" json-schema-traverse "^0.3.0" -ajv@^5.2.3, ajv@^5.3.0: - version "5.5.2" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-5.5.2.tgz#73b5eeca3fab653e3d3f9422b341ad42205dc965" +ajv@^6.0.1, ajv@^6.5.0, ajv@^6.5.5: + version "6.6.2" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.6.2.tgz#caceccf474bf3fc3ce3b147443711a24063cc30d" dependencies: - co "^4.6.0" - fast-deep-equal "^1.0.0" + fast-deep-equal "^2.0.1" fast-json-stable-stringify "^2.0.0" - json-schema-traverse "^0.3.0" + json-schema-traverse "^0.4.1" + uri-js "^4.2.2" align-text@^0.1.1, align-text@^0.1.3: version "0.1.4" @@ -115,10 +106,6 @@ align-text@^0.1.1, align-text@^0.1.3: longest "^1.0.1" repeat-string "^1.5.2" -amdefine@>=0.0.4: - version "1.0.1" - resolved "https://registry.yarnpkg.com/amdefine/-/amdefine-1.0.1.tgz#4a5282ac164729e93619bcfd3ad151f817ce91f5" - ansi-align@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/ansi-align/-/ansi-align-2.0.0.tgz#c36aeccba563b89ceb556f3690f0b1d9e3547f7f" @@ -240,10 +227,6 @@ assert-plus@1.0.0, assert-plus@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525" -assert-plus@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-0.2.0.tgz#d74e1b87e7affc0db8aadb7021f3fe48101ab234" - assign-symbols@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367" @@ -274,19 +257,19 @@ atob@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.1.tgz#ae2d5a729477f289d60dd7f96a6314a22dd6c22a" -aws-sign2@~0.6.0: - version "0.6.0" - resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.6.0.tgz#14342dd38dbcc94d0e5b87d763cd63612c0e794f" - aws-sign2@~0.7.0: version "0.7.0" resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.7.0.tgz#b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8" -aws4@^1.2.1, aws4@^1.6.0: +aws4@^1.6.0: version "1.6.0" resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.6.0.tgz#83ef5ca860b2b32e4a0deedee8c771b9db57471e" -babel-code-frame@^6.22.0: +aws4@^1.8.0: + version "1.8.0" + resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.8.0.tgz#f0e003d9ca9e7f59c7a508945d7b2ef9a04a542f" + +babel-code-frame@^6.26.0: version "6.26.0" resolved "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-6.26.0.tgz#63fd43f7dc1e3bb7ce35947db8fe369a3f58c74b" dependencies: @@ -340,35 +323,33 @@ block-stream@*: dependencies: inherits "~2.0.0" -bluebird@^3.5.0, bluebird@^3.5.1, bluebird@~3.5.1: +bluebird@^3.5.0, bluebird@^3.5.1: version "3.5.1" resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.5.1.tgz#d9551f9de98f1fcda1e683d17ee91a0602ee2eb9" -body-parser@1.18.2, body-parser@^1.18.2: - version "1.18.2" - resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.18.2.tgz#87678a19d84b47d859b83199bd59bce222b10454" +bluebird@^3.5.3: + version "3.5.3" + resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.5.3.tgz#7d01c6f9616c9a51ab0f8c549a79dfe6ec33efa7" + +body-parser@1.18.3, body-parser@^1.18.3: + version "1.18.3" + resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.18.3.tgz#5b292198ffdd553b3a0f20ded0592b956955c8b4" dependencies: bytes "3.0.0" content-type "~1.0.4" debug "2.6.9" - depd "~1.1.1" - http-errors "~1.6.2" - iconv-lite "0.4.19" + depd "~1.1.2" + http-errors "~1.6.3" + iconv-lite "0.4.23" on-finished "~2.3.0" - qs "6.5.1" - raw-body "2.3.2" - type-is "~1.6.15" + qs "6.5.2" + raw-body "2.3.3" + type-is "~1.6.16" boolbase@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/boolbase/-/boolbase-1.0.0.tgz#68dff5fbe60c51eb37725ea9e3ed310dcc1e776e" -boom@2.x.x: - version "2.10.1" - resolved "https://registry.yarnpkg.com/boom/-/boom-2.10.1.tgz#39c8918ceff5799f83f9492a848f625add0c766f" - dependencies: - hoek "2.x.x" - boom@4.x.x: version "4.3.1" resolved "https://registry.yarnpkg.com/boom/-/boom-4.3.1.tgz#4f8a3005cb4a7e3889f749030fd25b96e01d2e31" @@ -423,7 +404,7 @@ build-url@^1.0.10: version "1.1.2" resolved "https://registry.yarnpkg.com/build-url/-/build-url-1.1.2.tgz#ae0103f6c16a626d122ff06b508455d476c92825" -builtin-modules@^1.0.0, builtin-modules@^1.1.1: +builtin-modules@^1.0.0: version "1.1.1" resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-1.1.1.tgz#270f076c5a72c02f5b65a47df94c5fe3a278892f" @@ -480,6 +461,25 @@ cacache@^11.0.1, cacache@^11.0.2: unique-filename "^1.1.0" y18n "^4.0.0" +cacache@^11.2.0: + version "11.3.2" + resolved "https://registry.yarnpkg.com/cacache/-/cacache-11.3.2.tgz#2d81e308e3d258ca38125b676b98b2ac9ce69bfa" + dependencies: + bluebird "^3.5.3" + chownr "^1.1.1" + figgy-pudding "^3.5.1" + glob "^7.1.3" + graceful-fs "^4.1.15" + lru-cache "^5.1.1" + mississippi "^3.0.0" + mkdirp "^0.5.1" + move-concurrently "^1.0.1" + promise-inflight "^1.0.1" + rimraf "^2.6.2" + ssri "^6.0.1" + unique-filename "^1.1.1" + y18n "^4.0.0" + cache-base@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/cache-base/-/cache-base-1.0.1.tgz#0a7f46416831c8b662ee36fe4e7c59d76f666ab2" @@ -578,7 +578,7 @@ cheerio@^1.0.0-rc.2: lodash "^4.15.0" parse5 "^3.0.1" -chokidar@^2.0.2: +chokidar@^2.0.4: version "2.0.4" resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-2.0.4.tgz#356ff4e2b0e8e43e322d18a372460bbcf3accd26" dependencies: @@ -601,6 +601,10 @@ chownr@^1.0.1, chownr@~1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.0.1.tgz#e2a75042a9551908bebd25b8523d5f9769d79181" +chownr@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.1.tgz#54726b8b8fff4df053c42187e801fb4412df1494" + chrono-node@^1.3.5: version "1.3.5" resolved "https://registry.yarnpkg.com/chrono-node/-/chrono-node-1.3.5.tgz#a2495298a32da82bcc01ad9be7d77efa5e244122" @@ -611,6 +615,10 @@ ci-info@^1.0.0: version "1.1.3" resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-1.1.3.tgz#710193264bb05c77b8c90d02f5aaf22216a667b2" +ci-info@^1.6.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-1.6.0.tgz#2ca20dbb9ceb32d4524a683303313f0304b1e497" + cidr-regex@^2.0.8: version "2.0.9" resolved "https://registry.yarnpkg.com/cidr-regex/-/cidr-regex-2.0.9.tgz#9c17bb2b18e15af07f7d0c3b994b961d687ed1c9" @@ -630,12 +638,11 @@ class-utils@^0.3.5: isobject "^3.0.0" static-extend "^0.1.1" -clean-css@^3.3.0: - version "3.4.28" - resolved "https://registry.yarnpkg.com/clean-css/-/clean-css-3.4.28.tgz#bf1945e82fc808f55695e6ddeaec01400efd03ff" +clean-css@^4.1.11: + version "4.2.1" + resolved "https://registry.yarnpkg.com/clean-css/-/clean-css-4.2.1.tgz#2d411ef76b8569b6d0c84068dabe85b0aa5e5c17" dependencies: - commander "2.8.x" - source-map "0.4.x" + source-map "~0.6.0" cli-boxes@^1.0.0: version "1.0.0" @@ -730,23 +737,17 @@ columnify@~1.5.4: strip-ansi "^3.0.0" wcwidth "^1.0.0" -combined-stream@1.0.6: - version "1.0.6" - resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.6.tgz#723e7df6e801ac5613113a7e445a9b69cb632818" - dependencies: - delayed-stream "~1.0.0" - combined-stream@^1.0.5, combined-stream@~1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.5.tgz#938370a57b4a51dea2c77c15d5c5fdf895164009" dependencies: delayed-stream "~1.0.0" -commander@2.8.x: - version "2.8.1" - resolved "https://registry.yarnpkg.com/commander/-/commander-2.8.1.tgz#06be367febfda0c330aa1e2a072d3dc9762425d4" +combined-stream@^1.0.6, combined-stream@~1.0.6: + version "1.0.7" + resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.7.tgz#2d1d24317afb8abe95d6d2c0b07b57813539d828" dependencies: - graceful-readlink ">= 1.0.0" + delayed-stream "~1.0.0" component-emitter@^1.2.1: version "1.2.1" @@ -756,26 +757,26 @@ concat-map@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" -concat-stream@1.6.0, concat-stream@^1.5.2: - version "1.6.0" - resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.0.tgz#0aac662fd52be78964d5532f694784e70110acf7" +concat-stream@1.6.2, concat-stream@^1.5.0: + version "1.6.2" + resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.2.tgz#904bdf194cd3122fc675c77fc4ac3d4ff0fd1a34" dependencies: + buffer-from "^1.0.0" inherits "^2.0.3" readable-stream "^2.2.2" typedarray "^0.0.6" -concat-stream@^1.5.0, concat-stream@^1.6.0: - version "1.6.2" - resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.2.tgz#904bdf194cd3122fc675c77fc4ac3d4ff0fd1a34" +concat-stream@^1.5.2: + version "1.6.0" + resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.0.tgz#0aac662fd52be78964d5532f694784e70110acf7" dependencies: - buffer-from "^1.0.0" inherits "^2.0.3" readable-stream "^2.2.2" typedarray "^0.0.6" -config-chain@~1.1.11: - version "1.1.11" - resolved "https://registry.yarnpkg.com/config-chain/-/config-chain-1.1.11.tgz#aba09747dfbe4c3e70e766a6e41586e1859fc6f2" +config-chain@^1.1.12: + version "1.1.12" + resolved "https://registry.yarnpkg.com/config-chain/-/config-chain-1.1.12.tgz#0fde8d091200eb5e808caf25fe618c02f48e4efa" dependencies: ini "^1.3.4" proto-list "~1.2.1" @@ -853,17 +854,13 @@ copy-descriptor@^0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d" -core-js@^1.0.0: - version "1.2.7" - resolved "https://registry.yarnpkg.com/core-js/-/core-js-1.2.7.tgz#652294c14651db28fa93bd2d5ff2983a4f08c636" - core-util-is@1.0.2, core-util-is@~1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" -cors@^2.8.4: - version "2.8.4" - resolved "https://registry.yarnpkg.com/cors/-/cors-2.8.4.tgz#2bd381f2eb201020105cd50ea59da63090694686" +cors@^2.8.5: + version "2.8.5" + resolved "https://registry.yarnpkg.com/cors/-/cors-2.8.5.tgz#eac11da51592dd86b9f06f6e7ac293b3df875d29" dependencies: object-assign "^4" vary "^1" @@ -874,7 +871,7 @@ create-error-class@^3.0.0, create-error-class@^3.0.1: dependencies: capture-stack-trace "^1.0.0" -cross-spawn@^5.0.1, cross-spawn@^5.1.0: +cross-spawn@^5.0.1: version "5.1.0" resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-5.1.0.tgz#e8bd0efee58fcff6f8f94510a0a554bbfa235449" dependencies: @@ -882,11 +879,15 @@ cross-spawn@^5.0.1, cross-spawn@^5.1.0: shebang-command "^1.2.0" which "^1.2.9" -cryptiles@2.x.x: - version "2.0.5" - resolved "https://registry.yarnpkg.com/cryptiles/-/cryptiles-2.0.5.tgz#3bdfecdc608147c1c67202fa291e7dca59eaa3b8" +cross-spawn@^6.0.5: + version "6.0.5" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4" dependencies: - boom "2.x.x" + nice-try "^1.0.4" + path-key "^2.0.1" + semver "^5.5.0" + shebang-command "^1.2.0" + which "^1.2.9" cryptiles@3.x.x: version "3.1.2" @@ -1005,12 +1006,18 @@ debug@2, debug@2.6.9, debug@^2.1.2, debug@^2.2.0, debug@^2.3.3, debug@^2.6.8, de dependencies: ms "2.0.0" -debug@3.1.0, debug@^3.1.0, debug@~3.1.0: +debug@3.1.0, debug@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/debug/-/debug-3.1.0.tgz#5bb5a0672628b64149566ba16819e61518c67261" dependencies: ms "2.0.0" +debug@^4.1.0: + version "4.1.1" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.1.1.tgz#3b72260255109c6b589cee050f1d516139664791" + dependencies: + ms "^2.1.1" + debuglog@*, debuglog@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/debuglog/-/debuglog-1.0.1.tgz#aa24ffb9ac3df9a2351837cfb2d279360cd78492" @@ -1089,13 +1096,13 @@ degenerator@^1.0.4: escodegen "1.x.x" esprima "3.x.x" -deglob@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/deglob/-/deglob-2.1.0.tgz#4d44abe16ef32c779b4972bd141a80325029a14a" +deglob@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/deglob/-/deglob-3.1.0.tgz#1868193193d3432a5326e8fb2052b439a43a454e" dependencies: find-root "^1.0.0" glob "^7.0.5" - ignore "^3.0.9" + ignore "^5.0.0" pkg-config "^1.1.0" run-parallel "^1.1.2" uniq "^1.0.1" @@ -1124,6 +1131,10 @@ depd@1.1.1, depd@~1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.1.tgz#5783b4e1c459f06fa5ca27f991f3d06e7a310359" +depd@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" + destroy@~1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80" @@ -1154,7 +1165,7 @@ doctrine@1.5.0: esutils "^2.0.2" isarray "^1.0.0" -doctrine@^2.0.2, doctrine@^2.1.0: +doctrine@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-2.1.0.tgz#5cd01fc101621b42c4cd7f5d1a66243716d3f39d" dependencies: @@ -1209,9 +1220,9 @@ dotenv@^5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-5.0.1.tgz#a5317459bd3d79ab88cff6e44057a6a3fbb1fcef" -dotenv@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-6.0.0.tgz#24e37c041741c5f4b25324958ebbc34bca965935" +dotenv@^6.2.0: + version "6.2.0" + resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-6.2.0.tgz#941c0410535d942c8becf28d3f357dbd9d476064" double-ended-queue@^2.1.0-0: version "2.1.0-0" @@ -1227,10 +1238,6 @@ duplexer3@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/duplexer3/-/duplexer3-0.1.4.tgz#ee01dd1cac0ed3cbc7fdbea37dc0a8f1ce002ce2" -duplexer@~0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/duplexer/-/duplexer-0.1.1.tgz#ace6ff808c1ce66b57d1ebf97977acb02334cfc1" - duplexify@^3.4.2, duplexify@^3.5.3: version "3.5.4" resolved "https://registry.yarnpkg.com/duplexify/-/duplexify-3.5.4.tgz#4bb46c1796eabebeec4ca9a2e66b808cb7a3d8b4" @@ -1254,9 +1261,9 @@ ee-first@1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" -encodeurl@~1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.1.tgz#79e3d58655346909fe6f0f45a5de68103b294d20" +encodeurl@~1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" encoding@^0.1.11: version "0.1.12" @@ -1349,17 +1356,17 @@ escodegen@1.x.x: optionalDependencies: source-map "~0.5.6" -eslint-config-semistandard@12.0.1: - version "12.0.1" - resolved "https://registry.yarnpkg.com/eslint-config-semistandard/-/eslint-config-semistandard-12.0.1.tgz#e35d66959dfe6f0d8e8445d7a4de37d8fd8875f4" +eslint-config-semistandard@13.0.0: + version "13.0.0" + resolved "https://registry.yarnpkg.com/eslint-config-semistandard/-/eslint-config-semistandard-13.0.0.tgz#52ecf19081e1b6b1ccc839d049f6429ca6252ad7" -eslint-config-standard-jsx@5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/eslint-config-standard-jsx/-/eslint-config-standard-jsx-5.0.0.tgz#4abfac554f38668e0078c664569e7b2384e5d2aa" +eslint-config-standard-jsx@6.0.2: + version "6.0.2" + resolved "https://registry.yarnpkg.com/eslint-config-standard-jsx/-/eslint-config-standard-jsx-6.0.2.tgz#90c9aa16ac2c4f8970c13fc7efc608bacd02da70" -eslint-config-standard@11.0.0: - version "11.0.0" - resolved "https://registry.yarnpkg.com/eslint-config-standard/-/eslint-config-standard-11.0.0.tgz#87ee0d3c9d95382dc761958cbb23da9eea31e0ba" +eslint-config-standard@12.0.0: + version "12.0.0" + resolved "https://registry.yarnpkg.com/eslint-config-standard/-/eslint-config-standard-12.0.0.tgz#638b4c65db0bd5a41319f96bba1f15ddad2107d9" eslint-import-resolver-node@^0.3.1: version "0.3.2" @@ -1368,113 +1375,129 @@ eslint-import-resolver-node@^0.3.1: debug "^2.6.9" resolve "^1.5.0" -eslint-module-utils@^2.1.1: +eslint-module-utils@^2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.2.0.tgz#b270362cd88b1a48ad308976ce7fa54e98411746" dependencies: debug "^2.6.8" pkg-dir "^1.0.0" -eslint-plugin-import@~2.8.0: - version "2.8.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.8.0.tgz#fa1b6ef31fcb3c501c09859c1b86f1fc5b986894" +eslint-plugin-es@^1.3.1: + version "1.4.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-es/-/eslint-plugin-es-1.4.0.tgz#475f65bb20c993fc10e8c8fe77d1d60068072da6" + dependencies: + eslint-utils "^1.3.0" + regexpp "^2.0.1" + +eslint-plugin-import@~2.14.0: + version "2.14.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.14.0.tgz#6b17626d2e3e6ad52cfce8807a845d15e22111a8" dependencies: - builtin-modules "^1.1.1" contains-path "^0.1.0" debug "^2.6.8" doctrine "1.5.0" eslint-import-resolver-node "^0.3.1" - eslint-module-utils "^2.1.1" + eslint-module-utils "^2.2.0" has "^1.0.1" - lodash.cond "^4.3.0" + lodash "^4.17.4" minimatch "^3.0.3" read-pkg-up "^2.0.0" + resolve "^1.6.0" -eslint-plugin-node@~6.0.0: - version "6.0.1" - resolved "https://registry.yarnpkg.com/eslint-plugin-node/-/eslint-plugin-node-6.0.1.tgz#bf19642298064379315d7a4b2a75937376fa05e4" +eslint-plugin-node@~7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/eslint-plugin-node/-/eslint-plugin-node-7.0.1.tgz#a6e054e50199b2edd85518b89b4e7b323c9f36db" dependencies: - ignore "^3.3.6" + eslint-plugin-es "^1.3.1" + eslint-utils "^1.3.1" + ignore "^4.0.2" minimatch "^3.0.4" - resolve "^1.3.3" - semver "^5.4.1" + resolve "^1.8.1" + semver "^5.5.0" -eslint-plugin-promise@~3.6.0: - version "3.6.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-promise/-/eslint-plugin-promise-3.6.0.tgz#54b7658c8f454813dc2a870aff8152ec4969ba75" +eslint-plugin-promise@~4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/eslint-plugin-promise/-/eslint-plugin-promise-4.0.1.tgz#2d074b653f35a23d1ba89d8e976a985117d1c6a2" -eslint-plugin-react@~7.6.1: - version "7.6.1" - resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.6.1.tgz#5d0e908be599f0c02fbf4eef0c7ed6f29dff7633" +eslint-plugin-react@~7.11.1: + version "7.11.1" + resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.11.1.tgz#c01a7af6f17519457d6116aa94fc6d2ccad5443c" dependencies: - doctrine "^2.0.2" - has "^1.0.1" + array-includes "^3.0.3" + doctrine "^2.1.0" + has "^1.0.3" jsx-ast-utils "^2.0.1" - prop-types "^15.6.0" + prop-types "^15.6.2" -eslint-plugin-standard@~3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/eslint-plugin-standard/-/eslint-plugin-standard-3.0.1.tgz#34d0c915b45edc6f010393c7eef3823b08565cf2" +eslint-plugin-standard@~4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-standard/-/eslint-plugin-standard-4.0.0.tgz#f845b45109c99cd90e77796940a344546c8f6b5c" -eslint-scope@^3.7.1: - version "3.7.3" - resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-3.7.3.tgz#bb507200d3d17f60247636160b4826284b108535" +eslint-scope@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-4.0.0.tgz#50bf3071e9338bcdc43331794a0cb533f0136172" dependencies: esrecurse "^4.1.0" estraverse "^4.1.1" +eslint-utils@^1.3.0, eslint-utils@^1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-1.3.1.tgz#9a851ba89ee7c460346f97cf8939c7298827e512" + eslint-visitor-keys@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz#3f3180fb2e291017716acb4c9d6d5b5c34a6a81d" -eslint@~4.18.0: - version "4.18.2" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-4.18.2.tgz#0f81267ad1012e7d2051e186a9004cc2267b8d45" +eslint@~5.4.0: + version "5.4.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-5.4.0.tgz#d068ec03006bb9e06b429dc85f7e46c1b69fac62" dependencies: - ajv "^5.3.0" - babel-code-frame "^6.22.0" + ajv "^6.5.0" + babel-code-frame "^6.26.0" chalk "^2.1.0" - concat-stream "^1.6.0" - cross-spawn "^5.1.0" + cross-spawn "^6.0.5" debug "^3.1.0" doctrine "^2.1.0" - eslint-scope "^3.7.1" + eslint-scope "^4.0.0" + eslint-utils "^1.3.1" eslint-visitor-keys "^1.0.0" - espree "^3.5.2" - esquery "^1.0.0" + espree "^4.0.0" + esquery "^1.0.1" esutils "^2.0.2" file-entry-cache "^2.0.0" functional-red-black-tree "^1.0.1" glob "^7.1.2" - globals "^11.0.1" - ignore "^3.3.3" + globals "^11.7.0" + ignore "^4.0.2" imurmurhash "^0.1.4" - inquirer "^3.0.6" - is-resolvable "^1.0.0" - js-yaml "^3.9.1" + inquirer "^5.2.0" + is-resolvable "^1.1.0" + js-yaml "^3.11.0" json-stable-stringify-without-jsonify "^1.0.1" levn "^0.3.0" - lodash "^4.17.4" - minimatch "^3.0.2" + lodash "^4.17.5" + minimatch "^3.0.4" mkdirp "^0.5.1" natural-compare "^1.4.0" optionator "^0.8.2" path-is-inside "^1.0.2" pluralize "^7.0.0" progress "^2.0.0" + regexpp "^2.0.0" require-uncached "^1.0.3" - semver "^5.3.0" + semver "^5.5.0" strip-ansi "^4.0.0" - strip-json-comments "~2.0.1" - table "4.0.2" - text-table "~0.2.0" + strip-json-comments "^2.0.1" + table "^4.0.3" + text-table "^0.2.0" -espree@^3.5.2: - version "3.5.4" - resolved "https://registry.yarnpkg.com/espree/-/espree-3.5.4.tgz#b0f447187c8a8bed944b815a660bddf5deb5d1a7" +espree@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/espree/-/espree-4.1.0.tgz#728d5451e0fd156c04384a7ad89ed51ff54eb25f" dependencies: - acorn "^5.5.0" - acorn-jsx "^3.0.0" + acorn "^6.0.2" + acorn-jsx "^5.0.0" + eslint-visitor-keys "^1.0.0" esprima@3.x.x, esprima@^3.1.3: version "3.1.3" @@ -1484,9 +1507,9 @@ esprima@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.0.tgz#4499eddcd1110e0b218bacf2fa7f7f59f55ca804" -esquery@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.0.0.tgz#cfba8b57d7fba93f17298a8a006a04cda13d80fa" +esquery@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.0.1.tgz#406c51658b1f5991a5f9b62b1dc25b00e3e5c708" dependencies: estraverse "^4.0.0" @@ -1509,18 +1532,6 @@ etag@~1.8.1: version "1.8.1" resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" -event-stream@~3.3.0: - version "3.3.4" - resolved "https://registry.yarnpkg.com/event-stream/-/event-stream-3.3.4.tgz#4ab4c9a0f5a54db9338b4c34d86bfce8f4b35571" - dependencies: - duplexer "~0.1.1" - from "~0" - map-stream "~0.1.0" - pause-stream "0.0.11" - split "0.3" - stream-combiner "~0.0.4" - through "~2.3.1" - exec-limiter@^3.0.0: version "3.2.9" resolved "https://registry.yarnpkg.com/exec-limiter/-/exec-limiter-3.2.9.tgz#df04761f11f929fa484d5988fa06ec75660bed17" @@ -1552,38 +1563,38 @@ expand-brackets@^2.1.4: snapdragon "^0.8.1" to-regex "^3.0.1" -express@^4.16.2: - version "4.16.2" - resolved "https://registry.yarnpkg.com/express/-/express-4.16.2.tgz#e35c6dfe2d64b7dca0a5cd4f21781be3299e076c" +express@^4.16.4: + version "4.16.4" + resolved "https://registry.yarnpkg.com/express/-/express-4.16.4.tgz#fddef61926109e24c515ea97fd2f1bdbf62df12e" dependencies: - accepts "~1.3.4" + accepts "~1.3.5" array-flatten "1.1.1" - body-parser "1.18.2" + body-parser "1.18.3" content-disposition "0.5.2" content-type "~1.0.4" cookie "0.3.1" cookie-signature "1.0.6" debug "2.6.9" - depd "~1.1.1" - encodeurl "~1.0.1" + depd "~1.1.2" + encodeurl "~1.0.2" escape-html "~1.0.3" etag "~1.8.1" - finalhandler "1.1.0" + finalhandler "1.1.1" fresh "0.5.2" merge-descriptors "1.0.1" methods "~1.1.2" on-finished "~2.3.0" parseurl "~1.3.2" path-to-regexp "0.1.7" - proxy-addr "~2.0.2" - qs "6.5.1" + proxy-addr "~2.0.4" + qs "6.5.2" range-parser "~1.2.0" - safe-buffer "5.1.1" - send "0.16.1" - serve-static "1.13.1" + safe-buffer "5.1.2" + send "0.16.2" + serve-static "1.13.2" setprototypeof "1.1.0" - statuses "~1.3.1" - type-is "~1.6.15" + statuses "~1.4.0" + type-is "~1.6.16" utils-merge "1.0.1" vary "~1.1.2" @@ -1600,13 +1611,17 @@ extend-shallow@^3.0.0, extend-shallow@^3.0.2: assign-symbols "^1.0.0" is-extendable "^1.0.1" -extend@3, extend@~3.0.0, extend@~3.0.1: +extend@3, extend@~3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.1.tgz#a755ea7bc1adfcc5a31ce7e762dbaadc5e636444" -external-editor@^2.0.4: +extend@~3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" + +external-editor@^2.1.0: version "2.2.0" - resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-2.2.0.tgz#045511cfd8d133f3846673d1047c154e214ad3d5" + resolved "http://registry.npmjs.org/external-editor/-/external-editor-2.2.0.tgz#045511cfd8d133f3846673d1047c154e214ad3d5" dependencies: chardet "^0.4.0" iconv-lite "^0.4.17" @@ -1625,13 +1640,13 @@ extglob@^2.0.4: snapdragon "^0.8.1" to-regex "^3.0.1" -extract-zip@^1.6.5: - version "1.6.6" - resolved "https://registry.yarnpkg.com/extract-zip/-/extract-zip-1.6.6.tgz#1290ede8d20d0872b429fd3f351ca128ec5ef85c" +extract-zip@^1.6.6: + version "1.6.7" + resolved "https://registry.yarnpkg.com/extract-zip/-/extract-zip-1.6.7.tgz#a840b4b8af6403264c8db57f4f1a74333ef81fe9" dependencies: - concat-stream "1.6.0" + concat-stream "1.6.2" debug "2.6.9" - mkdirp "0.5.0" + mkdirp "0.5.1" yauzl "2.4.1" extsprintf@1.3.0, extsprintf@^1.2.0: @@ -1642,6 +1657,10 @@ fast-deep-equal@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-1.0.0.tgz#96256a3bc975595eb36d82e9929d060d893439ff" +fast-deep-equal@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz#7b05218ddf9667bf7f370bf7fdb2cb15fdd0aa49" + fast-json-stable-stringify@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz#d5142c0caee6b1189f87d3a76111064f86c8bbf2" @@ -1650,18 +1669,6 @@ fast-levenshtein@~2.0.4: version "2.0.6" resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" -fbjs@^0.8.16: - version "0.8.16" - resolved "https://registry.yarnpkg.com/fbjs/-/fbjs-0.8.16.tgz#5e67432f550dc41b572bf55847b8aca64e5337db" - dependencies: - core-js "^1.0.0" - isomorphic-fetch "^2.1.1" - loose-envify "^1.0.0" - object-assign "^4.1.0" - promise "^7.1.1" - setimmediate "^1.0.5" - ua-parser-js "^0.7.9" - fd-slicer@~1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/fd-slicer/-/fd-slicer-1.0.1.tgz#8b5bcbd9ec327c5041bf9ab023fd6750f1177e65" @@ -1672,6 +1679,10 @@ figgy-pudding@^3.0.0, figgy-pudding@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/figgy-pudding/-/figgy-pudding-3.1.0.tgz#a77ed2284175976c424b390b298569e9df86dd1e" +figgy-pudding@^3.5.1: + version "3.5.1" + resolved "https://registry.yarnpkg.com/figgy-pudding/-/figgy-pudding-3.5.1.tgz#862470112901c727a0e495a80744bd5baa1d6790" + figures@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/figures/-/figures-2.0.0.tgz#3ab1a2d2a62c8bfb431a0c94cb797a2fce27c962" @@ -1698,16 +1709,16 @@ fill-range@^4.0.0: repeat-string "^1.6.1" to-regex-range "^2.1.0" -finalhandler@1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.1.0.tgz#ce0b6855b45853e791b2fcc680046d88253dd7f5" +finalhandler@1.1.1: + version "1.1.1" + resolved "http://registry.npmjs.org/finalhandler/-/finalhandler-1.1.1.tgz#eebf4ed840079c83f4249038c9d703008301b105" dependencies: debug "2.6.9" - encodeurl "~1.0.1" + encodeurl "~1.0.2" escape-html "~1.0.3" on-finished "~2.3.0" parseurl "~1.3.2" - statuses "~1.3.1" + statuses "~1.4.0" unpipe "~1.0.0" find-npm-prefix@^1.0.2: @@ -1747,11 +1758,11 @@ flush-write-stream@^1.0.0: inherits "^2.0.1" readable-stream "^2.0.4" -for-each@~0.3.2: - version "0.3.2" - resolved "https://registry.yarnpkg.com/for-each/-/for-each-0.3.2.tgz#2c40450b9348e97f281322593ba96704b9abd4d4" +for-each@~0.3.3: + version "0.3.3" + resolved "https://registry.yarnpkg.com/for-each/-/for-each-0.3.3.tgz#69b447e88a0a5d32c3e7084f3f1710034b21376e" dependencies: - is-function "~1.0.0" + is-callable "^1.1.3" for-in@^1.0.2: version "1.0.2" @@ -1765,20 +1776,12 @@ forever-agent@~0.6.1: version "0.6.1" resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" -form-data@^2.3.2: - version "2.3.2" - resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.3.2.tgz#4970498be604c20c005d4f5c23aecd21d6b49099" - dependencies: - asynckit "^0.4.0" - combined-stream "1.0.6" - mime-types "^2.1.12" - -form-data@~2.1.1: - version "2.1.4" - resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.1.4.tgz#33c183acf193276ecaa98143a69e94bfee1750d1" +form-data@^2.3.3, form-data@~2.3.2: + version "2.3.3" + resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.3.3.tgz#dcce52c05f644f298c6a7ab936bd724ceffbf3a6" dependencies: asynckit "^0.4.0" - combined-stream "^1.0.5" + combined-stream "^1.0.6" mime-types "^2.1.12" form-data@~2.3.1: @@ -1817,10 +1820,6 @@ from2@^2.1.0: inherits "^2.0.1" readable-stream "^2.0.0" -from@~0: - version "0.1.7" - resolved "https://registry.yarnpkg.com/from/-/from-0.1.7.tgz#83c60afc58b9c56997007ed1a768b3ab303a44fe" - fs-minipass@^1.2.5: version "1.2.5" resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-1.2.5.tgz#06c277218454ec288df77ada54a03b8702aacb9d" @@ -1999,15 +1998,26 @@ glob@^7.0.3, glob@^7.0.5, glob@^7.1.1, glob@^7.1.2, glob@~7.1.2: once "^1.3.0" path-is-absolute "^1.0.0" +glob@^7.1.3: + version "7.1.3" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.3.tgz#3960832d3f1574108342dafd3a67b332c0969df1" + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.0.4" + once "^1.3.0" + path-is-absolute "^1.0.0" + global-dirs@^0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/global-dirs/-/global-dirs-0.1.1.tgz#b319c0dd4607f353f3be9cca4c72fc148c49f445" dependencies: ini "^1.3.4" -globals@^11.0.1: - version "11.7.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-11.7.0.tgz#a583faa43055b1aca771914bf68258e2fc125673" +globals@^11.7.0: + version "11.9.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-11.9.0.tgz#bde236808e987f290768a93d065060d78e6ab249" globby@^5.0.0: version "5.0.0" @@ -2020,9 +2030,9 @@ globby@^5.0.0: pify "^2.0.0" pinkie-promise "^2.0.0" -google-libphonenumber@^3.1.8: - version "3.1.8" - resolved "https://registry.yarnpkg.com/google-libphonenumber/-/google-libphonenumber-3.1.8.tgz#076ecc21e2113371b9d67f6b7dd9ac66db9722cc" +google-libphonenumber@^3.2.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/google-libphonenumber/-/google-libphonenumber-3.2.1.tgz#0395f7099ba05012abad78685955e8ba5cdd6373" got@^5.0.0: version "5.7.1" @@ -2060,13 +2070,13 @@ got@^6.7.1: unzip-response "^2.0.1" url-parse-lax "^1.0.0" -graceful-fs@^4.1.11, graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@~4.1.11: +graceful-fs@^4.1.11, graceful-fs@^4.1.2, graceful-fs@^4.1.6: version "4.1.11" resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.11.tgz#0e8bdfe4d1ddb8854d64e04ea7c00e2a026e5658" -"graceful-readlink@>= 1.0.0": - version "1.0.1" - resolved "https://registry.yarnpkg.com/graceful-readlink/-/graceful-readlink-1.0.1.tgz#4cafad76bc62f02fa039b2f94e9a3dd3a391a725" +graceful-fs@^4.1.15: + version "4.1.15" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.15.tgz#ffb703e1066e8a0eeaa4c8b80ba9253eeefbfb00" gry@^5.0.0: version "5.0.7" @@ -2077,21 +2087,10 @@ gry@^5.0.0: one-by-one "^3.0.0" ul "^5.0.0" -har-schema@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-1.0.5.tgz#d263135f43307c02c602afc8fe95970c0151369e" - har-schema@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-2.0.0.tgz#a94c2224ebcac04782a0d9035521f24735b7ec92" -har-validator@~4.2.1: - version "4.2.1" - resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-4.2.1.tgz#33481d0f1bbff600dd203d75812a6a5fba002e2a" - dependencies: - ajv "^4.9.1" - har-schema "^1.0.5" - har-validator@~5.0.3: version "5.0.3" resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-5.0.3.tgz#ba402c266194f15956ef15e0fcf242993f6a7dfd" @@ -2099,6 +2098,13 @@ har-validator@~5.0.3: ajv "^5.1.0" har-schema "^2.0.0" +har-validator@~5.1.0: + version "5.1.3" + resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-5.1.3.tgz#1ef89ebd3e4996557675eed9893110dc350fa080" + dependencies: + ajv "^6.5.5" + har-schema "^2.0.0" + has-ansi@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91" @@ -2140,20 +2146,17 @@ has-values@^1.0.0: is-number "^3.0.0" kind-of "^4.0.0" -has@^1.0.1, has@~1.0.1: +has@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/has/-/has-1.0.1.tgz#8461733f538b0837c9361e39a9ab9e9704dc2f28" dependencies: function-bind "^1.0.2" -hawk@~3.1.3: - version "3.1.3" - resolved "https://registry.yarnpkg.com/hawk/-/hawk-3.1.3.tgz#078444bd7c1640b0fe540d2c9b73d59678e8e1c4" +has@^1.0.3, has@~1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" dependencies: - boom "2.x.x" - cryptiles "2.x.x" - hoek "2.x.x" - sntp "1.x.x" + function-bind "^1.1.1" hawk@~6.0.2: version "6.0.2" @@ -2164,10 +2167,6 @@ hawk@~6.0.2: hoek "4.x.x" sntp "2.x.x" -hoek@2.x.x: - version "2.16.3" - resolved "https://registry.yarnpkg.com/hoek/-/hoek-2.16.3.tgz#20bb7403d3cea398e91dc4710a8ff1b8274a25ed" - hoek@4.x.x: version "4.2.0" resolved "https://registry.yarnpkg.com/hoek/-/hoek-4.2.0.tgz#72d9d0754f7fe25ca2d01ad8f8f9a9449a89526d" @@ -2180,6 +2179,10 @@ hosted-git-info@^2.6.0: version "2.6.0" resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.6.0.tgz#23235b29ab230c576aab0d4f13fc046b0b038222" +hosted-git-info@^2.7.1: + version "2.7.1" + resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.7.1.tgz#97f236977bd6e125408930ff6de3eec6281ec047" + htmlparser2@^3.9.1: version "3.9.2" resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-3.9.2.tgz#1bdf87acca0f3f9e53fa4fcceb0f4b4cbb00b338" @@ -2204,6 +2207,15 @@ http-errors@1.6.2, http-errors@~1.6.2: setprototypeof "1.0.3" statuses ">= 1.3.1 < 2" +http-errors@1.6.3, http-errors@~1.6.3: + version "1.6.3" + resolved "http://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz#8b55680bb4be283a0b5bf4ea2e38580be1d9320d" + dependencies: + depd "~1.1.2" + inherits "2.0.3" + setprototypeof "1.1.0" + statuses ">= 1.4.0 < 2" + http-proxy-agent@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/http-proxy-agent/-/http-proxy-agent-2.1.0.tgz#e4821beef5b2142a2026bd73926fe537631c5405" @@ -2211,14 +2223,6 @@ http-proxy-agent@^2.1.0: agent-base "4" debug "3.1.0" -http-signature@~1.1.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.1.1.tgz#df72e267066cd0ac67fb76adf8e134a8fbcf91bf" - dependencies: - assert-plus "^0.2.0" - jsprim "^1.2.2" - sshpk "^1.7.0" - http-signature@~1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.2.0.tgz#9aecd925114772f3d95b65a60abb8f7c18fbace1" @@ -2227,7 +2231,7 @@ http-signature@~1.2.0: jsprim "^1.2.2" sshpk "^1.7.0" -https-proxy-agent@^2.1.0, https-proxy-agent@^2.2.0, https-proxy-agent@^2.2.1: +https-proxy-agent@^2.2.0, 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" dependencies: @@ -2244,7 +2248,7 @@ iconv-lite@0.4.19, iconv-lite@~0.4.13: version "0.4.19" resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.19.tgz#f7468f60135f5e5dad3399c0a81be9a1603a082b" -iconv-lite@^0.4.17, iconv-lite@^0.4.4: +iconv-lite@0.4.23, iconv-lite@^0.4.17, iconv-lite@^0.4.4: version "0.4.23" resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.23.tgz#297871f63be507adcfbfca715d0cd0eed84e9a63" dependencies: @@ -2254,7 +2258,7 @@ iferr@^0.1.5: version "0.1.5" resolved "https://registry.yarnpkg.com/iferr/-/iferr-0.1.5.tgz#c60eed69e6d8fdb6b3104a1fcbca1c192dc5b501" -iferr@^1.0.0: +iferr@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/iferr/-/iferr-1.0.2.tgz#e9fde49a9da06dc4a4194c6c9ed6d08305037a6d" @@ -2268,13 +2272,13 @@ ignore-walk@^3.0.1: dependencies: minimatch "^3.0.4" -ignore@^3.0.9: - version "3.3.7" - resolved "https://registry.yarnpkg.com/ignore/-/ignore-3.3.7.tgz#612289bfb3c220e186a58118618d5be8c1bab021" +ignore@^4.0.2: + version "4.0.6" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-4.0.6.tgz#750e3db5862087b4737ebac8207ffd1ef27b25fc" -ignore@^3.3.3, ignore@^3.3.6: - version "3.3.10" - resolved "https://registry.yarnpkg.com/ignore/-/ignore-3.3.10.tgz#0a97fb876986e8081c631160f8f9f389157f0043" +ignore@^5.0.0: + version "5.0.4" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.0.4.tgz#33168af4a21e99b00c5d41cbadb6a6cb49903a45" import-lazy@^2.1.0: version "2.1.0" @@ -2320,21 +2324,20 @@ init-package-json@^1.10.3: validate-npm-package-license "^3.0.1" validate-npm-package-name "^3.0.0" -inquirer@^3.0.6: - version "3.3.0" - resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-3.3.0.tgz#9dd2f2ad765dcab1ff0443b491442a20ba227dc9" +inquirer@^5.2.0: + version "5.2.0" + resolved "http://registry.npmjs.org/inquirer/-/inquirer-5.2.0.tgz#db350c2b73daca77ff1243962e9f22f099685726" dependencies: ansi-escapes "^3.0.0" chalk "^2.0.0" cli-cursor "^2.1.0" cli-width "^2.0.0" - external-editor "^2.0.4" + external-editor "^2.1.0" figures "^2.0.0" lodash "^4.3.0" mute-stream "0.0.7" run-async "^2.2.0" - rx-lite "^4.0.8" - rx-lite-aggregates "^4.0.8" + rxjs "^5.5.2" string-width "^2.1.0" strip-ansi "^4.0.0" through "^2.3.6" @@ -2351,9 +2354,9 @@ ip@^1.1.4, ip@^1.1.5: version "1.1.5" resolved "https://registry.yarnpkg.com/ip/-/ip-1.1.5.tgz#bdded70114290828c0a039e72ef25f5aaec4354a" -ipaddr.js@1.5.2: - version "1.5.2" - resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.5.2.tgz#d4b505bde9946987ccf0fc58d9010ff9607e3fa0" +ipaddr.js@1.8.0: + version "1.8.0" + resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.8.0.tgz#eaa33d6ddd7ace8f7f6fe0c9ca0440e706738b1e" is-accessor-descriptor@^0.1.6: version "0.1.6" @@ -2473,10 +2476,6 @@ is-fullwidth-code-point@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" -is-function@~1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-function/-/is-function-1.0.1.tgz#12cfb98b65b57dd3d193a3121f5f6e2f437602b5" - is-glob@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-3.1.0.tgz#7ba5ae24217804ac70707b96922567486cc3e84a" @@ -2546,11 +2545,9 @@ is-regex@^1.0.3, is-regex@^1.0.4: dependencies: has "^1.0.1" -is-resolvable@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-resolvable/-/is-resolvable-1.0.0.tgz#8df57c61ea2e3c501408d100fb013cf8d6e0cc62" - dependencies: - tryit "^1.0.1" +is-resolvable@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-resolvable/-/is-resolvable-1.1.0.tgz#fb18f87ce1feb925169c9a407c19318a3206ed88" is-retry-allowed@^1.0.0: version "1.1.0" @@ -2562,7 +2559,7 @@ is-ssh@^1.0.0, is-ssh@^1.3.0: dependencies: protocols "^1.1.0" -is-stream@^1.0.0, is-stream@^1.0.1, is-stream@^1.1.0: +is-stream@^1.0.0, is-stream@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" @@ -2600,13 +2597,6 @@ isobject@^3.0.0, isobject@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" -isomorphic-fetch@^2.1.1: - version "2.2.1" - resolved "https://registry.yarnpkg.com/isomorphic-fetch/-/isomorphic-fetch-2.2.1.tgz#611ae1acf14f5e81f729507472819fe9733558a9" - dependencies: - node-fetch "^1.0.1" - whatwg-fetch ">=0.10.0" - isstream@~0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" @@ -2623,7 +2613,7 @@ js-tokens@^3.0.0, js-tokens@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.2.tgz#9866df395102130e38f7f996bceb65443209c25b" -js-yaml@^3.9.1: +js-yaml@^3.11.0: version "3.12.0" resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.12.0.tgz#eaed656ec8344f10f527c6bfa1b6e2244de167d1" dependencies: @@ -2646,6 +2636,10 @@ json-schema-traverse@^0.3.0: version "0.3.1" resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz#349a6d44c53a51de89b40805c5d5e59b417d3340" +json-schema-traverse@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" + json-schema@0.2.3: version "0.2.3" resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13" @@ -2654,20 +2648,10 @@ json-stable-stringify-without-jsonify@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" -json-stable-stringify@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz#9a759d39c5f2ff503fd5300646ed445f88c4f9af" - dependencies: - jsonify "~0.0.0" - json-stringify-safe@~5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" -jsonify@~0.0.0: - version "0.0.0" - resolved "https://registry.yarnpkg.com/jsonify/-/jsonify-0.0.0.tgz#2c74b6ee41d93ca51b7b5aaee8f503631d252a73" - jsonparse@^1.2.0: version "1.3.1" resolved "https://registry.yarnpkg.com/jsonparse/-/jsonparse-1.3.1.tgz#3f4dae4a91fac315f71062f8521cc239f1366280" @@ -2745,15 +2729,16 @@ levn@^0.3.0, levn@~0.3.0: prelude-ls "~1.1.2" type-check "~0.3.2" -libcipm@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/libcipm/-/libcipm-2.0.0.tgz#577cdedcb2bfb1e9170a191e2045b757722beb65" +libcipm@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/libcipm/-/libcipm-2.0.2.tgz#4f38c2b37acf2ec156936cef1cbf74636568fc7b" dependencies: bin-links "^1.1.2" bluebird "^3.5.1" find-npm-prefix "^1.0.2" graceful-fs "^4.1.11" lock-verify "^2.0.2" + mkdirp "^0.5.1" npm-lifecycle "^2.0.3" npm-logical-tree "^1.2.1" npm-package-arg "^6.1.0" @@ -2798,9 +2783,9 @@ load-json-file@^2.0.0: pify "^2.0.0" strip-bom "^3.0.0" -load-json-file@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-5.0.0.tgz#5b5ef7cb6e1e337408e02fe01fe679ccc0cd18d5" +load-json-file@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-5.1.0.tgz#c062f048e0ee556bf7f535bb16f6e45bb9d06b18" dependencies: graceful-fs "^4.1.2" parse-json "^4.0.0" @@ -2868,17 +2853,13 @@ lodash.clonedeep@^4.5.0, lodash.clonedeep@~4.5.0: version "4.5.0" resolved "https://registry.yarnpkg.com/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz#e23f3f9c4f8fbdde872529c1071857a086e5ccef" -lodash.cond@^4.3.0: - version "4.5.2" - resolved "https://registry.yarnpkg.com/lodash.cond/-/lodash.cond-4.5.2.tgz#f471a1da486be60f6ab955d17115523dd1d255d5" - lodash.debounce@^4.0.8: version "4.0.8" resolved "https://registry.yarnpkg.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af" -lodash.merge@^4.6.0: - version "4.6.0" - resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.0.tgz#69884ba144ac33fe699737a6086deffadd0f89c5" +lodash.merge@^4.6.1: + version "4.6.1" + resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.1.tgz#adc25d9cb99b9391c59624f379fbba60d7111d54" lodash.restparam@*: version "3.6.1" @@ -2908,7 +2889,7 @@ longest@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/longest/-/longest-1.0.1.tgz#30a0b2da38f73770e8294a0d22e6625ed77d0097" -loose-envify@^1.0.0, loose-envify@^1.1.0, loose-envify@^1.3.1: +loose-envify@^1.1.0, loose-envify@^1.3.1: version "1.3.1" resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.3.1.tgz#d1a8ad33fa9ce0e713d65fdd0ac8b748d478c848" dependencies: @@ -2932,19 +2913,25 @@ lru-cache@^4.1.2, lru-cache@^4.1.3: pseudomap "^1.0.2" yallist "^2.1.2" -mailgun-js@^0.20.0: - version "0.20.0" - resolved "https://registry.yarnpkg.com/mailgun-js/-/mailgun-js-0.20.0.tgz#ebec0f9da3408388e9d74e12008d9633b982f6d7" +lru-cache@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920" + dependencies: + yallist "^3.0.2" + +mailgun-js@^0.22.0: + version "0.22.0" + resolved "https://registry.yarnpkg.com/mailgun-js/-/mailgun-js-0.22.0.tgz#128942b5e47a364a470791608852bf68c96b3a05" dependencies: async "^2.6.1" - debug "~3.1.0" - form-data "^2.3.2" + debug "^4.1.0" + form-data "^2.3.3" inflection "~1.12.0" is-stream "^1.1.0" path-proxy "~1.0.0" promisify-call "^2.0.2" - proxy-agent "~3.0.0" - tsscmp "~1.0.0" + proxy-agent "^3.0.3" + tsscmp "^1.0.6" make-dir@^1.0.0: version "1.2.0" @@ -2988,10 +2975,6 @@ map-cache@^0.2.2: version "0.2.2" resolved "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf" -map-stream@~0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/map-stream/-/map-stream-0.1.0.tgz#e56aa94c4c8055a16404a0674b78f215f7c8e194" - map-visit@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/map-visit/-/map-visit-1.0.0.tgz#ecdca8f13144e660f1b5bd41f12f3479d98dfb8f" @@ -3042,19 +3025,29 @@ mime-db@~1.30.0: version "1.30.0" resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.30.0.tgz#74c643da2dd9d6a45399963465b26d5ca7d71f01" -mime-types@^2.1.12, mime-types@~2.1.15, mime-types@~2.1.16, mime-types@~2.1.17, mime-types@~2.1.7: +mime-db@~1.37.0: + version "1.37.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.37.0.tgz#0b6a0ce6fdbe9576e25f1f2d2fde8830dc0ad0d8" + +mime-types@^2.1.12, mime-types@~2.1.17: version "2.1.17" resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.17.tgz#09d7a393f03e995a79f8af857b70a9e0ab16557a" dependencies: mime-db "~1.30.0" +mime-types@~2.1.18, mime-types@~2.1.19: + version "2.1.21" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.21.tgz#28995aa1ecb770742fe6ae7e58f9181c744b3f96" + dependencies: + mime-db "~1.37.0" + mime@1.4.1: version "1.4.1" resolved "https://registry.yarnpkg.com/mime/-/mime-1.4.1.tgz#121f9ebc49e3766f311a76e1fa1c8003c4b03aa6" -mime@^1.3.4: - version "1.6.0" - resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" +mime@^2.0.3: + version "2.4.0" + resolved "https://registry.yarnpkg.com/mime/-/mime-2.4.0.tgz#e051fd881358585f3279df333fe694da0bcffdd6" mimic-fn@^1.0.0: version "1.2.0" @@ -3088,12 +3081,25 @@ minipass@^2.3.3: safe-buffer "^5.1.2" yallist "^3.0.0" +minipass@^2.3.4: + version "2.3.5" + resolved "https://registry.yarnpkg.com/minipass/-/minipass-2.3.5.tgz#cacebe492022497f656b0f0f51e2682a9ed2d848" + dependencies: + safe-buffer "^5.1.2" + yallist "^3.0.0" + minizlib@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-1.1.0.tgz#11e13658ce46bc3a70a267aac58359d1e0c29ceb" dependencies: minipass "^2.2.1" +minizlib@^1.1.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-1.2.1.tgz#dd27ea6136243c7c880684e8672bb3a45fd9b614" + dependencies: + minipass "^2.2.1" + mississippi@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/mississippi/-/mississippi-2.0.0.tgz#3442a508fafc28500486feea99409676e4ee5a6f" @@ -3131,13 +3137,7 @@ mixin-deep@^1.2.0: for-in "^1.0.2" is-extendable "^1.0.1" -mkdirp@0.5.0: - version "0.5.0" - resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.0.tgz#1d73076a6df986cd9344e15e71fcc05a4c9abf12" - dependencies: - minimist "0.0.8" - -"mkdirp@>=0.5 0", mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@~0.5.0, mkdirp@~0.5.1: +mkdirp@0.5.1, "mkdirp@>=0.5 0", mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@~0.5.0, mkdirp@~0.5.1: version "0.5.1" resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" dependencies: @@ -3162,7 +3162,7 @@ ms@2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" -ms@^2.0.0: +ms@^2.0.0, ms@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.1.tgz#30a5864eb3ebb0a66f2ebe6d727af06a09d86e0a" @@ -3174,6 +3174,10 @@ nan@^2.9.2: version "2.10.0" resolved "https://registry.yarnpkg.com/nan/-/nan-2.10.0.tgz#96d0cd610ebd58d4b4de9cc0c6828cda99c7548f" +nanoid@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-2.0.0.tgz#e1ab4a4b024a38d15531ba34a712a201540de639" + nanomatch@^1.2.9: version "1.2.13" resolved "https://registry.yarnpkg.com/nanomatch/-/nanomatch-1.2.13.tgz#b87a8aa4fc0de8fe6be88895b38983ff265bd119" @@ -3210,6 +3214,10 @@ netmask@^1.0.6: version "1.0.6" resolved "https://registry.yarnpkg.com/netmask/-/netmask-1.0.6.tgz#20297e89d86f6f6400f250d9f4f6b4c1945fcd35" +nice-try@^1.0.4: + version "1.0.5" + resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366" + node-fetch-npm@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/node-fetch-npm/-/node-fetch-npm-2.0.2.tgz#7258c9046182dca345b4208eda918daf33697ff7" @@ -3218,13 +3226,6 @@ node-fetch-npm@^2.0.2: json-parse-better-errors "^1.0.0" safe-buffer "^5.1.1" -node-fetch@^1.0.1: - version "1.7.3" - resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-1.7.3.tgz#980f6f72d85211a5347c6b2bc18c5b84c3eb47ef" - dependencies: - encoding "^0.1.11" - is-stream "^1.0.1" - node-gyp@^3.6.2: version "3.6.2" resolved "https://registry.yarnpkg.com/node-gyp/-/node-gyp-3.6.2.tgz#9bfbe54562286284838e750eac05295853fa1c60" @@ -3243,9 +3244,9 @@ node-gyp@^3.6.2: tar "^2.0.0" which "1" -node-gyp@^3.7.0: - version "3.7.0" - resolved "https://registry.yarnpkg.com/node-gyp/-/node-gyp-3.7.0.tgz#789478e8f6c45e277aa014f3e28f958f286f9203" +node-gyp@^3.8.0: + version "3.8.0" + resolved "https://registry.yarnpkg.com/node-gyp/-/node-gyp-3.8.0.tgz#540304261c330e80d0d5edce253a68cb3964218c" dependencies: fstream "^1.0.0" glob "^7.0.3" @@ -3254,7 +3255,7 @@ node-gyp@^3.7.0: nopt "2 || 3" npmlog "0 || 1 || 2 || 3 || 4" osenv "0" - request ">=2.9.0 <2.82.0" + request "^2.87.0" rimraf "2" semver "~5.3.0" tar "^2.0.0" @@ -3279,20 +3280,20 @@ node-status-codes@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/node-status-codes/-/node-status-codes-1.0.0.tgz#5ae5541d024645d32a58fcddc9ceecea7ae3ac2f" -nodemon@1.18.2: - version "1.18.2" - resolved "https://registry.yarnpkg.com/nodemon/-/nodemon-1.18.2.tgz#36b89c790da70c4f270e2cc0718723131bc04abb" +nodemon@1.18.9: + version "1.18.9" + resolved "https://registry.yarnpkg.com/nodemon/-/nodemon-1.18.9.tgz#90b467efd3b3c81b9453380aeb2a2cba535d0ead" dependencies: - chokidar "^2.0.2" + chokidar "^2.0.4" debug "^3.1.0" ignore-by-default "^1.0.1" minimatch "^3.0.4" - pstree.remy "^1.1.0" + pstree.remy "^1.1.6" semver "^5.5.0" supports-color "^5.2.0" touch "^3.1.0" undefsafe "^2.0.2" - update-notifier "^2.3.0" + update-notifier "^2.5.0" noop6@^1.0.1: version "1.0.7" @@ -3366,6 +3367,19 @@ npm-lifecycle@^2.0.3: umask "^1.1.0" which "^1.3.0" +npm-lifecycle@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/npm-lifecycle/-/npm-lifecycle-2.1.0.tgz#1eda2eedb82db929e3a0c50341ab0aad140ed569" + dependencies: + byline "^5.0.0" + graceful-fs "^4.1.11" + node-gyp "^3.8.0" + resolve-from "^4.0.0" + slide "^1.1.6" + uid-number "0.0.6" + umask "^1.1.0" + which "^1.3.1" + npm-logical-tree@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/npm-logical-tree/-/npm-logical-tree-1.2.1.tgz#44610141ca24664cad35d1e607176193fd8f5b88" @@ -3379,13 +3393,20 @@ npm-logical-tree@^1.2.1: semver "^5.5.0" validate-npm-package-name "^3.0.0" -npm-packlist@^1.1.10, npm-packlist@^1.1.6, npm-packlist@~1.1.10: +npm-packlist@^1.1.10, npm-packlist@^1.1.6: version "1.1.10" resolved "https://registry.yarnpkg.com/npm-packlist/-/npm-packlist-1.1.10.tgz#1039db9e985727e464df066f4cf0ab6ef85c398a" dependencies: ignore-walk "^3.0.1" npm-bundled "^1.0.1" +npm-packlist@^1.1.12: + version "1.1.12" + resolved "https://registry.yarnpkg.com/npm-packlist/-/npm-packlist-1.1.12.tgz#22bde2ebc12e72ca482abd67afc51eb49377243a" + dependencies: + ignore-walk "^3.0.1" + npm-bundled "^1.0.1" + npm-pick-manifest@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/npm-pick-manifest/-/npm-pick-manifest-2.1.0.tgz#dc381bdd670c35d81655e1d5a94aa3dd4d87fce5" @@ -3400,9 +3421,9 @@ npm-profile@^3.0.2: aproba "^1.1.2 || 2" make-fetch-happen "^2.5.0 || 3 || 4" -npm-registry-client@^8.5.1: - version "8.5.1" - resolved "https://registry.yarnpkg.com/npm-registry-client/-/npm-registry-client-8.5.1.tgz#8115809c0a4b40938b8a109b8ea74d26c6f5d7f1" +npm-registry-client@^8.6.0: + version "8.6.0" + resolved "https://registry.yarnpkg.com/npm-registry-client/-/npm-registry-client-8.6.0.tgz#7f1529f91450732e89f8518e0f21459deea3e4c4" dependencies: concat-stream "^1.5.2" graceful-fs "^4.1.6" @@ -3449,41 +3470,42 @@ npm-user-validate@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/npm-user-validate/-/npm-user-validate-1.0.0.tgz#8ceca0f5cea04d4e93519ef72d0557a75122e951" -npm@^6.2.0: - version "6.2.0" - resolved "https://registry.yarnpkg.com/npm/-/npm-6.2.0.tgz#2cee4b52825a91f531cd324a3b0f6e105be40c16" +npm@^6.5.0: + version "6.5.0" + resolved "https://registry.yarnpkg.com/npm/-/npm-6.5.0.tgz#30ed48d4cd4d17d68ee04a5fcf9fa2ca9167d819" dependencies: - JSONStream "^1.3.3" + JSONStream "^1.3.4" abbrev "~1.1.1" ansicolors "~0.3.2" ansistyles "~0.1.3" aproba "~1.2.0" archy "~1.0.0" bin-links "^1.1.2" - bluebird "~3.5.1" + bluebird "^3.5.3" byte-size "^4.0.3" - cacache "^11.0.2" + cacache "^11.2.0" call-limit "~1.1.0" chownr "~1.0.1" + ci-info "^1.6.0" cli-columns "^3.1.2" cli-table3 "^0.5.0" cmd-shim "~2.0.2" columnify "~1.5.4" - config-chain "~1.1.11" + config-chain "^1.1.12" detect-indent "~5.0.0" detect-newline "^2.1.0" dezalgo "~1.0.3" editor "~1.0.0" - figgy-pudding "^3.1.0" + figgy-pudding "^3.5.1" find-npm-prefix "^1.0.2" fs-vacuum "~1.2.10" fs-write-stream-atomic "~1.0.10" gentle-fs "^2.0.1" - glob "~7.1.2" - graceful-fs "~4.1.11" + glob "^7.1.3" + graceful-fs "^4.1.15" has-unicode "~2.0.1" - hosted-git-info "^2.6.0" - iferr "^1.0.0" + hosted-git-info "^2.7.1" + iferr "^1.0.2" inflight "~1.0.6" inherits "~2.0.3" ini "^1.3.5" @@ -3491,7 +3513,7 @@ npm@^6.2.0: is-cidr "^2.0.6" json-parse-better-errors "^1.0.2" lazy-property "~1.0.0" - libcipm "^2.0.0" + libcipm "^2.0.2" libnpmhook "^4.0.1" libnpx "^10.2.0" lock-verify "^2.0.2" @@ -3506,23 +3528,23 @@ npm@^6.2.0: mississippi "^3.0.0" mkdirp "~0.5.1" move-concurrently "^1.0.1" - node-gyp "^3.7.0" + node-gyp "^3.8.0" nopt "~4.0.1" normalize-package-data "~2.4.0" npm-audit-report "^1.3.1" npm-cache-filename "~1.0.2" npm-install-checks "~3.0.0" - npm-lifecycle "^2.0.3" + npm-lifecycle "^2.1.0" npm-package-arg "^6.1.0" - npm-packlist "~1.1.10" + npm-packlist "^1.1.12" npm-pick-manifest "^2.1.0" npm-profile "^3.0.2" - npm-registry-client "^8.5.1" + npm-registry-client "^8.6.0" npm-registry-fetch "^1.1.0" npm-user-validate "~1.0.0" npmlog "~4.1.2" once "~1.4.0" - opener "~1.4.3" + opener "^1.5.1" osenv "^0.1.5" pacote "^8.1.6" path-is-inside "~1.0.2" @@ -3536,17 +3558,18 @@ npm@^6.2.0: read-package-json "^2.0.13" read-package-tree "^5.2.1" readable-stream "^2.3.6" - request "^2.81.0" + request "^2.88.0" retry "^0.12.0" rimraf "~2.6.2" safe-buffer "^5.1.2" - semver "^5.5.0" + semver "^5.5.1" sha "~2.0.1" slide "~1.1.6" sorted-object "~2.0.1" sorted-union-stream "~2.1.3" - ssri "^6.0.0" - tar "^4.4.4" + ssri "^6.0.1" + stringify-package "^1.0.0" + tar "^4.4.8" text-table "~0.2.0" tiny-relative-date "^1.3.0" uid-number "0.0.6" @@ -3555,11 +3578,10 @@ npm@^6.2.0: unpipe "~1.0.0" update-notifier "^2.5.0" uuid "^3.3.2" - validate-npm-package-license "^3.0.3" + validate-npm-package-license "^3.0.4" validate-npm-package-name "~3.0.0" which "^1.3.1" worker-farm "^1.6.0" - wrappy "~1.0.2" write-file-atomic "^2.3.0" "npmlog@0 || 1 || 2 || 3 || 4", "npmlog@2 || ^3.1.0 || ^4.0.0", npmlog@^4.0.2, npmlog@~4.1.2: @@ -3588,10 +3610,14 @@ oargv@^3.4.1: iterate-object "^1.1.0" ul "^5.0.0" -oauth-sign@~0.8.1, oauth-sign@~0.8.2: +oauth-sign@~0.8.2: version "0.8.2" resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.8.2.tgz#46a6ab7f0aead8deae9ec0565780b7d4efeb9d43" +oauth-sign@~0.9.0: + version "0.9.0" + resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.9.0.tgz#47a7b016baa68b5fa0ecf3dee08a85c679ac6455" + obj-def@^1.0.0: version "1.0.6" resolved "https://registry.yarnpkg.com/obj-def/-/obj-def-1.0.6.tgz#7754e1728849c2f934d1fdd2be72fe627ecb5b14" @@ -3610,9 +3636,9 @@ object-copy@^0.1.0: define-property "^0.2.5" kind-of "^3.0.3" -object-inspect@~1.5.0: - version "1.5.0" - resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.5.0.tgz#9d876c11e40f485c79215670281b767488f9bfe3" +object-inspect@~1.6.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.6.0.tgz#c70b6cbf72f274aab4c34c0c82f5167bf82cf15b" object-keys@^1.0.8: version "1.0.11" @@ -3659,9 +3685,9 @@ onetime@^2.0.0: dependencies: mimic-fn "^1.0.0" -opener@~1.4.3: - version "1.4.3" - resolved "https://registry.yarnpkg.com/opener/-/opener-1.4.3.tgz#5c6da2c5d7e5831e8ffa3964950f8d6674ac90b8" +opener@^1.5.1: + version "1.5.1" + resolved "https://registry.yarnpkg.com/opener/-/opener-1.5.1.tgz#6d2f0e77f1a0af0032aca716c2c1fbb8e7e8abed" optionator@^0.8.1, optionator@^0.8.2: version "0.8.2" @@ -3718,9 +3744,9 @@ p-locate@^2.0.0: dependencies: p-limit "^1.1.0" -pac-proxy-agent@^2.0.1: - version "2.0.2" - resolved "https://registry.yarnpkg.com/pac-proxy-agent/-/pac-proxy-agent-2.0.2.tgz#90d9f6730ab0f4d2607dcdcd4d3d641aa26c3896" +pac-proxy-agent@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/pac-proxy-agent/-/pac-proxy-agent-3.0.0.tgz#11d578b72a164ad74bf9d5bac9ff462a38282432" dependencies: agent-base "^4.2.0" debug "^3.1.0" @@ -3729,7 +3755,7 @@ pac-proxy-agent@^2.0.1: https-proxy-agent "^2.2.1" pac-resolver "^3.0.0" raw-body "^2.2.0" - socks-proxy-agent "^3.0.0" + socks-proxy-agent "^4.0.1" pac-resolver@^3.0.0: version "3.0.0" @@ -3867,7 +3893,7 @@ path-is-inside@^1.0.1, path-is-inside@^1.0.2, path-is-inside@~1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/path-is-inside/-/path-is-inside-1.0.2.tgz#365417dede44430d1c11af61027facf074bdfc53" -path-key@^2.0.0: +path-key@^2.0.0, path-key@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" @@ -3875,6 +3901,10 @@ path-parse@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.5.tgz#3c1adf871ea9cd6c9431b6ea2bd74a0ff055c4c1" +path-parse@^1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.6.tgz#d62dbb5679405d72c4737ec58600e9ddcf06d24c" + path-proxy@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/path-proxy/-/path-proxy-1.0.0.tgz#18e8a36859fc9d2f1a53b48dee138543c020de5e" @@ -3891,20 +3921,10 @@ path-type@^2.0.0: dependencies: pify "^2.0.0" -pause-stream@0.0.11: - version "0.0.11" - resolved "https://registry.yarnpkg.com/pause-stream/-/pause-stream-0.0.11.tgz#fe5a34b0cbce12b5aa6a2b403ee2e73b602f1445" - dependencies: - through "~2.3" - pend@~1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/pend/-/pend-1.2.0.tgz#7a57eb550a6783f9115331fcf4663d5c8e007a50" -performance-now@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-0.2.0.tgz#33ef30c5c77d4ea21c5a53869d91b56d8f2555e5" - performance-now@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" @@ -3948,9 +3968,9 @@ pkg-dir@^1.0.0: dependencies: find-up "^1.0.0" -plivo@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/plivo/-/plivo-4.0.1.tgz#913261cdc146f3f72ce05c8942100831e5100881" +plivo@^4.0.5: + version "4.0.5" + resolved "https://registry.yarnpkg.com/plivo/-/plivo-4.0.5.tgz#5c58a9e567b985a9325be77ec2b1965eda81c36f" dependencies: base-64 "^0.1.0" build-url "^1.0.10" @@ -3989,13 +4009,17 @@ progress@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.0.tgz#8a1be366bf8fc23db2bd23f10c6fe920b4389d1f" +progress@^2.0.1: + version "2.0.3" + resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.3.tgz#7e8cf8d8f5b8f239c1bc68beb4eb78567d572ef8" + promise-inflight@^1.0.1, promise-inflight@~1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/promise-inflight/-/promise-inflight-1.0.1.tgz#98472870bf228132fcbdd868129bad12c3c029e3" -promise-queue@^2.2.3: - version "2.2.3" - resolved "https://registry.yarnpkg.com/promise-queue/-/promise-queue-2.2.3.tgz#8534d76bf4673c3baa3a82bba01bd295cc30f14f" +promise-queue@^2.2.5: + version "2.2.5" + resolved "https://registry.yarnpkg.com/promise-queue/-/promise-queue-2.2.5.tgz#2f6f5f7c0f6d08109e967659c79b88a9ed5e93b4" promise-retry@^1.1.1: version "1.1.1" @@ -4004,7 +4028,7 @@ promise-retry@^1.1.1: err-code "^1.0.0" retry "^0.10.0" -promise@^7.0.1, promise@^7.1.1: +promise@^7.0.1: version "7.3.1" resolved "https://registry.yarnpkg.com/promise/-/promise-7.3.1.tgz#064b72602b18f90f29192b8b1bc418ffd1ebd3bf" dependencies: @@ -4022,7 +4046,7 @@ promzard@^0.3.0: dependencies: read "1" -prop-types@^15.6.0: +prop-types@^15.5.8, prop-types@^15.6.2: version "15.6.2" resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.6.2.tgz#05d5ca77b4453e985d60fc7ff8c859094a497102" dependencies: @@ -4043,23 +4067,23 @@ protoduck@^5.0.0: dependencies: genfun "^4.0.1" -proxy-addr@~2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.2.tgz#6571504f47bb988ec8180253f85dd7e14952bdec" +proxy-addr@~2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.4.tgz#ecfc733bf22ff8c6f407fa275327b9ab67e48b93" dependencies: forwarded "~0.1.2" - ipaddr.js "1.5.2" + ipaddr.js "1.8.0" -proxy-agent@~3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/proxy-agent/-/proxy-agent-3.0.1.tgz#4fb7b61b1476d0fe8e3a3384d90e2460bbded3f9" +proxy-agent@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/proxy-agent/-/proxy-agent-3.0.3.tgz#1c1a33db60ef5f2e9e35b876fd63c2bc681c611d" dependencies: agent-base "^4.2.0" debug "^3.1.0" http-proxy-agent "^2.1.0" https-proxy-agent "^2.2.1" lru-cache "^4.1.2" - pac-proxy-agent "^2.0.1" + pac-proxy-agent "^3.0.0" proxy-from-env "^1.0.0" socks-proxy-agent "^4.0.1" @@ -4071,40 +4095,36 @@ prr@~1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/prr/-/prr-1.0.1.tgz#d3fc114ba06995a45ec6893f484ceb1d78f5f476" -ps-tree@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/ps-tree/-/ps-tree-1.1.0.tgz#b421b24140d6203f1ed3c76996b4427b08e8c014" - dependencies: - event-stream "~3.3.0" - pseudomap@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3" -pstree.remy@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/pstree.remy/-/pstree.remy-1.1.0.tgz#f2af27265bd3e5b32bbfcc10e80bac55ba78688b" - dependencies: - ps-tree "^1.1.0" +psl@^1.1.24: + version "1.1.31" + resolved "https://registry.yarnpkg.com/psl/-/psl-1.1.31.tgz#e9aa86d0101b5b105cbe93ac6b784cd547276184" -pug-attrs@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/pug-attrs/-/pug-attrs-2.0.2.tgz#8be2b2225568ffa75d1b866982bff9f4111affcb" +pstree.remy@^1.1.6: + version "1.1.6" + resolved "https://registry.yarnpkg.com/pstree.remy/-/pstree.remy-1.1.6.tgz#73a55aad9e2d95814927131fbf4dc1b62d259f47" + +pug-attrs@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/pug-attrs/-/pug-attrs-2.0.3.tgz#a3095f970e64151f7bdad957eef55fb5d7905d15" dependencies: constantinople "^3.0.1" js-stringify "^1.0.1" - pug-runtime "^2.0.3" + pug-runtime "^2.0.4" -pug-code-gen@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/pug-code-gen/-/pug-code-gen-2.0.0.tgz#96aea39a9e62f1ec5d2b6a5b42a29d528c70b43d" +pug-code-gen@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/pug-code-gen/-/pug-code-gen-2.0.1.tgz#0951ec83225d74d8cfc476a7f99a259b5f7d050c" dependencies: constantinople "^3.0.1" doctypes "^1.1.0" js-stringify "^1.0.1" - pug-attrs "^2.0.2" + pug-attrs "^2.0.3" pug-error "^1.3.2" - pug-runtime "^2.0.3" + pug-runtime "^2.0.4" void-elements "^2.0.1" with "^5.0.0" @@ -4112,73 +4132,73 @@ pug-error@^1.3.2: version "1.3.2" resolved "https://registry.yarnpkg.com/pug-error/-/pug-error-1.3.2.tgz#53ae7d9d29bb03cf564493a026109f54c47f5f26" -pug-filters@^2.1.5: - version "2.1.5" - resolved "https://registry.yarnpkg.com/pug-filters/-/pug-filters-2.1.5.tgz#66bf6e80d97fbef829bab0aa35eddff33fc964f3" +pug-filters@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/pug-filters/-/pug-filters-3.1.0.tgz#27165555bc04c236e4aa2b0366246dfa021b626e" dependencies: - clean-css "^3.3.0" + clean-css "^4.1.11" constantinople "^3.0.1" jstransformer "1.0.0" pug-error "^1.3.2" - pug-walk "^1.1.5" + pug-walk "^1.1.7" resolve "^1.1.6" uglify-js "^2.6.1" -pug-lexer@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/pug-lexer/-/pug-lexer-3.1.0.tgz#fd087376d4a675b4f59f8fef422883434e9581a2" +pug-lexer@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/pug-lexer/-/pug-lexer-4.0.0.tgz#210c18457ef2e1760242740c5e647bd794cec278" dependencies: character-parser "^2.1.1" is-expression "^3.0.0" pug-error "^1.3.2" -pug-linker@^3.0.3: - version "3.0.3" - resolved "https://registry.yarnpkg.com/pug-linker/-/pug-linker-3.0.3.tgz#25f59eb750237f0368e59c3379764229c0189c41" +pug-linker@^3.0.5: + version "3.0.5" + resolved "https://registry.yarnpkg.com/pug-linker/-/pug-linker-3.0.5.tgz#9e9a7ae4005682d027deeb96b000f88eeb83a02f" dependencies: pug-error "^1.3.2" - pug-walk "^1.1.5" + pug-walk "^1.1.7" -pug-load@^2.0.9: - version "2.0.9" - resolved "https://registry.yarnpkg.com/pug-load/-/pug-load-2.0.9.tgz#ee217c914cc1d9324d44b86c32d1df241d36de7a" +pug-load@^2.0.11: + version "2.0.11" + resolved "https://registry.yarnpkg.com/pug-load/-/pug-load-2.0.11.tgz#e648e57ed113fe2c1f45d57858ea2bad6bc01527" dependencies: object-assign "^4.1.0" - pug-walk "^1.1.5" + pug-walk "^1.1.7" -pug-parser@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/pug-parser/-/pug-parser-4.0.0.tgz#c9f52322e4eabe4bf5beeba64ed18373bb627801" +pug-parser@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/pug-parser/-/pug-parser-5.0.0.tgz#e394ad9b3fca93123940aff885c06e44ab7e68e4" dependencies: pug-error "^1.3.2" token-stream "0.0.1" -pug-runtime@^2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/pug-runtime/-/pug-runtime-2.0.3.tgz#98162607b0fce9e254d427f33987a5aee7168bda" +pug-runtime@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/pug-runtime/-/pug-runtime-2.0.4.tgz#e178e1bda68ab2e8c0acfc9bced2c54fd88ceb58" -pug-strip-comments@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/pug-strip-comments/-/pug-strip-comments-1.0.2.tgz#d313afa01bcc374980e1399e23ebf2eb9bdc8513" +pug-strip-comments@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/pug-strip-comments/-/pug-strip-comments-1.0.3.tgz#f1559592206edc6f85310dacf4afb48a025af59f" dependencies: pug-error "^1.3.2" -pug-walk@^1.1.5: - version "1.1.5" - resolved "https://registry.yarnpkg.com/pug-walk/-/pug-walk-1.1.5.tgz#90e943acbcf7021e6454cf1b32245891cba6f851" +pug-walk@^1.1.7: + version "1.1.7" + resolved "https://registry.yarnpkg.com/pug-walk/-/pug-walk-1.1.7.tgz#c00d5c5128bac5806bec15d2b7e7cdabe42531f3" -pug@^2.0.0-rc.4: - version "2.0.0-rc.4" - resolved "https://registry.yarnpkg.com/pug/-/pug-2.0.0-rc.4.tgz#b7b08f6599bd5302568042b7436984fb28c80a13" +pug@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/pug/-/pug-2.0.3.tgz#71cba82537c95a5eab7ed04696e4221f53aa878e" dependencies: - pug-code-gen "^2.0.0" - pug-filters "^2.1.5" - pug-lexer "^3.1.0" - pug-linker "^3.0.3" - pug-load "^2.0.9" - pug-parser "^4.0.0" - pug-runtime "^2.0.3" - pug-strip-comments "^1.0.2" + pug-code-gen "^2.0.1" + pug-filters "^3.1.0" + pug-lexer "^4.0.0" + pug-linker "^3.0.5" + pug-load "^2.0.11" + pug-parser "^5.0.0" + pug-runtime "^2.0.4" + pug-strip-comments "^1.0.3" pump@^2.0.0, pump@^2.0.1: version "2.0.1" @@ -4206,31 +4226,35 @@ punycode@^1.4.1: version "1.4.1" resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" -puppeteer@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/puppeteer/-/puppeteer-1.3.0.tgz#f571c5f27153ca164a8188e6328ce2e4946878f3" +punycode@^2.1.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" + +puppeteer@^1.11.0: + version "1.11.0" + resolved "https://registry.yarnpkg.com/puppeteer/-/puppeteer-1.11.0.tgz#63cdbe12b07275cd6e0b94bce41f3fcb20305770" dependencies: - debug "^2.6.8" - extract-zip "^1.6.5" - https-proxy-agent "^2.1.0" - mime "^1.3.4" - progress "^2.0.0" + debug "^4.1.0" + extract-zip "^1.6.6" + https-proxy-agent "^2.2.1" + mime "^2.0.3" + progress "^2.0.1" proxy-from-env "^1.0.0" rimraf "^2.6.1" - ws "^3.0.0" + ws "^6.1.0" qrcode-terminal@^0.12.0: version "0.12.0" resolved "https://registry.yarnpkg.com/qrcode-terminal/-/qrcode-terminal-0.12.0.tgz#bb5b699ef7f9f0505092a3748be4464fe71b5819" -qs@6.5.1, qs@~6.5.1: +qs@6.5.2, qs@~6.5.2: + version "6.5.2" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.2.tgz#cb3ae806e8740444584ef154ce8ee98d403f3e36" + +qs@~6.5.1: version "6.5.1" resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.1.tgz#349cdf6eef89ec45c12d7d5eb3fc0c870343a6d8" -qs@~6.4.0: - version "6.4.0" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.4.0.tgz#13e26d28ad6b0ffaa91312cd3bf708ed351e7233" - query-string@^6.1.0: version "6.1.0" resolved "https://registry.yarnpkg.com/query-string/-/query-string-6.1.0.tgz#01e7d69f6a0940dac67a937d6c6325647aa4532a" @@ -4261,7 +4285,16 @@ range-parser@~1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.0.tgz#f49be6b487894ddc40dcc94a322f611092e00d5e" -raw-body@2.3.2, raw-body@^2.2.0: +raw-body@2.3.3: + version "2.3.3" + resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.3.3.tgz#1b324ece6b5706e153855bc1148c65bb7f6ea0c3" + dependencies: + bytes "3.0.0" + http-errors "1.6.3" + iconv-lite "0.4.23" + unpipe "1.0.0" + +raw-body@^2.2.0: version "2.3.2" resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.3.2.tgz#bcd60c77d3eb93cde0050295c3f379389bc88f89" dependencies: @@ -4288,27 +4321,27 @@ rc@^1.2.7: minimist "^1.2.0" strip-json-comments "~2.0.1" -react-dom@^16.4.1: - version "16.4.1" - resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-16.4.1.tgz#7f8b0223b3a5fbe205116c56deb85de32685dad6" +react-dom@^16.7.0: + version "16.7.0" + resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-16.7.0.tgz#a17b2a7ca89ee7390bc1ed5eb81783c7461748b8" dependencies: - fbjs "^0.8.16" loose-envify "^1.1.0" object-assign "^4.1.1" - prop-types "^15.6.0" + prop-types "^15.6.2" + scheduler "^0.12.0" react-fast-compare@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/react-fast-compare/-/react-fast-compare-2.0.1.tgz#92c91ac4814aa8cfcfb04780ad1bfff2bbe3a3c6" -react@^16.4.1: - version "16.4.1" - resolved "https://registry.yarnpkg.com/react/-/react-16.4.1.tgz#de51ba5764b5dbcd1f9079037b862bd26b82fe32" +react@^16.7.0: + version "16.7.0" + resolved "https://registry.yarnpkg.com/react/-/react-16.7.0.tgz#b674ec396b0a5715873b350446f7ea0802ab6381" dependencies: - fbjs "^0.8.16" loose-envify "^1.1.0" object-assign "^4.1.1" - prop-types "^15.6.0" + prop-types "^15.6.2" + scheduler "^0.12.0" read-all-stream@^3.0.0: version "3.1.0" @@ -4437,11 +4470,11 @@ redis-parser@^2.6.0: version "2.6.0" resolved "https://registry.yarnpkg.com/redis-parser/-/redis-parser-2.6.0.tgz#52ed09dacac108f1a631c07e9b69941e7a19504b" -redis-server@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/redis-server/-/redis-server-1.1.0.tgz#4d8001d8f726abe966b2f7f5dce39c623ef72385" +redis-server@^1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/redis-server/-/redis-server-1.2.2.tgz#d0415b549ee06256248bf728b407ddf19999818a" dependencies: - promise-queue "^2.2.3" + promise-queue "^2.2.5" redis@^2.8.0: version "2.8.0" @@ -4458,6 +4491,10 @@ regex-not@^1.0.0, regex-not@^1.0.2: extend-shallow "^3.0.2" safe-regex "^1.1.0" +regexpp@^2.0.0, regexpp@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-2.0.1.tgz#8d19d31cf632482b589049f8281f93dbcba4d07f" + registry-auth-token@^3.0.1: version "3.3.1" resolved "https://registry.yarnpkg.com/registry-auth-token/-/registry-auth-token-3.3.1.tgz#fb0d3289ee0d9ada2cbb52af5dfe66cb070d3006" @@ -4510,33 +4547,6 @@ request@2, request@^2.74.0: tunnel-agent "^0.6.0" uuid "^3.1.0" -"request@>=2.9.0 <2.82.0": - version "2.81.0" - resolved "https://registry.yarnpkg.com/request/-/request-2.81.0.tgz#c6928946a0e06c5f8d6f8a9333469ffda46298a0" - dependencies: - aws-sign2 "~0.6.0" - aws4 "^1.2.1" - caseless "~0.12.0" - combined-stream "~1.0.5" - extend "~3.0.0" - forever-agent "~0.6.1" - form-data "~2.1.1" - har-validator "~4.2.1" - hawk "~3.1.3" - http-signature "~1.1.0" - is-typedarray "~1.0.0" - isstream "~0.1.2" - json-stringify-safe "~5.0.1" - mime-types "~2.1.7" - oauth-sign "~0.8.1" - performance-now "^0.2.0" - qs "~6.4.0" - safe-buffer "^5.0.1" - stringstream "~0.0.4" - tough-cookie "~2.3.0" - tunnel-agent "^0.6.0" - uuid "^3.0.0" - request@^2.81.0: version "2.87.0" resolved "https://registry.yarnpkg.com/request/-/request-2.87.0.tgz#32f00235cd08d482b4d0d68db93a829c0ed5756e" @@ -4562,6 +4572,31 @@ request@^2.81.0: tunnel-agent "^0.6.0" uuid "^3.1.0" +request@^2.87.0, request@^2.88.0: + version "2.88.0" + resolved "https://registry.yarnpkg.com/request/-/request-2.88.0.tgz#9c2fca4f7d35b592efe57c7f0a55e81052124fef" + dependencies: + aws-sign2 "~0.7.0" + aws4 "^1.8.0" + caseless "~0.12.0" + combined-stream "~1.0.6" + extend "~3.0.2" + forever-agent "~0.6.1" + form-data "~2.3.2" + har-validator "~5.1.0" + http-signature "~1.2.0" + is-typedarray "~1.0.0" + isstream "~0.1.2" + json-stringify-safe "~5.0.1" + mime-types "~2.1.19" + oauth-sign "~0.9.0" + performance-now "^2.1.0" + qs "~6.5.2" + safe-buffer "^5.1.2" + tough-cookie "~2.4.3" + tunnel-agent "^0.6.0" + uuid "^3.3.2" + require-directory@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" @@ -4589,18 +4624,30 @@ resolve-url@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a" -resolve@^1.1.6, resolve@~1.5.0: +resolve@^1.1.6: version "1.5.0" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.5.0.tgz#1f09acce796c9a762579f31b2c1cc4c3cddf9f36" dependencies: path-parse "^1.0.5" -resolve@^1.3.3, resolve@^1.5.0: +resolve@^1.5.0: version "1.8.1" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.8.1.tgz#82f1ec19a423ac1fbd080b0bab06ba36e84a7a26" dependencies: path-parse "^1.0.5" +resolve@^1.6.0, resolve@^1.8.1: + version "1.9.0" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.9.0.tgz#a14c6fdfa8f92a7df1d996cb7105fa744658ea06" + dependencies: + path-parse "^1.0.6" + +resolve@~1.7.1: + version "1.7.1" + resolved "http://registry.npmjs.org/resolve/-/resolve-1.7.1.tgz#aadd656374fd298aee895bc026b8297418677fd3" + dependencies: + path-parse "^1.0.5" + restore-cursor@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-2.0.0.tgz#9f7ee287f82fd326d4fd162923d62129eee0dfaf" @@ -4654,21 +4701,17 @@ run-queue@^1.0.0, run-queue@^1.0.3: dependencies: aproba "^1.1.1" -rx-lite-aggregates@^4.0.8: - version "4.0.8" - resolved "https://registry.yarnpkg.com/rx-lite-aggregates/-/rx-lite-aggregates-4.0.8.tgz#753b87a89a11c95467c4ac1626c4efc4e05c67be" +rxjs@^5.5.2: + version "5.5.12" + resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-5.5.12.tgz#6fa61b8a77c3d793dbaf270bee2f43f652d741cc" dependencies: - rx-lite "*" - -rx-lite@*, rx-lite@^4.0.8: - version "4.0.8" - resolved "https://registry.yarnpkg.com/rx-lite/-/rx-lite-4.0.8.tgz#0b1e11af8bc44836f04a6407e92da42467b79444" + symbol-observable "1.0.1" safe-buffer@5.1.1, safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@~5.1.0, safe-buffer@~5.1.1: version "5.1.1" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.1.tgz#893312af69b2123def71f57889001671eeb2c853" -safe-buffer@^5.1.2: +safe-buffer@5.1.2, safe-buffer@^5.1.2: version "5.1.2" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" @@ -4686,24 +4729,31 @@ sax@^1.2.4: version "1.2.4" resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" +scheduler@^0.12.0: + version "0.12.0" + resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.12.0.tgz#8ab17699939c0aedc5a196a657743c496538647b" + dependencies: + loose-envify "^1.1.0" + object-assign "^4.1.1" + semaphore-async-await@^1.5.1: version "1.5.1" resolved "https://registry.yarnpkg.com/semaphore-async-await/-/semaphore-async-await-1.5.1.tgz#857bef5e3644601ca4b9570b87e9df5ca12974fa" -semistandard@12.0.1: - version "12.0.1" - resolved "https://registry.yarnpkg.com/semistandard/-/semistandard-12.0.1.tgz#82190c720b01cf68e3051e0985578f0b1d596683" - dependencies: - eslint "~4.18.0" - eslint-config-semistandard "12.0.1" - eslint-config-standard "11.0.0" - eslint-config-standard-jsx "5.0.0" - eslint-plugin-import "~2.8.0" - eslint-plugin-node "~6.0.0" - eslint-plugin-promise "~3.6.0" - eslint-plugin-react "~7.6.1" - eslint-plugin-standard "~3.0.1" - standard-engine "~8.0.0" +semistandard@13.0.1: + version "13.0.1" + resolved "https://registry.yarnpkg.com/semistandard/-/semistandard-13.0.1.tgz#73389486821e89ce26ec8d5350b9f15ab467ab26" + dependencies: + eslint "~5.4.0" + eslint-config-semistandard "13.0.0" + eslint-config-standard "12.0.0" + eslint-config-standard-jsx "6.0.2" + eslint-plugin-import "~2.14.0" + eslint-plugin-node "~7.0.1" + eslint-plugin-promise "~4.0.0" + eslint-plugin-react "~7.11.1" + eslint-plugin-standard "~4.0.0" + standard-engine "~10.0.0" semver-diff@^2.0.0: version "2.1.0" @@ -4719,18 +4769,22 @@ semver-diff@^2.0.0: version "5.4.1" resolved "https://registry.yarnpkg.com/semver/-/semver-5.4.1.tgz#e059c09d8571f0540823733433505d3a2f00b18e" +semver@^5.5.1: + version "5.6.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.6.0.tgz#7e74256fbaa49c75aa7c7a205cc22799cac80004" + semver@~5.3.0: version "5.3.0" resolved "https://registry.yarnpkg.com/semver/-/semver-5.3.0.tgz#9b2ce5d3de02d17c6012ad326aa6b4d0cf54f94f" -send@0.16.1: - version "0.16.1" - resolved "https://registry.yarnpkg.com/send/-/send-0.16.1.tgz#a70e1ca21d1382c11d0d9f6231deb281080d7ab3" +send@0.16.2: + version "0.16.2" + resolved "https://registry.yarnpkg.com/send/-/send-0.16.2.tgz#6ecca1e0f8c156d141597559848df64730a6bbc1" dependencies: debug "2.6.9" - depd "~1.1.1" + depd "~1.1.2" destroy "~1.0.4" - encodeurl "~1.0.1" + encodeurl "~1.0.2" escape-html "~1.0.3" etag "~1.8.1" fresh "0.5.2" @@ -4739,16 +4793,16 @@ send@0.16.1: ms "2.0.0" on-finished "~2.3.0" range-parser "~1.2.0" - statuses "~1.3.1" + statuses "~1.4.0" -serve-static@1.13.1: - version "1.13.1" - resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.13.1.tgz#4c57d53404a761d8f2e7c1e8a18a47dbf278a719" +serve-static@1.13.2: + version "1.13.2" + resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.13.2.tgz#095e8472fd5b46237db50ce486a43f4b86c6cec1" dependencies: - encodeurl "~1.0.1" + encodeurl "~1.0.2" escape-html "~1.0.3" parseurl "~1.3.2" - send "0.16.1" + send "0.16.2" set-blocking@^2.0.0, set-blocking@~2.0.0: version "2.0.0" @@ -4776,10 +4830,6 @@ set-value@^2.0.0: is-plain-object "^2.0.3" split-string "^3.0.1" -setimmediate@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285" - setprototypeof@1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.0.3.tgz#66567e37043eeb4f04d91bd658c0cbefb55b8e04" @@ -4805,9 +4855,11 @@ shebang-regex@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" -shortid@^2.2.8: - version "2.2.8" - resolved "https://registry.yarnpkg.com/shortid/-/shortid-2.2.8.tgz#033b117d6a2e975804f6f0969dbe7d3d0b355131" +shortid@^2.2.14: + version "2.2.14" + resolved "https://registry.yarnpkg.com/shortid/-/shortid-2.2.14.tgz#80db6aafcbc3e3a46850b3c88d39e051b84c8d18" + dependencies: + nanoid "^2.0.0" signal-exit@^3.0.0, signal-exit@^3.0.2: version "3.0.2" @@ -4866,19 +4918,13 @@ snapdragon@^0.8.1: source-map-resolve "^0.5.0" use "^3.1.0" -sntp@1.x.x: - version "1.0.9" - resolved "https://registry.yarnpkg.com/sntp/-/sntp-1.0.9.tgz#6541184cc90aeea6c6e7b35e2659082443c66198" - dependencies: - hoek "2.x.x" - sntp@2.x.x: version "2.1.0" resolved "https://registry.yarnpkg.com/sntp/-/sntp-2.1.0.tgz#2c6cec14fedc2222739caf9b5c3d85d1cc5a2cc8" dependencies: hoek "4.x.x" -socks-proxy-agent@^3.0.0, socks-proxy-agent@^3.0.1: +socks-proxy-agent@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/socks-proxy-agent/-/socks-proxy-agent-3.0.1.tgz#2eae7cf8e2a82d34565761539a7f9718c5617659" dependencies: @@ -4931,16 +4977,14 @@ source-map-url@^0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.4.0.tgz#3e935d7ddd73631b97659956d55128e87b5084a3" -source-map@0.4.x: - version "0.4.4" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.4.4.tgz#eba4f5da9c0dc999de68032d8b4f76173652036b" - dependencies: - amdefine ">=0.0.4" - source-map@^0.5.6, source-map@~0.5.1, source-map@~0.5.6: version "0.5.7" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" +source-map@~0.6.0: + version "0.6.1" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" + spdx-correct@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.0.0.tgz#05a5b4d7153a195bc92c3c425b69f3b2a9524c82" @@ -4983,12 +5027,6 @@ split-string@^3.0.1, split-string@^3.0.2: dependencies: extend-shallow "^3.0.0" -split@0.3: - version "0.3.3" - resolved "https://registry.yarnpkg.com/split/-/split-0.3.3.tgz#cd0eea5e63a211dfff7eb0f091c4133e2d0dd28f" - dependencies: - through "2" - sprintf-js@~1.0.2: version "1.0.3" resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" @@ -5017,11 +5055,17 @@ ssri@^6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/ssri/-/ssri-6.0.0.tgz#fc21bfc90e03275ac3e23d5a42e38b8a1cbc130d" -standard-engine@~8.0.0: - version "8.0.1" - resolved "https://registry.yarnpkg.com/standard-engine/-/standard-engine-8.0.1.tgz#0b77be8d7ab963675717dbeac1ef1d6675fb62f0" +ssri@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/ssri/-/ssri-6.0.1.tgz#2a3c41b28dd45b62b63676ecb74001265ae9edd8" + dependencies: + figgy-pudding "^3.5.1" + +standard-engine@~10.0.0: + version "10.0.0" + resolved "https://registry.yarnpkg.com/standard-engine/-/standard-engine-10.0.0.tgz#6859075130f0c677f6a9ee05869f3e8d18bb45ea" dependencies: - deglob "^2.1.0" + deglob "^3.0.0" get-stdin "^6.0.0" minimist "^1.1.0" pkg-conf "^2.0.0" @@ -5033,19 +5077,13 @@ static-extend@^0.1.1: define-property "^0.2.5" object-copy "^0.1.0" -"statuses@>= 1.3.1 < 2": +"statuses@>= 1.3.1 < 2", statuses@~1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.4.0.tgz#bb73d446da2796106efcc1b601a253d6c46bd087" -statuses@~1.3.1: - version "1.3.1" - resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.3.1.tgz#faf51b9eb74aaef3b3acf4ad5f61abf24cb7b93e" - -stream-combiner@~0.0.4: - version "0.0.4" - resolved "https://registry.yarnpkg.com/stream-combiner/-/stream-combiner-0.0.4.tgz#4d5e433c185261dde623ca3f44c586bcf5c4ad14" - dependencies: - duplexer "~0.1.1" +"statuses@>= 1.4.0 < 2": + version "1.5.0" + resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" stream-each@^1.1.0: version "1.2.2" @@ -5108,7 +5146,11 @@ string_decoder@~1.1.1: dependencies: safe-buffer "~5.1.0" -stringstream@~0.0.4, stringstream@~0.0.5: +stringify-package@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/stringify-package/-/stringify-package-1.0.0.tgz#e02828089333d7d45cd8c287c30aa9a13375081b" + +stringstream@~0.0.5: version "0.0.5" resolved "https://registry.yarnpkg.com/stringstream/-/stringstream-0.0.5.tgz#4e484cd4de5a0bbbee18e46307710a8a81621878" @@ -5132,7 +5174,7 @@ strip-eof@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf" -strip-json-comments@~2.0.1: +strip-json-comments@^2.0.1, strip-json-comments@~2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" @@ -5152,31 +5194,35 @@ supports-color@^5.3.0: dependencies: has-flag "^3.0.0" -table@4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/table/-/table-4.0.2.tgz#a33447375391e766ad34d3486e6e2aedc84d2e36" +symbol-observable@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/symbol-observable/-/symbol-observable-1.0.1.tgz#8340fc4702c3122df5d22288f88283f513d3fdd4" + +table@^4.0.3: + version "4.0.3" + resolved "http://registry.npmjs.org/table/-/table-4.0.3.tgz#00b5e2b602f1794b9acaf9ca908a76386a7813bc" dependencies: - ajv "^5.2.3" - ajv-keywords "^2.1.0" + ajv "^6.0.1" + ajv-keywords "^3.0.0" chalk "^2.1.0" lodash "^4.17.4" slice-ansi "1.0.0" string-width "^2.1.1" -tape@^4.8.0: - version "4.9.0" - resolved "https://registry.yarnpkg.com/tape/-/tape-4.9.0.tgz#855c08360395133709d34d3fbf9ef341eb73ca6a" +tape@^4.9.1: + version "4.9.1" + resolved "https://registry.yarnpkg.com/tape/-/tape-4.9.1.tgz#1173d7337e040c76fbf42ec86fcabedc9b3805c9" dependencies: deep-equal "~1.0.1" defined "~1.0.0" - for-each "~0.3.2" + for-each "~0.3.3" function-bind "~1.1.1" glob "~7.1.2" - has "~1.0.1" + has "~1.0.3" inherits "~2.0.3" minimist "~1.2.0" - object-inspect "~1.5.0" - resolve "~1.5.0" + object-inspect "~1.6.0" + resolve "~1.7.1" resumer "~0.0.0" string.prototype.trim "~1.1.2" through "~2.3.8" @@ -5189,7 +5235,7 @@ tar@^2.0.0: fstream "^1.0.2" inherits "2" -tar@^4, tar@^4.4.3, tar@^4.4.4: +tar@^4, tar@^4.4.3: version "4.4.4" resolved "https://registry.yarnpkg.com/tar/-/tar-4.4.4.tgz#ec8409fae9f665a4355cc3b4087d0820232bb8cd" dependencies: @@ -5201,13 +5247,25 @@ tar@^4, tar@^4.4.3, tar@^4.4.4: safe-buffer "^5.1.2" yallist "^3.0.2" +tar@^4.4.8: + version "4.4.8" + resolved "https://registry.yarnpkg.com/tar/-/tar-4.4.8.tgz#b19eec3fde2a96e64666df9fdb40c5ca1bc3747d" + dependencies: + chownr "^1.1.1" + fs-minipass "^1.2.5" + minipass "^2.3.4" + minizlib "^1.1.1" + mkdirp "^0.5.0" + safe-buffer "^5.1.2" + yallist "^3.0.2" + term-size@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/term-size/-/term-size-1.2.0.tgz#458b83887f288fc56d6fffbfad262e26638efa69" dependencies: execa "^0.7.0" -text-table@~0.2.0: +text-table@^0.2.0, text-table@~0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" @@ -5218,7 +5276,7 @@ through2@^2.0.0: readable-stream "^2.1.5" xtend "~4.0.1" -through@2, "through@>=2.2.7 <3", through@^2.3.6, through@~2.3, through@~2.3.1, through@~2.3.4, through@~2.3.8: +"through@>=2.2.7 <3", through@^2.3.6, through@~2.3.4, through@~2.3.8: version "2.3.8" resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" @@ -5282,19 +5340,22 @@ touch@^3.1.0: dependencies: nopt "~1.0.10" -tough-cookie@~2.3.0, tough-cookie@~2.3.3: +tough-cookie@~2.3.3: version "2.3.3" resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.3.3.tgz#0b618a5565b6dea90bf3425d04d55edc475a7561" dependencies: punycode "^1.4.1" -tryit@^1.0.1: - version "1.0.3" - resolved "https://registry.yarnpkg.com/tryit/-/tryit-1.0.3.tgz#393be730a9446fd1ead6da59a014308f36c289cb" +tough-cookie@~2.4.3: + version "2.4.3" + resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.4.3.tgz#53f36da3f47783b0925afa06ff9f3b165280f781" + dependencies: + psl "^1.1.24" + punycode "^1.4.1" -tsscmp@~1.0.0: - version "1.0.5" - resolved "https://registry.yarnpkg.com/tsscmp/-/tsscmp-1.0.5.tgz#7dc4a33af71581ab4337da91d85ca5427ebd9a97" +tsscmp@^1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/tsscmp/-/tsscmp-1.0.6.tgz#85b99583ac3589ec4bfef825b5000aa911d605eb" tunnel-agent@^0.6.0: version "0.6.0" @@ -5312,12 +5373,12 @@ type-check@~0.3.2: dependencies: prelude-ls "~1.1.2" -type-is@~1.6.15: - version "1.6.15" - resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.15.tgz#cab10fb4909e441c82842eafe1ad646c81804410" +type-is@~1.6.16: + version "1.6.16" + resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.16.tgz#f89ce341541c672b25ee7ae3c73dee3b2be50194" dependencies: media-typer "0.3.0" - mime-types "~2.1.15" + mime-types "~2.1.18" typedarray@^0.0.6: version "0.0.6" @@ -5329,10 +5390,6 @@ typpy@^2.0.0, typpy@^2.1.0, typpy@^2.2.0, typpy@^2.3.4: dependencies: function.name "^1.0.3" -ua-parser-js@^0.7.9: - version "0.7.17" - resolved "https://registry.yarnpkg.com/ua-parser-js/-/ua-parser-js-0.7.17.tgz#e9ec5f9498b9ec910e7ae3ac626a805c4d09ecac" - uglify-js@^2.6.1: version "2.8.29" resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-2.8.29.tgz#29c5733148057bb4e1f75df35b7a9cb72e6a59dd" @@ -5357,10 +5414,6 @@ ul@^5.0.0: deffy "^2.2.2" typpy "^2.3.4" -ultron@~1.1.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/ultron/-/ultron-1.1.1.tgz#9fe1536a10a664a65266a1e3ccf85fd36302bc9c" - umask@^1.1.0, umask@~1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/umask/-/umask-1.1.0.tgz#f29cebf01df517912bb58ff9c4e50fde8e33320d" @@ -5390,6 +5443,12 @@ unique-filename@^1.1.0, unique-filename@~1.1.0: dependencies: unique-slug "^2.0.0" +unique-filename@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/unique-filename/-/unique-filename-1.1.1.tgz#1d69769369ada0583103a1e6ae87681b56573230" + dependencies: + unique-slug "^2.0.0" + unique-slug@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/unique-slug/-/unique-slug-2.0.0.tgz#db6676e7c7cc0629878ff196097c78855ae9f4ab" @@ -5455,6 +5514,12 @@ update-notifier@^2.5.0: semver-diff "^2.0.0" xdg-basedir "^3.0.0" +uri-js@^4.2.2: + version "4.2.2" + resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.2.2.tgz#94c540e1ff772956e2299507c010aea6c8838eb0" + dependencies: + punycode "^2.1.0" + uri-parser@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/uri-parser/-/uri-parser-1.0.1.tgz#3307ebb50f279c11198ad09214bdaf24e29735b2" @@ -5489,7 +5554,7 @@ utils-merge@1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" -uuid@^3.0.0, uuid@^3.1.0: +uuid@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.1.0.tgz#3dd3d3e790abc24d7b0d3a034ffababe28ebbc04" @@ -5504,9 +5569,9 @@ validate-npm-package-license@^3.0.1: spdx-correct "~1.0.0" spdx-expression-parse "~1.0.0" -validate-npm-package-license@^3.0.3: - version "3.0.3" - resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.3.tgz#81643bcbef1bdfecd4623793dc4648948ba98338" +validate-npm-package-license@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz#fc91f6b9c7ba15c857f4cb2c5defeec39d4f410a" dependencies: spdx-correct "^3.0.0" spdx-expression-parse "^3.0.0" @@ -5529,18 +5594,80 @@ verror@1.10.0: core-util-is "1.0.2" extsprintf "^1.2.0" -victory-chart@^27.1.0: - version "27.1.1" - resolved "https://registry.yarnpkg.com/victory-chart/-/victory-chart-27.1.1.tgz#db7337c0dba1353d6a08e7116df1988edea785b0" +victory-area@^31.0.2: + version "31.0.2" + resolved "https://registry.yarnpkg.com/victory-area/-/victory-area-31.0.2.tgz#0cefd08a8dcfdff380170e204ff7bdad1c8b649b" + dependencies: + d3-shape "^1.2.0" + lodash "^4.17.5" + prop-types "^15.5.8" + victory-core "^31.0.2" + +victory-axis@^31.0.2: + version "31.0.2" + resolved "https://registry.yarnpkg.com/victory-axis/-/victory-axis-31.0.2.tgz#7644cf4ad9d4a364f2b7cf2aeaffe76dbfe82026" + dependencies: + lodash "^4.17.5" + prop-types "^15.5.8" + victory-core "^31.0.2" + +victory-bar@^31.0.2: + version "31.0.2" + resolved "https://registry.yarnpkg.com/victory-bar/-/victory-bar-31.0.2.tgz#14c499603950dc1694ad37389349d391c7dd4501" + dependencies: + d3-shape "^1.2.0" + lodash "^4.17.5" + prop-types "^15.5.8" + victory-core "^31.0.2" + +victory-box-plot@^31.0.2: + version "31.0.2" + resolved "https://registry.yarnpkg.com/victory-box-plot/-/victory-box-plot-31.0.2.tgz#e0db9391b2a01d2cbb1eda5cb293b289beed2f88" + dependencies: + d3-array "^1.2.0" + lodash "^4.17.5" + prop-types "^15.5.8" + victory-core "^31.0.2" + +victory-brush-container@^31.0.2: + version "31.0.2" + resolved "https://registry.yarnpkg.com/victory-brush-container/-/victory-brush-container-31.0.2.tgz#c0d53a5a19976b03bd1213e6b09d546a0a1bd947" dependencies: - d3-voronoi "^1.1.2" lodash "^4.17.5" + prop-types "^15.5.8" + victory-core "^31.0.2" + +victory-brush-line@^31.0.2: + version "31.0.2" + resolved "https://registry.yarnpkg.com/victory-brush-line/-/victory-brush-line-31.0.2.tgz#ce0917e0e17b5d0a5cab4a152aa13aa833d3a87a" + dependencies: + lodash "^4.17.5" + prop-types "^15.5.8" + victory-core "^31.0.2" + +victory-candlestick@^31.0.2: + version "31.0.2" + resolved "https://registry.yarnpkg.com/victory-candlestick/-/victory-candlestick-31.0.2.tgz#a6c2bc696d8c80ede6220f9bb57545d4531b3953" + dependencies: + lodash "^4.17.5" + prop-types "^15.5.8" + victory-core "^31.0.2" + +victory-chart@^31.0.2: + version "31.0.2" + resolved "https://registry.yarnpkg.com/victory-chart/-/victory-chart-31.0.2.tgz#8a3c1bb21f6dc98eb03d46114d932b21914769ef" + dependencies: + lodash "^4.17.5" + prop-types "^15.5.8" react-fast-compare "^2.0.0" - victory-core "^24.0.0" + victory-axis "^31.0.2" + victory-core "^31.0.2" + victory-polar-axis "^31.0.2" + victory-shared-events "^31.0.2" -victory-core@^24.0.0: - version "24.0.1" - resolved "https://registry.yarnpkg.com/victory-core/-/victory-core-24.0.1.tgz#a0b377821fe62be8dfcb0d7c35a628fee4e16616" +victory-core@^31.0.2: + version "31.0.2" + resolved "https://registry.yarnpkg.com/victory-core/-/victory-core-31.0.2.tgz#b85145120ce203712b0da49a9991798cb97f4a86" dependencies: d3-ease "^1.0.0" d3-interpolate "^1.1.1" @@ -5548,23 +5675,175 @@ victory-core@^24.0.0: d3-shape "^1.2.0" d3-timer "^1.0.0" lodash "^4.17.5" + prop-types "^15.5.8" react-fast-compare "^2.0.0" -victory-pie@^16.1.0: - version "16.1.0" - resolved "https://registry.yarnpkg.com/victory-pie/-/victory-pie-16.1.0.tgz#12216935bef911c427f3316c80b15b9ca6563252" +victory-create-container@^31.0.2: + version "31.0.2" + resolved "https://registry.yarnpkg.com/victory-create-container/-/victory-create-container-31.0.2.tgz#947bc6666d0eacf70f33ca7279291e39f74c8ef1" + dependencies: + lodash "^4.17.5" + victory-brush-container "^31.0.2" + victory-core "^31.0.2" + victory-cursor-container "^31.0.2" + victory-selection-container "^31.0.2" + victory-voronoi-container "^31.0.2" + victory-zoom-container "^31.0.2" + +victory-cursor-container@^31.0.2: + version "31.0.2" + resolved "https://registry.yarnpkg.com/victory-cursor-container/-/victory-cursor-container-31.0.2.tgz#0cc795cfeec2ab82f5ad2304b7fd680ce50cdfb0" + dependencies: + lodash "^4.17.5" + prop-types "^15.5.8" + victory-core "^31.0.2" + +victory-errorbar@^31.0.2: + version "31.0.2" + resolved "https://registry.yarnpkg.com/victory-errorbar/-/victory-errorbar-31.0.2.tgz#cc0ccc2677879b13cb439c98eac61e5982bbe934" + dependencies: + lodash "^4.17.5" + prop-types "^15.5.8" + victory-core "^31.0.2" + +victory-group@^31.0.2: + version "31.0.2" + resolved "https://registry.yarnpkg.com/victory-group/-/victory-group-31.0.2.tgz#0712eaceeb2bb2bf0405c880bedc67dd133b3a8f" + dependencies: + lodash "^4.17.5" + prop-types "^15.5.8" + victory-core "^31.0.2" + +victory-legend@^31.0.2: + version "31.0.2" + resolved "https://registry.yarnpkg.com/victory-legend/-/victory-legend-31.0.2.tgz#462152113cc69579ee2f93ea683d3915c403f7f4" + dependencies: + lodash "^4.17.5" + prop-types "^15.5.8" + victory-core "^31.0.2" + +victory-line@^31.0.2: + version "31.0.2" + resolved "https://registry.yarnpkg.com/victory-line/-/victory-line-31.0.2.tgz#6ff06da7d6e7704cb7877e24f81a8f944ac81d25" + dependencies: + d3-shape "^1.2.0" + lodash "^4.17.5" + prop-types "^15.5.8" + victory-core "^31.0.2" + +victory-pie@^31.0.2: + version "31.0.2" + resolved "https://registry.yarnpkg.com/victory-pie/-/victory-pie-31.0.2.tgz#70fb74692234c9dcdfc615be940c45779b5bf0fd" dependencies: d3-shape "^1.0.0" lodash "^4.17.5" - victory-core "^24.0.0" + prop-types "^15.5.8" + victory-core "^31.0.2" + +victory-polar-axis@^31.0.2: + version "31.0.2" + resolved "https://registry.yarnpkg.com/victory-polar-axis/-/victory-polar-axis-31.0.2.tgz#7158d0bc64d97fa70d8d5e3b94321b38941b2cf7" + dependencies: + lodash "^4.17.5" + prop-types "^15.5.8" + victory-core "^31.0.2" + +victory-scatter@^31.0.2: + version "31.0.2" + resolved "https://registry.yarnpkg.com/victory-scatter/-/victory-scatter-31.0.2.tgz#ef6b84517d408e04e5ff69caf575a760111ce0b5" + dependencies: + lodash "^4.17.5" + prop-types "^15.5.8" + victory-core "^31.0.2" + +victory-selection-container@^31.0.2: + version "31.0.2" + resolved "https://registry.yarnpkg.com/victory-selection-container/-/victory-selection-container-31.0.2.tgz#89e0a97eeb5ce6274b227a4d651c7ac13eee08d5" + dependencies: + lodash "^4.17.5" + prop-types "^15.5.8" + victory-core "^31.0.2" -victory@^0.27.2: - version "0.27.2" - resolved "https://registry.yarnpkg.com/victory/-/victory-0.27.2.tgz#1e6cdef88b29466befea194f26788549befa0ea3" +victory-shared-events@^31.0.2: + version "31.0.2" + resolved "https://registry.yarnpkg.com/victory-shared-events/-/victory-shared-events-31.0.2.tgz#f88a99f6f3d6560afd7ab9db6cd34df9099b952a" dependencies: - victory-chart "^27.1.0" - victory-core "^24.0.0" - victory-pie "^16.1.0" + lodash "^4.17.5" + prop-types "^15.5.8" + victory-core "^31.0.2" + +victory-stack@^31.0.2: + version "31.0.2" + resolved "https://registry.yarnpkg.com/victory-stack/-/victory-stack-31.0.2.tgz#9a80b3347c7be0b45e114ec9771f45f87861f819" + dependencies: + lodash "^4.17.5" + prop-types "^15.5.8" + victory-core "^31.0.2" + +victory-tooltip@^31.0.2: + version "31.0.2" + resolved "https://registry.yarnpkg.com/victory-tooltip/-/victory-tooltip-31.0.2.tgz#b0b18c2b8083e94e172561ff14f25f98353b3754" + dependencies: + lodash "^4.17.5" + prop-types "^15.5.8" + victory-core "^31.0.2" + +victory-voronoi-container@^31.0.2: + version "31.0.2" + resolved "https://registry.yarnpkg.com/victory-voronoi-container/-/victory-voronoi-container-31.0.2.tgz#216e78ed1c61712003013b459fe41cc7fd084752" + dependencies: + d3-voronoi "^1.1.2" + lodash "^4.17.5" + prop-types "^15.5.8" + victory-core "^31.0.2" + victory-tooltip "^31.0.2" + +victory-voronoi@^31.0.2: + version "31.0.2" + resolved "https://registry.yarnpkg.com/victory-voronoi/-/victory-voronoi-31.0.2.tgz#341e7e3b7d15b455b06c9b97236e3641bbd318e9" + dependencies: + d3-voronoi "^1.1.2" + lodash "^4.17.5" + prop-types "^15.5.8" + victory-core "^31.0.2" + +victory-zoom-container@^31.0.2: + version "31.0.2" + resolved "https://registry.yarnpkg.com/victory-zoom-container/-/victory-zoom-container-31.0.2.tgz#4e8695bda3e334324fab0e8ecd7789aef9ffd2f7" + dependencies: + lodash "^4.17.5" + prop-types "^15.5.8" + victory-core "^31.0.2" + +victory@^31.0.2: + version "31.0.2" + resolved "https://registry.yarnpkg.com/victory/-/victory-31.0.2.tgz#08c391a7f5370f8d502e55fc7709726d05aded03" + dependencies: + victory-area "^31.0.2" + victory-axis "^31.0.2" + victory-bar "^31.0.2" + victory-box-plot "^31.0.2" + victory-brush-container "^31.0.2" + victory-brush-line "^31.0.2" + victory-candlestick "^31.0.2" + victory-chart "^31.0.2" + victory-core "^31.0.2" + victory-create-container "^31.0.2" + victory-cursor-container "^31.0.2" + victory-errorbar "^31.0.2" + victory-group "^31.0.2" + victory-legend "^31.0.2" + victory-line "^31.0.2" + victory-pie "^31.0.2" + victory-polar-axis "^31.0.2" + victory-scatter "^31.0.2" + victory-selection-container "^31.0.2" + victory-shared-events "^31.0.2" + victory-stack "^31.0.2" + victory-tooltip "^31.0.2" + victory-voronoi "^31.0.2" + victory-voronoi-container "^31.0.2" + victory-zoom-container "^31.0.2" void-elements@^2.0.1: version "2.0.1" @@ -5576,10 +5855,6 @@ wcwidth@^1.0.0: dependencies: defaults "^1.0.3" -whatwg-fetch@>=0.10.0: - version "2.0.3" - resolved "https://registry.yarnpkg.com/whatwg-fetch/-/whatwg-fetch-2.0.3.tgz#9c84ec2dcf68187ff00bc64e1274b442176e1c84" - which-module@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a" @@ -5644,7 +5919,7 @@ wrap-ansi@^2.0.0: string-width "^1.0.1" strip-ansi "^3.0.1" -wrappy@1, wrappy@~1.0.2: +wrappy@1: version "1.0.2" resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" @@ -5662,13 +5937,11 @@ write@^0.2.1: dependencies: mkdirp "^0.5.1" -ws@^3.0.0: - version "3.3.3" - resolved "https://registry.yarnpkg.com/ws/-/ws-3.3.3.tgz#f1cf84fe2d5e901ebce94efaece785f187a228f2" +ws@^6.1.0: + version "6.1.2" + resolved "https://registry.yarnpkg.com/ws/-/ws-6.1.2.tgz#3cc7462e98792f0ac679424148903ded3b9c3ad8" dependencies: async-limiter "~1.0.0" - safe-buffer "~5.1.0" - ultron "~1.1.0" xdg-basedir@^3.0.0: version "3.0.0" @@ -5734,9 +6007,9 @@ yargs@~3.10.0: decamelize "^1.0.0" window-size "0.1.0" -yarn@^1.7.0: - version "1.7.0" - resolved "https://registry.yarnpkg.com/yarn/-/yarn-1.7.0.tgz#0076b9fde6010e01950526a609bc53bc175ef925" +yarn@^1.12.3: + version "1.12.3" + resolved "https://registry.yarnpkg.com/yarn/-/yarn-1.12.3.tgz#fb4599bf1f8da01552bcc7e1571dfd4e53788203" yauzl@2.4.1: version "2.4.1"