diff --git a/package.json b/package.json index 55c9a0b..bfc3750 100644 --- a/package.json +++ b/package.json @@ -4,12 +4,14 @@ "private": true, "homepage": "https://community.comma.ai/cabana", "dependencies": { - "@commaai/pandajs": "^0.1.10", + "@commaai/log_reader": "^0.3.0", + "@commaai/pandajs": "^0.3.0", "aphrodite": "^1.2.1", "babel-preset-stage-0": "^6.24.1", "base64-inline-loader": "^1.1.0", "classnames": "^2.2.5", "clipboard": "^1.7.1", + "config-request": "^0.5.1", "core-js": "^2.4.1", "create-react-class": "^15.5.3", "cuint": "^0.2.2", @@ -27,6 +29,7 @@ "js-cookie": "^2.1.4", "left-pad": "^1.1.3", "lint-staged": "^6.0.0", + "localforage": "^1.7.1", "moment": "^2.18.1", "node-sass": "^4.7.2", "prettier": "^1.9.2", @@ -45,6 +48,7 @@ "react-visibility-sensor": "^3.10.1", "simple-statistics": "^4.1.0", "socket.io-client": "^2.0.3", + "stream-selector": "^0.1.1", "streamsaver": "^1.0.1", "vega": "3.0.10", "vega-tooltip": "^0.4.0" diff --git a/src/CanExplorer.js b/src/CanExplorer.js index 3952bc2..54ad716 100644 --- a/src/CanExplorer.js +++ b/src/CanExplorer.js @@ -8,7 +8,7 @@ import Panda from "@commaai/pandajs"; import { USE_UNLOGGER, PART_SEGMENT_LENGTH, STREAMING_WINDOW } from "./config"; import * as GithubAuth from "./api/github-auth"; -import auth from "./api/comma-auth"; +import * as auth from "./api/comma-auth"; import DBC from "./models/can/dbc"; import Meta from "./components/Meta"; import Explorer from "./components/Explorer"; @@ -29,7 +29,7 @@ import UnloggerClient from "./api/unlogger"; import * as ObjectUtils from "./utils/object"; import { hash } from "./utils/string"; -const CanFetcher = require("./workers/can-fetcher.worker.js"); +const RLogDownloader = require("./workers/rlog-downloader.worker.js"); const LogCSVDownloader = require("./workers/dbc-csv-downloader.worker.js"); const MessageParser = require("./workers/message-parser.worker.js"); const CanOffsetFinder = require("./workers/can-offset-finder.worker.js"); @@ -302,7 +302,7 @@ export default class CanExplorer extends Component { // Adds new message entries to messages state // and "rehydrates" ES6 classes (message frame) // lost from JSON serialization in webworker data cloning. - if (options === undefined) options = {}; + options = options || {}; const messages = { ...this.state.messages }; for (var key in newMessages) { @@ -325,22 +325,18 @@ export default class CanExplorer extends Component { } spawnWorker(parts, options) { - // options is object of {part, prevMsgEntries, spawnWorkerHash, prepend} + console.log("Spawning worker for", parts); if (!this.state.isLoading) { this.setState({ isLoading: true }); } + // options is object of {part, prevMsgEntries, spawnWorkerHash, prepend} const [minPart, maxPart] = parts; - let part = minPart, - prevMsgEntries = {}, - prepend = false, - spawnWorkerHash; - if (options) { - if (options.part) part = options.part; - if (options.prevMsgEntries) prevMsgEntries = options.prevMsgEntries; - if (options.spawnWorkerHash) { - spawnWorkerHash = options.spawnWorkerHash; - } - } + options = options || {}; + let part = options.part || minPart; + let prevMsgEntries = options.prevMsgEntries || {}; + let prepend = false; + let spawnWorkerHash = options.spawnWorkerHash; // || undefined + if (!spawnWorkerHash) { spawnWorkerHash = hash(Math.random().toString(16)); this.setState({ spawnWorkerHash }); @@ -358,7 +354,8 @@ export default class CanExplorer extends Component { canFrameOffset, maxByteStateChangeCount } = this.state; - var worker = new CanFetcher(); + // var worker = new CanFetcher(); + var worker = new RLogDownloader(); worker.onmessage = e => { if (spawnWorkerHash !== this.state.spawnWorkerHash) { @@ -372,7 +369,7 @@ export default class CanExplorer extends Component { return; } - let { newMessages, maxByteStateChangeCount } = e.data; + let { newMessages, maxByteStateChangeCount, isFinished } = e.data; if (maxByteStateChangeCount > this.state.maxByteStateChangeCount) { this.setState({ maxByteStateChangeCount }); } else { @@ -390,30 +387,39 @@ export default class CanExplorer extends Component { prevMsgEntries[key] = msg.entries[msg.entries.length - 1]; } - this.setState( - { - messages, - partsLoaded: this.state.partsLoaded + 1 - }, - () => { - if (part < maxPart) { - this.spawnWorker(parts, { - part: part + 1, - prevMsgEntries, - spawnWorkerHash, - prepend - }); - } else { - this.setState({ isLoading: false }); + if (!isFinished) { + this.setState({ messages }); + } else { + this.setState( + { + messages, + partsLoaded: this.state.partsLoaded + 1 + }, + () => { + if (part < maxPart) { + this.spawnWorker(parts, { + part: part + 1, + prevMsgEntries, + spawnWorkerHash, + prepend + }); + } else { + this.setState({ isLoading: false }); + } } - } - ); + ); + } }; worker.postMessage({ - dbcText: dbc.text(), + // old stuff for reverse compatibility for easier testing base: route.url, num: part, + + // data that is used + dbcText: dbc.text(), + route: route.fullname, + part: part, canStartTime: firstCanTime - canFrameOffset, prevMsgEntries, maxByteStateChangeCount diff --git a/src/api/comma-api.js b/src/api/comma-api.js new file mode 100644 index 0000000..4b35eb0 --- /dev/null +++ b/src/api/comma-api.js @@ -0,0 +1,57 @@ +// API gateway for `api.commadotai.com/v1` urls +import { getCommaAccessToken } from "./comma-auth"; + +const URL_ROOT = "//api.commadotai.com/v1/"; +const ConfigRequest = require("config-request/instance"); + +const request = ConfigRequest(); + +var initPromise = init(); + +async function init() { + var token = await getCommaAccessToken(); + request.configure({ + baseUrl: URL_ROOT, + token: "JWT " + token, + jwt: false + }); +} + +export async function get(endpoint, data) { + await initPromise; + return new Promise((resolve, reject) => { + request.get( + endpoint, + { + query: data, + json: true + }, + errorHandler(resolve, reject) + ); + }); +} + +export async function post(endpoint, data) { + await initPromise; + return new Promise((resolve, reject) => { + request.post( + endpoint, + { + body: data, + json: true + }, + errorHandler(resolve, reject) + ); + }); +} + +function errorHandler(resolve, reject) { + return handle; + + function handle(err, data) { + if (err) { + return reject(err); + } + resolve(data); + } +} diff --git a/src/api/comma-auth.js b/src/api/comma-auth.js index 90d3e93..f1b7ac3 100644 --- a/src/api/comma-auth.js +++ b/src/api/comma-auth.js @@ -1,22 +1,52 @@ import Cookies from "js-cookie"; +import storage from "localforage"; import { COMMA_ACCESS_TOKEN_COOKIE, COMMA_OAUTH_REDIRECT_COOKIE } from "../config"; -function getCommaAccessToken() { +let isAuthed = false; +let useForage = true; + +export async function getCommaAccessToken() { + let token = getTokenInternal(); + if (!token) { + try { + token = await storage.getItem("authorization"); + } catch (e) { + useForage = false; + } + } + + if (token) { + isAuthed = true; + if (useForage) { + await storage.setItem("authorization", token); + } + } + + return token; +} + +// seed cache +getCommaAccessToken(); + +function getTokenInternal() { + if (typeof localStorage !== "undefined") { + if (localStorage.authorization) { + return localStorage.authorization; + } + } return Cookies.get(COMMA_ACCESS_TOKEN_COOKIE); } -function isAuthenticated() { - return getCommaAccessToken() !== undefined; +export function isAuthenticated() { + return isAuthed; } -function authUrl() { +export function authUrl() { Cookies.set(COMMA_OAUTH_REDIRECT_COOKIE, window.location.href); return "https://community.comma.ai/ucp.php?mode=login&login=external&oauth_service=google"; } - -export default { getCommaAccessToken, isAuthenticated, authUrl }; diff --git a/src/api/rlog.js b/src/api/rlog.js new file mode 100644 index 0000000..c21f223 --- /dev/null +++ b/src/api/rlog.js @@ -0,0 +1,32 @@ +import * as CommaAPI from "./comma-api"; +import request from "simple-get"; + +const urlStore = {}; + +export async function getLogURLList(routeName) { + if (urlStore[routeName]) { + return urlStore[routeName]; + } + var data = await CommaAPI.get("route/" + routeName + "/log_urls"); + + urlStore[routeName] = data; + + setTimeout(function() { + delete urlStore[routeName]; + }, 1000 * 60 * 45); // expires in 1h, lets reset in 45m + + return urlStore[routeName]; +} + +export async function getLogPart(routeName, part) { + return new Promise(async function(resolve, reject) { + var logUrls = await getLogURLList(routeName); + + request(logUrls[part], function(err, res) { + if (err) { + return reject(err); + } + resolve(res); + }); + }); +} diff --git a/src/api/routes.js b/src/api/routes.js index 6336571..1631001 100644 --- a/src/api/routes.js +++ b/src/api/routes.js @@ -1,5 +1,5 @@ import Moment from "moment"; -import CommaAuth from "./comma-auth"; +import * as CommaAuth from "./comma-auth"; const ROUTES_ENDPOINT = "https://api.commadotai.com/v1/{dongleId}/routes/"; @@ -18,7 +18,7 @@ export async function fetchRoutes(dongleId) { dongleId = "me"; } - const accessToken = CommaAuth.getCommaAccessToken(); + const accessToken = await CommaAuth.getCommaAccessToken(); if (accessToken) { const endpoint = ROUTES_ENDPOINT.replace("{dongleId}", dongleId); const headers = new Headers(); diff --git a/src/components/MessageBytes.js b/src/components/MessageBytes.js index b4728a9..750117c 100644 --- a/src/components/MessageBytes.js +++ b/src/components/MessageBytes.js @@ -36,7 +36,16 @@ export default class MessageBytes extends Component { } componentWillReceiveProps(nextProps) { - this.updateCanvas(nextProps); + if ( + this.props.seekIndex !== nextProps.seekIndex || + frameForTime(this.props.seekTime) !== frameForTime(nextProps.seekTime) + ) { + this.updateCanvas(nextProps); + } + + function frameForTime(t) { + return ~~(t * 60); + } } findMostRecentMessage(seekTime) { @@ -44,7 +53,7 @@ export default class MessageBytes extends Component { const { lastMessageIndex, lastSeekTime } = this.state; let mostRecentMessageIndex = null; if (seekTime >= lastSeekTime) { - for (let i = lastMessageIndex; i < message.entries.length; i++) { + for (let i = lastMessageIndex; i < message.entries.length; ++i) { const msg = message.entries[i]; if (msg && msg.relTime >= seekTime) { mostRecentMessageIndex = i; @@ -84,9 +93,10 @@ export default class MessageBytes extends Component { } const ctx = this.canvas.getContext("2d"); - ctx.clearRect(0, 0, 180, 15); - for (let i = 0; i < message.byteStateChangeCounts.length; i++) { - const hexData = mostRecentMsg.hexData.substr(i * 2, 2); + // ctx.clearRect(0, 0, 180, 15); + + for (let i = 0; i < message.byteStateChangeCounts.length; ++i) { + const hexData = mostRecentMsg.hexData.substr(i * 2, 2) || "00"; ctx.fillStyle = message.byteColors[i]; ctx.fillRect(i * 20, 0, 20, 15); diff --git a/src/components/Modals/OnboardingModal.js b/src/components/Modals/OnboardingModal.js index 34a4365..73e7056 100644 --- a/src/components/Modals/OnboardingModal.js +++ b/src/components/Modals/OnboardingModal.js @@ -4,7 +4,7 @@ import Moment from "moment"; import _ from "lodash"; import cx from "classnames"; -import auth from "../../api/comma-auth"; +import * as auth from "../../api/comma-auth"; import Modal from "../Modals/baseModal"; diff --git a/src/workers/can-fetcher.worker.js b/src/workers/can-fetcher.js similarity index 78% rename from src/workers/can-fetcher.worker.js rename to src/workers/can-fetcher.js index 11bbd7a..540e763 100644 --- a/src/workers/can-fetcher.worker.js +++ b/src/workers/can-fetcher.js @@ -5,11 +5,9 @@ import DBC from "../models/can/dbc"; import DbcUtils from "../utils/dbc"; import * as CanApi from "../api/can"; -var window = self; - const Int64LE = require("int64-buffer").Int64LE; -async function loadCanPart( +export async function loadCanPart( dbc, base, num, @@ -74,30 +72,35 @@ async function loadCanPart( ); }); - self.postMessage({ + return { newMessages: messages, maxByteStateChangeCount - }); - self.close(); + }; + + // self.postMessage({ + // newMessages: messages, + // maxByteStateChangeCount + // }); + // self.close(); } -self.onmessage = function(e) { - const { - dbcText, - base, - num, - canStartTime, - prevMsgEntries, - maxByteStateChangeCount - } = e.data; +// self.onmessage = function(e) { +// const { +// dbcText, +// base, +// num, +// canStartTime, +// prevMsgEntries, +// maxByteStateChangeCount +// } = e.data; - const dbc = new DBC(dbcText); - loadCanPart( - dbc, - base, - num, - canStartTime, - prevMsgEntries, - maxByteStateChangeCount - ); -}; +// const dbc = new DBC(dbcText); +// loadCanPart( +// dbc, +// base, +// num, +// canStartTime, +// prevMsgEntries, +// maxByteStateChangeCount +// ); +// }; diff --git a/src/workers/rlog-downloader.worker.js b/src/workers/rlog-downloader.worker.js new file mode 100644 index 0000000..ecf3598 --- /dev/null +++ b/src/workers/rlog-downloader.worker.js @@ -0,0 +1,165 @@ +import LogStream from "@commaai/log_reader"; +import { timeout } from "thyming"; +import { partial } from "ap"; + +import { getLogPart, getLogURLList } from "../api/rlog"; +import DbcUtils from "../utils/dbc"; +import DBC from "../models/can/dbc"; +import { loadCanPart } from "./can-fetcher"; + +const DEBOUNCE_DELAY = 100; + +self.onmessage = handleMessage; + +function handleMessage(msg) { + const options = msg.data; + + options.dbc = new DBC(options.dbcText); + + var entry = new CacheEntry(options); +} + +function CacheEntry(options) { + options = options || {}; + this.options = options; + + let { route, part, dbc } = options; + + this.messages = {}; + this.route = route; + this.part = part; + this.dbc = dbc; + this.sendBatch = partial(sendBatch, this); + + // load in the data! + loadData(this); +} + +function sendBatch(entry) { + delete entry.batching; + let messages = entry.messages; + entry.messages = {}; + + let maxByteStateChangeCount = entry.options.maxByteStateChangeCount; + const newMaxByteStateChangeCount = DbcUtils.findMaxByteStateChangeCount( + messages + ); + if (newMaxByteStateChangeCount > maxByteStateChangeCount) { + maxByteStateChangeCount = newMaxByteStateChangeCount; + } + + Object.keys(messages).forEach(key => { + messages[key] = DbcUtils.setMessageByteColors( + messages[key], + maxByteStateChangeCount + ); + }); + + if (entry.ended) { + console.log("Sending finished"); + } + + self.postMessage({ + newMessages: messages, + maxByteStateChangeCount, + isFinished: entry.ended + }); +} + +async function loadData(entry) { + var url = (await getLogURLList(entry.route))[entry.part]; + if (url.indexOf(".7z") !== -1) { + // this is a shit log we can't read... + var data = await loadCanPart( + entry.dbc, + entry.options.base, + entry.options.num, + entry.options.canStartTime, + entry.options.prevMsgEntries, + entry.options.maxByteStateChangeCount + ); + data.isFinished = true; + + return self.postMessage(data); + } + var res = await getLogPart(entry.route, entry.part); + var logReader = new LogStream(res); + + entry.ended = false; + + res.on("end", function() { + console.log("Stream ended"); + entry.ended = true; + queueBatch(entry); + }); + + var msgArr = []; + var startTime = Date.now(); + var i = 0; + + logReader(function(msg) { + if (entry.ended) { + console.log("You can get msgs after end", msg); + } + if ("Can" in msg) { + let monoTime = msg.LogMonoTime / 1000000000; + msg.Can.forEach(partial(insertCanMessage, entry, monoTime)); + queueBatch(entry); + } + }); +} + +function queueBatch(entry) { + if (!entry.batching) { + entry.batching = timeout(entry.sendBatch, DEBOUNCE_DELAY); + } +} + +function insertCanMessage(entry, logTime, msg) { + var src = msg.Src; + var address = Number(msg.Address); + var busTime = msg.BusTime; + var addressHexStr = address.toString(16); + var id = src + ":" + addressHexStr; + + if (!entry.messages[id]) { + entry.messages[id] = DbcUtils.createMessageSpec( + entry.dbc, + address, + id, + src + ); + } + let prevMsgEntry = getPrevMsgEntry( + entry.messages, + entry.options.prevMsgEntries, + id + ); + + let { msgEntry, byteStateChangeCounts } = DbcUtils.parseMessage( + entry.dbc, + logTime, + address, + msg.Dat, + entry.options.canStartTime, + prevMsgEntry + ); + + entry.messages[id].byteStateChangeCounts = byteStateChangeCounts.map(function( + count, + idx + ) { + return entry.messages[id].byteStateChangeCounts[idx] + count; + }); + + entry.messages[id].entries.push(msgEntry); + + // console.log(id); +} + +function getPrevMsgEntry(messages, prevMsgEntries, id) { + if (messages[id].entries.length) { + return messages[id].entries[messages[id].entries.length - 1]; + } + return prevMsgEntries[id] || null; +} diff --git a/yarn.lock b/yarn.lock index 03207ac..51e79d4 100644 --- a/yarn.lock +++ b/yarn.lock @@ -17,12 +17,29 @@ lodash "^4.2.0" to-fast-properties "^2.0.0" -"@commaai/pandajs@^0.1.10": - version "0.1.10" - resolved "https://registry.yarnpkg.com/@commaai/pandajs/-/pandajs-0.1.10.tgz#89ac13c78bc2194144e8d868dadd351967659788" +"@commaai/log_reader@^0.3.0": + version "0.3.0" + resolved "https://registry.yarnpkg.com/@commaai/log_reader/-/log_reader-0.3.0.tgz#6a19265dedab555407f999a4e5fe3f567ed8d551" + dependencies: + "@commaai/unbzip2-stream" "^2.0.0" + JSONStream "^1.3.2" + ap "^0.2.0" + capnp-json "^0.1.2" + capnp-split "^0.1.1" + capnp-ts "^0.2.4" + commander "^2.15.1" + file-type "^7.6.0" + geval "^2.2.0" + stream-selector "^0.3.0" + +"@commaai/pandajs@^0.3.0": + version "0.3.0" + resolved "https://registry.yarnpkg.com/@commaai/pandajs/-/pandajs-0.3.0.tgz#ad072defde75ddaf00175d1a0134b3d891a64283" dependencies: ap "^0.2.0" + babel-runtime "^6.26.0" can-message "^0.1.0" + commander "^2.15.1" is-browser "^2.0.1" is-node "^1.0.2" is-promise "^2.1.0" @@ -32,10 +49,21 @@ usb "^1.3.1" weakmap-event "^2.0.7" +"@commaai/unbzip2-stream@^2.0.0": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@commaai/unbzip2-stream/-/unbzip2-stream-2.0.0.tgz#93821dc5e72f04ec5eedef5ed4e6ff57412019e0" + "@types/node@*": version "8.5.1" resolved "https://registry.yarnpkg.com/@types/node/-/node-8.5.1.tgz#4ec3020bcdfe2abffeef9ba3fbf26fca097514b5" +JSONStream@^1.3.2: + version "1.3.2" + resolved "https://registry.yarnpkg.com/JSONStream/-/JSONStream-1.3.2.tgz#c102371b6ec3a7cf3b847ca00c20bb0fce4c6dea" + dependencies: + jsonparse "^1.2.0" + through ">=2.2.7 <3" + abab@^1.0.3: version "1.0.4" resolved "https://registry.yarnpkg.com/abab/-/abab-1.0.4.tgz#5faad9c2c07f60dd76770f71cf025b62a63cfd4e" @@ -308,6 +336,10 @@ assert-function@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/assert-function/-/assert-function-1.0.0.tgz#aeb2ad0fe00888b41254a8e3934a562968d77905" +assert-ok@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/assert-ok/-/assert-ok-1.0.0.tgz#5b5cf795f9275c59c714d66c3a06d7de70e43ec8" + 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" @@ -1424,6 +1456,10 @@ buffer-indexof@^1.0.0: version "1.1.1" resolved "https://registry.yarnpkg.com/buffer-indexof/-/buffer-indexof-1.1.1.tgz#52fabcc6a606d1a00302802648ef68f639da268c" +buffer-to-arraybuffer@^0.0.5: + version "0.0.5" + resolved "https://registry.yarnpkg.com/buffer-to-arraybuffer/-/buffer-to-arraybuffer-0.0.5.tgz#6064a40fa76eb43c723aba9ef8f6e1216d10511a" + buffer-xor@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/buffer-xor/-/buffer-xor-1.0.3.tgz#26e61ed1422fb70dd42e6e36729ed51d855fe8d9" @@ -1444,6 +1480,10 @@ builtin-status-codes@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz#85982878e21b98e1c66425e03d0174788f569ee8" +builtin-status-codes@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/builtin-status-codes/-/builtin-status-codes-1.0.0.tgz#30637ee262978ac07174e16d7f82f0ad06e085ad" + bytes@3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.0.0.tgz#d32815404d689699f85a4ea4fa8755dd13a96048" @@ -1529,6 +1569,23 @@ canvas@^1.6: dependencies: nan "^2.4.0" +capnp-json@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/capnp-json/-/capnp-json-0.1.2.tgz#4a6ecdb6d5b827541f9f47f329f7e65e5e943b40" + +capnp-split@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/capnp-split/-/capnp-split-0.1.1.tgz#22823becdfc6fc9a40921c119e85a1035e3e22e4" + +capnp-ts@^0.2.4: + version "0.2.4" + resolved "https://registry.yarnpkg.com/capnp-ts/-/capnp-ts-0.2.4.tgz#da729493311f384d65d480d9afe979ceab9f41bb" + dependencies: + debug "^2.6.3" + format "^0.2.2" + tslib "^1.7.1" + utf8-encoding "^0.1.2" + capture-stack-trace@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/capture-stack-trace/-/capture-stack-trace-1.0.0.tgz#4a6fa07399c26bba47f0b2496b4d0fb408c5550d" @@ -1754,6 +1811,10 @@ commander@2, commander@2.12.x, commander@^2.11.0, commander@^2.9.0, commander@~2 version "2.12.2" resolved "https://registry.yarnpkg.com/commander/-/commander-2.12.2.tgz#0f5946c427ed9ec0d91a46bb9def53e54650e555" +commander@^2.15.1: + version "2.15.1" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.15.1.tgz#df46e867d0fc2aec66a34662b406a9ccafff5b0f" + commondir@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b" @@ -1800,6 +1861,21 @@ concat-stream@^1.6.0: readable-stream "^2.2.2" typedarray "^0.0.6" +config-request@^0.5.1: + version "0.5.1" + resolved "https://registry.yarnpkg.com/config-request/-/config-request-0.5.1.tgz#cffc1288a681c46de1dafaeb2333d5500f6e12d8" + dependencies: + geval "^2.1.1" + http-status-error "^1.1.1" + is-error-code "^1.0.0" + is-function "^1.0.1" + is-obj "^1.0.1" + query-string-flatten "^1.0.0" + safe-json-parse "^4.0.0" + url-join "^1.1.0" + xhr-request "^1.0.1" + xtend "^4.0.1" + configstore@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/configstore/-/configstore-2.1.0.tgz#737a3a7036e9886102aa6099e47bb33ab1aba1a1" @@ -2252,7 +2328,7 @@ date-now@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/date-now/-/date-now-0.1.4.tgz#eaf439fd4d4848ad74e5cc7dbef200672b9e345b" -debug@2.6.9, debug@^2.2.0, debug@^2.6.0, debug@^2.6.6, debug@^2.6.8, debug@~2.6.4, debug@~2.6.9: +debug@2.6.9, debug@^2.2.0, debug@^2.6.0, debug@^2.6.3, debug@^2.6.6, debug@^2.6.8, debug@~2.6.4, debug@~2.6.9: version "2.6.9" resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" dependencies: @@ -2268,6 +2344,16 @@ decamelize@^1.0.0, decamelize@^1.1.1, decamelize@^1.1.2: version "1.2.0" resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" +decode-uri-component@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.0.tgz#eb3913333458775cb84cd1a1fae062106bb87545" + +decompress-response@^3.3.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/decompress-response/-/decompress-response-3.3.0.tgz#80a4dd323748384bfa248083622aedec982adff3" + dependencies: + mimic-response "^1.0.0" + dedent@^0.7.0: version "0.7.0" resolved "https://registry.yarnpkg.com/dedent/-/dedent-0.7.0.tgz#2495ddbaf6eb874abb0e1be9df22d2e5a544326c" @@ -2443,6 +2529,10 @@ dom-urls@^1.1.0: dependencies: urijs "^1.16.1" +dom-walk@^0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/dom-walk/-/dom-walk-0.1.1.tgz#672226dc74c8f799ad35307df936aba11acd6018" + domain-browser@^1.1.1: version "1.1.7" resolved "https://registry.yarnpkg.com/domain-browser/-/domain-browser-1.1.7.tgz#867aa4b093faa05f1de08c06f4d7b21fdf8698bc" @@ -3166,6 +3256,10 @@ file-saver@^1.3.3: version "1.3.3" resolved "https://registry.yarnpkg.com/file-saver/-/file-saver-1.3.3.tgz#cdd4c44d3aa264eac2f68ec165bc791c34af1232" +file-type@^7.6.0: + version "7.6.0" + resolved "https://registry.yarnpkg.com/file-type/-/file-type-7.6.0.tgz#b3dbfc8029148e86f30761b21253562943d21f06" + filename-regex@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/filename-regex/-/filename-regex-2.0.1.tgz#c1c4b9bee3e09725ddb106b75c1e301fe2f18b26" @@ -3267,11 +3361,17 @@ font-awesome@^4.7.0: version "4.7.0" resolved "https://registry.yarnpkg.com/font-awesome/-/font-awesome-4.7.0.tgz#8fa8cf0411a1a31afd07b06d2902bb9fc815a133" +for-each@^0.3.2: + version "0.3.2" + resolved "https://registry.yarnpkg.com/for-each/-/for-each-0.3.2.tgz#2c40450b9348e97f281322593ba96704b9abd4d4" + dependencies: + is-function "~1.0.0" + for-in@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80" -for-own@^0.1.4: +for-own@^0.1.3, for-own@^0.1.4: version "0.1.5" resolved "https://registry.yarnpkg.com/for-own/-/for-own-0.1.5.tgz#5265c681a4f294dabbf17c9509b6763aa84510ce" dependencies: @@ -3301,6 +3401,10 @@ form-data@~2.3.1: combined-stream "^1.0.5" mime-types "^2.1.12" +format@^0.2.2: + version "0.2.2" + resolved "https://registry.yarnpkg.com/format/-/format-0.2.2.tgz#d6170107e9efdc4ed30c9dc39016df942b5cb58b" + forwarded@~0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.1.2.tgz#98c23dab1175657b8c0573e8ceccd91b0ff18c84" @@ -3433,7 +3537,7 @@ getpass@^0.1.1: dependencies: assert-plus "^1.0.0" -geval@~2.2.0: +geval@^2.1.1, geval@^2.2.0, geval@~2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/geval/-/geval-2.2.0.tgz#5622b10a28028284198afe351f6b417042c33dda" @@ -3498,6 +3602,13 @@ global-prefix@^1.0.1: is-windows "^1.0.1" which "^1.2.14" +global@~4.3.0: + version "4.3.2" + resolved "https://registry.yarnpkg.com/global/-/global-4.3.2.tgz#e76989268a6c74c38908b1305b10fc0e394e9d0f" + dependencies: + min-document "^2.19.0" + process "~0.5.1" + globals@^9.17.0, globals@^9.18.0: version "9.18.0" resolved "https://registry.yarnpkg.com/globals/-/globals-9.18.0.tgz#aa3896b3e69b487f17e31ed2143d69a8e30c2d8a" @@ -3858,6 +3969,14 @@ http-signature@~1.2.0: jsprim "^1.2.2" sshpk "^1.7.0" +http-status-error@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/http-status-error/-/http-status-error-1.1.1.tgz#16ab35efbb3aca9c17b0a262a6eceec7e0d394cc" + dependencies: + assert-ok "~1.0.0" + builtin-status-codes "~1.0.0" + is-error-code "~1.0.0" + https-browserify@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/https-browserify/-/https-browserify-1.0.0.tgz#ec06c10e0a34c0f2faf199f7fd7fc78fffd03c73" @@ -3896,6 +4015,10 @@ ignore@^3.3.3: version "3.3.7" resolved "https://registry.yarnpkg.com/ignore/-/ignore-3.3.7.tgz#612289bfb3c220e186a58118618d5be8c1bab021" +immediate@~3.0.5: + version "3.0.6" + resolved "https://registry.yarnpkg.com/immediate/-/immediate-3.0.6.tgz#9db1dbd0faf8de6fbe0f5dd5e56bb606280de69b" + import-local@^0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/import-local/-/import-local-0.1.1.tgz#b1179572aacdc11c6a91009fb430dbcab5f668a8" @@ -3929,6 +4052,10 @@ indexof@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/indexof/-/indexof-0.0.1.tgz#82dc336d232b9062179d05ab3293a66059fd435d" +individual@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/individual/-/individual-2.0.0.tgz#833b097dad23294e76117a98fb38e0d9ad61bb97" + inflight@^1.0.4: version "1.0.6" resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" @@ -4062,6 +4189,10 @@ is-equal-shallow@^0.1.3: dependencies: is-primitive "^2.0.0" +is-error-code@^1.0.0, is-error-code@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-error-code/-/is-error-code-1.0.0.tgz#d27e3923434bbbd5149ce8d1ae316674851a8c25" + is-extendable@^0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" @@ -4090,6 +4221,10 @@ 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.1, 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@^2.0.0, is-glob@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-2.0.1.tgz#d096f926a3ded5600f3fdfd91198cb0888c2d863" @@ -4163,7 +4298,7 @@ is-path-inside@^1.0.0: dependencies: path-is-inside "^1.0.1" -is-plain-obj@^1.0.0: +is-plain-obj@^1.0.0, is-plain-obj@~1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-1.1.0.tgz#71a50c8429dfca773c92a390a4a03b39fcd51d3e" @@ -4265,6 +4400,12 @@ isobject@^2.0.0: dependencies: isarray "1.0.0" +isobject@~2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.0.0.tgz#208de872bd7378c2a92af9428a3f56eb91a122c4" + dependencies: + isarray "0.0.1" + isomorphic-fetch@^2.1.1: version "2.2.1" resolved "https://registry.yarnpkg.com/isomorphic-fetch/-/isomorphic-fetch-2.2.1.tgz#611ae1acf14f5e81f729507472819fe9733558a9" @@ -4675,6 +4816,10 @@ 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" + jsonpointer@^4.0.0: version "4.0.1" resolved "https://registry.yarnpkg.com/jsonpointer/-/jsonpointer-4.0.1.tgz#4fd92cb34e0e9db3c89c8622ecf51f9b978c6cb9" @@ -4762,6 +4907,12 @@ levn@^0.3.0, levn@~0.3.0: prelude-ls "~1.1.2" type-check "~0.3.2" +lie@3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/lie/-/lie-3.1.1.tgz#9a436b2cc7746ca59de7a41fa469b3efb76bd87e" + dependencies: + immediate "~3.0.5" + lint-staged@^6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/lint-staged/-/lint-staged-6.0.0.tgz#7ab7d345f2fe302ff196f1de6a005594ace03210" @@ -4882,6 +5033,12 @@ loader-utils@^1.0.2, loader-utils@^1.1.0: emojis-list "^2.0.0" json5 "^0.5.0" +localforage@^1.7.1: + version "1.7.1" + resolved "https://registry.yarnpkg.com/localforage/-/localforage-1.7.1.tgz#e4927e042302b864db30f3211f13b5c6f0de965d" + dependencies: + lie "3.1.1" + locate-path@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-2.0.0.tgz#2b568b265eec944c6d9c0de9c3dbbbca0354cd8e" @@ -5025,7 +5182,7 @@ makeerror@1.0.x: dependencies: tmpl "1.0.x" -map-obj@^1.0.0, map-obj@^1.0.1: +map-obj@^1.0.0, map-obj@^1.0.1, map-obj@~1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-1.0.1.tgz#d933ceb9205d82bdcf4886f6742bdc2b4dea146d" @@ -5145,6 +5302,16 @@ mimic-fn@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-1.1.0.tgz#e667783d92e89dbd342818b5230b9d62a672ad18" +mimic-response@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-1.0.0.tgz#df3d3652a73fded6b9b0b24146e6fd052353458e" + +min-document@^2.19.0: + version "2.19.0" + resolved "https://registry.yarnpkg.com/min-document/-/min-document-2.19.0.tgz#7bd282e3f5842ed295bb748cdd9f1ffa2c824685" + dependencies: + dom-walk "^0.1.0" + minimalistic-assert@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.0.tgz#702be2dda6b37f4836bcb3f5db56641b64a1d3d3" @@ -5465,6 +5632,17 @@ oauth-sign@~0.8.1, oauth-sign@~0.8.2: version "0.8.2" resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.8.2.tgz#46a6ab7f0aead8deae9ec0565780b7d4efeb9d43" +obj-query@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/obj-query/-/obj-query-1.0.0.tgz#9447527491a243c9f72a7fec322402404a1f2e7c" + dependencies: + is-plain-obj "~1.1.0" + map-obj "~1.0.1" + object-pair "~1.0.0" + object.reduce "~0.1.7" + print-value "~1.0.0" + xtend "~4.0.1" + object-assign@4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.0.1.tgz#99504456c3598b5cad4fc59c26e8a9bb107fe0bd" @@ -5489,6 +5667,10 @@ object-keys@^1.0.10, object-keys@^1.0.8: version "1.0.11" resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.0.11.tgz#c54601778ad560f1142ce0e01bcca8b56d13426d" +object-pair@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/object-pair/-/object-pair-1.0.0.tgz#253fb8070cb28bc9a349b8e606011cbd99f8bc25" + object.assign@^4.0.4: version "4.0.4" resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.0.4.tgz#b1c9cc044ef1b9fe63606fc141abbb32e14730cc" @@ -5513,6 +5695,12 @@ object.omit@^2.0.0: for-own "^0.1.4" is-extendable "^0.1.1" +object.reduce@~0.1.7: + version "0.1.7" + resolved "https://registry.yarnpkg.com/object.reduce/-/object.reduce-0.1.7.tgz#d180e84f72d218348af45352b55165246b95046d" + dependencies: + for-own "^0.1.3" + object.values@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.0.4.tgz#e524da09b4f66ff05df457546ec72ac99f13069a" @@ -5522,6 +5710,10 @@ object.values@^1.0.4: function-bind "^1.1.0" has "^1.0.1" +obtain-unicode@~0.0.5: + version "0.0.5" + resolved "https://registry.yarnpkg.com/obtain-unicode/-/obtain-unicode-0.0.5.tgz#655f337a8f135280495d77a60efc601f9af5d5dc" + obuf@^1.0.0, obuf@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/obuf/-/obuf-1.1.1.tgz#104124b6c602c6796881a042541d36db43a5264e" @@ -5536,7 +5728,7 @@ on-headers@~1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/on-headers/-/on-headers-1.0.1.tgz#928f5d0f470d49342651ea6794b0857c100693f7" -once@^1.3.0, once@^1.3.3, once@^1.4.0: +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: @@ -5687,6 +5879,13 @@ parse-glob@^3.0.4: is-extglob "^1.0.0" is-glob "^2.0.0" +parse-headers@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/parse-headers/-/parse-headers-2.0.1.tgz#6ae83a7aa25a9d9b700acc28698cd1f1ed7e9536" + dependencies: + for-each "^0.3.2" + trim "0.0.1" + parse-json@^2.1.0, parse-json@^2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-2.2.0.tgz#f480f40434ef80741f8469099f8dea18f55a4dc9" @@ -6168,6 +6367,13 @@ pretty-format@^21.2.1: ansi-regex "^3.0.0" ansi-styles "^3.2.0" +print-value@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/print-value/-/print-value-1.0.0.tgz#55b3a3a2ec4d0a6125257070700ca582c4b8eb7e" + dependencies: + isobject "~2.0.0" + json-stringify-safe "~5.0.1" + private@^0.1.6, private@^0.1.7: version "0.1.8" resolved "https://registry.yarnpkg.com/private/-/private-0.1.8.tgz#2381edb3689f7a53d653190060fcf822d2f368ff" @@ -6184,6 +6390,10 @@ process@^0.11.10: version "0.11.10" resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182" +process@~0.5.1: + version "0.5.2" + resolved "https://registry.yarnpkg.com/process/-/process-0.5.2.tgz#1638d8a8e34c2f440a91db95ab9aeb677fc185cf" + progress@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.0.tgz#8a1be366bf8fc23db2bd23f10c6fe920b4389d1f" @@ -6257,6 +6467,14 @@ qs@~6.4.0: version "6.4.0" resolved "https://registry.yarnpkg.com/qs/-/qs-6.4.0.tgz#13e26d28ad6b0ffaa91312cd3bf708ed351e7233" +query-string-flatten@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/query-string-flatten/-/query-string-flatten-1.0.0.tgz#33bb7b3b09d6a08cf2a887535761035900e69a8d" + dependencies: + obj-query "~1.0.0" + query-string "~3.0.0" + value-pipe "~1.0.0" + query-string@^4.1.0: version "4.3.4" resolved "https://registry.yarnpkg.com/query-string/-/query-string-4.3.4.tgz#bbb693b9ca915c232515b228b1a02b609043dbeb" @@ -6264,6 +6482,20 @@ query-string@^4.1.0: object-assign "^4.1.0" strict-uri-encode "^1.0.0" +query-string@^5.0.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/query-string/-/query-string-5.1.1.tgz#a78c012b71c17e05f2e3fa2319dd330682efb3cb" + dependencies: + decode-uri-component "^0.2.0" + object-assign "^4.1.0" + strict-uri-encode "^1.0.0" + +query-string@~3.0.0: + version "3.0.3" + resolved "https://registry.yarnpkg.com/query-string/-/query-string-3.0.3.tgz#ae2e14b4d05071d4e9b9eb4873c35b0dcd42e638" + dependencies: + strict-uri-encode "^1.0.0" + querystring-es3@^0.2.0: version "0.2.1" resolved "https://registry.yarnpkg.com/querystring-es3/-/querystring-es3-0.2.1.tgz#9ec61f79049875707d69414596fd907a4d711e73" @@ -6567,6 +6799,18 @@ readable-stream@^2.0.6, readable-stream@^2.1.4: string_decoder "~1.0.3" util-deprecate "~1.0.1" +readable-stream@^2.1.5: + version "2.3.6" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.6.tgz#b11c27d88b8ff1fbe070643cf94b0c79ae1b0aaf" + dependencies: + core-util-is "~1.0.0" + inherits "~2.0.3" + isarray "~1.0.0" + process-nextick-args "~2.0.0" + safe-buffer "~5.1.1" + string_decoder "~1.1.1" + util-deprecate "~1.0.1" + readdirp@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-2.1.0.tgz#4ed0ad060df3073300c48440373f72d1cc642d78" @@ -6902,6 +7146,12 @@ run-async@^2.2.0: dependencies: is-promise "^2.1.0" +rust-result@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/rust-result/-/rust-result-1.0.0.tgz#34c75b2e6dc39fe5875e5bdec85b5e0f91536f72" + dependencies: + individual "^2.0.0" + rw@1: version "1.3.3" resolved "https://registry.yarnpkg.com/rw/-/rw-1.3.3.tgz#3f862dfa91ab766b14885ef4d01124bfda074fb4" @@ -6926,6 +7176,12 @@ safe-buffer@5.1.1, safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, s version "5.1.1" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.1.tgz#893312af69b2123def71f57889001671eeb2c853" +safe-json-parse@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/safe-json-parse/-/safe-json-parse-4.0.0.tgz#7c0f578cfccd12d33a71c0e05413e2eca171eaac" + dependencies: + rust-result "^1.0.0" + sane@~1.6.0: version "1.6.0" resolved "https://registry.yarnpkg.com/sane/-/sane-1.6.0.tgz#9610c452307a135d29c1fdfe2547034180c46775" @@ -7093,6 +7349,18 @@ signal-exit@^3.0.0, signal-exit@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d" +simple-concat@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/simple-concat/-/simple-concat-1.0.0.tgz#7344cbb8b6e26fb27d66b2fc86f9f6d5997521c6" + +simple-get@^2.7.0: + version "2.7.0" + resolved "https://registry.yarnpkg.com/simple-get/-/simple-get-2.7.0.tgz#ad37f926d08129237ff08c4f2edfd6f10e0380b5" + dependencies: + decompress-response "^3.3.0" + once "^1.3.1" + simple-concat "^1.0.0" + simple-statistics@^4.1.0: version "4.1.1" resolved "https://registry.yarnpkg.com/simple-statistics/-/simple-statistics-4.1.1.tgz#533c48d48336ba3d350d8135f20fa7138acb0c7d" @@ -7296,6 +7564,19 @@ stream-http@^2.7.2: to-arraybuffer "^1.0.0" xtend "^4.0.0" +stream-selector@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/stream-selector/-/stream-selector-0.1.1.tgz#bef2ea3af72b7d17b0cd5fe6970a71698c38afe3" + dependencies: + inherits "^2.0.3" + +stream-selector@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/stream-selector/-/stream-selector-0.3.0.tgz#ba2223c0fd449e3a9ea16444f52142ea79506ec4" + dependencies: + inherits "^2.0.3" + through2 "^2.0.3" + stream-to-observable@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/stream-to-observable/-/stream-to-observable-0.2.0.tgz#59d6ea393d87c2c0ddac10aa0d561bc6ba6f0e10" @@ -7345,6 +7626,12 @@ string_decoder@~0.10.x: version "0.10.31" resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94" +string_decoder@~1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" + dependencies: + safe-buffer "~5.1.0" + stringify-object@^3.2.0: version "3.2.1" resolved "https://registry.yarnpkg.com/stringify-object/-/stringify-object-3.2.1.tgz#2720c2eff940854c819f6ee252aaeb581f30624d" @@ -7536,7 +7823,14 @@ throat@^3.0.0: version "3.2.0" resolved "https://registry.yarnpkg.com/throat/-/throat-3.2.0.tgz#50cb0670edbc40237b9e347d7e1f88e4620af836" -through@^2.3.6: +through2@^2.0.3: + 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.2.7 <3", through@^2.3.6: version "2.3.8" resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" @@ -7558,6 +7852,10 @@ timed-out@^3.0.0: version "3.1.3" resolved "https://registry.yarnpkg.com/timed-out/-/timed-out-3.1.3.tgz#95860bfcc5c76c277f8f8326fd0f5b2e20eba217" +timed-out@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/timed-out/-/timed-out-4.0.1.tgz#f32eacac5a175bea25d7fab565ab3ed8741ef56f" + timers-browserify@^2.0.4: version "2.0.4" resolved "https://registry.yarnpkg.com/timers-browserify/-/timers-browserify-2.0.4.tgz#96ca53f4b794a5e7c0e1bd7cc88a372298fa01e6" @@ -7634,12 +7932,20 @@ trim-right@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/trim-right/-/trim-right-1.0.1.tgz#cb2e1203067e0c8de1f614094b9fe45704ea6003" +trim@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/trim/-/trim-0.0.1.tgz#5858547f6b290757ee95cccc666fb50084c460dd" + "true-case-path@^1.0.2": version "1.0.2" resolved "https://registry.yarnpkg.com/true-case-path/-/true-case-path-1.0.2.tgz#7ec91130924766c7f573be3020c34f8fdfd00d62" dependencies: glob "^6.0.4" +tslib@^1.7.1: + version "1.9.0" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.9.0.tgz#e37a86fda8cbbaf23a057f473c9f4dc64e5fc2e8" + tslib@^1.8.0: version "1.8.1" resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.8.1.tgz#6946af2d1d651a7b1863b531d6e5afa41aa44eac" @@ -7770,6 +8076,10 @@ urijs@^1.16.1: version "1.19.0" resolved "https://registry.yarnpkg.com/urijs/-/urijs-1.19.0.tgz#d8aa284d0e7469703a6988ad045c4cbfdf08ada0" +url-join@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/url-join/-/url-join-1.1.0.tgz#741c6c2f4596c4830d6718460920d0c92202dc78" + url-loader@0.6.2: version "0.6.2" resolved "https://registry.yarnpkg.com/url-loader/-/url-loader-0.6.2.tgz#a007a7109620e9d988d14bce677a1decb9a993f7" @@ -7798,6 +8108,10 @@ url-parse@^1.1.8: querystringify "~1.0.0" requires-port "~1.0.0" +url-set-query@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/url-set-query/-/url-set-query-1.0.0.tgz#016e8cfd7c20ee05cafe7795e892bd0702faa339" + url-toolkit@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/url-toolkit/-/url-toolkit-2.1.1.tgz#96c2da3cd672df1aa2ac7fc89240b2dcf5c99a80" @@ -7816,6 +8130,12 @@ usb@^1.3.1: nan "^2.8.0" node-pre-gyp "^0.6.30" +utf8-encoding@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/utf8-encoding/-/utf8-encoding-0.1.2.tgz#8717015cb8b923bc0303bf4af520af96f06ae9a2" + dependencies: + obtain-unicode "~0.0.5" + utf8@^2.1.1: version "2.1.2" resolved "https://registry.yarnpkg.com/utf8/-/utf8-2.1.2.tgz#1fa0d9270e9be850d9b05027f63519bf46457d96" @@ -7861,6 +8181,10 @@ validate-npm-package-license@^3.0.1: spdx-correct "~1.0.0" spdx-expression-parse "~1.0.0" +value-pipe@~1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/value-pipe/-/value-pipe-1.0.1.tgz#c7f09dbb105a72a9f5bdbd7085b537f10e995492" + vary@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" @@ -8468,6 +8792,27 @@ xdg-basedir@^2.0.0: dependencies: os-homedir "^1.0.0" +xhr-request@^1.0.1: + version "1.1.0" + resolved "https://registry.yarnpkg.com/xhr-request/-/xhr-request-1.1.0.tgz#f4a7c1868b9f198723444d82dcae317643f2e2ed" + dependencies: + buffer-to-arraybuffer "^0.0.5" + object-assign "^4.1.1" + query-string "^5.0.1" + simple-get "^2.7.0" + timed-out "^4.0.1" + url-set-query "^1.0.0" + xhr "^2.0.4" + +xhr@^2.0.4: + version "2.4.1" + resolved "https://registry.yarnpkg.com/xhr/-/xhr-2.4.1.tgz#ba982cced205ae5eec387169ac9dc77ca4853d38" + dependencies: + global "~4.3.0" + is-function "^1.0.1" + parse-headers "^2.0.0" + xtend "^4.0.0" + xml-char-classes@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/xml-char-classes/-/xml-char-classes-1.0.0.tgz#64657848a20ffc5df583a42ad8a277b4512bbc4d" @@ -8484,7 +8829,7 @@ xmlhttprequest@1: version "1.8.0" resolved "https://registry.yarnpkg.com/xmlhttprequest/-/xmlhttprequest-1.8.0.tgz#67fe075c5c24fef39f9d65f5f7b7fe75171968fc" -xtend@^4.0.0, xtend@^4.0.1, xtend@~4.0.0: +xtend@^4.0.0, xtend@^4.0.1, xtend@~4.0.0, xtend@~4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.1.tgz#a5c6d532be656e23db820efb943a1f04998d63af"