97 |
98 |
99 |
100 |
101 |
102 |
103 |
104 |
105 |
106 |
107 | 完成
108 |
109 |
124 |
125 |
126 | ├── page.ts ├── .gitignore ├── Demo.png ├── menu.gif ├── add_symbol.gif ├── assets ├── add.png ├── btc1.png ├── edit.png ├── MyIcon.icns ├── bitcoin.png ├── 577241-200.png ├── bitcoin_w.png ├── opengraph.png ├── box_edit-512.png ├── bitcoin_w_small.png ├── bitcoin_w_small_1.png ├── blockchain-39-512.png ├── anticlockwise-downwards-and-upwards-open-circle-arrows_1f504.png └── CreateIcns.src ├── price_alert.gif ├── readme.md ├── package.json ├── tools.js ├── index.js ├── index.html ├── index.css ├── page.js └── yarn.lock /page.ts: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | 2 | /node_modules/ 3 | /out/ 4 | .DS_Store 5 | *.log -------------------------------------------------------------------------------- /Demo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yoomin233/electron-cryptocurrency-price-tray/HEAD/Demo.png -------------------------------------------------------------------------------- /menu.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yoomin233/electron-cryptocurrency-price-tray/HEAD/menu.gif -------------------------------------------------------------------------------- /add_symbol.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yoomin233/electron-cryptocurrency-price-tray/HEAD/add_symbol.gif -------------------------------------------------------------------------------- /assets/add.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yoomin233/electron-cryptocurrency-price-tray/HEAD/assets/add.png -------------------------------------------------------------------------------- /assets/btc1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yoomin233/electron-cryptocurrency-price-tray/HEAD/assets/btc1.png -------------------------------------------------------------------------------- /assets/edit.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yoomin233/electron-cryptocurrency-price-tray/HEAD/assets/edit.png -------------------------------------------------------------------------------- /price_alert.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yoomin233/electron-cryptocurrency-price-tray/HEAD/price_alert.gif -------------------------------------------------------------------------------- /assets/MyIcon.icns: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yoomin233/electron-cryptocurrency-price-tray/HEAD/assets/MyIcon.icns -------------------------------------------------------------------------------- /assets/bitcoin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yoomin233/electron-cryptocurrency-price-tray/HEAD/assets/bitcoin.png -------------------------------------------------------------------------------- /assets/577241-200.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yoomin233/electron-cryptocurrency-price-tray/HEAD/assets/577241-200.png -------------------------------------------------------------------------------- /assets/bitcoin_w.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yoomin233/electron-cryptocurrency-price-tray/HEAD/assets/bitcoin_w.png -------------------------------------------------------------------------------- /assets/opengraph.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yoomin233/electron-cryptocurrency-price-tray/HEAD/assets/opengraph.png -------------------------------------------------------------------------------- /assets/box_edit-512.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yoomin233/electron-cryptocurrency-price-tray/HEAD/assets/box_edit-512.png -------------------------------------------------------------------------------- /assets/bitcoin_w_small.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yoomin233/electron-cryptocurrency-price-tray/HEAD/assets/bitcoin_w_small.png -------------------------------------------------------------------------------- /assets/bitcoin_w_small_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yoomin233/electron-cryptocurrency-price-tray/HEAD/assets/bitcoin_w_small_1.png -------------------------------------------------------------------------------- /assets/blockchain-39-512.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yoomin233/electron-cryptocurrency-price-tray/HEAD/assets/blockchain-39-512.png -------------------------------------------------------------------------------- /assets/anticlockwise-downwards-and-upwards-open-circle-arrows_1f504.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yoomin233/electron-cryptocurrency-price-tray/HEAD/assets/anticlockwise-downwards-and-upwards-open-circle-arrows_1f504.png -------------------------------------------------------------------------------- /readme.md: -------------------------------------------------------------------------------- 1 | ⚠️⚠️⚠️ This project is unavailable due to remote API changes. 2 | ⚠️⚠️⚠️ 由于比特儿的行情API改变, 该项目不可用. 3 | ## Features 4 | 5 | #### 1. 在主界面添加, 删除, 排序交易对; 6 | 7 |  8 | 9 | #### 2. 设置价格提醒, 当交易对的价格达到设定值时, 会以原生notification的形式弹出通知; 10 | 11 |  12 | 13 | #### 3. 在托盘区轮播交易对的最新价格, 为了配合Mojave, 添加了最新的暗色主题! 14 | 15 |  16 | 17 | ## BUILD 18 | 19 | 1. `npm install` or `yarn` 20 | 2. `npm run package` 21 | 22 | 输出应用在`./out`文件夹, 之后你可以将`Coins-Price_Tracker.app`文件夹拷贝到`~/Applications`文件夹以方便在spotlight搜索中打开 23 | 24 | Data Source: 25 | https://gate.io/ 26 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "Coins-Price-Tracker", 3 | "version": "1.0.0", 4 | "description": "", 5 | "main": "index.js", 6 | "scripts": { 7 | "test": "echo \"Error: no test specified\" && exit 1", 8 | "start": "electron .", 9 | "package": "cd ./assets && source ./CreateIcns.src && cd ../ &&NODE_ENV=production electron-packager . --platform=darwin --arch=x64 --out=out --icon=./assets/MyIcon.icns --overwrite" 10 | }, 11 | "keywords": [], 12 | "author": "", 13 | "license": "ISC", 14 | "devDependencies": { 15 | "electron-packager": "^7.3.0", 16 | "electron-prebuilt": "^1.2.7" 17 | }, 18 | "dependencies": { 19 | "pako": "^1.0.6" 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /assets/CreateIcns.src: -------------------------------------------------------------------------------- 1 | mkdir MyIcon.iconset 2 | sips -z 16 16 opengraph.png --out MyIcon.iconset/icon_16x16.png 3 | sips -z 32 32 opengraph.png --out MyIcon.iconset/icon_16x16@2x.png 4 | sips -z 32 32 opengraph.png --out MyIcon.iconset/icon_32x32.png 5 | sips -z 64 64 opengraph.png --out MyIcon.iconset/icon_32x32@2x.png 6 | sips -z 128 128 opengraph.png --out MyIcon.iconset/icon_128x128.png 7 | sips -z 256 256 opengraph.png --out MyIcon.iconset/icon_128x128@2x.png 8 | sips -z 256 256 opengraph.png --out MyIcon.iconset/icon_256x256.png 9 | sips -z 512 512 opengraph.png --out MyIcon.iconset/icon_256x256@2x.png 10 | sips -z 512 512 opengraph.png --out MyIcon.iconset/icon_512x512.png 11 | cp opengraph.png MyIcon.iconset/icon_512x512@2x.png 12 | iconutil -c icns MyIcon.iconset 13 | rm -R MyIcon.iconset -------------------------------------------------------------------------------- /tools.js: -------------------------------------------------------------------------------- 1 | exports.throttle = function(func, delay, tail) { 2 | let lastCalled = Date.now(); 3 | let timer; 4 | // if (tail) { 5 | 6 | // } 7 | return (...args) => { 8 | const now = Date.now(); 9 | if (now - lastCalled > delay) { 10 | func(...args); 11 | lastCalled = now; 12 | } 13 | if (tail) { 14 | clearTimeout(timer); 15 | timer = setTimeout(func, delay / 2, ...args); 16 | } 17 | }; 18 | }; 19 | 20 | exports.showTip = function(message, delay = 3000) { 21 | const div = document.createElement("div"); 22 | div.classList.add("tip"); 23 | div.innerHTML = String(message); 24 | document.body.appendChild(div); 25 | setTimeout(() => div.classList.add("showed"), 50); 26 | setTimeout(() => { 27 | div.classList.remove("showed"); 28 | setTimeout(() => document.body.removeChild(div), 500); 29 | }, delay); 30 | }; 31 | -------------------------------------------------------------------------------- /index.js: -------------------------------------------------------------------------------- 1 | const { app, BrowserWindow, ipcMain, Tray } = require("electron"); 2 | const path = require("path"); 3 | 4 | let tray = null; 5 | let window = null; 6 | 7 | const assetsDir = path.join(__dirname, "./assets"); 8 | 9 | // app not in the dock 10 | // app.dock. 11 | app.dock.hide(); 12 | 13 | app.on("ready", () => { 14 | createTray(); 15 | createWindow(); 16 | }); 17 | 18 | app.on("window-all-closed", () => { 19 | app.quit(); 20 | }); 21 | 22 | const createTray = () => { 23 | tray = new Tray(path.join(__dirname, "./assets/bitcoin_w_small.png")); 24 | // tray.setTitle("hhehda"); 25 | tray.on("right-click", toggleWindow); 26 | tray.on("double-click", toggleWindow); 27 | tray.on("click", e => { 28 | toggleWindow(); 29 | // console.log(process.defaultApp, e.metaKey) 30 | // window.openDevTools({ 31 | // mode: "detach" 32 | // }); 33 | // if (window.isVisible() && process.defaultApp && e.metaKey) { 34 | // } 35 | }); 36 | }; 37 | 38 | const createWindow = () => { 39 | window = new BrowserWindow({ 40 | width: 400, 41 | // height: 400, 42 | minHeight: 200, 43 | maxHeight: 400, 44 | show: false, 45 | frame: false, 46 | fullscreenable: false, 47 | resizable: false, 48 | transparent: true, 49 | webPreferences: { 50 | // Prevents renderer process code from not running when window is 51 | // hidden 52 | backgroundThrottling: false 53 | } 54 | }); 55 | window.loadURL(`file://${path.join(__dirname, "index.html")}`); 56 | // Hide the window when it loses focus 57 | window.on("focus", () => { 58 | window.webContents.send("event-window-focus"); 59 | }); 60 | window.on("blur", () => { 61 | if (!window.webContents.isDevToolsOpened()) { 62 | window.hide(); 63 | } 64 | window.webContents.send("event-window-blur"); 65 | }); 66 | window.focus(); 67 | }; 68 | 69 | const toggleWindow = () => { 70 | if (window.isVisible()) { 71 | window.hide(); 72 | } else { 73 | showWindow(); 74 | } 75 | }; 76 | 77 | const showWindow = () => { 78 | const position = getWindowPosition(); 79 | window.setPosition(position.x, position.y, false); 80 | window.show(); 81 | window.focus(); 82 | }; 83 | 84 | const getWindowPosition = () => { 85 | const windowBounds = window.getBounds(); 86 | const trayBounds = tray.getBounds(); 87 | // console.log(trayBounds) 88 | 89 | // Center window horizontally below the tray icon 90 | const x = Math.round( 91 | trayBounds.x + trayBounds.width / 2 - windowBounds.width / 2 92 | ); 93 | 94 | // Position window 4 pixels vertically below the tray icon 95 | const y = Math.round(trayBounds.y + trayBounds.height + 4); 96 | // 97 | return { x: x, y: y }; 98 | }; 99 | 100 | ipcMain.on("show-window", () => { 101 | showWindow(); 102 | }); 103 | 104 | let ifShowInfo = true; 105 | ipcMain.on("price-update", (e, data) => { 106 | ifShowInfo && data && 107 | tray.setTitle(`${data.symbolName}:${Number(data.last).toPrecision(4)}`); 108 | }); 109 | 110 | ipcMain.on("signal-info-show", (e, ifShow) => { 111 | if (ifShow) { 112 | ifShowInfo = true; 113 | tray.setTitle("waiting..."); 114 | } else { 115 | tray.setTitle(""); 116 | ifShowInfo = false; 117 | } 118 | }); 119 | 120 | ipcMain.on("process_exit", e => { 121 | process.exit(); 122 | }); 123 | -------------------------------------------------------------------------------- /index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 |
5 | 6 | 7 | 8 | 9 |
97 |
98 |
99 |
100 |
101 |
102 |
103 |
104 |
105 |
106 |
107 | 完成
108 |
109 |
124 |
125 |
126 | ${Number( 204 | val.high24hr 205 | ).toFixed(4)}
${Number(val.low24hr).toFixed( 206 | 4 207 | )}
交易对:${key.replace( 278 | "_", 279 | "/" 280 | )}价格:${ 281 | alerts[key]["price"] 282 | }X
` 283 | ) 284 | .concat( 285 | "" 286 | ) 287 | .join(""); 288 | } 289 | let addMode; 290 | const showModal = (() => { 291 | const adderTitle = adder.querySelector("p:first-child > span:first-child"); 292 | const priceInputWrapper = adder.querySelector(".priceInputWrapper"); 293 | const shade = document.querySelector(".modalShade"); 294 | // const priceInput = adder.querySelector(".priceInput"); 295 | 296 | return (whichModal, mode) => { 297 | // if (document.activeElement === adder) { 298 | // return; 299 | // } 300 | const modal = document.querySelector(`div.modal.${whichModal}`); 301 | if (whichModal === "symbolAdder") { 302 | if (mode === "alert") { 303 | adderTitle.innerHTML = "增加价格通知"; 304 | priceInputWrapper.style.display = "flex"; 305 | } else { 306 | adderTitle.innerHTML = "增加交易对"; 307 | priceInputWrapper.style.display = "none"; 308 | } 309 | } else if (whichModal === "priceAlerts") { 310 | renderPriceAlerts(); 311 | } 312 | modal.style.display = "block"; 313 | shade.style.display = "block"; 314 | setTimeout(() => { 315 | modal.classList.add("showed"); 316 | shade.classList.add("showed"); 317 | whichModal === "symbolAdder" && addInput.focus(); 318 | }, 50); 319 | if (!adder.dataset.pairs) { 320 | fetch("https://data.gateio.io/api2/1/pairs") 321 | .then(data => data.json()) 322 | .then(data => { 323 | adder.dataset.pairs = JSON.stringify( 324 | data 325 | // .filter(pair => /USDT/.test(pair)) 326 | .map(pair => pair.toLowerCase()) 327 | ); 328 | }); 329 | } 330 | }; 331 | })(); 332 | // add symbol appear 333 | addSymbolButton.addEventListener("click", e => { 334 | addMode = "token"; 335 | showModal("symbolAdder", addMode); 336 | }); 337 | 338 | // show price alert button 339 | document.querySelector("span.alarm").addEventListener("click", e => { 340 | showModal("priceAlerts", addMode); 341 | }); 342 | 343 | // add price alerts 344 | document 345 | .querySelector(".priceAlertsListwrapper") 346 | .addEventListener("click", e => { 347 | if (e.srcElement.tagName === "BUTTON") { 348 | addMode = "alert"; 349 | showModal("symbolAdder", addMode); 350 | } else if (e.srcElement.classList.contains("delBtn")) { 351 | const pairName = e.srcElement.parentElement.dataset.pairname; 352 | delete alerts[pairName]; 353 | localStorage.setItem("alerts", JSON.stringify(alerts)); 354 | showTip("删除价格提醒成功!"); 355 | renderPriceAlerts(); 356 | } else if (e.srcElement.classList.contains("alertPrice")) { 357 | const pairName = e.srcElement.parentElement.dataset.pairname; 358 | const priceElem = e.srcElement; 359 | const inputElem = document.createElement("input"); 360 | inputElem.value = Number(priceElem.innerHTML.match(/([0-9.]+)/g)); 361 | inputElem.setAttribute("type", "number"); 362 | inputElem.addEventListener("blur", e => { 363 | // ui 364 | const val = e.target.value; 365 | if (val <= 0) { 366 | inputElem.classList.add("bounce"); 367 | // e.preventDefault(); 368 | inputElem.value = ""; 369 | inputElem.focus(); 370 | return setTimeout(() => inputElem.classList.remove("bounce"), 500); 371 | } 372 | 373 | priceElem.removeChild(inputElem); 374 | priceElem.innerHTML = `价格:${e.target.value}`; 375 | // modal 376 | alerts[pairName] = Object.assign({}, alerts[pairName], { 377 | price: val 378 | }); 379 | localStorage.setItem("alerts", JSON.stringify(alerts)); 380 | showTip("价格提醒更新成功!"); 381 | }); 382 | priceElem.innerHTML = ""; 383 | priceElem.appendChild(inputElem); 384 | inputElem.focus(); 385 | } 386 | }); 387 | 388 | // modal disappear 389 | document 390 | .querySelector("div.symbolAdder > p:first-of-type > span:last-of-type") 391 | .addEventListener("click", () => modalDisappear("symbolAdder")); 392 | document 393 | .querySelector("div.priceAlerts > p:first-of-type > span:last-of-type") 394 | .addEventListener("click", () => modalDisappear("priceAlerts")); 395 | 396 | function modalDisappear(whichModal) { 397 | const modal = document.querySelector(`div.modal.${whichModal}`); 398 | const shade = document.querySelector("div.modalShade"); 399 | const modals = document.querySelectorAll("div.modal.showed"); 400 | modal.classList.remove("showed"); 401 | modals.length === 1 && shade.classList.remove("showed"); 402 | if (whichModal === "symbolAdder") { 403 | addInput.value = ""; 404 | addInput.blur(); 405 | adder.querySelector("input.priceInput").value = ""; 406 | adder.querySelector("input.priceInput").blur(); 407 | } 408 | setTimeout(() => { 409 | modal.style.display = "none"; 410 | modals.length === 1 && (shade.style.display = "none"); 411 | }, 500); 412 | } 413 | // addInput.addEventListener("input", e => { 414 | 415 | // console.log(e.nativeEvent) 416 | // }); 417 | // function appendPairsHtml (e) { 418 | 419 | // } 420 | // addInput.addEventListener('focus', e => { 421 | 422 | // })\ 423 | addInput.addEventListener("keydown", e => { 424 | if (e.keyCode === 38 || e.keyCode === 40) { 425 | e.preventDefault(); 426 | } 427 | }); 428 | addInput.addEventListener( 429 | "keyup", 430 | (() => { 431 | let selectedIndex = -1; 432 | const display = document.querySelector("div.pairsDisplay"); 433 | display.addEventListener( 434 | "mousemove", 435 | throttle( 436 | e => { 437 | // console.log(e); 438 | if (e.srcElement.nodeName === "P") { 439 | const thisChildIndex = Array.prototype.indexOf.call( 440 | display.childNodes, 441 | e.srcElement 442 | ); 443 | selectedIndex = thisChildIndex; 444 | display.childNodes.forEach( 445 | (elem, index) => 446 | index === selectedIndex 447 | ? elem.classList.add("pair_selected") 448 | : elem.classList.remove("pair_selected") 449 | ); 450 | } 451 | }, 452 | 200, 453 | true 454 | ) 455 | ); 456 | // let displayHandlePromise 457 | display.addEventListener("click", e => { 458 | if (selectedIndex !== -1) { 459 | const selectedPair = display.childNodes[selectedIndex].dataset.pair; 460 | // console.log(selectedPair); 461 | addInput.value = selectedPair; 462 | selectedIndex = -1; 463 | display.style.display = "none"; 464 | display.innerHTML = ""; 465 | } 466 | }); 467 | addInput.addEventListener("blur", e => { 468 | // console.log(e); 469 | setTimeout(() => { 470 | selectedIndex = -1; 471 | display.style.display = "none"; 472 | display.innerHTML = ""; 473 | }, 200); 474 | }); 475 | addInput.addEventListener("focus", e => { 476 | if (e.target.value) { 477 | appendPairsHtml(e); 478 | } 479 | }); 480 | function appendPairsHtml(e) { 481 | let pairs = adder.dataset.pairs; 482 | if (pairs) { 483 | pairs = JSON.parse(pairs); 484 | const pairListHTML = pairs 485 | .filter(pair => pair.match(e.target.value)) 486 | .map(pair => `${pair}
`) 487 | .join(""); 488 | display.style.display = "block"; 489 | display.innerHTML = pairListHTML; 490 | } 491 | selectedIndex = -1; 492 | } 493 | return e => { 494 | if (!e.target.value) { 495 | display.innerHTML = ""; 496 | display.style.display = "none"; 497 | return; 498 | } 499 | const { keyCode } = e; 500 | const displayChildren = display.childNodes; 501 | // const inputVal = e.target.value; 502 | // up 503 | if (keyCode === 38) { 504 | // e.preventDefault(); 505 | if (selectedIndex > 0) { 506 | selectedIndex--; 507 | displayChildren.forEach( 508 | (elem, index) => 509 | index === selectedIndex 510 | ? (elem.classList.add("pair_selected"), 511 | elem.scrollIntoView(), 512 | (addInput.value = elem.dataset.pair)) 513 | : elem.classList.remove("pair_selected") 514 | ); 515 | } 516 | } else if (keyCode === 40) { 517 | // e.preventDefault(); 518 | if (selectedIndex < displayChildren.length - 1) { 519 | selectedIndex++; 520 | displayChildren.forEach( 521 | (elem, index) => 522 | index === selectedIndex 523 | ? (elem.classList.add("pair_selected"), 524 | elem.scrollIntoViewIfNeeded(), 525 | (addInput.value = elem.dataset.pair)) 526 | : elem.classList.remove("pair_selected") 527 | ); 528 | } 529 | } else if (keyCode === 13) { 530 | if (selectedIndex !== -1) { 531 | const selectedPair = display.childNodes[selectedIndex].dataset.pair; 532 | e.target.value = selectedPair; 533 | selectedIndex = -1; 534 | display.style.display = "none"; 535 | display.innerHTML = ""; 536 | } else { 537 | addSymbolHandler(e); 538 | } 539 | } else { 540 | appendPairsHtml(e); 541 | } 542 | // console.log(selectedIndex); 543 | }; 544 | })() 545 | ); 546 | function addSymbolHandler(e) { 547 | function inputBounce(elem) { 548 | elem.classList.add("bounce"); 549 | elem.focus && elem.focus(); 550 | setTimeout(() => { 551 | elem.classList.remove("bounce"); 552 | }, 500); 553 | } 554 | if (!addInput.value) { 555 | return inputBounce(addInput); 556 | } else { 557 | const selectedValue = addInput.value; 558 | const selectableValue = JSON.parse(adder.dataset.pairs); 559 | const selectedAlertPrice = adder.querySelector("input.priceInput"); 560 | if (!selectableValue.includes(selectedValue)) { 561 | addInput.value = ""; 562 | return inputBounce(addInput); 563 | } 564 | if (addMode === "alert") { 565 | // if (selectableValue.includes(selectedValue)) 566 | if (!selectedAlertPrice.value || selectedAlertPrice.value <= 0) { 567 | return inputBounce(selectedAlertPrice); 568 | } 569 | showTip(`${alerts[selectedValue] ? "更新" : "新增"}价格提醒成功!`); 570 | alerts[selectedValue] = { 571 | price: selectedAlertPrice.value, 572 | persist: true 573 | }; 574 | localStorage.setItem("alerts", JSON.stringify(alerts)); 575 | renderPriceAlerts(); 576 | // modalDisappear(); 577 | } 578 | modalDisappear("symbolAdder"); 579 | if (!symbols.includes(selectedValue)) { 580 | // debugger; 581 | symbols.push(selectedValue); 582 | fetchLatestPrice(); 583 | } 584 | // if (selectableValue.includes(selectedValue)) { 585 | 586 | // } else { 587 | // addInput.classList.add("bounce"); 588 | // addInput.focus(); 589 | // setTimeout(() => { 590 | // addInput.classList.remove("bounce"); 591 | // }, 500); 592 | // } 593 | } 594 | } 595 | document 596 | .querySelector(".symbolAdder > button") 597 | .addEventListener("click", addSymbolHandler); 598 | 599 | // editing status 600 | let editingList = false; 601 | document.querySelector("span.editWrapper").addEventListener( 602 | "click", 603 | (() => { 604 | const editBtn = document.querySelector("span.editList"); 605 | const finishEditBtn = document.querySelector("span.finishEdit"); 606 | return e => { 607 | const symbolBlocks = document.querySelectorAll("div.symbol-block"); 608 | Array.prototype.forEach.call(symbolBlocks, (elem, index) => { 609 | if (editingList) { 610 | setTimeout(() => { 611 | // elem.removeChild(elem.childNodes[4]); 612 | elem.removeChild(elem.lastElementChild); 613 | }, 300); 614 | } else { 615 | const controlWrapper = document.createElement("div"); 616 | controlWrapper.innerHTML = `-`; 617 | controlWrapper.classList.add("controlWrapper"); 618 | // controlWrapper.classList.add("delBtn"); 619 | elem.appendChild(controlWrapper); 620 | 621 | // move element 622 | // const moveDragBtn = document.createElement("div"); 623 | // moveDragBtn.classList.add("dragBtn"); 624 | // moveDragBtn.innerHTML = "hehda"; 625 | // elem.appendChild(moveDragBtn); 626 | // elem.style.flexShrink = "1"; 627 | } 628 | elem.classList.toggle("flexShrink1"); 629 | }); 630 | // editBtn.classList.toggle("showed"); 631 | // setTimeout(() => finishEditBtn.classList.toggle("showed"), 400); 632 | (editingList ? finishEditBtn : editBtn).classList.toggle("showed"); 633 | setTimeout( 634 | (editing => () => { 635 | (editing ? editBtn : finishEditBtn).classList.toggle("showed"); 636 | // console.log(editing); 637 | })(editingList), 638 | 400 639 | ); 640 | if (!editingList) { 641 | clearTimeout(mainTimer); 642 | } else { 643 | mainTimer = setTimeout(mainProcess, fetchInterval * 1000); 644 | } 645 | editingList = !editingList; 646 | }; 647 | })() 648 | ); 649 | 650 | // del and grap&drop btn handler 651 | mainWrapper.addEventListener("click", e => { 652 | // del btn clicked 653 | if (e.srcElement.classList.contains("delBtn")) { 654 | // remove dom element 655 | const parent = e.target.parentElement.parentElement; 656 | const symbolName = parent.dataset.symbol; 657 | parent.remove(); 658 | // modify local storage 659 | symbols.splice(symbols.indexOf(symbolName), 1); 660 | localStorage.setItem("tokens_list", symbols); 661 | if (alerts[symbolName]) { 662 | delete alerts[symbolName]; 663 | showTip(`删除价格提醒: ${symbolName.replace("_", "/")}`); 664 | localStorage.setItem("alerts", JSON.stringify(alerts)); 665 | } 666 | } 667 | }); 668 | mainWrapper.addEventListener( 669 | "mousedown", 670 | (() => { 671 | // const mainWrapperTop = mainWrapper.getBoundingClientRect().top; 672 | let blockCount; 673 | let blockDimension; 674 | let placeHoderDiv; 675 | let draggedBlock; 676 | let draggedBlockIndex; 677 | let mouseDragStartingY; 678 | let latestMovedIndex; 679 | // let mouseDragStartingY; 680 | mainWrapper.addEventListener("mousemove", e => { 681 | if (draggedBlock) { 682 | // console.log(e, draggedBlock); 683 | // draggedmouseDragStartingY = draggedBlock.getBoundingClientRect(); 684 | // change draggedElem position 685 | const draggedDistance = e.clientY - mouseDragStartingY; 686 | draggedBlock.style.top = `${draggedBlockIndex * 687 | blockDimension.height + 688 | draggedDistance}px`; 689 | // change placeholder div position 690 | // console.log(draggedDistance); 691 | const draggedBlockCount = 692 | draggedDistance > 0 693 | ? Math.floor(draggedDistance / blockDimension.height) 694 | : Math.ceil(draggedDistance / blockDimension.height); 695 | // console.log(draggedBlockCount); 696 | // make placeholder move {draggedBlockCount} blocks 697 | // console.log(draggedBlockCount); 698 | // console.log(draggedDistance); 699 | if ( 700 | draggedBlockCount >= 0 - draggedBlockIndex && 701 | draggedBlockCount < blockCount - draggedBlockIndex 702 | ) { 703 | if (latestMovedIndex !== draggedBlockCount) { 704 | latestMovedIndex = draggedBlockCount; 705 | // console.log(latestMovedIndex); 706 | mainWrapper.removeChild(placeHoderDiv); 707 | mainWrapper.insertBefore( 708 | placeHoderDiv, 709 | mainWrapper.childNodes[ 710 | draggedBlockIndex + 711 | draggedBlockCount + 712 | (latestMovedIndex > 0 ? 1 : 0) 713 | ] 714 | ); 715 | } 716 | } 717 | // if () 718 | } 719 | }); 720 | mainWrapper.addEventListener("mouseup", e => { 721 | if (draggedBlock) { 722 | mainWrapper.removeChild(draggedBlock); 723 | mainWrapper.insertBefore( 724 | draggedBlock, 725 | placeHoderDiv.nextElementSibling 726 | ); 727 | mainWrapper.removeChild(placeHoderDiv); 728 | 729 | draggedBlock.style.position = ""; 730 | draggedBlock.style.top = ""; 731 | draggedBlock = null; 732 | localStorage.setItem( 733 | "tokens_list", 734 | Array.prototype.map.call( 735 | mainWrapper.childNodes, 736 | (elem, index) => elem.dataset.symbol 737 | ) 738 | ); 739 | } 740 | }); 741 | return e => { 742 | // console.log(e); 743 | if (e.srcElement.classList.contains("dragBtn")) { 744 | draggedBlock = e.target.parentElement.parentElement; 745 | blockDimension = draggedBlock.getBoundingClientRect(); 746 | // record starting pos and count 747 | // draggedBlock = draggedBlock; 748 | draggedBlockIndex = Array.prototype.indexOf.call( 749 | mainWrapper.childNodes, 750 | draggedBlock 751 | ); 752 | blockCount = mainWrapper.childElementCount; 753 | // draggedStartingTop = draggedBlock.getBoundingClientRect().top; 754 | mouseDragStartingY = e.clientY; 755 | 756 | // create placeholder div 757 | placeHoderDiv = document.createElement("div"); 758 | placeHoderDiv.setAttribute( 759 | "style", 760 | `width: 100%;height: ${blockDimension.height}px` 761 | ); 762 | draggedBlock.parentElement.insertBefore( 763 | placeHoderDiv, 764 | draggedBlock.nextElementSibling 765 | ); 766 | 767 | draggedBlock.style.position = "absolute"; 768 | // draggedBlock.style.left = "10px"; 769 | // draggedBlock.style.top = "130px"; 770 | // mainWrapper.appendChild(parentBlock); 771 | // console.log(draggedStartingTop, startingTop); 772 | } 773 | }; 774 | })() 775 | ); 776 | 777 | // menu handling... 778 | let menuExpanded = false; 779 | document.querySelector("span.menuWrapper").addEventListener( 780 | "click", 781 | (() => { 782 | const menuIcon = document.querySelector("span.menuIcon"); 783 | const menu = document.querySelector("div.menu"); 784 | const menuShade = document.querySelector("div.menuShade"); 785 | function toggleMenuStatus(e) { 786 | menuIcon.classList.toggle("expanded"); 787 | if (!menuExpanded) { 788 | menu.style.display = "block"; 789 | themeSwitch.focus(); 790 | } else { 791 | setTimeout(() => { 792 | menu.style.display = "none"; 793 | }, 500); 794 | } 795 | setTimeout(() => { 796 | menu.classList.toggle("showed"); 797 | }, 50); 798 | menuExpanded = !menuExpanded; 799 | } 800 | menuShade.addEventListener("click", toggleMenuStatus); 801 | return toggleMenuStatus; 802 | })() 803 | ); 804 | 805 | // shell to ext links... 806 | document.querySelector("p.about").addEventListener("click", e => { 807 | if (e.srcElement.tagName === "A") { 808 | e.preventDefault(); 809 | // console.log("a!"); 810 | shell.openExternal(e.srcElement.href); 811 | } 812 | }); 813 | 814 | document.querySelector("p.exit").addEventListener("click", e => { 815 | ipcRenderer.send("process_exit"); 816 | }); 817 | 818 | // document.querySelector("button.testBtn").addEventListener("click", () => { 819 | // showTip("hehdasdsds"); 820 | // }); 821 | 822 | // send prices to tray 823 | setTimeout(function inner(index = 0) { 824 | // let index = index || 0 825 | const priceLen = prices.length; 826 | // console.log(priceLen, prices, index); 827 | if (priceLen) { 828 | ipcRenderer.send("price-update", prices[index]); 829 | } else { 830 | ipcRenderer.send("price-update", { 831 | symbolName: "please add symbol", 832 | last: 0 833 | }); 834 | } 835 | // console.log(index, priceLen); 836 | setTimeout(inner, 5000, index >= priceLen - 1 ? 0 : ++index); 837 | }, 5000); 838 | 839 | // start main process 840 | let fetchInterval = foregroundFetchInterval; 841 | let mainTimer = null; 842 | 843 | fetchLatestPrice(); 844 | function mainProcess() { 845 | console.log("main run!"); 846 | try { 847 | fetchLatestPrice(); 848 | mainTimer = setTimeout(mainProcess, fetchInterval * 1000); 849 | } catch (e) { 850 | // console.log(e); 851 | mainTimer = setTimeout(mainProcess, fetchInterval * 1000); 852 | } 853 | } 854 | mainProcess(); 855 | 856 | ipcRenderer.on("event-window-blur", e => { 857 | // console.log("blured!"); 858 | clearTimeout(mainTimer); 859 | fetchInterval = backgroundFetchInterval; 860 | mainTimer = setTimeout(mainProcess, fetchInterval * 1000); 861 | }); 862 | 863 | ipcRenderer.on("event-window-focus", e => { 864 | // console.log("focus!"); 865 | clearTimeout(mainTimer); 866 | fetchInterval = foregroundFetchInterval; 867 | mainTimer = mainProcess(); 868 | }); 869 | })(); 870 | -------------------------------------------------------------------------------- /yarn.lock: -------------------------------------------------------------------------------- 1 | # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. 2 | # yarn lockfile v1 3 | 4 | 5 | abbrev@1: 6 | version "1.1.1" 7 | resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" 8 | 9 | ajv@^5.1.0: 10 | version "5.5.2" 11 | resolved "https://registry.yarnpkg.com/ajv/-/ajv-5.5.2.tgz#73b5eeca3fab653e3d3f9422b341ad42205dc965" 12 | dependencies: 13 | co "^4.6.0" 14 | fast-deep-equal "^1.0.0" 15 | fast-json-stable-stringify "^2.0.0" 16 | json-schema-traverse "^0.3.0" 17 | 18 | ansi-regex@^2.0.0: 19 | version "2.1.1" 20 | resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" 21 | 22 | array-find-index@^1.0.1: 23 | version "1.0.2" 24 | resolved "https://registry.yarnpkg.com/array-find-index/-/array-find-index-1.0.2.tgz#df010aa1287e164bbda6f9723b0a96a1ec4187a1" 25 | 26 | asar@^0.12.0: 27 | version "0.12.4" 28 | resolved "https://registry.yarnpkg.com/asar/-/asar-0.12.4.tgz#2dd3f116882eab8c0f23b754792a82a7d9fce171" 29 | dependencies: 30 | chromium-pickle-js "^0.2.0" 31 | commander "^2.9.0" 32 | cuint "^0.2.1" 33 | glob "^6.0.4" 34 | minimatch "^3.0.3" 35 | mkdirp "^0.5.0" 36 | mksnapshot "^0.3.0" 37 | tmp "0.0.28" 38 | 39 | asn1@~0.2.3: 40 | version "0.2.3" 41 | resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.3.tgz#dac8787713c9966849fc8180777ebe9c1ddf3b86" 42 | 43 | assert-plus@1.0.0, assert-plus@^1.0.0: 44 | version "1.0.0" 45 | resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525" 46 | 47 | asynckit@^0.4.0: 48 | version "0.4.0" 49 | resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" 50 | 51 | aws-sign2@~0.7.0: 52 | version "0.7.0" 53 | resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.7.0.tgz#b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8" 54 | 55 | aws4@^1.6.0: 56 | version "1.7.0" 57 | resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.7.0.tgz#d4d0e9b9dbfca77bf08eeb0a8a471550fe39e289" 58 | 59 | balanced-match@^1.0.0: 60 | version "1.0.0" 61 | resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" 62 | 63 | base64-js@0.0.8: 64 | version "0.0.8" 65 | resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-0.0.8.tgz#1101e9544f4a76b1bc3b26d452ca96d7a35e7978" 66 | 67 | bcrypt-pbkdf@^1.0.0: 68 | version "1.0.1" 69 | resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz#63bc5dcb61331b92bc05fd528953c33462a06f8d" 70 | dependencies: 71 | tweetnacl "^0.14.3" 72 | 73 | binary@^0.3.0: 74 | version "0.3.0" 75 | resolved "https://registry.yarnpkg.com/binary/-/binary-0.3.0.tgz#9f60553bc5ce8c3386f3b553cff47462adecaa79" 76 | dependencies: 77 | buffers "~0.1.1" 78 | chainsaw "~0.1.0" 79 | 80 | bluebird@^3.1.1: 81 | version "3.5.1" 82 | resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.5.1.tgz#d9551f9de98f1fcda1e683d17ee91a0602ee2eb9" 83 | 84 | brace-expansion@^1.1.7: 85 | version "1.1.11" 86 | resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" 87 | dependencies: 88 | balanced-match "^1.0.0" 89 | concat-map "0.0.1" 90 | 91 | buffer-from@^1.0.0: 92 | version "1.1.0" 93 | resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.0.tgz#87fcaa3a298358e0ade6e442cfce840740d1ad04" 94 | 95 | buffers@~0.1.1: 96 | version "0.1.1" 97 | resolved "https://registry.yarnpkg.com/buffers/-/buffers-0.1.1.tgz#b24579c3bed4d6d396aeee6d9a8ae7f5482ab7bb" 98 | 99 | builtin-modules@^1.0.0: 100 | version "1.1.1" 101 | resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-1.1.1.tgz#270f076c5a72c02f5b65a47df94c5fe3a278892f" 102 | 103 | camelcase-keys@^2.0.0: 104 | version "2.1.0" 105 | resolved "https://registry.yarnpkg.com/camelcase-keys/-/camelcase-keys-2.1.0.tgz#308beeaffdf28119051efa1d932213c91b8f92e7" 106 | dependencies: 107 | camelcase "^2.0.0" 108 | map-obj "^1.0.0" 109 | 110 | camelcase@^2.0.0: 111 | version "2.1.1" 112 | resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-2.1.1.tgz#7c1d16d679a1bbe59ca02cacecfb011e201f5a1f" 113 | 114 | caseless@~0.12.0: 115 | version "0.12.0" 116 | resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" 117 | 118 | chainsaw@~0.1.0: 119 | version "0.1.0" 120 | resolved "https://registry.yarnpkg.com/chainsaw/-/chainsaw-0.1.0.tgz#5eab50b28afe58074d0d58291388828b5e5fbc98" 121 | dependencies: 122 | traverse ">=0.3.0 <0.4" 123 | 124 | chromium-pickle-js@^0.2.0: 125 | version "0.2.0" 126 | resolved "https://registry.yarnpkg.com/chromium-pickle-js/-/chromium-pickle-js-0.2.0.tgz#04a106672c18b085ab774d983dfa3ea138f22205" 127 | 128 | co@^4.6.0: 129 | version "4.6.0" 130 | resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" 131 | 132 | code-point-at@^1.0.0: 133 | version "1.1.0" 134 | resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77" 135 | 136 | combined-stream@1.0.6, combined-stream@~1.0.5: 137 | version "1.0.6" 138 | resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.6.tgz#723e7df6e801ac5613113a7e445a9b69cb632818" 139 | dependencies: 140 | delayed-stream "~1.0.0" 141 | 142 | commander@^2.9.0: 143 | version "2.15.1" 144 | resolved "https://registry.yarnpkg.com/commander/-/commander-2.15.1.tgz#df46e867d0fc2aec66a34662b406a9ccafff5b0f" 145 | 146 | concat-map@0.0.1: 147 | version "0.0.1" 148 | resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" 149 | 150 | concat-stream@1.6.2: 151 | version "1.6.2" 152 | resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.2.tgz#904bdf194cd3122fc675c77fc4ac3d4ff0fd1a34" 153 | dependencies: 154 | buffer-from "^1.0.0" 155 | inherits "^2.0.3" 156 | readable-stream "^2.2.2" 157 | typedarray "^0.0.6" 158 | 159 | core-util-is@1.0.2, core-util-is@~1.0.0: 160 | version "1.0.2" 161 | resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" 162 | 163 | cuint@^0.2.1: 164 | version "0.2.2" 165 | resolved "https://registry.yarnpkg.com/cuint/-/cuint-0.2.2.tgz#408086d409550c2631155619e9fa7bcadc3b991b" 166 | 167 | currently-unhandled@^0.4.1: 168 | version "0.4.1" 169 | resolved "https://registry.yarnpkg.com/currently-unhandled/-/currently-unhandled-0.4.1.tgz#988df33feab191ef799a61369dd76c17adf957ea" 170 | dependencies: 171 | array-find-index "^1.0.1" 172 | 173 | dashdash@^1.12.0: 174 | version "1.14.1" 175 | resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0" 176 | dependencies: 177 | assert-plus "^1.0.0" 178 | 179 | debug@2.6.9, debug@^2.1.3, debug@^2.2.0: 180 | version "2.6.9" 181 | resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" 182 | dependencies: 183 | ms "2.0.0" 184 | 185 | decamelize@^1.1.2: 186 | version "1.2.0" 187 | resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" 188 | 189 | decompress-zip@0.3.0: 190 | version "0.3.0" 191 | resolved "https://registry.yarnpkg.com/decompress-zip/-/decompress-zip-0.3.0.tgz#ae3bcb7e34c65879adfe77e19c30f86602b4bdb0" 192 | dependencies: 193 | binary "^0.3.0" 194 | graceful-fs "^4.1.3" 195 | mkpath "^0.1.0" 196 | nopt "^3.0.1" 197 | q "^1.1.2" 198 | readable-stream "^1.1.8" 199 | touch "0.0.3" 200 | 201 | deep-extend@^0.6.0: 202 | version "0.6.0" 203 | resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac" 204 | 205 | delayed-stream@~1.0.0: 206 | version "1.0.0" 207 | resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" 208 | 209 | ecc-jsbn@~0.1.1: 210 | version "0.1.1" 211 | resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz#0fc73a9ed5f0d53c38193398523ef7e543777505" 212 | dependencies: 213 | jsbn "~0.1.0" 214 | 215 | electron-download@^2.0.0: 216 | version "2.2.1" 217 | resolved "https://registry.yarnpkg.com/electron-download/-/electron-download-2.2.1.tgz#3d78af3645c96435e3bf3df9b882a14cc2ca294c" 218 | dependencies: 219 | debug "^2.2.0" 220 | home-path "^1.0.1" 221 | minimist "^1.2.0" 222 | mkdirp "^0.5.0" 223 | mv "^2.0.3" 224 | nugget "^1.5.1" 225 | path-exists "^1.0.0" 226 | rc "^1.1.2" 227 | 228 | electron-download@^3.0.1: 229 | version "3.3.0" 230 | resolved "https://registry.yarnpkg.com/electron-download/-/electron-download-3.3.0.tgz#2cfd54d6966c019c4d49ad65fbe65cc9cdef68c8" 231 | dependencies: 232 | debug "^2.2.0" 233 | fs-extra "^0.30.0" 234 | home-path "^1.0.1" 235 | minimist "^1.2.0" 236 | nugget "^2.0.0" 237 | path-exists "^2.1.0" 238 | rc "^1.1.2" 239 | semver "^5.3.0" 240 | sumchecker "^1.2.0" 241 | 242 | electron-osx-sign@^0.3.0: 243 | version "0.3.2" 244 | resolved "https://registry.yarnpkg.com/electron-osx-sign/-/electron-osx-sign-0.3.2.tgz#88fa7d6ebadb5d9c79368b96491a0d8c4630146e" 245 | dependencies: 246 | debug "^2.2.0" 247 | minimist "^1.1.1" 248 | run-series "^1.1.1" 249 | 250 | electron-packager@^7.3.0: 251 | version "7.7.0" 252 | resolved "https://registry.yarnpkg.com/electron-packager/-/electron-packager-7.7.0.tgz#9f0a33c6c25b59980ba4313e217f42111c9479a5" 253 | dependencies: 254 | asar "^0.12.0" 255 | debug "^2.2.0" 256 | electron-download "^2.0.0" 257 | electron-osx-sign "^0.3.0" 258 | extract-zip "^1.0.3" 259 | fs-extra "^0.30.0" 260 | get-package-info "^0.1.0" 261 | minimist "^1.1.1" 262 | plist "^1.1.0" 263 | rcedit "^0.5.1" 264 | resolve "^1.1.6" 265 | run-series "^1.1.1" 266 | 267 | electron-prebuilt@^1.2.7: 268 | version "1.4.13" 269 | resolved "https://registry.yarnpkg.com/electron-prebuilt/-/electron-prebuilt-1.4.13.tgz#0a0e4d7bf895a242061ccfab29394dcda1da33d2" 270 | dependencies: 271 | electron-download "^3.0.1" 272 | extract-zip "^1.0.3" 273 | 274 | error-ex@^1.2.0: 275 | version "1.3.2" 276 | resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" 277 | dependencies: 278 | is-arrayish "^0.2.1" 279 | 280 | es6-promise@^4.0.5: 281 | version "4.2.4" 282 | resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-4.2.4.tgz#dc4221c2b16518760bd8c39a52d8f356fc00ed29" 283 | 284 | extend@~3.0.1: 285 | version "3.0.1" 286 | resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.1.tgz#a755ea7bc1adfcc5a31ce7e762dbaadc5e636444" 287 | 288 | extract-zip@^1.0.3: 289 | version "1.6.7" 290 | resolved "https://registry.yarnpkg.com/extract-zip/-/extract-zip-1.6.7.tgz#a840b4b8af6403264c8db57f4f1a74333ef81fe9" 291 | dependencies: 292 | concat-stream "1.6.2" 293 | debug "2.6.9" 294 | mkdirp "0.5.1" 295 | yauzl "2.4.1" 296 | 297 | extsprintf@1.3.0: 298 | version "1.3.0" 299 | resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05" 300 | 301 | extsprintf@^1.2.0: 302 | version "1.4.0" 303 | resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.4.0.tgz#e2689f8f356fad62cca65a3a91c5df5f9551692f" 304 | 305 | fast-deep-equal@^1.0.0: 306 | version "1.1.0" 307 | resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz#c053477817c86b51daa853c81e059b733d023614" 308 | 309 | fast-json-stable-stringify@^2.0.0: 310 | version "2.0.0" 311 | resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz#d5142c0caee6b1189f87d3a76111064f86c8bbf2" 312 | 313 | fd-slicer@~1.0.1: 314 | version "1.0.1" 315 | resolved "https://registry.yarnpkg.com/fd-slicer/-/fd-slicer-1.0.1.tgz#8b5bcbd9ec327c5041bf9ab023fd6750f1177e65" 316 | dependencies: 317 | pend "~1.2.0" 318 | 319 | find-up@^1.0.0: 320 | version "1.1.2" 321 | resolved "https://registry.yarnpkg.com/find-up/-/find-up-1.1.2.tgz#6b2e9822b1a2ce0a60ab64d610eccad53cb24d0f" 322 | dependencies: 323 | path-exists "^2.0.0" 324 | pinkie-promise "^2.0.0" 325 | 326 | forever-agent@~0.6.1: 327 | version "0.6.1" 328 | resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" 329 | 330 | form-data@~2.3.1: 331 | version "2.3.2" 332 | resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.3.2.tgz#4970498be604c20c005d4f5c23aecd21d6b49099" 333 | dependencies: 334 | asynckit "^0.4.0" 335 | combined-stream "1.0.6" 336 | mime-types "^2.1.12" 337 | 338 | fs-extra@0.26.7: 339 | version "0.26.7" 340 | resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-0.26.7.tgz#9ae1fdd94897798edab76d0918cf42d0c3184fa9" 341 | dependencies: 342 | graceful-fs "^4.1.2" 343 | jsonfile "^2.1.0" 344 | klaw "^1.0.0" 345 | path-is-absolute "^1.0.0" 346 | rimraf "^2.2.8" 347 | 348 | fs-extra@^0.30.0: 349 | version "0.30.0" 350 | resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-0.30.0.tgz#f233ffcc08d4da7d432daa449776989db1df93f0" 351 | dependencies: 352 | graceful-fs "^4.1.2" 353 | jsonfile "^2.1.0" 354 | klaw "^1.0.0" 355 | path-is-absolute "^1.0.0" 356 | rimraf "^2.2.8" 357 | 358 | fs.realpath@^1.0.0: 359 | version "1.0.0" 360 | resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" 361 | 362 | get-package-info@^0.1.0: 363 | version "0.1.1" 364 | resolved "https://registry.yarnpkg.com/get-package-info/-/get-package-info-0.1.1.tgz#96407adc5cd6cd57f3cb6e33c029cce1b5f4ef39" 365 | dependencies: 366 | bluebird "^3.1.1" 367 | debug "^2.2.0" 368 | lodash.get "^4.0.0" 369 | resolve "^1.1.6" 370 | 371 | get-stdin@^4.0.1: 372 | version "4.0.1" 373 | resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-4.0.1.tgz#b968c6b0a04384324902e8bf1a5df32579a450fe" 374 | 375 | getpass@^0.1.1: 376 | version "0.1.7" 377 | resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa" 378 | dependencies: 379 | assert-plus "^1.0.0" 380 | 381 | glob@^6.0.1, glob@^6.0.4: 382 | version "6.0.4" 383 | resolved "https://registry.yarnpkg.com/glob/-/glob-6.0.4.tgz#0f08860f6a155127b2fadd4f9ce24b1aab6e4d22" 384 | dependencies: 385 | inflight "^1.0.4" 386 | inherits "2" 387 | minimatch "2 || 3" 388 | once "^1.3.0" 389 | path-is-absolute "^1.0.0" 390 | 391 | glob@^7.0.5: 392 | version "7.1.2" 393 | resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.2.tgz#c19c9df9a028702d678612384a6552404c636d15" 394 | dependencies: 395 | fs.realpath "^1.0.0" 396 | inflight "^1.0.4" 397 | inherits "2" 398 | minimatch "^3.0.4" 399 | once "^1.3.0" 400 | path-is-absolute "^1.0.0" 401 | 402 | graceful-fs@^4.1.2, graceful-fs@^4.1.3, graceful-fs@^4.1.6, graceful-fs@^4.1.9: 403 | version "4.1.11" 404 | resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.11.tgz#0e8bdfe4d1ddb8854d64e04ea7c00e2a026e5658" 405 | 406 | har-schema@^2.0.0: 407 | version "2.0.0" 408 | resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-2.0.0.tgz#a94c2224ebcac04782a0d9035521f24735b7ec92" 409 | 410 | har-validator@~5.0.3: 411 | version "5.0.3" 412 | resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-5.0.3.tgz#ba402c266194f15956ef15e0fcf242993f6a7dfd" 413 | dependencies: 414 | ajv "^5.1.0" 415 | har-schema "^2.0.0" 416 | 417 | home-path@^1.0.1: 418 | version "1.0.6" 419 | resolved "https://registry.yarnpkg.com/home-path/-/home-path-1.0.6.tgz#d549dc2465388a7f8667242c5b31588d29af29fc" 420 | 421 | hosted-git-info@^2.1.4: 422 | version "2.6.0" 423 | resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.6.0.tgz#23235b29ab230c576aab0d4f13fc046b0b038222" 424 | 425 | http-signature@~1.2.0: 426 | version "1.2.0" 427 | resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.2.0.tgz#9aecd925114772f3d95b65a60abb8f7c18fbace1" 428 | dependencies: 429 | assert-plus "^1.0.0" 430 | jsprim "^1.2.2" 431 | sshpk "^1.7.0" 432 | 433 | indent-string@^2.1.0: 434 | version "2.1.0" 435 | resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-2.1.0.tgz#8e2d48348742121b4a8218b7a137e9a52049dc80" 436 | dependencies: 437 | repeating "^2.0.0" 438 | 439 | inflight@^1.0.4: 440 | version "1.0.6" 441 | resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" 442 | dependencies: 443 | once "^1.3.0" 444 | wrappy "1" 445 | 446 | inherits@2, inherits@^2.0.3, inherits@~2.0.1, inherits@~2.0.3: 447 | version "2.0.3" 448 | resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" 449 | 450 | ini@~1.3.0: 451 | version "1.3.5" 452 | resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.5.tgz#eee25f56db1c9ec6085e0c22778083f596abf927" 453 | 454 | is-arrayish@^0.2.1: 455 | version "0.2.1" 456 | resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" 457 | 458 | is-builtin-module@^1.0.0: 459 | version "1.0.0" 460 | resolved "https://registry.yarnpkg.com/is-builtin-module/-/is-builtin-module-1.0.0.tgz#540572d34f7ac3119f8f76c30cbc1b1e037affbe" 461 | dependencies: 462 | builtin-modules "^1.0.0" 463 | 464 | is-finite@^1.0.0: 465 | version "1.0.2" 466 | resolved "https://registry.yarnpkg.com/is-finite/-/is-finite-1.0.2.tgz#cc6677695602be550ef11e8b4aa6305342b6d0aa" 467 | dependencies: 468 | number-is-nan "^1.0.0" 469 | 470 | is-fullwidth-code-point@^1.0.0: 471 | version "1.0.0" 472 | resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb" 473 | dependencies: 474 | number-is-nan "^1.0.0" 475 | 476 | is-typedarray@~1.0.0: 477 | version "1.0.0" 478 | resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" 479 | 480 | is-utf8@^0.2.0: 481 | version "0.2.1" 482 | resolved "https://registry.yarnpkg.com/is-utf8/-/is-utf8-0.2.1.tgz#4b0da1442104d1b336340e80797e865cf39f7d72" 483 | 484 | isarray@0.0.1: 485 | version "0.0.1" 486 | resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf" 487 | 488 | isarray@~1.0.0: 489 | version "1.0.0" 490 | resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" 491 | 492 | isstream@~0.1.2: 493 | version "0.1.2" 494 | resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" 495 | 496 | jsbn@~0.1.0: 497 | version "0.1.1" 498 | resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" 499 | 500 | json-schema-traverse@^0.3.0: 501 | version "0.3.1" 502 | resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz#349a6d44c53a51de89b40805c5d5e59b417d3340" 503 | 504 | json-schema@0.2.3: 505 | version "0.2.3" 506 | resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13" 507 | 508 | json-stringify-safe@~5.0.1: 509 | version "5.0.1" 510 | resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" 511 | 512 | jsonfile@^2.1.0: 513 | version "2.4.0" 514 | resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-2.4.0.tgz#3736a2b428b87bbda0cc83b53fa3d633a35c2ae8" 515 | optionalDependencies: 516 | graceful-fs "^4.1.6" 517 | 518 | jsprim@^1.2.2: 519 | version "1.4.1" 520 | resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.1.tgz#313e66bc1e5cc06e438bc1b7499c2e5c56acb6a2" 521 | dependencies: 522 | assert-plus "1.0.0" 523 | extsprintf "1.3.0" 524 | json-schema "0.2.3" 525 | verror "1.10.0" 526 | 527 | klaw@^1.0.0: 528 | version "1.3.1" 529 | resolved "https://registry.yarnpkg.com/klaw/-/klaw-1.3.1.tgz#4088433b46b3b1ba259d78785d8e96f73ba02439" 530 | optionalDependencies: 531 | graceful-fs "^4.1.9" 532 | 533 | load-json-file@^1.0.0: 534 | version "1.1.0" 535 | resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-1.1.0.tgz#956905708d58b4bab4c2261b04f59f31c99374c0" 536 | dependencies: 537 | graceful-fs "^4.1.2" 538 | parse-json "^2.2.0" 539 | pify "^2.0.0" 540 | pinkie-promise "^2.0.0" 541 | strip-bom "^2.0.0" 542 | 543 | lodash.get@^4.0.0: 544 | version "4.4.2" 545 | resolved "https://registry.yarnpkg.com/lodash.get/-/lodash.get-4.4.2.tgz#2d177f652fa31e939b4438d5341499dfa3825e99" 546 | 547 | lodash@^3.5.0: 548 | version "3.10.1" 549 | resolved "https://registry.yarnpkg.com/lodash/-/lodash-3.10.1.tgz#5bf45e8e49ba4189e17d482789dfd15bd140b7b6" 550 | 551 | loud-rejection@^1.0.0: 552 | version "1.6.0" 553 | resolved "https://registry.yarnpkg.com/loud-rejection/-/loud-rejection-1.6.0.tgz#5b46f80147edee578870f086d04821cf998e551f" 554 | dependencies: 555 | currently-unhandled "^0.4.1" 556 | signal-exit "^3.0.0" 557 | 558 | map-obj@^1.0.0, map-obj@^1.0.1: 559 | version "1.0.1" 560 | resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-1.0.1.tgz#d933ceb9205d82bdcf4886f6742bdc2b4dea146d" 561 | 562 | meow@^3.1.0: 563 | version "3.7.0" 564 | resolved "https://registry.yarnpkg.com/meow/-/meow-3.7.0.tgz#72cb668b425228290abbfa856892587308a801fb" 565 | dependencies: 566 | camelcase-keys "^2.0.0" 567 | decamelize "^1.1.2" 568 | loud-rejection "^1.0.0" 569 | map-obj "^1.0.1" 570 | minimist "^1.1.3" 571 | normalize-package-data "^2.3.4" 572 | object-assign "^4.0.1" 573 | read-pkg-up "^1.0.1" 574 | redent "^1.0.0" 575 | trim-newlines "^1.0.0" 576 | 577 | mime-db@~1.33.0: 578 | version "1.33.0" 579 | resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.33.0.tgz#a3492050a5cb9b63450541e39d9788d2272783db" 580 | 581 | mime-types@^2.1.12, mime-types@~2.1.17: 582 | version "2.1.18" 583 | resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.18.tgz#6f323f60a83d11146f831ff11fd66e2fe5503bb8" 584 | dependencies: 585 | mime-db "~1.33.0" 586 | 587 | "minimatch@2 || 3", minimatch@^3.0.3, minimatch@^3.0.4: 588 | version "3.0.4" 589 | resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" 590 | dependencies: 591 | brace-expansion "^1.1.7" 592 | 593 | minimist@0.0.8: 594 | version "0.0.8" 595 | resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" 596 | 597 | minimist@^1.1.0, minimist@^1.1.1, minimist@^1.1.3, minimist@^1.2.0: 598 | version "1.2.0" 599 | resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284" 600 | 601 | mkdirp@0.5.1, mkdirp@^0.5.0, mkdirp@~0.5.1: 602 | version "0.5.1" 603 | resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" 604 | dependencies: 605 | minimist "0.0.8" 606 | 607 | mkpath@^0.1.0: 608 | version "0.1.0" 609 | resolved "https://registry.yarnpkg.com/mkpath/-/mkpath-0.1.0.tgz#7554a6f8d871834cc97b5462b122c4c124d6de91" 610 | 611 | mksnapshot@^0.3.0: 612 | version "0.3.1" 613 | resolved "https://registry.yarnpkg.com/mksnapshot/-/mksnapshot-0.3.1.tgz#2501c05657436d742ce958a4ff92c77e40dd37e6" 614 | dependencies: 615 | decompress-zip "0.3.0" 616 | fs-extra "0.26.7" 617 | request "^2.79.0" 618 | 619 | ms@2.0.0: 620 | version "2.0.0" 621 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" 622 | 623 | mv@^2.0.3: 624 | version "2.1.1" 625 | resolved "https://registry.yarnpkg.com/mv/-/mv-2.1.1.tgz#ae6ce0d6f6d5e0a4f7d893798d03c1ea9559b6a2" 626 | dependencies: 627 | mkdirp "~0.5.1" 628 | ncp "~2.0.0" 629 | rimraf "~2.4.0" 630 | 631 | ncp@~2.0.0: 632 | version "2.0.0" 633 | resolved "https://registry.yarnpkg.com/ncp/-/ncp-2.0.0.tgz#195a21d6c46e361d2fb1281ba38b91e9df7bdbb3" 634 | 635 | nopt@^3.0.1: 636 | version "3.0.6" 637 | resolved "https://registry.yarnpkg.com/nopt/-/nopt-3.0.6.tgz#c6465dbf08abcd4db359317f79ac68a646b28ff9" 638 | dependencies: 639 | abbrev "1" 640 | 641 | nopt@~1.0.10: 642 | version "1.0.10" 643 | resolved "https://registry.yarnpkg.com/nopt/-/nopt-1.0.10.tgz#6ddd21bd2a31417b92727dd585f8a6f37608ebee" 644 | dependencies: 645 | abbrev "1" 646 | 647 | normalize-package-data@^2.3.2, normalize-package-data@^2.3.4: 648 | version "2.4.0" 649 | resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.4.0.tgz#12f95a307d58352075a04907b84ac8be98ac012f" 650 | dependencies: 651 | hosted-git-info "^2.1.4" 652 | is-builtin-module "^1.0.0" 653 | semver "2 || 3 || 4 || 5" 654 | validate-npm-package-license "^3.0.1" 655 | 656 | nugget@^1.5.1: 657 | version "1.6.2" 658 | resolved "https://registry.yarnpkg.com/nugget/-/nugget-1.6.2.tgz#88ca6e03ba5706a99173f5da0902593d6bcae107" 659 | dependencies: 660 | debug "^2.1.3" 661 | minimist "^1.1.0" 662 | pretty-bytes "^1.0.2" 663 | progress-stream "^1.1.0" 664 | request "^2.45.0" 665 | single-line-log "^0.4.1" 666 | throttleit "0.0.2" 667 | 668 | nugget@^2.0.0: 669 | version "2.0.1" 670 | resolved "https://registry.yarnpkg.com/nugget/-/nugget-2.0.1.tgz#201095a487e1ad36081b3432fa3cada4f8d071b0" 671 | dependencies: 672 | debug "^2.1.3" 673 | minimist "^1.1.0" 674 | pretty-bytes "^1.0.2" 675 | progress-stream "^1.1.0" 676 | request "^2.45.0" 677 | single-line-log "^1.1.2" 678 | throttleit "0.0.2" 679 | 680 | number-is-nan@^1.0.0: 681 | version "1.0.1" 682 | resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" 683 | 684 | oauth-sign@~0.8.2: 685 | version "0.8.2" 686 | resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.8.2.tgz#46a6ab7f0aead8deae9ec0565780b7d4efeb9d43" 687 | 688 | object-assign@^4.0.1: 689 | version "4.1.1" 690 | resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" 691 | 692 | object-keys@~0.4.0: 693 | version "0.4.0" 694 | resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-0.4.0.tgz#28a6aae7428dd2c3a92f3d95f21335dd204e0336" 695 | 696 | once@^1.3.0: 697 | version "1.4.0" 698 | resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" 699 | dependencies: 700 | wrappy "1" 701 | 702 | os-tmpdir@~1.0.1: 703 | version "1.0.2" 704 | resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" 705 | 706 | pako@^1.0.6: 707 | version "1.0.6" 708 | resolved "https://registry.yarnpkg.com/pako/-/pako-1.0.6.tgz#0101211baa70c4bca4a0f63f2206e97b7dfaf258" 709 | 710 | parse-json@^2.2.0: 711 | version "2.2.0" 712 | resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-2.2.0.tgz#f480f40434ef80741f8469099f8dea18f55a4dc9" 713 | dependencies: 714 | error-ex "^1.2.0" 715 | 716 | path-exists@^1.0.0: 717 | version "1.0.0" 718 | resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-1.0.0.tgz#d5a8998eb71ef37a74c34eb0d9eba6e878eea081" 719 | 720 | path-exists@^2.0.0, path-exists@^2.1.0: 721 | version "2.1.0" 722 | resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-2.1.0.tgz#0feb6c64f0fc518d9a754dd5efb62c7022761f4b" 723 | dependencies: 724 | pinkie-promise "^2.0.0" 725 | 726 | path-is-absolute@^1.0.0: 727 | version "1.0.1" 728 | resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" 729 | 730 | path-parse@^1.0.5: 731 | version "1.0.5" 732 | resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.5.tgz#3c1adf871ea9cd6c9431b6ea2bd74a0ff055c4c1" 733 | 734 | path-type@^1.0.0: 735 | version "1.1.0" 736 | resolved "https://registry.yarnpkg.com/path-type/-/path-type-1.1.0.tgz#59c44f7ee491da704da415da5a4070ba4f8fe441" 737 | dependencies: 738 | graceful-fs "^4.1.2" 739 | pify "^2.0.0" 740 | pinkie-promise "^2.0.0" 741 | 742 | pend@~1.2.0: 743 | version "1.2.0" 744 | resolved "https://registry.yarnpkg.com/pend/-/pend-1.2.0.tgz#7a57eb550a6783f9115331fcf4663d5c8e007a50" 745 | 746 | performance-now@^2.1.0: 747 | version "2.1.0" 748 | resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" 749 | 750 | pify@^2.0.0: 751 | version "2.3.0" 752 | resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" 753 | 754 | pinkie-promise@^2.0.0: 755 | version "2.0.1" 756 | resolved "https://registry.yarnpkg.com/pinkie-promise/-/pinkie-promise-2.0.1.tgz#2135d6dfa7a358c069ac9b178776288228450ffa" 757 | dependencies: 758 | pinkie "^2.0.0" 759 | 760 | pinkie@^2.0.0: 761 | version "2.0.4" 762 | resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870" 763 | 764 | plist@^1.1.0: 765 | version "1.2.0" 766 | resolved "https://registry.yarnpkg.com/plist/-/plist-1.2.0.tgz#084b5093ddc92506e259f874b8d9b1afb8c79593" 767 | dependencies: 768 | base64-js "0.0.8" 769 | util-deprecate "1.0.2" 770 | xmlbuilder "4.0.0" 771 | xmldom "0.1.x" 772 | 773 | pretty-bytes@^1.0.2: 774 | version "1.0.4" 775 | resolved "https://registry.yarnpkg.com/pretty-bytes/-/pretty-bytes-1.0.4.tgz#0a22e8210609ad35542f8c8d5d2159aff0751c84" 776 | dependencies: 777 | get-stdin "^4.0.1" 778 | meow "^3.1.0" 779 | 780 | process-nextick-args@~2.0.0: 781 | version "2.0.0" 782 | resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.0.tgz#a37d732f4271b4ab1ad070d35508e8290788ffaa" 783 | 784 | progress-stream@^1.1.0: 785 | version "1.2.0" 786 | resolved "https://registry.yarnpkg.com/progress-stream/-/progress-stream-1.2.0.tgz#2cd3cfea33ba3a89c9c121ec3347abe9ab125f77" 787 | dependencies: 788 | speedometer "~0.1.2" 789 | through2 "~0.2.3" 790 | 791 | punycode@^1.4.1: 792 | version "1.4.1" 793 | resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" 794 | 795 | q@^1.1.2: 796 | version "1.5.1" 797 | resolved "https://registry.yarnpkg.com/q/-/q-1.5.1.tgz#7e32f75b41381291d04611f1bf14109ac00651d7" 798 | 799 | qs@~6.5.1: 800 | version "6.5.2" 801 | resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.2.tgz#cb3ae806e8740444584ef154ce8ee98d403f3e36" 802 | 803 | rc@^1.1.2: 804 | version "1.2.8" 805 | resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed" 806 | dependencies: 807 | deep-extend "^0.6.0" 808 | ini "~1.3.0" 809 | minimist "^1.2.0" 810 | strip-json-comments "~2.0.1" 811 | 812 | rcedit@^0.5.1: 813 | version "0.5.1" 814 | resolved "https://registry.yarnpkg.com/rcedit/-/rcedit-0.5.1.tgz#d0bdcf5d280a9d1c29da6f118ccce2ce153cef1d" 815 | 816 | read-pkg-up@^1.0.1: 817 | version "1.0.1" 818 | resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-1.0.1.tgz#9d63c13276c065918d57f002a57f40a1b643fb02" 819 | dependencies: 820 | find-up "^1.0.0" 821 | read-pkg "^1.0.0" 822 | 823 | read-pkg@^1.0.0: 824 | version "1.1.0" 825 | resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-1.1.0.tgz#f5ffaa5ecd29cb31c0474bca7d756b6bb29e3f28" 826 | dependencies: 827 | load-json-file "^1.0.0" 828 | normalize-package-data "^2.3.2" 829 | path-type "^1.0.0" 830 | 831 | readable-stream@^1.1.8, readable-stream@~1.1.9: 832 | version "1.1.14" 833 | resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.1.14.tgz#7cf4c54ef648e3813084c636dd2079e166c081d9" 834 | dependencies: 835 | core-util-is "~1.0.0" 836 | inherits "~2.0.1" 837 | isarray "0.0.1" 838 | string_decoder "~0.10.x" 839 | 840 | readable-stream@^2.2.2: 841 | version "2.3.6" 842 | resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.6.tgz#b11c27d88b8ff1fbe070643cf94b0c79ae1b0aaf" 843 | dependencies: 844 | core-util-is "~1.0.0" 845 | inherits "~2.0.3" 846 | isarray "~1.0.0" 847 | process-nextick-args "~2.0.0" 848 | safe-buffer "~5.1.1" 849 | string_decoder "~1.1.1" 850 | util-deprecate "~1.0.1" 851 | 852 | redent@^1.0.0: 853 | version "1.0.0" 854 | resolved "https://registry.yarnpkg.com/redent/-/redent-1.0.0.tgz#cf916ab1fd5f1f16dfb20822dd6ec7f730c2afde" 855 | dependencies: 856 | indent-string "^2.1.0" 857 | strip-indent "^1.0.1" 858 | 859 | repeating@^2.0.0: 860 | version "2.0.1" 861 | resolved "https://registry.yarnpkg.com/repeating/-/repeating-2.0.1.tgz#5214c53a926d3552707527fbab415dbc08d06dda" 862 | dependencies: 863 | is-finite "^1.0.0" 864 | 865 | request@^2.45.0, request@^2.79.0: 866 | version "2.87.0" 867 | resolved "https://registry.yarnpkg.com/request/-/request-2.87.0.tgz#32f00235cd08d482b4d0d68db93a829c0ed5756e" 868 | dependencies: 869 | aws-sign2 "~0.7.0" 870 | aws4 "^1.6.0" 871 | caseless "~0.12.0" 872 | combined-stream "~1.0.5" 873 | extend "~3.0.1" 874 | forever-agent "~0.6.1" 875 | form-data "~2.3.1" 876 | har-validator "~5.0.3" 877 | http-signature "~1.2.0" 878 | is-typedarray "~1.0.0" 879 | isstream "~0.1.2" 880 | json-stringify-safe "~5.0.1" 881 | mime-types "~2.1.17" 882 | oauth-sign "~0.8.2" 883 | performance-now "^2.1.0" 884 | qs "~6.5.1" 885 | safe-buffer "^5.1.1" 886 | tough-cookie "~2.3.3" 887 | tunnel-agent "^0.6.0" 888 | uuid "^3.1.0" 889 | 890 | resolve@^1.1.6: 891 | version "1.8.1" 892 | resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.8.1.tgz#82f1ec19a423ac1fbd080b0bab06ba36e84a7a26" 893 | dependencies: 894 | path-parse "^1.0.5" 895 | 896 | rimraf@^2.2.8: 897 | version "2.6.2" 898 | resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.2.tgz#2ed8150d24a16ea8651e6d6ef0f47c4158ce7a36" 899 | dependencies: 900 | glob "^7.0.5" 901 | 902 | rimraf@~2.4.0: 903 | version "2.4.5" 904 | resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.4.5.tgz#ee710ce5d93a8fdb856fb5ea8ff0e2d75934b2da" 905 | dependencies: 906 | glob "^6.0.1" 907 | 908 | run-series@^1.1.1: 909 | version "1.1.8" 910 | resolved "https://registry.yarnpkg.com/run-series/-/run-series-1.1.8.tgz#2c4558f49221e01cd6371ff4e0a1e203e460fc36" 911 | 912 | safe-buffer@^5.0.1, safe-buffer@^5.1.1, safe-buffer@~5.1.0, safe-buffer@~5.1.1: 913 | version "5.1.2" 914 | resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" 915 | 916 | safer-buffer@^2.0.2: 917 | version "2.1.2" 918 | resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" 919 | 920 | "semver@2 || 3 || 4 || 5", semver@^5.3.0: 921 | version "5.5.0" 922 | resolved "https://registry.yarnpkg.com/semver/-/semver-5.5.0.tgz#dc4bbc7a6ca9d916dee5d43516f0092b58f7b8ab" 923 | 924 | signal-exit@^3.0.0: 925 | version "3.0.2" 926 | resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d" 927 | 928 | single-line-log@^0.4.1: 929 | version "0.4.1" 930 | resolved "https://registry.yarnpkg.com/single-line-log/-/single-line-log-0.4.1.tgz#87a55649f749d783ec0dcd804e8140d9873c7cee" 931 | 932 | single-line-log@^1.1.2: 933 | version "1.1.2" 934 | resolved "https://registry.yarnpkg.com/single-line-log/-/single-line-log-1.1.2.tgz#c2f83f273a3e1a16edb0995661da0ed5ef033364" 935 | dependencies: 936 | string-width "^1.0.1" 937 | 938 | spdx-correct@^3.0.0: 939 | version "3.0.0" 940 | resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.0.0.tgz#05a5b4d7153a195bc92c3c425b69f3b2a9524c82" 941 | dependencies: 942 | spdx-expression-parse "^3.0.0" 943 | spdx-license-ids "^3.0.0" 944 | 945 | spdx-exceptions@^2.1.0: 946 | version "2.1.0" 947 | resolved "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.1.0.tgz#2c7ae61056c714a5b9b9b2b2af7d311ef5c78fe9" 948 | 949 | spdx-expression-parse@^3.0.0: 950 | version "3.0.0" 951 | resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz#99e119b7a5da00e05491c9fa338b7904823b41d0" 952 | dependencies: 953 | spdx-exceptions "^2.1.0" 954 | spdx-license-ids "^3.0.0" 955 | 956 | spdx-license-ids@^3.0.0: 957 | version "3.0.0" 958 | resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.0.tgz#7a7cd28470cc6d3a1cfe6d66886f6bc430d3ac87" 959 | 960 | speedometer@~0.1.2: 961 | version "0.1.4" 962 | resolved "https://registry.yarnpkg.com/speedometer/-/speedometer-0.1.4.tgz#9876dbd2a169d3115402d48e6ea6329c8816a50d" 963 | 964 | sshpk@^1.7.0: 965 | version "1.14.2" 966 | resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.14.2.tgz#c6fc61648a3d9c4e764fd3fcdf4ea105e492ba98" 967 | dependencies: 968 | asn1 "~0.2.3" 969 | assert-plus "^1.0.0" 970 | dashdash "^1.12.0" 971 | getpass "^0.1.1" 972 | safer-buffer "^2.0.2" 973 | optionalDependencies: 974 | bcrypt-pbkdf "^1.0.0" 975 | ecc-jsbn "~0.1.1" 976 | jsbn "~0.1.0" 977 | tweetnacl "~0.14.0" 978 | 979 | string-width@^1.0.1: 980 | version "1.0.2" 981 | resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3" 982 | dependencies: 983 | code-point-at "^1.0.0" 984 | is-fullwidth-code-point "^1.0.0" 985 | strip-ansi "^3.0.0" 986 | 987 | string_decoder@~0.10.x: 988 | version "0.10.31" 989 | resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94" 990 | 991 | string_decoder@~1.1.1: 992 | version "1.1.1" 993 | resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" 994 | dependencies: 995 | safe-buffer "~5.1.0" 996 | 997 | strip-ansi@^3.0.0: 998 | version "3.0.1" 999 | resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" 1000 | dependencies: 1001 | ansi-regex "^2.0.0" 1002 | 1003 | strip-bom@^2.0.0: 1004 | version "2.0.0" 1005 | resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-2.0.0.tgz#6219a85616520491f35788bdbf1447a99c7e6b0e" 1006 | dependencies: 1007 | is-utf8 "^0.2.0" 1008 | 1009 | strip-indent@^1.0.1: 1010 | version "1.0.1" 1011 | resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-1.0.1.tgz#0c7962a6adefa7bbd4ac366460a638552ae1a0a2" 1012 | dependencies: 1013 | get-stdin "^4.0.1" 1014 | 1015 | strip-json-comments@~2.0.1: 1016 | version "2.0.1" 1017 | resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" 1018 | 1019 | sumchecker@^1.2.0: 1020 | version "1.3.1" 1021 | resolved "https://registry.yarnpkg.com/sumchecker/-/sumchecker-1.3.1.tgz#79bb3b4456dd04f18ebdbc0d703a1d1daec5105d" 1022 | dependencies: 1023 | debug "^2.2.0" 1024 | es6-promise "^4.0.5" 1025 | 1026 | throttleit@0.0.2: 1027 | version "0.0.2" 1028 | resolved "https://registry.yarnpkg.com/throttleit/-/throttleit-0.0.2.tgz#cfedf88e60c00dd9697b61fdd2a8343a9b680eaf" 1029 | 1030 | through2@~0.2.3: 1031 | version "0.2.3" 1032 | resolved "https://registry.yarnpkg.com/through2/-/through2-0.2.3.tgz#eb3284da4ea311b6cc8ace3653748a52abf25a3f" 1033 | dependencies: 1034 | readable-stream "~1.1.9" 1035 | xtend "~2.1.1" 1036 | 1037 | tmp@0.0.28: 1038 | version "0.0.28" 1039 | resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.28.tgz#172735b7f614ea7af39664fa84cf0de4e515d120" 1040 | dependencies: 1041 | os-tmpdir "~1.0.1" 1042 | 1043 | touch@0.0.3: 1044 | version "0.0.3" 1045 | resolved "https://registry.yarnpkg.com/touch/-/touch-0.0.3.tgz#51aef3d449571d4f287a5d87c9c8b49181a0db1d" 1046 | dependencies: 1047 | nopt "~1.0.10" 1048 | 1049 | tough-cookie@~2.3.3: 1050 | version "2.3.4" 1051 | resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.3.4.tgz#ec60cee38ac675063ffc97a5c18970578ee83655" 1052 | dependencies: 1053 | punycode "^1.4.1" 1054 | 1055 | "traverse@>=0.3.0 <0.4": 1056 | version "0.3.9" 1057 | resolved "https://registry.yarnpkg.com/traverse/-/traverse-0.3.9.tgz#717b8f220cc0bb7b44e40514c22b2e8bbc70d8b9" 1058 | 1059 | trim-newlines@^1.0.0: 1060 | version "1.0.0" 1061 | resolved "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-1.0.0.tgz#5887966bb582a4503a41eb524f7d35011815a613" 1062 | 1063 | tunnel-agent@^0.6.0: 1064 | version "0.6.0" 1065 | resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" 1066 | dependencies: 1067 | safe-buffer "^5.0.1" 1068 | 1069 | tweetnacl@^0.14.3, tweetnacl@~0.14.0: 1070 | version "0.14.5" 1071 | resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64" 1072 | 1073 | typedarray@^0.0.6: 1074 | version "0.0.6" 1075 | resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" 1076 | 1077 | util-deprecate@1.0.2, util-deprecate@~1.0.1: 1078 | version "1.0.2" 1079 | resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" 1080 | 1081 | uuid@^3.1.0: 1082 | version "3.2.1" 1083 | resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.2.1.tgz#12c528bb9d58d0b9265d9a2f6f0fe8be17ff1f14" 1084 | 1085 | validate-npm-package-license@^3.0.1: 1086 | version "3.0.3" 1087 | resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.3.tgz#81643bcbef1bdfecd4623793dc4648948ba98338" 1088 | dependencies: 1089 | spdx-correct "^3.0.0" 1090 | spdx-expression-parse "^3.0.0" 1091 | 1092 | verror@1.10.0: 1093 | version "1.10.0" 1094 | resolved "https://registry.yarnpkg.com/verror/-/verror-1.10.0.tgz#3a105ca17053af55d6e270c1f8288682e18da400" 1095 | dependencies: 1096 | assert-plus "^1.0.0" 1097 | core-util-is "1.0.2" 1098 | extsprintf "^1.2.0" 1099 | 1100 | wrappy@1: 1101 | version "1.0.2" 1102 | resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" 1103 | 1104 | xmlbuilder@4.0.0: 1105 | version "4.0.0" 1106 | resolved "https://registry.yarnpkg.com/xmlbuilder/-/xmlbuilder-4.0.0.tgz#98b8f651ca30aa624036f127d11cc66dc7b907a3" 1107 | dependencies: 1108 | lodash "^3.5.0" 1109 | 1110 | xmldom@0.1.x: 1111 | version "0.1.27" 1112 | resolved "https://registry.yarnpkg.com/xmldom/-/xmldom-0.1.27.tgz#d501f97b3bdb403af8ef9ecc20573187aadac0e9" 1113 | 1114 | xtend@~2.1.1: 1115 | version "2.1.2" 1116 | resolved "https://registry.yarnpkg.com/xtend/-/xtend-2.1.2.tgz#6efecc2a4dad8e6962c4901b337ce7ba87b5d28b" 1117 | dependencies: 1118 | object-keys "~0.4.0" 1119 | 1120 | yauzl@2.4.1: 1121 | version "2.4.1" 1122 | resolved "https://registry.yarnpkg.com/yauzl/-/yauzl-2.4.1.tgz#9528f442dab1b2284e58b4379bb194e22e0c4005" 1123 | dependencies: 1124 | fd-slicer "~1.0.1" 1125 | --------------------------------------------------------------------------------