diff --git a/pack.js b/pack.js new file mode 100644 index 0000000..9452f9b --- /dev/null +++ b/pack.js @@ -0,0 +1,40 @@ +const cp = require('child_process') +const os = require('os') +const path = require('path') + +const pkg = require('pkg') + +const nodeTargets = { + darwin: "node8-macos-x64", + linux: "node8-linux-x64", + win32: "node8-win-x64", +} + +const nativeModules = { + darwin: [ + 'node_modules/measurement-kit/build/Release/measurement-kit.node', + 'node_modules/sqlite3/lib/binding/node-v57-darwin-x64/node_sqlite3.node' + ], + win32: [], + linux: [] +} + +const platform = os.platform() + +if (!nodeTargets[platform]) { + console.log('this platform is not supported') + process.exit(0) +} + +console.log('- building packed/ooni for ' + nodeTargets[platform]) +pkg.exec([ 'dist/ooni.js', '--target', nodeTargets[platform], '-o', 'packed/ooni' ]) +.then(() => { + nativeModules[platform].forEach(dotNodePath => { + console.log('- copying ' + dotNodePath) + cp.spawnSync('cp', [ + dotNodePath, + 'packed/' + path.basename(dotNodePath) + ], {shell: true}) + }) + process.exit(0) +}) diff --git a/package.json b/package.json index 4959bd7..b251e8b 100644 --- a/package.json +++ b/package.json @@ -6,21 +6,12 @@ "license": "MIT", "scripts": { "dev": "webpack -w", - "pack": "webpack && pkg dist/ooni.js -c package.json -o packed/ooni", + "pack": "webpack && node pack.js", "clean-home": "rm -rf ~/.ooni/measurements && rm -rf ~/.ooni/*.ldb" }, - "pkg": { - "scripts": [ - "dist/*" - ], - "targets": [ - "node7-linux-x64", - "node7-macos-x64", - "node7-win-x64" - ] - }, "devDependencies": { "ansi-escapes": "^3.0.0", + "axios": "^0.17.1", "babel-core": "^6.26.0", "babel-loader": "^7.1.2", "babel-preset-es2015": "^6.24.1", @@ -49,9 +40,10 @@ "webpack": "^3.6.0", "webpack-node-externals": "^1.6.0", "window-size": "^1.1.0", - "wrap-ansi": "^3.0.1" + "wrap-ansi": "^3.0.1", + "zlib": "^1.0.5" }, "dependencies": { - "measurement-kit": "^0.1.0-alpha.5" + "measurement-kit": "^0.1.0-alpha.8" } } diff --git a/scripts/gen-nettests.py b/scripts/gen-nettests.py new file mode 100644 index 0000000..7f53f6b --- /dev/null +++ b/scripts/gen-nettests.py @@ -0,0 +1,102 @@ +import os +import pystache +# pip install https://github.com/okunishinishi/python-stringcase/archive/cc7d5eb58ff4a959a508c3f2296459daf7c3a1f2.zip +import stringcase + +PKG_TMPL = """ +{ + "name": "ooni-{{nettest_dash_case}}", + "version": "0.3.0", + "description": "Official OONI test for running {{nettest_name}}", + "dependencies": { + "measurement-kit": "0.1.0" + } +} +""" + +INDEX_TMPL = """ +import { {{nettest_pascal_case}} } from 'measurement-kit' + +export const renderSummary = (measurements, {React, Cli, Components, chalk}) => { + const summary = measurements[0].summary + + // When this function is called from the Cli the Cli will be set, when it's + // called from the Desktop app we have React set instead. + if (Cli) { + Cli.log(Cli.output.labelValue('Label', uploadMbit, {unit: 'Mbit'})) + } else if (React) { + /* + XXX this is broken currently as it depends on react + const { + Container, + Heading + } = Components + return class extends React.Component { + render() { + return + Results for NDT + {uploadMbit} + + } + } + */ + } +} + +export const renderHelp = () => { +} + +export const makeSummary = ({test_keys}) => ({ +}) + +export const run = ({ooni, argv}) => { + const {{nettest_camel_case}} = {{nettest_pascal_case}}(ooni.mkOptions) + ooni.init({{nettest_camel_case}}) + + {{nettest_camel_case}}.on('begin', () => ooni.onProgress(0.0, 'starting {{nettest_dash_case}}')) + {{nettest_camel_case}}.on('progress', (percent, message) => { + ooni.onProgress(percent, message, persist) + }) + return ooni.run({{nettest_camel_case}}.run) +} +""" + +nettests = [ + ['Web Connectivity', 'web-connectivity'], + ['HTTP Invalid Request Line', 'http-invalid-request-line'], + ['HTTP Header Field Manipulation', 'http-header-field-manipulation'], + #['NDT', 'ndt'], + ['Dash', 'dash'], + ['Facebook Messenger', 'facebook-messenger'], + ['Telegram', 'telegram'], + ['WhatsApp', 'whatsapp'] +] + +def gen(): + for nettest_name, nettest_dash_case in nettests: + nettest_camel_case = stringcase.camelcase(nettest_dash_case) + nettest_pascal_case = stringcase.pascalcase(nettest_dash_case) + partials = dict( + nettest_dash_case=nettest_dash_case, + nettest_camel_case=nettest_camel_case, + nettest_pascal_case=nettest_pascal_case, + nettest_name=nettest_name + ) + dst_path = os.path.join(os.path.dirname(__file__), '..', 'src', 'nettests', nettest_dash_case) + if not os.path.exists(dst_path): + os.mkdir(dst_path) + + index_path = os.path.join(dst_path, 'index.js') + package_path = os.path.join(dst_path, 'package.json') + with open(index_path, 'w+') as out_file: + out_file.write(pystache.render(INDEX_TMPL, partials)) + print('wrote {}'.format(index_path)) + with open(package_path, 'w+') as out_file: + out_file.write(pystache.render(PKG_TMPL, partials)) + print('wrote {}'.format(package_path)) + +def main(): + gen() + +if __name__ == '__main__': + main() diff --git a/src/cli/make-cli.js b/src/cli/make-cli.js index ffc1d90..e56a038 100644 --- a/src/cli/make-cli.js +++ b/src/cli/make-cli.js @@ -2,6 +2,8 @@ export const makeCli = (log = console.log) => ({ output: { toMbit: require('./output/to-mbit').default, labelValue: require('./output/label-value').default, + ok: require('./output/ok'), + notok: require('./output/notok'), }, log }) diff --git a/src/cli/output/test-results.js b/src/cli/output/test-results.js index 36cd932..8a832e8 100644 --- a/src/cli/output/test-results.js +++ b/src/cli/output/test-results.js @@ -55,9 +55,10 @@ import labelValue from './label-value' */ const testResults = async (results, getMeta) => { - const colWidth = 50 + const colWidth = 76 let o = '┏' + '━'.repeat(colWidth) + '┓\n' - let totalDataUsage = 0 + let totalDataUsageUp = 0 + let totalDataUsageDown = 0 let totalRows = 0 let allAsns = [] let allCountries = [] @@ -79,23 +80,26 @@ const testResults = async (results, getMeta) => { if (allAsns.indexOf(meta.asn) === -1) { allAsns.push(meta.asn) } - totalDataUsage += meta.dataUsage + if (meta.dataUsageUp && meta.dataUsageDown) { + totalDataUsageUp += meta.dataUsageUp + totalDataUsageDown += meta.dataUsageDown + } totalRows += 1 let firstRow = `${chalk.bold(`#${r.id}`)} - ${moment(meta.date).fromNow()}` firstRow += rightPad(firstRow, innerWidth) let secondRow = meta.name - secondRow += rightPad(secondRow, 26) + secondRow += rightPad(secondRow, colWidth/2) secondRow += meta.summary[0] || '' secondRow += rightPad(secondRow, innerWidth) let thirdRow = meta.network - thirdRow += rightPad(thirdRow, 26) + thirdRow += rightPad(thirdRow, colWidth/2) thirdRow += meta.summary[1] || '' thirdRow += rightPad(thirdRow, innerWidth) let fourthRow = `${chalk.cyan(meta.asn)} (${chalk.cyan(meta.country)})` - fourthRow += rightPad(fourthRow, 26) + fourthRow += rightPad(fourthRow, colWidth/2) fourthRow += meta.summary[2] || '' fourthRow += rightPad(fourthRow, innerWidth) @@ -110,8 +114,11 @@ const testResults = async (results, getMeta) => { results.map(getContentRow) ) - let dataUsageCell = `${humanize.filesize(totalDataUsage)}` - dataUsageCell += rightPad(dataUsageCell, 12) + let dataUsageDownCell = `U ${humanize.filesize(totalDataUsageDown)}` + dataUsageDownCell += rightPad(dataUsageDownCell, 12) + + let dataUsageUpCell = `D ${humanize.filesize(totalDataUsageUp)}` + dataUsageUpCell += rightPad(dataUsageUpCell, 12) let networksCell = `${allAsns.length} nets` networksCell += rightPad(networksCell, 12) @@ -120,10 +127,16 @@ const testResults = async (results, getMeta) => { msmtsCell += rightPad(msmtsCell, 12) o += contentRows.join('┢' + '━'.repeat(colWidth) + '┪\n') - o += '└┬──────────────┬──────────────┬──────────────┬'+'─'.repeat(colWidth - 46)+'┘\n' - o += ` │ ${msmtsCell} │ ${networksCell} │ ${dataUsageCell} │ - ╰──────────────┴──────────────┴──────────────╯ -` + + if (totalDataUsageDown && totalDataUsageUp) { + o += '└┬──────────────┬──────────────┬──────────────┬──────────────┬'+'─'.repeat(colWidth - 61)+'┘\n' + o += ` │ ${msmtsCell} │ ${networksCell} │ ${dataUsageDownCell} │ ${dataUsageUpCell} │\n` + o += ' ╰──────────────┴──────────────┴──────────────┴──────────────╯' + } else { + o += '└┬──────────────┬──────────────┬'+'─'.repeat(colWidth - 31)+'┘\n' + o += ` │ ${msmtsCell} │ ${networksCell} │\n` + o += ' ╰──────────────┴──────────────╯' + } return o } diff --git a/src/commands/list.js b/src/commands/list.js index 3776426..539ada8 100644 --- a/src/commands/list.js +++ b/src/commands/list.js @@ -87,13 +87,14 @@ const listAction = async ctx => { summary.push(m) }) // XXX we should figure out how this will work when we have many measurements - nettest.renderSummary([measurement], {Cli, chalk}) + if (measurement.summary) { + nettest.renderSummary([measurement], {Cli, chalk}) + } return { name: measurement.name, network: measurement.asn, asn: measurement.asn, country: measurement.country, - dataUsage: measurement.dataUsage, date: measurement.startTime, summary: summary } @@ -118,7 +119,8 @@ const listAction = async ctx => { network: measurements[0].asn, asn: measurements[0].asn, country: measurements[0].country, - dataUsage: measurements.map(m => m.dataUsage).reduce((a,b) => a += b), + dataUsageUp: result.dataUsageUp, + dataUsageDown: result.dataUsageDown, date: result.startTime, summary: summary } diff --git a/src/commands/nettest.js b/src/commands/nettest.js index 5b361f5..23dc9d0 100644 --- a/src/commands/nettest.js +++ b/src/commands/nettest.js @@ -118,7 +118,6 @@ const main = async ctx => { } await exit(1) } - } export default main diff --git a/src/commands/run.js b/src/commands/run.js index 018fc3f..a954eec 100644 --- a/src/commands/run.js +++ b/src/commands/run.js @@ -18,8 +18,14 @@ import { Result } from '../config/db' +import { + notify +} from '../config/ipc' + import makeCli from '../cli/make-cli' +import { getGeoipPaths } from '../config/geoip' + const debug = require('debug')('commands.run') const help = () => { @@ -66,30 +72,51 @@ const run = async ({camelName, argv}) => { }) dbOperations.push(result.save()) + notify({key: 'ooni.run.nettest.starting', value: camelName}) console.log(info('Running '+ chalk.bold(`${nettestType.nettests.length} ${nettestType.name} `) + `test${sOrNot}`)) + let dataUsageUp = 0 + let dataUsageDown = 0 + const geoip = await getGeoipPaths() + for (const nettestLoader of nettestType.nettests) { const loader = nettestLoader() const { nettest, meta } = loader + notify({key: 'ooni.run.nettest.running', value: meta}) console.log(info(`${chalk.bold(meta.name)}`)) - const measurements = await nettest.run({ooni: makeOoni(loader), argv}) + const [measurements, dataUsage] = await nettest.run({ + ooni: makeOoni(loader, geoip), + argv + }) + debug('setting data usage', dataUsage) + dataUsageUp += dataUsage.up || 0 + dataUsageDown += dataUsage.down || 0 nettest.renderSummary(measurements, { Cli: makeCli(), chalk: chalk, Components: null, React: null, }) - dbOperations.push(result.setMeasurements(measurements)) + + for (const measurement of measurements) { + dbOperations.push(result.addMeasurements(measurement)) + } } await Promise.all(dbOperations) const measurements = await result.getMeasurements() + debug('updating the result table') + debug(measurements) + const summary = nettestType.makeSummary(measurements) + debug('summary: ', summary) await result.update({ - summary: nettestType.makeSummary(measurements), endTime: moment.utc().toDate(), - done: true + done: true, + dataUsageUp: dataUsageUp, + dataUsageDown: dataUsageDown, + summary }) } @@ -140,6 +167,7 @@ const main = async ctx => { await exit(0) } else { await run({camelName, argv}) + await exit(0) } } catch(err) { if (err.usageError) { diff --git a/src/config/db.js b/src/config/db.js index f0bc44c..fd3eac0 100644 --- a/src/config/db.js +++ b/src/config/db.js @@ -31,7 +31,6 @@ export const Measurement = sequelize.define('measurement', { name: Sequelize.STRING, startTime: Sequelize.DATE, endTime: Sequelize.DATE, - dataUsage: Sequelize.INTEGER, // This is an opaque JSON that is test dependent summary: Sequelize.JSON, @@ -66,7 +65,9 @@ export const Result = sequelize.define('result', { startTime: Sequelize.DATE, endTime: Sequelize.DATE, summary: Sequelize.JSON, - done: Sequelize.BOOLEAN + done: Sequelize.BOOLEAN, + dataUsageUp: Sequelize.INTEGER, + dataUsageDown: Sequelize.INTEGER }) Result.hasMany(Measurement, { as: 'Measurements' }) sequelize.sync() diff --git a/src/config/geoip.js b/src/config/geoip.js new file mode 100644 index 0000000..84ae304 --- /dev/null +++ b/src/config/geoip.js @@ -0,0 +1,75 @@ +import * as fs from 'fs-extra' +import path from 'path' + +import axios from 'axios' +import zlib from 'zlib' + +import wait from '../cli/output/wait' +import { getOoniDir } from './global-path' + +const BASE_URL = 'https://github.com/OpenObservatory/ooni-resources/releases/download/' +const LATEST_VERSION = '21' +const GEOIP_ASN_FILENAME = 'maxmind-geoip.GeoIPASNum.dat' +const GEOIP_COUNTRY_FILENAME = 'maxmind-geoip.GeoIP.dat' + +const downloadFile = ({url, dst, uncompress}) => { + return new Promise((resolve, reject) => { + axios({ + method: 'get', + url: url, + responseType: 'stream' + }).then(response => { + let outputStream + if (uncompress) { + outputStream = zlib.createGunzip() + outputStream.pipe(fs.createWriteStream(dst)) + response.data.pipe(outputStream) + } else { + outputStream = response.data + outputStream.pipe(fs.createWriteStream(dst)) + } + outputStream.on('end', () => { + resolve() + }) + }) + }) +} + +export const getGeoipPaths = async () => { + let progress + const geoipDir = path.join(getOoniDir(), 'geoip') + + // XXX exception handling + const geoipDirExists = await fs.pathExists(geoipDir) + if (!geoipDirExists) { + await fs.ensureDir(geoipDir) + } + + const geoipCountryPath = path.join(geoipDir, GEOIP_COUNTRY_FILENAME) + const geoipCountryExists = await fs.pathExists(geoipCountryPath) + if (!geoipCountryExists) { + progress = wait('downloading GeoIP country file') + await downloadFile({ + url: `${BASE_URL}${LATEST_VERSION}/${GEOIP_COUNTRY_FILENAME}.gz`, + dst: geoipCountryPath, + uncompress: true + }) + progress() + } + + const geoipAsnPath = path.join(geoipDir, GEOIP_ASN_FILENAME) + const geoipAsnExists = await fs.pathExists(geoipAsnPath) + if (!geoipAsnExists) { + progress = wait('downloading GeoIP ASN file') + await downloadFile({ + url: `${BASE_URL}${LATEST_VERSION}/${GEOIP_ASN_FILENAME}.gz`, + dst: geoipAsnPath, + uncompress: true + }) + progress() + } + return { + countryPath: geoipCountryPath, + asnPath: geoipAsnPath, + } +} diff --git a/src/config/ipc.js b/src/config/ipc.js new file mode 100644 index 0000000..d9b48e3 --- /dev/null +++ b/src/config/ipc.js @@ -0,0 +1,26 @@ +const process = require('process') + +let ipcEnabled = false + +export const enableIpc = () => { + if (ipcEnabled === true) { + throw Error('IPC cannot be enabled twice') + } + ipcEnabled = true + listenForMessages() +} + +const listenForMessages = () => { + process.on('message', m => { + console.log('got message', m) + }) +} + +export const notify = ({key, value}) =>{ + if (ipcEnabled === true && process.send) { + process.send({ + key, + value + }) + } +} diff --git a/src/nettests/dash/index.js b/src/nettests/dash/index.js new file mode 100644 index 0000000..361b8f2 --- /dev/null +++ b/src/nettests/dash/index.js @@ -0,0 +1,45 @@ + +import { Dash } from 'measurement-kit' + +export const renderSummary = (measurements, {React, Cli, Components, chalk}) => { + const summary = measurements[0].summary + + // When this function is called from the Cli the Cli will be set, when it's + // called from the Desktop app we have React set instead. + if (Cli) { + Cli.log(Cli.output.labelValue('Label', uploadMbit, {unit: 'Mbit'})) + } else if (React) { + /* + XXX this is broken currently as it depends on react + const { + Container, + Heading + } = Components + return class extends React.Component { + render() { + return + Results for NDT + {uploadMbit} + + } + } + */ + } +} + +export const renderHelp = () => { +} + +export const makeSummary = ({test_keys}) => ({ +}) + +export const run = ({ooni, argv}) => { + const dash = Dash(ooni.mkOptions) + ooni.init(dash) + + dash.on('begin', () => ooni.onProgress(0.0, 'starting dash')) + dash.on('progress', (percent, message) => { + ooni.onProgress(percent, message, persist) + }) + return ooni.run(dash.run) +} diff --git a/src/nettests/dash/package.json b/src/nettests/dash/package.json new file mode 100644 index 0000000..8a9e16a --- /dev/null +++ b/src/nettests/dash/package.json @@ -0,0 +1,9 @@ + +{ + "name": "ooni-dash", + "version": "0.3.0", + "description": "Official OONI test for running Dash", + "dependencies": { + "measurement-kit": "0.1.0" + } +} diff --git a/src/nettests/facebook-messenger/index.js b/src/nettests/facebook-messenger/index.js new file mode 100644 index 0000000..c00acb8 --- /dev/null +++ b/src/nettests/facebook-messenger/index.js @@ -0,0 +1,65 @@ + +import { FacebookMessenger } from 'measurement-kit' + +export const renderSummary = (measurements, {React, Cli, Components, chalk}) => { + const summary = measurements[0].summary + + // When this function is called from the Cli the Cli will be set, when it's + // called from the Desktop app we have React set instead. + if (Cli) { + if (summary.facebookDnsBlocking === true) { + Cli.log(Cli.output.notok('Facebook is blocked via DNS')) + } else { + Cli.log(Cli.output.ok('Facebook is not blocked via DNS')) + } + if (summary.facebookTcpBlocking === true) { + Cli.log(Cli.output.notok('Facebook is blocked via TCP')) + } else { + Cli.log(Cli.output.ok('Facebook is not blocked via TCP')) + } + } else if (React) { + // XXX this is broken currently as it depends on react + } +} + +export const renderHelp = () => { +} + +export const makeSummary = ({test_keys}) => ({ + facebookTcpBlocking: test_keys.facebook_tcp_blocking, + facebookDnsBlocking: test_keys.facebook_dns_blocking, + /* + XXX do we want to expose these too? + facebook_b_api_dns_consistent + facebook_b_api_reachable + + facebook_b_graph_dns_consistent + facebook_b_graph_reachable + + facebook_edge_dns_consistent + facebook_edge_reachable + + facebook_external_cdn_dns_consistent + facebook_external_cdn_reachable + + facebook_scontent_cdn_dns_consistent + facebook_scontent_cdn_reachable + + facebook_star_dns_consistent + facebook_star_reachable + + facebook_stun_dns_consistent + facebook_stun_reachable + */ +}) + +export const run = ({ooni, argv}) => { + const facebookMessenger = FacebookMessenger(ooni.mkOptions) + ooni.init(facebookMessenger) + + facebookMessenger.on('begin', () => ooni.onProgress(0.0, 'starting facebook-messenger')) + facebookMessenger.on('progress', (percent, message) => { + ooni.onProgress(percent, message) + }) + return ooni.run(facebookMessenger.run) +} diff --git a/src/nettests/facebook-messenger/package.json b/src/nettests/facebook-messenger/package.json new file mode 100644 index 0000000..b08bdf4 --- /dev/null +++ b/src/nettests/facebook-messenger/package.json @@ -0,0 +1,9 @@ + +{ + "name": "ooni-facebook-messenger", + "version": "0.3.0", + "description": "Official OONI test for running Facebook Messenger", + "dependencies": { + "measurement-kit": "0.1.0" + } +} diff --git a/src/nettests/http-header-field-manipulation/index.js b/src/nettests/http-header-field-manipulation/index.js new file mode 100644 index 0000000..798c816 --- /dev/null +++ b/src/nettests/http-header-field-manipulation/index.js @@ -0,0 +1,38 @@ + +import { HttpHeaderFieldManipulation } from 'measurement-kit' + +export const renderSummary = (measurements, {React, Cli, Components, chalk}) => { + const summary = measurements[0].summary + + // When this function is called from the Cli the Cli will be set, when it's + // called from the Desktop app we have React set instead. + if (Cli) { + if (summary.foundMiddlebox === true) { + Cli.log(Cli.output.notok('Detected the presence of a Middle Box')) + } else { + Cli.log(Cli.output.ok('No Middle Box detected')) + } + } else if (React) { + // XXX this is broken currently as it depends on react + } +} + +export const renderHelp = () => { +} + +export const makeSummary = ({test_keys}) => ({ + foundMiddlebox: (test_keys.tampering.header_field_name || + test_keys.tampering.request_line_capitalization || + test_keys.tampering.total) +}) + +export const run = ({ooni, argv}) => { + const httpHeaderFieldManipulation = HttpHeaderFieldManipulation(ooni.mkOptions) + ooni.init(httpHeaderFieldManipulation) + + httpHeaderFieldManipulation.on('begin', () => ooni.onProgress(0.0, 'starting http-header-field-manipulation')) + httpHeaderFieldManipulation.on('progress', (percent, message) => { + ooni.onProgress(percent, message) + }) + return ooni.run(httpHeaderFieldManipulation.run) +} diff --git a/src/nettests/http-header-field-manipulation/package.json b/src/nettests/http-header-field-manipulation/package.json new file mode 100644 index 0000000..b4ba4d9 --- /dev/null +++ b/src/nettests/http-header-field-manipulation/package.json @@ -0,0 +1,9 @@ + +{ + "name": "ooni-http-header-field-manipulation", + "version": "0.3.0", + "description": "Official OONI test for running HTTP Header Field Manipulation", + "dependencies": { + "measurement-kit": "0.1.0" + } +} diff --git a/src/nettests/http-invalid-request-line/index.js b/src/nettests/http-invalid-request-line/index.js new file mode 100644 index 0000000..82883e0 --- /dev/null +++ b/src/nettests/http-invalid-request-line/index.js @@ -0,0 +1,36 @@ + +import { HttpInvalidRequestLine } from 'measurement-kit' + +export const renderSummary = (measurements, {React, Cli, Components, chalk}) => { + const summary = measurements[0].summary + + // When this function is called from the Cli the Cli will be set, when it's + // called from the Desktop app we have React set instead. + if (Cli) { + if (summary.foundMiddlebox === true) { + Cli.log(Cli.output.notok('Detected the presence of a Middle Box')) + } else { + Cli.log(Cli.output.ok('No Middle Box detected')) + } + } else if (React) { + // XXX this is broken currently as it depends on react + } +} + +export const renderHelp = () => { +} + +export const makeSummary = ({test_keys}) => ({ + foundMiddlebox: test_keys.tampering +}) + +export const run = ({ooni, argv}) => { + const httpInvalidRequestLine = HttpInvalidRequestLine(ooni.mkOptions) + ooni.init(httpInvalidRequestLine) + + httpInvalidRequestLine.on('begin', () => ooni.onProgress(0.0, 'starting http-invalid-request-line')) + httpInvalidRequestLine.on('progress', (percent, message) => { + ooni.onProgress(percent, message) + }) + return ooni.run(httpInvalidRequestLine.run) +} diff --git a/src/nettests/http-invalid-request-line/package.json b/src/nettests/http-invalid-request-line/package.json new file mode 100644 index 0000000..890b504 --- /dev/null +++ b/src/nettests/http-invalid-request-line/package.json @@ -0,0 +1,9 @@ + +{ + "name": "ooni-http-invalid-request-line", + "version": "0.3.0", + "description": "Official OONI test for running HTTP Invalid Request Line", + "dependencies": { + "measurement-kit": "0.1.0" + } +} diff --git a/src/nettests/index.js b/src/nettests/index.js index 296bf0a..eaf5c4f 100644 --- a/src/nettests/index.js +++ b/src/nettests/index.js @@ -8,12 +8,12 @@ import wait from '../cli/output/wait' import { Measurement } from '../config/db' import { getOoniDir } from '../config/global-path' +import { notify } from '../config/ipc' import iso8601 from '../util/iso8601' import randInt from '../util/randInt' const debug = require('debug')('nettests.index') - const OONI_DIR = getOoniDir() const makeReportFile = (name) => { @@ -24,13 +24,17 @@ const makeReportFile = (name) => { ) } -export const makeOoni = (loader) => { +export const makeOoni = (loader, geoip) => { let dbOperations = [], measurements = [], mkOptions = {}, progress = null, reportId = null, reportFile = null, + dataUsage = { + up: 0, + down: 0 + }, measurementName = camelCase(loader.meta.name), uploaded = false, localReportId = null, @@ -50,6 +54,10 @@ export const makeOoni = (loader) => { if (isMk) { nt.test.set_options('no_file_report', '0') nt.test.set_output_filepath(reportFile) + nt.setOptions({ + geoipCountryPath: geoip.countryPath, + geoipAsnPath: geoip.asnPath + }) nt.on('log', (severity, message) => { debug('<'+severity+'>'+message) // XXX this a workaround due to a bug in MK @@ -65,6 +73,10 @@ export const makeOoni = (loader) => { nt.on('end', () => { debug('ending test') }) + nt.on('overall-data-usage', ({down, up}) => { + dataUsage.up = up + dataUsage.down = down + }) nt.on('entry', entry => { // XXX This is a bit of a hack // When we don't have a reportId with the collector we set the @@ -77,6 +89,11 @@ export const makeOoni = (loader) => { uploaded = false reportId = `LOCAL-${entry.id}` } + debug('generating summary for ' + reportFile) + const summary = loader.nettest.makeSummary(entry) + const startTime = moment(entry['measurement_start_time'] + 'Z').toDate() + const endTime = new Date(startTime.getTime() + entry['test_runtime'] * 1000) + debug('generated summary: ', summary) let measurement = Measurement.build({ state: 'active', reportId: reportId, @@ -87,8 +104,9 @@ export const makeOoni = (loader) => { name: measurementName, reportFile: reportFile, // We append the Z to make moment understand it's UTC - startTime: moment(entry['measurement_start_time'] + 'Z').toDate(), - summary: loader.nettest.makeSummary(entry) + startTime, + endTime, + summary }) dbOperations.push(measurement.save()) measurements.push(measurement) @@ -99,9 +117,8 @@ export const makeOoni = (loader) => { const onProgress = (percent, message, persist) => { progress && progress() progress = wait(`${percentage(percent)}: ${message}`, persist) - } - - const setSummary = (measurementId, summary) => { + notify({key: 'ooni.run.progress.percent', value: percent}) + notify({key: 'ooni.run.progress.message', value: message}) } const run = async (runner) => { @@ -109,23 +126,21 @@ export const makeOoni = (loader) => { // XXX Here I make the assumption that either it all failed or not. // This is a lie. + // The endTime is also not correct for (const measurement of measurements) { dbOperations.push(measurement.update({ - state: uploaded ? 'uploaded' : 'done', - endTime: moment().utc().toDate(), - dataUsage: 1024**2*randInt(1, 20) // XXX we currently fill this with some random data + state: uploaded ? 'uploaded' : 'done' })) } await Promise.all(dbOperations) progress && progress() - return measurements + return [measurements, dataUsage] } return { init, onProgress, - setSummary, mkOptions, run } @@ -148,14 +163,12 @@ export const nettests = { httpInvalidRequestLine: makeNettestLoader('http-invalid-request-line'), httpHeaderFieldManipulation: makeNettestLoader('http-header-field-manipulation'), ndt: makeNettestLoader('ndt'), - - // Missing wrapper dash: makeNettestLoader('dash'), facebookMessenger: makeNettestLoader('facebook-messenger'), telegram: makeNettestLoader('telegram'), + whatsapp: makeNettestLoader('whatsapp'), // These don't exist in MK - whatsapp: makeNettestLoader('whatsapp'), captivePortal: makeNettestLoader('captive-portal'), httpHost: makeNettestLoader('http-host'), traceroute: makeNettestLoader('traceroute'), @@ -217,13 +230,22 @@ export const nettestTypes = { nettests.httpInvalidRequestLine, nettests.httpHeaderFieldManipulation ], - name: 'Middleboxes', - shortDescription: 'Detect the presence of "Middle boxes"', + name: 'Middle Boxes', + shortDescription: 'Detect the presence of Middle Boxes', help: 'No help for you', makeSummary: (measurements) => { - return {} + return { + foundMiddlebox: (measurements[0].summary.foundMiddlebox || + measurements[1].summary.foundMiddlebox) + } }, - renderSummary: (measurement, {Cli, chalk}) => {} + renderSummary: (result, {Cli, chalk}) => { + if (result.summary.foundMiddlebox === true) { + Cli.log(Cli.output.notok('Found Middle Box')) + } else { + Cli.log(Cli.output.ok('No Middle Box')) + } + } }, imBlocking: { nettests: [ @@ -235,9 +257,34 @@ export const nettestTypes = { shortDescription: 'Check if Instant Messagging apps are blocked.', help: 'No help for you', makeSummary: (measurements) => { - return {} + return { + whatsappBlocked: (measurements[0].summary.whatsappEndpointsBlocked || + measurements[0].summary.whatsappWebBlocked || + measurements[0].summary.registrationServerBlocked), + facebookMessengerBlocked: (measurements[1].summary.facebookTcpBlocking || + measurements[1].summary.facebookDnsBlocking), + telegramBlocked: (measurements[2].summary.telegramWebBlocked || + measurements[2].summary.telegramHttpBlocked || + measurements[2].summary.telegramTcpBlocked) + } }, - renderSummary: (measurement, {Cli, chalk}) => {} + renderSummary: (result, {Cli, chalk}) => { + if (result.summary.whatsappBlocked === true) { + Cli.log(Cli.output.notok('WhatsApp NOT ok')) + } else { + Cli.log(Cli.output.ok('WhatsApp is OK')) + } + if (result.summary.facebookMessengerBlocked === true) { + Cli.log(Cli.output.notok('Facebook NOT ok')) + } else { + Cli.log(Cli.output.ok('Facebook is OK')) + } + if (result.summary.telegramBlocked === true) { + Cli.log(Cli.output.ok('Telegram NOT ok')) + } else { + Cli.log(Cli.output.ok('Telegram is OK')) + } + } }, circumvention: { nettests: [ diff --git a/src/nettests/ndt/index.js b/src/nettests/ndt/index.js index 74e42e8..d28f5dd 100644 --- a/src/nettests/ndt/index.js +++ b/src/nettests/ndt/index.js @@ -23,21 +23,7 @@ export const renderSummary = (measurements, {React, Cli, Components, chalk}) => Cli.log(Cli.output.labelValue('MSS', mss)) Cli.log(Cli.output.labelValue('Timeouts', timeouts)) } else if (React) { - /* - XXX this is broken currently as it depends on react - const { - Container, - Heading - } = Components - return class extends React.Component { - render() { - return - Results for NDT - {uploadMbit} - - } - } - */ + // XXX this is broken currently as it depends on react } } @@ -63,9 +49,11 @@ export const run = ({ooni, argv}) => { ndt.on('begin', () => ooni.onProgress(0.0, 'starting ndt')) ndt.on('progress', (percent, message) => { - const persist = !(message.startsWith('upload-speed') || - message.startsWith('download-speed')) - ooni.onProgress(percent, message, persist) + /* + const persist = (message.startsWith('upload-speed') || + message.startsWith('download-speed')) + */ + ooni.onProgress(percent, message) }) return ooni.run(ndt.run) } diff --git a/src/nettests/telegram/index.js b/src/nettests/telegram/index.js new file mode 100644 index 0000000..f110854 --- /dev/null +++ b/src/nettests/telegram/index.js @@ -0,0 +1,51 @@ + +import { Telegram } from 'measurement-kit' + +export const renderSummary = (measurements, {React, Cli, Components, chalk}) => { + const summary = measurements[0].summary + + // When this function is called from the Cli the Cli will be set, when it's + // called from the Desktop app we have React set instead. + if (Cli) { + + if (summary.telegramHttpBlocked === true) { + Cli.log(Cli.output.notok('Telegram via HTTP is blocked')) + } else { + Cli.log(Cli.output.ok('Telegram via HTTP is not blocked')) + } + + if (summary.telegramTcpBlocked === true) { + Cli.log(Cli.output.notok('Telegram via TCP is blocked')) + } else { + Cli.log(Cli.output.ok('Telegram via TCP is not blocked')) + } + + if (summary.telegramWebBlocked === true) { + Cli.log(Cli.output.notok('Telegram Web is blocked')) + } else { + Cli.log(Cli.output.ok('Telegram Web is not blocked')) + } + } else if (React) { + // XXX this is broken currently as it depends on react + } +} + +export const renderHelp = () => { +} + +export const makeSummary = ({test_keys}) => ({ + telegramWebBlocked: test_keys.telegram_web_status === 'blocked', + telegramHttpBlocked: test_keys.telegram_http_blocking, + telegramTcpBlocked: test_keys.telegram_tcp_blocking, +}) + +export const run = ({ooni, argv}) => { + const telegram = Telegram(ooni.mkOptions) + ooni.init(telegram) + + telegram.on('begin', () => ooni.onProgress(0.0, 'starting telegram')) + telegram.on('progress', (percent, message) => { + ooni.onProgress(percent, message) + }) + return ooni.run(telegram.run) +} diff --git a/src/nettests/telegram/package.json b/src/nettests/telegram/package.json new file mode 100644 index 0000000..188a96b --- /dev/null +++ b/src/nettests/telegram/package.json @@ -0,0 +1,9 @@ + +{ + "name": "ooni-telegram", + "version": "0.3.0", + "description": "Official OONI test for running Telegram", + "dependencies": { + "measurement-kit": "0.1.0" + } +} diff --git a/src/nettests/web-connectivity/index.js b/src/nettests/web-connectivity/index.js index 39c5b59..d4d1382 100644 --- a/src/nettests/web-connectivity/index.js +++ b/src/nettests/web-connectivity/index.js @@ -1,58 +1,45 @@ -import chalk from 'chalk' -import exit from '../../util/exit' -import wait from '../../cli/output/wait' -import ok from '../../cli/output/ok' -import notok from '../../cli/output/notok' -import error from '../../cli/output/error' - -import nettestHelp from '../../cli/output/nettest-help' -import rightPad from '../../cli/output/right-pad' -import sleep from '../../util/sleep' - -exports.renderRunSummary = (measurements, {React, Cli, Components, chalk}) => { -} - -exports.makeSummary = (test_keys) => { +import { WebConnectivity } from 'measurement-kit' + +export const renderSummary = (measurements, {React, Cli, Components, chalk}) => { + const summary = measurements[0].summary + + // When this function is called from the Cli the Cli will be set, when it's + // called from the Desktop app we have React set instead. + if (Cli) { + Cli.log(Cli.output.labelValue('Label', uploadMbit, {unit: 'Mbit'})) + } else if (React) { + /* + XXX this is broken currently as it depends on react + const { + Container, + Heading + } = Components + return class extends React.Component { + render() { + return + Results for NDT + {uploadMbit} + + } + } + */ + } } -exports.renderHelp = () => { - const meta = { - name: WebConnectivity.name, - shortDescription: WebConnectivity.shortDescription - } - return nettestHelp(meta, 'webConnectivity', [ - { - option: '-h, --help', - description: 'Display usage information' - }, - { - option: `-f, --file ${chalk.bold.underline('FILE')}`, - description: 'The path to a list of websites to test' - } - ]) +export const renderHelp = () => { } -exports.run = async ({ooni, argv}) => { - let currentUrl - if (argv.file) { - // Handle testing input file - } else { - currentUrl = argv._.slice(1) - if (currentUrl.length == 0) { - console.log( - error( - 'Your must specify either a URL or an input file' - ) - ) - return exit(1) - } - } +export const makeSummary = ({test_keys}) => ({ +}) - const testDone = wait(`testing ${currentUrl}`) - await sleep(10000) - testDone() +export const run = ({ooni, argv}) => { + const webConnectivity = WebConnectivity(ooni.mkOptions) + ooni.init(webConnectivity) - console.log(ok(`${currentUrl} is OK`)) - console.log(notok(`${currentUrl} is NOT OK`)) + webConnectivity.on('begin', () => ooni.onProgress(0.0, 'starting web-connectivity')) + webConnectivity.on('progress', (percent, message) => { + ooni.onProgress(percent, message) + }) + return ooni.run(webConnectivity.run) } diff --git a/src/nettests/web-connectivity/package.json b/src/nettests/web-connectivity/package.json index 85f6bd0..78fec1f 100644 --- a/src/nettests/web-connectivity/package.json +++ b/src/nettests/web-connectivity/package.json @@ -1,3 +1,4 @@ + { "name": "ooni-web-connectivity", "version": "0.3.0", diff --git a/src/nettests/whatsapp/index.js b/src/nettests/whatsapp/index.js new file mode 100644 index 0000000..7affe53 --- /dev/null +++ b/src/nettests/whatsapp/index.js @@ -0,0 +1,50 @@ + +import { Whatsapp } from 'measurement-kit' + +export const renderSummary = (measurements, {React, Cli, Components, chalk}) => { + const summary = measurements[0].summary + + // When this function is called from the Cli the Cli will be set, when it's + // called from the Desktop app we have React set instead. + if (Cli) { + if (summary.whatsappEndpointsBlocked === true) { + Cli.log(Cli.output.notok('Whatapp is blocked')) + } else { + Cli.log(Cli.output.ok('Whatapp is not blocked')) + } + + if (summary.whatsappWebBlocked === true) { + Cli.log(Cli.output.notok('Whatapp Web is blocked')) + } else { + Cli.log(Cli.output.ok('Whatapp Web is not blocked')) + } + + if (summary.registrationServerBlocked === true) { + Cli.log(Cli.output.notok('Registration server is blocked')) + } else { + Cli.log(Cli.output.ok('Registration server is not blocked')) + } + } else if (React) { + // XXX this is broken currently as it depends on react + } +} + +export const renderHelp = () => { +} + +export const makeSummary = ({test_keys}) => ({ + whatsappEndpointsBlocked: test_keys.whatsapp_endpoints_status === 'blocked', + whatsappWebBlocked: test_keys.whatsapp_web_status === 'blocked', + registrationServerBlocked: test_keys.registration_server_status === 'blocked' +}) + +export const run = ({ooni, argv}) => { + const whatsapp = Whatsapp(ooni.mkOptions) + ooni.init(whatsapp) + + whatsapp.on('begin', () => ooni.onProgress(0.0, 'starting whatsapp')) + whatsapp.on('progress', (percent, message) => { + ooni.onProgress(percent, message) + }) + return ooni.run(whatsapp.run) +} diff --git a/src/nettests/whatsapp/package.json b/src/nettests/whatsapp/package.json new file mode 100644 index 0000000..1361c94 --- /dev/null +++ b/src/nettests/whatsapp/package.json @@ -0,0 +1,9 @@ + +{ + "name": "ooni-whatsapp", + "version": "0.3.0", + "description": "Official OONI test for running WhatsApp", + "dependencies": { + "measurement-kit": "0.1.0" + } +} diff --git a/src/ooni.js b/src/ooni.js index 9286b83..3df9cd5 100644 --- a/src/ooni.js +++ b/src/ooni.js @@ -16,17 +16,22 @@ import { writeToConfigFile } from './config/config-files' +import { enableIpc } from './config/ipc' + +const debug = require('debug')('ooni') + const OONI_DIR = getOoniDir() const OONI_CONFIG_PATH = getConfigFilePath() const main = async (argv_) => { const argv = mri(argv_, { - boolean: ['help', 'version', 'verbose'], + boolean: ['help', 'version', 'verbose', 'ipc'], string: [], alias: { help: 'h' } }) + debug(argv) let subcommand = argv._[2] @@ -132,8 +137,20 @@ const main = async (argv_) => { } } + if (argv.ipc) { + try { + debug('enabling IPC') + enableIpc() + } catch(err) { + console.error(error('An error occurred while starting IPC subsystem ' + + `ooni config file in "${OONI_CONFIG_PATH}"` + err.message + )) + return 1 + } + } + const ctx = { - argv: argv_ + argv: argv._ } if (subcommand === 'help' && argv._[3]) { diff --git a/yarn.lock b/yarn.lock index a858d31..806a4d4 100644 --- a/yarn.lock +++ b/yarn.lock @@ -7,8 +7,8 @@ resolved "https://registry.yarnpkg.com/@types/geojson/-/geojson-1.0.6.tgz#3e02972728c69248c2af08d60a48cbb8680fffdf" "@types/node@*": - version "8.0.48" - resolved "https://registry.yarnpkg.com/@types/node/-/node-8.0.48.tgz#4e7da6e849d9e50be5865effaa55b1870ae4eede" + version "9.3.0" + resolved "https://registry.yarnpkg.com/@types/node/-/node-9.3.0.tgz#3a129cda7c4e5df2409702626892cb4b96546dd5" abbrev@1: version "1.1.1" @@ -29,12 +29,12 @@ acorn@^4.0.3: resolved "https://registry.yarnpkg.com/acorn/-/acorn-4.0.13.tgz#105495ae5361d697bd195c825192e1ad7f253787" acorn@^5.0.0: - version "5.1.2" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.1.2.tgz#911cb53e036807cf0fa778dc5d370fbd864246d7" + version "5.3.0" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.3.0.tgz#7446d39459c54fb49a80e6ee6478149b940ec822" ajv-keywords@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-2.1.0.tgz#a296e17f7bfae7c1ce4f7e0de53d29cb32162df0" + 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" @@ -43,24 +43,15 @@ ajv@^4.9.1: co "^4.6.0" json-stable-stringify "^1.0.1" -ajv@^5.1.0: - version "5.3.0" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-5.3.0.tgz#4414ff74a50879c208ee5fdc826e32c303549eda" +ajv@^5.1.0, ajv@^5.1.5: + version "5.5.2" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-5.5.2.tgz#73b5eeca3fab653e3d3f9422b341ad42205dc965" dependencies: co "^4.6.0" fast-deep-equal "^1.0.0" fast-json-stable-stringify "^2.0.0" json-schema-traverse "^0.3.0" -ajv@^5.1.5: - version "5.2.3" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-5.2.3.tgz#c06f598778c44c6b161abafe3466b81ad1814ed2" - dependencies: - co "^4.6.0" - fast-deep-equal "^1.0.0" - json-schema-traverse "^0.3.0" - json-stable-stringify "^1.0.1" - align-text@^0.1.1, align-text@^0.1.3: version "0.1.4" resolved "https://registry.yarnpkg.com/align-text/-/align-text-0.1.4.tgz#0cd90a561093f35d0a99256c22b7069433fad117" @@ -106,7 +97,7 @@ anymatch@^1.3.0: micromatch "^2.1.5" normalize-path "^2.0.0" -aproba@^1.0.3: +aproba@^1.0.3, aproba@^1.1.1: version "1.2.0" resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a" @@ -141,9 +132,13 @@ array-unique@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.2.1.tgz#a1d97ccafcbc2625cc70fadceb36a50c58b01a53" +arrify@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" + asn1.js@^4.0.0: - version "4.9.1" - resolved "https://registry.yarnpkg.com/asn1.js/-/asn1.js-4.9.1.tgz#48ba240b45a9280e94748990ba597d216617fd40" + version "4.9.2" + resolved "https://registry.yarnpkg.com/asn1.js/-/asn1.js-4.9.2.tgz#8117ef4f7ed87cd8f89044b5bff97ac243a16c9a" dependencies: bn.js "^4.0.0" inherits "^2.0.1" @@ -176,8 +171,8 @@ async-each@^1.0.0: resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.1.tgz#19d386a1d9edc6e7c1c85d388aedbcc56d33602d" async@^2.1.2: - version "2.5.0" - resolved "https://registry.yarnpkg.com/async/-/async-2.5.0.tgz#843190fd6b7357a0b9e1c956edddd5ec8462b54d" + version "2.6.0" + resolved "https://registry.yarnpkg.com/async/-/async-2.6.0.tgz#61a29abb6fcc026fea77e56d1c6ec53a795951f4" dependencies: lodash "^4.14.0" @@ -197,6 +192,13 @@ aws4@^1.2.1, aws4@^1.6.0: version "1.6.0" resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.6.0.tgz#83ef5ca860b2b32e4a0deedee8c771b9db57471e" +axios@^0.17.1: + version "0.17.1" + resolved "https://registry.yarnpkg.com/axios/-/axios-0.17.1.tgz#2d8e3e5d0bdbd7327f91bc814f5c57660f81824d" + dependencies: + follow-redirects "^1.2.5" + is-buffer "^1.1.5" + 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" @@ -640,8 +642,8 @@ big.js@^3.1.3: resolved "https://registry.yarnpkg.com/big.js/-/big.js-3.2.0.tgz#a5fc298b81b9e0dca2e458824784b65c52ba588e" binary-extensions@^1.0.0: - version "1.10.0" - resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.10.0.tgz#9aeb9a6c5e88638aad171e167f5900abe24835d0" + version "1.11.0" + resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.11.0.tgz#46aa1751fb6a2f93ee5e689bb1087d4b14c6c205" bindings@^1.2.1, bindings@^1.3.0: version "1.3.0" @@ -653,11 +655,7 @@ block-stream@*: dependencies: inherits "~2.0.0" -bluebird@^2.10.2: - version "2.11.0" - resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-2.11.0.tgz#534b9033c022c9579c56ba3b3e5a5caafbb650e1" - -bluebird@^3.4.6: +bluebird@^3.4.6, bluebird@^3.5.0: version "3.5.1" resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.5.1.tgz#d9551f9de98f1fcda1e683d17ee91a0602ee2eb9" @@ -703,8 +701,8 @@ brorand@^1.0.1: resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f" browserify-aes@^1.0.0, browserify-aes@^1.0.4: - version "1.0.8" - resolved "https://registry.yarnpkg.com/browserify-aes/-/browserify-aes-1.0.8.tgz#c8fa3b1b7585bb7ba77c5560b60996ddec6d5309" + version "1.1.1" + resolved "https://registry.yarnpkg.com/browserify-aes/-/browserify-aes-1.1.1.tgz#38b7ab55edb806ff2dcda1a7f1620773a477c49f" dependencies: buffer-xor "^1.0.3" cipher-base "^1.0.0" @@ -748,11 +746,11 @@ browserify-sign@^4.0.0: inherits "^2.0.1" parse-asn1 "^5.0.0" -browserify-zlib@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/browserify-zlib/-/browserify-zlib-0.1.4.tgz#bb35f8a519f600e0fa6b8485241c979d0141fb2d" +browserify-zlib@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/browserify-zlib/-/browserify-zlib-0.2.0.tgz#2869459d9aa3be245fe8fe2ca1f46e2e7f54d73f" dependencies: - pako "~0.2.0" + pako "~1.0.5" buffer-xor@^1.0.3: version "1.0.3" @@ -782,6 +780,24 @@ byline@5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/byline/-/byline-5.0.0.tgz#741c5216468eadc457b03410118ad77de8c1ddb1" +cacache@^10.0.1: + version "10.0.2" + resolved "https://registry.yarnpkg.com/cacache/-/cacache-10.0.2.tgz#105a93a162bbedf3a25da42e1939ed99ffb145f8" + dependencies: + bluebird "^3.5.0" + chownr "^1.0.1" + glob "^7.1.2" + graceful-fs "^4.1.11" + lru-cache "^4.1.1" + mississippi "^1.3.0" + mkdirp "^0.5.1" + move-concurrently "^1.0.1" + promise-inflight "^1.0.1" + rimraf "^2.6.1" + ssri "^5.0.0" + unique-filename "^1.1.0" + y18n "^3.2.1" + camelcase@^1.0.2: version "1.2.1" resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-1.2.1.tgz#9bb5304d2e0b56698b2c758b08a3eaa9daa58a39" @@ -801,7 +817,7 @@ center-align@^0.1.1: align-text "^0.1.3" lazy-cache "^1.0.3" -chalk@2.1.0, chalk@^2.0.0, chalk@^2.1.0: +chalk@2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.1.0.tgz#ac5becf14fa21b99c6c92ca7a7d7cfd5b17e743e" dependencies: @@ -819,6 +835,18 @@ chalk@^1.0.0, chalk@^1.1.1, chalk@^1.1.3: strip-ansi "^3.0.0" supports-color "^2.0.0" +chalk@^2.0.0, chalk@^2.1.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.3.0.tgz#b5ea48efc9c1793dccc9b4767c93914d3f2d52ba" + dependencies: + ansi-styles "^3.1.0" + escape-string-regexp "^1.0.5" + supports-color "^4.0.0" + +chardet@^0.4.0: + version "0.4.2" + resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.4.2.tgz#b5473b33dc97c424e5d98dc87d55d4d8a29c8bf2" + child-process-promise@^2.2.1: version "2.2.1" resolved "https://registry.yarnpkg.com/child-process-promise/-/child-process-promise-2.2.1.tgz#4730a11ef610fad450b8f223c79d31d7bdad8074" @@ -842,6 +870,10 @@ chokidar@^1.7.0: optionalDependencies: fsevents "^1.0.0" +chownr@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.0.1.tgz#e2a75042a9551908bebd25b8523d5f9769d79181" + cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3: version "1.0.4" resolved "https://registry.yarnpkg.com/cipher-base/-/cipher-base-1.0.4.tgz#8760e4ecc272f4c363532f926d874aae2c1397de" @@ -856,8 +888,8 @@ cli-cursor@^2.1.0: restore-cursor "^2.0.0" cli-spinners@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-1.0.1.tgz#2675321c100f195b02877ac499e9911fa34b9783" + version "1.1.0" + resolved "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-1.1.0.tgz#f1847b168844d917a671eb9d147e3df497c90d06" cli-width@^2.0.0: version "2.2.0" @@ -880,8 +912,8 @@ cliui@^3.2.0: wrap-ansi "^2.0.0" cls-bluebird@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/cls-bluebird/-/cls-bluebird-2.0.1.tgz#c259a480ae02c0e506134307bb13db30446ee2e7" + version "2.1.0" + resolved "https://registry.yarnpkg.com/cls-bluebird/-/cls-bluebird-2.1.0.tgz#37ef1e080a8ffb55c2f4164f536f1919e7968aee" dependencies: is-bluebird "^1.0.2" shimmer "^1.1.0" @@ -895,8 +927,8 @@ code-point-at@^1.0.0: resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77" color-convert@^1.9.0: - version "1.9.0" - resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.0.tgz#1accf97dd739b983bf994d56fec8f95853641b7a" + version "1.9.1" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.1.tgz#c1261107aeb2f294ebffec9ed9ecad529a6097ed" dependencies: color-name "^1.1.1" @@ -922,6 +954,14 @@ 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.5.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.0.tgz#0aac662fd52be78964d5532f694784e70110acf7" + dependencies: + inherits "^2.0.3" + readable-stream "^2.2.2" + typedarray "^0.0.6" + console-browserify@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/console-browserify/-/console-browserify-1.1.0.tgz#f0241c45730a9fc6323b206dbf38edc741d0bb10" @@ -937,25 +977,38 @@ constants-browserify@^1.0.0: resolved "https://registry.yarnpkg.com/constants-browserify/-/constants-browserify-1.0.0.tgz#c20b96d8c617748aaf1c16021760cd27fcb8cb75" convert-source-map@^1.5.0: - version "1.5.0" - resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.5.0.tgz#9acd70851c6d5dfdd93d9282e5edf94a03ff46b5" + version "1.5.1" + resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.5.1.tgz#b8278097b9bc229365de5c62cf5fcaed8b5599e5" + +copy-concurrently@^1.0.0: + version "1.0.5" + resolved "https://registry.yarnpkg.com/copy-concurrently/-/copy-concurrently-1.0.5.tgz#92297398cae34937fcafd6ec8139c18051f0b5e0" + dependencies: + aproba "^1.1.1" + fs-write-stream-atomic "^1.0.8" + iferr "^0.1.5" + mkdirp "^0.5.1" + rimraf "^2.5.4" + run-queue "^1.0.0" copy-webpack-plugin@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/copy-webpack-plugin/-/copy-webpack-plugin-4.1.0.tgz#292a040318fe8ae3b1d7996ef05dfb483eb0b647" + version "4.3.1" + resolved "https://registry.yarnpkg.com/copy-webpack-plugin/-/copy-webpack-plugin-4.3.1.tgz#19ba6370bf6f8e263cbd66185a2b79f2321a9302" dependencies: - bluebird "^2.10.2" - fs-extra "^0.26.4" - glob "^6.0.4" - is-glob "^3.1.0" + cacache "^10.0.1" + find-cache-dir "^1.0.0" + globby "^7.1.1" + is-glob "^4.0.0" loader-utils "^0.2.15" lodash "^4.3.0" - minimatch "^3.0.0" - node-dir "^0.1.10" + minimatch "^3.0.4" + p-limit "^1.0.0" + pify "^3.0.0" + serialize-javascript "^1.4.0" core-js@^2.4.0, core-js@^2.5.0: - version "2.5.1" - resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.5.1.tgz#ae6874dc66937789b80754ff5428df66819ca50b" + version "2.5.3" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.5.3.tgz#8acc38345824f16d8365b7c9b4259168e8ed603e" core-util-is@1.0.2, core-util-is@~1.0.0: version "1.0.2" @@ -1016,8 +1069,8 @@ cryptiles@3.x.x: boom "5.x.x" crypto-browserify@^3.11.0: - version "3.11.1" - resolved "https://registry.yarnpkg.com/crypto-browserify/-/crypto-browserify-3.11.1.tgz#948945efc6757a400d6e5e5af47194d10064279f" + version "3.12.0" + resolved "https://registry.yarnpkg.com/crypto-browserify/-/crypto-browserify-3.12.0.tgz#396cf9f3137f03e4b8e532c58f698254e00f80ec" dependencies: browserify-cipher "^1.0.0" browserify-sign "^4.0.0" @@ -1029,6 +1082,11 @@ crypto-browserify@^3.11.0: pbkdf2 "^3.0.3" public-encrypt "^4.0.0" randombytes "^2.0.0" + randomfill "^1.0.3" + +cyclist@~0.2.2: + version "0.2.2" + resolved "https://registry.yarnpkg.com/cyclist/-/cyclist-0.2.2.tgz#1b33792e11e914a2fd6d6ed6447464444e5fa640" d@1: version "1.0.0" @@ -1102,8 +1160,8 @@ detect-indent@^4.0.0: repeating "^2.0.0" detect-libc@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-1.0.2.tgz#71ad5d204bf17a6a6ca8f450c61454066ef461e1" + version "1.0.3" + resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-1.0.3.tgz#fa137c4bd698edf55cd5cd02ac559f91a4c4ba9b" diffie-hellman@^5.0.0: version "5.0.2" @@ -1113,6 +1171,13 @@ diffie-hellman@^5.0.0: miller-rabin "^4.0.0" randombytes "^2.0.0" +dir-glob@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-2.0.0.tgz#0b205d2b6aef98238ca286598a8204d29d0a0034" + dependencies: + arrify "^1.0.1" + path-type "^3.0.0" + domain-browser@^1.1.1: version "1.1.7" resolved "https://registry.yarnpkg.com/domain-browser/-/domain-browser-1.1.7.tgz#867aa4b093faa05f1de08c06f4d7b21fdf8698bc" @@ -1121,6 +1186,15 @@ dottie@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/dottie/-/dottie-2.0.0.tgz#da191981c8b8d713ca0115d5898cf397c2f0ddd0" +duplexify@^3.4.2, duplexify@^3.5.3: + version "3.5.3" + resolved "https://registry.yarnpkg.com/duplexify/-/duplexify-3.5.3.tgz#8b5818800df92fd0125b27ab896491912858243e" + dependencies: + end-of-stream "^1.0.0" + inherits "^2.0.1" + readable-stream "^2.0.0" + stream-shift "^1.0.0" + ecc-jsbn@~0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz#0fc73a9ed5f0d53c38193398523ef7e543777505" @@ -1143,6 +1217,12 @@ emojis-list@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-2.1.0.tgz#4daa4d9db00f9819880c79fa457ae5b09a1fd389" +end-of-stream@^1.0.0, end-of-stream@^1.1.0: + version "1.4.1" + resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.1.tgz#ed29634d19baba463b6ce6b80a37213eab71ec43" + dependencies: + once "^1.4.0" + enhanced-resolve@^3.4.0: version "3.4.1" resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-3.4.1.tgz#0421e339fd71419b3da13d129b3979040230476e" @@ -1153,10 +1233,10 @@ enhanced-resolve@^3.4.0: tapable "^0.2.7" errno@^0.1.3: - version "0.1.4" - resolved "https://registry.yarnpkg.com/errno/-/errno-0.1.4.tgz#b896e23a9e5e8ba33871fc996abd3635fc9a1c7d" + version "0.1.6" + resolved "https://registry.yarnpkg.com/errno/-/errno-0.1.6.tgz#c386ce8a6283f14fc09563b71560908c9bf53026" dependencies: - prr "~0.0.0" + prr "~1.0.1" error-ex@^1.2.0: version "1.3.1" @@ -1164,20 +1244,20 @@ error-ex@^1.2.0: dependencies: is-arrayish "^0.2.1" -es5-ext@^0.10.14, es5-ext@^0.10.9, es5-ext@~0.10.14: - version "0.10.30" - resolved "https://registry.yarnpkg.com/es5-ext/-/es5-ext-0.10.30.tgz#7141a16836697dbabfaaaeee41495ce29f52c939" +es5-ext@^0.10.14, es5-ext@^0.10.35, es5-ext@^0.10.9, es5-ext@~0.10.14: + version "0.10.37" + resolved "https://registry.yarnpkg.com/es5-ext/-/es5-ext-0.10.37.tgz#0ee741d148b80069ba27d020393756af257defc3" dependencies: - es6-iterator "2" - es6-symbol "~3.1" + es6-iterator "~2.0.1" + es6-symbol "~3.1.1" -es6-iterator@2, es6-iterator@^2.0.1, es6-iterator@~2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/es6-iterator/-/es6-iterator-2.0.1.tgz#8e319c9f0453bf575d374940a655920e59ca5512" +es6-iterator@^2.0.1, es6-iterator@~2.0.1: + version "2.0.3" + resolved "https://registry.yarnpkg.com/es6-iterator/-/es6-iterator-2.0.3.tgz#a7de889141a05a94b0854403b2d0a0fbfa98f3b7" dependencies: d "1" - es5-ext "^0.10.14" - es6-symbol "^3.1" + es5-ext "^0.10.35" + es6-symbol "^3.1.1" es6-map@^0.1.3: version "0.1.5" @@ -1200,7 +1280,7 @@ es6-set@~0.1.5: es6-symbol "3.1.1" event-emitter "~0.3.5" -es6-symbol@3.1.1, es6-symbol@^3.1, es6-symbol@^3.1.1, es6-symbol@~3.1, es6-symbol@~3.1.1: +es6-symbol@3.1.1, es6-symbol@^3.1.1, es6-symbol@~3.1.1: version "3.1.1" resolved "https://registry.yarnpkg.com/es6-symbol/-/es6-symbol-3.1.1.tgz#bf00ef4fdab6ba1b46ecb7b629b4c7ed5715cc77" dependencies: @@ -1314,11 +1394,11 @@ extend@~3.0.0, extend@~3.0.1: resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.1.tgz#a755ea7bc1adfcc5a31ce7e762dbaadc5e636444" external-editor@^2.0.4: - version "2.0.5" - resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-2.0.5.tgz#52c249a3981b9ba187c7cacf5beb50bf1d91a6bc" + version "2.1.0" + resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-2.1.0.tgz#3d026a21b7f95b5726387d4200ac160d372c3b48" dependencies: + chardet "^0.4.0" iconv-lite "^0.4.17" - jschardet "^1.4.2" tmp "^0.0.33" extglob@^0.3.1: @@ -1327,10 +1407,14 @@ extglob@^0.3.1: dependencies: is-extglob "^1.0.0" -extsprintf@1.3.0, extsprintf@^1.2.0: +extsprintf@1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05" +extsprintf@^1.2.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.4.0.tgz#e2689f8f356fad62cca65a3a91c5df5f9551692f" + 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" @@ -1378,16 +1462,29 @@ find-up@^2.0.0, find-up@^2.1.0: locate-path "^2.0.0" flow-babel-webpack-plugin@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/flow-babel-webpack-plugin/-/flow-babel-webpack-plugin-1.1.0.tgz#a8dfa7430fc88d18d7d28acc96edf0e2a2329510" + version "1.1.1" + resolved "https://registry.yarnpkg.com/flow-babel-webpack-plugin/-/flow-babel-webpack-plugin-1.1.1.tgz#7dd41110b96045eab8d8af6df48883310de54e91" dependencies: babel-plugin-transform-flow-comments "^6.17.0" flow-bin ">=0.44.2 <1" lodash.merge "^4.6.0" "flow-bin@>=0.44.2 <1": - version "0.56.0" - resolved "https://registry.yarnpkg.com/flow-bin/-/flow-bin-0.56.0.tgz#ce43092203a344ba9bf63c0cabe95d95145f6cad" + version "0.63.1" + resolved "https://registry.yarnpkg.com/flow-bin/-/flow-bin-0.63.1.tgz#ab00067c197169a5fb5b4996c8f6927b06694828" + +flush-write-stream@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/flush-write-stream/-/flush-write-stream-1.0.2.tgz#c81b90d8746766f1a609a46809946c45dd8ae417" + dependencies: + inherits "^2.0.1" + readable-stream "^2.0.4" + +follow-redirects@^1.2.5: + version "1.3.0" + resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.3.0.tgz#f684871fc116d2e329fda55ef67687f4fabc905c" + dependencies: + debug "^3.1.0" for-in@^1.0.1: version "1.0.2" @@ -1419,6 +1516,13 @@ form-data@~2.3.1: combined-stream "^1.0.5" mime-types "^2.1.12" +from2@^2.1.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/from2/-/from2-2.3.0.tgz#8bfb5502bde4a4d36cfdeea007fcca21d7e382af" + dependencies: + inherits "^2.0.1" + readable-stream "^2.0.0" + fs-extra@4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-4.0.1.tgz#7fc0c6c8957f983f57f306a24e5b9ddd8d0dd880" @@ -1427,34 +1531,33 @@ fs-extra@4.0.1: jsonfile "^3.0.0" universalify "^0.1.0" -fs-extra@^0.26.4: - version "0.26.7" - resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-0.26.7.tgz#9ae1fdd94897798edab76d0918cf42d0c3184fa9" - dependencies: - graceful-fs "^4.1.2" - jsonfile "^2.1.0" - klaw "^1.0.0" - path-is-absolute "^1.0.0" - rimraf "^2.2.8" - fs-extra@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-4.0.2.tgz#f91704c53d1b461f893452b0c307d9997647ab6b" + version "4.0.3" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-4.0.3.tgz#0d852122e5bc5beb453fb028e9c0c9bf36340c94" dependencies: graceful-fs "^4.1.2" jsonfile "^4.0.0" universalify "^0.1.0" +fs-write-stream-atomic@^1.0.8: + version "1.0.10" + resolved "https://registry.yarnpkg.com/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz#b47df53493ef911df75731e70a9ded0189db40c9" + dependencies: + graceful-fs "^4.1.2" + iferr "^0.1.5" + imurmurhash "^0.1.4" + readable-stream "1 || 2" + fs.realpath@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" fsevents@^1.0.0: - version "1.1.2" - resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.1.2.tgz#3282b713fb3ad80ede0e9fcf4611b5aa6fc033f4" + version "1.1.3" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.1.3.tgz#11f82318f5fe7bb2cd22965a108e9306208216d8" dependencies: nan "^2.3.0" - node-pre-gyp "^0.6.36" + node-pre-gyp "^0.6.39" fstream-ignore@^1.0.5: version "1.0.5" @@ -1487,8 +1590,8 @@ gauge@~2.7.3: wide-align "^1.1.0" generic-pool@^3.1.8: - version "3.2.0" - resolved "https://registry.yarnpkg.com/generic-pool/-/generic-pool-3.2.0.tgz#c1d485ecbd6f18c0513d4741d098a6715eaeeca8" + version "3.4.0" + resolved "https://registry.yarnpkg.com/generic-pool/-/generic-pool-3.4.0.tgz#6b76fc201bb49a0ff381450f585352378fb1c08f" get-caller-file@^1.0.1: version "1.0.2" @@ -1517,17 +1620,7 @@ glob-parent@^2.0.0: dependencies: is-glob "^2.0.0" -glob@^6.0.4: - version "6.0.4" - resolved "https://registry.yarnpkg.com/glob/-/glob-6.0.4.tgz#0f08860f6a155127b2fadd4f9ce24b1aab6e4d22" - dependencies: - inflight "^1.0.4" - inherits "2" - minimatch "2 || 3" - once "^1.3.0" - path-is-absolute "^1.0.0" - -glob@^7.0.3, glob@^7.0.5: +glob@^7.0.3, glob@^7.0.5, glob@^7.1.2: version "7.1.2" resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.2.tgz#c19c9df9a028702d678612384a6552404c636d15" dependencies: @@ -1552,7 +1645,18 @@ globby@6.1.0: pify "^2.0.0" pinkie-promise "^2.0.0" -graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.1.9: +globby@^7.1.1: + version "7.1.1" + resolved "https://registry.yarnpkg.com/globby/-/globby-7.1.1.tgz#fb2ccff9401f8600945dfada97440cca972b8680" + dependencies: + array-union "^1.0.1" + dir-glob "^2.0.0" + glob "^7.1.2" + ignore "^3.3.5" + pify "^3.0.0" + slash "^1.0.0" + +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" @@ -1673,9 +1777,9 @@ http-signature@~1.2.0: jsprim "^1.2.2" sshpk "^1.7.0" -https-browserify@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/https-browserify/-/https-browserify-0.0.1.tgz#3f91365cabe60b77ed0ebba24b454e3e09d95a82" +https-browserify@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/https-browserify/-/https-browserify-1.0.0.tgz#ec06c10e0a34c0f2faf199f7fd7fc78fffd03c73" humanize@^0.0.9: version "0.0.9" @@ -1689,6 +1793,18 @@ ieee754@^1.1.4: version "1.1.8" resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.1.8.tgz#be33d40ac10ef1926701f6f08a2d86fbfd1ad3e4" +iferr@^0.1.5: + version "0.1.5" + resolved "https://registry.yarnpkg.com/iferr/-/iferr-0.1.5.tgz#c60eed69e6d8fdb6b3104a1fcbca1c192dc5b501" + +ignore@^3.3.5: + version "3.3.7" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-3.3.7.tgz#612289bfb3c220e186a58118618d5be8c1bab021" + +imurmurhash@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" + in-publish@2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/in-publish/-/in-publish-2.0.0.tgz#e20ff5e3a2afc2690320b6dc552682a9c7fadf51" @@ -1717,8 +1833,8 @@ inherits@2.0.1: resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.1.tgz#b17d08d326b4423e568eff719f91b0b1cbdf69f1" ini@~1.3.0: - version "1.3.4" - resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.4.tgz#0537cb79daf59b59a1a517dff706c86ec039162e" + version "1.3.5" + resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.5.tgz#eee25f56db1c9ec6085e0c22778083f596abf927" inquirer@^3.3.0: version "3.3.0" @@ -1740,8 +1856,8 @@ inquirer@^3.3.0: through "^2.3.6" interpret@^1.0.0: - version "1.0.4" - resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.0.4.tgz#820cdd588b868ffb191a809506d6c9c8f212b1b0" + version "1.1.0" + resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.1.0.tgz#7ed1b1410c6a0e0f78cf95d3b8440c63f78b8614" invariant@^2.2.2: version "2.2.2" @@ -1753,11 +1869,11 @@ invert-kv@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-1.0.0.tgz#104a8e4aaca6d3d8cd157a8ef8bfab2d7a3ffdb6" -is-accessor-descriptor@^0.1.6: - version "0.1.6" - resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz#a9e12cb3ae8d876727eeef3843f8a0897b5c98d6" +is-accessor-descriptor@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz#169c2f6d3df1f992618072365c9b0ea1f6878656" dependencies: - kind-of "^3.0.2" + kind-of "^6.0.0" is-arrayish@^0.2.1: version "0.2.1" @@ -1774,8 +1890,8 @@ is-bluebird@^1.0.2: resolved "https://registry.yarnpkg.com/is-bluebird/-/is-bluebird-1.0.2.tgz#096439060f4aa411abee19143a84d6a55346d6e2" is-buffer@^1.1.5: - version "1.1.5" - resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.5.tgz#1f3b26ef613b214b88cbca23cc6c01d87961eecc" + version "1.1.6" + resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" is-builtin-module@^1.0.0: version "1.0.0" @@ -1783,19 +1899,19 @@ is-builtin-module@^1.0.0: dependencies: builtin-modules "^1.0.0" -is-data-descriptor@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz#0b5ee648388e2c860282e793f1856fec3f301b56" +is-data-descriptor@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz#d84876321d0e7add03990406abbbbd36ba9268c7" dependencies: - kind-of "^3.0.2" + kind-of "^6.0.0" is-descriptor@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-1.0.1.tgz#2c6023599bde2de9d5d2c8b9a9d94082036b6ef2" + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-1.0.2.tgz#3b159746a66604b04f8c81524ba365c5f14d86ec" dependencies: - is-accessor-descriptor "^0.1.6" - is-data-descriptor "^0.1.4" - kind-of "^5.0.0" + is-accessor-descriptor "^1.0.0" + is-data-descriptor "^1.0.0" + kind-of "^6.0.2" is-dotfile@^1.0.0: version "1.0.3" @@ -1815,7 +1931,7 @@ is-extglob@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-1.0.0.tgz#ac468177c4943405a092fc8f29760c6ffc6206c0" -is-extglob@^2.1.0: +is-extglob@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" @@ -1841,11 +1957,11 @@ is-glob@^2.0.0, is-glob@^2.0.1: dependencies: is-extglob "^1.0.0" -is-glob@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-3.1.0.tgz#7ba5ae24217804ac70707b96922567486cc3e84a" +is-glob@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.0.tgz#9521c76845cc2610a85203ddf080a958c2ffabc0" dependencies: - is-extglob "^2.1.0" + is-extglob "^2.1.1" is-number@^2.1.0: version "2.1.0" @@ -1905,10 +2021,6 @@ jsbn@~0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" -jschardet@^1.4.2: - version "1.5.1" - resolved "https://registry.yarnpkg.com/jschardet/-/jschardet-1.5.1.tgz#c519f629f86b3a5bedba58a88d311309eec097f9" - jsesc@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-1.3.0.tgz#46c3fec8c1892b12b0833db9bc7622176dbab34b" @@ -1943,12 +2055,6 @@ json5@^0.5.0, json5@^0.5.1: version "0.5.1" resolved "https://registry.yarnpkg.com/json5/-/json5-0.5.1.tgz#1eade7acc012034ad84e2396767ead9fa5495821" -jsonfile@^2.1.0: - version "2.4.0" - resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-2.4.0.tgz#3736a2b428b87bbda0cc83b53fa3d633a35c2ae8" - optionalDependencies: - graceful-fs "^4.1.6" - jsonfile@^3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-3.0.1.tgz#a5ecc6f65f53f662c4415c7675a0331d0992ec66" @@ -1990,15 +2096,9 @@ kind-of@^4.0.0: dependencies: is-buffer "^1.1.5" -kind-of@^5.0.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-5.1.0.tgz#729c91e2d857b7a419a1f9aa65685c4c33f5845d" - -klaw@^1.0.0: - version "1.3.1" - resolved "https://registry.yarnpkg.com/klaw/-/klaw-1.3.1.tgz#4088433b46b3b1ba259d78785d8e96f73ba02439" - optionalDependencies: - graceful-fs "^4.1.9" +kind-of@^6.0.0, kind-of@^6.0.2: + version "6.0.2" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.2.tgz#01146b36a6218e64e58f3a8d66de5d7fc6f6d051" lazy-cache@^1.0.3: version "1.0.4" @@ -2082,7 +2182,7 @@ loose-envify@^1.0.0: dependencies: js-tokens "^3.0.0" -lru-cache@^4.0.1: +lru-cache@^4.0.1, lru-cache@^4.1.1: version "4.1.1" resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.1.tgz#622e32e82488b49279114a4f9ecf45e7cd6bba55" dependencies: @@ -2090,10 +2190,10 @@ lru-cache@^4.0.1: yallist "^2.1.2" make-dir@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-1.0.0.tgz#97a011751e91dd87cfadef58832ebb04936de978" + version "1.1.0" + resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-1.1.0.tgz#19b4369fe48c116f53c2af95ad102c0e39e85d51" dependencies: - pify "^2.3.0" + pify "^3.0.0" md5.js@^1.3.4: version "1.3.4" @@ -2102,9 +2202,9 @@ md5.js@^1.3.4: hash-base "^3.0.0" inherits "^2.0.1" -measurement-kit@^0.1.0-alpha.5: - version "0.1.0-alpha.5" - resolved "https://registry.yarnpkg.com/measurement-kit/-/measurement-kit-0.1.0-alpha.5.tgz#f0be2b3bb2e5dcf0aea40265837376a63ff79297" +measurement-kit@^0.1.0-alpha.8: + version "0.1.0-alpha.8" + resolved "https://registry.yarnpkg.com/measurement-kit/-/measurement-kit-0.1.0-alpha.8.tgz#27ac3040a08ecf0951084b449fed07680af988dd" dependencies: any-promise "^1.3.0" bindings "^1.3.0" @@ -2172,7 +2272,7 @@ minimalistic-crypto-utils@^1.0.0, minimalistic-crypto-utils@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a" -"minimatch@2 || 3", minimatch@^3.0.0, minimatch@^3.0.2, minimatch@^3.0.4: +minimatch@^3.0.0, minimatch@^3.0.2, minimatch@^3.0.4: version "3.0.4" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" dependencies: @@ -2186,6 +2286,21 @@ minimist@1.2.0, minimist@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284" +mississippi@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/mississippi/-/mississippi-1.3.0.tgz#d201583eb12327e3c5c1642a404a9cacf94e34f5" + dependencies: + concat-stream "^1.5.0" + duplexify "^3.4.2" + end-of-stream "^1.1.0" + flush-write-stream "^1.0.0" + from2 "^2.1.0" + parallel-transform "^1.1.0" + pump "^1.0.0" + pumpify "^1.3.3" + stream-each "^1.1.0" + through2 "^2.0.0" + "mkdirp@>=0.5 0", mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@~0.5.0: version "0.5.1" resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" @@ -2199,8 +2314,19 @@ moment-timezone@^0.5.4: moment ">= 2.9.0" "moment@>= 2.9.0", moment@^2.13.0, moment@^2.19.1: - version "2.19.1" - resolved "https://registry.yarnpkg.com/moment/-/moment-2.19.1.tgz#56da1a2d1cbf01d38b7e1afc31c10bcfa1929167" + version "2.20.1" + resolved "https://registry.yarnpkg.com/moment/-/moment-2.20.1.tgz#d6eb1a46cbcc14a2b2f9434112c1ff8907f313fd" + +move-concurrently@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/move-concurrently/-/move-concurrently-1.0.1.tgz#be2c005fda32e0b29af1f05d7c4b33214c701f92" + dependencies: + aproba "^1.1.1" + copy-concurrently "^1.0.0" + fs-write-stream-atomic "^1.0.8" + mkdirp "^0.5.1" + rimraf "^2.5.4" + run-queue "^1.0.3" mri@^1.1.0: version "1.1.0" @@ -2221,16 +2347,14 @@ mute-stream@0.0.7: version "0.0.7" resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.7.tgz#3075ce93bc21b8fab43e1bc4da7e8115ed1e7bab" -nan@^2.0.9, nan@^2.3.0, nan@^2.7.0, nan@~2.7.0: +nan@^2.0.9, nan@^2.3.0, nan@^2.7.0: + version "2.8.0" + resolved "https://registry.yarnpkg.com/nan/-/nan-2.8.0.tgz#ed715f3fe9de02b57a5e6252d90a96675e1f085a" + +nan@~2.7.0: version "2.7.0" resolved "https://registry.yarnpkg.com/nan/-/nan-2.7.0.tgz#d95bf721ec877e08db276ed3fc6eb78f9083ad46" -node-dir@^0.1.10: - version "0.1.17" - resolved "https://registry.yarnpkg.com/node-dir/-/node-dir-0.1.17.tgz#5f5665d93351335caabef8f1c554516cf5f1e4e5" - dependencies: - minimatch "^3.0.2" - node-gyp@^3.6.2: version "3.6.2" resolved "https://registry.yarnpkg.com/node-gyp/-/node-gyp-3.6.2.tgz#9bfbe54562286284838e750eac05295853fa1c60" @@ -2250,49 +2374,34 @@ node-gyp@^3.6.2: which "1" node-libs-browser@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/node-libs-browser/-/node-libs-browser-2.0.0.tgz#a3a59ec97024985b46e958379646f96c4b616646" + version "2.1.0" + resolved "https://registry.yarnpkg.com/node-libs-browser/-/node-libs-browser-2.1.0.tgz#5f94263d404f6e44767d726901fff05478d600df" dependencies: assert "^1.1.1" - browserify-zlib "^0.1.4" + browserify-zlib "^0.2.0" buffer "^4.3.0" console-browserify "^1.1.0" constants-browserify "^1.0.0" crypto-browserify "^3.11.0" domain-browser "^1.1.1" events "^1.0.0" - https-browserify "0.0.1" - os-browserify "^0.2.0" + https-browserify "^1.0.0" + os-browserify "^0.3.0" path-browserify "0.0.0" - process "^0.11.0" + process "^0.11.10" punycode "^1.2.4" querystring-es3 "^0.2.0" - readable-stream "^2.0.5" + readable-stream "^2.3.3" stream-browserify "^2.0.1" - stream-http "^2.3.1" - string_decoder "^0.10.25" - timers-browserify "^2.0.2" + stream-http "^2.7.2" + string_decoder "^1.0.0" + timers-browserify "^2.0.4" tty-browserify "0.0.0" url "^0.11.0" util "^0.10.3" vm-browserify "0.0.4" -node-pre-gyp@^0.6.36: - version "0.6.38" - resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.6.38.tgz#e92a20f83416415bb4086f6d1fb78b3da73d113d" - dependencies: - hawk "3.1.3" - mkdirp "^0.5.1" - nopt "^4.0.1" - npmlog "^4.0.2" - rc "^1.1.7" - request "2.81.0" - rimraf "^2.6.1" - semver "^5.3.0" - tar "^2.2.1" - tar-pack "^3.4.0" - -node-pre-gyp@~0.6.38: +node-pre-gyp@^0.6.39, node-pre-gyp@~0.6.38: version "0.6.39" resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.6.39.tgz#c00e96860b23c0e1420ac7befc5044e1d78d8649" dependencies: @@ -2374,7 +2483,7 @@ object.omit@^2.0.0: for-own "^0.1.4" is-extendable "^0.1.1" -once@^1.3.0, once@^1.3.3: +once@^1.3.0, once@^1.3.1, once@^1.3.3, once@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" dependencies: @@ -2406,9 +2515,9 @@ ora@^1.3.0: cli-spinners "^1.0.0" log-symbols "^1.0.2" -os-browserify@^0.2.0: - version "0.2.1" - resolved "https://registry.yarnpkg.com/os-browserify/-/os-browserify-0.2.1.tgz#63fc4ccee5d2d7763d26bbf8601078e6c2e0044f" +os-browserify@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/os-browserify/-/os-browserify-0.3.0.tgz#854373c7f5c2315914fc9bfc6bd8238fdda1ec27" os-homedir@^1.0.0: version "1.0.2" @@ -2437,9 +2546,11 @@ p-finally@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae" -p-limit@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-1.1.0.tgz#b07ff2d9a5d88bec806035895a2bab66a27988bc" +p-limit@^1.0.0, p-limit@^1.1.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-1.2.0.tgz#0e92b6bedcb59f022c13d0f1949dc82d15909f1c" + dependencies: + p-try "^1.0.0" p-locate@^2.0.0: version "2.0.0" @@ -2447,9 +2558,21 @@ p-locate@^2.0.0: dependencies: p-limit "^1.1.0" -pako@~0.2.0: - version "0.2.9" - resolved "https://registry.yarnpkg.com/pako/-/pako-0.2.9.tgz#f3f7522f4ef782348da8161bad9ecfd51bf83a75" +p-try@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/p-try/-/p-try-1.0.0.tgz#cbc79cdbaf8fd4228e13f621f2b1a237c1b207b3" + +pako@~1.0.5: + version "1.0.6" + resolved "https://registry.yarnpkg.com/pako/-/pako-1.0.6.tgz#0101211baa70c4bca4a0f63f2206e97b7dfaf258" + +parallel-transform@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/parallel-transform/-/parallel-transform-1.1.0.tgz#d410f065b05da23081fcd10f28854c29bda33b06" + dependencies: + cyclist "~0.2.2" + inherits "^2.0.3" + readable-stream "^2.1.5" parse-asn1@^5.0.0: version "5.1.0" @@ -2502,6 +2625,12 @@ path-type@^2.0.0: dependencies: pify "^2.0.0" +path-type@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/path-type/-/path-type-3.0.0.tgz#cef31dc8e0a1a3bb0d105c0cd97cf3bf47f4e36f" + dependencies: + pify "^3.0.0" + pbkdf2@^3.0.3: version "3.0.14" resolved "https://registry.yarnpkg.com/pbkdf2/-/pbkdf2-3.0.14.tgz#a35e13c64799b06ce15320f459c230e68e73bade" @@ -2520,10 +2649,14 @@ performance-now@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" -pify@^2.0.0, pify@^2.3.0: +pify@^2.0.0: version "2.3.0" resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" +pify@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/pify/-/pify-3.0.0.tgz#e5a4acd2c101fdf3d9a4d07f0dbc4db49dd28176" + pinkie-promise@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/pinkie-promise/-/pinkie-promise-2.0.1.tgz#2135d6dfa7a358c069ac9b178776288228450ffa" @@ -2540,9 +2673,9 @@ pkg-dir@^2.0.0: dependencies: find-up "^2.1.0" -pkg-fetch@2.3.10: - version "2.3.10" - resolved "https://registry.yarnpkg.com/pkg-fetch/-/pkg-fetch-2.3.10.tgz#1e81123c0c3b01731347e71afae3e05b1b4bc998" +pkg-fetch@2.3.11: + version "2.3.11" + resolved "https://registry.yarnpkg.com/pkg-fetch/-/pkg-fetch-2.3.11.tgz#f1a194d86f4a802403d0e644b59aefb3cec565be" dependencies: babel-runtime "6.25.0" byline "5.0.0" @@ -2558,8 +2691,8 @@ pkg-fetch@2.3.10: unique-temp-dir "1.0.0" pkg@^4.2.4: - version "4.2.4" - resolved "https://registry.yarnpkg.com/pkg/-/pkg-4.2.4.tgz#7781490f9339a8f5cc8eea737e94c37c4e8ed4c8" + version "4.2.6" + resolved "https://registry.yarnpkg.com/pkg/-/pkg-4.2.6.tgz#3e12f3b3202573d6efceb477629cf010ab1b9270" dependencies: acorn "5.1.1" babel-runtime "6.25.0" @@ -2567,10 +2700,9 @@ pkg@^4.2.4: escodegen "1.8.1" fs-extra "4.0.1" globby "6.1.0" - in-publish "2.0.0" minimist "1.2.0" multistream "2.1.0" - pkg-fetch "2.3.10" + pkg-fetch "2.3.11" progress "2.0.0" resolve "1.4.0" simple-bufferstream "1.0.0" @@ -2592,14 +2724,14 @@ prettyjson@^1.2.1: minimist "^1.2.0" private@^0.1.6, private@^0.1.7: - version "0.1.7" - resolved "https://registry.yarnpkg.com/private/-/private-0.1.7.tgz#68ce5e8a1ef0a23bb570cc28537b5332aba63ef1" + version "0.1.8" + resolved "https://registry.yarnpkg.com/private/-/private-0.1.8.tgz#2381edb3689f7a53d653190060fcf822d2f368ff" process-nextick-args@~1.0.6: version "1.0.7" resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-1.0.7.tgz#150e20b756590ad3f91093f25a4f2ad8bff30ba3" -process@^0.11.0: +process@^0.11.10: version "0.11.10" resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182" @@ -2607,13 +2739,17 @@ progress@2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.0.tgz#8a1be366bf8fc23db2bd23f10c6fe920b4389d1f" +promise-inflight@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/promise-inflight/-/promise-inflight-1.0.1.tgz#98472870bf228132fcbdd868129bad12c3c029e3" + promise-polyfill@^6.0.1: - version "6.0.2" - resolved "https://registry.yarnpkg.com/promise-polyfill/-/promise-polyfill-6.0.2.tgz#d9c86d3dc4dc2df9016e88946defd69b49b41162" + version "6.1.0" + resolved "https://registry.yarnpkg.com/promise-polyfill/-/promise-polyfill-6.1.0.tgz#dfa96943ea9c121fca4de9b5868cb39d3472e057" -prr@~0.0.0: - version "0.0.0" - resolved "https://registry.yarnpkg.com/prr/-/prr-0.0.0.tgz#1a84b85908325501411853d0081ee3fa86e2926a" +prr@~1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/prr/-/prr-1.0.1.tgz#d3fc114ba06995a45ec6893f484ceb1d78f5f476" pseudomap@^1.0.2: version "1.0.2" @@ -2629,6 +2765,28 @@ public-encrypt@^4.0.0: parse-asn1 "^5.0.0" randombytes "^2.0.1" +pump@^1.0.0: + version "1.0.3" + resolved "https://registry.yarnpkg.com/pump/-/pump-1.0.3.tgz#5dfe8311c33bbf6fc18261f9f34702c47c08a954" + dependencies: + end-of-stream "^1.1.0" + once "^1.3.1" + +pump@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/pump/-/pump-2.0.0.tgz#7946da1c8d622b098e2ceb2d3476582470829c9d" + dependencies: + end-of-stream "^1.1.0" + once "^1.3.1" + +pumpify@^1.3.3: + version "1.3.6" + resolved "https://registry.yarnpkg.com/pumpify/-/pumpify-1.3.6.tgz#00d40e5ded0a3bf1e0788b1c0cf426a42882ab64" + dependencies: + duplexify "^3.5.3" + inherits "^2.0.3" + pump "^2.0.0" + punycode@1.3.2: version "1.3.2" resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.3.2.tgz#9653a036fb7c1ee42342f2325cceefea3926c48d" @@ -2660,15 +2818,22 @@ randomatic@^1.1.3: is-number "^3.0.0" kind-of "^4.0.0" -randombytes@^2.0.0, randombytes@^2.0.1: - version "2.0.5" - resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.0.5.tgz#dc009a246b8d09a177b4b7a0ae77bc570f4b1b79" +randombytes@^2.0.0, randombytes@^2.0.1, randombytes@^2.0.5: + version "2.0.6" + resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.0.6.tgz#d302c522948588848a8d300c932b44c24231da80" + dependencies: + safe-buffer "^5.1.0" + +randomfill@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/randomfill/-/randomfill-1.0.3.tgz#b96b7df587f01dd91726c418f30553b1418e3d62" dependencies: + randombytes "^2.0.5" safe-buffer "^5.1.0" rc@^1.1.7: - version "1.2.1" - resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.1.tgz#2e03e8e42ee450b8cb3dce65be1bf8974e1dfd95" + version "1.2.3" + resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.3.tgz#51575a900f8dd68381c710b4712c2154c3e2035b" dependencies: deep-extend "~0.4.0" ini "~1.3.0" @@ -2690,7 +2855,7 @@ read-pkg@^2.0.0: normalize-package-data "^2.3.2" path-type "^2.0.0" -readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.0.5, readable-stream@^2.0.6, readable-stream@^2.1.4, readable-stream@^2.2.6: +"readable-stream@1 || 2", readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.0.4, readable-stream@^2.0.5, readable-stream@^2.0.6, readable-stream@^2.1.4, readable-stream@^2.1.5, readable-stream@^2.2.2, readable-stream@^2.2.6, readable-stream@^2.3.3: version "2.3.3" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.3.tgz#368f2512d79f9d46fdfc71349ae7878bbc1eb95c" dependencies: @@ -2720,8 +2885,8 @@ regenerator-runtime@^0.10.0: resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.10.5.tgz#336c3efc1220adcedda2c9fab67b5a7955a33658" regenerator-runtime@^0.11.0: - version "0.11.0" - resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.11.0.tgz#7e54fe5b5ccd5d6624ea6255c3473be090b802e1" + version "0.11.1" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz#be05ad7f9bf7d22e056f9726cee5017fbf19e2e9" regenerator-transform@^0.10.0: version "0.10.1" @@ -2867,7 +3032,7 @@ right-align@^0.1.1: dependencies: align-text "^0.1.1" -rimraf@2, rimraf@^2.2.8, rimraf@^2.5.1, rimraf@^2.6.1: +rimraf@2, rimraf@^2.5.1, rimraf@^2.5.4, rimraf@^2.6.1: version "2.6.2" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.2.tgz#2ed8150d24a16ea8651e6d6ef0f47c4158ce7a36" dependencies: @@ -2886,6 +3051,12 @@ run-async@^2.2.0: dependencies: is-promise "^2.1.0" +run-queue@^1.0.0, run-queue@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/run-queue/-/run-queue-1.0.3.tgz#e848396f057d223f24386924618e25694161ec47" + 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" @@ -2916,8 +3087,8 @@ semver@~5.3.0: resolved "https://registry.yarnpkg.com/semver/-/semver-5.3.0.tgz#9b2ce5d3de02d17c6012ad326aa6b4d0cf54f94f" sequelize@^4.22.5: - version "4.22.5" - resolved "https://registry.yarnpkg.com/sequelize/-/sequelize-4.22.5.tgz#5771f8dc2173c61366d77b9fb89aeb34b0522435" + version "4.31.0" + resolved "https://registry.yarnpkg.com/sequelize/-/sequelize-4.31.0.tgz#6826bc0e8d0b31571f927ca89d956999e612fa7c" dependencies: bluebird "^3.4.6" cls-bluebird "^2.0.1" @@ -2937,6 +3108,10 @@ sequelize@^4.22.5: validator "^9.1.0" wkx "^0.4.1" +serialize-javascript@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-1.4.0.tgz#7c958514db6ac2443a8abc062dc9f7886a7f6005" + set-blocking@^2.0.0, set-blocking@~2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" @@ -2971,8 +3146,8 @@ shebang-regex@^1.0.0: resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" shimmer@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/shimmer/-/shimmer-1.1.0.tgz#97d7377137ffbbab425522e429fe0aa89a488b35" + version "1.2.0" + resolved "https://registry.yarnpkg.com/shimmer/-/shimmer-1.2.0.tgz#f966f7555789763e74d8841193685a5e78736665" signal-exit@^3.0.0, signal-exit@^3.0.2: version "3.0.2" @@ -3008,7 +3183,7 @@ source-map-support@^0.4.15: dependencies: source-map "^0.5.6" -source-map@^0.5.3, source-map@^0.5.6, source-map@~0.5.1, source-map@~0.5.3: +source-map@^0.5.3, source-map@^0.5.6, source-map@~0.5.1: version "0.5.7" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" @@ -3018,6 +3193,10 @@ source-map@~0.2.0: dependencies: amdefine ">=0.0.4" +source-map@~0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" + spdx-correct@~1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-1.0.2.tgz#4b3073d933ff51f3912f03ac5519498a4150db40" @@ -3053,6 +3232,12 @@ sshpk@^1.7.0: jsbn "~0.1.0" tweetnacl "~0.14.0" +ssri@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/ssri/-/ssri-5.0.0.tgz#13c19390b606c821f2a10d02b351c1729b94d8cf" + dependencies: + safe-buffer "^5.1.0" + stream-browserify@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/stream-browserify/-/stream-browserify-2.0.1.tgz#66266ee5f9bdb9940a4e4514cafb43bb71e5c9db" @@ -3060,7 +3245,14 @@ stream-browserify@^2.0.1: inherits "~2.0.1" readable-stream "^2.0.2" -stream-http@^2.3.1: +stream-each@^1.1.0: + version "1.2.2" + resolved "https://registry.yarnpkg.com/stream-each/-/stream-each-1.2.2.tgz#8e8c463f91da8991778765873fe4d960d8f616bd" + dependencies: + end-of-stream "^1.1.0" + stream-shift "^1.0.0" + +stream-http@^2.7.2: version "2.7.2" resolved "https://registry.yarnpkg.com/stream-http/-/stream-http-2.7.2.tgz#40a050ec8dc3b53b33d9909415c02c0bf1abfbad" dependencies: @@ -3076,6 +3268,10 @@ stream-meter@1.0.4: dependencies: readable-stream "^2.1.4" +stream-shift@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/stream-shift/-/stream-shift-1.0.0.tgz#d5c752825e5367e786f78e18e445ea223a155952" + stream-splitter@^0.3.2: version "0.3.2" resolved "https://registry.yarnpkg.com/stream-splitter/-/stream-splitter-0.3.2.tgz#e2f28262e53c2d8bbc492e72f2960fc19857984d" @@ -3104,11 +3300,7 @@ string-width@^2.0.0, string-width@^2.1.0, string-width@^2.1.1: is-fullwidth-code-point "^2.0.0" strip-ansi "^4.0.0" -string_decoder@^0.10.25: - version "0.10.31" - resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94" - -string_decoder@~1.0.3: +string_decoder@^1.0.0, string_decoder@~1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.0.3.tgz#0fc67d7c141825de94282dd536bec6b9bce860ab" dependencies: @@ -3147,8 +3339,8 @@ supports-color@^2.0.0: resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" supports-color@^4.0.0, supports-color@^4.2.1: - version "4.4.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-4.4.0.tgz#883f7ddabc165142b2a61427f3352ded195d1a3e" + version "4.5.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-4.5.0.tgz#be7a0de484dec5c5cddf8b3d59125044912f635b" dependencies: has-flag "^2.0.0" @@ -3157,8 +3349,8 @@ tapable@^0.2.7: resolved "https://registry.yarnpkg.com/tapable/-/tapable-0.2.8.tgz#99372a5c999bf2df160afc0d74bed4f47948cd22" tar-pack@^3.4.0: - version "3.4.0" - resolved "https://registry.yarnpkg.com/tar-pack/-/tar-pack-3.4.0.tgz#23be2d7f671a8339376cbdb0b8fe3fdebf317984" + version "3.4.1" + resolved "https://registry.yarnpkg.com/tar-pack/-/tar-pack-3.4.1.tgz#e1dbc03a9b9d3ba07e896ad027317eb679a10a1f" dependencies: debug "^2.2.0" fstream "^1.0.10" @@ -3193,11 +3385,18 @@ throttleit@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/throttleit/-/throttleit-1.0.0.tgz#9e785836daf46743145a5984b6268d828528ac6c" +through2@^2.0.0: + version "2.0.3" + resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.3.tgz#0004569b37c7c74ba39c43f3ced78d1ad94140be" + dependencies: + readable-stream "^2.1.5" + xtend "~4.0.1" + through@^2.3.6: version "2.3.8" resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" -timers-browserify@^2.0.2: +timers-browserify@^2.0.4: version "2.0.4" resolved "https://registry.yarnpkg.com/timers-browserify/-/timers-browserify-2.0.4.tgz#96ca53f4b794a5e7c0e1bd7cc88a372298fa01e6" dependencies: @@ -3251,6 +3450,10 @@ type-check@~0.3.2: dependencies: prelude-ls "~1.1.2" +typedarray@^0.0.6: + version "0.0.6" + resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" + uglify-js@^2.8.29: version "2.8.29" resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-2.8.29.tgz#29c5733148057bb4e1f75df35b7a9cb72e6a59dd" @@ -3280,6 +3483,18 @@ uid2@0.0.3: version "0.0.3" resolved "https://registry.yarnpkg.com/uid2/-/uid2-0.0.3.tgz#483126e11774df2f71b8b639dcd799c376162b82" +unique-filename@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/unique-filename/-/unique-filename-1.1.0.tgz#d05f2fe4032560871f30e93cbe735eea201514f3" + 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" + dependencies: + imurmurhash "^0.1.4" + unique-temp-dir@1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/unique-temp-dir/-/unique-temp-dir-1.0.0.tgz#6dce95b2681ca003eebfb304a415f9cbabcc5385" @@ -3321,8 +3536,8 @@ validate-npm-package-license@^3.0.1: spdx-expression-parse "~1.0.0" validator@^9.1.0: - version "9.1.1" - resolved "https://registry.yarnpkg.com/validator/-/validator-9.1.1.tgz#3bdd1065cbd28f9d96ac806dee01030d32fd97ef" + version "9.2.0" + resolved "https://registry.yarnpkg.com/validator/-/validator-9.2.0.tgz#ad216eed5f37cac31a6fe00ceab1f6b88bded03e" verror@1.10.0: version "1.10.0" @@ -3351,15 +3566,15 @@ webpack-node-externals@^1.6.0: resolved "https://registry.yarnpkg.com/webpack-node-externals/-/webpack-node-externals-1.6.0.tgz#232c62ec6092b100635a3d29d83c1747128df9bd" webpack-sources@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-1.0.1.tgz#c7356436a4d13123be2e2426a05d1dad9cbe65cf" + version "1.1.0" + resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-1.1.0.tgz#a101ebae59d6507354d71d8013950a3a8b7a5a54" dependencies: source-list-map "^2.0.0" - source-map "~0.5.3" + source-map "~0.6.1" webpack@^3.6.0: - version "3.6.0" - resolved "https://registry.yarnpkg.com/webpack/-/webpack-3.6.0.tgz#a89a929fbee205d35a4fa2cc487be9cbec8898bc" + version "3.10.0" + resolved "https://registry.yarnpkg.com/webpack/-/webpack-3.10.0.tgz#5291b875078cf2abf42bdd23afe3f8f96c17d725" dependencies: acorn "^5.0.0" acorn-dynamic-import "^2.0.0" @@ -3443,7 +3658,7 @@ wrappy@1: version "1.0.2" resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" -xtend@^4.0.0: +xtend@^4.0.0, xtend@~4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.1.tgz#a5c6d532be656e23db820efb943a1f04998d63af" @@ -3487,3 +3702,7 @@ yargs@~3.10.0: cliui "^2.1.0" decamelize "^1.0.0" window-size "0.1.0" + +zlib@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/zlib/-/zlib-1.0.5.tgz#6e7c972fc371c645a6afb03ab14769def114fcc0"