diff --git a/.editorconfig b/.editorconfig index 604c949..f3a5790 100644 --- a/.editorconfig +++ b/.editorconfig @@ -14,3 +14,7 @@ insert_final_newline = true [*.{js,html,scss,json,yml,md}] indent_size = 2 indent_style = space + + +[assets/favicon/manifest.json] +indent_size = 4 diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md index 87332fb..c5507b7 100644 --- a/.github/CONTRIBUTING.md +++ b/.github/CONTRIBUTING.md @@ -1,5 +1,6 @@ ## Contributing is welcome -Pull requests are welcome without an opening an issue. If you unsure about the feature or implementation open an issue and -discuss your suggested changes. Meshviewer is a frontend application and the code needs to be loaded and -perform on slow mobile devices with many nodes and clients. +Pull requests are welcome without the need of opening an issue. If you're unsure +about your feature or your implementation open an issue and discuss your +suggested changes. Meshviewer is a frontend application and the code needs to be +loaded fast and perform with many nodes and clients on slow mobile devices. diff --git a/.travis.yml b/.travis.yml index 0ca1e23..726a0b9 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,9 +1,10 @@ sudo: false +dist: trusty language: node_js node_js: - - "7" + - "9" os: - linux @@ -12,20 +13,14 @@ os: matrix: include: - - node_js: 7 + - node_js: 8 os: linux - env: USE_NPM=true - node_js: 6 os: linux - - node_js: 4 - os: linux cache: yarn: true -before_install: - - if [ "$USE_NPM" == "true" ]; then rm yarn.lock; fi - before_script: - if git status | grep -q "modified. \.travis\.yml"; then echo "Dirty yarn.lock"; exit 1; fi diff --git a/CHANGELOG.md b/CHANGELOG.md deleted file mode 100644 index c96a7a7..0000000 --- a/CHANGELOG.md +++ /dev/null @@ -1,66 +0,0 @@ -# Change Log - -## Switched to rolling release - -- All major changes can be found in README.md and everything else in git history https://github.com/ffrgb/meshviewer -- Lot of parts of codebase have been changed - -## v4 - -- add a legend (map) -- new graph theme -- performance improvements in graph view -- various UI changes -- various map fixes -- moved config from config.js to config.json -- online/offline statistics -- define layers for map in config -- graph: zoom by keyboard (+ and - keys) -- direct links to graph and map views - -### Bugfixes - -- map works with little or no nodes - -## v3 - -### Implemented enhancements: - -- Make clients in map start at a random angle -- On statistics page: show how many nodes supply geoinformation -- Allow additional statistics (global and per node) configured in config.js -- Improve node count information (total, online, clients, ...) -- Show hardware model in link infobox -- Introduce maxAge setting -- Graph: show VPN links in grayscale - -### Removed features: - -- Don't show contact information in node lists - -### Fixed bugs: - -- Fixed off-by-one when drawing clients -- Match labels order to node order in map -- Statistics: count only nodes that are present - -## v2 - -### General changes: - -- License change from GPL 3 to AGPL 3 - -### Implemented enhancements: - -- Improved performance on Firefox -- Labels in graph view -- infobox: link to geouri with node's coordinates -- infobox: show node id -- map: locate user -- map: adding custom layers from leaflet.providers -- nodelist: sort by uptime fixed -- graph: circles for clients - -### Fixed bugs: - -- Links disappeared on graph on refresh diff --git a/README.md b/README.md index 61d2cc5..638f7f4 100644 --- a/README.md +++ b/README.md @@ -1,40 +1,11 @@ # Meshviewer [![Build Status](https://img.shields.io/travis/ffrgb/meshviewer/develop.svg?style=flat-square)](https://travis-ci.org/ffrgb/meshviewer) [![Scrutinizer Code Quality](https://img.shields.io/scrutinizer/g/ffrgb/meshviewer/develop.svg?style=flat-square)](https://scrutinizer-ci.com/g/ffrgb/meshviewer/?branch=develop) -[![Documentation](https://img.shields.io/badge/gitbooks.io-documentation-brightgreen.svg?style=flat-square)](https://meshviewer.gitbooks.io/documentation/content/) -[![License: AGPL v3](https://img.shields.io/badge/License-AGPL%20v3-blue.svg?style=flat-square)](https://www.gnu.org/licenses/agpl-3.0) +[![Documentation](https://img.shields.io/badge/documentation-online-brightgreen.svg?style=flat-square)](https://doc.meshviewer.org/) +[![License: AGPL v3](https://img.shields.io/github/license/ffrgb/meshviewer.svg?style=flat-square)](https://www.gnu.org/licenses/agpl-3.0) Meshviewer is an online visualization app to represent nodes and links on a map for Freifunk open mesh network. -#### Main differences to https://github.com/ffnord/meshviewer -_Some similar features might have been implemented/merged_ - -- Replaced router - including language, mode, node, link, location -- Leaflet upgraded to v1 - faster on mobile -- Forcegraph rewrite with d3.js v4 -- Map layer modes (Allow to set a default layer based on time combined with a stylesheet) -- Automatic updates for selected node or list (incl. image stats cache-breaker) -- Node filter -- Zoom level for clicking on a node (`nodeZoom`) is definable independently from the maximum zoom level 22 -- Formatted Code -- Translation support - https://crowdin.com/project/meshviewer - Contact us for new languages - - Currently available: en, de, fr & ru -- Gulp inline for some css and js - fewer requests and instant load indicator -- Icon font with needed icons only -- Switch to Gulp (Tested with Node.js 4/6 LTS, 7 on Linux, 7 OSX & W**) - - css and some js moved inline -- Yarn/npm in favour of bower - - Load only moment.js without languages (Languages are included in translations) - - unneeded components removed (es6-shim, tablesort, numeraljs, leaflet-providers, leaflet-label jshashes, chroma-js) -- RBush v2 - performance boost in last versions (positions, labels and clients on the map) -- Ruby dependency removed -- FixedCenter is required -- Sass-lint, scss and variables rewritten for easy customizations/adjustments -- Cross browser/device support improved (THX@BrowserStack) -- Yarn package manager in favour of npm (npm still works) -- Configurable reverse geocoding server -- [A lot more in the commit history](https://github.com/ffrgb/meshviewer/commits/develop) - ### Demo Embedded: https://regensburg.freifunk.net/netz/karte/ @@ -42,23 +13,28 @@ Standalone: https://regensburg.freifunk.net/meshviewer/ ## Documentation -Documentation moved to [meshviewer.gitbooks.io](https://meshviewer.gitbooks.io/documentation/content/). +Documentation moved to [doc.meshviewer.org](https://doc.meshviewer.org/). -- Read: https://meshviewer.gitbooks.io/documentation/content/ -- PDF, Mobi, ePub & edit: https://www.gitbook.com/book/meshviewer/documentation/details +- [Read online](https://doc.meshviewer.org/) +- Export as + - [PDF](https://doc.meshviewer.org/meshviewer.pdf) + - [ePub](https://doc.meshviewer.org/meshviewer.epub) + - [Mobi](https://doc.meshviewer.org/meshviewer.mobi) -#### Why move the documentation? +### [Changelog](https://doc.meshviewer.org/changelog.html) + +#### Why move the documentation/changelog? - Search available - Multiple pages - Less doc commits, faster changes -- Export as PDF, Mobi, ePub ## Sponsoring / Supporting - [BrowserStack](https://www.browserstack.com/) for providing an awesome testing service for hundreds of browsers - [Travis CI](https://travis-ci.org/) for building meshviewer on every push and pull request - [Scrutinizer CI](https://scrutinizer-ci.com/g/ffrgb/meshviewer/) for testing code quality on every push and pull request -- [Crowdin](https://crowdin.com/) for providing an easy non-developer translation environment +- [POEditor](https://poeditor.com/join/project/VZBjPNNic9) for providing an easy non-developer translation environment +- [Netlify](https://app.netlify.com/sites/meshviewer/deploys) preview for every PR and also provide a [page with current develop branch](https://meshviewer.netlify.com/) These tools need a lot of infrastructures and provide a free account for open source software. diff --git a/app.js b/app.js index 5390671..34e2777 100644 --- a/app.js +++ b/app.js @@ -20,7 +20,7 @@ require.config({ 'd3-timer': '../node_modules/d3-timer/build/d3-timer', // by d3-drag: d3-selection // d3 modules dependencies - 'd3-selection': '../node_modules/d3-selection/build/d3-selection', + 'd3-selection': '../node_modules/d3-selection/dist/d3-selection', 'd3-force': '../node_modules/d3-force/build/d3-force', 'd3-zoom': '../node_modules/d3-zoom/build/d3-zoom', 'd3-drag': '../node_modules/d3-drag/build/d3-drag', @@ -37,5 +37,5 @@ require.config({ }); require(['main'], function (main) { - main(jsonData); + main(); }); diff --git a/assets/favicon/android-chrome-192x192.png b/assets/favicon/android-chrome-192x192.png index c8aed28..c5dd45d 100644 Binary files a/assets/favicon/android-chrome-192x192.png and b/assets/favicon/android-chrome-192x192.png differ diff --git a/assets/favicon/android-chrome-512x512.png b/assets/favicon/android-chrome-512x512.png index c046f0b..7f29343 100644 Binary files a/assets/favicon/android-chrome-512x512.png and b/assets/favicon/android-chrome-512x512.png differ diff --git a/assets/favicon/apple-touch-icon.png b/assets/favicon/apple-touch-icon.png index 90b6db1..7bcafc1 100644 Binary files a/assets/favicon/apple-touch-icon.png and b/assets/favicon/apple-touch-icon.png differ diff --git a/assets/favicon/favicon-16x16.png b/assets/favicon/favicon-16x16.png index 62c4991..42ff0be 100644 Binary files a/assets/favicon/favicon-16x16.png and b/assets/favicon/favicon-16x16.png differ diff --git a/assets/favicon/favicon-32x32.png b/assets/favicon/favicon-32x32.png index a4907a6..7c478b7 100644 Binary files a/assets/favicon/favicon-32x32.png and b/assets/favicon/favicon-32x32.png differ diff --git a/assets/favicon/manifest.json b/assets/favicon/manifest.json index e7e10e0..13e40e5 100644 --- a/assets/favicon/manifest.json +++ b/assets/favicon/manifest.json @@ -1,5 +1,6 @@ { "name": "Meshviewer", + "short_name": "Meshviewer", "icons": [ { "src": "./android-chrome-192x192.png", @@ -14,5 +15,8 @@ ], "theme_color": "#dc0067", "background_color": "#dc0067", - "display": "standalone" + "start_url": ".", + "display": "standalone", + "orientation": "portrait" } + diff --git a/assets/favicon/mstile-144x144.png b/assets/favicon/mstile-144x144.png index 4be7a27..8131e67 100644 Binary files a/assets/favicon/mstile-144x144.png and b/assets/favicon/mstile-144x144.png differ diff --git a/assets/favicon/mstile-150x150.png b/assets/favicon/mstile-150x150.png index 2ea0c5f..c24fcfc 100644 Binary files a/assets/favicon/mstile-150x150.png and b/assets/favicon/mstile-150x150.png differ diff --git a/assets/favicon/mstile-310x150.png b/assets/favicon/mstile-310x150.png index b4bcb75..0e044dc 100644 Binary files a/assets/favicon/mstile-310x150.png and b/assets/favicon/mstile-310x150.png differ diff --git a/assets/favicon/mstile-310x310.png b/assets/favicon/mstile-310x310.png index b2a9f39..1b00e9a 100644 Binary files a/assets/favicon/mstile-310x310.png and b/assets/favicon/mstile-310x310.png differ diff --git a/assets/favicon/mstile-70x70.png b/assets/favicon/mstile-70x70.png index 82ea876..5fa172e 100644 Binary files a/assets/favicon/mstile-70x70.png and b/assets/favicon/mstile-70x70.png differ diff --git a/assets/favicon/safari-pinned-tab.svg b/assets/favicon/safari-pinned-tab.svg index a732bc7..93d40d0 100644 --- a/assets/favicon/safari-pinned-tab.svg +++ b/assets/favicon/safari-pinned-tab.svg @@ -1,134 +1 @@ - - - - -Created by potrace 1.11, written by Peter Selinger 2001-2013 - - - - - + \ No newline at end of file diff --git a/assets/faviconData.json b/assets/faviconData.json index d4b60d2..af85f3c 100644 --- a/assets/faviconData.json +++ b/assets/faviconData.json @@ -1 +1 @@ -{"result":{"status":"success"},"favicon":{"package_url":"https://realfavicongenerator.net/files/03dc81277d21a8ed4bb836b4c05ada2ee75b9e3c/favicons.zip","files_urls":["https://realfavicongenerator.net/files/03dc81277d21a8ed4bb836b4c05ada2ee75b9e3c/package_files/android-chrome-192x192.png","https://realfavicongenerator.net/files/03dc81277d21a8ed4bb836b4c05ada2ee75b9e3c/package_files/android-chrome-512x512.png","https://realfavicongenerator.net/files/03dc81277d21a8ed4bb836b4c05ada2ee75b9e3c/package_files/apple-touch-icon.png","https://realfavicongenerator.net/files/03dc81277d21a8ed4bb836b4c05ada2ee75b9e3c/package_files/browserconfig.xml","https://realfavicongenerator.net/files/03dc81277d21a8ed4bb836b4c05ada2ee75b9e3c/package_files/favicon-16x16.png","https://realfavicongenerator.net/files/03dc81277d21a8ed4bb836b4c05ada2ee75b9e3c/package_files/favicon-32x32.png","https://realfavicongenerator.net/files/03dc81277d21a8ed4bb836b4c05ada2ee75b9e3c/package_files/favicon.ico","https://realfavicongenerator.net/files/03dc81277d21a8ed4bb836b4c05ada2ee75b9e3c/package_files/manifest.json","https://realfavicongenerator.net/files/03dc81277d21a8ed4bb836b4c05ada2ee75b9e3c/package_files/mstile-144x144.png","https://realfavicongenerator.net/files/03dc81277d21a8ed4bb836b4c05ada2ee75b9e3c/package_files/mstile-150x150.png","https://realfavicongenerator.net/files/03dc81277d21a8ed4bb836b4c05ada2ee75b9e3c/package_files/mstile-310x150.png","https://realfavicongenerator.net/files/03dc81277d21a8ed4bb836b4c05ada2ee75b9e3c/package_files/mstile-310x310.png","https://realfavicongenerator.net/files/03dc81277d21a8ed4bb836b4c05ada2ee75b9e3c/package_files/mstile-70x70.png","https://realfavicongenerator.net/files/03dc81277d21a8ed4bb836b4c05ada2ee75b9e3c/package_files/safari-pinned-tab.svg"],"html_code":"\n\n\n\n\n\n\n\n\n\n\n","compression":"true","overlapping_markups":["link[rel=\"apple-touch-icon\"]","meta[name=\"apple-mobile-web-app-title\"]","link[rel=\"shortcut\"]","link[rel=\"shortcut icon\"]","link[rel=\"icon\",sizes=\"16x16\"]","link[rel=\"icon\",sizes=\"32x32\"]","meta[name=\"msapplication-TileColor\"]","meta[name=\"msapplication-TileImage\"]","meta[name=\"msapplication-config\"]","meta[name=\"application-name\"]","link[rel=\"manifest\"]","meta[name=\"theme-color\"]","link[rel=\"mask-icon\"]"]},"files_location":{"type":"path","path":"."},"preview_picture_url":"https://realfavicongenerator.net/files/03dc81277d21a8ed4bb836b4c05ada2ee75b9e3c/favicon_preview.png","version":"0.14"} +{"result":{"status":"success"},"favicon":{"package_url":"https://realfavicongenerator.net/files/6450324c809032ae945bea6966d61ed90c569192/favicons.zip","files_urls":["https://realfavicongenerator.net/files/6450324c809032ae945bea6966d61ed90c569192/package_files/android-chrome-192x192.png","https://realfavicongenerator.net/files/6450324c809032ae945bea6966d61ed90c569192/package_files/android-chrome-512x512.png","https://realfavicongenerator.net/files/6450324c809032ae945bea6966d61ed90c569192/package_files/apple-touch-icon.png","https://realfavicongenerator.net/files/6450324c809032ae945bea6966d61ed90c569192/package_files/browserconfig.xml","https://realfavicongenerator.net/files/6450324c809032ae945bea6966d61ed90c569192/package_files/favicon-16x16.png","https://realfavicongenerator.net/files/6450324c809032ae945bea6966d61ed90c569192/package_files/favicon-32x32.png","https://realfavicongenerator.net/files/6450324c809032ae945bea6966d61ed90c569192/package_files/favicon.ico","https://realfavicongenerator.net/files/6450324c809032ae945bea6966d61ed90c569192/package_files/manifest.json","https://realfavicongenerator.net/files/6450324c809032ae945bea6966d61ed90c569192/package_files/mstile-144x144.png","https://realfavicongenerator.net/files/6450324c809032ae945bea6966d61ed90c569192/package_files/mstile-150x150.png","https://realfavicongenerator.net/files/6450324c809032ae945bea6966d61ed90c569192/package_files/mstile-310x150.png","https://realfavicongenerator.net/files/6450324c809032ae945bea6966d61ed90c569192/package_files/mstile-310x310.png","https://realfavicongenerator.net/files/6450324c809032ae945bea6966d61ed90c569192/package_files/mstile-70x70.png","https://realfavicongenerator.net/files/6450324c809032ae945bea6966d61ed90c569192/package_files/safari-pinned-tab.svg"],"html_code":"\n\n\n\n\n\n\n\n\n\n\n","compression":"true","overlapping_markups":["link[rel=\"apple-touch-icon\"]","meta[name=\"apple-mobile-web-app-title\"]","link[rel=\"shortcut\"]","link[rel=\"shortcut icon\"]","link[rel=\"icon\",sizes=\"16x16\"]","link[rel=\"icon\",sizes=\"32x32\"]","meta[name=\"msapplication-TileColor\"]","meta[name=\"msapplication-TileImage\"]","meta[name=\"msapplication-config\"]","meta[name=\"application-name\"]","link[rel=\"manifest\"]","meta[name=\"theme-color\"]","link[rel=\"mask-icon\"]"]},"files_location":{"type":"path","path":"."},"preview_picture_url":"https://realfavicongenerator.net/files/6450324c809032ae945bea6966d61ed90c569192/favicon_preview.png","version":"0.15"} \ No newline at end of file diff --git a/config.default.js b/config.default.js new file mode 100644 index 0000000..e34d567 --- /dev/null +++ b/config.default.js @@ -0,0 +1,192 @@ +module.exports = function () { + return { + 'reverseGeocodingApi': 'https://nominatim.openstreetmap.org/reverse', + 'maxAge': 14, + 'maxAgeAlert': 3, + 'nodeZoom': 18, + 'labelZoom': 13, + 'clientZoom': 15, + 'nodeAttr': [ + // value can be a node attribute (1 depth) or a a function in utils/node with prefix show + { + 'name': 'node.status', + 'value': 'Status' + }, + { + 'name': 'node.gateway', + 'value': 'Gateway' + }, + { + 'name': 'node.coordinates', + 'value': 'GeoURI' + }, + // { + // "name": "node.contact", + // "value": "owner" + // }, + + // Examples for functions + // { + // // no name will remove first column + // 'value': function (d) { + // var moment = require('moment'); + // var V = require('snabbdom').default; + // return V.h('td', { props: { colSpan: 2 }, style: { background: '#49a' } }, + // _.t('sidebar.nodeOnline') + ' translate, ' + moment(d.firstseen).get('month') + + // ' Month require libs like moment, access config ' + config.siteName); + // } + // }, + // { + // 'name': 'Neighbour first seen', + // 'value': function (d, nodeDict) { + // return nodeDict[d.gateway_nexthop].firstseen.format() + 'access node object'; + // } + // }, + { + 'name': 'node.hardware', + 'value': 'model' + }, + { + 'name': 'node.primaryMac', + 'value': 'mac' + }, + { + 'name': 'node.firmware', + 'value': 'Firmware' + }, + { + 'name': 'node.uptime', + 'value': 'Uptime' + }, + { + 'name': 'node.firstSeen', + 'value': 'FirstSeen' + }, + { + 'name': 'node.systemLoad', + 'value': 'Load' + }, + { + 'name': 'node.ram', + 'value': 'RAM' + }, + { + 'name': 'node.ipAddresses', + 'value': 'IPs' + }, + { + 'name': 'node.update', + 'value': 'Autoupdate' + }, + { + 'name': 'node.site', + 'value': 'Site' + }, + { + 'name': 'node.clients', + 'value': 'Clients' + } + ], + 'supportedLocale': [ + 'en', + 'de', + 'cz', + 'fr', + 'tr', + 'ru' + ], + // Color configs + 'icon': { + 'base': { + 'fillOpacity': 0.6, + 'opacity': 0.6, + 'weight': 2, + 'radius': 6, + 'className': 'stroke-first' + }, + 'online': { + 'color': '#1566A9', + 'fillColor': '#1566A9' + }, + 'offline': { + 'color': '#D43E2A', + 'fillColor': '#D43E2A', + 'radius': 3 + }, + 'lost': { + 'color': '#D43E2A', + 'fillColor': '#D43E2A', + 'radius': 4 + }, + 'alert': { + 'color': '#D43E2A', + 'fillColor': '#D43E2A', + 'radius': 5 + }, + 'new': { + 'color': '#1566A9', + 'fillColor': '#93E929' + } + }, + 'client': { + 'wifi24': 'rgba(220, 0, 103, 0.7)', + 'wifi5': 'rgba(10, 156, 146, 0.7)', + 'other': 'rgba(227, 166, 25, 0.7)' + }, + 'map': { + 'labelNewColor': '#459c18', + 'tqFrom': '#F02311', + 'tqTo': '#04C714', + 'highlightNode': { + 'color': '#ad2358', + 'weight': 8, + 'fillOpacity': 1, + 'opacity': 0.4, + 'className': 'stroke-first' + }, + 'highlightLink': { + 'weight': 4, + 'opacity': 1, + 'dashArray': '5, 10' + } + }, + 'forceGraph': { + 'nodeColor': '#fff', + 'nodeOfflineColor': '#D43E2A', + 'highlightColor': 'rgba(255, 255, 255, 0.2)', + 'labelColor': '#fff', + 'tqFrom': '#770038', + 'tqTo': '#dc0067', + 'zoomModifier': 1 + }, + 'locate': { + 'outerCircle': { + 'stroke': false, + 'color': '#4285F4', + 'opacity': 1, + 'fillOpacity': 0.3, + 'clickable': false, + 'radius': 16 + }, + 'innerCircle': { + 'stroke:': true, + 'color': '#ffffff', + 'fillColor': '#4285F4', + 'weight': 1.5, + 'clickable': false, + 'opacity': 1, + 'fillOpacity': 1, + 'radius': 7 + }, + 'accuracyCircle': { + 'stroke': true, + 'color': '#4285F4', + 'weight': 1, + 'clickable': false, + 'opacity': 0.7, + 'fillOpacity': 0.2 + } + }, + 'cacheBreaker': '' + }; +}; diff --git a/config.default.json b/config.default.json deleted file mode 100644 index 39f1abc..0000000 --- a/config.default.json +++ /dev/null @@ -1,52 +0,0 @@ -// Gulp will remove all comments -{ - "reverseGeocodingApi": "https://nominatim.openstreetmap.org/reverse", - "maxAge": 14, - "maxAgeAlert": 3, - "nodeZoom": 18, - "labelZoom": 13, - "clientZoom": 15, - "nodeInfobox": { - "contact": false, - "hardwareUsage": true - }, - "supportedLocale": [ - "en", - "de", - "fr", - "ru" - ], - "icon": { - "base": { - "fillOpacity": 0.6, - "opacity": 0.6, - "weight": 2, - "radius": 6, - "className": "stroke-first" - }, - "online": { - "color": "#1566A9", - "fillColor": "#1566A9" - }, - "offline": { - "color": "#D43E2A", - "fillColor": "#D43E2A", - "radius": 3 - }, - "lost": { - "color": "#D43E2A", - "fillColor": "#D43E2A", - "radius": 4 - }, - "alert": { - "color": "#D43E2A", - "fillColor": "#D43E2A", - "radius": 5 - }, - "new": { - "color": "#1566A9", - "fillColor": "#93E929" - } - }, - "cacheBreaker": "" -} diff --git a/config.js b/config.js new file mode 100644 index 0000000..238c209 --- /dev/null +++ b/config.js @@ -0,0 +1,124 @@ +module.exports = function () { + return { + // Variables are NODE_ID and NODE_NAME (only a-z0-9\- other chars are replaced with _) + 'nodeInfos': [ + { + 'name': 'Clientstatistik', + 'href': 'https://regensburg.freifunk.net/netz/statistik/node/{NODE_ID}/', + 'image': 'https://grafana.regensburg.freifunk.net/render/d-solo/000000026/node?panelId=1&var-node={NODE_ID}&from=now-7d&width=650&height=350&theme=light&_t={TIME}', + 'title': 'Knoten {NODE_ID} - weiteren Statistiken' + }, + { + 'name': 'Trafficstatistik', + 'href': 'https://regensburg.freifunk.net/netz/statistik/node/{NODE_ID}/', + 'image': 'https://grafana.regensburg.freifunk.net/render/d-solo/000000026/node?panelId=2&from=now-7d&var-node={NODE_ID}&width=650&height=350&theme=light&_t={TIME}', + 'title': 'Knoten {NODE_ID} - weiteren Statistiken' + }, + { + 'name': 'Airtime', + 'href': 'https://regensburg.freifunk.net/netz/statistik/node/{NODE_ID}/', + 'image': 'https://grafana.regensburg.freifunk.net/render/d-solo/000000026/node?panelId=5&from=now-7d&var-node={NODE_ID}&width=650&height=350&theme=light&_t={TIME}', + 'title': 'Knoten {NODE_ID} - weiteren Statistiken' + } + ], + 'linkInfos': [ + { + 'name': 'Statistik für alle Links zwischen diese Knoten', + 'image': 'https://grafana.regensburg.freifunk.net/render/d-solo/000000026/node?panelId=7&var-node={SOURCE_ID}&var-nodetolink={TARGET_ID}&from=now-7d&&width=650&height=350&theme=light&_t={TIME}', + 'title': 'Linkstatistik des letzten Tages, min und max aller Links zwischen diesen Knoten' + } + ], + // Array of data provider are supported + 'dataPath': [ + 'https://regensburg.freifunk.net/data/' + ], + 'siteName': 'Freifunk Regensburg', + 'mapLayers': [ + { + 'name': 'Freifunk Regensburg', + // Please ask Freifunk Regensburg before using its tile server c- example with retina tiles + 'url': 'https://{s}.tiles.ffrgb.net/{z}/{x}/{y}{retina}.png', + 'config': { + 'maxZoom': 20, + 'subdomains': '1234', + 'attribution': '© OpenMapTiles © OpenStreetMap contributors', + 'start': 6 + } + }, + { + 'name': 'Freifunk Regensburg Night', + // Please ask Freifunk Regensburg before using its tile server - example with retina and dark tiles + 'url': 'https://{s}.tiles.ffrgb.net/n/{z}/{x}/{y}{retina}.png', + 'config': { + 'maxZoom': 20, + 'subdomains': '1234', + 'attribution': ' © OpenMapTiles © OpenStreetMap contributors', + 'mode': 'night', + 'start': 19, + 'end': 7 + } + }, + { + 'name': 'OpenStreetMap.HOT', + 'url': 'https://{s}.tile.openstreetmap.fr/hot/{z}/{x}/{y}.png', + 'config': { + 'maxZoom': 19, + 'attribution': '© Openstreetmap France | © OpenStreetMap' + } + }, + { + 'name': 'HERE', + // Please use your own API key - Free plan is on right side after the pay plans + 'url': 'https://{s}.base.maps.api.here.com/maptile/2.1/maptile/newest/normal.day/{z}/{x}/{y}/256/png8?app_id=YOUR_KEY&app_code=YOUR_CODE&lg=deu', + 'config': { + 'attribution': 'Map © 1987-2014 HERE', + 'subdomains': '1234', + 'maxZoom': 20 + } + }, + { + 'name': 'Esri.WorldImagery', + 'url': '//server.arcgisonline.com/ArcGIS/rest/services/World_Imagery/MapServer/tile/{z}/{y}/{x}', + 'config': { + 'maxZoom': 20, + 'attribution': 'Tiles © Esri — Source: Esri, i-cubed, USDA, USGS, AEX, GeoEye, Getmapping, Aerogrid, IGN, IGP, UPR-EGP, and the GIS User Community' + } + }, + { + 'name': 'HERE.hybridDay', + // Please use your own API key - Free plan is on right side after the pay plans + 'url': 'https://{s}.aerial.maps.api.here.com/maptile/2.1/maptile/newest/{variant}/{z}/{x}/{y}/256/png8?app_id=YOUR_KEY&app_code=YOUR_CODE&lg=deu', + 'config': { + 'attribution': 'Map © 1987-2014 HERE', + 'subdomains': '1234', + 'variant': 'hybrid.day', + 'maxZoom': 20 + } + } + ], + // Set a visible frame + 'fixedCenter': [ + // Northwest + [ + 49.3522, + 11.7752 + ], + // Southeast + [ + 48.7480, + 12.8917 + ] + ], + 'siteNames': [ + { + 'site': 'ffrgb-bat15', + 'name': 'Regensburg' + }, + { + 'site': 'ffrgb', + 'name': 'Regensburg' + } + ] + }; +}; + diff --git a/config.json b/config.json deleted file mode 100644 index c645126..0000000 --- a/config.json +++ /dev/null @@ -1,115 +0,0 @@ -// Gulp will remove all comments -{ - // Variables are NODE_ID and NODE_NAME (only a-z0-9\- other chars are replaced with _) - "nodeInfos": [ - { - "name": "Clientstatistik", - "href": "https://regensburg.freifunk.net/netz/statistik/node/{NODE_ID}/", - "image": "https://grafana.regensburg.freifunk.net/render/dashboard-solo/db/ffrgb-all-nodes?panelId=1&from=now-7d&var-nodeid={NODE_ID}&var-host={NODE_NAME}&width=650&height=350&theme=light&_t={TIME}", - "title": "Knoten {NODE_ID} - weiteren Statistiken" - }, - { - "name": "Trafficstatistik", - "href": "https://regensburg.freifunk.net/netz/statistik/node/{NODE_ID}/", - "image": "https://grafana.regensburg.freifunk.net/render/dashboard-solo/db/ffrgb-all-nodes?panelId=2&from=now-7d&var-nodeid={NODE_ID}&var-host={NODE_NAME}&width=650&height=350&theme=light&_t={TIME}", - "title": "Knoten {NODE_ID} - weiteren Statistiken" - } - ], - "globalInfos": [ - { - "name": "Statistik", - "href": "https://regensburg.freifunk.net/netz/statistik/", - "image": "https://grafana.regensburg.freifunk.net/render/dashboard-solo/db/ffrgb-network-wide-stats?panelId=11&from=now-1y&width=600&height=350&theme=light", - "title": "Jahresstatistik - weiteren Statistiken" - } - ], - // String or array of data provider are supported - "dataPath": "https://regensburg.freifunk.net/data/", - "siteName": "Freifunk Regensburg", - "mapLayers": [ - { - "name": "Freifunk Regensburg", - // Please ask Freifunk Regensburg before using its tile server c- example with retina tiles - "url": "https://{s}.tiles.ffrgb.net/{z}/{x}/{y}{retina}.png", - "config": { - "maxZoom": 22, - "subdomains": "1234", - "attribution": "© Mapbox © OpenStreetMap Improve this map", - "start": 6 - } - }, - { - "name": "Freifunk Regensburg Night", - // Please ask Freifunk Regensburg before using its tile server - example with retina and dark tiles - "url": "https://{s}.tiles.ffrgb.net/n/{z}/{x}/{y}{retina}.png", - "config": { - "maxZoom": 22, - "subdomains": "1234", - "attribution": "© Mapbox © OpenStreetMap Improve this map", - "mode": "night", - "start": 19, - "end": 7 - } - }, - { - "name": "OpenStreetMap.HOT", - "url": "https://{s}.tile.openstreetmap.fr/hot/{z}/{x}/{y}.png", - "config": { - "maxZoom": 19, - "attribution": "© Openstreetmap France | © OpenStreetMap" - } - }, - { - "name": "HERE", - // Please use your own API key - Free plan is on right side after the pay plans - "url": "https://{s}.base.maps.api.here.com/maptile/2.1/maptile/newest/normal.day/{z}/{x}/{y}/256/png8?app_id=YOUR_KEY&app_code=YOUR_CODE&lg=deu", - "config": { - "attribution": "Map © 1987-2014 HERE", - "subdomains": "1234", - "maxZoom": 20 - } - }, - { - "name": "Esri.WorldImagery", - "url": "//server.arcgisonline.com/ArcGIS/rest/services/World_Imagery/MapServer/tile/{z}/{y}/{x}", - "config": { - "maxZoom": 20, - "attribution": "Tiles © Esri — Source: Esri, i-cubed, USDA, USGS, AEX, GeoEye, Getmapping, Aerogrid, IGN, IGP, UPR-EGP, and the GIS User Community" - } - }, - { - "name": "HERE.hybridDay", - // Please use your own API key - Free plan is on right side after the pay plans - "url": "https://{s}.aerial.maps.api.here.com/maptile/2.1/maptile/newest/{variant}/{z}/{x}/{y}/256/png8?app_id=YOUR_KEY&app_code=YOUR_CODE&lg=deu", - "config": { - "attribution": "Map © 1987-2014 HERE", - "subdomains": "1234", - "variant": "hybrid.day", - "maxZoom": 20 - } - } - ], - // Set a visible frame - "fixedCenter": [ - // Northwest - [ - 49.3522, - 11.7752 - ], - // Southeast - [ - 48.7480, - 12.8917 - ] - ], - "siteNames": [ - { - "site": "ffrgb-bat15", - "name": "Regensburg" - }, - { - "site": "ffrgb", - "name": "Regensburg" - } - ] -} diff --git a/crowdin.yml b/crowdin.yml deleted file mode 100644 index d043b23..0000000 --- a/crowdin.yml +++ /dev/null @@ -1,3 +0,0 @@ -files: - - source: /locale/en.json - translation: /locale/%two_letters_code%.json diff --git a/gulp/config.js b/gulp/config.js index 18d15e7..f6c5fa8 100644 --- a/gulp/config.js +++ b/gulp/config.js @@ -8,7 +8,7 @@ module.exports = function () { sass: 'scss/**/*.scss', javascript: ['./app.js', 'lib/**/*.js'], json: 'locale/*.json', - html: ['html/*.html', './config*.json'] + html: ['html/*.html', './config*.js'] }, clean: [build + '/*.map', build + '/vendor', build + '/main.css'], autoprefixer: ['> 1% in DE'], diff --git a/gulp/tasks/copy.js b/gulp/tasks/copy.js index 17be9db..d7a0e1c 100644 --- a/gulp/tasks/copy.js +++ b/gulp/tasks/copy.js @@ -2,9 +2,9 @@ module.exports = function (gulp, plugins, config) { return function copy() { gulp.src(['html/*.html', 'assets/favicon/*']) .pipe(gulp.dest(config.build)); - gulp.src(['assets/logo.svg']) + gulp.src(['assets/logo.svg', 'service-worker.js']) .pipe(gulp.dest(config.build)); - gulp.src(['node_modules/promise-polyfill/promise.js', 'polyfill.js']) + gulp.src(['node_modules/promise-polyfill/dist/promise.js', 'polyfill.js']) .pipe(gulp.dest(config.build + '/vendor')); return gulp.src(['assets/fonts/*', 'assets/icons/fonts/*']) .pipe(gulp.dest(config.build + '/fonts')); diff --git a/gulp/tasks/favicon.js b/gulp/tasks/favicon.js index cabe0f6..9f3036f 100644 --- a/gulp/tasks/favicon.js +++ b/gulp/tasks/favicon.js @@ -7,7 +7,7 @@ module.exports = function (gulp, plugins, config) { design: { ios: { pictureAspect: 'backgroundAndMargin', - backgroundColor: '#000000', + backgroundColor: '#ffffff', margin: '14%', assets: { ios6AndPriorIcons: false, @@ -19,7 +19,7 @@ module.exports = function (gulp, plugins, config) { }, desktopBrowser: {}, windows: { - pictureAspect: 'noChange', + pictureAspect: 'whiteSilhouette', backgroundColor: '#dc0067', onConflict: 'override', assets: { @@ -39,7 +39,7 @@ module.exports = function (gulp, plugins, config) { manifest: { name: 'Meshviewer', display: 'standalone', - orientation: 'notSet', + orientation: 'portrait', onConflict: 'override', declared: true }, diff --git a/gulp/tasks/html.js b/gulp/tasks/html.js index 6f33537..e93a743 100644 --- a/gulp/tasks/html.js +++ b/gulp/tasks/html.js @@ -1,21 +1,37 @@ const fs = require('fs'); + +// stringify functions https://gist.github.com/cowboy/3749767 +var stringify = function (obj) { + var placeholder = '____PLACEHOLDER____'; + var fns = []; + var json = JSON.stringify(obj, function (key, value) { + if (typeof value === 'function') { + fns.push(value); + return placeholder; + } + return value; + }, 2); + json = json.replace(new RegExp('"' + placeholder + '"', 'g'), function () { + return fns.shift(); + }); + return json; +}; + module.exports = function (gulp, plugins, config, env) { return function html() { return gulp.src(env.production() ? config.build + '/*.html' : 'html/*.html') - .pipe(plugins.inject(gulp.src(['config.json']), { + .pipe(plugins.inject(gulp.src(['config.js']), { starttag: '', - transform: function (filePath, customConfig) { - var defaultConfig = fs.readFileSync('config.default.json', 'utf8'); - var buildConfig = Object.assign( - JSON.parse(JSON.minify(defaultConfig)), - JSON.parse(JSON.minify(customConfig.contents.toString('utf8'))) - ); - return '' - ; + ';'; } })) .pipe(env.production(plugins.kyhInlineSource({ compress: false }))) diff --git a/gulp/tasks/javascript.js b/gulp/tasks/javascript.js index 7b21f15..88e7137 100644 --- a/gulp/tasks/javascript.js +++ b/gulp/tasks/javascript.js @@ -3,7 +3,10 @@ module.exports = function (gulp, plugins, config, env) { return gulp.src('app.js') .pipe(env.development(plugins.sourcemaps.init())) .pipe(plugins.requirejsOptimize(env.production() ? config.requireJs.prod : config.requireJs.dev)) - .pipe(env.production(plugins.uglify({ preserveComments: 'license' }))) + .on('error', function () { + this.emit('end'); + }) + .pipe(env.production(plugins.uglify({ output: { comments: 'all' } }))) .pipe(env.development(plugins.sourcemaps.write('.', { addComment: true }))) .pipe(gulp.dest(config.build)); }; diff --git a/gulp/tasks/sass.js b/gulp/tasks/sass.js index f4ce8fb..e0a9c5e 100644 --- a/gulp/tasks/sass.js +++ b/gulp/tasks/sass.js @@ -6,6 +6,9 @@ module.exports = function (gulp, plugins, config, env) { outputStyle: 'compressed', sourceMap: false })) + .on('error', function () { + this.emit('end'); + }) .pipe(plugins.autoprefixer({ browsers: config.autoprefixer })) diff --git a/html/index.html b/html/index.html index c731ef5..79ef4e1 100644 --- a/html/index.html +++ b/html/index.html @@ -1,8 +1,29 @@ - + + + + + + + + + + + + + + + + + + + + + + @@ -16,7 +37,7 @@

Lade
- + Loading ...
Karten & Knoten...

diff --git a/html/offline.html b/html/offline.html new file mode 100644 index 0000000..3226a2a --- /dev/null +++ b/html/offline.html @@ -0,0 +1,23 @@ + + + + + Freifunk Regensburg e.V. - Meshviewer + + + + +
+

+ Your are Offline!
+ Loading ... +
+ No connection available. +


+

+ +
+ + diff --git a/lib/about.js b/lib/about.js index b23e640..8d48ca6 100644 --- a/lib/about.js +++ b/lib/about.js @@ -4,7 +4,18 @@ define(function () { return function () { this.render = function render(d) { d.innerHTML = _.t('sidebar.aboutInfo') + - + '

' + _.t('node.nodes') + '

' + + '

' + + ' ' + _.t('sidebar.nodeNew') + '' + + ' ' + _.t('sidebar.nodeOnline') + '' + + ' ' + _.t('sidebar.nodeOffline') + '' + + '

' + + '

' + _.t('node.clients') + '

' + + '

' + + ' 2.4 Ghz' + + ' 5 Ghz' + + ' ' + _.t('others') + '' + + '

' + '

AGPL 3

' + '

Copyright (C) Milan Pässler

' + diff --git a/lib/filters/filtergui.js b/lib/filters/filtergui.js index 5dc033e..767d5f9 100644 --- a/lib/filters/filtergui.js +++ b/lib/filters/filtergui.js @@ -22,6 +22,7 @@ define(function () { var button = document.createElement('button'); button.classList.add('ion-close'); + button.setAttribute('aria-label', _.t('remove')); button.onclick = function onclick() { distributor.removeFilter(d); }; diff --git a/lib/filters/hostname.js b/lib/filters/hostname.js index b311c07..6fbc932 100644 --- a/lib/filters/hostname.js +++ b/lib/filters/hostname.js @@ -16,7 +16,7 @@ define(function () { } function run(d) { - return (d.nodeinfo !== undefined ? d.nodeinfo.hostname.toLowerCase().includes(input.value.toLowerCase()) : ''); + return d.hostname.toLowerCase().includes(input.value.toLowerCase()); } function setRefresh(f) { @@ -26,6 +26,7 @@ define(function () { function render(el) { input.type = 'search'; input.placeholder = _.t('sidebar.nodeFilter'); + input.setAttribute('aria-label', _.t('sidebar.nodeFilter')); input.addEventListener('input', refresh); el.classList.add('filter-node'); el.classList.add('ion-filter'); diff --git a/lib/filters/nodefilter.js b/lib/filters/nodefilter.js index 0cf7fd0..b8e24a8 100644 --- a/lib/filters/nodefilter.js +++ b/lib/filters/nodefilter.js @@ -12,26 +12,8 @@ define(function () { } } - var filteredIds = new Set(); - - n.graph = {}; - n.graph.nodes = data.graph.nodes.filter(function (d) { - var r; - if (d.node) { - r = filter(d.node); - } else { - r = filter({}); - } - - if (r) { - filteredIds.add(d.id); - } - - return r; - }); - - n.graph.links = data.graph.links.filter(function (d) { - return filteredIds.has(d.source.id) && filteredIds.has(d.target.id); + n.links = data.links.filter(function (d) { + return filter(d.source) && filter(d.target); }); return n; diff --git a/lib/forcegraph.js b/lib/forcegraph.js index 4b28245..5f1d4ea 100644 --- a/lib/forcegraph.js +++ b/lib/forcegraph.js @@ -1,8 +1,8 @@ -define(['d3-selection', 'd3-force', 'd3-zoom', 'd3-drag', 'utils/math', 'forcegraph/draw'], - function (d3Selection, d3Force, d3Zoom, d3Drag, math, draw) { +define(['d3-selection', 'd3-force', 'd3-zoom', 'd3-drag', 'd3-timer', 'd3-ease', 'd3-interpolate', 'utils/math', 'forcegraph/draw'], + function (d3Selection, d3Force, d3Zoom, d3Drag, d3Timer, d3Ease, d3Interpolate, math, draw) { 'use strict'; - return function (config, linkScale, sidebar, router) { + return function (linkScale, sidebar) { var self = this; var el; var canvas; @@ -14,15 +14,18 @@ define(['d3-selection', 'd3-force', 'd3-zoom', 'd3-drag', 'utils/math', 'forcegr var intNodes = []; var dictNodes = {}; var intLinks = []; + var movetoTimer; + var initial = 1.8; var NODE_RADIUS_DRAG = 10; var NODE_RADIUS_SELECT = 15; var LINK_RADIUS_SELECT = 12; + var ZOOM_ANIMATE_DURATION = 350; var ZOOM_MIN = 1 / 8; var ZOOM_MAX = 3; - var FORCE_ALPHA = 0.3; + var FORCE_ALPHA = 0.01; draw.setTransform(transform); @@ -32,9 +35,43 @@ define(['d3-selection', 'd3-force', 'd3-zoom', 'd3-drag', 'utils/math', 'forcegr draw.setMaxArea(canvas.width, canvas.height); } - function moveTo(x, y) { - transform.x = (canvas.width + sidebar()) / 2 - x * transform.k; - transform.y = canvas.height / 2 - y * transform.k; + function transformPosition(p) { + transform.x = p.x; + transform.y = p.y; + transform.k = p.k; + } + + function moveTo(callback, forceMove) { + clearTimeout(movetoTimer); + if (!forceMove && force.alpha() > 0.3) { + movetoTimer = setTimeout(function timerOfMoveTo() { + moveTo(callback); + }, 300); + return; + } + var result = callback(); + var x = result[0]; + var y = result[1]; + var k = result[2]; + var end = { k: k }; + + end.x = (canvas.width + sidebar.getWidth()) / 2 - x * k; + end.y = canvas.height / 2 - y * k; + + var start = { x: transform.x, y: transform.y, k: transform.k }; + + var interpolate = d3Interpolate.interpolateObject(start, end); + + var timer = d3Timer.timer(function (t) { + if (t >= ZOOM_ANIMATE_DURATION) { + timer.stop(); + return; + } + + var v = interpolate(d3Ease.easeQuadInOut(t / ZOOM_ANIMATE_DURATION)); + transformPosition(v); + window.requestAnimationFrame(redraw); + }); } function onClick() { @@ -46,7 +83,7 @@ define(['d3-selection', 'd3-force', 'd3-zoom', 'd3-drag', 'utils/math', 'forcegr var n = force.find(e[0], e[1], NODE_RADIUS_SELECT); if (n !== undefined) { - router.fullUrl({ node: n.o.node.nodeinfo.node_id }); + router.fullUrl({ node: n.o.node_id }); return; } @@ -85,16 +122,16 @@ define(['d3-selection', 'd3-force', 'd3-zoom', 'd3-drag', 'utils/math', 'forcegr forceLink = d3Force.forceLink() .distance(function (d) { - if (d.o.vpn) { + if (d.o.type.indexOf('vpn') === 0) { return 0; } return 75; }) .strength(function (d) { - if (d.o.vpn) { + if (d.o.type.indexOf('vpn') === 0) { return 0.02; } - return Math.max(0.5, 1 / d.o.tq); + return Math.max(0.5, d.o.source_tq); }); var zoom = d3Zoom.zoom() @@ -111,7 +148,8 @@ define(['d3-selection', 'd3-force', 'd3-zoom', 'd3-drag', 'utils/math', 'forcegr .force('x', d3Force.forceX().strength(0.02)) .force('y', d3Force.forceY().strength(0.02)) .force('collide', d3Force.forceCollide()) - .on('tick', redraw); + .on('tick', redraw) + .alphaDecay(0.025); var drag = d3Drag.drag() .subject(function () { @@ -160,13 +198,11 @@ define(['d3-selection', 'd3-force', 'd3-zoom', 'd3-drag', 'utils/math', 'forcegr }); self.setData = function setData(data) { - intNodes = data.graph.nodes.map(function (d) { - var e; - if (d.id in dictNodes) { - e = dictNodes[d.id]; - } else { + intNodes = data.nodes.all.map(function (d) { + var e = dictNodes[d.node_id]; + if (!e) { e = {}; - dictNodes[d.id] = e; + dictNodes[d.node_id] = e; } e.o = d; @@ -174,65 +210,67 @@ define(['d3-selection', 'd3-force', 'd3-zoom', 'd3-drag', 'utils/math', 'forcegr return e; }); - intLinks = data.graph.links.map(function (d) { - var e = {}; - e.o = d; - e.source = dictNodes[d.source.id]; - e.target = dictNodes[d.target.id]; - e.color = linkScale(1 / d.tq); - - return e; + intLinks = data.links.filter(function (d) { + return data.nodeDict[d.source.node_id].is_online && data.nodeDict[d.target.node_id].is_online; + }).map(function (d) { + return { + o: d, + source: dictNodes[d.source.node_id], + target: dictNodes[d.target.node_id], + color: linkScale(d.source_tq), + color_to: linkScale(d.target_tq) + }; }); force.nodes(intNodes); forceLink.links(intLinks); - force.alpha(1).restart(); + force.alpha(initial).velocityDecay(0.15).restart(); + if (initial === 1.8) { + initial = 0.5; + } + resizeCanvas(); }; self.resetView = function resetView() { - draw.setHighlight(null); - transform.k = (ZOOM_MIN + 1) / 2; - moveTo(0, 0); - redraw(); + moveTo(function calcToReset() { + draw.setHighlight(null); + return [0, 0, (ZOOM_MIN + config.forceGraph.zoomModifier) / 2]; + }, true); }; self.gotoNode = function gotoNode(d) { - for (var i = 0; i < intNodes.length; i++) { - var n = intNodes[i]; - if (n.o.node.nodeinfo.node_id !== d.nodeinfo.node_id) { - continue; + moveTo(function calcToNode() { + draw.setHighlight({ type: 'node', id: d.node_id }); + var n = dictNodes[d.node_id]; + if (n) { + return [n.x, n.y, (ZOOM_MAX + 1) / 2]; } - draw.setHighlight({ type: 'node', o: n.o.node }); - transform.k = (ZOOM_MAX + 1) / 2; - moveTo(n.x, n.y); - break; - } - redraw(); + return self.resetView(); + }); }; self.gotoLink = function gotoLink(d) { - draw.setHighlight({ type: 'link', o: d }); - for (var i = 0; i < intLinks.length; i++) { - var l = intLinks[i]; - if (l.o !== d) { - continue; + moveTo(function calcToLink() { + draw.setHighlight({ type: 'link', id: d[0].id }); + var l = intLinks.find(function (link) { + return link.o.id === d[0].id; + }); + if (l) { + return [(l.source.x + l.target.x) / 2, (l.source.y + l.target.y) / 2, (ZOOM_MAX / 2) + ZOOM_MIN]; } - moveTo((l.source.x + l.target.x) / 2, (l.source.y + l.target.y) / 2); - break; - } - redraw(); + return self.resetView(); + }); }; - self.gotoLocation = function gotoLocation() { // ignore }; self.destroy = function destroy() { force.stop(); - canvas.remove(); + canvas.parentNode.removeChild(canvas); force = null; if (el.parentNode) { diff --git a/lib/forcegraph/draw.js b/lib/forcegraph/draw.js index 62b0eff..29e5e9a 100644 --- a/lib/forcegraph/draw.js +++ b/lib/forcegraph/draw.js @@ -4,50 +4,39 @@ define(['helper'], function (helper) { var ctx; var width; var height; - var transform; - var highlight; - var nodeColor = '#fff'; - var clientColor = '#e6324b'; - var highlightColor = 'rgba(255, 255, 255, 0.2)'; - - var labelColor = '#fff'; - var NODE_RADIUS = 15; var LINE_RADIUS = 12; function drawDetailNode(d) { - if (transform.k > 1) { - ctx.beginPath(); - helper.positionClients(ctx, d, Math.PI, d.o.node.statistics.clients, 15); - ctx.fillStyle = clientColor; - ctx.fill(); + if (transform.k > 1 && d.o.is_online) { + helper.positionClients(ctx, d, Math.PI, d.o, 15); ctx.beginPath(); var name = d.o.node_id; - if (d.o.node && d.o.node.nodeinfo) { - name = d.o.node.nodeinfo.hostname; + if (d.o) { + name = d.o.hostname; } ctx.textAlign = 'center'; - ctx.fillStyle = labelColor; + ctx.fillStyle = config.forceGraph.labelColor; ctx.fillText(name, d.x, d.y + 20); } } function drawHighlightNode(d) { - if (highlight && highlight.type === 'node' && d.o.node === highlight.o) { + if (highlight && highlight.type === 'node' && d.o.node_id === highlight.id) { ctx.arc(d.x, d.y, NODE_RADIUS * 1.5, 0, 2 * Math.PI); - ctx.fillStyle = highlightColor; + ctx.fillStyle = config.forceGraph.highlightColor; ctx.fill(); ctx.beginPath(); } } function drawHighlightLink(d, to) { - if (highlight && highlight.type === 'link' && d.o === highlight.o) { + if (highlight && highlight.type === 'link' && d.o.id === highlight.id) { ctx.lineTo(to[0], to[1]); - ctx.strokeStyle = highlightColor; + ctx.strokeStyle = config.forceGraph.highlightColor; ctx.lineWidth = LINE_RADIUS * 2; ctx.lineCap = 'round'; ctx.stroke(); @@ -64,9 +53,17 @@ define(['helper'], function (helper) { drawHighlightNode(d); - ctx.moveTo(d.x + 3, d.y); - ctx.arc(d.x, d.y, 8, 0, 2 * Math.PI); - ctx.fillStyle = nodeColor; + if (d.o.is_online) { + ctx.arc(d.x, d.y, 8, 0, 2 * Math.PI); + if (d.o.is_gateway) { + ctx.rect(d.x - 9, d.y - 9, 18, 18); + } + ctx.fillStyle = config.forceGraph.nodeColor; + } else { + ctx.arc(d.x, d.y, 6, 0, 2 * Math.PI); + ctx.fillStyle = config.forceGraph.nodeOfflineColor; + } + ctx.fill(); drawDetailNode(d); @@ -76,7 +73,7 @@ define(['helper'], function (helper) { var zero = transform.invert([0, 0]); var area = transform.invert([width, height]); if (d.source.x < zero[0] && d.target.x < zero[0] || d.source.y < zero[1] && d.target.y < zero[1] || - d.source.x > area[0] && d.target.x > area[0] || d.source.y > area[1] && d.target.y > area[1]) { + d.source.x > area[0] && d.target.x > area[0] || d.source.y > area[1] && d.target.y > area[1]) { return; } ctx.beginPath(); @@ -85,9 +82,13 @@ define(['helper'], function (helper) { to = drawHighlightLink(d, to); + var grd = ctx.createLinearGradient(d.source.x, d.source.y, d.target.x, d.target.y); + grd.addColorStop(0.45, d.color); + grd.addColorStop(0.55, d.color_to); + ctx.lineTo(to[0], to[1]); - ctx.strokeStyle = d.color; - if (d.o.vpn) { + ctx.strokeStyle = grd; + if (d.o.type.indexOf('vpn') === 0) { ctx.globalAlpha = 0.2; ctx.lineWidth = 1.5; } else { diff --git a/lib/gui.js b/lib/gui.js index d317d66..19c2a2c 100644 --- a/lib/gui.js +++ b/lib/gui.js @@ -2,130 +2,131 @@ define(['d3-interpolate', 'map', 'sidebar', 'tabs', 'container', 'legend', 'linklist', 'nodelist', 'simplenodelist', 'infobox/main', 'proportions', 'forcegraph', 'title', 'about', 'datadistributor', 'filters/filtergui', 'filters/hostname'], - function (d3Interpolate, Map, Sidebar, Tabs, Container, Legend, Linklist, - Nodelist, SimpleNodelist, Infobox, Proportions, ForceGraph, - Title, About, DataDistributor, FilterGUI, HostnameFilter) { - 'use strict'; +function (d3Interpolate, Map, Sidebar, Tabs, Container, Legend, Linklist, + Nodelist, SimpleNodelist, Infobox, Proportions, ForceGraph, + Title, About, DataDistributor, FilterGUI, HostnameFilter) { + 'use strict'; - return function (config, router, language) { - var self = this; - var content; - var contentDiv; + return function (language) { + var self = this; + var content; + var contentDiv; - var linkScale = d3Interpolate.interpolate('#F02311', '#04C714'); - var sidebar; + var linkScale = d3Interpolate.interpolate(config.map.tqFrom, config.map.tqTo); + var sidebar; - var buttons = document.createElement('div'); - buttons.classList.add('buttons'); + var buttons = document.createElement('div'); + buttons.classList.add('buttons'); - var fanout = new DataDistributor(); - var fanoutUnfiltered = new DataDistributor(); - fanoutUnfiltered.add(fanout); + var fanout = new DataDistributor(); + var fanoutUnfiltered = new DataDistributor(); + fanoutUnfiltered.add(fanout); - function removeContent() { - if (!content) { - return; - } - - router.removeTarget(content); - fanout.remove(content); - - content.destroy(); - - content = null; + function removeContent() { + if (!content) { + return; } - function addContent(K) { - removeContent(); + router.removeTarget(content); + fanout.remove(content); - content = new K(config, linkScale, sidebar.getWidth, router, buttons); - content.render(contentDiv); + content.destroy(); - fanout.add(content); - router.addTarget(content); - } + content = null; + } - function mkView(K) { - return function () { - addContent(K); - }; - } + function addContent(K) { + removeContent(); - var loader = document.getElementsByClassName('loader')[0]; - loader.classList.add('hide'); + content = new K(linkScale, sidebar, buttons); + content.render(contentDiv); - contentDiv = document.createElement('div'); - contentDiv.classList.add('content'); - document.body.appendChild(contentDiv); + fanout.add(content); + router.addTarget(content); + } - sidebar = new Sidebar(document.body); - - contentDiv.appendChild(buttons); - - var buttonToggle = document.createElement('button'); - buttonToggle.classList.add('ion-eye', 'shadow'); - buttonToggle.setAttribute('data-tooltip', _.t('button.switchView')); - buttonToggle.onclick = function onclick() { - var data; - if (content.constructor === Map) { - data = { view: 'graph', lat: undefined, lng: undefined, zoom: undefined }; - } else { - data = { view: 'map' }; - } - router.fullUrl(data, false, true); + function mkView(K) { + return function () { + addContent(K); }; + } - buttons.appendChild(buttonToggle); + var loader = document.getElementsByClassName('loader')[0]; + loader.classList.add('hide'); - var title = new Title(config); + contentDiv = document.createElement('div'); + contentDiv.classList.add('content'); + document.body.appendChild(contentDiv); - var header = new Container('header'); - var infobox = new Infobox(config, sidebar, router); - var tabs = new Tabs(); - var overview = new Container(); - var legend = new Legend(config, language); - var newnodeslist = new SimpleNodelist('new', 'firstseen', router, _.t('node.new')); - var lostnodeslist = new SimpleNodelist('lost', 'lastseen', router, _.t('node.missing')); - var nodelist = new Nodelist(router); - var linklist = new Linklist(linkScale, router); - var statistics = new Proportions(config, fanout); - var about = new About(); + sidebar = new Sidebar(document.body); - fanoutUnfiltered.add(legend); - fanoutUnfiltered.add(newnodeslist); - fanoutUnfiltered.add(lostnodeslist); - fanout.add(nodelist); - fanout.add(linklist); - fanout.add(statistics); + contentDiv.appendChild(buttons); - sidebar.add(header); - header.add(legend); - - overview.add(newnodeslist); - overview.add(lostnodeslist); - - var filterGUI = new FilterGUI(fanout); - fanout.watchFilters(filterGUI); - header.add(filterGUI); - - var hostnameFilter = new HostnameFilter(); - fanout.addFilter(hostnameFilter); - - sidebar.add(tabs); - tabs.add('sidebar.actual', overview); - tabs.add('node.nodes', nodelist); - tabs.add('node.links', linklist); - tabs.add('sidebar.stats', statistics); - tabs.add('sidebar.about', about); - - router.addTarget(title); - router.addTarget(infobox); - - router.addView('map', mkView(Map)); - router.addView('graph', mkView(ForceGraph)); - - self.setData = fanoutUnfiltered.setData; - - return self; + var buttonToggle = document.createElement('button'); + buttonToggle.classList.add('ion-eye'); + buttonToggle.setAttribute('aria-label', _.t('button.switchView')); + buttonToggle.onclick = function onclick() { + var data; + if (content.constructor === Map) { + data = { view: 'graph', lat: undefined, lng: undefined, zoom: undefined }; + } else { + data = { view: 'map' }; + } + router.fullUrl(data, false, true); }; - }); + + buttons.appendChild(buttonToggle); + + var title = new Title(); + + var header = new Container('header'); + var infobox = new Infobox(sidebar, linkScale); + var tabs = new Tabs(); + var overview = new Container(); + var legend = new Legend(language); + var newnodeslist = new SimpleNodelist('new', 'firstseen', _.t('node.new')); + var lostnodeslist = new SimpleNodelist('lost', 'lastseen', _.t('node.missing')); + var nodelist = new Nodelist(); + var linklist = new Linklist(linkScale); + var statistics = new Proportions(fanout); + var about = new About(); + + fanoutUnfiltered.add(legend); + fanoutUnfiltered.add(newnodeslist); + fanoutUnfiltered.add(lostnodeslist); + fanoutUnfiltered.add(infobox); + fanout.add(nodelist); + fanout.add(linklist); + fanout.add(statistics); + + sidebar.add(header); + header.add(legend); + + overview.add(newnodeslist); + overview.add(lostnodeslist); + + var filterGUI = new FilterGUI(fanout); + fanout.watchFilters(filterGUI); + header.add(filterGUI); + + var hostnameFilter = new HostnameFilter(); + fanout.addFilter(hostnameFilter); + + sidebar.add(tabs); + tabs.add('sidebar.actual', overview); + tabs.add('node.nodes', nodelist); + tabs.add('node.links', linklist); + tabs.add('sidebar.stats', statistics); + tabs.add('sidebar.about', about); + + router.addTarget(title); + router.addTarget(infobox); + + router.addView('map', mkView(Map)); + router.addView('graph', mkView(ForceGraph)); + + self.setData = fanoutUnfiltered.setData; + + return self; + }; +}); diff --git a/lib/infobox/link.js b/lib/infobox/link.js index 017e5dc..ba2092f 100644 --- a/lib/infobox/link.js +++ b/lib/infobox/link.js @@ -1,53 +1,89 @@ -define(['helper'], function (helper) { +define(['helper', 'snabbdom'], function (helper, V) { 'use strict'; + V = V.default; - function showStatImg(o, d, time) { - var subst = {}; - subst['{SOURCE_ID}'] = d.source.node_id; - subst['{SOURCE_NAME}'] = d.source.node.nodeinfo.hostname.replace(/[^a-z0-9\-]/ig, '_'); - subst['{TARGET_ID}'] = d.target.node_id; - subst['{TARGET_NAME}'] = d.target.node.nodeinfo.hostname.replace(/[^a-z0-9\-]/ig, '_'); - subst['{TIME}'] = time; - subst['{LOCALE}'] = _.locale(); - return helper.showStat(o, subst); + function showStatImg(img, o, d, time) { + var subst = { + '{SOURCE_ID}': d.source.node_id, + '{SOURCE_NAME}': d.source.hostname.replace(/[^a-z0-9\-]/ig, '_'), + '{SOURCE_ADDR}': d.source_addr, + '{SOURCE_MAC}': d.source_mac ? d.source_mac : d.source_addr, + '{TARGET_ID}': d.target.node_id, + '{TARGET_NAME}': d.target.hostname.replace(/[^a-z0-9\-]/ig, '_'), + '{TARGET_ADDR}': d.target_addr, + '{TARGET_MAC}': d.target_mac ? d.target_mac : d.target_addr, + '{TYPE}': d.type, + '{TIME}': time, + '{LOCALE}': _.locale() + }; + + img.push(V.h('h4', helper.listReplace(o.name, subst))); + img.push(helper.showStat(V, o, subst)); } - return function (config, el, router, d) { - var h2 = document.createElement('h2'); - var a1 = document.createElement('a'); - a1.href = router.generateLink({ node: d.source.node_id }); - a1.textContent = d.source.node.nodeinfo.hostname; - h2.appendChild(a1); + return function (el, d, linkScale) { + var self = this; + var header = document.createElement('div'); + var table = document.createElement('table'); + var images = document.createElement('div'); + el.appendChild(header); + el.appendChild(table); + el.appendChild(images); - var arrow = document.createElement('span'); - arrow.classList.add('ion-arrow-right-c'); - h2.appendChild(arrow); + self.render = function render() { + var children = []; + var img = []; + var time = d[0].target.lastseen.format('DDMMYYYYHmmss'); - var a2 = document.createElement('a'); - a2.href = router.generateLink({ node: d.target.node_id }); - a2.textContent = d.target.node.nodeinfo.hostname; - h2.appendChild(a2); - el.appendChild(h2); + header = V.patch(header, V.h('div', V.h('h2', [ + V.h('a', { + props: { href: router.generateLink({ node: d[0].source.node_id }) } + }, d[0].source.hostname), + V.h('span', ' - '), + V.h('a', { + props: { href: router.generateLink({ node: d[0].target.node_id }) } + }, d[0].target.hostname) + ]))); - var attributes = document.createElement('table'); - attributes.classList.add('attributes'); + helper.attributeEntry(V, children, 'node.hardware', (d[0].source.model ? d[0].source.model + ' – ' : '') + + (d[0].target.model ? d[0].target.model : '')); + helper.attributeEntry(V, children, 'node.distance', helper.showDistance(d[0])); - helper.attributeEntry(attributes, 'node.tq', helper.showTq(d)); - helper.attributeEntry(attributes, 'node.distance', helper.showDistance(d)); - var hw1 = helper.dictGet(d.source.node.nodeinfo, ['hardware', 'model']); - var hw2 = helper.dictGet(d.target.node.nodeinfo, ['hardware', 'model']); - helper.attributeEntry(attributes, 'node.hardware', hw1 + ' – ' + hw2); + d.forEach(function (link) { + children.push(V.h('tr', { props: { className: 'header' } }, [ + V.h('th', _.t('node.connectionType')), + V.h('th', link.type) + ])); + helper.attributeEntry(V, children, 'node.tq', V.h('span', + { style: { color: linkScale((link.source_tq + link.target_tq) / 2) } }, + helper.showTq(link.source_tq) + ' - ' + helper.showTq(link.target_tq)) + ); - el.appendChild(attributes); - - if (config.linkInfos) { - var time = d.target.node.lastseen.format('DDMMYYYYHmmss'); - config.linkInfos.forEach(function (linkInfo) { - var h4 = document.createElement('h4'); - h4.textContent = linkInfo.name; - el.appendChild(h4); - el.appendChild(showStatImg(linkInfo, d, time)); + if (config.linkTypeInfos) { + config.linkTypeInfos.forEach(function (o) { + showStatImg(img, o, link, time); + }); + } }); - } + + if (config.linkInfos) { + config.linkInfos.forEach(function (o) { + showStatImg(img, o, d[0], time); + }); + } + + var elNew = V.h('table', children); + table = V.patch(table, elNew); + table.elm.classList.add('attributes'); + images = V.patch(images, V.h('div', img)); + }; + + self.setData = function setData(data) { + d = data.links.filter(function (a) { + return a.id === d[0].id; + }); + self.render(); + }; + return self; }; }); diff --git a/lib/infobox/location.js b/lib/infobox/location.js index ba09a7e..cc4bcf5 100644 --- a/lib/infobox/location.js +++ b/lib/infobox/location.js @@ -1,7 +1,7 @@ define(['helper'], function (helper) { 'use strict'; - return function (config, el, router, d) { + return function (el, d) { var sidebarTitle = document.createElement('h2'); sidebarTitle.textContent = _.t('location.location'); el.appendChild(sidebarTitle); @@ -14,16 +14,19 @@ define(['helper'], function (helper) { }); var editLat = document.createElement('input'); + editLat.setAttribute('aria-label', _.t('location.latitude')); editLat.type = 'text'; editLat.value = d.lat.toFixed(9); el.appendChild(createBox('lat', _.t('location.latitude'), editLat)); var editLng = document.createElement('input'); + editLng.setAttribute('aria-label', _.t('location.longitude')); editLng.type = 'text'; editLng.value = d.lng.toFixed(9); el.appendChild(createBox('lng', _.t('location.longitude'), editLng)); var editUci = document.createElement('textarea'); + editUci.setAttribute('aria-label', 'Uci'); editUci.value = "uci set gluon-node-info.@location[0]='location'; " + "uci set gluon-node-info.@location[0].share_location='1';" + @@ -41,6 +44,7 @@ define(['helper'], function (helper) { var btn = document.createElement('button'); btn.classList.add('ion-clipboard'); btn.title = _.t('location.copy'); + btn.setAttribute('aria-label', _.t('location.copy')); btn.onclick = function onclick() { copy2clip(inputElem.id); }; diff --git a/lib/infobox/main.js b/lib/infobox/main.js index e436efd..c2076e4 100644 --- a/lib/infobox/main.js +++ b/lib/infobox/main.js @@ -1,9 +1,11 @@ -define(['infobox/link', 'infobox/node', 'infobox/location'], function (link, node, location) { +define(['infobox/link', 'infobox/node', 'infobox/location'], function (Link, Node, location) { 'use strict'; - return function (config, sidebar, router) { + return function (sidebar, linkScale) { var self = this; var el; + var node; + var link; function destroy() { if (el && el.parentNode) { @@ -28,6 +30,7 @@ define(['infobox/link', 'infobox/node', 'infobox/location'], function (link, nod var closeButton = document.createElement('button'); closeButton.classList.add('close'); closeButton.classList.add('ion-close'); + closeButton.setAttribute('aria-label', _.t('close')); closeButton.onclick = function () { router.fullUrl(); }; @@ -36,19 +39,30 @@ define(['infobox/link', 'infobox/node', 'infobox/location'], function (link, nod self.resetView = destroy; - self.gotoNode = function gotoNode(d, gateways) { + self.gotoNode = function gotoNode(d, nodeDict) { create(); - node(config, el, router, d, gateways); + node = new Node(el, d, linkScale, nodeDict); + node.render(); }; self.gotoLink = function gotoLink(d) { create(); - link(config, el, router, d); + link = new Link(el, d, linkScale); + link.render(); }; self.gotoLocation = function gotoLocation(d) { create(); - location(config, el, router, d); + location(el, d); + }; + + self.setData = function setData(d) { + if (typeof node === 'object') { + node.setData(d); + } + if (typeof link === 'object') { + link.setData(d); + } }; return self; diff --git a/lib/infobox/node.js b/lib/infobox/node.js index 871d149..2f0dcce 100644 --- a/lib/infobox/node.js +++ b/lib/infobox/node.js @@ -1,297 +1,182 @@ -define(['sorttable', 'snabbdom', 'd3-interpolate', 'moment', 'helper'], - function (SortTable, V, d3Interpolate, moment, helper) { +define(['sorttable', 'snabbdom', 'd3-interpolate', 'moment', 'helper', 'utils/node'], + function (SortTable, V, d3Interpolate, moment, helper, nodef) { 'use strict'; V = V.default; - function showGeoURI(d) { - if (!helper.hasLocation(d)) { - return undefined; - } - - return function (el) { - var a = document.createElement('a'); - a.textContent = Number(d.nodeinfo.location.latitude.toFixed(6)) + ', ' + Number(d.nodeinfo.location.longitude.toFixed(6)); - a.href = 'geo:' + d.nodeinfo.location.latitude + ',' + d.nodeinfo.location.longitude; - el.appendChild(a); - }; - } - - function showStatus(d) { - return function (el) { - el.classList.add(d.flags.unseen ? 'unseen' : (d.flags.online ? 'online' : 'offline')); - el.textContent = _.t((d.flags.online ? 'node.lastOnline' : 'node.lastOffline'), { - time: d.lastseen.fromNow(), - date: d.lastseen.format('DD.MM.YYYY, H:mm:ss') - }); - }; - } - - function showFirmware(d) { - var release = helper.dictGet(d.nodeinfo, ['software', 'firmware', 'release']); - var base = helper.dictGet(d.nodeinfo, ['software', 'firmware', 'base']); - - if (release === null || base === null) { - return undefined; - } - - return release + ' / ' + base; - } - - function showSite(d, config) { - var site = helper.dictGet(d.nodeinfo, ['system', 'site_code']); - var rt = site; - if (config.siteNames) { - config.siteNames.forEach(function (t) { - if (site === t.site) { - rt = t.name; - } - }); - } - return rt; - } - - function showUptime(d) { - if (!('uptime' in d.statistics)) { - return undefined; - } - - return moment.duration(d.statistics.uptime, 'seconds').humanize(); - } - - function showFirstseen(d) { - if (!('firstseen' in d)) { - return undefined; - } - - return d.firstseen.fromNow(true); - } - - function showClients(d) { - if (!d.flags.online) { - return undefined; - } - - return function (el) { - el.appendChild(document.createTextNode(d.statistics.clients > 0 ? d.statistics.clients : _.t('none'))); - el.appendChild(document.createElement('br')); - - var span = document.createElement('span'); - span.classList.add('clients'); - span.innerHTML = ''.repeat(d.statistics.clients); - el.appendChild(span); - }; - } - - function showIPs(d) { - var ips = helper.dictGet(d.nodeinfo, ['network', 'addresses']); - if (ips === null) { - return undefined; - } - - ips.sort(); - - return function (el) { - ips.forEach(function (ip, i) { - var link = !ip.startsWith('fe80:'); - - if (i > 0) { - el.appendChild(document.createElement('br')); - } - - if (link) { - var a = document.createElement('a'); - a.href = 'http://[' + ip + ']/'; - a.textContent = ip; - el.appendChild(a); - } else { - el.appendChild(document.createTextNode(ip)); - } - }); - }; - } - - function showBar(v, width, warning) { - var span = document.createElement('span'); - span.classList.add('bar'); - - var bar = document.createElement('span'); - bar.style.width = (width * 100) + '%'; - if (warning) { - span.classList.add('warning'); - } - span.appendChild(bar); - - var label = document.createElement('label'); - label.textContent = v; - span.appendChild(label); - - return span; - } - - function showLoad(d) { - if (!('loadavg' in d.statistics)) { - return undefined; - } - - return function (el) { - var value = d.statistics.loadavg.toFixed(2); - var width = d.statistics.loadavg % 1; - var warning = false; - if (d.statistics.loadavg >= d.nodeinfo.hardware.nproc) { - warning = true; - } - el.appendChild(showBar(value, width, warning)); - }; - } - - function showRAM(d) { - if (!('memory_usage' in d.statistics)) { - return undefined; - } - - return function (el) { - var value = Math.round(d.statistics.memory_usage * 100) + ' %'; - var width = d.statistics.memory_usage; - var warning = false; - if (d.statistics.memory_usage >= 0.8) { - warning = true; - } - el.appendChild(showBar(value, width, warning)); - }; - } - - function showAutoupdate(d) { - var au = helper.dictGet(d.nodeinfo, ['software', 'autoupdater']); - if (!au) { - return undefined; - } - - return au.enabled ? _.t('node.activated', { branch: au.branch }) : _.t('node.deactivated'); - } - function showStatImg(o, d) { - var subst = {}; - subst['{NODE_ID}'] = d.nodeinfo.node_id; - subst['{NODE_NAME}'] = d.nodeinfo.hostname.replace(/[^a-z0-9\-]/ig, '_'); - subst['{TIME}'] = d.lastseen.format('DDMMYYYYHmmss'); - subst['{LOCALE}'] = _.locale(); - return helper.showStat(o, subst); + var subst = { + '{NODE_ID}': d.node_id, + '{NODE_NAME}': d.hostname.replace(/[^a-z0-9\-]/ig, '_'), + '{TIME}': d.lastseen.format('DDMMYYYYHmmss'), + '{LOCALE}': _.locale() + }; + return helper.showStat(V, o, subst); } - return function (config, el, router, d, gateways) { - var linkScale = d3Interpolate.interpolate('#F02311', '#04C714'); - - function renderNeighbourRow(n) { - var icons = []; - icons.push(V.h('span', { props: { className: n.incoming ? 'ion-arrow-left-c' : 'ion-arrow-right-c' } })); - if (helper.hasLocation(n.node)) { - icons.push(V.h('span', { props: { className: 'ion-location' } })); - } - - var name = V.h('a', { + return function (el, d, linkScale, nodeDict) { + function nodeLink(node) { + return V.h('a', { props: { - className: 'online', - href: router.generateLink({ node: n.node.nodeinfo.node_id }) + className: node.is_online ? 'online' : 'offline', + href: router.generateLink({ node: node.node_id }) }, on: { click: function (e) { - router.fullUrl({ node: n.node.nodeinfo.node_id }, e); + router.fullUrl({ node: node.node_id }, e); } } - }, n.node.nodeinfo.hostname); - - var td1 = V.h('td', icons); - var td2 = V.h('td', name); - var td3 = V.h('td', (n.node.statistics.clients ? n.node.statistics.clients.toString() : '0')); - var td4 = V.h('td', { style: { color: linkScale(1 / n.link.tq) } }, helper.showTq(n.link)); - var td5 = V.h('td', helper.showDistance(n.link)); - - return V.h('tr', [td1, td2, td3, td4, td5]); + }, node.hostname); } - var h2 = document.createElement('h2'); - h2.textContent = d.nodeinfo.hostname; - el.appendChild(h2); - - var attributes = document.createElement('table'); - attributes.classList.add('attributes'); - - helper.attributeEntry(attributes, 'node.status', showStatus(d)); - helper.attributeEntry(attributes, 'node.gateway', d.flags.gateway ? 'ja' : null); - helper.attributeEntry(attributes, 'node.coordinates', showGeoURI(d)); - - if (config.nodeInfobox && config.nodeInfobox.contact) { - helper.attributeEntry(attributes, 'node.contact', helper.dictGet(d.nodeinfo, ['owner', 'contact'])); + function nodeIdLink(nodeId) { + if (nodeDict[nodeId]) { + return nodeLink(nodeDict[nodeId]); + } + return nodeId; } - helper.attributeEntry(attributes, 'node.hardware', helper.dictGet(d.nodeinfo, ['hardware', 'model'])); - helper.attributeEntry(attributes, 'node.primaryMac', helper.dictGet(d.nodeinfo, ['network', 'mac'])); - helper.attributeEntry(attributes, 'node.id', helper.dictGet(d.nodeinfo, ['node_id'])); - helper.attributeEntry(attributes, 'node.firmware', showFirmware(d)); - helper.attributeEntry(attributes, 'node.site', showSite(d, config)); - helper.attributeEntry(attributes, 'node.uptime', showUptime(d)); - helper.attributeEntry(attributes, 'node.firstSeen', showFirstseen(d)); - if (config.nodeInfobox && config.nodeInfobox.hardwareUsage) { - helper.attributeEntry(attributes, 'node.systemLoad', showLoad(d)); - helper.attributeEntry(attributes, 'node.ram', showRAM(d)); - } - helper.attributeEntry(attributes, 'node.ipAddresses', showIPs(d)); - helper.attributeEntry(attributes, 'node.selectedGateway', gateways[helper.dictGet(d.statistics, ['gateway'])]); - helper.attributeEntry(attributes, 'node.update', showAutoupdate(d)); - helper.attributeEntry(attributes, 'node.clients', showClients(d)); + function showGateway(node) { + var gatewayCols = [ + V.h('span', [ + nodeIdLink(node.gateway_nexthop), + V.h('br'), + _.t('node.nexthop') + ]), + V.h('span', { props: { className: 'ion-arrow-right-c' } }), + V.h('span', [ + nodeIdLink(node.gateway), + V.h('br'), + 'IPv4' + ]) + ]; - el.appendChild(attributes); + if (node.gateway6 !== undefined) { + gatewayCols.push(V.h('span', [ + nodeIdLink(node.gateway6), + V.h('br'), + 'IPv6' + ])); + } - if (d.neighbours.length > 0) { - var h3 = document.createElement('h3'); - h3.textContent = _.t('node.link', d.neighbours.length) + '(' + d.neighbours.length + ')'; - el.appendChild(h3); - - var headings = [{ - name: '' - }, { - name: 'node.nodes', - sort: function (a, b) { - return a.node.nodeinfo.hostname.localeCompare(b.node.nodeinfo.hostname); - }, - reverse: false - }, { - name: 'node.clients', - class: 'ion-people', - sort: function (a, b) { - return ('clients' in a.node.statistics ? a.node.statistics.clients : -1) - - ('clients' in b.node.statistics ? b.node.statistics.clients : -1); - }, - reverse: true - }, { - name: 'node.tq', - class: 'ion-connection-bars', - sort: function (a, b) { - return a.link.tq - b.link.tq; - }, - reverse: true - }, { - name: 'node.distance', - class: 'ion-arrow-resize', - sort: function (a, b) { - return (a.link.distance === undefined ? -1 : a.link.distance) - - (b.link.distance === undefined ? -1 : b.link.distance); - }, - reverse: true - }]; - - var table = new SortTable(headings, 1, renderNeighbourRow); - table.setData(d.neighbours); - table.el.elm.classList.add('node-links'); - el.appendChild(table.el.elm); + return V.h('td', { props: { className: 'gateway' } }, gatewayCols); } - if (config.nodeInfos) { - config.nodeInfos.forEach(function (nodeInfo) { - var h4 = document.createElement('h4'); - h4.textContent = nodeInfo.name; - el.appendChild(h4); - el.appendChild(showStatImg(nodeInfo, d)); + function renderNeighbourRow(n) { + var icons = [V.h('span', { props: { className: 'icon ion-' + (n.link.type.indexOf('wifi') === 0 ? 'wifi' : 'share-alt'), title: _.t(n.link.type) } })]; + if (helper.hasLocation(n.node)) { + icons.push(V.h('span', { props: { className: 'ion-location', title: _.t('location.location') } })); + } + + return V.h('tr', [ + V.h('td', icons), + V.h('td', nodeLink(n.node)), + V.h('td', n.node.clients), + V.h('td', { style: { color: linkScale((n.link.source_tq + n.link.target_tq) / 2) } }, helper.showTq(n.link.source_tq) + ' - ' + helper.showTq(n.link.target_tq)), + V.h('td', helper.showDistance(n.link)) + ]); + } + + var self = this; + var header = document.createElement('h2'); + var table = document.createElement('table'); + var images = document.createElement('div'); + var neighbours = document.createElement('h3'); + var headings = [{ + name: '', + sort: function (a, b) { + return a.link.type.localeCompare(b.link.type); + } + }, { + name: 'node.nodes', + sort: function (a, b) { + return a.node.hostname.localeCompare(b.node.hostname); + }, + reverse: false + }, { + name: 'node.clients', + class: 'ion-people', + sort: function (a, b) { + return a.node.clients - b.node.clients; + }, + reverse: true + }, { + name: 'node.tq', + class: 'ion-connection-bars', + sort: function (a, b) { + return a.link.source_tq - b.link.source_tq; + }, + reverse: true + }, { + name: 'node.distance', + class: 'ion-arrow-resize', + sort: function (a, b) { + return (a.link.distance === undefined ? -1 : a.link.distance) - + (b.link.distance === undefined ? -1 : b.link.distance); + }, + reverse: true + }]; + var tableNeighbour = new SortTable(headings, 1, renderNeighbourRow); + + el.appendChild(header); + el.appendChild(table); + el.appendChild(neighbours); + el.appendChild(tableNeighbour.el); + el.appendChild(images); + + self.render = function render() { + V.patch(header, V.h('h2', d.hostname)); + + var children = []; + + config.nodeAttr.forEach(function (row) { + var field = d[row.value]; + if (typeof row.value === 'function') { + field = row.value(d, nodeDict); + } else if (nodef['show' + row.value] !== undefined) { + field = nodef['show' + row.value](d); + } + + if (field) { + if (typeof field !== 'object') { + field = V.h('td', field); + } + children.push(V.h('tr', [ + row.name !== undefined ? V.h('th', _.t(row.name)) : null, + field + ])); + } }); - } + + children.push(V.h('tr', [ + V.h('th', _.t('node.gateway')), + showGateway(d) + ])); + + var elNew = V.h('table', children); + table = V.patch(table, elNew); + table.elm.classList.add('attributes'); + + V.patch(neighbours, V.h('h3', _.t('node.link', d.neighbours.length) + ' (' + d.neighbours.length + ')')); + if (d.neighbours.length > 0) { + tableNeighbour.setData(d.neighbours); + tableNeighbour.el.elm.classList.add('node-links'); + } + + if (config.nodeInfos) { + var img = []; + config.nodeInfos.forEach(function (nodeInfo) { + img.push(V.h('h4', nodeInfo.name)); + img.push(showStatImg(nodeInfo, d)); + }); + images = V.patch(images, V.h('div', img)); + } + }; + + self.setData = function setData(data) { + if (data.nodeDict[d.node_id]) { + d = data.nodeDict[d.node_id]; + } + self.render(); + }; + return self; }; }); diff --git a/lib/legend.js b/lib/legend.js index fca8a4f..71c1011 100644 --- a/lib/legend.js +++ b/lib/legend.js @@ -1,46 +1,42 @@ define(['helper'], function (helper) { 'use strict'; - return function (config, language) { + return function (language) { var self = this; var stats = document.createTextNode(''); var timestamp = document.createTextNode(''); self.setData = function setData(d) { - var totalNodes = helper.sum(d.nodes.all.map(helper.one)); - var totalOnlineNodes = helper.sum(d.nodes.all.filter(helper.online).map(helper.one)); - var totalClients = helper.sum(d.nodes.all.filter(helper.online).map(function (n) { - return n.statistics.clients ? n.statistics.clients : 0; + var totalNodes = Object.keys(d.nodeDict).length; + var totalOnlineNodes = d.nodes.online.length; + var totalClients = helper.sum(d.nodes.online.map(function (n) { + return n.clients; })); - var totalGateways = helper.sum(d.nodes.all.filter(helper.online).filter(function (n) { - return n.flags.gateway; + var totalGateways = helper.sum(d.nodes.online.filter(function (n) { + return n.is_gateway; }).map(helper.one)); stats.textContent = _.t('sidebar.nodes', { total: totalNodes, online: totalOnlineNodes }) + ' ' + _.t('sidebar.clients', { smart_count: totalClients }) + ' ' + _.t('sidebar.gateway', { smart_count: totalGateways }); - timestamp.textContent = _.t('sidebar.lastUpdate') + ': ' + d.timestamp.format('DD.MM.Y HH:mm'); + timestamp.textContent = _.t('sidebar.lastUpdate') + ' ' + d.timestamp.fromNow(); }; self.render = function render(el) { - var h2 = document.createElement('h2'); - h2.textContent = config.siteName; - el.appendChild(h2); + var h1 = document.createElement('h1'); + h1.textContent = config.siteName; + el.appendChild(h1); language.languageSelect(el); var p = document.createElement('p'); p.classList.add('legend'); - p.innerHTML = ' ' + _.t('sidebar.nodeNew') + '' + - ' ' + _.t('sidebar.nodeOnline') + '' + - ' ' + _.t('sidebar.nodeOffline') + ''; - el.appendChild(p); - p.appendChild(document.createElement('br')); p.appendChild(stats); p.appendChild(document.createElement('br')); p.appendChild(timestamp); + el.appendChild(p); }; return self; diff --git a/lib/linklist.js b/lib/linklist.js index bb8eb75..cc5b190 100644 --- a/lib/linklist.js +++ b/lib/linklist.js @@ -1,11 +1,17 @@ define(['sorttable', 'snabbdom', 'helper'], function (SortTable, V, helper) { 'use strict'; + V = V.default; function linkName(d) { - return (d.source.node ? d.source.node.nodeinfo.hostname : d.source.id) + ' – ' + d.target.node.nodeinfo.hostname; + return (d.source ? d.source.hostname : d.source.id) + ' – ' + d.target.hostname; } var headings = [{ + name: '', + sort: function (a, b) { + return a.type.localeCompare(b.type); + } + }, { name: 'node.nodes', sort: function (a, b) { return linkName(a).localeCompare(linkName(b)); @@ -15,7 +21,7 @@ define(['sorttable', 'snabbdom', 'helper'], function (SortTable, V, helper) { name: 'node.tq', class: 'ion-connection-bars', sort: function (a, b) { - return a.tq - b.tq; + return (a.source_tq + a.target_tq) / 2 - (b.source_tq + b.target_tq) / 2; }, reverse: true }, { @@ -28,9 +34,8 @@ define(['sorttable', 'snabbdom', 'helper'], function (SortTable, V, helper) { reverse: true }]; - return function (linkScale, router) { - var table = new SortTable(headings, 2, renderRow); - V = V.default; + return function (linkScale) { + var table = new SortTable(headings, 3, renderRow); function renderRow(d) { var td1Content = [V.h('a', { @@ -43,11 +48,12 @@ define(['sorttable', 'snabbdom', 'helper'], function (SortTable, V, helper) { } }, linkName(d))]; - var td1 = V.h('td', td1Content); - var td2 = V.h('td', { style: { color: linkScale(1 / d.tq) } }, helper.showTq(d)); - var td3 = V.h('td', helper.showDistance(d)); - - return V.h('tr', [td1, td2, td3]); + return V.h('tr', [ + V.h('td', V.h('span', { props: { className: 'icon ion-' + (d.type.indexOf('wifi') === 0 ? 'wifi' : 'share-alt'), title: _.t(d.type) } })), + V.h('td', td1Content), + V.h('td', { style: { color: linkScale((d.source_tq + d.target_tq) / 2) } }, helper.showTq(d.source_tq) + ' - ' + helper.showTq(d.target_tq)), + V.h('td', helper.showDistance(d)) + ]); } this.render = function render(d) { @@ -59,7 +65,7 @@ define(['sorttable', 'snabbdom', 'helper'], function (SortTable, V, helper) { }; this.setData = function setData(d) { - table.setData(d.graph.links); + table.setData(d.links); }; }; }); diff --git a/lib/main.js b/lib/main.js index 887dfbc..b0b0fc8 100644 --- a/lib/main.js +++ b/lib/main.js @@ -2,46 +2,19 @@ define(['moment', 'utils/router', 'leaflet', 'gui', 'helper', 'utils/language'], function (moment, Router, L, GUI, helper, Language) { 'use strict'; - return function (config) { + return function () { function handleData(data) { - var dataNodes = {}; - dataNodes.nodes = []; - var dataGraph = {}; - dataGraph.batadv = {}; - dataGraph.batadv.nodes = []; - dataGraph.batadv.links = []; - var gateways = {}; - - function rearrangeLinks(d) { - d.source += dataGraph.batadv.nodes.length; - d.target += dataGraph.batadv.nodes.length; - } + var timestamp; + var nodes = []; + var links = []; + var nodeDict = {}; for (var i = 0; i < data.length; ++i) { - var vererr; - if (i % 2) { - if (data[i].version !== 1) { - vererr = 'Unsupported graph version: ' + data[i].version; - console.error(vererr); // silent fail - } else { - data[i].batadv.links.forEach(rearrangeLinks); - dataGraph.batadv.nodes = dataGraph.batadv.nodes.concat(data[i].batadv.nodes); - dataGraph.batadv.links = dataGraph.batadv.links.concat(data[i].batadv.links); - dataGraph.timestamp = data[i].timestamp; - } - } else if (data[i].version !== 2) { - vererr = 'Unsupported nodes version: ' + data[i].version; - console.error(vererr); // silent fail - } else { - dataNodes.nodes = dataNodes.nodes.concat(data[i].nodes); - dataNodes.timestamp = data[i].timestamp; - } + nodes = nodes.concat(data[i].nodes); + timestamp = data[i].timestamp; + links = links.concat(data[i].links); } - var nodes = dataNodes.nodes.filter(function (d) { - return 'firstseen' in d && 'lastseen' in d; - }); - nodes.forEach(function (node) { node.firstseen = moment.utc(node.firstseen).local(); node.lastseen = moment.utc(node.lastseen).local(); @@ -50,64 +23,33 @@ define(['moment', 'utils/router', 'leaflet', 'gui', 'helper', 'utils/language'], var now = moment(); var age = moment(now).subtract(config.maxAge, 'days'); - var newnodes = helper.limit('firstseen', age, helper.sortByKey('firstseen', nodes).filter(helper.online)); - var lostnodes = helper.limit('lastseen', age, helper.sortByKey('lastseen', nodes).filter(helper.offline)); - - var graphnodes = {}; - - dataNodes.nodes.forEach(function (d) { - graphnodes[d.nodeinfo.node_id] = d; + var online = nodes.filter(function (d) { + return d.is_online; + }); + var offline = nodes.filter(function (d) { + return !d.is_online; }); - var graph = dataGraph.batadv; - - graph.nodes.forEach(function (d) { - if (d.node_id in graphnodes) { - d.node = graphnodes[d.node_id]; - if (d.unseen) { - d.node.flags.online = true; - d.node.flags.unseen = true; - } - } - }); - - graph.links.forEach(function (d) { - d.source = graph.nodes[d.source]; - - if (graph.nodes[d.target].node) { - d.target = graph.nodes[d.target]; - } else { - d.target = undefined; - } - }); - - var links = graph.links.filter(function (d) { - return d.target !== undefined; - }); + var newnodes = helper.limit('firstseen', age, helper.sortByKey('firstseen', online)); + var lostnodes = helper.limit('lastseen', age, helper.sortByKey('lastseen', offline)); nodes.forEach(function (d) { d.neighbours = []; - if (d.flags.gateway && d.nodeinfo.network.mesh) { - var mesh = d.nodeinfo.network.mesh; - mesh[Object.keys(mesh)[0]].interfaces.tunnel.forEach(function (mac) { - gateways[mac] = d.nodeinfo.hostname; - }); - } + nodeDict[d.node_id] = d; }); links.forEach(function (d) { - var ids; + d.source = nodeDict[d.source]; + d.target = nodeDict[d.target]; - ids = [d.source.node.nodeinfo.node_id, d.target.node.nodeinfo.node_id]; - d.source.node.neighbours.push({ node: d.target.node, link: d, incoming: false }); - d.target.node.neighbours.push({ node: d.source.node, link: d, incoming: true }); - - d.id = ids.join('-'); + d.id = [d.source.node_id, d.target.node_id].join('-'); + d.source.neighbours.push({ node: d.target, link: d }); + d.target.neighbours.push({ node: d.source, link: d }); try { d.latlngs = []; - d.latlngs.push(L.latLng(d.source.node.nodeinfo.location.latitude, d.source.node.nodeinfo.location.longitude)); - d.latlngs.push(L.latLng(d.target.node.nodeinfo.location.latitude, d.target.node.nodeinfo.location.longitude)); + d.latlngs.push(L.latLng(d.source.location.latitude, d.source.location.longitude)); + d.latlngs.push(L.latLng(d.target.location.latitude, d.target.location.longitude)); d.distance = d.latlngs[0].distanceTo(d.latlngs[1]); } catch (e) { @@ -115,51 +57,53 @@ define(['moment', 'utils/router', 'leaflet', 'gui', 'helper', 'utils/language'], } }); - links.sort(function (a, b) { - return b.tq - a.tq; - }); - return { now: now, - timestamp: moment.utc(dataNodes.timestamp).local(), + timestamp: moment.utc(timestamp).local(), nodes: { all: nodes, + online: online, + offline: offline, new: newnodes, lost: lostnodes }, - graph: { - links: links, - nodes: graph.nodes - }, - gateways: gateways + links: links, + nodeDict: nodeDict }; } - var language = new Language(config); - var router = new Router(language); + var language = new Language(); + window.router = new Router(language); - var urls = []; + config.dataPath.forEach(function (d, i) { + config.dataPath[i] += 'meshviewer.json'; + }); - if (typeof config.dataPath === 'string' || config.dataPath instanceof String) { - config.dataPath = [config.dataPath]; - } - - for (var i in config.dataPath) { - if (config.dataPath.hasOwnProperty(i)) { - urls.push(config.dataPath[i] + 'nodes.json'); - urls.push(config.dataPath[i] + 'graph.json'); - } - } + language.init(router); function update() { - language.init(router); - return Promise.all(urls.map(helper.getJSON)) + return Promise.all(config.dataPath.map(helper.getJSON)) .then(handleData); } update() .then(function (d) { - var gui = new GUI(config, router, language); + return new Promise(function (resolve, reject) { + var count = 0; + (function waitForLanguage() { + if (Object.keys(_.phrases).length > 0) { + resolve(d); + } else if (count > 500) { + reject(new Error('translation not loaded after 10 seconds')); + } else { + setTimeout(waitForLanguage.bind(this), 20); + } + count++; + })(); + }); + }) + .then(function (d) { + var gui = new GUI(language); gui.setData(d); router.setData(d); router.resolve(); @@ -173,7 +117,7 @@ define(['moment', 'utils/router', 'leaflet', 'gui', 'helper', 'utils/language'], }) .catch(function (e) { document.querySelector('.loader').innerHTML += e.message - + '


or report to your community'; + + '


or report to your community'; console.warn(e); }); }; diff --git a/lib/map.js b/lib/map.js index d82c4fd..6d43efc 100644 --- a/lib/map.js +++ b/lib/map.js @@ -1,4 +1,4 @@ -define(['map/clientlayer', 'map/labellayer', 'map/button', 'leaflet'], +define(['map/clientlayer', 'map/labellayer', 'map/button', 'leaflet', 'map/activearea'], function (ClientLayer, LabelLayer, Button, L) { 'use strict'; @@ -8,7 +8,7 @@ define(['map/clientlayer', 'map/labellayer', 'map/button', 'leaflet'], minZoom: 0 }; - return function (config, linkScale, sidebar, router, buttons) { + return function (linkScale, sidebar, buttons) { var self = this; var savedView; @@ -27,10 +27,30 @@ define(['map/clientlayer', 'map/labellayer', 'map/button', 'leaflet'], document.querySelector('.leaflet-control-layers').classList.add('leaflet-control-layers-expanded'); } + function setActiveArea() { + setTimeout(function () { + map.setActiveArea({ + position: 'absolute', + left: sidebar.getWidth() + 'px', + right: 0, + top: 0, + bottom: 0 + }); + }, 300); + } + var el = document.createElement('div'); el.classList.add('map'); map = L.map(el, options); + map.setActiveArea({ + position: 'absolute', + left: sidebar.getWidth() + 'px', + right: 0, + top: 0, + bottom: 0 + }); + var now = new Date(); config.mapLayers.forEach(function (item, i) { if ((typeof item.config.start === 'number' && item.config.start <= now.getHours()) || (typeof item.config.end === 'number' && item.config.end > now.getHours())) { @@ -47,7 +67,7 @@ define(['map/clientlayer', 'map/labellayer', 'map/button', 'leaflet'], var layers = config.mapLayers.map(function (d) { return { 'name': d.name, - 'layer': 'url' in d ? L.tileLayer(d.url.replace('{retina}', L.Browser.retina ? '@2x' : ''), d.config) : console.warn('Missing map url') + 'layer': L.tileLayer(d.url.replace('{retina}', L.Browser.retina ? '@2x' : ''), d.config) }; }); @@ -57,7 +77,7 @@ define(['map/clientlayer', 'map/labellayer', 'map/button', 'leaflet'], baseLayers[d.name] = d.layer; }); - var button = new Button(config, map, router, buttons); + var button = new Button(map, buttons); map.on('locationfound', button.locationFound); map.on('locationerror', button.locationError); @@ -79,6 +99,8 @@ define(['map/clientlayer', 'map/labellayer', 'map/button', 'leaflet'], labelLayer.addTo(map); labelLayer.setZIndex(6); + sidebar.button.addEventListener('visibility', setActiveArea); + map.on('zoom', function () { clientLayer.redraw(); labelLayer.redraw(); @@ -105,6 +127,14 @@ define(['map/clientlayer', 'map/labellayer', 'map/button', 'leaflet'], } }); + map.on('load', function () { + var inputs = document.querySelectorAll('.leaflet-control-layers-selector'); + [].forEach.call(inputs, function (input) { + input.setAttribute('role', 'radiogroup'); + input.setAttribute('aria-label', input.nextSibling.innerHTML.trim()); + }); + }); + var nodeDict = {}; var linkDict = {}; var highlight; @@ -120,7 +150,7 @@ define(['map/clientlayer', 'map/labellayer', 'map/button', 'leaflet'], } function setView(bounds, zoom) { - map.fitBounds(bounds, { paddingTopLeft: [sidebar(), 0], maxZoom: (zoom ? zoom : config.nodeZoom) }); + map.fitBounds(bounds, { maxZoom: (zoom ? zoom : config.nodeZoom) }); } function goto(m) { @@ -142,12 +172,12 @@ define(['map/clientlayer', 'map/labellayer', 'map/button', 'leaflet'], var m; if (highlight !== undefined) { - if (highlight.type === 'node' && nodeDict[highlight.o.nodeinfo.node_id]) { - m = nodeDict[highlight.o.nodeinfo.node_id]; - m.setStyle({ color: 'orange', weight: 20, fillOpacity: 1, opacity: 0.7, className: 'stroke-first' }); + if (highlight.type === 'node' && nodeDict[highlight.o.node_id]) { + m = nodeDict[highlight.o.node_id]; + m.setStyle(config.map.highlightNode); } else if (highlight.type === 'link' && linkDict[highlight.o.id]) { m = linkDict[highlight.o.id]; - m.setStyle({ weight: 4, opacity: 1, dashArray: '5, 10' }); + m.setStyle(config.map.highlightLink); } } @@ -167,7 +197,7 @@ define(['map/clientlayer', 'map/labellayer', 'map/button', 'leaflet'], linkDict = {}; clientLayer.setData(data); - labelLayer.setData(data, map, nodeDict, linkDict, linkScale, router, config); + labelLayer.setData(data, map, nodeDict, linkDict, linkScale); updateView(true); }; @@ -186,7 +216,7 @@ define(['map/clientlayer', 'map/labellayer', 'map/button', 'leaflet'], self.gotoLink = function gotoLink(d) { button.disableTracking(); - highlight = { type: 'link', o: d }; + highlight = { type: 'link', o: d[0] }; updateView(); }; @@ -197,6 +227,7 @@ define(['map/clientlayer', 'map/labellayer', 'map/button', 'leaflet'], self.destroy = function destroy() { button.clearButtons(); + sidebar.button.removeEventListener('visibility', setActiveArea); map.remove(); if (el.parentNode) { diff --git a/lib/map/activearea.js b/lib/map/activearea.js new file mode 100644 index 0000000..736a0ef --- /dev/null +++ b/lib/map/activearea.js @@ -0,0 +1,291 @@ +define(function () { + /** + * https://github.com/Mappy/Leaflet-active-area + * Apache 2.0 license https://www.apache.org/licenses/LICENSE-2.0 + */ + + var previousMethods = { + getCenter: L.Map.prototype.getCenter, + setView: L.Map.prototype.setView, + setZoomAround: L.Map.prototype.setZoomAround, + getBoundsZoom: L.Map.prototype.getBoundsZoom, + RendererUpdate: L.Renderer.prototype._update + }; + + L.Map.include({ + getBounds: function () { + if (this._viewport) { + return this.getViewportLatLngBounds(); + } + var bounds = this.getPixelBounds(); + var sw = this.unproject(bounds.getBottomLeft()); + var ne = this.unproject(bounds.getTopRight()); + + return new L.LatLngBounds(sw, ne); + }, + + getViewport: function () { + return this._viewport; + }, + + getViewportBounds: function () { + var vp = this._viewport; + var topleft = L.point(vp.offsetLeft, vp.offsetTop); + var vpsize = L.point(vp.clientWidth, vp.clientHeight); + + if (vpsize.x === 0 || vpsize.y === 0) { + // Our own viewport has no good size - so we fallback to the container size: + vp = this.getContainer(); + if (vp) { + topleft = L.point(0, 0); + vpsize = L.point(vp.clientWidth, vp.clientHeight); + } + } + + return L.bounds(topleft, topleft.add(vpsize)); + }, + + getViewportLatLngBounds: function () { + var bounds = this.getViewportBounds(); + return L.latLngBounds(this.containerPointToLatLng(bounds.min), this.containerPointToLatLng(bounds.max)); + }, + + getOffset: function () { + var mCenter = this.getSize().divideBy(2); + var vCenter = this.getViewportBounds().getCenter(); + + return mCenter.subtract(vCenter); + }, + + getCenter: function (withoutViewport) { + var center = previousMethods.getCenter.call(this); + + if (this.getViewport() && !withoutViewport) { + var zoom = this.getZoom(); + var point = this.project(center, zoom); + point = point.subtract(this.getOffset()); + + center = this.unproject(point, zoom); + } + + return center; + }, + + setView: function (center, zoom, options) { + center = L.latLng(center); + zoom = zoom === undefined ? this._zoom : this._limitZoom(zoom); + + if (this.getViewport()) { + var point = this.project(center, this._limitZoom(zoom)); + point = point.add(this.getOffset()); + center = this.unproject(point, this._limitZoom(zoom)); + } + + return previousMethods.setView.call(this, center, zoom, options); + }, + + setZoomAround: function (latlng, zoom, options) { + var vp = this.getViewport(); + + if (vp) { + var scale = this.getZoomScale(zoom); + var viewHalf = this.getViewportBounds().getCenter(); + var containerPoint = latlng instanceof L.Point ? latlng : this.latLngToContainerPoint(latlng); + + var centerOffset = containerPoint.subtract(viewHalf).multiplyBy(1 - 1 / scale); + var newCenter = this.containerPointToLatLng(viewHalf.add(centerOffset)); + + return this.setView(newCenter, zoom, { zoom: options }); + } + return previousMethods.setZoomAround.call(this, latlng, zoom, options); + }, + + getBoundsZoom: function (bounds, inside, padding) { // (LatLngBounds[, Boolean, Point]) -> Number + bounds = L.latLngBounds(bounds); + padding = L.point(padding || [0, 0]); + + var zoom = this.getZoom() || 0; + var min = this.getMinZoom(); + var max = this.getMaxZoom(); + var nw = bounds.getNorthWest(); + var se = bounds.getSouthEast(); + var vp = this.getViewport(); + var size = (vp ? L.point(vp.clientWidth, vp.clientHeight) : this.getSize()).subtract(padding); + var boundsSize = this.project(se, zoom).subtract(this.project(nw, zoom)); + var snap = L.Browser.any3d ? this.options.zoomSnap : 1; + + var scale = Math.min(size.x / boundsSize.x, size.y / boundsSize.y); + + zoom = this.getScaleZoom(scale, zoom); + + if (snap) { + zoom = Math.round(zoom / (snap / 100)) * (snap / 100); // don't jump if within 1% of a snap level + zoom = inside ? Math.ceil(zoom / snap) * snap : Math.floor(zoom / snap) * snap; + } + + return Math.max(min, Math.min(max, zoom)); + } + }); + + L.Map.include({ + setActiveArea: function (css, keepCenter, animate) { + var center; + if (keepCenter && this._zoom) { + // save center if map is already initialized + // and keepCenter is passed + center = this.getCenter(); + } + + if (!this._viewport) { + // Make viewport if not already made + var container = this.getContainer(); + this._viewport = L.DomUtil.create('div', ''); + container.insertBefore(this._viewport, container.firstChild); + } + + if (typeof css === 'string') { + this._viewport.className = css; + } else { + L.extend(this._viewport.style, css); + } + + if (center) { + this.setView(center, this.getZoom(), { animate: !!animate }); + } + return this; + } + }); + + L.Renderer.include({ + _onZoom: function () { + this._updateTransform(this._map.getCenter(true), this._map.getZoom()); + }, + + _update: function () { + previousMethods.RendererUpdate.call(this); + this._center = this._map.getCenter(true); + } + }); + + L.GridLayer.include({ + _updateLevels: function () { + var zoom = this._tileZoom; + var maxZoom = this.options.maxZoom; + + if (zoom === undefined) { + return undefined; + } + + for (var z in this._levels) { + if (this._levels[z].el.children.length || z === zoom) { + this._levels[z].el.style.zIndex = maxZoom - Math.abs(zoom - z); + } else { + L.DomUtil.remove(this._levels[z].el); + this._removeTilesAtZoom(z); + delete this._levels[z]; + } + } + + var level = this._levels[zoom]; + var map = this._map; + + if (!level) { + level = this._levels[zoom] = {}; + + level.el = L.DomUtil.create('div', 'leaflet-tile-container leaflet-zoom-animated', this._container); + level.el.style.zIndex = maxZoom; + + level.origin = map.project(map.unproject(map.getPixelOrigin()), zoom).round(); + level.zoom = zoom; + + this._setZoomTransform(level, map.getCenter(true), map.getZoom()); + + // force the browser to consider the newly added element for transition + L.Util.falseFn(level.el.offsetWidth); + } + + this._level = level; + + return level; + }, + + _resetView: function (e) { + var animating = e && (e.pinch || e.flyTo); + this._setView(this._map.getCenter(true), this._map.getZoom(), animating, animating); + }, + + _update: function (center) { + var map = this._map; + if (!map) { + return; + } + var zoom = map.getZoom(); + + if (center === undefined) { + center = map.getCenter(this); + } + if (this._tileZoom === undefined) { + return; + } // if out of minzoom/maxzoom + + var pixelBounds = this._getTiledPixelBounds(center); + var tileRange = this._pxBoundsToTileRange(pixelBounds); + var tileCenter = tileRange.getCenter(); + var queue = []; + + for (var key in this._tiles) { + this._tiles[key].current = false; + } + + // _update just loads more tiles. If the tile zoom level differs too much + // from the map's, let _setView reset levels and prune old tiles. + if (Math.abs(zoom - this._tileZoom) > 1) { + this._setView(center, zoom); + return; + } + + // create a queue of coordinates to load tiles from + for (var j = tileRange.min.y; j <= tileRange.max.y; j++) { + for (var i = tileRange.min.x; i <= tileRange.max.x; i++) { + var coords = new L.Point(i, j); + coords.z = this._tileZoom; + + if (!this._isValidTile(coords)) { + continue; + } + + var tile = this._tiles[this._tileCoordsToKey(coords)]; + if (tile) { + tile.current = true; + } else { + queue.push(coords); + } + } + } + + // sort tile queue to load tiles in order of their distance to center + queue.sort(function (a, b) { + return a.distanceTo(tileCenter) - b.distanceTo(tileCenter); + }); + + if (queue.length !== 0) { + // if its the first batch of tiles to load + if (!this._loading) { + this._loading = true; + // @event loading: Event + // Fired when the grid layer starts loading tiles + this.fire('loading'); + } + + // create DOM fragment to append tiles in one batch + var fragment = document.createDocumentFragment(); + + for (i = 0; i < queue.length; i++) { + this._addTile(queue[i], fragment); + } + + this._level.el.appendChild(fragment); + } + } + }); +}); diff --git a/lib/map/button.js b/lib/map/button.js index 4352fa5..b0a2f33 100644 --- a/lib/map/button.js +++ b/lib/map/button.js @@ -1,5 +1,5 @@ -define(['map/clientlayer', 'map/labellayer', 'leaflet', 'moment', 'map/locationmarker'], - function (ClientLayer, LabelLayer, L, moment, LocationMarker) { +define(['map/clientlayer', 'map/labellayer', 'leaflet', 'map/locationmarker'], + function (ClientLayer, LabelLayer, L, LocationMarker) { 'use strict'; var self = {}; @@ -28,8 +28,8 @@ define(['map/clientlayer', 'map/labellayer', 'leaflet', 'moment', 'map/locationm var LocateButton = ButtonBase.extend({ onAdd: function () { - var button = L.DomUtil.create('button', 'ion-locate shadow'); - button.setAttribute('data-tooltip', _.t('button.tracking')); + var button = L.DomUtil.create('button', 'ion-locate'); + button.setAttribute('aria-label', _.t('button.tracking')); L.DomEvent.disableClickPropagation(button); L.DomEvent.addListener(button, 'click', this.onClick, this); @@ -45,8 +45,8 @@ define(['map/clientlayer', 'map/labellayer', 'leaflet', 'moment', 'map/locationm var CoordsPickerButton = ButtonBase.extend({ onAdd: function () { - var button = L.DomUtil.create('button', 'ion-pin shadow'); - button.setAttribute('data-tooltip', _.t('button.location')); + var button = L.DomUtil.create('button', 'ion-pin'); + button.setAttribute('aria-label', _.t('button.location')); // Click propagation isn't disabled as this causes problems with the // location picking mode; instead propagation is stopped in onClick(). @@ -63,7 +63,7 @@ define(['map/clientlayer', 'map/labellayer', 'leaflet', 'moment', 'map/locationm } }); - return function (config, map, router, buttons) { + return function (map, buttons) { var userLocation; var locateUserButton = new LocateButton(function (d) { diff --git a/lib/map/clientlayer.js b/lib/map/clientlayer.js index ac09e33..dad1f07 100644 --- a/lib/map/clientlayer.js +++ b/lib/map/clientlayer.js @@ -5,19 +5,19 @@ define(['leaflet', 'rbush', 'helper'], return L.GridLayer.extend({ mapRTree: function mapRTree(d) { return { - minX: d.nodeinfo.location.latitude, minY: d.nodeinfo.location.longitude, - maxX: d.nodeinfo.location.latitude, maxY: d.nodeinfo.location.longitude, + minX: d.location.latitude, minY: d.location.longitude, + maxX: d.location.latitude, maxY: d.location.longitude, node: d }; }, setData: function (data) { var rtreeOnlineAll = rbush(9); - this.data = rtreeOnlineAll.load(data.nodes.all.filter(helper.online).filter(helper.hasLocation).map(this.mapRTree)); + this.data = rtreeOnlineAll.load(data.nodes.online.filter(helper.hasLocation).map(this.mapRTree)); // pre-calculate start angles this.data.all().forEach(function (n) { - n.startAngle = (parseInt(n.node.nodeinfo.node_id.substr(10, 2), 16) / 255) * 2 * Math.PI; + n.startAngle = (parseInt(n.node.node_id.substr(10, 2), 16) / 255) * 2 * Math.PI; }); this.redraw(); }, @@ -45,21 +45,17 @@ define(['leaflet', 'rbush', 'helper'], return tile; } - var startDistance = 12; + var startDistance = 10; - ctx.beginPath(); nodes.forEach(function (d) { - var p = map.project([d.node.nodeinfo.location.latitude, d.node.nodeinfo.location.longitude]); + var p = map.project([d.node.location.latitude, d.node.location.longitude]); p.x -= s.x; p.y -= s.y; - helper.positionClients(ctx, p, d.startAngle, d.node.statistics.clients, startDistance); + helper.positionClients(ctx, p, d.startAngle, d.node, startDistance); }); - ctx.fillStyle = 'rgba(220, 0, 103, 0.7)'; - ctx.fill(); - return tile; } }); diff --git a/lib/map/labellayer.js b/lib/map/labellayer.js index 92b6550..a32ce9c 100644 --- a/lib/map/labellayer.js +++ b/lib/map/labellayer.js @@ -35,14 +35,14 @@ define(['leaflet', 'rbush', 'helper', 'moment'], return function (d) { var font = fontSize + 'px ' + bodyStyle.fontFamily; return { - position: L.latLng(d.nodeinfo.location.latitude, d.nodeinfo.location.longitude), - label: d.nodeinfo.hostname, + position: L.latLng(d.location.latitude, d.location.longitude), + label: d.hostname, offset: offset, fillStyle: fillStyle, height: fontSize * 1.2, font: font, stroke: stroke, - width: measureText(font, d.nodeinfo.hostname).width + width: measureText(font, d.hostname).width }; }; } @@ -76,33 +76,33 @@ define(['leaflet', 'rbush', 'helper', 'moment'], return { minX: x, minY: y, maxX: x + width, maxY: y + height }; } - function mkMarker(dict, iconFunc, router) { + function mkMarker(dict, iconFunc) { return function (d) { - var m = L.circleMarker([d.nodeinfo.location.latitude, d.nodeinfo.location.longitude], iconFunc(d)); + var m = L.circleMarker([d.location.latitude, d.location.longitude], iconFunc(d)); m.resetStyle = function resetStyle() { m.setStyle(iconFunc(d)); }; m.on('click', function () { - router.fullUrl({ node: d.nodeinfo.node_id }); + router.fullUrl({ node: d.node_id }); }); - m.bindTooltip(d.nodeinfo.hostname); + m.bindTooltip(d.hostname); - dict[d.nodeinfo.node_id] = m; + dict[d.node_id] = m; return m; }; } - function addLinksToMap(dict, linkScale, graph, router) { + function addLinksToMap(dict, linkScale, graph) { graph = graph.filter(function (d) { - return 'distance' in d && !d.vpn; + return 'distance' in d && d.type.indexOf('vpn') !== 0; }); return graph.map(function (d) { var opts = { - color: linkScale(1 / d.tq), + color: linkScale((d.source_tq + d.target_tq) / 2), weight: 4, opacity: 0.5, dashArray: 'none' @@ -114,7 +114,9 @@ define(['leaflet', 'rbush', 'helper', 'moment'], line.setStyle(opts); }; - line.bindTooltip(d.source.node.nodeinfo.hostname + ' – ' + d.target.node.nodeinfo.hostname + '
' + helper.showDistance(d) + ' / ' + helper.showTq(d) + ''); + line.bindTooltip(d.source.hostname + ' – ' + d.target.hostname + + '
' + helper.showDistance(d) + ' / ' + helper.showTq(d.source_tq) + ' - ' + helper.showTq(d.target_tq) + '
' + d.type + '
'); + line.on('click', function () { router.fullUrl({ link: d.id }); }); @@ -125,7 +127,7 @@ define(['leaflet', 'rbush', 'helper', 'moment'], }); } - function getIcon(config, color) { + function getIcon(color) { return Object.assign({}, config.icon.base, config.icon[color]); } @@ -136,12 +138,12 @@ define(['leaflet', 'rbush', 'helper', 'moment'], this.prepareLabels(); } }, - setData: function (data, map, nodeDict, linkDict, linkScale, router, config) { - var iconOnline = getIcon(config, 'online'); - var iconOffline = getIcon(config, 'offline'); - var iconLost = getIcon(config, 'lost'); - var iconAlert = getIcon(config, 'alert'); - var iconNew = getIcon(config, 'new'); + setData: function (data, map, nodeDict, linkDict, linkScale) { + var iconOnline = getIcon('online'); + var iconOffline = getIcon('offline'); + var iconLost = getIcon('lost'); + var iconAlert = getIcon('alert'); + var iconNew = getIcon('new'); // Check if init or data is already set if (groupLines) { groupOffline.clearLayers(); @@ -151,38 +153,36 @@ define(['leaflet', 'rbush', 'helper', 'moment'], groupLines.clearLayers(); } - var lines = addLinksToMap(linkDict, linkScale, data.graph.links, router); + var lines = addLinksToMap(linkDict, linkScale, data.links); groupLines = L.featureGroup(lines).addTo(map); - var nodesOnline = helper.subtract(data.nodes.all.filter(helper.online), data.nodes.new); - var nodesOffline = helper.subtract(data.nodes.all.filter(helper.offline), data.nodes.lost); + var nodesOnline = helper.subtract(data.nodes.online, data.nodes.new).filter(helper.hasLocation); + var nodesOffline = helper.subtract(data.nodes.offline, data.nodes.lost).filter(helper.hasLocation); + var nodesNew = data.nodes.new.filter(helper.hasLocation); + var nodesLost = data.nodes.lost.filter(helper.hasLocation); - var markersOnline = nodesOnline.filter(helper.hasLocation) - .map(mkMarker(nodeDict, function () { - return iconOnline; - }, router)); + var markersOnline = nodesOnline.map(mkMarker(nodeDict, function () { + return iconOnline; + })); - var markersOffline = nodesOffline.filter(helper.hasLocation) - .map(mkMarker(nodeDict, function () { - return iconOffline; - }, router)); + var markersOffline = nodesOffline.map(mkMarker(nodeDict, function () { + return iconOffline; + })); - var markersNew = data.nodes.new.filter(helper.hasLocation) - .map(mkMarker(nodeDict, function () { - return iconNew; - }, router)); + var markersNew = nodesNew.map(mkMarker(nodeDict, function () { + return iconNew; + })); - var markersLost = data.nodes.lost.filter(helper.hasLocation) - .map(mkMarker(nodeDict, function (d) { - if (d.lastseen.isAfter(moment(data.now).subtract(config.maxAgeAlert, 'days'))) { - return iconAlert; - } - - if (d.lastseen.isAfter(moment(data.now).subtract(config.maxAge, 'days'))) { - return iconLost; - } - return null; - }, router)); + var markersLost = nodesLost.map(mkMarker(nodeDict, function (d) { + var age = moment(data.now).diff(d.lastseen, 'days', true); + if (age <= config.maxAgeAlert) { + return iconAlert; + } + if (age <= config.maxAge) { + return iconLost; + } + return null; + })); groupOffline = L.featureGroup(markersOffline).addTo(map); groupLost = L.featureGroup(markersLost).addTo(map); @@ -190,10 +190,10 @@ define(['leaflet', 'rbush', 'helper', 'moment'], groupNew = L.featureGroup(markersNew).addTo(map); this.data = { - online: nodesOnline.filter(helper.hasLocation), - offline: nodesOffline.filter(helper.hasLocation), - new: data.nodes.new.filter(helper.hasLocation), - lost: data.nodes.lost.filter(helper.hasLocation) + online: nodesOnline, + offline: nodesOffline, + new: nodesNew, + lost: nodesLost }; this.updateLayer(); }, @@ -214,9 +214,9 @@ define(['leaflet', 'rbush', 'helper', 'moment'], // - color (string) var labelsOnline = d.online.map(prepareLabel(null, 11, 8, true)); - var labelsOffline = d.offline.map(prepareLabel('rgba(212, 62, 42, 0.9)', 9, 5, false)); - var labelsNew = d.new.map(prepareLabel('rgba(48, 99, 20, 0.9)', 11, 8, true)); - var labelsLost = d.lost.map(prepareLabel('rgba(212, 62, 42, 0.9)', 11, 8, true)); + var labelsOffline = d.offline.map(prepareLabel(config.icon.offline.color, 9, 5, false)); + var labelsNew = d.new.map(prepareLabel(config.map.labelNewColor, 11, 8, true)); + var labelsLost = d.lost.map(prepareLabel(config.icon.lost.color, 11, 8, true)); var labels = [] .concat(labelsNew) diff --git a/lib/map/locationmarker.js b/lib/map/locationmarker.js index f465a3a..905aedc 100644 --- a/lib/map/locationmarker.js +++ b/lib/map/locationmarker.js @@ -2,39 +2,10 @@ define(['leaflet'], function (L) { 'use strict'; return L.CircleMarker.extend({ - outerCircle: { - stroke: false, - color: '#4285F4', - opacity: 1, - fillOpacity: 0.3, - clickable: false, - radius: 16 - }, - - innerCircle: { - stroke: true, - color: '#ffffff', - fillColor: '#4285F4', - weight: 1.5, - clickable: false, - opacity: 1, - fillOpacity: 1, - radius: 7 - }, - - accuracyCircle: { - stroke: true, - color: '#4285F4', - weight: 1, - clickable: false, - opacity: 0.7, - fillOpacity: 0.2 - }, - initialize: function (latlng) { - this.accuracyCircle = L.circle(latlng, 0, this.accuracyCircle); - this.outerCircle = L.circleMarker(latlng, this.outerCircle); - L.CircleMarker.prototype.initialize.call(this, latlng, this.innerCircle); + this.accuracyCircle = L.circle(latlng, 0, config.locate.accuracyCircle); + this.outerCircle = L.circleMarker(latlng, config.locate.outerCircle); + L.CircleMarker.prototype.initialize.call(this, latlng, config.locate.innerCircle); this.on('remove', function () { this._map.removeLayer(this.accuracyCircle); diff --git a/lib/nodelist.js b/lib/nodelist.js index b16c9c3..9792f42 100644 --- a/lib/nodelist.js +++ b/lib/nodelist.js @@ -2,28 +2,18 @@ define(['sorttable', 'snabbdom', 'helper'], function (SortTable, V, helper) { 'use strict'; V = V.default; - function getUptime(now, d) { - if (d.flags.online && 'uptime' in d.statistics) { - return Math.round(d.statistics.uptime); - } else if (!d.flags.online && 'lastseen' in d) { - return Math.round(-(now.unix() - d.lastseen.unix())); - } - return 0; - } - function showUptime(uptime) { - var s = ''; - uptime /= 3600; - - if (uptime !== undefined) { - if (Math.abs(uptime) >= 24) { - s = Math.round(uptime / 24) + 'd'; - } else { - s = Math.round(uptime) + 'h'; - } + // 1000ms are 1 second and 60 second are 1min: 60 * 1000 = 60000 + var s = uptime / 60000; + if (Math.abs(s) < 60) { + return Math.round(s) + ' m'; } - - return s; + s /= 60; + if (Math.abs(s) < 24) { + return Math.round(s) + ' h'; + } + s /= 24; + return Math.round(s) + ' d'; } var headings = [{ @@ -31,7 +21,7 @@ define(['sorttable', 'snabbdom', 'helper'], function (SortTable, V, helper) { }, { name: 'node.nodes', sort: function (a, b) { - return a.nodeinfo.hostname.localeCompare(b.nodeinfo.hostname); + return a.hostname.localeCompare(b.hostname); }, reverse: false }, { @@ -52,40 +42,36 @@ define(['sorttable', 'snabbdom', 'helper'], function (SortTable, V, helper) { name: 'node.clients', class: 'ion-people', sort: function (a, b) { - return ('clients' in a.statistics ? a.statistics.clients : -1) - - ('clients' in b.statistics ? b.statistics.clients : -1); + return a.clients - b.clients; }, reverse: true }]; - return function (router) { + return function () { function renderRow(d) { - var td0Content = []; - var td1Content = []; - var aClass = ['hostname', d.flags.online ? 'online' : 'offline']; - - td1Content.push(V.h('a', { - props: { - className: aClass.join(' '), - href: router.generateLink({ node: d.nodeinfo.node_id }) - }, on: { - click: function (e) { - router.fullUrl({ node: d.nodeinfo.node_id }, e); - } - } - }, d.nodeinfo.hostname)); - + var td0Content = ''; if (helper.hasLocation(d)) { - td0Content.push(V.h('span', { props: { className: 'icon ion-location' } })); + td0Content = V.h('span', { props: { className: 'icon ion-location', title: _.t('location.location') } }); } - var td0 = V.h('td', td0Content); - var td1 = V.h('td', td1Content); - var td2 = V.h('td', showUptime(d.uptime)); - var td3 = V.h('td', d.neighbours.length); - var td4 = V.h('td', Number('clients' in d.statistics ? d.statistics.clients : 0).toFixed(0)); + var td1Content = V.h('a', { + props: { + className: ['hostname', d.is_online ? 'online' : 'offline'].join(' '), + href: router.generateLink({ node: d.node_id }) + }, on: { + click: function (e) { + router.fullUrl({ node: d.node_id }, e); + } + } + }, d.hostname); - return V.h('tr', [td0, td1, td2, td3, td4]); + return V.h('tr', [ + V.h('td', td0Content), + V.h('td', td1Content), + V.h('td', showUptime(d.uptime)), + V.h('td', d.neighbours.length), + V.h('td', d.clients) + ]); } var table = new SortTable(headings, 1, renderRow); @@ -101,8 +87,11 @@ define(['sorttable', 'snabbdom', 'helper'], function (SortTable, V, helper) { this.setData = function setData(d) { var data = d.nodes.all.map(function (e) { var n = Object.create(e); - n.uptime = getUptime(d.now, e); - n.neighbours = e.neighbours; + if (e.is_online) { + n.uptime = d.now - new Date(e.uptime).getTime(); + } else { + n.uptime = e.lastseen - d.now; + } return n; }); diff --git a/lib/proportions.js b/lib/proportions.js index 8c8af49..74702de 100644 --- a/lib/proportions.js +++ b/lib/proportions.js @@ -1,11 +1,12 @@ -define(['d3-interpolate', 'snabbdom', 'filters/genericnode', 'helper'], - function (d3Interpolate, V, Filter, helper) { +define(['d3-interpolate', 'snabbdom', 'utils/version', 'filters/genericnode', 'helper'], + function (d3Interpolate, V, versionCompare, Filter, helper) { 'use strict'; + V = V.default; - return function (config, filterManager) { + return function (filterManager) { var self = this; - var scale = d3Interpolate.interpolate('#770038', '#dc0067'); - V = V.default; + var scale = d3Interpolate.interpolate(config.forceGraph.tqFrom, config.forceGraph.tqTo); + var time; var statusTable; var fwTable; @@ -13,13 +14,9 @@ define(['d3-interpolate', 'snabbdom', 'filters/genericnode', 'helper'], var geoTable; var autoTable; var gatewayTable; + var gateway6Table; var siteTable; - - function showStatGlobal(o) { - return helper.showStat(o); - } - function count(nodes, key, f) { var dict = {}; @@ -68,9 +65,8 @@ define(['d3-interpolate', 'snabbdom', 'filters/genericnode', 'helper'], var th = V.h('th', a); var td = V.h('td', V.h('span', { style: { - width: Math.round(v * 100) + '%', - backgroundColor: scale(v), - color: 'white' + width: 'calc(25px + ' + Math.round(v * 90) + '%)', + backgroundColor: scale(v) } }, d[1].toFixed(0))); @@ -81,43 +77,38 @@ define(['d3-interpolate', 'snabbdom', 'filters/genericnode', 'helper'], } self.setData = function setData(data) { - var onlineNodes = data.nodes.all.filter(helper.online); + var onlineNodes = data.nodes.online; var nodes = onlineNodes.concat(data.nodes.lost); - var nodeDict = {}; + time = data.timestamp; - data.nodes.all.forEach(function (d) { - nodeDict[d.nodeinfo.node_id] = d; - }); + function hostnameOfNodeID(nodeid) { + var gateway = data.nodeDict[nodeid]; + if (gateway) { + return gateway.hostname; + } + return null; + } - var statusDict = count(nodes, ['flags', 'online'], function (d) { + var gatewayDict = count(nodes, ['gateway'], hostnameOfNodeID); + var gateway6Dict = count(nodes, ['gateway6'], hostnameOfNodeID); + + var statusDict = count(nodes, ['is_online'], function (d) { return d ? 'online' : 'offline'; }); - var fwDict = count(nodes, ['nodeinfo', 'software', 'firmware', 'release']); - var hwDict = count(nodes, ['nodeinfo', 'hardware', 'model']); - var geoDict = count(nodes, ['nodeinfo', 'location'], function (d) { + var fwDict = count(nodes, ['firmware', 'release']); + var hwDict = count(nodes, ['model']); + var geoDict = count(nodes, ['location'], function (d) { return d && d.longitude && d.latitude ? _.t('yes') : _.t('no'); }); - var autoDict = count(nodes, ['nodeinfo', 'software', 'autoupdater'], function (d) { - if (d === null) { - return null; - } else if (d.enabled) { + var autoDict = count(nodes, ['autoupdater'], function (d) { + if (d.enabled) { return d.branch; } return _.t('node.deactivated'); }); - var gatewayDict = count(nodes, ['statistics', 'gateway'], function (d) { - for (var mac in data.gateways) { - if (data.gateways.hasOwnProperty(mac) && mac === d) { - d = data.gateways[mac]; - return d; - } - } - return null; - }); - - var siteDict = count(nodes, ['nodeinfo', 'system', 'site_code'], function (d) { + var siteDict = count(nodes, ['site_code'], function (d) { if (config.siteNames) { config.siteNames.forEach(function (t) { if (d === t.site) { @@ -131,15 +122,7 @@ define(['d3-interpolate', 'snabbdom', 'filters/genericnode', 'helper'], statusTable = fillTable('node.status', statusTable, statusDict.sort(function (a, b) { return b[1] - a[1]; })); - fwTable = fillTable('node.firmware', fwTable, fwDict.sort(function (a, b) { - if (b[0] < a[0]) { - return -1; - } - if (b[0] > a[0]) { - return 1; - } - return 0; - })); + fwTable = fillTable('node.firmware', fwTable, fwDict.sort(versionCompare)); hwTable = fillTable('node.hardware', hwTable, hwDict.sort(function (a, b) { return b[1] - a[1]; })); @@ -149,7 +132,10 @@ define(['d3-interpolate', 'snabbdom', 'filters/genericnode', 'helper'], autoTable = fillTable('node.update', autoTable, autoDict.sort(function (a, b) { return b[1] - a[1]; })); - gatewayTable = fillTable('node.gateway', gatewayTable, gatewayDict.sort(function (a, b) { + gatewayTable = fillTable('node.selectedGatewayIPv4', gatewayTable, gatewayDict.sort(function (a, b) { + return b[1] - a[1]; + })); + gateway6Table = fillTable('node.selectedGatewayIPv6', gateway6Table, gateway6Dict.sort(function (a, b) { return b[1] - a[1]; })); siteTable = fillTable('node.site', siteTable, siteDict.sort(function (a, b) { @@ -158,34 +144,42 @@ define(['d3-interpolate', 'snabbdom', 'filters/genericnode', 'helper'], }; self.render = function render(el) { - var h2; self.renderSingle(el, 'node.status', statusTable); self.renderSingle(el, 'node.firmware', fwTable); self.renderSingle(el, 'node.hardware', hwTable); self.renderSingle(el, 'node.visible', geoTable); self.renderSingle(el, 'node.update', autoTable); - self.renderSingle(el, 'node.gateway', gatewayTable); + self.renderSingle(el, 'node.selectedGatewayIPv4', gatewayTable); + self.renderSingle(el, 'node.selectedGatewayIPv6', gateway6Table); self.renderSingle(el, 'node.site', siteTable); if (config.globalInfos) { + var images = document.createElement('div'); + el.appendChild(images); + var img = []; + var subst = { + '{TIME}': time, + '{LOCALE}': _.locale() + }; config.globalInfos.forEach(function (globalInfo) { - h2 = document.createElement('h2'); - h2.textContent = globalInfo.name; - el.appendChild(h2); - el.appendChild(showStatGlobal(globalInfo)); + img.push(V.h('h2', globalInfo.name)); + img.push(helper.showStat(V, globalInfo, subst)); }); + V.patch(images, V.h('div', img)); } }; self.renderSingle = function renderSingle(el, heading, table) { - var h2 = document.createElement('h2'); - h2.classList.add('proportion-header'); - h2.textContent = _.t(heading); - h2.onclick = function onclick() { - table.elm.classList.toggle('hide'); - }; - el.appendChild(h2); - el.appendChild(table.elm); + if (table.children.length > 0) { + var h2 = document.createElement('h2'); + h2.classList.add('proportion-header'); + h2.textContent = _.t(heading); + h2.onclick = function onclick() { + table.elm.classList.toggle('hide'); + }; + el.appendChild(h2); + el.appendChild(table.elm); + } }; return self; }; diff --git a/lib/sidebar.js b/lib/sidebar.js index d9742fb..b28cf3c 100644 --- a/lib/sidebar.js +++ b/lib/sidebar.js @@ -15,10 +15,13 @@ define(function () { el.appendChild(sidebar); var button = document.createElement('button'); + var visibility = new CustomEvent('visibility'); sidebar.appendChild(button); - button.classList.add('sidebarhandle', 'shadow'); + button.classList.add('sidebarhandle'); + button.setAttribute('aria-label', _.t('sidebar.toggle')); button.onclick = function onclick() { + button.dispatchEvent(visibility); sidebar.classList.toggle('hidden'); }; @@ -27,7 +30,7 @@ define(function () { sidebar.appendChild(container); self.getWidth = function getWidth() { - if (gridBreakpoints.lg[0] > window.innerWidth) { + if (gridBreakpoints.lg[0] > window.innerWidth || sidebar.classList.contains('hidden')) { return 0; } else if (gridBreakpoints.xl[0] > window.innerWidth) { return gridBreakpoints.lg[1]; @@ -54,6 +57,7 @@ define(function () { }; self.container = sidebar; + self.button = button; return self; }; diff --git a/lib/simplenodelist.js b/lib/simplenodelist.js index ea2c6cf..919e9c7 100644 --- a/lib/simplenodelist.js +++ b/lib/simplenodelist.js @@ -2,7 +2,7 @@ define(['moment', 'snabbdom', 'helper'], function (moment, V, helper) { 'use strict'; V = V.default; - return function (nodes, field, router, title) { + return function (nodes, field, title) { var self = this; var el; var tbody; @@ -34,32 +34,27 @@ define(['moment', 'snabbdom', 'helper'], function (moment, V, helper) { } var items = list.map(function (d) { - var time = moment(d[field]).from(data.now); - var td0Content = []; - var td1Content = []; - - var aClass = ['hostname', d.flags.online ? 'online' : 'offline']; - - td1Content.push(V.h('a', { - props: { - className: aClass.join(' '), - href: router.generateLink({ node: d.nodeinfo.node_id }) - }, on: { - click: function (e) { - router.fullUrl({ node: d.nodeinfo.node_id }, e); - } - } - }, d.nodeinfo.hostname)); - + var td0Content = ''; if (helper.hasLocation(d)) { - td0Content.push(V.h('span', { props: { className: 'icon ion-location' } })); + td0Content = V.h('span', { props: { className: 'icon ion-location', title: _.t('location.location') } }); } - var td0 = V.h('td', td0Content); - var td1 = V.h('td', td1Content); - var td2 = V.h('td', time); + var td1Content = V.h('a', { + props: { + className: ['hostname', d.is_online ? 'online' : 'offline'].join(' '), + href: router.generateLink({ node: d.node_id }) + }, on: { + click: function (e) { + router.fullUrl({ node: d.node_id }, e); + } + } + }, d.hostname); - return V.h('tr', [td0, td1, td2]); + return V.h('tr', [ + V.h('td', td0Content), + V.h('td', td1Content), + V.h('td', moment(d[field]).from(data.now)) + ]); }); var tbodyNew = V.h('tbody', items); diff --git a/lib/title.js b/lib/title.js index 1602c08..812bca3 100644 --- a/lib/title.js +++ b/lib/title.js @@ -1,7 +1,7 @@ define(function () { 'use strict'; - return function (config) { + return function () { function setTitle(d) { var title = [config.siteName]; @@ -17,11 +17,11 @@ define(function () { }; this.gotoNode = function gotoNode(d) { - setTitle(d.nodeinfo.hostname); + setTitle(d.hostname); }; this.gotoLink = function gotoLink(d) { - setTitle((d.source.node ? d.source.node.nodeinfo.hostname : d.source.id) + ' \u21D4 ' + d.target.node.nodeinfo.hostname); + setTitle(d[0].source.hostname + ' \u21D4 ' + d[0].target.hostname); }; this.gotoLocation = function gotoLocation() { diff --git a/lib/utils/helper.js b/lib/utils/helper.js index 3587542..6371721 100644 --- a/lib/utils/helper.js +++ b/lib/utils/helper.js @@ -27,9 +27,9 @@ define({ }, sortByKey: function sortByKey(key, d) { - return d.slice().sort(function (a, b) { - return a[key] - b[key]; - }).reverse(); + return d.sort(function (a, b) { + return b[key] - a[key]; + }); }, limit: function limit(key, m, d) { @@ -72,31 +72,21 @@ define({ return s; }, - /* Helpers working with nodes */ - - offline: function offline(d) { - return !d.flags.online; - }, - - online: function online(d) { - return d.flags.online; - }, - hasLocation: function hasLocation(d) { - return 'location' in d.nodeinfo && - Math.abs(d.nodeinfo.location.latitude) < 90 && - Math.abs(d.nodeinfo.location.longitude) < 180; + return 'location' in d && + Math.abs(d.location.latitude) < 90 && + Math.abs(d.location.longitude) < 180; }, subtract: function subtract(a, b) { var ids = {}; b.forEach(function (d) { - ids[d.nodeinfo.node_id] = true; + ids[d.node_id] = true; }); return a.filter(function (d) { - return !(d.nodeinfo.node_id in ids); + return !ids[d.node_id]; }); }, @@ -111,59 +101,35 @@ define({ }, showTq: function showTq(d) { - return (1 / d.tq * 100).toFixed(0) + '%'; + return (d * 100).toFixed(0) + '%'; }, - attributeEntry: function attributeEntry(el, label, value) { - if (value === null || value === undefined) { - return ''; - } - - var tr = document.createElement('tr'); - var th = document.createElement('th'); - th.textContent = _.t(label); - tr.appendChild(th); - - var td = document.createElement('td'); - - if (typeof value === 'function') { - value(td); - } else { - td.appendChild(document.createTextNode(value)); - } - - tr.appendChild(td); - - el.appendChild(tr); - - return td; - }, - - showStat: function showStat(o, subst) { - var content; - subst = typeof subst !== 'undefined' ? subst : {}; - - content = document.createElement('img'); - content.src = require('helper').listReplace(o.image, subst); - - var p = document.createElement('p'); - - if (o.href) { - var link = document.createElement('a'); - link.target = '_blank'; - link.href = require('helper').listReplace(o.href, subst); - link.appendChild(content); - - if (o.title) { - link.title = require('helper').listReplace(o.title, subst); + attributeEntry: function attributeEntry(V, children, label, value) { + if (value !== undefined) { + if (typeof value !== 'object') { + value = V.h('td', value); } - p.appendChild(link); - } else { - p.appendChild(content); + children.push(V.h('tr', [ + V.h('th', _.t(label)), + value + ])); } + }, + showStat: function showStat(V, o, subst) { + var content = V.h('img', { attrs: { src: require('helper').listReplace(o.image, subst) } }); - return p; + if (o.href) { + return V.h('p', V.h('a', { + attrs: + { + href: require('helper').listReplace(o.href, subst), + target: '_blank', + title: require('helper').listReplace(o.title, subst) + } + }, content)); + } + return V.h('p', content); }, getTileBBox: function getTileBBox(s, map, tileSize, margin) { @@ -172,20 +138,35 @@ define({ return { minX: br.lat, minY: tl.lng, maxX: tl.lat, maxY: br.lng }; }, - positionClients: function positionClients(ctx, p, startAngle, clients, startDistance) { - if (clients === 0) { + positionClients: function positionClients(ctx, p, startAngle, node, startDistance) { + if (node.clients === 0) { return; } var radius = 3; var a = 1.2; + var mode = 0; - for (var orbit = 0, i = 0; i < clients; orbit++) { + ctx.beginPath(); + ctx.fillStyle = config.client.wifi24; + + for (var orbit = 0, i = 0; i < node.clients; orbit++) { var distance = startDistance + orbit * 2 * radius * a; var n = Math.floor((Math.PI * distance) / (a * radius)); - var delta = clients - i; + var delta = node.clients - i; for (var j = 0; j < Math.min(delta, n); i++, j++) { + if (mode !== 1 && i >= (node.clients_wifi24 + node.clients_wifi5)) { + mode = 1; + ctx.fill(); + ctx.beginPath(); + ctx.fillStyle = config.client.wifi5; + } else if (mode === 0 && i >= node.clients_wifi24) { + mode = 2; + ctx.fill(); + ctx.beginPath(); + ctx.fillStyle = config.client.other; + } var angle = 2 * Math.PI / n * j; var x = p.x + distance * Math.cos(angle + startAngle); var y = p.y + distance * Math.sin(angle + startAngle); @@ -194,5 +175,6 @@ define({ ctx.arc(x, y, radius, 0, 2 * Math.PI); } } + ctx.fill(); } }); diff --git a/lib/utils/language.js b/lib/utils/language.js index 572c2be..1435406 100644 --- a/lib/utils/language.js +++ b/lib/utils/language.js @@ -1,11 +1,12 @@ define(['polyglot', 'moment', 'helper'], function (Polyglot, moment, helper) { 'use strict'; - return function (config) { + return function () { var router; function languageSelect(el) { var select = document.createElement('select'); select.className = 'language-switch'; + select.setAttribute('aria-label', 'Language'); select.addEventListener('change', setSelectLocale); el.appendChild(select); @@ -59,6 +60,7 @@ define(['polyglot', 'moment', 'helper'], function (Polyglot, moment, helper) { function init(r) { router = r; + /** global: _ */ window._ = new Polyglot({ locale: getLocale(router.getLang()), allowMissing: true }); helper.getJSON('locale/' + _.locale() + '.json?' + config.cacheBreaker).then(setTranslation); document.querySelector('html').setAttribute('lang', _.locale()); diff --git a/lib/utils/math.js b/lib/utils/math.js index e4f3572..32e2eb2 100644 --- a/lib/utils/math.js +++ b/lib/utils/math.js @@ -2,7 +2,7 @@ define(function () { var self = {}; self.distance = function distance(a, b) { - return Math.pow(a.x - b.x, 2) + Math.pow(a.y - b.y, 2); + return (a.x - b.x) * (a.x - b.x) + (a.y - b.y) * (a.y - b.y); }; self.distancePoint = function distancePoint(a, b) { diff --git a/lib/utils/node.js b/lib/utils/node.js new file mode 100644 index 0000000..89f386a --- /dev/null +++ b/lib/utils/node.js @@ -0,0 +1,143 @@ +define(['snabbdom', 'helper', 'moment'], function (V, helper, moment) { + 'use strict'; + V = V.default; + + var self = {}; + + function showBar(v, width, warning) { + return V.h('span', + { props: { className: 'bar' + (warning ? ' warning' : '') } }, + [ + V.h('span', + { + style: { width: (width * 100) + '%' } + }), + V.h('label', v) + ] + ); + } + + self.showStatus = function showStatus(d) { + return V.h('td', + { props: { className: d.is_online ? 'online' : 'offline' } }, + _.t((d.is_online ? 'node.lastOnline' : 'node.lastOffline'), { + time: d.lastseen.fromNow(), + date: d.lastseen.format('DD.MM.YYYY, H:mm:ss') + })); + }; + + self.showGeoURI = function showGeoURI(d) { + if (!helper.hasLocation(d)) { + return undefined; + } + + return V.h('td', + V.h('a', + { props: { href: 'geo:' + d.location.latitude + ',' + d.location.longitude } }, + Number(d.location.latitude.toFixed(6)) + ', ' + Number(d.location.longitude.toFixed(6)) + ) + ); + }; + + self.showGateway = function showGateway(d) { + return d.is_gateway ? _.t('yes') : undefined; + }; + + self.showFirmware = function showFirmware(d) { + return [ + helper.dictGet(d, ['firmware', 'release']), + helper.dictGet(d, ['firmware', 'base']) + ].filter(function (n) { + return n !== null; + }).join(' / ') || undefined; + }; + + self.showUptime = function showUptime(d) { + return moment.utc(d.uptime).local().fromNow(true); + }; + + self.showFirstSeen = function showFirstSeen(d) { + return d.firstseen.fromNow(true); + }; + + self.showLoad = function showLoad(d) { + return showBar(d.loadavg.toFixed(2), d.loadavg / (d.nproc || 1), d.loadavg >= d.nproc); + }; + + self.showRAM = function showRAM(d) { + return showBar(Math.round(d.memory_usage * 100) + ' %', d.memory_usage, d.memory_usage >= 0.8); + }; + + self.showSite = function showSite(d) { + var rt = d.site_code; + if (config.siteNames) { + config.siteNames.forEach(function (t) { + if (d.site_code === t.site) { + rt = t.name; + } + }); + } + return rt; + }; + + self.showClients = function showClients(d) { + if (!d.is_online) { + return undefined; + } + + var clients = [ + V.h('span', [ + d.clients > 0 ? d.clients : _.t('none'), + V.h('br'), + V.h('i', { props: { className: 'ion-people', title: _.t('node.clients') } }) + ]), + V.h('span', + { props: { className: 'legend-24ghz' } }, + [ + d.clients_wifi24, + V.h('br'), + V.h('span', { props: { className: 'symbol', title: '2,4 Ghz' } }) + ]), + V.h('span', + { props: { className: 'legend-5ghz' } }, + [ + d.clients_wifi5, + V.h('br'), + V.h('span', { props: { className: 'symbol', title: '5 Ghz' } }) + ]), + V.h('span', + { props: { className: 'legend-others' } }, + [ + d.clients_other, + V.h('br'), + V.h('span', { props: { className: 'symbol', title: _.t('others') } }) + ]) + ]; + + return V.h('td', { props: { className: 'clients' } }, clients); + }; + + self.showIPs = function showIPs(d) { + var string = []; + var ips = d.addresses; + ips.sort(); + ips.forEach(function (ip, i) { + if (i > 0) { + string.push(V.h('br')); + } + + if (ip.indexOf('fe80:') !== 0) { + string.push(V.h('a', { props: { href: 'http://[' + ip + ']/', target: '_blank' } }, ip)); + } else { + string.push(ip); + } + }); + return V.h('td', string); + }; + + self.showAutoupdate = function showAutoupdate(d) { + return d.autoupdater.enabled ? _.t('node.activated', { branch: d.autoupdater.branch }) : _.t('node.deactivated'); + }; + + return self; +}); diff --git a/lib/utils/router.js b/lib/utils/router.js index 55ba478..3831cd8 100644 --- a/lib/utils/router.js +++ b/lib/utils/router.js @@ -3,7 +3,7 @@ define(['Navigo'], function (Navigo) { return function (language) { var init = false; - var objects = { nodes: {}, links: {}, gateways: {} }; + var objects = {}; var targets = []; var views = {}; var current = {}; @@ -16,17 +16,20 @@ define(['Navigo'], function (Navigo) { } function gotoNode(d) { - if (d.nodeId in objects.nodes) { + if (objects.nodeDict[d.nodeId]) { targets.forEach(function (t) { - t.gotoNode(objects.nodes[d.nodeId], objects.gateways); + t.gotoNode(objects.nodeDict[d.nodeId], objects.nodeDict); }); } } function gotoLink(d) { - if (d.linkId in objects.links) { + var link = objects.links.filter(function (value) { + return value.id === d.linkId; + }); + if (link) { targets.forEach(function (t) { - t.gotoLink(objects.links[d.linkId]); + t.gotoLink(link); }); } } @@ -82,7 +85,7 @@ define(['Navigo'], function (Navigo) { var router = new Navigo(null, true); router - .on(/^\/?#?\/([\w]{2})?\/?(map|graph)?\/?([a-f\d]{12})?([a-f\d\-]{25})?\/?(?:(\d+)\/([\d.]+)\/([\d.]+))?$/, customRoute) + .on(/^\/?#?\/([\w]{2})?\/?(map|graph)?\/?([a-f\d]{12})?([a-f\d\-]{25})?\/?(?:(\d+)\/(-?[\d.]+)\/(-?[\d.]+))?$/, customRoute) .on({ '*': function () { router.fullUrl(); @@ -139,17 +142,7 @@ define(['Navigo'], function (Navigo) { }; router.setData = function setData(data) { - objects.nodes = {}; - objects.links = {}; - objects.gateways = data.gateways; - - data.nodes.all.forEach(function (d) { - objects.nodes[d.nodeinfo.node_id] = d; - }); - - data.graph.links.forEach(function (d) { - objects.links[d.id] = d; - }); + objects = data; }; return router; diff --git a/lib/utils/version.js b/lib/utils/version.js new file mode 100644 index 0000000..6a8cf86 --- /dev/null +++ b/lib/utils/version.js @@ -0,0 +1,102 @@ +define(function () { + 'use strict'; + + /* + reimplate after node-deb-version-compare under MIT + (https://github.com/sdumetz/node-deb-version-compare) + */ + + function Version(v) { + var version = /^[a-zA-Z]?([0-9]*(?=:))?:(.*)/.exec(v); + this.epoch = (version) ? version[1] : 0; + version = (version && version[2]) ? version[2] : v; + version = version.split('-'); + this.debian = (version.length > 1) ? version.pop() : ''; + this.upstream = version.join('-'); + } + + Version.prototype.compare = function (b) { + if ((this.epoch > 0 || b.epoch > 0) && Math.sign(this.epoch - b.epoch) !== 0) { + return Math.sign(this.epoch - b.epoch); + } + if (this.compareStrings(this.upstream, b.upstream) !== 0) { + return this.compareStrings(this.upstream, b.upstream); + } + return this.compareStrings(this.debian, b.debian); + }; + + Version.prototype.charCode = function (c) { // the lower the charcode the lower the version. + // if (c === '~') {return 0;} // tilde sort before anything + // else + if (/[a-zA-Z]/.test(c)) { + return c.charCodeAt(0) - 'A'.charCodeAt(0) + 1; + } else if (/[.:+-:]/.test(c)) { + return c.charCodeAt(0) + 'z'.charCodeAt(0) + 1; + } // charcodes are 46..58 + return 0; + }; + + // find index of "val" in "ar". + Version.prototype.findIndex = function (ar, fn) { + for (var i = 0; i < ar.length; i++) { + if (fn(ar[i], i)) { + return i; + } + } + return -1; + }; + + Version.prototype.compareChunk = function (a, b) { + var ca = a.split(''); + var cb = b.split(''); + var diff = this.findIndex(ca, function (c, index) { + if (cb[index] && c === cb[index]) { + return false; + } + return true; + }); + if (diff === -1) { + if (cb.length > ca.length) { + if (cb[ca.length] === '~') { + return 1; + } + return -1; + } + return 0; // no diff found and same length + } else if (!cb[diff]) { + return (ca[diff] === '~') ? -1 : 1; + } + return (this.charCode(ca[diff]) > this.charCode(cb[diff])) ? 1 : -1; + }; + + Version.prototype.compareStrings = function (a, b) { + if (a === b) { + return 0; + } + var parseA = /([^0-9]+|[0-9]+)/g; + var parseB = /([^0-9]+|[0-9]+)/g; + var ra = parseA.exec(a); + var rb = parseB.exec(b); + while (ra !== null && rb !== null) { + if ((isNaN(ra[1]) || isNaN(rb[1])) && ra[1] !== rb[1]) { // a or b is not a number and they're not equal. Note : "" IS a number so both null is impossible + return this.compareChunk(ra[1], rb[1]); + } // both are numbers + if (ra[1] !== rb[1]) { + return (parseInt(ra[1], 10) > parseInt(rb[1], 10)) ? 1 : -1; + } + ra = parseA.exec(a); + rb = parseB.exec(b); + } + if (!ra && rb) { // rb doesn't get exec-ed when ra == null + return (rb.length > 0 && rb[1].split('')[0] === '~') ? 1 : -1; + } else if (ra && !rb) { + return (ra[1].split('')[0] === '~') ? -1 : 1; + } + return 0; + }; + return function compare(a, b) { + var va = new Version(a[0]); + var vb = new Version(b[0]); + return vb.compare(va); + }; +}); diff --git a/locale/cz.json b/locale/cz.json new file mode 100644 index 0000000..e91b2f8 --- /dev/null +++ b/locale/cz.json @@ -0,0 +1,96 @@ +{ + "node": { + "all": "Všechny uzly", + "nodes": "Uzly", + "uptime": "Celková doba provozu", + "links": "Odkazy", + "clients": "Klienti", + "distance": "Vzdálenost", + "connectionType": "typ připojení", + "tq": "tq", + "lastOnline": "poslední on-line %{time} (%{date})", + "lastOffline": "lastOffline %{time} (%{date})", + "activated": "aktivováno (%{branch})", + "deactivated": "deaktivováno", + "status": "Stav", + "firmware": "Verze firmwaru", + "hardware": "Model hardwaru", + "visible": "Visible on the map", + "update": "Automatický update", + "site": "Site", + "gateway": "Brána", + "coordinates": "Souřadnice", + "contact": "Kontakt", + "primaryMac": "Hlavní MAC", + "id": "Identifikace uzlu", + "firstSeen": "firstSeen", + "systemLoad": "Průměrné zatížení", + "ram": "Využití paměti", + "ipAddresses": "IP adresa", + "nexthop": "Další skok", + "selectedGatewayIPv4": "vybranýGatewayIPv4", + "selectedGatewayIPv6": "vybranýGatewayIPv6", + "link": "Odkaz ||| Odkazy", + "node": "Uzel ||| Uzly", + "new": "Nové uzly", + "missing": "Zmizelé uzly" + }, + "location": { + "location": "Poloha", + "latitude": "Zeměpisná šířka", + "longitude": "Zeměpisná délka", + "copy": "Kopírovat" + }, + "sidebar": { + "nodeFilter": "nodeFilter", + "nodes": "%{total} uzly, %{online} uzly on-line", + "clients": "%{smart_count} klienti |||| %{smart_count} klienti", + "gateway": " %{smart_count} gateway |||| %{smart_count} gateways", + "lastUpdate": "Poslední update", + "nodeNew": "nodeNew", + "nodeOnline": "Uzel je online", + "nodeOffline": "Uzel je offline", + "aboutInfo": "aboutInfo", + "actual": "aktuální", + "stats": "Statistika", + "about": "O produktu", + "toggle": "přepínat" + }, + "button": { + "switchView": "Přepnout zobrazení", + "location": "Vybrat souřadnice", + "tracking": "Lokalizace" + }, + "momentjs": { + "calendar": { + "sameDay": "[Today at] LT", + "nextDay": "[Tomorrow at] LT", + "nextWeek": "dddd [at] LT", + "lastDay": "[Yesterday at] LT", + "lastWeek": "[Last] dddd [at] LT", + "sameElse": "L" + }, + "relativeTime": { + "future": "in %s", + "past": "%s ago", + "s": "Několik sekund", + "m": "minuta", + "mm": "%d minut", + "h": "an hour", + "hh": "%d hodin", + "d": "den", + "dd": "%d dnů", + "M": "měsíc", + "MM": "%d měsíců", + "y": "rok", + "yy": "%d let" + } + }, + "yes": "ano", + "no": "ne", + "unknown": "neznámý", + "others": "ostatní", + "none": "žádný", + "remove": "odstranit", + "close": "zavřít" +} diff --git a/locale/de.json b/locale/de.json index 53ddbb9..de06b9e 100644 --- a/locale/de.json +++ b/locale/de.json @@ -6,6 +6,7 @@ "links": "Verbindungen", "clients": "Nutzer", "distance": "Entfernung", + "connectionType": "Verbindungsart", "tq": "Übertragungsqualität", "lastOnline": "online, letzte Nachricht %{time} (%{date})", "lastOffline": "offline, letzte Nachricht %{time} (%{date})", @@ -23,10 +24,12 @@ "primaryMac": "Primäre MAC", "id": "Knoten ID", "firstSeen": "Erstmals gesehen", - "systemLoad": "Load average", + "systemLoad": "Systemlast", "ram": "Speicherauslastung", "ipAddresses": "IP Adressen", - "selectedGateway": "Gewähltes Gateway", + "nexthop": "Nächster Sprung", + "selectedGatewayIPv4": "Gewähltes ipv4 Gateway", + "selectedGatewayIPv6": "Gewähltes ipv6 Gateway", "link": "Verbindung |||| Verbindungen", "node": "Knoten", "new": "Neue Knoten", @@ -44,13 +47,14 @@ "clients": "mit %{smart_count} Nutzer |||| mit %{smart_count} Nutzern", "gateway": "auf %{smart_count} Gateway |||| auf %{smart_count} Gateways", "lastUpdate": "Letzte Aktualisierung", - "nodeNew": "Knoten ist neu", - "nodeOnline": "Knoten ist online", - "nodeOffline": "Knoten ist offline", + "nodeNew": "neu", + "nodeOnline": "online", + "nodeOffline": "offline", "aboutInfo": "

Über Meshviewer

Mit Doppelklick kann man in die Karte hinein zoomen und Shift+Doppelklick heraus zoomen.

", "actual": "Aktuell", "stats": "Statistiken", - "about": "Über" + "about": "Über", + "toggle": "Seitenleiste anzeigen/ausblenden" }, "button": { "switchView": "Ansicht wechseln", @@ -85,5 +89,8 @@ "yes": "ja", "no": "nein", "unknown": "unbekannt", - "none": "keine" + "others": "andere", + "none": "keine", + "remove": "entfernen", + "close": "schließen" } diff --git a/locale/en.json b/locale/en.json index 9452ff3..ecaf07b 100644 --- a/locale/en.json +++ b/locale/en.json @@ -6,6 +6,7 @@ "links": "Links", "clients": "Clients", "distance": "Distance", + "connectionType": "Connection type", "tq": "Transmit quality", "lastOnline": "online, last message %{time} (%{date})", "lastOffline": "offline, last message %{time} (%{date})", @@ -26,7 +27,9 @@ "systemLoad": "Load average", "ram": "Memory usage", "ipAddresses": "IP addresses", - "selectedGateway": "Selected gateway", + "nexthop": "Nexthop", + "selectedGatewayIPv4": "Selected ipv4-gateway", + "selectedGatewayIPv6": "Selected ipv6-gateway", "link": "Link |||| Links", "node": "Node |||| Nodes", "new": "New nodes", @@ -44,13 +47,14 @@ "clients": "with %{smart_count} client |||| with %{smart_count} clients", "gateway": "on %{smart_count} gateway |||| on %{smart_count} gateways", "lastUpdate": "Last update", - "nodeNew": "Node is new", - "nodeOnline": "Node is online", - "nodeOffline": "Node is offline", + "nodeNew": "new", + "nodeOnline": "online", + "nodeOffline": "offline", "aboutInfo": "

About Meshviewer

You can zoom in with double-click and zoom out with shift+double-click

", "actual": "Current", "stats": "Statistics", - "about": "About" + "about": "About", + "toggle": "Toggle Sidebar" }, "button": { "switchView": "Switch view", @@ -85,5 +89,8 @@ "yes": "yes", "no": "no", "unknown": "unknown", - "none": "none" + "others": "other", + "none": "none", + "remove": "remove", + "close": "close" } diff --git a/locale/fr.json b/locale/fr.json index 42409b5..9843c24 100644 --- a/locale/fr.json +++ b/locale/fr.json @@ -6,6 +6,7 @@ "links": "Connexion", "clients": "Clients", "distance": "Distance", + "connectionType": "Type de connexion", "tq": "Qualité de transmission", "lastOnline": "en ligne, dernier message %{time} (%{date})", "lastOffline": "hors ligne, dernier message %{time} (%{date})", @@ -26,7 +27,9 @@ "systemLoad": "Charge moyenne", "ram": "Utilisation de la mémoire", "ipAddresses": "Adresse IP", - "selectedGateway": "Passerelle sélectionné", + "nexthop": "Nexthop", + "selectedGatewayIPv4": "Selected ipv4-gateway", + "selectedGatewayIPv6": "Selected ipv6-gateway", "link": "Connexion |||| Connexions", "node": "Nœud |||| Nœuds", "new": "Nouveaux nœuds", @@ -50,7 +53,8 @@ "aboutInfo": "

Sur Meshviewer

Vous pouvez zoomer avec double-clic et effectuer un zoom arrière avec shift + double-clic

", "actual": "Actuel", "stats": "Statistiques", - "about": "À propros" + "about": "À propros", + "toggle": "Toggle Sidebar" }, "button": { "switchView": "Basculer l’affichage", @@ -85,5 +89,8 @@ "yes": "oui", "no": "non", "unknown": "inconnu", - "none": "aucun" + "others": "autres", + "none": "aucun", + "remove": "supprimer", + "close": "fermer" } diff --git a/locale/ru.json b/locale/ru.json index 71a427e..b88f15c 100644 --- a/locale/ru.json +++ b/locale/ru.json @@ -6,6 +6,7 @@ "links": "Ссылки", "clients": "Клиенты", "distance": "Расстояние", + "connectionType": "Тип подключения", "tq": "Качество связи", "lastOnline": "в сети, последнее сообщение %{time} (%{date})", "lastOffline": "не в сети, последнее сообщение %{time} (%{date})", @@ -26,7 +27,9 @@ "systemLoad": "Средняя загрузка", "ram": "Используемая память", "ipAddresses": "IP адреса", - "selectedGateway": "Выбранный шлюз", + "nexthop": "Следующий скачок", + "selectedGatewayIPv4": "Выбранный шлюз ipv4", + "selectedGatewayIPv6": "Выбранный шлюз ipv6", "link": "Ссылка |||| Ссылки", "node": "Узел |||| Узлы", "new": "Новые узлы", @@ -50,7 +53,8 @@ "aboutInfo": "

О Meshviewer

Вы можете увеличить масштаб двойным щелчком мыши и уменьшить с shift + двойной щелчок

", "actual": "Текущее", "stats": "Статистика", - "about": "О продукте" + "about": "О продукте", + "toggle": "Включить панель" }, "button": { "switchView": "Переключить вид", @@ -85,5 +89,8 @@ "yes": "да", "no": "нет", "unknown": "неизвестно", - "none": "нет" + "others": "другие", + "none": "нет", + "remove": "убрать", + "close": "закрыть" } diff --git a/locale/tr.json b/locale/tr.json new file mode 100644 index 0000000..7ad1fa4 --- /dev/null +++ b/locale/tr.json @@ -0,0 +1,96 @@ +{ + "node": { + "all": "Bütün düğümler", + "nodes": "Düğümler", + "uptime": "Çalışma süresi", + "links": "Bağlantılar", + "clients": "Müşteriler", + "distance": "Mesafe", + "connectionType": "Bağlantı türü", + "tq": "İletim kalitesi", + "lastOnline": "çevrimiçi, son mesaj %{time} (%{date})", + "lastOffline": "çevrimdışı, son mesaj %{time} (%{date})", + "activated": "aktif (%{branch})", + "deactivated": "devredışı bırakıldı", + "status": "Durum", + "firmware": "Yazılım versiyonu", + "hardware": "Donanım modeli", + "visible": "Harita üzerinde görünür", + "update": "Otomatik güncelleme", + "site": "Site", + "gateway": "Geçit", + "coordinates": "Koordinatlar", + "contact": "İlişki", + "primaryMac": "Birincil MAC", + "id": "Düğüm kimliği", + "firstSeen": "İlk görülme", + "systemLoad": "Ortalama yük", + "ram": "Bellek kullanımı", + "ipAddresses": "IP adresleri", + "nexthop": "Bir sonraki atlama", + "selectedGatewayIPv4": "Seçili Ipv4-ağ geçidi", + "selectedGatewayIPv6": "Seçili Ipv6-ağ geçidi", + "link": "Bağlantı ||| Bağlantılar", + "node": "Düğüm ||| Düğümler", + "new": "Yeni düğümler", + "missing": "Kaybolan düğümler" + }, + "location": { + "location": "Konum", + "latitude": "Enlem", + "longitude": "Boylam", + "copy": "Kopya" + }, + "sidebar": { + "nodeFilter": "Düğüm Filtresi", + "nodes": "%{total} düğümler, %{online} çevrimiçi düğümler dahil", + "clients": "%{smart_count} müşteri ile |||| %{smart_count} müşteriler ile", + "gateway": "%{smart_count} geçit üzerinde |||| %{smart_count} geçitler üzerinde", + "lastUpdate": "Son güncelleme", + "nodeNew": "yeni", + "nodeOnline": "çevrimiçi", + "nodeOffline": "çevrimdışı", + "aboutInfo": "

Meshviewer Hakkında

Çift tıklayarak yakınlaştırabilir ve Shift tuşuna basıp+çift tıklayarak uzaklaştırabilirsiniz

", + "actual": "Mevcut", + "stats": "İstatistikler", + "about": "Hakkında", + "toggle": "Kenar çubuğunu değiştir" + }, + "button": { + "switchView": "Görünümü Değiştir", + "location": "Koordinatları seç", + "tracking": "Yerelleştirme" + }, + "momentjs": { + "calendar": { + "sameDay": "[Bugün] LT", + "nextDay": "[Yarın] LT", + "nextWeek": "dddd [at] LT", + "lastDay": "[Dün] LT", + "lastWeek": "[Last] dddd [at] LT", + "sameElse": "L" + }, + "relativeTime": { + "future": "%s içinde", + "past": "%s önce", + "s": "birkaç saniye", + "m": "bir dakika", + "mm": "%d dakikalar", + "h": "bir saat", + "hh": "%d saatler", + "d": "bir gün", + "dd": "%d günler", + "M": "bir ay", + "MM": "%d aylar", + "y": "bir yıl", + "yy": "%d yıllar" + } + }, + "yes": "evet", + "no": "hayır", + "unknown": "bilinmeyen", + "others": "diğer", + "none": "hiçbiri", + "remove": "kaldır", + "close": "kapat" +} diff --git a/package.json b/package.json index 3906aea..a7bfe88 100644 --- a/package.json +++ b/package.json @@ -1,5 +1,6 @@ { - "name": "ffrgb-meshviewer", + "name": "meshviewer", + "version": "10.0.0", "license": "AGPL-3.0", "repository": { "type": "git", @@ -9,28 +10,29 @@ "url": "https://github.com/ffrgb/meshviewer/issues" }, "devDependencies": { - "babel-eslint": "^7.2.3", - "browser-sync": "^2.18.8", - "eslint": "^3.19.0", - "eslint-config-airbnb-es5": "^1.1.0", + "babel-eslint": "^8.2.2", + "browser-sync": "^2.23.6", + "eslint": "^4.18.2", + "eslint-config-airbnb-es5": "^1.2.0", "eslint-config-defaults": "^9.0.0", - "eslint-plugin-react": "^7.0.0", + "eslint-plugin-react": "^7.7.0", "gulp": "github:gulpjs/gulp#4.0", - "gulp-autoprefixer": "^3.1.1", - "gulp-cache-bust": "^1.1.0", + "gulp-autoprefixer": "^5.0.0", + "gulp-cache-bust": "^1.3.0", + "gulp-cli": "^2.0.1", "gulp-environments": "^0.1.2", - "gulp-eslint": "^3.0.1", - "gulp-htmlmin": "^3.0.0", - "gulp-inject": "^4.2.0", - "gulp-jsonminify": "^1.0.0", + "gulp-eslint": "^4.0.2", + "gulp-htmlmin": "^4.0.0", + "gulp-inject": "^4.3.1", + "gulp-jsonminify": "^1.1.0", "gulp-kyh-inline-source": "^3.0.2", "gulp-load-plugins": "^1.5.0", "gulp-real-favicon": "^0.2.2", "gulp-requirejs-optimize": "^1.2.0", "gulp-sass": "^3.1.0", - "gulp-sass-lint": "^1.3.2", - "gulp-sourcemaps": "^2.6.0", - "gulp-uglify": "^2.1.2" + "gulp-sass-lint": "^1.3.4", + "gulp-sourcemaps": "^2.6.4", + "gulp-uglify": "^3.0.0" }, "eslintConfig": { "env": { @@ -42,17 +44,20 @@ }, "dependencies": { "almond": "^0.3.3", - "d3-drag": "^1.0.4", - "d3-force": "^1.0.6", - "d3-selection": "^1.0.6", - "d3-zoom": "^1.1.3", - "leaflet": "^1.0.3", - "moment": "^2.17.1", - "navigo": "^4.7.1", + "d3-drag": "^1.2.1", + "d3-force": "^1.1.0", + "d3-selection": "^1.3.0", + "d3-zoom": "^1.7.1", + "leaflet": "^1.3.1", + "moment": "^2.21.0", + "navigo": "^7.1.1", "node-polyglot": "^2.2.2", - "promise-polyfill": "^6.0.2", - "rbush": "^2.0.1", - "requirejs": "^2.3.2", - "snabbdom": "^0.6.4" + "promise-polyfill": "^7.1.0", + "rbush": "^2.0.2", + "requirejs": "^2.3.5", + "snabbdom": "^0.7.1" + }, + "scripts": { + "gulp": "./node_modules/gulp-cli/bin/gulp.js" } } diff --git a/polyfill.js b/polyfill.js index dd5c71f..85bbc62 100644 --- a/polyfill.js +++ b/polyfill.js @@ -7,56 +7,8 @@ if (!String.prototype.includes) { }; } -if (!String.prototype.startsWith) { - String.prototype.startsWith = function (searchString, position) { - position = position || 0; - return this.substr(position, searchString.length) === searchString; - }; -} - -if (!String.prototype.repeat) { - String.prototype.repeat = function (count) { - 'use strict'; - if (this === null) { - throw new TypeError('can\'t convert ' + this + ' to object'); - } - var str = '' + this; - count = +count; - if (count < 0) { - throw new RangeError('repeat count must be non-negative'); - } - if (count === Infinity) { - throw new RangeError('repeat count must be less than infinity'); - } - count = Math.floor(count); - if (str.length === 0 || count === 0) { - return ''; - } - // Ensuring count is a 31-bit integer allows us to heavily optimize the - // main part. But anyway, most current (August 2014) browsers can't handle - // strings 1 << 28 chars or longer, so: - if (str.length * count >= 1 << 28) { - throw new RangeError('repeat count must not overflow maximum string size'); - } - var rpt = ''; - for (; ;) { - if ((count & 1) === 1) { - rpt += str; - } - count >>>= 1; - if (count === 0) { - break; - } - str += str; - } - // Could we try: - // return Array(count + 1).join(this); - return rpt; - }; -} - if (typeof Object.assign !== 'function') { - Object.assign = function(target, varArgs) { // .length of function is 2 + Object.assign = function (target, varArgs) { // .length of function is 2 if (target == null) { // TypeError if undefined or null throw new TypeError('Cannot convert undefined or null to object'); } @@ -78,3 +30,25 @@ if (typeof Object.assign !== 'function') { return to; }; } + +// eslint-disable-next-line consistent-return +(function () { + if (typeof window.CustomEvent === 'function') { + return false; + } + + function CustomEvent(event, params) { + params = params || { bubbles: false, cancelable: false, detail: undefined }; + var evt = document.createEvent('CustomEvent'); + evt.initCustomEvent(event, params.bubbles, params.cancelable, params.detail); + return evt; + } + + CustomEvent.prototype = window.Event.prototype; + + window.CustomEvent = CustomEvent; +})(); + +if ('serviceWorker' in navigator) { + navigator.serviceWorker.register('service-worker.js'); +} diff --git a/scss/main.scss b/scss/main.scss index 5af40ee..351edeb 100644 --- a/scss/main.scss +++ b/scss/main.scss @@ -3,7 +3,6 @@ @import 'custom/variables'; // Mixins -@import 'mixins/shadow'; @import 'mixins/icon'; @import 'mixins/font'; diff --git a/scss/mixins/_shadow.scss b/scss/mixins/_shadow.scss deleted file mode 100644 index 1275832..0000000 --- a/scss/mixins/_shadow.scss +++ /dev/null @@ -1,14 +0,0 @@ -// Original is in LESS and can be found here: https://gist.github.com/gefangenimnetz/3ef3e18364edf105c5af -@mixin shadow($level: 1) { - @if $level == 1 { - box-shadow: 0 1px 3px transparentize($color-black, .88), 0 1px 2px transparentize($color-black, .76); - } @else if $level == 2 { - box-shadow: 0 3px 6px transparentize($color-black, .84), 0 3px 6px transparentize($color-black, .77); - } @else if $level == 3 { - box-shadow: 0 10px 20px transparentize($color-black, .81), 0 6px 6px transparentize($color-black, .77); - } @else if $level == 4 { - box-shadow: 0 14px 28px transparentize($color-black, .75), 0 10px 10px transparentize($color-black, .78); - } @else if $level == 5 { - box-shadow: 0 19px 38px transparentize($color-black, .7), 0 15px 12px transparentize($color-black, .78); - } -} diff --git a/scss/modules/_base.scss b/scss/modules/_base.scss index 933e3c7..35b8ffa 100644 --- a/scss/modules/_base.scss +++ b/scss/modules/_base.scss @@ -22,11 +22,7 @@ h6 { font-weight: bold; } -h1 { - font-size: 2em; - padding: .67em 0; -} - +h1, h2 { font-size: 1.5em; padding: .83em 0; @@ -37,6 +33,7 @@ h3 { padding: 1em 0; } +h1, h2, h3 { padding-left: $button-distance; @@ -57,6 +54,10 @@ img { a { color: $color-online; text-decoration: none; + + &:focus { + color: darken($color-online, 15%); + } } p { @@ -70,3 +71,15 @@ strong { .hide { display: none !important; // sass-lint:disable-line no-important } + +.sr-only { + border: 0; + clip: rect(0, 0, 0, 0); + clip-path: inset(50%); + height: 1px; + overflow: hidden; + padding: 0; + position: absolute; + white-space: nowrap; + width: 1px; +} diff --git a/scss/modules/_button.scss b/scss/modules/_button.scss index 21a7cb5..4987235 100644 --- a/scss/modules/_button.scss +++ b/scss/modules/_button.scss @@ -29,7 +29,8 @@ button { } } - &.active { + &.active, + &:focus { box-shadow: 0 0 0 2px $color-primary; } @@ -37,20 +38,6 @@ button { color: $color-primary; } - @if $shadows == 1 { - &.shadow { - @include shadow(1); - - &:hover { - @include shadow(2); - } - - &:active { - box-shadow: inset 0 5px 20px transparentize($color-black, .81), inset 0 3px 6px transparentize($color-black, .77); - } - } - } - // Tooltip &[data-tooltip] { &::after { @@ -78,9 +65,6 @@ button { &.close { background-color: transparent; border-radius: 0; - @if $shadows == 1 { - box-shadow: none; - } color: transparentize($color-black, .5); float: right; font-size: $button-font-size; @@ -90,3 +74,33 @@ button { width: auto; } } + +// Tooltip +// sass-lint:disable-block nesting-depth +.content, +.sidebar > { + button { + &[aria-label] { + &::after { + background: $color-black; + border-radius: 3px; + color: $color-white; + content: attr(aria-label); + font-family: $font-family; + font-size: $font-size; + padding: 0 12px; + position: absolute; + transform: translate(45px, 52px); + visibility: hidden; + white-space: nowrap; + } + + &:hover { + &::after { + transition: visibility 0s linear .3s; + visibility: visible; + } + } + } + } +} diff --git a/scss/modules/_filter.scss b/scss/modules/_filter.scss index 8e209b0..c484f59 100644 --- a/scss/modules/_filter.scss +++ b/scss/modules/_filter.scss @@ -57,6 +57,10 @@ outline: none; padding: 0 2px; width: 100%; + + &:focus { + background: transparentize($color-primary, .95); + } } button { diff --git a/scss/modules/_infobox.scss b/scss/modules/_infobox.scss index 3a66c45..e7c50c9 100644 --- a/scss/modules/_infobox.scss +++ b/scss/modules/_infobox.scss @@ -1,7 +1,30 @@ .infobox { - .clients { - color: $color-online; - font-family: $font-family-icons; + .clients, + .gateway { + display: flex; + flex-flow: wrap; + + span { + flex-grow: 1; + text-align: center; + } + + .ion-people, + .ion-arrow-right-c { + font-size: 1.5em; + } + } + + .node-links { + table-layout: fixed; + + th, + td { + &:nth-child(3), + &:nth-child(5) { + width: 12%; + } + } } input, diff --git a/scss/modules/_legend.scss b/scss/modules/_legend.scss index 50e96c1..d359c74 100644 --- a/scss/modules/_legend.scss +++ b/scss/modules/_legend.scss @@ -1,5 +1,5 @@ header { - h2 { + h1 { display: inline-block; } } @@ -17,15 +17,21 @@ header { } .legend { - .symbol { - border-radius: 50%; - display: inline-block; - height: 1em; - vertical-align: -5%; - width: 1em; + span { + &:not(:first-child) { + margin-left: 1em; + } } } +.symbol { + border-radius: 50%; + display: inline-block; + height: 1em; + vertical-align: -5%; + width: 1em; +} + // Dot looks compared to thin font a bit darker - lighten it 10% .legend-new { .symbol { @@ -45,7 +51,20 @@ header { } } -.legend-online, -.legend-offline { - margin-left: 1em; +.legend-24ghz { + .symbol { + background-color: $color-24ghz; + } +} + +.legend-5ghz { + .symbol { + background-color: $color-5ghz; + } +} + +.legend-others { + .symbol { + background-color: $color-others; + } } diff --git a/scss/modules/_map.scss b/scss/modules/_map.scss index 8b16adb..8c74a88 100644 --- a/scss/modules/_map.scss +++ b/scss/modules/_map.scss @@ -16,9 +16,10 @@ } @media screen and (max-width: map-get($grid-breakpoints, lg) - 1) { - right: -1rem; + right: .1rem; top: 0; transform: scale(.8); + transform-origin: right; } } diff --git a/scss/modules/_node.scss b/scss/modules/_node.scss index 9e68ce9..a0b1bb1 100644 --- a/scss/modules/_node.scss +++ b/scss/modules/_node.scss @@ -16,6 +16,7 @@ background: $color-new; display: inline-block; height: 1.4em; + max-width: 100%; } label { diff --git a/scss/modules/_proportion.scss b/scss/modules/_proportion.scss index a057c49..754dde8 100644 --- a/scss/modules/_proportion.scss +++ b/scss/modules/_proportion.scss @@ -16,6 +16,7 @@ span { box-sizing: border-box; + color: $color-white; display: inline-block; font-weight: bold; min-width: 1.5em; diff --git a/scss/modules/_sidebar.scss b/scss/modules/_sidebar.scss index 9ab49fb..ba6794a 100644 --- a/scss/modules/_sidebar.scss +++ b/scss/modules/_sidebar.scss @@ -12,6 +12,13 @@ .sidebarhandle { left: $button-distance; transform: scale(-1, 1); + + // sass-lint:disable-block nesting-depth + &[aria-label] { + &::after { + transform: scale(-1, 1) translate(105px, 52px) !important; // sass-lint:disable-line no-important + } + } } @media screen and (max-width: map-get($grid-breakpoints, lg) - 1) { width: auto; @@ -23,7 +30,8 @@ } .node-list, - .node-links { + .node-links, + .link-list { th, td { &:first-child { @@ -40,36 +48,29 @@ } } + .link-list { + th, + td { + &:nth-child(2) { + width: 60%; + } + } + } + .node-links { padding-bottom: 15px; th, td { &:first-child { - width: 50px; - } - } - } - - .link-list { - th, - td { - &:nth-child(1) { - overflow: hidden; - text-overflow: ellipsis; - white-space: nowrap; - width: 66%; + width: 35px; } } } .container { - @if $shadows == 1 { - @include shadow(2); - } @else { - border-right: 1px solid darken($color-white, 10%); - } background: transparentize($color-white, .03); + border-right: 1px solid darken($color-white, 10%); min-height: 100vh; overflow-y: visible; @@ -91,9 +92,6 @@ .container, .infobox { border-radius: 0; - @if $shadows == 1 { - box-shadow: none; - } margin: 0; } } @@ -120,13 +118,19 @@ left: $sidebar-width + 2 * $button-distance; position: fixed; top: $button-distance; - transition: left .5s, box-shadow .5s, color .5s, transform .5s; + transition: left .5s, color .5s, transform .5s; z-index: 1010; - &::after { + &::before { content: '\f124'; padding-right: .125em; } + + &[aria-label] { + &::after { + transform: translate(-45px, 52px) !important; // sass-lint:disable-line no-important + } + } } .online { @@ -136,7 +140,3 @@ .offline { color: $color-offline; } - -.unseen { - color: $color-unseen; -} diff --git a/scss/modules/_table.scss b/scss/modules/_table.scss index bb1224c..beba0dc 100644 --- a/scss/modules/_table.scss +++ b/scss/modules/_table.scss @@ -22,6 +22,16 @@ table { } } +tr { + &.header { + font-size: 1.2em; + + th { + padding-top: 1em; + } + } +} + td, th { line-height: 1.41em; diff --git a/scss/modules/_tabs.scss b/scss/modules/_tabs.scss index 2065139..ee21caf 100644 --- a/scss/modules/_tabs.scss +++ b/scss/modules/_tabs.scss @@ -1,11 +1,7 @@ .tabs { - @if $shadows == 1 { - @include shadow(1); - } @else { - border: 0 solid darken($color-white, 10%); - border-bottom-width: 1px; - } background: transparentize($color-black, .98); + border: 0 solid darken($color-white, 10%); + border-bottom-width: 1px; display: flex; display: -webkit-flex; // sass-lint:disable-line no-vendor-prefixes no-duplicate-properties list-style: none; diff --git a/scss/modules/_variables.scss b/scss/modules/_variables.scss index 6e405eb..59e702a 100644 --- a/scss/modules/_variables.scss +++ b/scss/modules/_variables.scss @@ -9,7 +9,10 @@ $color-primary: #dc0067 !default; $color-new: #459c18 !default; $color-online: #1566a9 !default; $color-offline: #cf3e2a !default; -$color-unseen: #d89100 !default; + +$color-24ghz: $color-primary !default; +$color-5ghz: #e3a619 !default; +$color-others: #0a9c92 !default; $color-map-background: #f8f4f0 !default; @@ -43,8 +46,5 @@ $grid-breakpoints: ( $sidebar-width: map-get($grid-breakpoints, xl) * .45 !default; $sidebar-width-small: map-get($grid-breakpoints, lg) * .45 !default; -// En/disable box-shadows -$shadows: 0 !default; - // En/disable included font $use-included-font: 1 !default; diff --git a/scss/night.scss b/scss/night.scss index e942057..38a7adf 100644 --- a/scss/night.scss +++ b/scss/night.scss @@ -1,4 +1,4 @@ -// Overwrite normal style (colors) - shadows are ignored +// Overwrite normal style (colors) @import 'modules/variables'; @import 'custom/variables'; diff --git a/service-worker.js b/service-worker.js new file mode 100644 index 0000000..c34c979 --- /dev/null +++ b/service-worker.js @@ -0,0 +1,23 @@ +self.addEventListener('install', function (event) { + var offlineRequest = new Request('offline.html'); + event.waitUntil( + fetch(offlineRequest).then(function (response) { + return caches.open('offline').then(function (cache) { + return cache.put(offlineRequest, response); + }); + }) + ); +}); + +self.addEventListener('fetch', function (event) { + var request = event.request; + if (request.method === 'GET') { + event.respondWith( + fetch(request).catch(function () { + return caches.open('offline').then(function (cache) { + return cache.match('offline.html'); + }); + }) + ); + } +}); diff --git a/yarn.lock b/yarn.lock index 8b8d40e..8cfc4ec 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2,6 +2,82 @@ # yarn lockfile v1 +"@babel/code-frame@7.0.0-beta.42", "@babel/code-frame@^7.0.0-beta.40": + version "7.0.0-beta.42" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.0.0-beta.42.tgz#a9c83233fa7cd06b39dc77adbb908616ff4f1962" + dependencies: + "@babel/highlight" "7.0.0-beta.42" + +"@babel/generator@7.0.0-beta.42": + version "7.0.0-beta.42" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.0.0-beta.42.tgz#777bb50f39c94a7e57f73202d833141f8159af33" + dependencies: + "@babel/types" "7.0.0-beta.42" + jsesc "^2.5.1" + lodash "^4.2.0" + source-map "^0.5.0" + trim-right "^1.0.1" + +"@babel/helper-function-name@7.0.0-beta.42": + version "7.0.0-beta.42" + resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.0.0-beta.42.tgz#b38b8f4f85168d1812c543dd700b5d549b0c4658" + dependencies: + "@babel/helper-get-function-arity" "7.0.0-beta.42" + "@babel/template" "7.0.0-beta.42" + "@babel/types" "7.0.0-beta.42" + +"@babel/helper-get-function-arity@7.0.0-beta.42": + version "7.0.0-beta.42" + resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0-beta.42.tgz#ad072e32f912c033053fc80478169aeadc22191e" + dependencies: + "@babel/types" "7.0.0-beta.42" + +"@babel/helper-split-export-declaration@7.0.0-beta.42": + version "7.0.0-beta.42" + resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.0.0-beta.42.tgz#0d0d5254220a9cc4e7e226240306b939dc210ee7" + dependencies: + "@babel/types" "7.0.0-beta.42" + +"@babel/highlight@7.0.0-beta.42": + version "7.0.0-beta.42" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.0.0-beta.42.tgz#a502a1c0d6f99b2b0e81d468a1b0c0e81e3f3623" + dependencies: + chalk "^2.0.0" + esutils "^2.0.2" + js-tokens "^3.0.0" + +"@babel/template@7.0.0-beta.42": + version "7.0.0-beta.42" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.0.0-beta.42.tgz#7186d4e70d44cdec975049ba0a73bdaf5cdee052" + dependencies: + "@babel/code-frame" "7.0.0-beta.42" + "@babel/types" "7.0.0-beta.42" + babylon "7.0.0-beta.42" + lodash "^4.2.0" + +"@babel/traverse@^7.0.0-beta.40": + version "7.0.0-beta.42" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.0.0-beta.42.tgz#f4bf4d1e33d41baf45205e2d0463591d57326285" + dependencies: + "@babel/code-frame" "7.0.0-beta.42" + "@babel/generator" "7.0.0-beta.42" + "@babel/helper-function-name" "7.0.0-beta.42" + "@babel/helper-split-export-declaration" "7.0.0-beta.42" + "@babel/types" "7.0.0-beta.42" + babylon "7.0.0-beta.42" + debug "^3.1.0" + globals "^11.1.0" + invariant "^2.2.0" + lodash "^4.2.0" + +"@babel/types@7.0.0-beta.42", "@babel/types@^7.0.0-beta.40": + version "7.0.0-beta.42" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.0.0-beta.42.tgz#1e2118767684880f6963801b272fd2b3348efacc" + dependencies: + esutils "^2.0.2" + lodash "^4.2.0" + to-fast-properties "^2.0.0" + "@gulp-sourcemaps/identity-map@1.X": version "1.0.1" resolved "https://registry.yarnpkg.com/@gulp-sourcemaps/identity-map/-/identity-map-1.0.1.tgz#cfa23bc5840f9104ce32a65e74db7e7a974bbee1" @@ -20,48 +96,42 @@ through2 "^2.0.3" abbrev@1: - version "1.1.0" - resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.0.tgz#d0554c2256636e2f56e7c2e5ad183f859428d81f" + version "1.1.1" + resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" -accepts@1.3.3, accepts@~1.3.3: - version "1.3.3" - resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.3.tgz#c3ca7434938648c3e0d9c1e328dd68b622c284ca" +accepts@~1.3.3, accepts@~1.3.4: + version "1.3.5" + resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.5.tgz#eb777df6011723a3b14e8a72c0805c8e86746bd2" dependencies: - mime-types "~2.1.11" + mime-types "~2.1.18" negotiator "0.6.1" -acorn-jsx@^3.0.0, acorn-jsx@^3.0.1: +acorn-jsx@^3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-3.0.1.tgz#afdf9488fb1ecefc8348f6fb22f464e32a58b36b" dependencies: acorn "^3.0.4" -acorn-object-spread@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/acorn-object-spread/-/acorn-object-spread-1.0.0.tgz#48ead0f4a8eb16995a17a0db9ffc6acaada4ba68" - dependencies: - acorn "^3.1.0" +acorn@5.X, acorn@^5.0.3, acorn@^5.5.0: + version "5.5.3" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.5.3.tgz#f473dd47e0277a08e28e9bec5aeeb04751f0b8c9" -acorn@4.X: - version "4.0.11" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-4.0.11.tgz#edcda3bd937e7556410d42ed5860f67399c794c0" - -acorn@^3.0.4, acorn@^3.1.0: +acorn@^3.0.4: version "3.3.0" resolved "https://registry.yarnpkg.com/acorn/-/acorn-3.3.0.tgz#45e37fb39e8da3f25baee3ff5369e2bb5f22017a" -acorn@^5.0.1, acorn@^5.0.3: - version "5.0.3" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.0.3.tgz#c460df08491463f028ccb82eab3730bf01087b3d" - -after@0.8.1: - version "0.8.1" - resolved "https://registry.yarnpkg.com/after/-/after-0.8.1.tgz#ab5d4fb883f596816d3515f8f791c0af486dd627" +after@0.8.2: + version "0.8.2" + resolved "https://registry.yarnpkg.com/after/-/after-0.8.2.tgz#fedb394f9f0e02aa9768e702bda23b505fae7e1f" ajv-keywords@^1.0.0: version "1.5.1" resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-1.5.1.tgz#314dd0a4b3368fad3dfcdc54ede6171b886daf3c" +ajv-keywords@^2.1.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-2.1.1.tgz#617997fc5f60576894c435f940d819e135b80762" + ajv@^4.7.0, ajv@^4.9.1: version "4.11.8" resolved "https://registry.yarnpkg.com/ajv/-/ajv-4.11.8.tgz#82ffb02b29e662ae53bdc20af15947706739c536" @@ -69,13 +139,14 @@ ajv@^4.7.0, ajv@^4.9.1: co "^4.6.0" json-stable-stringify "^1.0.1" -align-text@^0.1.1, align-text@^0.1.3: - version "0.1.4" - resolved "https://registry.yarnpkg.com/align-text/-/align-text-0.1.4.tgz#0cd90a561093f35d0a99256c22b7069433fad117" +ajv@^5.1.0, ajv@^5.2.3, ajv@^5.3.0: + version "5.5.2" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-5.5.2.tgz#73b5eeca3fab653e3d3f9422b341ad42205dc965" dependencies: - kind-of "^3.0.2" - longest "^1.0.1" - repeat-string "^1.5.2" + co "^4.6.0" + fast-deep-equal "^1.0.0" + fast-json-stable-stringify "^2.0.0" + json-schema-traverse "^0.3.0" almond@^0.3.3: version "0.3.3" @@ -85,32 +156,80 @@ amdefine@>=0.0.4: version "1.0.1" resolved "https://registry.yarnpkg.com/amdefine/-/amdefine-1.0.1.tgz#4a5282ac164729e93619bcfd3ad151f817ce91f5" +ansi-colors@^1.0.1: + version "1.1.0" + resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-1.1.0.tgz#6374b4dd5d4718ff3ce27a671a3b1cad077132a9" + dependencies: + ansi-wrap "^0.1.0" + +ansi-cyan@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/ansi-cyan/-/ansi-cyan-0.1.1.tgz#538ae528af8982f28ae30d86f2f17456d2609873" + dependencies: + ansi-wrap "0.1.0" + ansi-escapes@^1.1.0: version "1.4.0" resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-1.4.0.tgz#d3a8a83b319aa67793662b13e761c7911422306e" +ansi-escapes@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-3.0.0.tgz#ec3e8b4e9f8064fc02c3ac9b65f1c275bda8ef92" + +ansi-gray@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/ansi-gray/-/ansi-gray-0.1.1.tgz#2962cf54ec9792c48510a3deb524436861ef7251" + dependencies: + ansi-wrap "0.1.0" + +ansi-red@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/ansi-red/-/ansi-red-0.1.1.tgz#8c638f9d1080800a353c9c28c8a81ca4705d946c" + dependencies: + ansi-wrap "0.1.0" + ansi-regex@^2.0.0: version "2.1.1" resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" +ansi-regex@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998" + ansi-styles@^2.2.1: version "2.2.1" resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" +ansi-styles@^3.2.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" + dependencies: + color-convert "^1.9.0" + +ansi-wrap@0.1.0, ansi-wrap@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/ansi-wrap/-/ansi-wrap-0.1.0.tgz#a82250ddb0015e9a27ca82e82ea603bbfa45efaf" + any-promise@^1.1.0: version "1.3.0" resolved "https://registry.yarnpkg.com/any-promise/-/any-promise-1.3.0.tgz#abc6afeedcea52e809cdc0376aed3ce39635d17f" anymatch@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-1.3.0.tgz#a3e52fa39168c825ff57b0248126ce5a8ff95507" + version "1.3.2" + resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-1.3.2.tgz#553dcb8f91e3c889845dfdba34c77721b90b9d7a" dependencies: - arrify "^1.0.0" micromatch "^2.1.5" + normalize-path "^2.0.0" + +append-buffer@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/append-buffer/-/append-buffer-1.0.2.tgz#d8220cf466081525efea50614f3de6514dfa58f1" + dependencies: + buffer-equal "^1.0.0" aproba@^1.0.3: - version "1.1.1" - resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.1.1.tgz#95d3600f07710aa0e9298c726ad5ecf2eacbabab" + version "1.2.0" + resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a" archy@^1.0.0: version "1.0.0" @@ -124,33 +243,48 @@ are-we-there-yet@~1.1.2: readable-stream "^2.0.6" argparse@^1.0.7: - version "1.0.9" - resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.9.tgz#73d83bc263f86e97f8cc4f6bae1b0e90a7d22c86" + version "1.0.10" + resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" dependencies: sprintf-js "~1.0.2" +arr-diff@^1.0.1: + version "1.1.0" + resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-1.1.0.tgz#687c32758163588fef7de7b36fabe495eb1a399a" + dependencies: + arr-flatten "^1.0.1" + array-slice "^0.2.3" + arr-diff@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-2.0.0.tgz#8f3b827f955a8bd669697e4a4256ac3ceae356cf" dependencies: arr-flatten "^1.0.1" +arr-diff@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-4.0.0.tgz#d6461074febfec71e7e15235761a329a5dc7c520" + arr-filter@^1.1.1: version "1.1.2" resolved "https://registry.yarnpkg.com/arr-filter/-/arr-filter-1.1.2.tgz#43fdddd091e8ef11aa4c45d9cdc18e2dff1711ee" dependencies: make-iterator "^1.0.0" -arr-flatten@^1.0.1: - version "1.0.3" - resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.0.3.tgz#a274ed85ac08849b6bd7847c4580745dc51adfb1" +arr-flatten@^1.0.1, arr-flatten@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.1.0.tgz#36048bbff4e7b47e136644316c99669ea5ae91f1" -arr-map@^2.0.0: +arr-map@^2.0.0, arr-map@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/arr-map/-/arr-map-2.0.2.tgz#3a77345ffc1cf35e2a91825601f9e58f2e24cac4" dependencies: make-iterator "^1.0.0" +arr-union@^2.0.1: + version "2.1.0" + resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-2.1.0.tgz#20f9eab5ec70f5c7d215b1077b1c39161d292c7d" + arr-union@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-3.1.0.tgz#e39b09aea9def866a8f206e288af63919bae39c4" @@ -159,10 +293,6 @@ array-differ@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/array-differ/-/array-differ-1.0.0.tgz#eff52e3758249d33be402b8bb8e564bb2b5d4031" -array-each@^0.1.0: - version "0.1.1" - resolved "https://registry.yarnpkg.com/array-each/-/array-each-0.1.1.tgz#c5d52ba8225f36d728178ba7aec413acfaddd0f9" - array-each@^1.0.0, array-each@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/array-each/-/array-each-1.0.1.tgz#a794af0c05ab1752846ee753a1f211a05ba0c44f" @@ -171,26 +301,41 @@ array-find-index@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/array-find-index/-/array-find-index-1.0.2.tgz#df010aa1287e164bbda6f9723b0a96a1ec4187a1" -array-initial@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/array-initial/-/array-initial-1.0.0.tgz#09b13c58d56a050342e777ab6ffce595b108dad9" +array-includes@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.0.3.tgz#184b48f62d92d7452bb31b323165c7f8bd02266d" dependencies: - array-slice "^0.2.2" - is-number "^0.1.1" + define-properties "^1.1.2" + es-abstract "^1.7.0" + +array-initial@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/array-initial/-/array-initial-1.1.0.tgz#2fa74b26739371c3947bd7a7adc73be334b3d795" + dependencies: + array-slice "^1.0.0" + is-number "^4.0.0" array-last@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/array-last/-/array-last-1.1.1.tgz#f4658f988d921326b58ad0113cf76d337c7b20aa" + version "1.3.0" + resolved "https://registry.yarnpkg.com/array-last/-/array-last-1.3.0.tgz#7aa77073fec565ddab2493f5f88185f404a9d336" dependencies: - is-number "^0.1.1" + is-number "^4.0.0" -array-slice@^0.2.2, array-slice@^0.2.3: +array-slice@^0.2.3: version "0.2.3" resolved "https://registry.yarnpkg.com/array-slice/-/array-slice-0.2.3.tgz#dd3cfb80ed7973a75117cdac69b0b99ec86186f5" array-slice@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/array-slice/-/array-slice-1.1.0.tgz#e368ea15f89bc7069f7ffb89aec3a6c7d4ac22d4" + +array-sort@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/array-slice/-/array-slice-1.0.0.tgz#e73034f00dcc1f40876008fd20feae77bd4b7c2f" + resolved "https://registry.yarnpkg.com/array-sort/-/array-sort-1.0.0.tgz#e4c05356453f56f53512a7d1d6123f2c54c0a88a" + dependencies: + default-compare "^1.0.0" + get-value "^2.0.6" + kind-of "^5.0.2" array-union@^1.0.1: version "1.0.2" @@ -206,14 +351,22 @@ array-unique@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.2.1.tgz#a1d97ccafcbc2625cc70fadceb36a50c58b01a53" -arraybuffer.slice@0.0.6: - version "0.0.6" - resolved "https://registry.yarnpkg.com/arraybuffer.slice/-/arraybuffer.slice-0.0.6.tgz#f33b2159f0532a3f3107a272c0ccfbd1ad2979ca" +array-unique@^0.3.2: + version "0.3.2" + resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428" + +arraybuffer.slice@~0.0.7: + version "0.0.7" + resolved "https://registry.yarnpkg.com/arraybuffer.slice/-/arraybuffer.slice-0.0.7.tgz#3bbc4275dd584cc1b10809b89d4e8b63a69e7675" arrify@^1.0.0, arrify@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" +asap@~2.0.3: + version "2.0.6" + resolved "https://registry.yarnpkg.com/asap/-/asap-2.0.6.tgz#e50347611d7e690943208bbdafebcbc2fb866d46" + asn1@~0.2.3: version "0.2.3" resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.3.tgz#dac8787713c9966849fc8180777ebe9c1ddf3b86" @@ -226,13 +379,17 @@ assert-plus@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-0.2.0.tgz#d74e1b87e7affc0db8aadb7021f3fe48101ab234" +assign-symbols@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367" + async-done@^1.2.0, async-done@^1.2.2: - version "1.2.2" - resolved "https://registry.yarnpkg.com/async-done/-/async-done-1.2.2.tgz#ba4280da55a16e15f4bb8bf3a844a91878740e31" + version "1.2.4" + resolved "https://registry.yarnpkg.com/async-done/-/async-done-1.2.4.tgz#17b0fcefb9a33cb9de63daa8904c0a65bd535fa0" dependencies: end-of-stream "^1.1.0" - next-tick "^1.0.0" once "^1.3.2" + process-nextick-args "^1.0.7" stream-exhaust "^1.0.1" async-each-series@0.1.1: @@ -247,13 +404,23 @@ async-foreach@^0.1.3: version "0.1.3" resolved "https://registry.yarnpkg.com/async-foreach/-/async-foreach-0.1.3.tgz#36121f845c0578172de419a97dbeb1d16ec34542" +async-limiter@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/async-limiter/-/async-limiter-1.0.0.tgz#78faed8c3d074ab81f22b4e985d79e8738f720f8" + async-settle@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/async-settle/-/async-settle-1.0.0.tgz#1d0a914bb02575bec8a8f3a74e5080f72b2c0c6b" dependencies: async-done "^1.2.2" -async@*, async@1.5.2: +async@*: + version "2.6.0" + resolved "https://registry.yarnpkg.com/async/-/async-2.6.0.tgz#61a29abb6fcc026fea77e56d1c6ec53a795951f4" + dependencies: + lodash "^4.14.0" + +async@1.5.2: version "1.5.2" resolved "https://registry.yarnpkg.com/async/-/async-1.5.2.tgz#ec6a61ae56480c0c3cb241c95618e20892f9672a" @@ -261,89 +428,63 @@ asynckit@^0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" +atob@^2.0.0: + version "2.0.3" + resolved "https://registry.yarnpkg.com/atob/-/atob-2.0.3.tgz#19c7a760473774468f20b2d2d03372ad7d4cbf5d" + atob@~1.1.0: version "1.1.3" resolved "https://registry.yarnpkg.com/atob/-/atob-1.1.3.tgz#95f13629b12c3a51a5d215abdce2aa9f32f80773" -autoprefixer@^6.0.0: - version "6.7.7" - resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-6.7.7.tgz#1dbd1c835658e35ce3f9984099db00585c782014" +autoprefixer@^8.0.0: + version "8.2.0" + resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-8.2.0.tgz#1e49b611b31a5259b86b7a6b2b1b8faf091abe2a" dependencies: - browserslist "^1.7.6" - caniuse-db "^1.0.30000634" + browserslist "^3.2.0" + caniuse-lite "^1.0.30000817" normalize-range "^0.1.2" num2fraction "^1.2.2" - postcss "^5.2.16" + postcss "^6.0.20" postcss-value-parser "^3.2.3" aws-sign2@~0.6.0: version "0.6.0" resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.6.0.tgz#14342dd38dbcc94d0e5b87d763cd63612c0e794f" -aws4@^1.2.1: +aws-sign2@~0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.7.0.tgz#b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8" + +aws4@^1.2.1, aws4@^1.6.0: version "1.6.0" resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.6.0.tgz#83ef5ca860b2b32e4a0deedee8c771b9db57471e" -babel-code-frame@^6.16.0, babel-code-frame@^6.22.0: - version "6.22.0" - resolved "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-6.22.0.tgz#027620bee567a88c32561574e7fd0801d33118e4" +babel-code-frame@^6.22.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-6.26.0.tgz#63fd43f7dc1e3bb7ce35947db8fe369a3f58c74b" dependencies: - chalk "^1.1.0" + chalk "^1.1.3" esutils "^2.0.2" - js-tokens "^3.0.0" + js-tokens "^3.0.2" -babel-eslint@^7.2.3: - version "7.2.3" - resolved "https://registry.yarnpkg.com/babel-eslint/-/babel-eslint-7.2.3.tgz#b2fe2d80126470f5c19442dc757253a897710827" +babel-eslint@^8.2.2: + version "8.2.2" + resolved "http://registry.npmjs.org/babel-eslint/-/babel-eslint-8.2.2.tgz#1102273354c6f0b29b4ea28a65f97d122296b68b" dependencies: - babel-code-frame "^6.22.0" - babel-traverse "^6.23.1" - babel-types "^6.23.0" - babylon "^6.17.0" + "@babel/code-frame" "^7.0.0-beta.40" + "@babel/traverse" "^7.0.0-beta.40" + "@babel/types" "^7.0.0-beta.40" + babylon "^7.0.0-beta.40" + eslint-scope "~3.7.1" + eslint-visitor-keys "^1.0.0" -babel-messages@^6.23.0: - version "6.23.0" - resolved "https://registry.yarnpkg.com/babel-messages/-/babel-messages-6.23.0.tgz#f3cdf4703858035b2a2951c6ec5edf6c62f2630e" - dependencies: - babel-runtime "^6.22.0" - -babel-runtime@^6.22.0: - version "6.23.0" - resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.23.0.tgz#0a9489f144de70efb3ce4300accdb329e2fc543b" - dependencies: - core-js "^2.4.0" - regenerator-runtime "^0.10.0" - -babel-traverse@^6.23.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-traverse/-/babel-traverse-6.24.1.tgz#ab36673fd356f9a0948659e7b338d5feadb31695" - dependencies: - babel-code-frame "^6.22.0" - babel-messages "^6.23.0" - babel-runtime "^6.22.0" - babel-types "^6.24.1" - babylon "^6.15.0" - debug "^2.2.0" - globals "^9.0.0" - invariant "^2.2.0" - lodash "^4.2.0" - -babel-types@^6.23.0, babel-types@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-types/-/babel-types-6.24.1.tgz#a136879dc15b3606bda0d90c1fc74304c2ff0975" - dependencies: - babel-runtime "^6.22.0" - esutils "^2.0.2" - lodash "^4.2.0" - to-fast-properties "^1.0.1" - -babylon@^6.15.0, babylon@^6.17.0: - version "6.17.0" - resolved "https://registry.yarnpkg.com/babylon/-/babylon-6.17.0.tgz#37da948878488b9c4e3c4038893fa3314b3fc932" +babylon@7.0.0-beta.42, babylon@^7.0.0-beta.40: + version "7.0.0-beta.42" + resolved "https://registry.yarnpkg.com/babylon/-/babylon-7.0.0-beta.42.tgz#67cfabcd4f3ec82999d29031ccdea89d0ba99657" bach@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/bach/-/bach-1.1.0.tgz#cfe542db925cb37051fc490ad102c73bcb258a84" + version "1.2.0" + resolved "https://registry.yarnpkg.com/bach/-/bach-1.2.0.tgz#4b3ce96bf27134f79a1b414a51c14e34c3bd9880" dependencies: arr-filter "^1.1.1" arr-flatten "^1.0.1" @@ -353,23 +494,35 @@ bach@^1.0.0: array-last "^1.1.1" async-done "^1.2.2" async-settle "^1.0.0" - now-and-later "^1.0.0" + now-and-later "^2.0.0" backo2@1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/backo2/-/backo2-1.0.2.tgz#31ab1ac8b129363463e35b3ebb69f4dfcfba7947" -balanced-match@^0.4.1: - version "0.4.2" - resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-0.4.2.tgz#cb3f3e3c732dc0f01ee70b403f302e61d7709838" +balanced-match@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" base64-arraybuffer@0.1.5: version "0.1.5" resolved "https://registry.yarnpkg.com/base64-arraybuffer/-/base64-arraybuffer-0.1.5.tgz#73926771923b5a19747ad666aa5cd4bf9c6e9ce8" -base64id@0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/base64id/-/base64id-0.1.0.tgz#02ce0fdeee0cef4f40080e1e73e834f0b1bfce3f" +base64id@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/base64id/-/base64id-1.0.0.tgz#47688cb99bb6804f0e06d3e763b1c32e57d8e6b6" + +base@^0.11.1: + version "0.11.2" + resolved "https://registry.yarnpkg.com/base/-/base-0.11.2.tgz#7bde5ced145b6d551a90db87f83c558b4eb48a8f" + dependencies: + cache-base "^1.0.1" + class-utils "^0.3.5" + component-emitter "^1.2.1" + define-property "^1.0.0" + isobject "^3.0.1" + mixin-deep "^1.2.0" + pascalcase "^0.1.1" batch@0.5.3: version "0.5.3" @@ -392,8 +545,8 @@ better-assert@~1.0.0: callsite "1.0.0" binary-extensions@^1.0.0: - version "1.8.0" - resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.8.0.tgz#48ec8d16df4377eae5fa5884682480af4d95c774" + version "1.11.0" + resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.11.0.tgz#46aa1751fb6a2f93ee5e689bb1087d4b14c6c205" binary@~0.3.0: version "0.3.0" @@ -422,11 +575,23 @@ boom@2.x.x: dependencies: hoek "2.x.x" -brace-expansion@^1.0.0: - version "1.1.7" - resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.7.tgz#3effc3c50e000531fb720eaff80f0ae8ef23cf59" +boom@4.x.x: + version "4.3.1" + resolved "https://registry.yarnpkg.com/boom/-/boom-4.3.1.tgz#4f8a3005cb4a7e3889f749030fd25b96e01d2e31" dependencies: - balanced-match "^0.4.1" + hoek "4.x.x" + +boom@5.x.x: + version "5.2.0" + resolved "https://registry.yarnpkg.com/boom/-/boom-5.2.0.tgz#5dd9da6ee3a5f302077436290cb717d3f4a54e02" + dependencies: + hoek "4.x.x" + +brace-expansion@^1.1.7: + version "1.1.11" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" + dependencies: + balanced-match "^1.0.0" concat-map "0.0.1" braces@^1.8.2: @@ -437,41 +602,53 @@ braces@^1.8.2: preserve "^0.2.0" repeat-element "^1.1.2" -browser-sync-client@2.4.5: - version "2.4.5" - resolved "https://registry.yarnpkg.com/browser-sync-client/-/browser-sync-client-2.4.5.tgz#976afab1a54f255baa38fe22ae3c0d3753ad337b" +braces@^2.3.1: + version "2.3.1" + resolved "https://registry.yarnpkg.com/braces/-/braces-2.3.1.tgz#7086c913b4e5a08dbe37ac0ee6a2500c4ba691bb" dependencies: - etag "^1.7.0" - fresh "^0.3.0" + arr-flatten "^1.1.0" + array-unique "^0.3.2" + define-property "^1.0.0" + extend-shallow "^2.0.1" + fill-range "^4.0.0" + isobject "^3.0.1" + kind-of "^6.0.2" + repeat-element "^1.1.2" + snapdragon "^0.8.1" + snapdragon-node "^2.0.1" + split-string "^3.0.2" + to-regex "^3.0.1" -browser-sync-ui@0.6.3: - version "0.6.3" - resolved "https://registry.yarnpkg.com/browser-sync-ui/-/browser-sync-ui-0.6.3.tgz#640a537c180689303d5be92bc476b9ebc441c0bc" +browser-sync-ui@v1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/browser-sync-ui/-/browser-sync-ui-1.0.1.tgz#9740527b26d1d7ace259acc0c79e5b5e37d0fdf2" dependencies: async-each-series "0.1.1" connect-history-api-fallback "^1.1.0" immutable "^3.7.6" server-destroy "1.0.1" + socket.io-client "2.0.4" stream-throttle "^0.1.3" - weinre "^2.0.0-pre-I0Z7U9OV" -browser-sync@^2.18.8: - version "2.18.8" - resolved "https://registry.yarnpkg.com/browser-sync/-/browser-sync-2.18.8.tgz#2fb4de253798d7cfb839afb9c2f801968490cec2" +browser-sync@^2.23.6: + version "2.23.6" + resolved "https://registry.yarnpkg.com/browser-sync/-/browser-sync-2.23.6.tgz#ed0721c92e5b98c71b7bf839b39092ac9f220650" dependencies: - browser-sync-client "2.4.5" - browser-sync-ui "0.6.3" + browser-sync-ui v1.0.1 bs-recipes "1.3.4" - chokidar "1.6.1" + chokidar "1.7.0" connect "3.5.0" + connect-history-api-fallback "^1.5.0" dev-ip "^1.0.1" easy-extender "2.3.2" eazy-logger "3.0.2" emitter-steward "^1.0.0" - fs-extra "1.0.0" + etag "^1.8.1" + fresh "^0.5.2" + fs-extra "3.0.1" http-proxy "1.15.2" - immutable "3.8.1" - localtunnel "1.8.2" + immutable "3.8.2" + localtunnel "1.8.3" micromatch "2.3.11" opn "4.0.2" portscanner "2.1.1" @@ -479,54 +656,38 @@ browser-sync@^2.18.8: resp-modifier "6.0.2" rx "4.1.0" serve-index "1.8.0" - serve-static "1.11.1" + serve-static "1.12.2" server-destroy "1.0.1" - socket.io "1.6.0" - socket.io-client "1.6.0" + socket.io "2.0.4" ua-parser-js "0.7.12" yargs "6.4.0" -browserslist@^1.7.6: - version "1.7.7" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-1.7.7.tgz#0bd76704258be829b2398bb50e4b62d1a166b0b9" +browserslist@^3.2.0: + version "3.2.1" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-3.2.1.tgz#4960a45fbfe39b2be36fe5ba07cce9ea32c8221c" dependencies: - caniuse-db "^1.0.30000639" - electron-to-chromium "^1.2.7" + caniuse-lite "^1.0.30000819" + electron-to-chromium "^1.3.40" bs-recipes@1.3.4: version "1.3.4" resolved "https://registry.yarnpkg.com/bs-recipes/-/bs-recipes-1.3.4.tgz#0d2d4d48a718c8c044769fdc4f89592dc8b69585" -buble@^0.12.0: - version "0.12.5" - resolved "https://registry.yarnpkg.com/buble/-/buble-0.12.5.tgz#c66ffe92f9f4a3c65d3256079b711e2bd0bc5013" - dependencies: - acorn "^3.1.0" - acorn-jsx "^3.0.1" - acorn-object-spread "^1.0.0" - chalk "^1.1.3" - magic-string "^0.14.0" - minimist "^1.2.0" - os-homedir "^1.0.1" - -bubleify@^0.5.1: - version "0.5.1" - resolved "https://registry.yarnpkg.com/bubleify/-/bubleify-0.5.1.tgz#f65c47cee31b80cad8b9e747bbe187d7fe51e927" - dependencies: - buble "^0.12.0" - object-assign "^4.0.1" - -buffer-shims@~1.0.0: +buffer-equal@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/buffer-shims/-/buffer-shims-1.0.0.tgz#9978ce317388c649ad8793028c3477ef044a8b51" + resolved "https://registry.yarnpkg.com/buffer-equal/-/buffer-equal-1.0.0.tgz#59616b498304d556abd466966b22eeda3eca5fbe" + +buffer-from@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.0.0.tgz#4cb8832d23612589b0406e9e2956c17f06fdf531" buffers@~0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/buffers/-/buffers-0.1.1.tgz#b24579c3bed4d6d396aeee6d9a8ae7f5482ab7bb" -bufferstreams@^1.1.0, bufferstreams@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/bufferstreams/-/bufferstreams-1.1.1.tgz#0161373060ac5988eff99058731114f6e195d51e" +bufferstreams@^1.1.0: + version "1.1.3" + resolved "https://registry.yarnpkg.com/bufferstreams/-/bufferstreams-1.1.3.tgz#a8515ac024fa90e8fa7d58c11b13dea1f28abe72" dependencies: readable-stream "^2.0.2" @@ -534,9 +695,23 @@ builtin-modules@^1.0.0: version "1.1.1" resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-1.1.1.tgz#270f076c5a72c02f5b65a47df94c5fe3a278892f" -cachebust@2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/cachebust/-/cachebust-2.0.1.tgz#dbe7dd8576785d0594f210f1411c44f4a9257269" +cache-base@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/cache-base/-/cache-base-1.0.1.tgz#0a7f46416831c8b662ee36fe4e7c59d76f666ab2" + dependencies: + collection-visit "^1.0.0" + component-emitter "^1.2.1" + get-value "^2.0.6" + has-value "^1.0.0" + isobject "^3.0.1" + set-value "^2.0.0" + to-object-path "^0.3.0" + union-value "^1.0.0" + unset-value "^1.0.0" + +cachebust@2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/cachebust/-/cachebust-2.3.0.tgz#d9b050194d847c3c12662c5dc1a0db2b59bd7296" dependencies: cheerio "^0.19.0" md5 "^2.0.0" @@ -569,7 +744,7 @@ camelcase-keys@^2.0.0: camelcase "^2.0.0" map-obj "^1.0.0" -camelcase@^1.0.2, camelcase@^1.2.1: +camelcase@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-1.2.1.tgz#9bb5304d2e0b56698b2c758b08a3eaa9daa58a39" @@ -581,9 +756,9 @@ camelcase@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-3.0.0.tgz#32fc4b9fcdaf845fcdf7e73bb97cac2261f0ab0a" -caniuse-db@^1.0.30000634, caniuse-db@^1.0.30000639: - version "1.0.30000665" - resolved "https://registry.yarnpkg.com/caniuse-db/-/caniuse-db-1.0.30000665.tgz#e84f4277935f295f546f8533cb0b410a8415b972" +caniuse-lite@^1.0.30000817, caniuse-lite@^1.0.30000819: + version "1.0.30000819" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30000819.tgz#aabee5fd15a080febab6ae5d30c9ea15f4c6d4e2" caseless@~0.11.0: version "0.11.0" @@ -593,20 +768,13 @@ caseless@~0.12.0: version "0.12.0" resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" -center-align@^0.1.1: - version "0.1.3" - resolved "https://registry.yarnpkg.com/center-align/-/center-align-0.1.3.tgz#aa0d32629b6ee972200411cbd4461c907bc2b7ad" - dependencies: - align-text "^0.1.3" - lazy-cache "^1.0.3" - chainsaw@~0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/chainsaw/-/chainsaw-0.1.0.tgz#5eab50b28afe58074d0d58291388828b5e5fbc98" dependencies: traverse ">=0.3.0 <0.4" -chalk@^1.0.0, chalk@^1.1.0, chalk@^1.1.1, chalk@^1.1.3: +chalk@^1.0.0, chalk@^1.1.1, chalk@^1.1.3: version "1.1.3" resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" dependencies: @@ -616,11 +784,44 @@ chalk@^1.0.0, chalk@^1.1.0, chalk@^1.1.1, chalk@^1.1.3: strip-ansi "^3.0.0" supports-color "^2.0.0" +chalk@^2.0.0, chalk@^2.1.0, chalk@^2.3.2: + version "2.3.2" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.3.2.tgz#250dc96b07491bfd601e648d66ddf5f60c7a5c65" + dependencies: + ansi-styles "^3.2.1" + escape-string-regexp "^1.0.5" + supports-color "^5.3.0" + +chardet@^0.4.0: + version "0.4.2" + resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.4.2.tgz#b5473b33dc97c424e5d98dc87d55d4d8a29c8bf2" + charenc@~0.0.1: version "0.0.2" resolved "https://registry.yarnpkg.com/charenc/-/charenc-0.0.2.tgz#c0a1d2f3a7092e03774bfa83f14c0fc5790a8667" -cheerio@*, cheerio@^0.19.0: +cheerio@*: + version "0.22.0" + resolved "https://registry.yarnpkg.com/cheerio/-/cheerio-0.22.0.tgz#a9baa860a3f9b595a6b81b1a86873121ed3a269e" + dependencies: + css-select "~1.2.0" + dom-serializer "~0.1.0" + entities "~1.1.1" + htmlparser2 "^3.9.1" + lodash.assignin "^4.0.9" + lodash.bind "^4.1.4" + lodash.defaults "^4.0.1" + lodash.filter "^4.4.0" + lodash.flatten "^4.2.0" + lodash.foreach "^4.3.0" + lodash.map "^4.4.0" + lodash.merge "^4.4.0" + lodash.pick "^4.2.1" + lodash.reduce "^4.4.0" + lodash.reject "^4.4.0" + lodash.some "^4.4.0" + +cheerio@^0.19.0: version "0.19.0" resolved "https://registry.yarnpkg.com/cheerio/-/cheerio-0.19.0.tgz#772e7015f2ee29965096d71ea4175b75ab354925" dependencies: @@ -630,9 +831,9 @@ cheerio@*, cheerio@^0.19.0: htmlparser2 "~3.8.1" lodash "^3.2.0" -chokidar@1.6.1, chokidar@^1.4.3: - version "1.6.1" - resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-1.6.1.tgz#2f4447ab5e96e50fb3d789fd90d4c72e0e4c70c2" +chokidar@1.7.0, chokidar@^1.4.3: + version "1.7.0" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-1.7.0.tgz#798e689778151c8076b4b360e5edd28cda2bb468" dependencies: anymatch "^1.3.0" async-each "^1.0.0" @@ -646,18 +847,27 @@ chokidar@1.6.1, chokidar@^1.4.3: fsevents "^1.0.0" circular-json@^0.3.1: - version "0.3.1" - resolved "https://registry.yarnpkg.com/circular-json/-/circular-json-0.3.1.tgz#be8b36aefccde8b3ca7aa2d6afc07a37242c0d2d" + version "0.3.3" + resolved "https://registry.yarnpkg.com/circular-json/-/circular-json-0.3.3.tgz#815c99ea84f6809529d2f45791bdf82711352d66" clap@^1.0.9: - version "1.1.3" - resolved "https://registry.yarnpkg.com/clap/-/clap-1.1.3.tgz#b3bd36e93dd4cbfb395a3c26896352445265c05b" + version "1.2.3" + resolved "https://registry.yarnpkg.com/clap/-/clap-1.2.3.tgz#4f36745b32008492557f46412d66d50cb99bce51" dependencies: chalk "^1.1.3" -clean-css@4.0.x: - version "4.0.12" - resolved "https://registry.yarnpkg.com/clean-css/-/clean-css-4.0.12.tgz#a02e61707f1840bd3338f54dbc9acbda4e772fa3" +class-utils@^0.3.5: + version "0.3.6" + resolved "https://registry.yarnpkg.com/class-utils/-/class-utils-0.3.6.tgz#f93369ae8b9a7ce02fd41faad0ca83033190c463" + dependencies: + arr-union "^3.1.0" + define-property "^0.2.5" + isobject "^3.0.0" + static-extend "^0.1.1" + +clean-css@4.1.x: + version "4.1.11" + resolved "https://registry.yarnpkg.com/clean-css/-/clean-css-4.1.11.tgz#2ecdf145aba38f54740f26cefd0ff3e03e125d6a" dependencies: source-map "0.5.x" @@ -667,17 +877,15 @@ cli-cursor@^1.0.1: dependencies: restore-cursor "^1.0.1" -cli-width@^2.0.0: +cli-cursor@^2.1.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-2.1.0.tgz#b234ca209b29ef66fc518d9b98d5847b00edf00a" - -cliui@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/cliui/-/cliui-2.1.0.tgz#4b475760ff80264c762c3a1719032e91c7fea0d1" + resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-2.1.0.tgz#b35dac376479facc3e94747d41d0d0f5238ffcb5" dependencies: - center-align "^0.1.1" - right-align "^0.1.1" - wordwrap "0.0.2" + restore-cursor "^2.0.0" + +cli-width@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-2.2.0.tgz#ff19ede8a9a5e579324147b0c11f0fbcbabed639" cliui@^3.0.3, cliui@^3.2.0: version "3.2.0" @@ -687,21 +895,41 @@ cliui@^3.0.3, cliui@^3.2.0: strip-ansi "^3.0.1" wrap-ansi "^2.0.0" +clone-buffer@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/clone-buffer/-/clone-buffer-1.0.0.tgz#e3e25b207ac4e701af721e2cb5a16792cac3dc58" + clone-stats@^0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/clone-stats/-/clone-stats-0.0.1.tgz#b88f94a82cf38b8791d58046ea4029ad88ca99d1" +clone-stats@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/clone-stats/-/clone-stats-1.0.0.tgz#b3782dff8bb5474e18b9b6bf0fdfe782f8777680" + clone@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.2.tgz#260b7a99ebb1edfe247538175f783243cb19d149" + version "1.0.4" + resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.4.tgz#da309cc263df15994c688ca902179ca3c7cd7c7e" + +clone@^2.1.1: + version "2.1.2" + resolved "https://registry.yarnpkg.com/clone/-/clone-2.1.2.tgz#1b7f4b9f591f1e8f83670401600345a02887435f" + +cloneable-readable@^1.0.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/cloneable-readable/-/cloneable-readable-1.1.2.tgz#d591dee4a8f8bc15da43ce97dceeba13d43e2a65" + dependencies: + inherits "^2.0.1" + process-nextick-args "^2.0.0" + readable-stream "^2.3.5" co@^4.6.0: version "4.6.0" resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" coa@~1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/coa/-/coa-1.0.1.tgz#7f959346cfc8719e3f7233cd6852854a7c67d8a3" + version "1.0.4" + resolved "https://registry.yarnpkg.com/coa/-/coa-1.0.4.tgz#a9ef153660d6a86a8bdec0289a5c684d217432fd" dependencies: q "^1.1.2" @@ -709,40 +937,54 @@ code-point-at@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77" -collection-map@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/collection-map/-/collection-map-0.1.0.tgz#4cff91d25108d79f4edeecce6ecee3e488f267c2" +collection-map@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/collection-map/-/collection-map-1.0.0.tgz#aea0f06f8d26c780c2b75494385544b2255af18c" dependencies: - arr-map "^2.0.0" - get-values "^0.1.0" - is-plain-object "^2.0.1" - make-iterator "^0.1.1" + arr-map "^2.0.2" + for-own "^1.0.0" + make-iterator "^1.0.0" + +collection-visit@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/collection-visit/-/collection-visit-1.0.0.tgz#4bc0373c164bc3291b4d368c829cf1a80a59dca0" + dependencies: + map-visit "^1.0.0" + object-visit "^1.0.0" + +color-convert@^1.9.0: + version "1.9.1" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.1.tgz#c1261107aeb2f294ebffec9ed9ecad529a6097ed" + dependencies: + color-name "^1.1.1" + +color-name@^1.1.1: + version "1.1.3" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" + +color-support@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/color-support/-/color-support-1.1.3.tgz#93834379a1cc9a0c61f82f52f0d04322251bd5a2" colors@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/colors/-/colors-1.1.2.tgz#168a4701756b6a7f51a12ce0c97bfa28c084ed63" -combined-stream@^1.0.5, combined-stream@~1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.5.tgz#938370a57b4a51dea2c77c15d5c5fdf895164009" +combined-stream@1.0.6, combined-stream@^1.0.5, combined-stream@~1.0.5: + version "1.0.6" + resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.6.tgz#723e7df6e801ac5613113a7e445a9b69cb632818" dependencies: delayed-stream "~1.0.0" -commander@2.9.x, commander@^2.2.0, commander@^2.8.1, commander@^2.9.0: - version "2.9.0" - resolved "https://registry.yarnpkg.com/commander/-/commander-2.9.0.tgz#9c99094176e12240cb22d6c5146098400fe0f7d4" - dependencies: - graceful-readlink ">= 1.0.0" +commander@2.15.x, commander@^2.2.0, commander@^2.8.1, commander@^2.9.0, commander@~2.15.0: + version "2.15.1" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.15.1.tgz#df46e867d0fc2aec66a34662b406a9ccafff5b0f" component-bind@1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/component-bind/-/component-bind-1.0.0.tgz#00c608ab7dcd93897c0009651b1d3a8e1e73bbd1" -component-emitter@1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.1.2.tgz#296594f2753daa63996d2af08d15a95116c9aec3" - -component-emitter@1.2.1: +component-emitter@1.2.1, component-emitter@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.2.1.tgz#137918d6d78283f7df7a6b7c5a63e140e69425e6" @@ -754,25 +996,18 @@ concat-map@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" -concat-stream@^1.4.6, concat-stream@^1.5.2: - version "1.6.0" - resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.0.tgz#0aac662fd52be78964d5532f694784e70110acf7" +concat-stream@^1.4.6, concat-stream@^1.6.0: + version "1.6.2" + resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.2.tgz#904bdf194cd3122fc675c77fc4ac3d4ff0fd1a34" dependencies: + buffer-from "^1.0.0" inherits "^2.0.3" readable-stream "^2.2.2" typedarray "^0.0.6" -connect-history-api-fallback@^1.1.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/connect-history-api-fallback/-/connect-history-api-fallback-1.3.0.tgz#e51d17f8f0ef0db90a64fdb47de3051556e9f169" - -connect@1.x: - version "1.9.2" - resolved "https://registry.yarnpkg.com/connect/-/connect-1.9.2.tgz#42880a22e9438ae59a8add74e437f58ae8e52807" - dependencies: - formidable "1.0.x" - mime ">= 0.0.1" - qs ">= 0.4.0" +connect-history-api-fallback@^1.1.0, connect-history-api-fallback@^1.5.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/connect-history-api-fallback/-/connect-history-api-fallback-1.5.0.tgz#b06873934bc5e344fef611a196a6faae0aee015a" connect@3.5.0: version "3.5.0" @@ -787,26 +1022,30 @@ console-control-strings@^1.0.0, console-control-strings@~1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" -convert-source-map@1.X, convert-source-map@^1.1.1: - version "1.5.0" - resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.5.0.tgz#9acd70851c6d5dfdd93d9282e5edf94a03ff46b5" +convert-source-map@1.X, convert-source-map@^1.5.0: + version "1.5.1" + resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.5.1.tgz#b8278097b9bc229365de5c62cf5fcaed8b5599e5" cookie@0.3.1: version "0.3.1" resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.3.1.tgz#e7e0a1f9ef43b4c8ba925c5c5a96e806d16873bb" -copy-props@^1.4.1: - version "1.6.0" - resolved "https://registry.yarnpkg.com/copy-props/-/copy-props-1.6.0.tgz#f0324bbee99771101e7b3ada112f313c393db8ed" +copy-descriptor@^0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d" + +copy-props@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/copy-props/-/copy-props-2.0.1.tgz#665fc32046ca84a898abaa3c5945e7f248ccba00" dependencies: - each-props "^1.2.1" + each-props "^1.3.0" is-plain-object "^2.0.1" -core-js@^2.4.0: - version "2.4.1" - resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.4.1.tgz#4de911e667b0eae9124e34254b53aea6fc618d3e" +core-js@^1.0.0: + version "1.2.7" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-1.2.7.tgz#652294c14651db28fa93bd2d5ff2983a4f08c636" -core-util-is@~1.0.0: +core-util-is@1.0.2, core-util-is@~1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" @@ -817,6 +1056,14 @@ cross-spawn@^3.0.0: lru-cache "^4.0.1" which "^1.2.9" +cross-spawn@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-5.1.0.tgz#e8bd0efee58fcff6f8f94510a0a554bbfa235449" + dependencies: + lru-cache "^4.0.1" + shebang-command "^1.2.0" + which "^1.2.9" + crypt@~0.0.1: version "0.0.2" resolved "https://registry.yarnpkg.com/crypt/-/crypt-0.0.2.tgz#88d7ff7ec0dfb86f713dc87bbb42d044d3e6c41b" @@ -827,6 +1074,12 @@ cryptiles@2.x.x: dependencies: boom "2.x.x" +cryptiles@3.x.x: + version "3.1.2" + resolved "https://registry.yarnpkg.com/cryptiles/-/cryptiles-3.1.2.tgz#a89fbb220f5ce25ec56e8c4aa8a4fd7b5b0d29fe" + dependencies: + boom "5.x.x" + css-select@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/css-select/-/css-select-1.0.0.tgz#b1121ca51848dd264e2244d058cee254deeb44b0" @@ -836,16 +1089,30 @@ css-select@~1.0.0: domutils "1.4" nth-check "~1.0.0" -css-tree@1.0.0-alpha17: - version "1.0.0-alpha17" - resolved "https://registry.yarnpkg.com/css-tree/-/css-tree-1.0.0-alpha17.tgz#7ab95ab72c533917af8be54313fec81841c5223a" +css-select@~1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/css-select/-/css-select-1.2.0.tgz#2b3a110539c5355f1cd8d314623e870b121ec858" dependencies: + boolbase "~1.0.0" + css-what "2.1" + domutils "1.5.1" + nth-check "~1.0.1" + +css-tree@1.0.0-alpha25: + version "1.0.0-alpha25" + resolved "https://registry.yarnpkg.com/css-tree/-/css-tree-1.0.0-alpha25.tgz#1bbfabfbf6eeef4f01d9108ff2edd0be2fe35597" + dependencies: + mdn-data "^1.0.0" source-map "^0.5.3" css-what@1.0: version "1.0.0" resolved "https://registry.yarnpkg.com/css-what/-/css-what-1.0.0.tgz#d7cc2df45180666f99d2b14462639469e00f736c" +css-what@2.1: + version "2.1.0" + resolved "https://registry.yarnpkg.com/css-what/-/css-what-2.1.0.tgz#9467d032c38cfaefb9f2d79501253062f87fa1bd" + css@2.X, css@^2.2.1: version "2.2.1" resolved "https://registry.yarnpkg.com/css/-/css-2.2.1.tgz#73a4c81de85db664d4ee674f7d47085e3b2d55dc" @@ -855,11 +1122,11 @@ css@2.X, css@^2.2.1: source-map-resolve "^0.3.0" urix "^0.1.0" -csso@3.0.x: - version "3.0.1" - resolved "https://registry.yarnpkg.com/csso/-/csso-3.0.1.tgz#1469af5ee2ec509addadd8777aa0e45acb6b2f58" +csso@3.4.x: + version "3.4.0" + resolved "https://registry.yarnpkg.com/csso/-/csso-3.4.0.tgz#57b27ef553cccbf5aa964c641748641e9af113f3" dependencies: - css-tree "1.0.0-alpha17" + css-tree "1.0.0-alpha25" csso@~2.3.1: version "2.3.2" @@ -875,8 +1142,8 @@ currently-unhandled@^0.4.1: array-find-index "^1.0.1" d3-collection@1: - version "1.0.3" - resolved "https://registry.yarnpkg.com/d3-collection/-/d3-collection-1.0.3.tgz#00bdea94fbc1628d435abbae2f4dc2164e37dd34" + version "1.0.4" + resolved "https://registry.yarnpkg.com/d3-collection/-/d3-collection-1.0.4.tgz#342dfd12837c90974f33f1cc0a785aea570dcdc2" d3-color@1: version "1.0.3" @@ -886,9 +1153,9 @@ d3-dispatch@1: version "1.0.3" resolved "https://registry.yarnpkg.com/d3-dispatch/-/d3-dispatch-1.0.3.tgz#46e1491eaa9b58c358fce5be4e8bed626e7871f8" -d3-drag@1, d3-drag@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/d3-drag/-/d3-drag-1.0.4.tgz#a9c1609f11dd5530ae275ebd64377ec54efb9d8f" +d3-drag@1, d3-drag@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/d3-drag/-/d3-drag-1.2.1.tgz#df8dd4c502fb490fc7462046a8ad98a5c479282d" dependencies: d3-dispatch "1" d3-selection "1" @@ -897,9 +1164,9 @@ d3-ease@1: version "1.0.3" resolved "https://registry.yarnpkg.com/d3-ease/-/d3-ease-1.0.3.tgz#68bfbc349338a380c44d8acc4fbc3304aa2d8c0e" -d3-force@^1.0.6: - version "1.0.6" - resolved "https://registry.yarnpkg.com/d3-force/-/d3-force-1.0.6.tgz#ea7e1b7730e2664cd314f594d6718c57cc132b79" +d3-force@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/d3-force/-/d3-force-1.1.0.tgz#cebf3c694f1078fcc3d4daf8e567b2fbd70d4ea3" dependencies: d3-collection "1" d3-dispatch "1" @@ -907,8 +1174,8 @@ d3-force@^1.0.6: d3-timer "1" d3-interpolate@1: - version "1.1.4" - resolved "https://registry.yarnpkg.com/d3-interpolate/-/d3-interpolate-1.1.4.tgz#a43ec5b3bee350d8516efdf819a4c08c053db302" + version "1.1.6" + resolved "https://registry.yarnpkg.com/d3-interpolate/-/d3-interpolate-1.1.6.tgz#2cf395ae2381804df08aa1bf766b7f97b5f68fb6" dependencies: d3-color "1" @@ -916,28 +1183,28 @@ d3-quadtree@1: version "1.0.3" resolved "https://registry.yarnpkg.com/d3-quadtree/-/d3-quadtree-1.0.3.tgz#ac7987e3e23fe805a990f28e1b50d38fcb822438" -d3-selection@1, d3-selection@^1.0.6: - version "1.0.6" - resolved "https://registry.yarnpkg.com/d3-selection/-/d3-selection-1.0.6.tgz#15332288f01f429d3d8d04051f043184d07642b9" +d3-selection@1, d3-selection@^1.1.0, d3-selection@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/d3-selection/-/d3-selection-1.3.0.tgz#d53772382d3dc4f7507bfb28bcd2d6aed2a0ad6d" d3-timer@1: - version "1.0.5" - resolved "https://registry.yarnpkg.com/d3-timer/-/d3-timer-1.0.5.tgz#b266d476c71b0d269e7ac5f352b410a3b6fe6ef0" + version "1.0.7" + resolved "https://registry.yarnpkg.com/d3-timer/-/d3-timer-1.0.7.tgz#df9650ca587f6c96607ff4e60cc38229e8dd8531" d3-transition@1: - version "1.0.4" - resolved "https://registry.yarnpkg.com/d3-transition/-/d3-transition-1.0.4.tgz#e1a9ebae3869a9d9c2874ab00841fa8313ae5de5" + version "1.1.1" + resolved "https://registry.yarnpkg.com/d3-transition/-/d3-transition-1.1.1.tgz#d8ef89c3b848735b060e54a39b32aaebaa421039" dependencies: d3-color "1" d3-dispatch "1" d3-ease "1" d3-interpolate "1" - d3-selection "1" + d3-selection "^1.1.0" d3-timer "1" -d3-zoom@^1.1.3: - version "1.1.4" - resolved "https://registry.yarnpkg.com/d3-zoom/-/d3-zoom-1.1.4.tgz#903fd2c988b5cace43f00dcf7aae09470c9cc12d" +d3-zoom@^1.7.1: + version "1.7.1" + resolved "https://registry.yarnpkg.com/d3-zoom/-/d3-zoom-1.7.1.tgz#02f43b3c3e2db54f364582d7e4a236ccc5506b63" dependencies: d3-dispatch "1" d3-drag "1" @@ -957,54 +1224,70 @@ dashdash@^1.12.0: dependencies: assert-plus "^1.0.0" -dateformat@^1.0.11: - version "1.0.12" - resolved "https://registry.yarnpkg.com/dateformat/-/dateformat-1.0.12.tgz#9f124b67594c937ff706932e4a642cca8dbbfee9" - dependencies: - get-stdin "^4.0.1" - meow "^3.3.0" - dateformat@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/dateformat/-/dateformat-2.0.0.tgz#2743e3abb5c3fc2462e527dca445e04e9f4dee17" + version "2.2.0" + resolved "https://registry.yarnpkg.com/dateformat/-/dateformat-2.2.0.tgz#4065e2013cf9fb916ddfd82efb506ad4c6769062" -debug-fabulous@0.1.X: - version "0.1.0" - resolved "https://registry.yarnpkg.com/debug-fabulous/-/debug-fabulous-0.1.0.tgz#ad0ea07a5d519324fb55842a8f34ee59c7f8ff6c" +debug-fabulous@1.X: + version "1.0.0" + resolved "https://registry.yarnpkg.com/debug-fabulous/-/debug-fabulous-1.0.0.tgz#57f6648646097b1b0849dcda0017362c1ec00f8b" dependencies: - debug "2.X" - object-assign "4.1.0" + debug "3.X" + memoizee "0.4.X" + object-assign "4.X" -debug@2.2.0, debug@~2.2.0: +debug@2.6.4: + version "2.6.4" + resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.4.tgz#7586a9b3c39741c0282ae33445c4e8ac74734fe0" + dependencies: + ms "0.7.3" + +debug@2.6.8: + version "2.6.8" + resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.8.tgz#e731531ca2ede27d188222427da17821d68ff4fc" + dependencies: + ms "2.0.0" + +debug@3.X, debug@^3.1.0, debug@~3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/debug/-/debug-3.1.0.tgz#5bb5a0672628b64149566ba16819e61518c67261" + dependencies: + ms "2.0.0" + +debug@^2.1.1, debug@^2.2.0, debug@^2.3.3, debug@~2.6.4, debug@~2.6.6: + version "2.6.9" + resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" + dependencies: + ms "2.0.0" + +debug@~2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/debug/-/debug-2.2.0.tgz#f87057e995b1a1f6ae6a4960664137bc56f039da" dependencies: ms "0.7.1" -debug@2.3.3: - version "2.3.3" - resolved "https://registry.yarnpkg.com/debug/-/debug-2.3.3.tgz#40c453e67e6e13c901ddec317af8986cda9eff8c" - dependencies: - ms "0.7.2" - -debug@2.X, debug@^2.1.1, debug@^2.2.0: - version "2.6.6" - resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.6.tgz#a9fa6fbe9ca43cf1e79f73b75c0189cbb7d6db5a" - dependencies: - ms "0.7.3" - 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" + deep-extend@~0.4.0: - version "0.4.1" - resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.4.1.tgz#efe4113d08085f4e6f9687759810f807469e2253" + version "0.4.2" + resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.4.2.tgz#48b699c27e334bf89f10892be432f6e4c7d34a7f" deep-is@~0.1.3: version "0.1.3" resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34" +default-compare@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/default-compare/-/default-compare-1.0.0.tgz#cb61131844ad84d84788fb68fd01681ca7781a2f" + dependencies: + kind-of "^5.0.2" + default-resolution@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/default-resolution/-/default-resolution-2.0.0.tgz#bcb82baa72ad79b426a76732f1a81ad6df26d684" @@ -1016,6 +1299,25 @@ define-properties@^1.1.2: foreach "^2.0.5" object-keys "^1.0.8" +define-property@^0.2.5: + version "0.2.5" + resolved "https://registry.yarnpkg.com/define-property/-/define-property-0.2.5.tgz#c35b1ef918ec3c990f9a5bc57be04aacec5c8116" + dependencies: + is-descriptor "^0.1.0" + +define-property@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/define-property/-/define-property-1.0.0.tgz#769ebaaf3f4a63aad3af9e8d304c9bbe79bfb0e6" + dependencies: + is-descriptor "^1.0.0" + +define-property@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/define-property/-/define-property-2.0.2.tgz#d459689e8d654ba77e02a817f8710d702cb16e9d" + dependencies: + is-descriptor "^1.0.2" + isobject "^3.0.1" + del@^2.0.2: version "2.2.2" resolved "https://registry.yarnpkg.com/del/-/del-2.2.2.tgz#c12c981d067846c84bcaf862cff930d907ffd1a8" @@ -1036,9 +1338,13 @@ delegates@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" +depd@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.1.tgz#5783b4e1c459f06fa5ca27f991f3d06e7a310359" + depd@~1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.0.tgz#e1bd82c6aab6ced965b97b88b17ed3e528ca18c3" + version "1.1.2" + resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" destroy@~1.0.4: version "1.0.4" @@ -1050,6 +1356,14 @@ detect-file@^0.1.0: dependencies: fs-exists-sync "^0.1.0" +detect-file@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/detect-file/-/detect-file-1.0.0.tgz#f0d66d03672a825cb1b73bdb3fe62310c8e552b7" + +detect-libc@^1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-1.0.3.tgz#fa137c4bd698edf55cd5cd02ac559f91a4c4ba9b" + detect-newline@2.X: version "2.1.0" resolved "https://registry.yarnpkg.com/detect-newline/-/detect-newline-2.1.0.tgz#f41f1c10be4b00e87b5f13da680759f2c5bfd3e2" @@ -1065,12 +1379,11 @@ doctrine@^1.2.2: esutils "^2.0.2" isarray "^1.0.0" -doctrine@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-2.0.0.tgz#c73d8d2909d22291e1a007a395804da8b665fe63" +doctrine@^2.0.2, doctrine@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-2.1.0.tgz#5cd01fc101621b42c4cd7f5d1a66243716d3f39d" dependencies: esutils "^2.0.2" - isarray "^1.0.0" dom-serializer@0, dom-serializer@~0.1.0: version "0.1.0" @@ -1087,19 +1400,25 @@ domelementtype@~1.1.1: version "1.1.3" resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-1.1.3.tgz#bd28773e2642881aec51544924299c5cd822185b" -domhandler@2.3, domhandler@^2.3.0: +domhandler@2.3: version "2.3.0" resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-2.3.0.tgz#2de59a0822d5027fabff6f032c2b25a2a8abe738" dependencies: domelementtype "1" +domhandler@^2.3.0: + version "2.4.1" + resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-2.4.1.tgz#892e47000a99be55bbf3774ffea0561d8879c259" + dependencies: + domelementtype "1" + domutils@1.4: version "1.4.3" resolved "https://registry.yarnpkg.com/domutils/-/domutils-1.4.3.tgz#0865513796c6b306031850e175516baf80b72a6f" dependencies: domelementtype "1" -domutils@1.5: +domutils@1.5, domutils@1.5.1: version "1.5.1" resolved "https://registry.yarnpkg.com/domutils/-/domutils-1.5.1.tgz#dcd8488a26f563d61079e48c9f7b7e32373682cf" dependencies: @@ -1107,8 +1426,8 @@ domutils@1.5: domelementtype "1" domutils@^1.5.1: - version "1.6.0" - resolved "https://registry.yarnpkg.com/domutils/-/domutils-1.6.0.tgz#853de07f013287f976b7fe0461740222ea14ecbb" + version "1.7.0" + resolved "https://registry.yarnpkg.com/domutils/-/domutils-1.7.0.tgz#56ea341e834e06e6748af7a1cb25da67ea9f8c2a" dependencies: dom-serializer "0" domelementtype "1" @@ -1123,21 +1442,21 @@ duplexer@~0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/duplexer/-/duplexer-0.1.1.tgz#ace6ff808c1ce66b57d1ebf97977acb02334cfc1" -duplexify@^3.2.0, duplexify@^3.5.0: - version "3.5.0" - resolved "https://registry.yarnpkg.com/duplexify/-/duplexify-3.5.0.tgz#1aa773002e1578457e9d9d4a50b0ccaaebcbd604" +duplexify@^3.5.0, duplexify@^3.5.3: + version "3.5.4" + resolved "https://registry.yarnpkg.com/duplexify/-/duplexify-3.5.4.tgz#4bb46c1796eabebeec4ca9a2e66b808cb7a3d8b4" dependencies: - end-of-stream "1.0.0" + end-of-stream "^1.0.0" inherits "^2.0.1" readable-stream "^2.0.0" stream-shift "^1.0.0" -each-props@^1.2.1: - version "1.3.0" - resolved "https://registry.yarnpkg.com/each-props/-/each-props-1.3.0.tgz#7ed8031c927688aedb4a896eb91485b4487b90ea" +each-props@^1.3.0: + version "1.3.1" + resolved "https://registry.yarnpkg.com/each-props/-/each-props-1.3.1.tgz#fc138f51e3a2774286d4858e02d6e7de462de158" dependencies: is-plain-object "^2.0.1" - object-assign "^4.1.1" + object.defaults "^1.1.0" easy-extender@2.3.2: version "2.3.2" @@ -1161,68 +1480,68 @@ ee-first@1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" -electron-to-chromium@^1.2.7: - version "1.3.9" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.9.tgz#db1cba2a26aebcca2f7f5b8b034554468609157d" +electron-to-chromium@^1.3.40: + version "1.3.40" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.40.tgz#1fbd6d97befd72b8a6f921dc38d22413d2f6fddf" emitter-steward@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/emitter-steward/-/emitter-steward-1.0.0.tgz#f3411ade9758a7565df848b2da0cbbd1b46cbd64" encodeurl@~1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.1.tgz#79e3d58655346909fe6f0f45a5de68103b294d20" + version "1.0.2" + resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" -end-of-stream@1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.0.0.tgz#d4596e702734a93e40e9af864319eabd99ff2f0e" +encoding@^0.1.11: + version "0.1.12" + resolved "https://registry.yarnpkg.com/encoding/-/encoding-0.1.12.tgz#538b66f3ee62cd1ab51ec323829d1f9480c74beb" dependencies: - once "~1.3.0" + iconv-lite "~0.4.13" -end-of-stream@^1.1.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.0.tgz#7a90d833efda6cfa6eac0f4949dbb0fad3a63206" +end-of-stream@^1.0.0, end-of-stream@^1.1.0: + version "1.4.1" + resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.1.tgz#ed29634d19baba463b6ce6b80a37213eab71ec43" dependencies: once "^1.4.0" -engine.io-client@1.8.0: - version "1.8.0" - resolved "https://registry.yarnpkg.com/engine.io-client/-/engine.io-client-1.8.0.tgz#7b730e4127414087596d9be3c88d2bc5fdb6cf5c" +engine.io-client@~3.1.0: + version "3.1.6" + resolved "https://registry.yarnpkg.com/engine.io-client/-/engine.io-client-3.1.6.tgz#5bdeb130f8b94a50ac5cbeb72583e7a4a063ddfd" dependencies: component-emitter "1.2.1" component-inherit "0.0.3" - debug "2.3.3" - engine.io-parser "1.3.1" + debug "~3.1.0" + engine.io-parser "~2.1.1" has-cors "1.1.0" indexof "0.0.1" - parsejson "0.0.3" parseqs "0.0.5" parseuri "0.0.5" - ws "1.1.1" - xmlhttprequest-ssl "1.5.3" + ws "~3.3.1" + xmlhttprequest-ssl "~1.5.4" yeast "0.1.2" -engine.io-parser@1.3.1: - version "1.3.1" - resolved "https://registry.yarnpkg.com/engine.io-parser/-/engine.io-parser-1.3.1.tgz#9554f1ae33107d6fbd170ca5466d2f833f6a07cf" +engine.io-parser@~2.1.0, engine.io-parser@~2.1.1: + version "2.1.2" + resolved "https://registry.yarnpkg.com/engine.io-parser/-/engine.io-parser-2.1.2.tgz#4c0f4cff79aaeecbbdcfdea66a823c6085409196" dependencies: - after "0.8.1" - arraybuffer.slice "0.0.6" + after "0.8.2" + arraybuffer.slice "~0.0.7" base64-arraybuffer "0.1.5" blob "0.0.4" - has-binary "0.1.6" - wtf-8 "1.0.0" + has-binary2 "~1.0.2" -engine.io@1.8.0: - version "1.8.0" - resolved "https://registry.yarnpkg.com/engine.io/-/engine.io-1.8.0.tgz#3eeb5f264cb75dbbec1baaea26d61f5a4eace2aa" +engine.io@~3.1.0: + version "3.1.5" + resolved "https://registry.yarnpkg.com/engine.io/-/engine.io-3.1.5.tgz#0e7ef9d690eb0b35597f1d4ad02a26ca2dba3845" dependencies: - accepts "1.3.3" - base64id "0.1.0" + accepts "~1.3.4" + base64id "1.0.0" cookie "0.3.1" - debug "2.3.3" - engine.io-parser "1.3.1" - ws "1.1.1" + debug "~3.1.0" + engine.io-parser "~2.1.0" + ws "~3.3.1" + optionalDependencies: + uws "~9.14.0" entities@1.0: version "1.0.0" @@ -1238,14 +1557,15 @@ error-ex@^1.2.0: dependencies: is-arrayish "^0.2.1" -es-abstract@^1.5.0: - version "1.7.0" - resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.7.0.tgz#dfade774e01bfcd97f96180298c449c8623fb94c" +es-abstract@^1.5.0, es-abstract@^1.7.0: + version "1.11.0" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.11.0.tgz#cce87d518f0496893b1a30cd8461835535480681" dependencies: es-to-primitive "^1.1.1" - function-bind "^1.1.0" + function-bind "^1.1.1" + has "^1.0.1" is-callable "^1.1.3" - is-regex "^1.0.3" + is-regex "^1.0.4" es-to-primitive@^1.1.1: version "1.1.1" @@ -1255,20 +1575,21 @@ es-to-primitive@^1.1.1: is-date-object "^1.0.1" is-symbol "^1.0.1" -es5-ext@^0.10.14, es5-ext@^0.10.9, es5-ext@~0.10.14: - version "0.10.15" - resolved "https://registry.yarnpkg.com/es5-ext/-/es5-ext-0.10.15.tgz#c330a5934c1ee21284a7c081a86e5fd937c91ea6" +es5-ext@^0.10.14, es5-ext@^0.10.30, es5-ext@^0.10.35, es5-ext@^0.10.9, es5-ext@~0.10.14, es5-ext@~0.10.2: + version "0.10.41" + resolved "https://registry.yarnpkg.com/es5-ext/-/es5-ext-0.10.41.tgz#bab3e982d750f0112f0cb9e6abed72c59eb33eb2" dependencies: - es6-iterator "2" - es6-symbol "~3.1" + es6-iterator "~2.0.3" + es6-symbol "~3.1.1" + next-tick "1" -es6-iterator@2, es6-iterator@^2.0.1, es6-iterator@~2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/es6-iterator/-/es6-iterator-2.0.1.tgz#8e319c9f0453bf575d374940a655920e59ca5512" +es6-iterator@^2.0.1, es6-iterator@~2.0.1, es6-iterator@~2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/es6-iterator/-/es6-iterator-2.0.3.tgz#a7de889141a05a94b0854403b2d0a0fbfa98f3b7" dependencies: d "1" - es5-ext "^0.10.14" - es6-symbol "^3.1" + es5-ext "^0.10.35" + es6-symbol "^3.1.1" es6-map@^0.1.3: version "0.1.5" @@ -1291,14 +1612,14 @@ es6-set@~0.1.5: es6-symbol "3.1.1" event-emitter "~0.3.5" -es6-symbol@3.1.1, es6-symbol@^3.1, es6-symbol@^3.1.1, es6-symbol@~3.1, es6-symbol@~3.1.1: +es6-symbol@3.1.1, es6-symbol@^3.1.1, es6-symbol@~3.1.1: version "3.1.1" resolved "https://registry.yarnpkg.com/es6-symbol/-/es6-symbol-3.1.1.tgz#bf00ef4fdab6ba1b46ecb7b629b4c7ed5715cc77" dependencies: d "1" es5-ext "~0.10.14" -es6-weak-map@^2.0.1: +es6-weak-map@^2.0.1, es6-weak-map@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/es6-weak-map/-/es6-weak-map-2.0.2.tgz#5e3ab32251ffd1538a1f8e5ffa1357772f92d96f" dependencies: @@ -1324,9 +1645,9 @@ escope@^3.6.0: esrecurse "^4.1.0" estraverse "^4.1.1" -eslint-config-airbnb-es5@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/eslint-config-airbnb-es5/-/eslint-config-airbnb-es5-1.1.0.tgz#f342474fe7c8e02745707d1c5e3bca0a3ab9e968" +eslint-config-airbnb-es5@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/eslint-config-airbnb-es5/-/eslint-config-airbnb-es5-1.2.0.tgz#9518808fd876e2ce8294d51166b6b1359bd51f28" dependencies: strip-json-comments "1.0.2" @@ -1334,13 +1655,25 @@ eslint-config-defaults@^9.0.0: version "9.0.0" resolved "https://registry.yarnpkg.com/eslint-config-defaults/-/eslint-config-defaults-9.0.0.tgz#a090adc13b2935e3f43b3cd048a92701654e5ad5" -eslint-plugin-react@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.0.0.tgz#084cfe772d229ec5ae7e525dfc6d299cc21ddd77" +eslint-plugin-react@^7.7.0: + version "7.7.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.7.0.tgz#f606c719dbd8a1a2b3d25c16299813878cca0160" dependencies: - doctrine "^2.0.0" + doctrine "^2.0.2" has "^1.0.1" - jsx-ast-utils "^1.3.4" + jsx-ast-utils "^2.0.1" + prop-types "^15.6.0" + +eslint-scope@^3.7.1, eslint-scope@~3.7.1: + version "3.7.1" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-3.7.1.tgz#3d63c3edfda02e06e01a452ad88caacc7cdcb6e8" + dependencies: + esrecurse "^4.1.0" + estraverse "^4.1.1" + +eslint-visitor-keys@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz#3f3180fb2e291017716acb4c9d6d5b5c34a6a81d" eslint@^2.7.0: version "2.13.1" @@ -1380,60 +1713,63 @@ eslint@^2.7.0: text-table "~0.2.0" user-home "^2.0.0" -eslint@^3.0.0, eslint@^3.19.0: - version "3.19.0" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-3.19.0.tgz#c8fc6201c7f40dd08941b87c085767386a679acc" +eslint@^4.0.0, eslint@^4.18.2: + version "4.19.1" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-4.19.1.tgz#32d1d653e1d90408854bfb296f076ec7e186a300" dependencies: - babel-code-frame "^6.16.0" - chalk "^1.1.3" - concat-stream "^1.5.2" - debug "^2.1.1" - doctrine "^2.0.0" - escope "^3.6.0" - espree "^3.4.0" + ajv "^5.3.0" + babel-code-frame "^6.22.0" + chalk "^2.1.0" + concat-stream "^1.6.0" + cross-spawn "^5.1.0" + debug "^3.1.0" + doctrine "^2.1.0" + eslint-scope "^3.7.1" + eslint-visitor-keys "^1.0.0" + espree "^3.5.4" esquery "^1.0.0" - estraverse "^4.2.0" esutils "^2.0.2" file-entry-cache "^2.0.0" - glob "^7.0.3" - globals "^9.14.0" - ignore "^3.2.0" + functional-red-black-tree "^1.0.1" + glob "^7.1.2" + globals "^11.0.1" + ignore "^3.3.3" imurmurhash "^0.1.4" - inquirer "^0.12.0" - is-my-json-valid "^2.10.0" + inquirer "^3.0.6" is-resolvable "^1.0.0" - js-yaml "^3.5.1" - json-stable-stringify "^1.0.0" + js-yaml "^3.9.1" + json-stable-stringify-without-jsonify "^1.0.1" levn "^0.3.0" - lodash "^4.0.0" - mkdirp "^0.5.0" + lodash "^4.17.4" + minimatch "^3.0.2" + mkdirp "^0.5.1" natural-compare "^1.4.0" optionator "^0.8.2" - path-is-inside "^1.0.1" - pluralize "^1.2.1" - progress "^1.1.8" - require-uncached "^1.0.2" - shelljs "^0.7.5" - strip-bom "^3.0.0" + path-is-inside "^1.0.2" + pluralize "^7.0.0" + progress "^2.0.0" + regexpp "^1.0.1" + require-uncached "^1.0.3" + semver "^5.3.0" + strip-ansi "^4.0.0" strip-json-comments "~2.0.1" - table "^3.7.8" + table "4.0.2" text-table "~0.2.0" - user-home "^2.0.0" -espree@^3.1.6, espree@^3.4.0: - version "3.4.3" - resolved "https://registry.yarnpkg.com/espree/-/espree-3.4.3.tgz#2910b5ccd49ce893c2ffffaab4fd8b3a31b82374" +espree@^3.1.6, espree@^3.5.4: + version "3.5.4" + resolved "https://registry.yarnpkg.com/espree/-/espree-3.5.4.tgz#b0f447187c8a8bed944b815a660bddf5deb5d1a7" dependencies: - acorn "^5.0.1" + acorn "^5.5.0" acorn-jsx "^3.0.0" esprima@^2.6.0: version "2.7.3" resolved "https://registry.yarnpkg.com/esprima/-/esprima-2.7.3.tgz#96e3b70d5779f6ad49cd032673d1c312767ba581" -esprima@^3.1.1: - version "3.1.3" - resolved "https://registry.yarnpkg.com/esprima/-/esprima-3.1.3.tgz#fdca51cee6133895e3c88d535ce49dbff62a4633" +esprima@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.0.tgz#4499eddcd1110e0b218bacf2fa7f7f59f55ca804" esquery@^1.0.0: version "1.0.0" @@ -1442,33 +1778,24 @@ esquery@^1.0.0: estraverse "^4.0.0" esrecurse@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.1.0.tgz#4713b6536adf7f2ac4f327d559e7756bff648220" + version "4.2.1" + resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.2.1.tgz#007a3b9fdbc2b3bb87e4879ea19c92fdbd3942cf" dependencies: - estraverse "~4.1.0" - object-assign "^4.0.1" + estraverse "^4.1.0" -estraverse@^4.0.0, estraverse@^4.1.1, estraverse@^4.2.0: +estraverse@^4.0.0, estraverse@^4.1.0, estraverse@^4.1.1, estraverse@^4.2.0: version "4.2.0" resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.2.0.tgz#0dee3fed31fcd469618ce7342099fc1afa0bdb13" -estraverse@~4.1.0: - version "4.1.1" - resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.1.1.tgz#f6caca728933a850ef90661d0e17982ba47111a2" - esutils@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.2.tgz#0abf4f1caa5bcb1f7a9d8acc6dea4faaa04bac9b" -etag@^1.7.0: - version "1.8.0" - resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.0.tgz#6f631aef336d6c46362b51764044ce216be3c051" +etag@^1.8.1, etag@~1.8.0: + version "1.8.1" + resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" -etag@~1.7.0: - version "1.7.0" - resolved "https://registry.yarnpkg.com/etag/-/etag-1.7.0.tgz#03d30b5f67dd6e632d2945d30d6652731a34d5d8" - -event-emitter@~0.3.5: +event-emitter@^0.3.5, event-emitter@~0.3.5: version "0.3.5" resolved "https://registry.yarnpkg.com/event-emitter/-/event-emitter-0.3.5.tgz#df8c69eef1647923c7157b9ce83840610b02cc39" dependencies: @@ -1477,7 +1804,7 @@ event-emitter@~0.3.5: event-stream@^3.1.0: version "3.3.4" - resolved "https://registry.yarnpkg.com/event-stream/-/event-stream-3.3.4.tgz#4ab4c9a0f5a54db9338b4c34d86bfce8f4b35571" + resolved "http://registry.npmjs.org/event-stream/-/event-stream-3.3.4.tgz#4ab4c9a0f5a54db9338b4c34d86bfce8f4b35571" dependencies: duplexer "~0.1.1" from "~0" @@ -1501,26 +1828,41 @@ expand-brackets@^0.1.4: dependencies: is-posix-bracket "^0.1.0" +expand-brackets@^2.1.4: + version "2.1.4" + resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-2.1.4.tgz#b77735e315ce30f6b6eff0f83b04151a22449622" + dependencies: + debug "^2.3.3" + define-property "^0.2.5" + extend-shallow "^2.0.1" + posix-character-classes "^0.1.0" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.1" + expand-range@^1.8.1: version "1.8.2" resolved "https://registry.yarnpkg.com/expand-range/-/expand-range-1.8.2.tgz#a299effd335fe2721ebae8e257ec79644fc85337" dependencies: fill-range "^2.1.0" -expand-tilde@^1.2.1, expand-tilde@^1.2.2: +expand-tilde@^1.2.2: version "1.2.2" resolved "https://registry.yarnpkg.com/expand-tilde/-/expand-tilde-1.2.2.tgz#0b81eba897e5a3d31d1c3d102f8f01441e559449" dependencies: os-homedir "^1.0.1" -express@2.5.x: - version "2.5.11" - resolved "https://registry.yarnpkg.com/express/-/express-2.5.11.tgz#4ce8ea1f3635e69e49f0ebb497b6a4b0a51ce6f0" +expand-tilde@^2.0.0, expand-tilde@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/expand-tilde/-/expand-tilde-2.0.2.tgz#97e801aa052df02454de46b02bf621642cdc8502" dependencies: - connect "1.x" - mime "1.2.4" - mkdirp "0.3.0" - qs "0.4.x" + homedir-polyfill "^1.0.1" + +extend-shallow@^1.1.2: + version "1.1.4" + resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-1.1.4.tgz#19d6bf94dfc09d76ba711f39b872d21ff4dd9071" + dependencies: + kind-of "^1.1.0" extend-shallow@^2.0.1: version "2.0.1" @@ -1528,31 +1870,84 @@ extend-shallow@^2.0.1: dependencies: is-extendable "^0.1.0" -extend@^3.0.0, extend@~3.0.0: +extend-shallow@^3.0.0, extend-shallow@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-3.0.2.tgz#26a71aaf073b39fb2127172746131c2704028db8" + dependencies: + assign-symbols "^1.0.0" + is-extendable "^1.0.1" + +extend@^3.0.0, extend@~3.0.0, extend@~3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.1.tgz#a755ea7bc1adfcc5a31ce7e762dbaadc5e636444" +external-editor@^2.0.4: + version "2.1.0" + resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-2.1.0.tgz#3d026a21b7f95b5726387d4200ac160d372c3b48" + dependencies: + chardet "^0.4.0" + iconv-lite "^0.4.17" + tmp "^0.0.33" + extglob@^0.3.1: version "0.3.2" resolved "https://registry.yarnpkg.com/extglob/-/extglob-0.3.2.tgz#2e18ff3d2f49ab2765cec9023f011daa8d8349a1" dependencies: is-extglob "^1.0.0" -extsprintf@1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.0.2.tgz#e1080e0658e300b06294990cc70e1502235fd550" - -fancy-log@^1.1.0, fancy-log@^1.2.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/fancy-log/-/fancy-log-1.3.0.tgz#45be17d02bb9917d60ccffd4995c999e6c8c9948" +extglob@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/extglob/-/extglob-2.0.4.tgz#ad00fe4dc612a9232e8718711dc5cb5ab0285543" dependencies: - chalk "^1.1.1" + array-unique "^0.3.2" + define-property "^1.0.0" + expand-brackets "^2.1.4" + extend-shallow "^2.0.1" + fragment-cache "^0.2.1" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.1" + +extsprintf@1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05" + +extsprintf@^1.2.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.4.0.tgz#e2689f8f356fad62cca65a3a91c5df5f9551692f" + +fancy-log@^1.1.0, fancy-log@^1.2.0, fancy-log@^1.3.2: + version "1.3.2" + resolved "https://registry.yarnpkg.com/fancy-log/-/fancy-log-1.3.2.tgz#f41125e3d84f2e7d89a43d06d958c8f78be16be1" + dependencies: + ansi-gray "^0.1.1" + color-support "^1.1.3" time-stamp "^1.0.0" +fast-deep-equal@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz#c053477817c86b51daa853c81e059b733d023614" + +fast-json-stable-stringify@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz#d5142c0caee6b1189f87d3a76111064f86c8bbf2" + fast-levenshtein@~2.0.4: version "2.0.6" resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" +fbjs@^0.8.16: + version "0.8.16" + resolved "https://registry.yarnpkg.com/fbjs/-/fbjs-0.8.16.tgz#5e67432f550dc41b572bf55847b8aca64e5337db" + dependencies: + core-js "^1.0.0" + isomorphic-fetch "^2.1.1" + loose-envify "^1.0.0" + object-assign "^4.1.0" + promise "^7.1.1" + setimmediate "^1.0.5" + ua-parser-js "^0.7.9" + figures@^1.3.5: version "1.7.0" resolved "https://registry.yarnpkg.com/figures/-/figures-1.7.0.tgz#cbe1e3affcf1cd44b80cadfed28dc793a9701d2e" @@ -1560,6 +1955,12 @@ figures@^1.3.5: escape-string-regexp "^1.0.5" object-assign "^4.1.0" +figures@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/figures/-/figures-2.0.0.tgz#3ab1a2d2a62c8bfb431a0c94cb797a2fce27c962" + dependencies: + escape-string-regexp "^1.0.5" + file-entry-cache@^1.1.1: version "1.3.1" resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-1.3.1.tgz#44c61ea607ae4be9c1402f41f44270cbfe334ff8" @@ -1588,6 +1989,15 @@ fill-range@^2.1.0: repeat-element "^1.1.2" repeat-string "^1.5.2" +fill-range@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-4.0.0.tgz#d544811d428f98eb06a63dc402d2403c328c38f7" + dependencies: + extend-shallow "^2.0.1" + is-number "^3.0.0" + repeat-string "^1.6.1" + to-regex-range "^2.1.0" + finalhandler@0.5.0: version "0.5.0" resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-0.5.0.tgz#e9508abece9b6dba871a6942a1d7911b91911ac7" @@ -1605,7 +2015,7 @@ find-up@^1.0.0: path-exists "^2.0.0" pinkie-promise "^2.0.0" -findup-sync@^0.4.0, findup-sync@^0.4.2: +findup-sync@^0.4.0: version "0.4.3" resolved "https://registry.yarnpkg.com/findup-sync/-/findup-sync-0.4.3.tgz#40043929e7bc60adf0b7f4827c4c6e75a0deca12" dependencies: @@ -1614,52 +2024,56 @@ findup-sync@^0.4.0, findup-sync@^0.4.2: micromatch "^2.3.7" resolve-dir "^0.1.0" -findup-sync@~0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/findup-sync/-/findup-sync-0.3.0.tgz#37930aa5d816b777c03445e1966cc6790a4c0b16" +findup-sync@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/findup-sync/-/findup-sync-2.0.0.tgz#9326b1488c22d1a6088650a86901b2d9a90a2cbc" dependencies: - glob "~5.0.0" + detect-file "^1.0.0" + is-glob "^3.1.0" + micromatch "^3.0.4" + resolve-dir "^1.0.1" fined@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/fined/-/fined-1.0.2.tgz#5b28424b760d7598960b7ef8480dff8ad3660e97" + version "1.1.0" + resolved "https://registry.yarnpkg.com/fined/-/fined-1.1.0.tgz#b37dc844b76a2f5e7081e884f7c0ae344f153476" dependencies: - expand-tilde "^1.2.1" - lodash.assignwith "^4.0.7" - lodash.isempty "^4.2.1" - lodash.isplainobject "^4.0.4" - lodash.isstring "^4.0.1" - lodash.pick "^4.2.1" + expand-tilde "^2.0.2" + is-plain-object "^2.0.3" + object.defaults "^1.1.0" + object.pick "^1.2.0" parse-filepath "^1.0.1" -first-chunk-stream@^1.0.0: +flagged-respawn@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/first-chunk-stream/-/first-chunk-stream-1.0.0.tgz#59bfb50cd905f60d7c394cd3d9acaab4e6ad934e" - -flagged-respawn@^0.3.2: - version "0.3.2" - resolved "https://registry.yarnpkg.com/flagged-respawn/-/flagged-respawn-0.3.2.tgz#ff191eddcd7088a675b2610fffc976be9b8074b5" + resolved "https://registry.yarnpkg.com/flagged-respawn/-/flagged-respawn-1.0.0.tgz#4e79ae9b2eb38bf86b3bb56bf3e0a56aa5fcabd7" flat-cache@^1.2.1: - version "1.2.2" - resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-1.2.2.tgz#fa86714e72c21db88601761ecf2f555d1abc6b96" + version "1.3.0" + resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-1.3.0.tgz#d3030b32b38154f4e3b7e9c709f490f7ef97c481" dependencies: circular-json "^0.3.1" del "^2.0.2" graceful-fs "^4.1.2" write "^0.2.1" +flush-write-stream@^1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/flush-write-stream/-/flush-write-stream-1.0.3.tgz#c5d586ef38af6097650b49bc41b55fabb19f35bd" + dependencies: + inherits "^2.0.1" + readable-stream "^2.0.4" + for-each@^0.3.2: version "0.3.2" resolved "https://registry.yarnpkg.com/for-each/-/for-each-0.3.2.tgz#2c40450b9348e97f281322593ba96704b9abd4d4" dependencies: is-function "~1.0.0" -for-in@^1.0.1: +for-in@^1.0.1, for-in@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80" -for-own@^0.1.1, for-own@^0.1.3, for-own@^0.1.4: +for-own@^0.1.4: version "0.1.5" resolved "https://registry.yarnpkg.com/for-own/-/for-own-0.1.5.tgz#5265c681a4f294dabbf17c9509b6763aa84510ce" dependencies: @@ -1691,21 +2105,35 @@ form-data@~2.1.1: combined-stream "^1.0.5" mime-types "^2.1.12" -formidable@1.0.x: - version "1.0.17" - resolved "https://registry.yarnpkg.com/formidable/-/formidable-1.0.17.tgz#ef5491490f9433b705faa77249c99029ae348559" +form-data@~2.3.1: + version "2.3.2" + resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.3.2.tgz#4970498be604c20c005d4f5c23aecd21d6b49099" + dependencies: + asynckit "^0.4.0" + combined-stream "1.0.6" + mime-types "^2.1.12" -fresh@0.3.0, fresh@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.3.0.tgz#651f838e22424e7566de161d8358caa199f83d4f" +fragment-cache@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/fragment-cache/-/fragment-cache-0.2.1.tgz#4290fad27f13e89be7f33799c6bc5a0abfff0d19" + dependencies: + map-cache "^0.2.2" + +fresh@0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.0.tgz#f474ca5e6a9246d6fd8e0953cfa9b9c805afa78e" + +fresh@^0.5.2: + version "0.5.2" + resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" from@~0: version "0.1.7" resolved "https://registry.yarnpkg.com/from/-/from-0.1.7.tgz#83c60afc58b9c56997007ed1a768b3ab303a44fe" -front-matter@2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/front-matter/-/front-matter-2.1.0.tgz#0bdff42cbad2b35c07ac7085811789759f9858c0" +front-matter@2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/front-matter/-/front-matter-2.1.2.tgz#f75983b9f2f413be658c93dfd7bd8ce4078f5cdb" dependencies: js-yaml "^3.4.6" @@ -1713,24 +2141,31 @@ fs-exists-sync@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/fs-exists-sync/-/fs-exists-sync-0.1.0.tgz#982d6893af918e72d08dec9e8673ff2b5a8d6add" -fs-extra@1.0.0, fs-extra@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-1.0.0.tgz#cd3ce5f7e7cb6145883fcae3191e9877f8587950" +fs-extra@3.0.1, fs-extra@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-3.0.1.tgz#3794f378c58b342ea7dbbb23095109c4b3b62291" dependencies: graceful-fs "^4.1.2" - jsonfile "^2.1.0" - klaw "^1.0.0" + jsonfile "^3.0.0" + universalify "^0.1.0" + +fs-mkdirp-stream@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fs-mkdirp-stream/-/fs-mkdirp-stream-1.0.0.tgz#0b7815fc3201c6a69e14db98ce098c16935259eb" + dependencies: + graceful-fs "^4.1.11" + through2 "^2.0.3" fs.realpath@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" fsevents@^1.0.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.1.1.tgz#f19fd28f43eeaf761680e519a203c4d0b3d31aff" + version "1.1.3" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.1.3.tgz#11f82318f5fe7bb2cd22965a108e9306208216d8" dependencies: nan "^2.3.0" - node-pre-gyp "^0.6.29" + node-pre-gyp "^0.6.39" fstream-ignore@^1.0.5: version "1.0.5" @@ -1758,9 +2193,13 @@ fstream@~0.1.21: mkdirp "0.5" rimraf "2" -function-bind@^1.0.2, function-bind@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.0.tgz#16176714c801798e4e8f2cf7f7529467bb4a5771" +function-bind@^1.0.2, function-bind@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" + +functional-red-black-tree@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327" gauge@~2.7.3: version "2.7.4" @@ -1799,16 +2238,10 @@ get-stdin@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-4.0.1.tgz#b968c6b0a04384324902e8bf1a5df32579a450fe" -get-value@^2.0.6: +get-value@^2.0.3, get-value@^2.0.6: version "2.0.6" resolved "https://registry.yarnpkg.com/get-value/-/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28" -get-values@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/get-values/-/get-values-0.1.0.tgz#3ac035b65a44923d35db2fc2b7ba2322b6c3f29e" - dependencies: - for-own "^0.1.3" - getpass@^0.1.1: version "0.1.7" resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa" @@ -1828,38 +2261,40 @@ glob-parent@^2.0.0: dependencies: is-glob "^2.0.0" -glob-parent@^3.0.0: +glob-parent@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-3.1.0.tgz#9e6af6299d8d3bd2bd40430832bd113df906c5ae" dependencies: is-glob "^3.1.0" path-dirname "^1.0.0" -glob-stream@^5.3.2: - version "5.3.5" - resolved "https://registry.yarnpkg.com/glob-stream/-/glob-stream-5.3.5.tgz#a55665a9a8ccdc41915a87c701e32d4e016fad22" +glob-stream@^6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/glob-stream/-/glob-stream-6.1.0.tgz#7045c99413b3eb94888d83ab46d0b404cc7bdde4" dependencies: extend "^3.0.0" - glob "^5.0.3" - glob-parent "^3.0.0" - micromatch "^2.3.7" - ordered-read-streams "^0.3.0" - through2 "^0.6.0" - to-absolute-glob "^0.1.1" + glob "^7.1.1" + glob-parent "^3.1.0" + is-negated-glob "^1.0.0" + ordered-read-streams "^1.0.0" + pumpify "^1.3.5" + readable-stream "^2.1.5" + remove-trailing-separator "^1.0.1" + to-absolute-glob "^2.0.0" unique-stream "^2.0.2" -glob-watcher@^3.0.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/glob-watcher/-/glob-watcher-3.2.0.tgz#ffc1a2d3d07783b672f5e21799a4d0b3fed92daf" +glob-watcher@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/glob-watcher/-/glob-watcher-4.0.0.tgz#9e63a8ff6e61e932de6cc2caece5071a6d737329" dependencies: async-done "^1.2.0" chokidar "^1.4.3" - lodash.debounce "^4.0.6" - object.defaults "^1.0.0" + just-debounce "^1.0.0" + object.defaults "^1.1.0" -glob@^5.0.3, glob@~5.0.0: - version "5.0.15" - resolved "https://registry.yarnpkg.com/glob/-/glob-5.0.15.tgz#1bc936b9e02f4a603fcc222ecf7633d30b8b93b1" +glob@^6.0.4: + version "6.0.4" + resolved "https://registry.yarnpkg.com/glob/-/glob-6.0.4.tgz#0f08860f6a155127b2fadd4f9ce24b1aab6e4d22" dependencies: inflight "^1.0.4" inherits "2" @@ -1867,14 +2302,14 @@ glob@^5.0.3, glob@~5.0.0: once "^1.3.0" path-is-absolute "^1.0.0" -glob@^7.0.0, glob@^7.0.3, glob@^7.0.5, glob@~7.1.1: - version "7.1.1" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.1.tgz#805211df04faaf1c63a3600306cdf5ade50b2ec8" +glob@^7.0.0, glob@^7.0.3, glob@^7.0.5, glob@^7.1.1, glob@^7.1.2, glob@~7.1.1: + version "7.1.2" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.2.tgz#c19c9df9a028702d678612384a6552404c636d15" dependencies: fs.realpath "^1.0.0" inflight "^1.0.4" inherits "2" - minimatch "^3.0.2" + minimatch "^3.0.4" once "^1.3.0" path-is-absolute "^1.0.0" @@ -1885,6 +2320,14 @@ global-modules@^0.2.3: global-prefix "^0.1.4" is-windows "^0.2.0" +global-modules@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/global-modules/-/global-modules-1.0.0.tgz#6d770f0eb523ac78164d72b5e71a8877265cc3ea" + dependencies: + global-prefix "^1.0.1" + is-windows "^1.0.1" + resolve-dir "^1.0.0" + global-prefix@^0.1.4: version "0.1.5" resolved "https://registry.yarnpkg.com/global-prefix/-/global-prefix-0.1.5.tgz#8d3bc6b8da3ca8112a160d8d496ff0462bfef78f" @@ -1894,9 +2337,23 @@ global-prefix@^0.1.4: is-windows "^0.2.0" which "^1.2.12" -globals@^9.0.0, globals@^9.14.0, globals@^9.2.0: - version "9.17.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-9.17.0.tgz#0c0ca696d9b9bb694d2e5470bd37777caad50286" +global-prefix@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/global-prefix/-/global-prefix-1.0.2.tgz#dbf743c6c14992593c655568cb66ed32c0122ebe" + dependencies: + expand-tilde "^2.0.2" + homedir-polyfill "^1.0.1" + ini "^1.3.4" + is-windows "^1.0.1" + which "^1.2.14" + +globals@^11.0.1, globals@^11.1.0: + version "11.3.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-11.3.0.tgz#e04fdb7b9796d8adac9c8f64c14837b2313378b0" + +globals@^9.2.0: + version "9.18.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-9.18.0.tgz#aa3896b3e69b487f17e31ed2143d69a8e30c2d8a" globby@^5.0.0: version "5.0.0" @@ -1910,26 +2367,26 @@ globby@^5.0.0: pinkie-promise "^2.0.0" globule@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/globule/-/globule-1.1.0.tgz#c49352e4dc183d85893ee825385eb994bb6df45f" + version "1.2.0" + resolved "https://registry.yarnpkg.com/globule/-/globule-1.2.0.tgz#1dc49c6822dd9e8a2fa00ba2a295006e8664bd09" dependencies: glob "~7.1.1" - lodash "~4.16.4" + lodash "~4.17.4" minimatch "~3.0.2" glogg@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/glogg/-/glogg-1.0.0.tgz#7fe0f199f57ac906cf512feead8f90ee4a284fc5" + version "1.0.1" + resolved "https://registry.yarnpkg.com/glogg/-/glogg-1.0.1.tgz#dcf758e44789cc3f3d32c1f3562a3676e6a34810" dependencies: sparkles "^1.0.0" -gonzales-pe@3.4.7: - version "3.4.7" - resolved "https://registry.yarnpkg.com/gonzales-pe/-/gonzales-pe-3.4.7.tgz#17c7be67ad6caff6277a3e387ac736e983d280ec" +gonzales-pe-sl@^4.2.3: + version "4.2.3" + resolved "https://registry.yarnpkg.com/gonzales-pe-sl/-/gonzales-pe-sl-4.2.3.tgz#6a868bc380645f141feeb042c6f97fcc71b59fe6" dependencies: minimist "1.1.x" -graceful-fs@4.X, graceful-fs@^4.0.0, graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.1.9: +graceful-fs@4.X, graceful-fs@^4.0.0, graceful-fs@^4.1.11, graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.1.9: version "4.1.11" resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.11.tgz#0e8bdfe4d1ddb8854d64e04ea7c00e2a026e5658" @@ -1939,10 +2396,6 @@ graceful-fs@~3.0.2: dependencies: natives "^1.1.0" -"graceful-readlink@>= 1.0.0": - version "1.0.1" - resolved "https://registry.yarnpkg.com/graceful-readlink/-/graceful-readlink-1.0.1.tgz#4cafad76bc62f02fa039b2f94e9a3dd3a391a725" - group-array@^0.3.0: version "0.3.3" resolved "https://registry.yarnpkg.com/group-array/-/group-array-0.3.3.tgz#bbd9d2f718df4be33f0fb90432aaf1b4360e498f" @@ -1954,49 +2407,53 @@ group-array@^0.3.0: split-string "^1.0.1" union-value "^0.2.3" -gulp-autoprefixer@^3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/gulp-autoprefixer/-/gulp-autoprefixer-3.1.1.tgz#75230051cd0d171343d783b7e9b5d1120eeef9b0" +gulp-autoprefixer@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/gulp-autoprefixer/-/gulp-autoprefixer-5.0.0.tgz#8237c278a69775270a1cafe7d6f101cfcd585544" dependencies: - autoprefixer "^6.0.0" - gulp-util "^3.0.0" - postcss "^5.0.4" + autoprefixer "^8.0.0" + fancy-log "^1.3.2" + plugin-error "^1.0.1" + postcss "^6.0.1" through2 "^2.0.0" vinyl-sourcemaps-apply "^0.2.0" -gulp-cache-bust@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/gulp-cache-bust/-/gulp-cache-bust-1.1.0.tgz#3fe702ab2e0cc01945debd8f1cc2a2f2b510511d" +gulp-cache-bust@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/gulp-cache-bust/-/gulp-cache-bust-1.3.0.tgz#3104d1318cca7d03e9a2e7e4fb8892c711d83845" dependencies: - cachebust "2.0.1" + ansi-colors "^1.0.1" + cachebust "2.3.0" + fancy-log "^1.3.2" graceful-fs "^4.1.9" - gulp-util "3.0.7" map-stream "^0.1.0" + plugin-error "^0.1.2" temp-write "^2.1.0" through2 "2.0.1" + vinyl "^2.1.0" -gulp-cli@^1.0.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/gulp-cli/-/gulp-cli-1.3.0.tgz#a6bfbb8be35341be290ae45cd3e401071216edd4" +gulp-cli@^2.0.0, gulp-cli@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/gulp-cli/-/gulp-cli-2.0.1.tgz#7847e220cb3662f2be8a6d572bf14e17be5a994b" dependencies: + ansi-colors "^1.0.1" archy "^1.0.0" - chalk "^1.1.0" - copy-props "^1.4.1" - fancy-log "^1.1.0" + array-sort "^1.0.0" + color-support "^1.1.3" + concat-stream "^1.6.0" + copy-props "^2.0.1" + fancy-log "^1.3.2" gulplog "^1.0.0" - interpret "^1.0.0" - liftoff "^2.3.0" - lodash.isfunction "^3.0.8" - lodash.isplainobject "^4.0.4" - lodash.sortby "^4.5.0" - matchdep "^1.0.0" + interpret "^1.1.0" + isobject "^3.0.1" + liftoff "^2.5.0" + matchdep "^2.0.0" mute-stdout "^1.0.0" pretty-hrtime "^1.0.0" - semver-greatest-satisfied-range "^1.0.0" - tildify "^1.0.0" - v8flags "^2.0.9" - wreck "^6.3.0" - yargs "^3.28.0" + replace-homedir "^1.0.0" + semver-greatest-satisfied-range "^1.1.0" + v8flags "^3.0.1" + yargs "^7.1.0" gulp-environments@^0.1.2: version "0.1.2" @@ -2005,22 +2462,21 @@ gulp-environments@^0.1.2: gulp-if "^2.0.1" yargs "^5.0.0" -gulp-eslint@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/gulp-eslint/-/gulp-eslint-3.0.1.tgz#04e57e3e18c6974267c12cf6855dc717d4a313bd" +gulp-eslint@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/gulp-eslint/-/gulp-eslint-4.0.2.tgz#18a2a6768e4404cbf3e203239cb57474168fa606" dependencies: - bufferstreams "^1.1.1" - eslint "^3.0.0" - gulp-util "^3.0.6" + eslint "^4.0.0" + fancy-log "^1.3.2" + plugin-error "^1.0.0" -gulp-htmlmin@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/gulp-htmlmin/-/gulp-htmlmin-3.0.0.tgz#19ea8002d1231d6b1f18a12d20f2a66a77770fb3" +gulp-htmlmin@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/gulp-htmlmin/-/gulp-htmlmin-4.0.0.tgz#266feaed83588838aedda3666f67d057ec120313" dependencies: bufferstreams "^1.1.0" - gulp-util "^3.0.7" html-minifier "^3.0.3" - object-assign "^4.0.1" + plugin-error "^0.1.2" readable-stream "^2.0.2" tryit "^1.0.1" @@ -2032,24 +2488,26 @@ gulp-if@^2.0.1: ternary-stream "^2.0.1" through2 "^2.0.1" -gulp-inject@^4.2.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/gulp-inject/-/gulp-inject-4.2.0.tgz#5d6af52f24963aa0de22993dec846e1e792ab653" +gulp-inject@^4.3.1: + version "4.3.1" + resolved "https://registry.yarnpkg.com/gulp-inject/-/gulp-inject-4.3.1.tgz#716af8d946e0f40809ce97e1beed9cc6867d70d7" dependencies: + ansi-colors "^1.0.1" arrify "^1.0.1" escape-string-regexp "^1.0.5" event-stream "^3.1.0" + fancy-log "^1.3.2" group-array "^0.3.0" - gulp-util "^3.0.0" + plugin-error "^0.1.2" stream-to-array "^2.3.0" through2 "^2.0.1" -gulp-jsonminify@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/gulp-jsonminify/-/gulp-jsonminify-1.0.0.tgz#c42b68812c657e6e0a12e93c2aa217b3eb38c70a" +gulp-jsonminify@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/gulp-jsonminify/-/gulp-jsonminify-1.1.0.tgz#3b3c787f252ab42bbd7f355c7629665357e88d1a" dependencies: - gulp-util "~3.0.4" jsonminify "~0.2.3" + plugin-error "^0.1.2" through2 "~0.6.5" gulp-kyh-inline-source@^3.0.2: @@ -2097,13 +2555,13 @@ gulp-requirejs-optimize@^1.2.0: through2 "^2.0.1" vinyl-sourcemaps-apply "^0.2.1" -gulp-sass-lint@^1.3.2: - version "1.3.2" - resolved "https://registry.yarnpkg.com/gulp-sass-lint/-/gulp-sass-lint-1.3.2.tgz#642094c5fe9b9196872f33a0d1f75ccf51cb8361" +gulp-sass-lint@^1.3.4: + version "1.3.4" + resolved "https://registry.yarnpkg.com/gulp-sass-lint/-/gulp-sass-lint-1.3.4.tgz#a9950c2dd050fd00fbf2ebc063016434a22100e2" dependencies: gulp-util "^3.0.6" - sass-lint "^1.10.2" - through2 "^2.0.0" + sass-lint "^1.12.0" + through2 "^2.0.2" gulp-sass@^3.1.0: version "3.1.0" @@ -2115,70 +2573,35 @@ gulp-sass@^3.1.0: through2 "^2.0.0" vinyl-sourcemaps-apply "^0.2.0" -gulp-sourcemaps@1.6.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/gulp-sourcemaps/-/gulp-sourcemaps-1.6.0.tgz#b86ff349d801ceb56e1d9e7dc7bbcb4b7dee600c" - dependencies: - convert-source-map "^1.1.1" - graceful-fs "^4.1.2" - strip-bom "^2.0.0" - through2 "^2.0.0" - vinyl "^1.0.0" - -gulp-sourcemaps@^2.6.0: - version "2.6.0" - resolved "https://registry.yarnpkg.com/gulp-sourcemaps/-/gulp-sourcemaps-2.6.0.tgz#7ccce899a8a3bfca1593a3348d0fbf41dd3f51e5" +gulp-sourcemaps@^2.6.4: + version "2.6.4" + resolved "https://registry.yarnpkg.com/gulp-sourcemaps/-/gulp-sourcemaps-2.6.4.tgz#cbb2008450b1bcce6cd23bf98337be751bf6e30a" dependencies: "@gulp-sourcemaps/identity-map" "1.X" "@gulp-sourcemaps/map-sources" "1.X" - acorn "4.X" + acorn "5.X" convert-source-map "1.X" css "2.X" - debug-fabulous "0.1.X" + debug-fabulous "1.X" detect-newline "2.X" graceful-fs "4.X" - source-map "0.X" + source-map "~0.6.0" strip-bom-string "1.X" through2 "2.X" - vinyl "1.X" -gulp-uglify@^2.1.2: - version "2.1.2" - resolved "https://registry.yarnpkg.com/gulp-uglify/-/gulp-uglify-2.1.2.tgz#6db85b1d0ee63d18058592b658649d65c2ec4541" +gulp-uglify@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/gulp-uglify/-/gulp-uglify-3.0.0.tgz#0df0331d72a0d302e3e37e109485dddf33c6d1ca" dependencies: gulplog "^1.0.0" has-gulplog "^0.1.0" lodash "^4.13.1" make-error-cause "^1.1.1" through2 "^2.0.0" - uglify-js "~2.8.10" - uglify-save-license "^0.4.1" + uglify-js "^3.0.5" vinyl-sourcemaps-apply "^0.2.0" -gulp-util@3.0.7: - version "3.0.7" - resolved "https://registry.yarnpkg.com/gulp-util/-/gulp-util-3.0.7.tgz#78925c4b8f8b49005ac01a011c557e6218941cbb" - dependencies: - array-differ "^1.0.0" - array-uniq "^1.0.2" - beeper "^1.0.0" - chalk "^1.0.0" - dateformat "^1.0.11" - fancy-log "^1.1.0" - gulplog "^1.0.0" - has-gulplog "^0.1.0" - lodash._reescape "^3.0.0" - lodash._reevaluate "^3.0.0" - lodash._reinterpolate "^3.0.0" - lodash.template "^3.0.0" - minimist "^1.1.0" - multipipe "^0.1.2" - object-assign "^3.0.0" - replace-ext "0.0.1" - through2 "^2.0.0" - vinyl "^0.5.0" - -gulp-util@^3.0, gulp-util@^3.0.0, gulp-util@^3.0.6, gulp-util@^3.0.7, gulp-util@~3.0.4, gulp-util@~3.0.6: +gulp-util@^3.0, gulp-util@^3.0.6, gulp-util@^3.0.7, gulp-util@~3.0.6: version "3.0.8" resolved "https://registry.yarnpkg.com/gulp-util/-/gulp-util-3.0.8.tgz#0054e1e744502e27c04c187c3ecc505dd54bbb4f" dependencies: @@ -2202,13 +2625,13 @@ gulp-util@^3.0, gulp-util@^3.0.0, gulp-util@^3.0.6, gulp-util@^3.0.7, gulp-util@ vinyl "^0.5.0" "gulp@github:gulpjs/gulp#4.0": - version "4.0.0-alpha.2" - resolved "https://codeload.github.com/gulpjs/gulp/tar.gz/38246c3f8b6dbb8d4ef657183e92d90c8299e22f" + version "4.0.0-alpha.3" + resolved "https://codeload.github.com/gulpjs/gulp/tar.gz/71c094a51c7972d26f557899ddecab0210ef3776" dependencies: - glob-watcher "^3.0.0" - gulp-cli "^1.0.0" + glob-watcher "^4.0.0" + gulp-cli "^2.0.0" undertaker "^1.0.0" - vinyl-fs "^2.0.0" + vinyl-fs "^3.0.0" gulplog@^1.0.0: version "1.0.0" @@ -2220,6 +2643,10 @@ har-schema@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-1.0.5.tgz#d263135f43307c02c602afc8fe95970c0151369e" +har-schema@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-2.0.0.tgz#a94c2224ebcac04782a0d9035521f24735b7ec92" + har-validator@~2.0.6: version "2.0.6" resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-2.0.6.tgz#cdcbc08188265ad119b6a5a7c8ab70eecfb5d27d" @@ -2236,31 +2663,32 @@ har-validator@~4.2.1: ajv "^4.9.1" har-schema "^1.0.5" +har-validator@~5.0.3: + version "5.0.3" + resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-5.0.3.tgz#ba402c266194f15956ef15e0fcf242993f6a7dfd" + dependencies: + ajv "^5.1.0" + har-schema "^2.0.0" + has-ansi@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91" dependencies: ansi-regex "^2.0.0" -has-binary@0.1.6: - version "0.1.6" - resolved "https://registry.yarnpkg.com/has-binary/-/has-binary-0.1.6.tgz#25326f39cfa4f616ad8787894e3af2cfbc7b6e10" +has-binary2@~1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/has-binary2/-/has-binary2-1.0.2.tgz#e83dba49f0b9be4d026d27365350d9f03f54be98" dependencies: - isarray "0.0.1" - -has-binary@0.1.7: - version "0.1.7" - resolved "https://registry.yarnpkg.com/has-binary/-/has-binary-0.1.7.tgz#68e61eb16210c9545a0a5cce06a873912fe1e68c" - dependencies: - isarray "0.0.1" + isarray "2.0.1" has-cors@1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/has-cors/-/has-cors-1.1.0.tgz#5e474793f7ea9843d1bb99c23eef49ff126fff39" -has-flag@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-1.0.0.tgz#9d9e793165ce017a00f00418c43f942a7b1d11fa" +has-flag@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" has-gulplog@^0.1.0: version "0.1.0" @@ -2268,17 +2696,48 @@ has-gulplog@^0.1.0: dependencies: sparkles "^1.0.0" +has-symbols@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.0.tgz#ba1a8f1af2a0fc39650f5c850367704122063b44" + has-unicode@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" +has-value@^0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/has-value/-/has-value-0.3.1.tgz#7b1f58bada62ca827ec0a2078025654845995e1f" + dependencies: + get-value "^2.0.3" + has-values "^0.1.4" + isobject "^2.0.0" + +has-value@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-value/-/has-value-1.0.0.tgz#18b281da585b1c5c51def24c930ed29a0be6b177" + dependencies: + get-value "^2.0.6" + has-values "^1.0.0" + isobject "^3.0.0" + +has-values@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/has-values/-/has-values-0.1.4.tgz#6d61de95d91dfca9b9a02089ad384bff8f62b771" + +has-values@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-values/-/has-values-1.0.0.tgz#95b0b63fec2146619a6fe57fe75628d5a39efe4f" + dependencies: + is-number "^3.0.0" + kind-of "^4.0.0" + has@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/has/-/has-1.0.1.tgz#8461733f538b0837c9361e39a9ab9e9704dc2f28" dependencies: function-bind "^1.0.2" -hawk@~3.1.3: +hawk@3.1.3, hawk@~3.1.3: version "3.1.3" resolved "https://registry.yarnpkg.com/hawk/-/hawk-3.1.3.tgz#078444bd7c1640b0fe540d2c9b73d59678e8e1c4" dependencies: @@ -2287,6 +2746,15 @@ hawk@~3.1.3: hoek "2.x.x" sntp "1.x.x" +hawk@~6.0.2: + version "6.0.2" + resolved "https://registry.yarnpkg.com/hawk/-/hawk-6.0.2.tgz#af4d914eb065f9b5ce4d9d11c1cb2126eecc3038" + dependencies: + boom "4.x.x" + cryptiles "3.x.x" + hoek "4.x.x" + sntp "2.x.x" + he@1.1.x: version "1.1.1" resolved "https://registry.yarnpkg.com/he/-/he-1.1.1.tgz#93410fd21b009735151f8868c2f271f3427e23fd" @@ -2295,30 +2763,34 @@ hoek@2.x.x: version "2.16.3" resolved "https://registry.yarnpkg.com/hoek/-/hoek-2.16.3.tgz#20bb7403d3cea398e91dc4710a8ff1b8274a25ed" -homedir-polyfill@^1.0.0: +hoek@4.x.x: + version "4.2.1" + resolved "https://registry.yarnpkg.com/hoek/-/hoek-4.2.1.tgz#9634502aa12c445dd5a7c5734b572bb8738aacbb" + +homedir-polyfill@^1.0.0, homedir-polyfill@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/homedir-polyfill/-/homedir-polyfill-1.0.1.tgz#4c2bbc8a758998feebf5ed68580f76d46768b4bc" dependencies: parse-passwd "^1.0.0" hosted-git-info@^2.1.4: - version "2.4.2" - resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.4.2.tgz#0076b9f46a270506ddbaaea56496897460612a67" + version "2.6.0" + resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.6.0.tgz#23235b29ab230c576aab0d4f13fc046b0b038222" html-minifier@^3.0.3: - version "3.4.4" - resolved "https://registry.yarnpkg.com/html-minifier/-/html-minifier-3.4.4.tgz#616fe3e3ef16da02b393d9a6099eeff468a35df0" + version "3.5.12" + resolved "https://registry.yarnpkg.com/html-minifier/-/html-minifier-3.5.12.tgz#6bfad4d0327f5b8d2b62f5854654ac3703b9b031" dependencies: camel-case "3.0.x" - clean-css "4.0.x" - commander "2.9.x" + clean-css "4.1.x" + commander "2.15.x" he "1.1.x" ncname "1.0.x" param-case "2.1.x" relateurl "0.2.x" - uglify-js "~2.8.22" + uglify-js "3.3.x" -htmlparser2@3.9.x: +htmlparser2@3.9.x, htmlparser2@^3.9.1: version "3.9.2" resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-3.9.2.tgz#1bdf87acca0f3f9e53fa4fcceb0f4b4cbb00b338" dependencies: @@ -2347,6 +2819,15 @@ http-errors@~1.5.0: setprototypeof "1.0.2" statuses ">= 1.3.1 < 2" +http-errors@~1.6.1: + version "1.6.2" + resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.6.2.tgz#0a002cc85707192a7e7946ceedc11155f60ec736" + dependencies: + depd "1.1.1" + inherits "2.0.3" + setprototypeof "1.0.3" + statuses ">= 1.3.1 < 2" + http-proxy@1.15.2: version "1.15.2" resolved "https://registry.yarnpkg.com/http-proxy/-/http-proxy-1.15.2.tgz#642fdcaffe52d3448d2bda3b0079e9409064da31" @@ -2362,13 +2843,25 @@ http-signature@~1.1.0: jsprim "^1.2.2" sshpk "^1.7.0" -ignore@^3.1.2, ignore@^3.2.0: - version "3.3.0" - resolved "https://registry.yarnpkg.com/ignore/-/ignore-3.3.0.tgz#3812d22cbe9125f2c2b4915755a1b8abd745a001" +http-signature@~1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.2.0.tgz#9aecd925114772f3d95b65a60abb8f7c18fbace1" + dependencies: + assert-plus "^1.0.0" + jsprim "^1.2.2" + sshpk "^1.7.0" -immutable@3.8.1, immutable@^3.7.6: - version "3.8.1" - resolved "https://registry.yarnpkg.com/immutable/-/immutable-3.8.1.tgz#200807f11ab0f72710ea485542de088075f68cd2" +iconv-lite@^0.4.17, iconv-lite@~0.4.13: + version "0.4.19" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.19.tgz#f7468f60135f5e5dad3399c0a81be9a1603a082b" + +ignore@^3.1.2, ignore@^3.3.3: + version "3.3.7" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-3.3.7.tgz#612289bfb3c220e186a58118618d5be8c1bab021" + +immutable@3.8.2, immutable@^3.7.6: + version "3.8.2" + resolved "https://registry.yarnpkg.com/immutable/-/immutable-3.8.2.tgz#c2439951455bb39913daf281376f1530e104adf3" imurmurhash@^0.1.4: version "0.1.4" @@ -2395,7 +2888,7 @@ inflight@^1.0.4: once "^1.3.0" wrappy "1" -inherits@2, inherits@2.0.3, inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.0, inherits@~2.0.1: +inherits@2, inherits@2.0.3, inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.0, inherits@~2.0.1, inherits@~2.0.3: version "2.0.3" resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" @@ -2404,19 +2897,19 @@ inherits@2.0.1: resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.1.tgz#b17d08d326b4423e568eff719f91b0b1cbdf69f1" ini@^1.3.4, ini@~1.3.0: - version "1.3.4" - resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.4.tgz#0537cb79daf59b59a1a517dff706c86ec039162e" + version "1.3.5" + resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.5.tgz#eee25f56db1c9ec6085e0c22778083f596abf927" inline-source@^5.0.0: - version "5.2.2" - resolved "https://registry.yarnpkg.com/inline-source/-/inline-source-5.2.2.tgz#a82e3902d2de1c8acb0165b14ed61fb3ea66585a" + version "5.2.7" + resolved "https://registry.yarnpkg.com/inline-source/-/inline-source-5.2.7.tgz#443dcd2e2948664db872a64fa5bb4c91fd1fbf84" dependencies: - csso "3.0.x" + csso "3.4.x" htmlparser2 "3.9.x" is-plain-obj "1.1.x" object-assign "4.1.x" svgo "0.7.x" - uglify-js "2.8.x" + uglify-js "3.3.x" inquirer@^0.12.0: version "0.12.0" @@ -2436,13 +2929,32 @@ inquirer@^0.12.0: strip-ansi "^3.0.0" through "^2.3.6" -interpret@^1.0.0: - version "1.0.3" - resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.0.3.tgz#cbc35c62eeee73f19ab7b10a801511401afc0f90" +inquirer@^3.0.6: + version "3.3.0" + resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-3.3.0.tgz#9dd2f2ad765dcab1ff0443b491442a20ba227dc9" + dependencies: + ansi-escapes "^3.0.0" + chalk "^2.0.0" + cli-cursor "^2.1.0" + cli-width "^2.0.0" + external-editor "^2.0.4" + figures "^2.0.0" + lodash "^4.3.0" + mute-stream "0.0.7" + run-async "^2.2.0" + rx-lite "^4.0.8" + rx-lite-aggregates "^4.0.8" + string-width "^2.1.0" + strip-ansi "^4.0.0" + through "^2.3.6" + +interpret@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.1.0.tgz#7ed1b1410c6a0e0f78cf95d3b8440c63f78b8614" invariant@^2.2.0: - version "2.2.2" - resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.2.tgz#9e1f56ac0acdb6bf303306f338be3b204ae60360" + version "2.2.4" + resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.4.tgz#610f3c92c9359ce1db616e538008d23ff35158e6" dependencies: loose-envify "^1.0.0" @@ -2450,12 +2962,24 @@ invert-kv@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-1.0.0.tgz#104a8e4aaca6d3d8cd157a8ef8bfab2d7a3ffdb6" -is-absolute@^0.2.3: - version "0.2.6" - resolved "https://registry.yarnpkg.com/is-absolute/-/is-absolute-0.2.6.tgz#20de69f3db942ef2d87b9c2da36f172235b1b5eb" +is-absolute@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-absolute/-/is-absolute-1.0.0.tgz#395e1ae84b11f26ad1795e73c17378e48a301576" dependencies: - is-relative "^0.2.1" - is-windows "^0.2.0" + is-relative "^1.0.0" + is-windows "^1.0.1" + +is-accessor-descriptor@^0.1.6: + version "0.1.6" + resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz#a9e12cb3ae8d876727eeef3843f8a0897b5c98d6" + dependencies: + kind-of "^3.0.2" + +is-accessor-descriptor@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz#169c2f6d3df1f992618072365c9b0ea1f6878656" + dependencies: + kind-of "^6.0.0" is-arrayish@^0.2.1: version "0.2.1" @@ -2468,8 +2992,8 @@ is-binary-path@^1.0.0: binary-extensions "^1.0.0" is-buffer@^1.1.5, is-buffer@~1.1.1: - version "1.1.5" - resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.5.tgz#1f3b26ef613b214b88cbca23cc6c01d87961eecc" + version "1.1.6" + resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" is-builtin-module@^1.0.0: version "1.0.0" @@ -2481,13 +3005,41 @@ is-callable@^1.1.1, is-callable@^1.1.3: version "1.1.3" resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.1.3.tgz#86eb75392805ddc33af71c92a0eedf74ee7604b2" +is-data-descriptor@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz#0b5ee648388e2c860282e793f1856fec3f301b56" + dependencies: + kind-of "^3.0.2" + +is-data-descriptor@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz#d84876321d0e7add03990406abbbbd36ba9268c7" + dependencies: + kind-of "^6.0.0" + is-date-object@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.1.tgz#9aa20eb6aeebbff77fbd33e74ca01b33581d3a16" -is-dotfile@^1.0.0: +is-descriptor@^0.1.0: + version "0.1.6" + resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-0.1.6.tgz#366d8240dde487ca51823b1ab9f07a10a78251ca" + dependencies: + is-accessor-descriptor "^0.1.6" + is-data-descriptor "^0.1.4" + kind-of "^5.0.0" + +is-descriptor@^1.0.0, is-descriptor@^1.0.2: version "1.0.2" - resolved "https://registry.yarnpkg.com/is-dotfile/-/is-dotfile-1.0.2.tgz#2c132383f39199f8edc268ca01b9b007d205cc4d" + resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-1.0.2.tgz#3b159746a66604b04f8c81524ba365c5f14d86ec" + dependencies: + is-accessor-descriptor "^1.0.0" + is-data-descriptor "^1.0.0" + kind-of "^6.0.2" + +is-dotfile@^1.0.0: + version "1.0.3" + resolved "https://registry.yarnpkg.com/is-dotfile/-/is-dotfile-1.0.3.tgz#a6a2f32ffd2dfb04f5ca25ecd0f6b83cf798a1e1" is-equal-shallow@^0.1.3: version "0.1.3" @@ -2499,6 +3051,12 @@ is-extendable@^0.1.0, is-extendable@^0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" +is-extendable@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-1.0.1.tgz#a7470f9e426733d81bd81e1155264e3a3507cab4" + dependencies: + is-plain-object "^2.0.4" + is-extglob@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-1.0.0.tgz#ac468177c4943405a092fc8f29760c6ffc6206c0" @@ -2539,45 +3097,65 @@ is-glob@^3.1.0: dependencies: is-extglob "^2.1.0" +is-my-ip-valid@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-my-ip-valid/-/is-my-ip-valid-1.0.0.tgz#7b351b8e8edd4d3995d4d066680e664d94696824" + is-my-json-valid@^2.10.0, is-my-json-valid@^2.12.4: - version "2.16.0" - resolved "https://registry.yarnpkg.com/is-my-json-valid/-/is-my-json-valid-2.16.0.tgz#f079dd9bfdae65ee2038aae8acbc86ab109e3693" + version "2.17.2" + resolved "https://registry.yarnpkg.com/is-my-json-valid/-/is-my-json-valid-2.17.2.tgz#6b2103a288e94ef3de5cf15d29dd85fc4b78d65c" dependencies: generate-function "^2.0.0" generate-object-property "^1.1.0" + is-my-ip-valid "^1.0.0" jsonpointer "^4.0.0" xtend "^4.0.0" +is-negated-glob@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-negated-glob/-/is-negated-glob-1.0.0.tgz#6910bca5da8c95e784b5751b976cf5a10fee36d2" + is-number-like@^1.0.3: - version "1.0.7" - resolved "https://registry.yarnpkg.com/is-number-like/-/is-number-like-1.0.7.tgz#a38d6b0fd2cd4282449128859eed86c03fd23552" + version "1.0.8" + resolved "https://registry.yarnpkg.com/is-number-like/-/is-number-like-1.0.8.tgz#2e129620b50891042e44e9bbbb30593e75cfbbe3" dependencies: - bubleify "^0.5.1" lodash.isfinite "^3.3.2" -is-number@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/is-number/-/is-number-0.1.1.tgz#69a7af116963d47206ec9bd9b48a14216f1e3806" - -is-number@^2.0.2, is-number@^2.1.0: +is-number@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/is-number/-/is-number-2.1.0.tgz#01fcbbb393463a548f2f466cce16dece49db908f" dependencies: kind-of "^3.0.2" +is-number@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-3.0.0.tgz#24fd6201a4782cf50561c810276afc7d12d71195" + dependencies: + kind-of "^3.0.2" + +is-number@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-4.0.0.tgz#0026e37f5454d73e356dfe6564699867c6a7f0ff" + +is-odd@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-odd/-/is-odd-2.0.0.tgz#7646624671fd7ea558ccd9a2795182f2958f1b24" + dependencies: + is-number "^4.0.0" + is-path-cwd@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-path-cwd/-/is-path-cwd-1.0.0.tgz#d225ec23132e89edd38fda767472e62e65f1106d" is-path-in-cwd@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-path-in-cwd/-/is-path-in-cwd-1.0.0.tgz#6477582b8214d602346094567003be8a9eac04dc" + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-path-in-cwd/-/is-path-in-cwd-1.0.1.tgz#5ac48b345ef675339bd6c7a48a912110b241cf52" dependencies: is-path-inside "^1.0.0" is-path-inside@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-1.0.0.tgz#fc06e5a1683fbda13de667aff717bbc10a48f37f" + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-1.0.1.tgz#8ef5b7de50437a3fdca6b4e865ef7aa55cb48036" dependencies: path-is-inside "^1.0.1" @@ -2585,11 +3163,11 @@ is-plain-obj@1.1.x: version "1.1.0" resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-1.1.0.tgz#71a50c8429dfca773c92a390a4a03b39fcd51d3e" -is-plain-object@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.1.tgz#4d7ca539bc9db9b737b8acb612f2318ef92f294f" +is-plain-object@^2.0.1, is-plain-object@^2.0.3, is-plain-object@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677" dependencies: - isobject "^1.0.0" + isobject "^3.0.1" is-posix-bracket@^0.1.0: version "0.1.1" @@ -2599,27 +3177,29 @@ is-primitive@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/is-primitive/-/is-primitive-2.0.0.tgz#207bab91638499c07b2adf240a41a87210034575" +is-promise@^2.1, is-promise@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-2.1.0.tgz#79a2a9ece7f096e80f36d2b2f3bc16c1ff4bf3fa" + is-property@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/is-property/-/is-property-1.0.2.tgz#57fe1c4e48474edd65b09911f26b1cd4095dda84" -is-regex@^1.0.3: +is-regex@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.0.4.tgz#5517489b547091b0930e095654ced25ee97e9491" dependencies: has "^1.0.1" -is-relative@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/is-relative/-/is-relative-0.2.1.tgz#d27f4c7d516d175fb610db84bbeef23c3bc97aa5" +is-relative@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-relative/-/is-relative-1.0.0.tgz#a1bb6935ce8c5dba1e8b9754b9b2dcc020e2260d" dependencies: - is-unc-path "^0.1.1" + is-unc-path "^1.0.0" is-resolvable@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-resolvable/-/is-resolvable-1.0.0.tgz#8df57c61ea2e3c501408d100fb013cf8d6e0cc62" - dependencies: - tryit "^1.0.1" + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-resolvable/-/is-resolvable-1.1.0.tgz#fb18f87ce1feb925169c9a407c19318a3206ed88" is-stream@^1.0.1: version "1.1.0" @@ -2633,24 +3213,28 @@ is-typedarray@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" -is-unc-path@^0.1.1: - version "0.1.2" - resolved "https://registry.yarnpkg.com/is-unc-path/-/is-unc-path-0.1.2.tgz#6ab053a72573c10250ff416a3814c35178af39b9" +is-unc-path@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-unc-path/-/is-unc-path-1.0.0.tgz#d731e8898ed090a12c352ad2eaed5095ad322c9d" dependencies: - unc-path-regex "^0.1.0" + unc-path-regex "^0.1.2" -is-utf8@^0.2.0: +is-utf8@^0.2.0, is-utf8@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/is-utf8/-/is-utf8-0.2.1.tgz#4b0da1442104d1b336340e80797e865cf39f7d72" -is-valid-glob@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/is-valid-glob/-/is-valid-glob-0.3.0.tgz#d4b55c69f51886f9b65c70d6c2622d37e29f48fe" +is-valid-glob@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-valid-glob/-/is-valid-glob-1.0.0.tgz#29bf3eff701be2d4d315dbacc39bc39fe8f601aa" is-windows@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-0.2.0.tgz#de1aa6d63ea29dd248737b69f1ff8b8002d2108c" +is-windows@^1.0.1, is-windows@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d" + isarray@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf" @@ -2659,48 +3243,49 @@ isarray@1.0.0, isarray@^1.0.0, isarray@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" +isarray@2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-2.0.1.tgz#a37d94ed9cda2d59865c9f76fe596ee1f338741e" + isexe@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" -isobject@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/isobject/-/isobject-1.0.2.tgz#f0f9b8ce92dd540fa0740882e3835a2e022ec78a" - isobject@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89" dependencies: isarray "1.0.0" -isobject@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.0.tgz#39565217f3661789e8a0a0c080d5f7e6bc46e1a0" +isobject@^3.0.0, isobject@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" + +isomorphic-fetch@^2.1.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/isomorphic-fetch/-/isomorphic-fetch-2.2.1.tgz#611ae1acf14f5e81f729507472819fe9733558a9" + dependencies: + node-fetch "^1.0.1" + whatwg-fetch ">=0.10.0" isstream@~0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" -jodid25519@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/jodid25519/-/jodid25519-1.0.2.tgz#06d4912255093419477d425633606e0e90782967" - dependencies: - jsbn "~0.1.0" +js-base64@^2.1.8: + version "2.4.3" + resolved "https://registry.yarnpkg.com/js-base64/-/js-base64-2.4.3.tgz#2e545ec2b0f2957f41356510205214e98fad6582" -js-base64@^2.1.8, js-base64@^2.1.9: - version "2.1.9" - resolved "https://registry.yarnpkg.com/js-base64/-/js-base64-2.1.9.tgz#f0e80ae039a4bd654b5f281fc93f04a914a7fcce" +js-tokens@^3.0.0, js-tokens@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.2.tgz#9866df395102130e38f7f996bceb65443209c25b" -js-tokens@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.1.tgz#08e9f132484a2c45a30907e9dc4d5567b7f114d7" - -js-yaml@^3.4.6, js-yaml@^3.5.1, js-yaml@^3.5.4: - version "3.8.3" - resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.8.3.tgz#33a05ec481c850c8875929166fe1beb61c728766" +js-yaml@^3.4.6, js-yaml@^3.5.1, js-yaml@^3.5.4, js-yaml@^3.9.1: + version "3.11.0" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.11.0.tgz#597c1a8bd57152f26d622ce4117851a51f5ebaef" dependencies: argparse "^1.0.7" - esprima "^3.1.1" + esprima "^4.0.0" js-yaml@~3.7.0: version "3.7.0" @@ -2713,10 +3298,22 @@ jsbn@~0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" +jsesc@^2.5.1: + version "2.5.1" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.1.tgz#e421a2a8e20d6b0819df28908f782526b96dd1fe" + +json-schema-traverse@^0.3.0: + version "0.3.1" + resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz#349a6d44c53a51de89b40805c5d5e59b417d3340" + json-schema@0.2.3: version "0.2.3" resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13" +json-stable-stringify-without-jsonify@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" + json-stable-stringify@^1.0.0, json-stable-stringify@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz#9a759d39c5f2ff503fd5300646ed445f88c4f9af" @@ -2727,13 +3324,9 @@ json-stringify-safe@~5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" -json3@3.3.2: - version "3.3.2" - resolved "https://registry.yarnpkg.com/json3/-/json3-3.3.2.tgz#3c0434743df93e2f5c42aee7b19bcb483575f4e1" - -jsonfile@^2.1.0: - version "2.4.0" - resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-2.4.0.tgz#3736a2b428b87bbda0cc83b53fa3d633a35c2ae8" +jsonfile@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-3.0.1.tgz#a5ecc6f65f53f662c4415c7675a0331d0992ec66" optionalDependencies: graceful-fs "^4.1.6" @@ -2750,29 +3343,51 @@ jsonpointer@^4.0.0: resolved "https://registry.yarnpkg.com/jsonpointer/-/jsonpointer-4.0.1.tgz#4fd92cb34e0e9db3c89c8622ecf51f9b978c6cb9" jsprim@^1.2.2: - version "1.4.0" - resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.0.tgz#a3b87e40298d8c380552d8cc7628a0bb95a22918" + version "1.4.1" + resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.1.tgz#313e66bc1e5cc06e438bc1b7499c2e5c56acb6a2" dependencies: assert-plus "1.0.0" - extsprintf "1.0.2" + extsprintf "1.3.0" json-schema "0.2.3" - verror "1.3.6" + verror "1.10.0" -jsx-ast-utils@^1.3.4: - version "1.4.1" - resolved "https://registry.yarnpkg.com/jsx-ast-utils/-/jsx-ast-utils-1.4.1.tgz#3867213e8dd79bf1e8f2300c0cfc1efb182c0df1" +jsx-ast-utils@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/jsx-ast-utils/-/jsx-ast-utils-2.0.1.tgz#e801b1b39985e20fffc87b40e3748080e2dcac7f" + dependencies: + array-includes "^3.0.3" -kind-of@^3.0.2, kind-of@^3.1.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.0.tgz#b58abe4d5c044ad33726a8c1525b48cf891bff07" +just-debounce@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/just-debounce/-/just-debounce-1.0.0.tgz#87fccfaeffc0b68cd19d55f6722943f929ea35ea" + +kind-of@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-1.1.0.tgz#140a3d2d41a36d2efcfa9377b62c24f8495a5c44" + +kind-of@^3.0.2, kind-of@^3.0.3, kind-of@^3.1.0, kind-of@^3.2.0: + version "3.2.2" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64" dependencies: is-buffer "^1.1.5" -klaw@^1.0.0: - version "1.3.1" - resolved "https://registry.yarnpkg.com/klaw/-/klaw-1.3.1.tgz#4088433b46b3b1ba259d78785d8e96f73ba02439" - optionalDependencies: - graceful-fs "^4.1.9" +kind-of@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-4.0.0.tgz#20813df3d712928b207378691a45066fae72dd57" + dependencies: + is-buffer "^1.1.5" + +kind-of@^5.0.0, kind-of@^5.0.2: + version "5.1.0" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-5.1.0.tgz#729c91e2d857b7a419a1f9aa65685c4c33f5845d" + +kind-of@^6.0.0, kind-of@^6.0.2: + version "6.0.2" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.2.tgz#01146b36a6218e64e58f3a8d66de5d7fc6f6d051" + +known-css-properties@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/known-css-properties/-/known-css-properties-0.3.0.tgz#a3d135bbfc60ee8c6eacf2f7e7e6f2d4755e49a4" last-run@^1.1.0: version "1.1.1" @@ -2781,10 +3396,6 @@ last-run@^1.1.0: default-resolution "^2.0.0" es6-weak-map "^2.0.1" -lazy-cache@^1.0.3: - version "1.0.4" - resolved "https://registry.yarnpkg.com/lazy-cache/-/lazy-cache-1.0.4.tgz#a1d78fc3a50474cb80845d3b3b6e1da49a446e8e" - lazystream@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/lazystream/-/lazystream-1.0.0.tgz#f6995fe0f820392f61396be89462407bb77168e4" @@ -2797,9 +3408,15 @@ lcid@^1.0.0: dependencies: invert-kv "^1.0.0" -leaflet@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/leaflet/-/leaflet-1.0.3.tgz#1f401b98b45c8192134c6c8d69686253805007c8" +lead@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/lead/-/lead-1.0.0.tgz#6f14f99a37be3a9dd784f5495690e5903466ee42" + dependencies: + flush-write-stream "^1.0.2" + +leaflet@^1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/leaflet/-/leaflet-1.3.1.tgz#86f336d2fb0e2d0ff446677049a5dc34cf0ea60e" levn@^0.3.0, levn@~0.3.0: version "0.3.0" @@ -2808,23 +3425,22 @@ levn@^0.3.0, levn@~0.3.0: prelude-ls "~1.1.2" type-check "~0.3.2" -liftoff@^2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/liftoff/-/liftoff-2.3.0.tgz#a98f2ff67183d8ba7cfaca10548bd7ff0550b385" +liftoff@^2.5.0: + version "2.5.0" + resolved "https://registry.yarnpkg.com/liftoff/-/liftoff-2.5.0.tgz#2009291bb31cea861bbf10a7c15a28caf75c31ec" dependencies: extend "^3.0.0" - findup-sync "^0.4.2" + findup-sync "^2.0.0" fined "^1.0.1" - flagged-respawn "^0.3.2" - lodash.isplainobject "^4.0.4" - lodash.isstring "^4.0.1" - lodash.mapvalues "^4.4.0" + flagged-respawn "^1.0.0" + is-plain-object "^2.0.4" + object.map "^1.0.0" rechoir "^0.6.2" resolve "^1.1.7" limiter@^1.0.5: - version "1.1.0" - resolved "https://registry.yarnpkg.com/limiter/-/limiter-1.1.0.tgz#6e2bd12ca3fcdaa11f224e2e53c896df3f08d913" + version "1.1.2" + resolved "https://registry.yarnpkg.com/limiter/-/limiter-1.1.2.tgz#229d8055891c8b11af9e0ee5200e8e09bb3dcbeb" load-json-file@^1.0.0: version "1.1.0" @@ -2836,13 +3452,13 @@ load-json-file@^1.0.0: pinkie-promise "^2.0.0" strip-bom "^2.0.0" -localtunnel@1.8.2: - version "1.8.2" - resolved "https://registry.yarnpkg.com/localtunnel/-/localtunnel-1.8.2.tgz#913051e8328b51f75ad8a22ad1f5c5b8c599a359" +localtunnel@1.8.3: + version "1.8.3" + resolved "https://registry.yarnpkg.com/localtunnel/-/localtunnel-1.8.3.tgz#dcc5922fd85651037d4bde24fd93248d0b24eb05" dependencies: - debug "2.2.0" - openurl "1.1.0" - request "2.78.0" + debug "2.6.8" + openurl "1.1.1" + request "2.81.0" yargs "3.29.0" lodash._basecopy@^3.0.0: @@ -2885,9 +3501,13 @@ lodash.assign@^4.1.0, lodash.assign@^4.2.0: version "4.2.0" resolved "https://registry.yarnpkg.com/lodash.assign/-/lodash.assign-4.2.0.tgz#0d99f3ccd7a6d261d19bdaeb9245005d285808e7" -lodash.assignwith@^4.0.7: +lodash.assignin@^4.0.9: version "4.2.0" - resolved "https://registry.yarnpkg.com/lodash.assignwith/-/lodash.assignwith-4.2.0.tgz#127a97f02adc41751a954d24b0de17e100e038eb" + resolved "https://registry.yarnpkg.com/lodash.assignin/-/lodash.assignin-4.2.0.tgz#ba8df5fb841eb0a3e8044232b0e263a8dc6a28a2" + +lodash.bind@^4.1.4: + version "4.2.1" + resolved "https://registry.yarnpkg.com/lodash.bind/-/lodash.bind-4.2.1.tgz#7ae3017e939622ac31b7d7d7dcb1b34db1690d35" lodash.capitalize@^4.1.0: version "4.2.1" @@ -2897,10 +3517,6 @@ lodash.clonedeep@^4.3.2: version "4.5.0" resolved "https://registry.yarnpkg.com/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz#e23f3f9c4f8fbdde872529c1071857a086e5ccef" -lodash.debounce@^4.0.6: - version "4.0.8" - resolved "https://registry.yarnpkg.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af" - lodash.defaults@^4.0.1: version "4.2.0" resolved "https://registry.yarnpkg.com/lodash.defaults/-/lodash.defaults-4.2.0.tgz#d09178716ffea4dde9e5fb7b37f6f0802274580c" @@ -2911,6 +3527,18 @@ lodash.escape@^3.0.0: dependencies: lodash._root "^3.0.0" +lodash.filter@^4.4.0: + version "4.6.0" + resolved "https://registry.yarnpkg.com/lodash.filter/-/lodash.filter-4.6.0.tgz#668b1d4981603ae1cc5a6fa760143e480b4c4ace" + +lodash.flatten@^4.2.0: + version "4.4.0" + resolved "https://registry.yarnpkg.com/lodash.flatten/-/lodash.flatten-4.4.0.tgz#f31c22225a9632d2bbf8e4addbef240aa765a61f" + +lodash.foreach@^4.3.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/lodash.foreach/-/lodash.foreach-4.5.0.tgz#1a6a35eace401280c7f06dddec35165ab27e3e53" + lodash.isarguments@^3.0.0: version "3.1.0" resolved "https://registry.yarnpkg.com/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz#2f573d85c6a24289ff00663b491c1d338ff3458a" @@ -2919,30 +3547,10 @@ lodash.isarray@^3.0.0: version "3.0.4" resolved "https://registry.yarnpkg.com/lodash.isarray/-/lodash.isarray-3.0.4.tgz#79e4eb88c36a8122af86f844aa9bcd851b5fbb55" -lodash.isempty@^4.2.1: - version "4.4.0" - resolved "https://registry.yarnpkg.com/lodash.isempty/-/lodash.isempty-4.4.0.tgz#6f86cbedd8be4ec987be9aaf33c9684db1b31e7e" - -lodash.isequal@^4.0.0: - version "4.5.0" - resolved "https://registry.yarnpkg.com/lodash.isequal/-/lodash.isequal-4.5.0.tgz#415c4478f2bcc30120c22ce10ed3226f7d3e18e0" - lodash.isfinite@^3.3.2: version "3.3.2" resolved "https://registry.yarnpkg.com/lodash.isfinite/-/lodash.isfinite-3.3.2.tgz#fb89b65a9a80281833f0b7478b3a5104f898ebb3" -lodash.isfunction@^3.0.8: - version "3.0.8" - resolved "https://registry.yarnpkg.com/lodash.isfunction/-/lodash.isfunction-3.0.8.tgz#4db709fc81bc4a8fd7127a458a5346c5cdce2c6b" - -lodash.isplainobject@^4.0.4: - version "4.0.6" - resolved "https://registry.yarnpkg.com/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz#7c526a52d89b45c45cc690b88163be0497f550cb" - -lodash.isstring@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/lodash.isstring/-/lodash.isstring-4.0.1.tgz#d527dfb5456eca7cc9bb95d5daeaf88ba54a5451" - lodash.kebabcase@^4.0.0: version "4.1.1" resolved "https://registry.yarnpkg.com/lodash.kebabcase/-/lodash.kebabcase-4.1.1.tgz#8489b1cb0d29ff88195cceca448ff6d6cc295c36" @@ -2955,25 +3563,37 @@ lodash.keys@^3.0.0: lodash.isarguments "^3.0.0" lodash.isarray "^3.0.0" -lodash.mapvalues@^4.4.0: +lodash.map@^4.4.0: version "4.6.0" - resolved "https://registry.yarnpkg.com/lodash.mapvalues/-/lodash.mapvalues-4.6.0.tgz#1bafa5005de9dd6f4f26668c30ca37230cc9689c" + resolved "https://registry.yarnpkg.com/lodash.map/-/lodash.map-4.6.0.tgz#771ec7839e3473d9c4cde28b19394c3562f4f6d3" + +lodash.merge@^4.4.0: + version "4.6.1" + resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.1.tgz#adc25d9cb99b9391c59624f379fbba60d7111d54" lodash.mergewith@^4.6.0: - version "4.6.0" - resolved "https://registry.yarnpkg.com/lodash.mergewith/-/lodash.mergewith-4.6.0.tgz#150cf0a16791f5903b8891eab154609274bdea55" + version "4.6.1" + resolved "https://registry.yarnpkg.com/lodash.mergewith/-/lodash.mergewith-4.6.1.tgz#639057e726c3afbdb3e7d42741caa8d6e4335927" lodash.pick@^4.2.1: version "4.4.0" resolved "https://registry.yarnpkg.com/lodash.pick/-/lodash.pick-4.4.0.tgz#52f05610fff9ded422611441ed1fc123a03001b3" +lodash.reduce@^4.4.0: + version "4.6.0" + resolved "https://registry.yarnpkg.com/lodash.reduce/-/lodash.reduce-4.6.0.tgz#f1ab6b839299ad48f784abbf476596f03b914d3b" + +lodash.reject@^4.4.0: + version "4.6.0" + resolved "https://registry.yarnpkg.com/lodash.reject/-/lodash.reject-4.6.0.tgz#80d6492dc1470864bbf583533b651f42a9f52415" + lodash.restparam@^3.0.0: version "3.6.1" resolved "https://registry.yarnpkg.com/lodash.restparam/-/lodash.restparam-3.6.1.tgz#936a4e309ef330a7645ed4145986c85ae5b20805" -lodash.sortby@^4.5.0: - version "4.7.0" - resolved "https://registry.yarnpkg.com/lodash.sortby/-/lodash.sortby-4.7.0.tgz#edd14c824e2cc9c1e0b0a1b42bb5210516a42438" +lodash.some@^4.4.0: + version "4.6.0" + resolved "https://registry.yarnpkg.com/lodash.some/-/lodash.some-4.6.0.tgz#1bb9f314ef6b8baded13b549169b2a945eb68e4d" lodash.template@^3.0.0: version "3.6.2" @@ -3000,19 +3620,11 @@ lodash@^3.10.1, lodash@^3.2.0: version "3.10.1" resolved "https://registry.yarnpkg.com/lodash/-/lodash-3.10.1.tgz#5bf45e8e49ba4189e17d482789dfd15bd140b7b6" -lodash@^4.0.0, lodash@^4.13.1, lodash@^4.2.0, lodash@^4.3.0: - version "4.17.4" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.4.tgz#78203a4d1c328ae1d86dca6460e369b57f4055ae" +lodash@^4.0.0, lodash@^4.13.1, lodash@^4.14.0, lodash@^4.17.4, lodash@^4.2.0, lodash@^4.3.0, lodash@~4.17.4: + version "4.17.5" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.5.tgz#99a92d65c0272debe8c96b6057bc8fbfa3bed511" -lodash@~4.16.4: - version "4.16.6" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.16.6.tgz#d22c9ac660288f3843e16ba7d2b5d06cca27d777" - -longest@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/longest/-/longest-1.0.1.tgz#30a0b2da38f73770e8294a0d22e6625ed77d0097" - -loose-envify@^1.0.0: +loose-envify@^1.0.0, loose-envify@^1.3.1: version "1.3.1" resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.3.1.tgz#d1a8ad33fa9ce0e713d65fdd0ac8b748d478c848" dependencies: @@ -3030,17 +3642,17 @@ lower-case@^1.1.1: resolved "https://registry.yarnpkg.com/lower-case/-/lower-case-1.1.4.tgz#9a2cabd1b9e8e0ae993a4bf7d5875c39c42e8eac" lru-cache@^4.0.1: - version "4.0.2" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.0.2.tgz#1d17679c069cda5d040991a09dbc2c0db377e55e" + version "4.1.2" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.2.tgz#45234b2e6e2f2b33da125624c4664929a0224c3f" dependencies: - pseudomap "^1.0.1" - yallist "^2.0.0" + pseudomap "^1.0.2" + yallist "^2.1.2" -magic-string@^0.14.0: - version "0.14.0" - resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.14.0.tgz#57224aef1701caeed273b17a39a956e72b172462" +lru-queue@0.1: + version "0.1.0" + resolved "https://registry.yarnpkg.com/lru-queue/-/lru-queue-0.1.0.tgz#2738bd9f0d3cf4f84490c5736c48699ac632cda3" dependencies: - vlq "^0.2.1" + es5-ext "~0.10.2" make-error-cause@^1.1.1: version "1.2.2" @@ -3049,14 +3661,8 @@ make-error-cause@^1.1.1: make-error "^1.2.0" make-error@^1.2.0: - version "1.2.3" - resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.2.3.tgz#6c4402df732e0977ac6faf754a5074b3d2b1d19d" - -make-iterator@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/make-iterator/-/make-iterator-0.1.1.tgz#873d27b8198a465a81483b6f5d16da4e863ecf5b" - dependencies: - for-own "^0.1.1" + version "1.3.4" + resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.4.tgz#19978ed575f9e9545d2ff8c13e33b5d18a67d535" make-iterator@^1.0.0: version "1.0.0" @@ -3064,7 +3670,7 @@ make-iterator@^1.0.0: dependencies: kind-of "^3.1.0" -map-cache@^0.2.0: +map-cache@^0.2.0, map-cache@^0.2.2: version "0.2.2" resolved "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf" @@ -3076,6 +3682,12 @@ map-stream@^0.1.0, map-stream@~0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/map-stream/-/map-stream-0.1.0.tgz#e56aa94c4c8055a16404a0674b78f215f7c8e194" +map-visit@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/map-visit/-/map-visit-1.0.0.tgz#ecdca8f13144e660f1b5bd41f12f3479d98dfb8f" + dependencies: + object-visit "^1.0.0" + match-stream@~0.0.2: version "0.0.2" resolved "https://registry.yarnpkg.com/match-stream/-/match-stream-0.0.2.tgz#99eb050093b34dffade421b9ac0b410a9cfa17cf" @@ -3083,14 +3695,14 @@ match-stream@~0.0.2: buffers "~0.1.1" readable-stream "~1.0.0" -matchdep@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/matchdep/-/matchdep-1.0.1.tgz#a57a33804491fbae208aba8f68380437abc2dca5" +matchdep@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/matchdep/-/matchdep-2.0.0.tgz#c6f34834a0d8dbc3b37c27ee8bbcb27c7775582e" dependencies: - findup-sync "~0.3.0" - micromatch "^2.3.7" - resolve "~1.1.6" - stack-trace "0.0.9" + findup-sync "^2.0.0" + micromatch "^3.0.4" + resolve "^1.4.0" + stack-trace "0.0.10" md5@^2.0.0: version "2.2.1" @@ -3100,7 +3712,24 @@ md5@^2.0.0: crypt "~0.0.1" is-buffer "~1.1.1" -meow@^3.3.0, meow@^3.7.0: +mdn-data@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/mdn-data/-/mdn-data-1.1.0.tgz#a7056319da95a2d0881267d7263075042eb061e2" + +memoizee@0.4.X: + version "0.4.12" + resolved "https://registry.yarnpkg.com/memoizee/-/memoizee-0.4.12.tgz#780e99a219c50c549be6d0fc61765080975c58fb" + dependencies: + d "1" + es5-ext "^0.10.30" + es6-weak-map "^2.0.2" + event-emitter "^0.3.5" + is-promise "^2.1" + lru-queue "0.1" + next-tick "1" + timers-ext "^0.1.2" + +meow@^3.7.0: version "3.7.0" resolved "https://registry.yarnpkg.com/meow/-/meow-3.7.0.tgz#72cb668b425228290abbfa856892587308a801fb" dependencies: @@ -3152,29 +3781,47 @@ micromatch@2.3.11, micromatch@^2.1.5, micromatch@^2.3.7, micromatch@^2.3.8: parse-glob "^3.0.4" regex-cache "^0.4.2" -mime-db@~1.27.0: - version "1.27.0" - resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.27.0.tgz#820f572296bbd20ec25ed55e5b5de869e5436eb1" - -mime-types@^2.1.12, mime-types@~2.1.11, mime-types@~2.1.7: - version "2.1.15" - resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.15.tgz#a4ebf5064094569237b8cf70046776d09fc92aed" +micromatch@^3.0.4: + version "3.1.10" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.10.tgz#70859bc95c9840952f359a068a3fc49f9ecfac23" dependencies: - mime-db "~1.27.0" + arr-diff "^4.0.0" + array-unique "^0.3.2" + braces "^2.3.1" + define-property "^2.0.2" + extend-shallow "^3.0.2" + extglob "^2.0.4" + fragment-cache "^0.2.1" + kind-of "^6.0.2" + nanomatch "^1.2.9" + object.pick "^1.3.0" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.2" -mime@1.2.4: - version "1.2.4" - resolved "https://registry.yarnpkg.com/mime/-/mime-1.2.4.tgz#11b5fdaf29c2509255176b80ad520294f5de92b7" +mime-db@~1.33.0: + version "1.33.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.33.0.tgz#a3492050a5cb9b63450541e39d9788d2272783db" -mime@1.3.4, "mime@>= 0.0.1": +mime-types@^2.1.12, mime-types@~2.1.11, mime-types@~2.1.17, mime-types@~2.1.18, mime-types@~2.1.7: + version "2.1.18" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.18.tgz#6f323f60a83d11146f831ff11fd66e2fe5503bb8" + dependencies: + mime-db "~1.33.0" + +mime@1.3.4: version "1.3.4" resolved "https://registry.yarnpkg.com/mime/-/mime-1.3.4.tgz#115f9e3b6b3daf2959983cb38f149a2d40eb5d53" -"minimatch@2 || 3", minimatch@^3.0.0, minimatch@^3.0.2, minimatch@^3.0.3, minimatch@~3.0.2: - version "3.0.3" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.3.tgz#2a4e4090b96b2db06a9d7df01055a62a77c9b774" +mimic-fn@^1.0.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-1.2.0.tgz#820c86a39334640e99516928bd03fca88057d022" + +"minimatch@2 || 3", minimatch@^3.0.0, minimatch@^3.0.2, minimatch@^3.0.3, minimatch@^3.0.4, minimatch@~3.0.2: + version "3.0.4" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" dependencies: - brace-expansion "^1.0.0" + brace-expansion "^1.1.7" minimist@0.0.8: version "0.0.8" @@ -3188,32 +3835,39 @@ minimist@^1.1.0, minimist@^1.1.3, minimist@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284" +mixin-deep@^1.2.0: + version "1.3.1" + resolved "https://registry.yarnpkg.com/mixin-deep/-/mixin-deep-1.3.1.tgz#a49e7268dce1a0d9698e45326c5626df3543d0fe" + dependencies: + for-in "^1.0.2" + is-extendable "^1.0.1" + mkdirp@*, mkdirp@0.5, "mkdirp@>=0.5 0", mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@~0.5.1: version "0.5.1" resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" dependencies: minimist "0.0.8" -mkdirp@0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.3.0.tgz#1bbf5ab1ba827af23575143490426455f481fe1e" - -moment@^2.17.1: - version "2.18.1" - resolved "https://registry.yarnpkg.com/moment/-/moment-2.18.1.tgz#c36193dd3ce1c2eed2adb7c802dbbc77a81b1c0f" +moment@^2.21.0: + version "2.21.0" + resolved "https://registry.yarnpkg.com/moment/-/moment-2.21.0.tgz#2a114b51d2a6ec9e6d83cf803f838a878d8a023a" ms@0.7.1: version "0.7.1" resolved "https://registry.yarnpkg.com/ms/-/ms-0.7.1.tgz#9cd13c03adbff25b65effde7ce864ee952017098" -ms@0.7.2: - version "0.7.2" - resolved "https://registry.yarnpkg.com/ms/-/ms-0.7.2.tgz#ae25cf2512b3885a1d95d7f037868d8431124765" - ms@0.7.3: version "0.7.3" resolved "https://registry.yarnpkg.com/ms/-/ms-0.7.3.tgz#708155a5e44e33f5fd0fc53e81d0d40a91be1fff" +ms@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/ms/-/ms-1.0.0.tgz#59adcd22edc543f7b5381862d31387b1f4bc9473" + +ms@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" + multipipe@^0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/multipipe/-/multipipe-0.1.2.tgz#2a8f2ddf70eed564dff2d57f1e1a137d9f05078b" @@ -3228,21 +3882,42 @@ mute-stream@0.0.5: version "0.0.5" resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.5.tgz#8fbfabb0a98a253d3184331f9e8deb7372fac6c0" +mute-stream@0.0.7: + version "0.0.7" + resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.7.tgz#3075ce93bc21b8fab43e1bc4da7e8115ed1e7bab" + nan@^2.3.0, nan@^2.3.2: - version "2.6.2" - resolved "https://registry.yarnpkg.com/nan/-/nan-2.6.2.tgz#e4ff34e6c95fdfb5aecc08de6596f43605a7db45" + version "2.10.0" + resolved "https://registry.yarnpkg.com/nan/-/nan-2.10.0.tgz#96d0cd610ebd58d4b4de9cc0c6828cda99c7548f" + +nanomatch@^1.2.9: + version "1.2.9" + resolved "https://registry.yarnpkg.com/nanomatch/-/nanomatch-1.2.9.tgz#879f7150cb2dab7a471259066c104eee6e0fa7c2" + dependencies: + arr-diff "^4.0.0" + array-unique "^0.3.2" + define-property "^2.0.2" + extend-shallow "^3.0.2" + fragment-cache "^0.2.1" + is-odd "^2.0.0" + is-windows "^1.0.2" + kind-of "^6.0.2" + object.pick "^1.3.0" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.1" natives@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/natives/-/natives-1.1.0.tgz#e9ff841418a6b2ec7a495e939984f78f163e6e31" + version "1.1.2" + resolved "https://registry.yarnpkg.com/natives/-/natives-1.1.2.tgz#4437ca1ed8a7f047531ccdfaf2792853df4efa1c" natural-compare@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" -navigo@^4.7.1: - version "4.7.1" - resolved "https://registry.yarnpkg.com/navigo/-/navigo-4.7.1.tgz#8b28980c0a1cc12e255656cd962c9c6cc5cd111c" +navigo@^7.1.1: + version "7.1.1" + resolved "https://registry.yarnpkg.com/navigo/-/navigo-7.1.1.tgz#c7e3eb4398125769f3bc6b7c924d8139da466038" ncname@1.0.x: version "1.0.0" @@ -3254,19 +3929,26 @@ negotiator@0.6.1: version "0.6.1" resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.1.tgz#2b327184e8992101177b28563fb5e7102acd0ca9" -next-tick@^1.0.0: +next-tick@1: version "1.0.0" resolved "https://registry.yarnpkg.com/next-tick/-/next-tick-1.0.0.tgz#ca86d1fe8828169b0120208e3dc8424b9db8342c" no-case@^2.2.0: - version "2.3.1" - resolved "https://registry.yarnpkg.com/no-case/-/no-case-2.3.1.tgz#7aeba1c73a52184265554b7dc03baf720df80081" + version "2.3.2" + resolved "https://registry.yarnpkg.com/no-case/-/no-case-2.3.2.tgz#60b813396be39b3f1288a4c1ed5d1e7d28b464ac" dependencies: lower-case "^1.1.1" +node-fetch@^1.0.1: + version "1.7.3" + resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-1.7.3.tgz#980f6f72d85211a5347c6b2bc18c5b84c3eb47ef" + dependencies: + encoding "^0.1.11" + is-stream "^1.0.1" + node-gyp@^3.3.1: - version "3.6.1" - resolved "https://registry.yarnpkg.com/node-gyp/-/node-gyp-3.6.1.tgz#19561067ff185464aded478212681f47fd578cbc" + version "3.6.2" + resolved "https://registry.yarnpkg.com/node-gyp/-/node-gyp-3.6.2.tgz#9bfbe54562286284838e750eac05295853fa1c60" dependencies: fstream "^1.0.0" glob "^7.0.3" @@ -3291,15 +3973,17 @@ node-polyglot@^2.2.2: string.prototype.trim "^1.1.2" warning "^3.0.0" -node-pre-gyp@^0.6.29: - version "0.6.34" - resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.6.34.tgz#94ad1c798a11d7fc67381b50d47f8cc18d9799f7" +node-pre-gyp@^0.6.39: + version "0.6.39" + resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.6.39.tgz#c00e96860b23c0e1420ac7befc5044e1d78d8649" dependencies: + detect-libc "^1.0.2" + hawk "3.1.3" mkdirp "^0.5.1" nopt "^4.0.1" npmlog "^4.0.2" rc "^1.1.7" - request "^2.81.0" + request "2.81.0" rimraf "^2.6.1" semver "^5.3.0" tar "^2.2.1" @@ -3313,8 +3997,8 @@ node-rest-client@^1.4.1: xml2js ">=0.2.4" node-sass@^4.2.0: - version "4.5.2" - resolved "https://registry.yarnpkg.com/node-sass/-/node-sass-4.5.2.tgz#4012fa2bd129b1d6365117e88d9da0500d99da64" + version "4.7.2" + resolved "https://registry.yarnpkg.com/node-sass/-/node-sass-4.7.2.tgz#9366778ba1469eb01438a9e8592f4262bcb6794e" dependencies: async-foreach "^0.1.3" chalk "^1.1.1" @@ -3331,15 +4015,12 @@ node-sass@^4.2.0: nan "^2.3.2" node-gyp "^3.3.1" npmlog "^4.0.0" - request "^2.79.0" - sass-graph "^2.1.1" + request "~2.79.0" + sass-graph "^2.2.4" stdout-stream "^1.4.0" + "true-case-path" "^1.0.2" -node-uuid@~1.4.7: - version "1.4.8" - resolved "https://registry.yarnpkg.com/node-uuid/-/node-uuid-1.4.8.tgz#b040eb0923968afabf8d32fb1f17f1167fdab907" - -"nopt@2 || 3", nopt@3.0.x: +"nopt@2 || 3": version "3.0.6" resolved "https://registry.yarnpkg.com/nopt/-/nopt-3.0.6.tgz#c6465dbf08abcd4db359317f79ac68a646b28ff9" dependencies: @@ -3353,15 +4034,15 @@ nopt@^4.0.1: osenv "^0.1.4" normalize-package-data@^2.3.2, normalize-package-data@^2.3.4: - version "2.3.8" - resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.3.8.tgz#d819eda2a9dedbd1ffa563ea4071d936782295bb" + version "2.4.0" + resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.4.0.tgz#12f95a307d58352075a04907b84ac8be98ac012f" dependencies: hosted-git-info "^2.1.4" is-builtin-module "^1.0.0" semver "2 || 3 || 4 || 5" validate-npm-package-license "^3.0.1" -normalize-path@^2.0.1, normalize-path@^2.1.1: +normalize-path@^2.0.0, normalize-path@^2.0.1, normalize-path@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9" dependencies: @@ -3371,22 +4052,22 @@ normalize-range@^0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/normalize-range/-/normalize-range-0.1.2.tgz#2d10c06bdfd312ea9777695a4d28439456b75942" -now-and-later@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/now-and-later/-/now-and-later-1.0.0.tgz#23e798ccaaf0e8acbef0687f82086274746e0893" +now-and-later@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/now-and-later/-/now-and-later-2.0.0.tgz#bc61cbb456d79cb32207ce47ca05136ff2e7d6ee" dependencies: once "^1.3.2" "npmlog@0 || 1 || 2 || 3 || 4", npmlog@^4.0.0, npmlog@^4.0.2: - version "4.1.0" - resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.1.0.tgz#dc59bee85f64f00ed424efb2af0783df25d1c0b5" + version "4.1.2" + resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.1.2.tgz#08a7f2a8bf734604779a9efa4ad5cc717abb954b" dependencies: are-we-there-yet "~1.1.2" console-control-strings "~1.1.0" gauge "~2.7.3" set-blocking "~2.0.0" -nth-check@~1.0.0: +nth-check@~1.0.0, nth-check@~1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/nth-check/-/nth-check-1.0.1.tgz#9929acdf628fc2c41098deab82ac580cf149aae4" dependencies: @@ -3400,15 +4081,11 @@ number-is-nan@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" -oauth-sign@~0.8.1: +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" -object-assign@4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.0.tgz#7a3b3d0e98063d43f4c03f2e8ae6cd51a86883a0" - -object-assign@4.1.x, object-assign@^4.0.0, object-assign@^4.0.1, object-assign@^4.1.0, object-assign@^4.1.1: +object-assign@4.1.x, object-assign@4.X, object-assign@^4.0.1, object-assign@^4.1.0, object-assign@^4.1.1: version "4.1.1" resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" @@ -3420,7 +4097,15 @@ object-component@0.0.3: version "0.0.3" resolved "https://registry.yarnpkg.com/object-component/-/object-component-0.0.3.tgz#f0c69aa50efc95b866c186f400a33769cb2f1291" -object-keys@^1.0.8: +object-copy@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/object-copy/-/object-copy-0.1.0.tgz#7e7d858b781bd7c991a41ba975ed3812754e998c" + dependencies: + copy-descriptor "^0.1.0" + define-property "^0.2.5" + kind-of "^3.0.3" + +object-keys@^1.0.11, object-keys@^1.0.8: version "1.0.11" resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.0.11.tgz#c54601778ad560f1142ce0e01bcca8b56d13426d" @@ -3428,16 +4113,22 @@ object-path@^0.9.0: version "0.9.2" resolved "https://registry.yarnpkg.com/object-path/-/object-path-0.9.2.tgz#0fd9a74fc5fad1ae3968b586bda5c632bd6c05a5" -object.defaults@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/object.defaults/-/object.defaults-0.3.0.tgz#b1eb9cbc78c4c7bd56cac6cae3dead5a7113882a" +object-visit@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/object-visit/-/object-visit-1.0.1.tgz#f79c4493af0c5377b59fe39d395e41042dd045bb" dependencies: - array-each "^0.1.0" - array-slice "^0.2.3" - for-own "^0.1.3" - isobject "^1.0.0" + isobject "^3.0.0" -object.defaults@^1.0.0: +object.assign@^4.0.4: + version "4.1.0" + resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.0.tgz#968bf1100d7956bb3ca086f006f846b3bc4008da" + dependencies: + define-properties "^1.1.2" + function-bind "^1.1.1" + has-symbols "^1.0.0" + object-keys "^1.0.11" + +object.defaults@^1.0.0, object.defaults@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/object.defaults/-/object.defaults-1.1.0.tgz#3a7f868334b407dea06da16d88d5cd29e435fecf" dependencies: @@ -3446,6 +4137,13 @@ object.defaults@^1.0.0: for-own "^1.0.0" isobject "^3.0.0" +object.map@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/object.map/-/object.map-1.0.1.tgz#cf83e59dc8fcc0ad5f4250e1f78b3b81bd801d37" + dependencies: + for-own "^1.0.0" + make-iterator "^1.0.0" + object.omit@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/object.omit/-/object.omit-2.0.1.tgz#1a9c744829f39dbb858c76ca3579ae2a54ebd1fa" @@ -3453,11 +4151,18 @@ 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" +object.pick@^1.2.0, object.pick@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/object.pick/-/object.pick-1.3.0.tgz#87a10ac4c1694bd2e1cbf53591a66141fb5dd747" dependencies: - for-own "^0.1.3" + isobject "^3.0.1" + +object.reduce@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/object.reduce/-/object.reduce-1.0.1.tgz#6fe348f2ac7fa0f95ca621226599096825bb03ad" + dependencies: + for-own "^1.0.0" + make-iterator "^1.0.0" on-finished@~2.3.0: version "2.3.0" @@ -3465,25 +4170,25 @@ on-finished@~2.3.0: dependencies: ee-first "1.1.1" -once@^1.3.0, once@^1.3.2, once@^1.3.3, once@^1.4.0: +once@^1.3.0, once@^1.3.1, once@^1.3.2, 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: wrappy "1" -once@~1.3.0: - version "1.3.3" - resolved "https://registry.yarnpkg.com/once/-/once-1.3.3.tgz#b2e261557ce4c314ec8304f3fa82663e4297ca20" - dependencies: - wrappy "1" - onetime@^1.0.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/onetime/-/onetime-1.1.0.tgz#a1f7838f8314c516f05ecefcbc4ccfe04b4ed789" + resolved "http://registry.npmjs.org/onetime/-/onetime-1.1.0.tgz#a1f7838f8314c516f05ecefcbc4ccfe04b4ed789" -openurl@1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/openurl/-/openurl-1.1.0.tgz#e2f2189d999c04823201f083f0f1a7cd8903187a" +onetime@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/onetime/-/onetime-2.0.1.tgz#067428230fd67443b2794b22bba528b6867962d4" + dependencies: + mimic-fn "^1.0.0" + +openurl@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/openurl/-/openurl-1.1.1.tgz#3875b4b0ef7a52c156f0db41d4609dbb0f94b387" opn@4.0.2: version "4.0.2" @@ -3503,15 +4208,10 @@ optionator@^0.8.1, optionator@^0.8.2: type-check "~0.3.2" wordwrap "~1.0.0" -options@>=0.0.5: - version "0.0.6" - resolved "https://registry.yarnpkg.com/options/-/options-0.0.6.tgz#ec22d312806bb53e731773e7cdaefcf1c643128f" - -ordered-read-streams@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/ordered-read-streams/-/ordered-read-streams-0.3.0.tgz#7137e69b3298bb342247a1bbee3881c80e2fd78b" +ordered-read-streams@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/ordered-read-streams/-/ordered-read-streams-1.0.1.tgz#77c0cb37c41525d64166d990ffad7ec6a0e1363e" dependencies: - is-stream "^1.0.1" readable-stream "^2.0.1" os-homedir@^1.0.0, os-homedir@^1.0.1: @@ -3524,13 +4224,13 @@ os-locale@^1.4.0: dependencies: lcid "^1.0.0" -os-tmpdir@^1.0.0: +os-tmpdir@^1.0.0, os-tmpdir@~1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" osenv@0, osenv@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/osenv/-/osenv-0.1.4.tgz#42fe6d5953df06c8064be6f176c3d05aaaa34644" + version "0.1.5" + resolved "https://registry.yarnpkg.com/osenv/-/osenv-0.1.5.tgz#85cdfafaeb28e8677f416e287592b5f3f49ea410" dependencies: os-homedir "^1.0.0" os-tmpdir "^1.0.0" @@ -3546,10 +4246,10 @@ param-case@2.1.x: no-case "^2.2.0" parse-filepath@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/parse-filepath/-/parse-filepath-1.0.1.tgz#159d6155d43904d16c10ef698911da1e91969b73" + version "1.0.2" + resolved "https://registry.yarnpkg.com/parse-filepath/-/parse-filepath-1.0.2.tgz#a632127f53aaf3d15876f5872f3ffac763d6c891" dependencies: - is-absolute "^0.2.3" + is-absolute "^1.0.0" map-cache "^0.2.0" path-root "^0.1.1" @@ -3572,12 +4272,6 @@ parse-passwd@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/parse-passwd/-/parse-passwd-1.0.0.tgz#6d5b934a456993b23d37f40a382d6f1666a8e5c6" -parsejson@0.0.3: - version "0.0.3" - resolved "https://registry.yarnpkg.com/parsejson/-/parsejson-0.0.3.tgz#ab7e3759f209ece99437973f7d0f1f64ae0e64ab" - dependencies: - better-assert "~1.0.0" - parseqs@0.0.5: version "0.0.5" resolved "https://registry.yarnpkg.com/parseqs/-/parseqs-0.0.5.tgz#d5208a3738e46766e291ba2ea173684921a8b89d" @@ -3591,8 +4285,12 @@ parseuri@0.0.5: better-assert "~1.0.0" parseurl@~1.3.1: - version "1.3.1" - resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.1.tgz#c8ab8c9223ba34888aa64a297b28853bec18da56" + version "1.3.2" + resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.2.tgz#fc289d4ed8993119460c156253262cdc8de65bf3" + +pascalcase@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/pascalcase/-/pascalcase-0.1.1.tgz#b363e55e8006ca6fe21784d2db22bd15d7917f14" path-dirname@^1.0.0: version "1.0.2" @@ -3608,7 +4306,7 @@ path-is-absolute@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" -path-is-inside@^1.0.1: +path-is-inside@^1.0.1, path-is-inside@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/path-is-inside/-/path-is-inside-1.0.2.tgz#365417dede44430d1c11af61027facf074bdfc53" @@ -3644,6 +4342,10 @@ performance-now@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-0.2.0.tgz#33ef30c5c77d4ea21c5a53869d91b56d8f2555e5" +performance-now@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" + pify@^2.0.0, pify@^2.2.0: version "2.3.0" resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" @@ -3658,10 +4360,33 @@ pinkie@^2.0.0: version "2.0.4" resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870" +plugin-error@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/plugin-error/-/plugin-error-0.1.2.tgz#3b9bb3335ccf00f425e07437e19276967da47ace" + dependencies: + ansi-cyan "^0.1.1" + ansi-red "^0.1.1" + arr-diff "^1.0.1" + arr-union "^2.0.1" + extend-shallow "^1.1.2" + +plugin-error@^1.0.0, plugin-error@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/plugin-error/-/plugin-error-1.0.1.tgz#77016bd8919d0ac377fdcdd0322328953ca5781c" + dependencies: + ansi-colors "^1.0.1" + arr-diff "^4.0.0" + arr-union "^3.1.0" + extend-shallow "^3.0.2" + pluralize@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/pluralize/-/pluralize-1.2.1.tgz#d1a21483fd22bb41e58a12fa3421823140897c45" +pluralize@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/pluralize/-/pluralize-7.0.0.tgz#298b89df8b93b0221dbf421ad2b1b1ea23fc6777" + portscanner@2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/portscanner/-/portscanner-2.1.1.tgz#eabb409e4de24950f5a2a516d35ae769343fbb96" @@ -3669,18 +4394,21 @@ portscanner@2.1.1: async "1.5.2" is-number-like "^1.0.3" +posix-character-classes@^0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab" + postcss-value-parser@^3.2.3: version "3.3.0" resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-3.3.0.tgz#87f38f9f18f774a4ab4c8a232f5c5ce8872a9d15" -postcss@^5.0.4, postcss@^5.2.16: - version "5.2.17" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-5.2.17.tgz#cf4f597b864d65c8a492b2eabe9d706c879c388b" +postcss@^6.0.1, postcss@^6.0.20: + version "6.0.21" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-6.0.21.tgz#8265662694eddf9e9a5960db6da33c39e4cd069d" dependencies: - chalk "^1.1.3" - js-base64 "^2.1.9" - source-map "^0.5.6" - supports-color "^3.2.3" + chalk "^2.3.2" + source-map "^0.6.1" + supports-color "^5.3.0" prelude-ls@~1.1.2: version "1.1.2" @@ -3694,19 +4422,41 @@ pretty-hrtime@^1.0.0: version "1.0.3" resolved "https://registry.yarnpkg.com/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz#b7e3ea42435a4c9b2759d99e0f201eb195802ee1" -process-nextick-args@~1.0.6: +process-nextick-args@^1.0.7, process-nextick-args@~1.0.6: version "1.0.7" resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-1.0.7.tgz#150e20b756590ad3f91093f25a4f2ad8bff30ba3" +process-nextick-args@^2.0.0, process-nextick-args@~2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.0.tgz#a37d732f4271b4ab1ad070d35508e8290788ffaa" + progress@^1.1.8: version "1.1.8" resolved "https://registry.yarnpkg.com/progress/-/progress-1.1.8.tgz#e260c78f6161cdd9b0e56cc3e0a85de17c7a57be" -promise-polyfill@^6.0.2: - version "6.0.2" - resolved "https://registry.yarnpkg.com/promise-polyfill/-/promise-polyfill-6.0.2.tgz#d9c86d3dc4dc2df9016e88946defd69b49b41162" +progress@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.0.tgz#8a1be366bf8fc23db2bd23f10c6fe920b4389d1f" -pseudomap@^1.0.1: +promise-polyfill@^7.1.0: + version "7.1.0" + resolved "https://registry.yarnpkg.com/promise-polyfill/-/promise-polyfill-7.1.0.tgz#4d749485b44577c14137591c6f36e5d7e2dd3378" + +promise@^7.1.1: + version "7.3.1" + resolved "https://registry.yarnpkg.com/promise/-/promise-7.3.1.tgz#064b72602b18f90f29192b8b1bc418ffd1ebd3bf" + dependencies: + asap "~2.0.3" + +prop-types@^15.6.0: + version "15.6.1" + resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.6.1.tgz#36644453564255ddda391191fb3a125cbdf654ca" + dependencies: + fbjs "^0.8.16" + loose-envify "^1.3.1" + object-assign "^4.1.1" + +pseudomap@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3" @@ -3719,54 +4469,69 @@ pullstream@~0.4.0: setimmediate ">= 1.0.2 < 2" slice-stream ">= 1.0.0 < 2" +pump@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/pump/-/pump-2.0.1.tgz#12399add6e4cf7526d973cbc8b5ce2e2908b3909" + dependencies: + end-of-stream "^1.1.0" + once "^1.3.1" + +pumpify@^1.3.5: + version "1.4.0" + resolved "https://registry.yarnpkg.com/pumpify/-/pumpify-1.4.0.tgz#80b7c5df7e24153d03f0e7ac8a05a5d068bd07fb" + dependencies: + duplexify "^3.5.3" + inherits "^2.0.3" + pump "^2.0.0" + punycode@^1.4.1: version "1.4.1" resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" q@^1.1.2: - version "1.5.0" - resolved "https://registry.yarnpkg.com/q/-/q-1.5.0.tgz#dd01bac9d06d30e6f219aecb8253ee9ebdc308f1" - -qs@0.4.x: - version "0.4.2" - resolved "https://registry.yarnpkg.com/qs/-/qs-0.4.2.tgz#3cac4c861e371a8c9c4770ac23cda8de639b8e5f" + version "1.5.1" + resolved "https://registry.yarnpkg.com/q/-/q-1.5.1.tgz#7e32f75b41381291d04611f1bf14109ac00651d7" qs@6.2.1: version "6.2.1" resolved "https://registry.yarnpkg.com/qs/-/qs-6.2.1.tgz#ce03c5ff0935bc1d9d69a9f14cbd18e568d67625" -"qs@>= 0.4.0", qs@~6.4.0: - version "6.4.0" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.4.0.tgz#13e26d28ad6b0ffaa91312cd3bf708ed351e7233" - qs@~6.3.0: version "6.3.2" resolved "https://registry.yarnpkg.com/qs/-/qs-6.3.2.tgz#e75bd5f6e268122a2a0e0bda630b2550c166502c" -quickselect@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/quickselect/-/quickselect-1.0.0.tgz#02630818f9aae4ecab26f0103f98d061c17c58f3" +qs@~6.4.0: + version "6.4.0" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.4.0.tgz#13e26d28ad6b0ffaa91312cd3bf708ed351e7233" + +qs@~6.5.1: + version "6.5.1" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.1.tgz#349cdf6eef89ec45c12d7d5eb3fc0c870343a6d8" + +quickselect@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/quickselect/-/quickselect-1.0.1.tgz#1e6ceaa9db1ca7c75aafcc863c7bef2037ca62a1" randomatic@^1.1.3: - version "1.1.6" - resolved "https://registry.yarnpkg.com/randomatic/-/randomatic-1.1.6.tgz#110dcabff397e9dcff7c0789ccc0a49adf1ec5bb" + version "1.1.7" + resolved "https://registry.yarnpkg.com/randomatic/-/randomatic-1.1.7.tgz#c7abe9cc8b87c0baa876b19fde83fd464797e38c" dependencies: - is-number "^2.0.2" - kind-of "^3.0.2" + is-number "^3.0.0" + kind-of "^4.0.0" range-parser@~1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.0.tgz#f49be6b487894ddc40dcc94a322f611092e00d5e" -rbush@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/rbush/-/rbush-2.0.1.tgz#4cfaca28c3064bc0ee75431a1b79990e875eefa9" +rbush@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/rbush/-/rbush-2.0.2.tgz#bb6005c2731b7ba1d5a9a035772927d16a614605" dependencies: - quickselect "^1.0.0" + quickselect "^1.0.1" rc@^1.1.7: - version "1.2.1" - resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.1.tgz#2e03e8e42ee450b8cb3dce65be1bf8974e1dfd95" + version "1.2.6" + resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.6.tgz#eb18989c6d4f4f162c399f79ddd29f3835568092" dependencies: deep-extend "~0.4.0" ini "~1.3.0" @@ -3788,7 +4553,7 @@ read-pkg@^1.0.0: normalize-package-data "^2.3.2" path-type "^1.0.0" -readable-stream@1.1, readable-stream@~1.1.9: +readable-stream@1.1: version "1.1.13" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.1.13.tgz#f6eef764f514c89e2b9e23146a75ba106756d23e" dependencies: @@ -3806,17 +4571,26 @@ readable-stream@1.1, readable-stream@~1.1.9: isarray "0.0.1" string_decoder "~0.10.x" -readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.0.4, readable-stream@^2.0.5, readable-stream@^2.0.6, readable-stream@^2.1.4, readable-stream@^2.1.5, readable-stream@^2.2.2: - version "2.2.9" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.2.9.tgz#cf78ec6f4a6d1eb43d26488cac97f042e74b7fc8" +readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.0.4, readable-stream@^2.0.5, readable-stream@^2.0.6, readable-stream@^2.1.4, readable-stream@^2.1.5, readable-stream@^2.2.2, readable-stream@^2.3.3, readable-stream@^2.3.5: + version "2.3.5" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.5.tgz#b4f85003a938cbb6ecbce2a124fb1012bd1a838d" + 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.0.3" + util-deprecate "~1.0.1" + +readable-stream@~1.1.9: + version "1.1.14" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.1.14.tgz#7cf4c54ef648e3813084c636dd2079e166c081d9" dependencies: - buffer-shims "~1.0.0" core-util-is "~1.0.0" inherits "~2.0.1" - isarray "~1.0.0" - process-nextick-args "~1.0.6" - string_decoder "~1.0.0" - util-deprecate "~1.0.1" + isarray "0.0.1" + string_decoder "~0.10.x" readable-stream@~2.0.0: version "2.0.6" @@ -3859,30 +4633,51 @@ redent@^1.0.0: indent-string "^2.1.0" strip-indent "^1.0.1" -regenerator-runtime@^0.10.0: - version "0.10.5" - resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.10.5.tgz#336c3efc1220adcedda2c9fab67b5a7955a33658" - regex-cache@^0.4.2: - version "0.4.3" - resolved "https://registry.yarnpkg.com/regex-cache/-/regex-cache-0.4.3.tgz#9b1a6c35d4d0dfcef5711ae651e8e9d3d7114145" + version "0.4.4" + resolved "https://registry.yarnpkg.com/regex-cache/-/regex-cache-0.4.4.tgz#75bdc58a2a1496cec48a12835bc54c8d562336dd" dependencies: is-equal-shallow "^0.1.3" - is-primitive "^2.0.0" + +regex-not@^1.0.0, regex-not@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/regex-not/-/regex-not-1.0.2.tgz#1f4ece27e00b0b65e0247a6810e6a85d83a5752c" + dependencies: + extend-shallow "^3.0.2" + safe-regex "^1.1.0" + +regexpp@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-1.0.1.tgz#d857c3a741dce075c2848dcb019a0a975b190d43" relateurl@0.2.x: version "0.2.7" resolved "https://registry.yarnpkg.com/relateurl/-/relateurl-0.2.7.tgz#54dbf377e51440aca90a4cd274600d3ff2d888a9" -remove-trailing-separator@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.0.1.tgz#615ebb96af559552d4bf4057c8436d486ab63cc4" +remove-bom-buffer@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/remove-bom-buffer/-/remove-bom-buffer-3.0.0.tgz#c2bf1e377520d324f623892e33c10cac2c252b53" + dependencies: + is-buffer "^1.1.5" + is-utf8 "^0.2.1" + +remove-bom-stream@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/remove-bom-stream/-/remove-bom-stream-1.2.0.tgz#05f1a593f16e42e1fb90ebf59de8e569525f9523" + dependencies: + remove-bom-buffer "^3.0.0" + safe-buffer "^5.1.0" + through2 "^2.0.3" + +remove-trailing-separator@^1.0.1, remove-trailing-separator@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz#c24bce2a283adad5bc3f58e0d48249b92379d8ef" repeat-element@^1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.2.tgz#ef089a178d1483baae4d93eb98b4f9e4e11d990a" -repeat-string@^1.5.2: +repeat-string@^1.5.2, repeat-string@^1.6.1: version "1.6.1" resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" @@ -3896,7 +4691,46 @@ replace-ext@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/replace-ext/-/replace-ext-0.0.1.tgz#29bbd92078a739f0bcce2b4ee41e837953522924" -request@2, request@^2.79.0, request@^2.81.0: +replace-ext@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/replace-ext/-/replace-ext-1.0.0.tgz#de63128373fcbf7c3ccfa4de5a480c45a67958eb" + +replace-homedir@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/replace-homedir/-/replace-homedir-1.0.0.tgz#e87f6d513b928dde808260c12be7fec6ff6e798c" + dependencies: + homedir-polyfill "^1.0.1" + is-absolute "^1.0.0" + remove-trailing-separator "^1.1.0" + +request@2: + version "2.85.0" + resolved "https://registry.yarnpkg.com/request/-/request-2.85.0.tgz#5a03615a47c61420b3eb99b7dba204f83603e1fa" + dependencies: + aws-sign2 "~0.7.0" + aws4 "^1.6.0" + caseless "~0.12.0" + combined-stream "~1.0.5" + extend "~3.0.1" + forever-agent "~0.6.1" + form-data "~2.3.1" + har-validator "~5.0.3" + hawk "~6.0.2" + http-signature "~1.2.0" + is-typedarray "~1.0.0" + isstream "~0.1.2" + json-stringify-safe "~5.0.1" + mime-types "~2.1.17" + oauth-sign "~0.8.2" + performance-now "^2.1.0" + qs "~6.5.1" + safe-buffer "^5.1.1" + stringstream "~0.0.5" + tough-cookie "~2.3.3" + tunnel-agent "^0.6.0" + uuid "^3.1.0" + +request@2.81.0: version "2.81.0" resolved "https://registry.yarnpkg.com/request/-/request-2.81.0.tgz#c6928946a0e06c5f8d6f8a9333469ffda46298a0" dependencies: @@ -3923,9 +4757,9 @@ request@2, request@^2.79.0, request@^2.81.0: tunnel-agent "^0.6.0" uuid "^3.0.0" -request@2.78.0: - version "2.78.0" - resolved "https://registry.yarnpkg.com/request/-/request-2.78.0.tgz#e1c8dec346e1c81923b24acdb337f11decabe9cc" +request@~2.79.0: + version "2.79.0" + resolved "https://registry.yarnpkg.com/request/-/request-2.79.0.tgz#4dfe5bf6be8b8cdc37fcf93e04b65577722710de" dependencies: aws-sign2 "~0.6.0" aws4 "^1.2.1" @@ -3941,12 +4775,12 @@ request@2.78.0: isstream "~0.1.2" json-stringify-safe "~5.0.1" mime-types "~2.1.7" - node-uuid "~1.4.7" oauth-sign "~0.8.1" qs "~6.3.0" stringstream "~0.0.4" tough-cookie "~2.3.0" tunnel-agent "~0.4.1" + uuid "^3.0.0" require-directory@^2.1.1: version "2.1.1" @@ -3956,16 +4790,16 @@ require-main-filename@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-1.0.1.tgz#97f717b69d48784f5f526a6c5aa8ffdda055a4d1" -require-uncached@^1.0.2: +require-uncached@^1.0.2, require-uncached@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/require-uncached/-/require-uncached-1.0.3.tgz#4e0d56d6c9662fd31e43011c4b95aa49955421d3" dependencies: caller-path "^0.1.0" resolve-from "^1.0.0" -requirejs@^2.2.0, requirejs@^2.3.2: - version "2.3.3" - resolved "https://registry.yarnpkg.com/requirejs/-/requirejs-2.3.3.tgz#aa59fd3a0287eaf407959a138228044b5dd6a6a3" +requirejs@^2.2.0, requirejs@^2.3.5: + version "2.3.5" + resolved "https://registry.yarnpkg.com/requirejs/-/requirejs-2.3.5.tgz#617b9acbbcb336540ef4914d790323a8d4b861b0" requires-port@1.x.x: version "1.0.0" @@ -3978,24 +4812,33 @@ resolve-dir@^0.1.0: expand-tilde "^1.2.2" global-modules "^0.2.3" +resolve-dir@^1.0.0, resolve-dir@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/resolve-dir/-/resolve-dir-1.0.1.tgz#79a40644c362be82f26effe739c9bb5382046f43" + dependencies: + expand-tilde "^2.0.0" + global-modules "^1.0.0" + resolve-from@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-1.0.1.tgz#26cbfe935d1aeeeabb29bc3fe5aeb01e93d44226" -resolve-url@~0.2.1: +resolve-options@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/resolve-options/-/resolve-options-1.1.0.tgz#32bb9e39c06d67338dc9378c0d6d6074566ad131" + dependencies: + value-or-function "^3.0.0" + +resolve-url@^0.2.1, resolve-url@~0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a" -resolve@^1.1.6, resolve@^1.1.7: - version "1.3.3" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.3.3.tgz#655907c3469a8680dc2de3a275a8fdd69691f0e5" +resolve@^1.1.6, resolve@^1.1.7, resolve@^1.4.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.6.0.tgz#0fbd21278b27b4004481c395349e7aba60a9ff5c" dependencies: path-parse "^1.0.5" -resolve@~1.1.6: - version "1.1.7" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.1.7.tgz#203114d82ad2c5ed9e8e0411b3932875e889e97b" - resp-modifier@6.0.2: version "6.0.2" resolved "https://registry.yarnpkg.com/resp-modifier/-/resp-modifier-6.0.2.tgz#b124de5c4fbafcba541f48ffa73970f4aa456b4f" @@ -4010,6 +4853,17 @@ restore-cursor@^1.0.1: exit-hook "^1.0.0" onetime "^1.0.0" +restore-cursor@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-2.0.0.tgz#9f7ee287f82fd326d4fd162923d62129eee0dfaf" + dependencies: + onetime "^2.0.0" + signal-exit "^3.0.2" + +ret@~0.1.10: + version "0.1.15" + resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc" + rfg-api@^0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/rfg-api/-/rfg-api-0.3.0.tgz#42745648547f254f35d70edccf7cd3f465d9390a" @@ -4020,15 +4874,9 @@ rfg-api@^0.3.0: node-rest-client "^1.4.1" unzip2 "^0.2.5" -right-align@^0.1.1: - version "0.1.3" - resolved "https://registry.yarnpkg.com/right-align/-/right-align-0.1.3.tgz#61339b722fe6a3515689210d24e14c96148613ef" - dependencies: - align-text "^0.1.1" - rimraf@2, rimraf@^2.2.8, rimraf@^2.5.1, rimraf@^2.6.1: - version "2.6.1" - resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.1.tgz#c2338ec643df7a1b7fe5c54fa86f57428a55f33d" + version "2.6.2" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.2.tgz#2ed8150d24a16ea8651e6d6ef0f47c4158ce7a36" dependencies: glob "^7.0.5" @@ -4038,6 +4886,22 @@ run-async@^0.1.0: dependencies: once "^1.3.0" +run-async@^2.2.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.3.0.tgz#0371ab4ae0bdd720d4166d7dfda64ff7a445a6c0" + dependencies: + is-promise "^2.1.0" + +rx-lite-aggregates@^4.0.8: + version "4.0.8" + resolved "https://registry.yarnpkg.com/rx-lite-aggregates/-/rx-lite-aggregates-4.0.8.tgz#753b87a89a11c95467c4ac1626c4efc4e05c67be" + dependencies: + rx-lite "*" + +rx-lite@*, rx-lite@^4.0.8: + version "4.0.8" + resolved "https://registry.yarnpkg.com/rx-lite/-/rx-lite-4.0.8.tgz#0b1e11af8bc44836f04a6407e92da42467b79444" + rx-lite@^3.1.2: version "3.1.2" resolved "https://registry.yarnpkg.com/rx-lite/-/rx-lite-3.1.2.tgz#19ce502ca572665f3b647b10939f97fd1615f102" @@ -4046,31 +4910,38 @@ rx@4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/rx/-/rx-4.1.0.tgz#a5f13ff79ef3b740fe30aa803fb09f98805d4782" -safe-buffer@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.0.1.tgz#d263ca54696cd8a306b5ca6551e92de57918fbe7" +safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@~5.1.0, safe-buffer@~5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.1.tgz#893312af69b2123def71f57889001671eeb2c853" -sass-graph@^2.1.1: - version "2.2.2" - resolved "https://registry.yarnpkg.com/sass-graph/-/sass-graph-2.2.2.tgz#f4d6c95b546ea2a09d14176d0fc1a07ee2b48354" +safe-regex@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/safe-regex/-/safe-regex-1.1.0.tgz#40a3669f3b077d1e943d44629e157dd48023bf2e" + dependencies: + ret "~0.1.10" + +sass-graph@^2.2.4: + version "2.2.4" + resolved "https://registry.yarnpkg.com/sass-graph/-/sass-graph-2.2.4.tgz#13fbd63cd1caf0908b9fd93476ad43a51d1e0b49" dependencies: glob "^7.0.0" lodash "^4.0.0" - scss-tokenizer "^0.2.1" - yargs "^6.6.0" + scss-tokenizer "^0.2.3" + yargs "^7.0.0" -sass-lint@^1.10.2: - version "1.10.2" - resolved "https://registry.yarnpkg.com/sass-lint/-/sass-lint-1.10.2.tgz#825bd6b0da79ddd36a42ffae5b6d44ac4922502b" +sass-lint@^1.12.0: + version "1.12.1" + resolved "https://registry.yarnpkg.com/sass-lint/-/sass-lint-1.12.1.tgz#630f69c216aa206b8232fb2aa907bdf3336b6d83" dependencies: commander "^2.8.1" eslint "^2.7.0" - front-matter "2.1.0" - fs-extra "^1.0.0" + front-matter "2.1.2" + fs-extra "^3.0.1" glob "^7.0.0" globule "^1.0.0" - gonzales-pe "3.4.7" + gonzales-pe-sl "^4.2.3" js-yaml "^3.5.4" + known-css-properties "^0.3.0" lodash.capitalize "^4.1.0" lodash.kebabcase "^4.0.0" merge "^1.2.0" @@ -4078,52 +4949,47 @@ sass-lint@^1.10.2: util "^0.10.3" sax@>=0.6.0, sax@~1.2.1: - version "1.2.2" - resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.2.tgz#fd8631a23bc7826bef5d871bdb87378c95647828" + version "1.2.4" + resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" -scss-tokenizer@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/scss-tokenizer/-/scss-tokenizer-0.2.1.tgz#07c0cc577bb7ab4d08fd900185adbf4bc844141d" +scss-tokenizer@^0.2.3: + version "0.2.3" + resolved "https://registry.yarnpkg.com/scss-tokenizer/-/scss-tokenizer-0.2.3.tgz#8eb06db9a9723333824d3f5530641149847ce5d1" dependencies: js-base64 "^2.1.8" source-map "^0.4.2" -semver-greatest-satisfied-range@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/semver-greatest-satisfied-range/-/semver-greatest-satisfied-range-1.0.0.tgz#4fb441e2a8d26c40b598327557318de272a558a0" +semver-greatest-satisfied-range@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/semver-greatest-satisfied-range/-/semver-greatest-satisfied-range-1.1.0.tgz#13e8c2658ab9691cb0cd71093240280d36f77a5b" dependencies: - semver "^4.2.0" - semver-regex "^1.0.0" + sver-compat "^1.5.0" -semver-regex@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/semver-regex/-/semver-regex-1.0.0.tgz#92a4969065f9c70c694753d55248fc68f8f652c9" +"semver@2 || 3 || 4 || 5", semver@^5.3.0: + version "5.5.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.5.0.tgz#dc4bbc7a6ca9d916dee5d43516f0092b58f7b8ab" -"semver@2 || 3 || 4 || 5", semver@^5.3.0, semver@~5.3.0: +semver@~5.3.0: version "5.3.0" resolved "https://registry.yarnpkg.com/semver/-/semver-5.3.0.tgz#9b2ce5d3de02d17c6012ad326aa6b4d0cf54f94f" -semver@^4.2.0: - version "4.3.6" - resolved "https://registry.yarnpkg.com/semver/-/semver-4.3.6.tgz#300bc6e0e86374f7ba61068b5b1ecd57fc6532da" - -send@0.14.1: - version "0.14.1" - resolved "https://registry.yarnpkg.com/send/-/send-0.14.1.tgz#a954984325392f51532a7760760e459598c89f7a" +send@0.15.2: + version "0.15.2" + resolved "https://registry.yarnpkg.com/send/-/send-0.15.2.tgz#f91fab4403bcf87e716f70ceb5db2f578bdc17d6" dependencies: - debug "~2.2.0" + debug "2.6.4" depd "~1.1.0" destroy "~1.0.4" encodeurl "~1.0.1" escape-html "~1.0.3" - etag "~1.7.0" - fresh "0.3.0" - http-errors "~1.5.0" + etag "~1.8.0" + fresh "0.5.0" + http-errors "~1.6.1" mime "1.3.4" - ms "0.7.1" + ms "1.0.0" on-finished "~2.3.0" range-parser "~1.2.0" - statuses "~1.3.0" + statuses "~1.3.1" serve-index@1.8.0: version "1.8.0" @@ -4137,14 +5003,14 @@ serve-index@1.8.0: mime-types "~2.1.11" parseurl "~1.3.1" -serve-static@1.11.1: - version "1.11.1" - resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.11.1.tgz#d6cce7693505f733c759de57befc1af76c0f0805" +serve-static@1.12.2: + version "1.12.2" + resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.12.2.tgz#e546e2726081b81b4bcec8e90808ebcdd323afba" dependencies: encodeurl "~1.0.1" escape-html "~1.0.3" parseurl "~1.3.1" - send "0.14.1" + send "0.15.2" server-destroy@1.0.1: version "1.0.1" @@ -4167,7 +5033,16 @@ set-value@^0.4.3: is-plain-object "^2.0.1" to-object-path "^0.3.0" -"setimmediate@>= 1.0.2 < 2", setimmediate@~1.0.1: +set-value@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/set-value/-/set-value-2.0.0.tgz#71ae4a88f0feefbbf52d1ea604f3fb315ebb6274" + dependencies: + extend-shallow "^2.0.1" + is-extendable "^0.1.1" + is-plain-object "^2.0.3" + split-string "^3.0.1" + +"setimmediate@>= 1.0.2 < 2", setimmediate@^1.0.5, setimmediate@~1.0.1: version "1.0.5" resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285" @@ -4175,19 +5050,25 @@ setprototypeof@1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.0.2.tgz#81a552141ec104b88e89ce383103ad5c66564d08" +setprototypeof@1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.0.3.tgz#66567e37043eeb4f04d91bd658c0cbefb55b8e04" + +shebang-command@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" + dependencies: + shebang-regex "^1.0.0" + +shebang-regex@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" + shelljs@^0.6.0: version "0.6.1" resolved "https://registry.yarnpkg.com/shelljs/-/shelljs-0.6.1.tgz#ec6211bed1920442088fe0f70b2837232ed2c8a8" -shelljs@^0.7.5: - version "0.7.7" - resolved "https://registry.yarnpkg.com/shelljs/-/shelljs-0.7.7.tgz#b2f5c77ef97148f4b4f6e22682e10bba8667cff1" - dependencies: - glob "^7.0.0" - interpret "^1.0.0" - rechoir "^0.6.2" - -signal-exit@^3.0.0: +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" @@ -4195,15 +5076,48 @@ slice-ansi@0.0.4: version "0.0.4" resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-0.0.4.tgz#edbf8903f66f7ce2f8eafd6ceed65e264c831b35" +slice-ansi@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-1.0.0.tgz#044f1a49d8842ff307aad6b505ed178bd950134d" + dependencies: + is-fullwidth-code-point "^2.0.0" + "slice-stream@>= 1.0.0 < 2": version "1.0.0" resolved "https://registry.yarnpkg.com/slice-stream/-/slice-stream-1.0.0.tgz#5b33bd66f013b1a7f86460b03d463dec39ad3ea0" dependencies: readable-stream "~1.0.31" -snabbdom@^0.6.4: - version "0.6.7" - resolved "https://registry.yarnpkg.com/snabbdom/-/snabbdom-0.6.7.tgz#045d9fc292574fe3597578bde2d9c403f79a1352" +snabbdom@^0.7.1: + version "0.7.1" + resolved "https://registry.yarnpkg.com/snabbdom/-/snabbdom-0.7.1.tgz#c1e9eddfad2c02ebc2cf66aaefb040419d059597" + +snapdragon-node@^2.0.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/snapdragon-node/-/snapdragon-node-2.1.1.tgz#6c175f86ff14bdb0724563e8f3c1b021a286853b" + dependencies: + define-property "^1.0.0" + isobject "^3.0.0" + snapdragon-util "^3.0.1" + +snapdragon-util@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/snapdragon-util/-/snapdragon-util-3.0.1.tgz#f956479486f2acd79700693f6f7b805e45ab56e2" + dependencies: + kind-of "^3.2.0" + +snapdragon@^0.8.1: + version "0.8.2" + resolved "https://registry.yarnpkg.com/snapdragon/-/snapdragon-0.8.2.tgz#64922e7c565b0e14204ba1aa7d6964278d25182d" + dependencies: + base "^0.11.1" + debug "^2.2.0" + define-property "^0.2.5" + extend-shallow "^2.0.1" + map-cache "^0.2.2" + source-map "^0.5.6" + source-map-resolve "^0.5.0" + use "^3.1.0" sntp@1.x.x: version "1.0.9" @@ -4211,49 +5125,52 @@ sntp@1.x.x: dependencies: hoek "2.x.x" -socket.io-adapter@0.5.0: - version "0.5.0" - resolved "https://registry.yarnpkg.com/socket.io-adapter/-/socket.io-adapter-0.5.0.tgz#cb6d4bb8bec81e1078b99677f9ced0046066bb8b" +sntp@2.x.x: + version "2.1.0" + resolved "https://registry.yarnpkg.com/sntp/-/sntp-2.1.0.tgz#2c6cec14fedc2222739caf9b5c3d85d1cc5a2cc8" dependencies: - debug "2.3.3" - socket.io-parser "2.3.1" + hoek "4.x.x" -socket.io-client@1.6.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/socket.io-client/-/socket.io-client-1.6.0.tgz#5b668f4f771304dfeed179064708386fa6717853" +socket.io-adapter@~1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/socket.io-adapter/-/socket.io-adapter-1.1.1.tgz#2a805e8a14d6372124dd9159ad4502f8cb07f06b" + +socket.io-client@2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/socket.io-client/-/socket.io-client-2.0.4.tgz#0918a552406dc5e540b380dcd97afc4a64332f8e" dependencies: backo2 "1.0.2" + base64-arraybuffer "0.1.5" component-bind "1.0.0" component-emitter "1.2.1" - debug "2.3.3" - engine.io-client "1.8.0" - has-binary "0.1.7" + debug "~2.6.4" + engine.io-client "~3.1.0" + has-cors "1.1.0" indexof "0.0.1" object-component "0.0.3" + parseqs "0.0.5" parseuri "0.0.5" - socket.io-parser "2.3.1" + socket.io-parser "~3.1.1" to-array "0.1.4" -socket.io-parser@2.3.1: - version "2.3.1" - resolved "https://registry.yarnpkg.com/socket.io-parser/-/socket.io-parser-2.3.1.tgz#dd532025103ce429697326befd64005fcfe5b4a0" +socket.io-parser@~3.1.1: + version "3.1.3" + resolved "https://registry.yarnpkg.com/socket.io-parser/-/socket.io-parser-3.1.3.tgz#ed2da5ee79f10955036e3da413bfd7f1e4d86c8e" dependencies: - component-emitter "1.1.2" - debug "2.2.0" - isarray "0.0.1" - json3 "3.3.2" + component-emitter "1.2.1" + debug "~3.1.0" + has-binary2 "~1.0.2" + isarray "2.0.1" -socket.io@1.6.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/socket.io/-/socket.io-1.6.0.tgz#3e40d932637e6bd923981b25caf7c53e83b6e2e1" +socket.io@2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/socket.io/-/socket.io-2.0.4.tgz#c1a4590ceff87ecf13c72652f046f716b29e6014" dependencies: - debug "2.3.3" - engine.io "1.8.0" - has-binary "0.1.7" - object-assign "4.1.0" - socket.io-adapter "0.5.0" - socket.io-client "1.6.0" - socket.io-parser "2.3.1" + debug "~2.6.6" + engine.io "~3.1.0" + socket.io-adapter "~1.1.0" + socket.io-client "2.0.4" + socket.io-parser "~3.1.1" source-map-resolve@^0.3.0: version "0.3.1" @@ -4264,13 +5181,27 @@ source-map-resolve@^0.3.0: source-map-url "~0.3.0" urix "~0.1.0" +source-map-resolve@^0.5.0: + version "0.5.1" + resolved "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.5.1.tgz#7ad0f593f2281598e854df80f19aae4b92d7a11a" + dependencies: + atob "^2.0.0" + decode-uri-component "^0.2.0" + resolve-url "^0.2.1" + source-map-url "^0.4.0" + urix "^0.1.0" + +source-map-url@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.4.0.tgz#3e935d7ddd73631b97659956d55128e87b5084a3" + source-map-url@~0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.3.0.tgz#7ecaf13b57bcd09da8a40c5d269db33799d4aaf9" -source-map@0.5.x, source-map@0.X, source-map@^0.5.1, source-map@^0.5.3, source-map@^0.5.6, source-map@~0.5.1: - version "0.5.6" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.6.tgz#75ce38f52bf0733c5a7f0c118d81334a2bb5f412" +source-map@0.5.x, source-map@^0.5.0, source-map@^0.5.1, source-map@^0.5.3, source-map@^0.5.6: + version "0.5.7" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" source-map@^0.1.38: version "0.1.43" @@ -4284,23 +5215,35 @@ source-map@^0.4.2: dependencies: amdefine ">=0.0.4" +source-map@^0.6.1, source-map@~0.6.0, source-map@~0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" + sparkles@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/sparkles/-/sparkles-1.0.0.tgz#1acbbfb592436d10bbe8f785b7cc6f82815012c3" -spdx-correct@~1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-1.0.2.tgz#4b3073d933ff51f3912f03ac5519498a4150db40" +spdx-correct@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.0.0.tgz#05a5b4d7153a195bc92c3c425b69f3b2a9524c82" dependencies: - spdx-license-ids "^1.0.2" + spdx-expression-parse "^3.0.0" + spdx-license-ids "^3.0.0" -spdx-expression-parse@~1.0.0: - version "1.0.4" - resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-1.0.4.tgz#9bdf2f20e1f40ed447fbe273266191fced51626c" +spdx-exceptions@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.1.0.tgz#2c7ae61056c714a5b9b9b2b2af7d311ef5c78fe9" -spdx-license-ids@^1.0.2: - version "1.2.2" - resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-1.2.2.tgz#c9df7a3424594ade6bd11900d596696dc06bac57" +spdx-expression-parse@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz#99e119b7a5da00e05491c9fa338b7904823b41d0" + dependencies: + spdx-exceptions "^2.1.0" + spdx-license-ids "^3.0.0" + +spdx-license-ids@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.0.tgz#7a7cd28470cc6d3a1cfe6d66886f6bc430d3ac87" split-string@^1.0.1: version "1.0.1" @@ -4308,6 +5251,12 @@ split-string@^1.0.1: dependencies: extend-shallow "^2.0.1" +split-string@^3.0.1, split-string@^3.0.2: + version "3.1.0" + resolved "https://registry.yarnpkg.com/split-string/-/split-string-3.1.0.tgz#7cb09dda3a86585705c64b39a6466038682e8fe2" + dependencies: + extend-shallow "^3.0.0" + split@0.3: version "0.3.3" resolved "https://registry.yarnpkg.com/split/-/split-0.3.3.tgz#cd0eea5e63a211dfff7eb0f091c4133e2d0dd28f" @@ -4319,8 +5268,8 @@ sprintf-js@~1.0.2: resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" sshpk@^1.7.0: - version "1.13.0" - resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.13.0.tgz#ff2a3e4fd04497555fed97b39a0fd82fafb3a33c" + version "1.14.1" + resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.14.1.tgz#130f5975eddad963f1d56f92b9ac6c51fa9f83eb" dependencies: asn1 "~0.2.3" assert-plus "^1.0.0" @@ -4329,15 +5278,25 @@ sshpk@^1.7.0: optionalDependencies: bcrypt-pbkdf "^1.0.0" ecc-jsbn "~0.1.1" - jodid25519 "^1.0.0" jsbn "~0.1.0" tweetnacl "~0.14.0" -stack-trace@0.0.9: - version "0.0.9" - resolved "https://registry.yarnpkg.com/stack-trace/-/stack-trace-0.0.9.tgz#a8f6eaeca90674c333e7c43953f275b451510695" +stack-trace@0.0.10: + version "0.0.10" + resolved "https://registry.yarnpkg.com/stack-trace/-/stack-trace-0.0.10.tgz#547c70b347e8d32b4e108ea1a2a159e5fdde19c0" -"statuses@>= 1.3.1 < 2", statuses@~1.3.0: +static-extend@^0.1.1: + version "0.1.2" + resolved "https://registry.yarnpkg.com/static-extend/-/static-extend-0.1.2.tgz#60809c39cbff55337226fd5e0b520f341f1fb5c6" + dependencies: + define-property "^0.2.5" + object-copy "^0.1.0" + +"statuses@>= 1.3.1 < 2": + version "1.4.0" + resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.4.0.tgz#bb73d446da2796106efcc1b601a253d6c46bd087" + +statuses@~1.3.0, statuses@~1.3.1: version "1.3.1" resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.3.1.tgz#faf51b9eb74aaef3b3acf4ad5f61abf24cb7b93e" @@ -4354,8 +5313,8 @@ stream-combiner@~0.0.4: duplexer "~0.1.1" stream-exhaust@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/stream-exhaust/-/stream-exhaust-1.0.1.tgz#c0c4455e54ce5a179ca8736e73334b4e7fd67553" + version "1.0.2" + resolved "https://registry.yarnpkg.com/stream-exhaust/-/stream-exhaust-1.0.2.tgz#acdac8da59ef2bc1e17a2c0ccf6c320d120e555d" stream-shift@^1.0.0: version "1.0.0" @@ -4382,12 +5341,12 @@ string-width@^1.0.1, string-width@^1.0.2: is-fullwidth-code-point "^1.0.0" strip-ansi "^3.0.0" -string-width@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.0.0.tgz#635c5436cc72a6e0c387ceca278d4e2eec52687e" +string-width@^2.0.0, string-width@^2.1.0, string-width@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" dependencies: is-fullwidth-code-point "^2.0.0" - strip-ansi "^3.0.0" + strip-ansi "^4.0.0" string.prototype.trim@^1.1.2: version "1.1.2" @@ -4401,13 +5360,13 @@ 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.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.0.0.tgz#f06f41157b664d86069f84bdbdc9b0d8ab281667" +string_decoder@~1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.0.3.tgz#0fc67d7c141825de94282dd536bec6b9bce860ab" dependencies: - buffer-shims "~1.0.0" + safe-buffer "~5.1.0" -stringstream@~0.0.4: +stringstream@~0.0.4, stringstream@~0.0.5: version "0.0.5" resolved "https://registry.yarnpkg.com/stringstream/-/stringstream-0.0.5.tgz#4e484cd4de5a0bbbee18e46307710a8a81621878" @@ -4417,12 +5376,11 @@ strip-ansi@^3.0.0, strip-ansi@^3.0.1: dependencies: ansi-regex "^2.0.0" -strip-bom-stream@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/strip-bom-stream/-/strip-bom-stream-1.0.0.tgz#e7144398577d51a6bed0fa1994fa05f43fd988ee" +strip-ansi@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f" dependencies: - first-chunk-stream "^1.0.0" - strip-bom "^2.0.0" + ansi-regex "^3.0.0" strip-bom-string@1.X: version "1.0.0" @@ -4434,20 +5392,20 @@ strip-bom@^2.0.0: dependencies: is-utf8 "^0.2.0" -strip-bom@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" - strip-indent@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-1.0.1.tgz#0c7962a6adefa7bbd4ac366460a638552ae1a0a2" dependencies: get-stdin "^4.0.1" -strip-json-comments@1.0.2, strip-json-comments@~1.0.1: +strip-json-comments@1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-1.0.2.tgz#5a48ab96023dbac1b7b8d0ffabf6f63f1677be9f" +strip-json-comments@~1.0.1: + version "1.0.4" + resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-1.0.4.tgz#1e15fbcac97d3ee99bf2d73b4c656b082bbafb91" + strip-json-comments@~2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" @@ -4456,11 +5414,18 @@ supports-color@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" -supports-color@^3.2.3: - version "3.2.3" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-3.2.3.tgz#65ac0504b3954171d8a64946b2ae3cbb8a5f54f6" +supports-color@^5.3.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.3.0.tgz#5b24ac15db80fa927cf5227a4a33fd3c4c7676c0" dependencies: - has-flag "^1.0.0" + has-flag "^3.0.0" + +sver-compat@^1.5.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/sver-compat/-/sver-compat-1.5.0.tgz#3cf87dfeb4d07b4a3f14827bc186b3fd0c645cd8" + dependencies: + es6-iterator "^2.0.1" + es6-symbol "^3.1.1" svgo@0.7.x: version "0.7.2" @@ -4474,6 +5439,17 @@ svgo@0.7.x: sax "~1.2.1" whet.extend "~0.9.9" +table@4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/table/-/table-4.0.2.tgz#a33447375391e766ad34d3486e6e2aedc84d2e36" + dependencies: + ajv "^5.2.3" + ajv-keywords "^2.1.0" + chalk "^2.1.0" + lodash "^4.17.4" + slice-ansi "1.0.0" + string-width "^2.1.1" + table@^3.7.8: version "3.8.3" resolved "https://registry.yarnpkg.com/table/-/table-3.8.3.tgz#2bbc542f0fda9861a755d3947fefd8b3f513855f" @@ -4486,8 +5462,8 @@ table@^3.7.8: string-width "^2.0.0" tar-pack@^3.4.0: - version "3.4.0" - resolved "https://registry.yarnpkg.com/tar-pack/-/tar-pack-3.4.0.tgz#23be2d7f671a8339376cbdb0b8fe3fdebf317984" + version "3.4.1" + resolved "https://registry.yarnpkg.com/tar-pack/-/tar-pack-3.4.1.tgz#e1dbc03a9b9d3ba07e896ad027317eb679a10a1f" dependencies: debug "^2.2.0" fstream "^1.0.10" @@ -4551,14 +5527,14 @@ through2@2.0.1: readable-stream "~2.0.0" xtend "~4.0.0" -through2@2.X, through2@^2.0.0, through2@^2.0.1, through2@^2.0.3, through2@~2.0.0: +through2@2.X, through2@^2.0.0, through2@^2.0.1, through2@^2.0.2, through2@^2.0.3, through2@~2.0.0: version "2.0.3" resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.3.tgz#0004569b37c7c74ba39c43f3ced78d1ad94140be" dependencies: readable-stream "^2.1.5" xtend "~4.0.1" -through2@^0.6.0, through2@~0.6.5: +through2@~0.6.5: version "0.6.5" resolved "https://registry.yarnpkg.com/through2/-/through2-0.6.5.tgz#41ab9c67b29d57209071410e1d7a7a968cd3ad48" dependencies: @@ -4569,29 +5545,37 @@ through@2, through@^2.3.6, through@~2.3, through@~2.3.1: version "2.3.8" resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" -tildify@^1.0.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/tildify/-/tildify-1.2.0.tgz#dcec03f55dca9b7aa3e5b04f21817eb56e63588a" - dependencies: - os-homedir "^1.0.0" - time-stamp@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/time-stamp/-/time-stamp-1.0.1.tgz#9f4bd23559c9365966f3302dbba2b07c6b99b151" + version "1.1.0" + resolved "https://registry.yarnpkg.com/time-stamp/-/time-stamp-1.1.0.tgz#764a5a11af50561921b133f3b44e618687e0f5c3" -to-absolute-glob@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/to-absolute-glob/-/to-absolute-glob-0.1.1.tgz#1cdfa472a9ef50c239ee66999b662ca0eb39937f" +timers-ext@^0.1.2: + version "0.1.5" + resolved "https://registry.yarnpkg.com/timers-ext/-/timers-ext-0.1.5.tgz#77147dd4e76b660c2abb8785db96574cbbd12922" dependencies: - extend-shallow "^2.0.1" + es5-ext "~0.10.14" + next-tick "1" + +tmp@^0.0.33: + version "0.0.33" + resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9" + dependencies: + os-tmpdir "~1.0.2" + +to-absolute-glob@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/to-absolute-glob/-/to-absolute-glob-2.0.2.tgz#1865f43d9e74b0822db9f145b78cff7d0f7c849b" + dependencies: + is-absolute "^1.0.0" + is-negated-glob "^1.0.0" to-array@0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/to-array/-/to-array-0.1.4.tgz#17e6c11f73dd4f3d74cda7a4ff3238e9ad9bf890" -to-fast-properties@^1.0.1: - version "1.0.3" - resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-1.0.3.tgz#b83571fa4d8c25b82e231b06e3a3055de4ca1a47" +to-fast-properties@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" to-object-path@^0.3.0: version "0.3.0" @@ -4599,9 +5583,31 @@ to-object-path@^0.3.0: dependencies: kind-of "^3.0.2" -tough-cookie@~2.3.0: - version "2.3.2" - resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.3.2.tgz#f081f76e4c85720e6c37a5faced737150d84072a" +to-regex-range@^2.1.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-2.1.1.tgz#7c80c17b9dfebe599e27367e0d4dd5590141db38" + dependencies: + is-number "^3.0.0" + repeat-string "^1.6.1" + +to-regex@^3.0.1, to-regex@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/to-regex/-/to-regex-3.0.2.tgz#13cfdd9b336552f30b51f33a8ae1b42a7a7599ce" + dependencies: + define-property "^2.0.2" + extend-shallow "^3.0.2" + regex-not "^1.0.2" + safe-regex "^1.1.0" + +to-through@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/to-through/-/to-through-2.0.0.tgz#fc92adaba072647bc0b67d6b03664aa195093af6" + dependencies: + through2 "^2.0.3" + +tough-cookie@~2.3.0, tough-cookie@~2.3.3: + version "2.3.4" + resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.3.4.tgz#ec60cee38ac675063ffc97a5c18970578ee83655" dependencies: punycode "^1.4.1" @@ -4613,6 +5619,16 @@ trim-newlines@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-1.0.0.tgz#5887966bb582a4503a41eb524f7d35011815a613" +trim-right@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/trim-right/-/trim-right-1.0.1.tgz#cb2e1203067e0c8de1f614094b9fe45704ea6003" + +"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" + tryit@^1.0.1: version "1.0.3" resolved "https://registry.yarnpkg.com/tryit/-/tryit-1.0.3.tgz#393be730a9446fd1ead6da59a014308f36c289cb" @@ -4645,55 +5661,49 @@ ua-parser-js@0.7.12: version "0.7.12" resolved "https://registry.yarnpkg.com/ua-parser-js/-/ua-parser-js-0.7.12.tgz#04c81a99bdd5dc52263ea29d24c6bf8d4818a4bb" -uglify-js@2.8.x, uglify-js@~2.8.10, uglify-js@~2.8.22: - version "2.8.22" - resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-2.8.22.tgz#d54934778a8da14903fa29a326fb24c0ab51a1a0" +ua-parser-js@^0.7.9: + version "0.7.17" + resolved "https://registry.yarnpkg.com/ua-parser-js/-/ua-parser-js-0.7.17.tgz#e9ec5f9498b9ec910e7ae3ac626a805c4d09ecac" + +uglify-js@3.3.x, uglify-js@^3.0.5: + version "3.3.16" + resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.3.16.tgz#23ba13efa27aa00885be7417819e8a9787f94028" dependencies: - source-map "~0.5.1" - yargs "~3.10.0" - optionalDependencies: - uglify-to-browserify "~1.0.0" - -uglify-save-license@^0.4.1: - version "0.4.1" - resolved "https://registry.yarnpkg.com/uglify-save-license/-/uglify-save-license-0.4.1.tgz#95726c17cc6fd171c3617e3bf4d8d82aa8c4cce1" - -uglify-to-browserify@~1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz#6e0924d6bda6b5afe349e39a6d632850a0f882b7" + commander "~2.15.0" + source-map "~0.6.1" uid-number@^0.0.6: version "0.0.6" resolved "https://registry.yarnpkg.com/uid-number/-/uid-number-0.0.6.tgz#0ea10e8035e8eb5b8e4449f06da1c730663baa81" -ultron@1.0.x: - version "1.0.2" - resolved "https://registry.yarnpkg.com/ultron/-/ultron-1.0.2.tgz#ace116ab557cd197386a4e88f4685378c8b2e4fa" +ultron@~1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/ultron/-/ultron-1.1.1.tgz#9fe1536a10a664a65266a1e3ccf85fd36302bc9c" -unc-path-regex@^0.1.0: +unc-path-regex@^0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/unc-path-regex/-/unc-path-regex-0.1.2.tgz#e73dd3d7b0d7c5ed86fbac6b0ae7d8c6a69d50fa" -underscore@*, underscore@1.7.x: - version "1.7.0" - resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.7.0.tgz#6bbaf0877500d36be34ecaa584e0db9fef035209" +underscore@*: + version "1.8.3" + resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.8.3.tgz#4f3fb53b106e6097fcf9cb4109f2a5e9bdfa5022" undertaker-registry@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/undertaker-registry/-/undertaker-registry-1.0.0.tgz#2da716c765999d8c94b9f9ed2c006df4923b052b" + version "1.0.1" + resolved "https://registry.yarnpkg.com/undertaker-registry/-/undertaker-registry-1.0.1.tgz#5e4bda308e4a8a2ae584f9b9a4359a499825cc50" undertaker@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/undertaker/-/undertaker-1.1.0.tgz#0ba00e6fb6a8afe1e928631565aaf6dba6111aeb" + version "1.2.0" + resolved "https://registry.yarnpkg.com/undertaker/-/undertaker-1.2.0.tgz#339da4646252d082dc378e708067299750e11b49" dependencies: arr-flatten "^1.0.1" arr-map "^2.0.0" bach "^1.0.0" - collection-map "^0.1.0" + collection-map "^1.0.0" es6-weak-map "^2.0.1" last-run "^1.1.0" - object.defaults "^0.3.0" - object.reduce "^0.1.7" + object.defaults "^1.0.0" + object.reduce "^1.0.0" undertaker-registry "^1.0.0" union-value@^0.2.3: @@ -4705,6 +5715,15 @@ union-value@^0.2.3: is-extendable "^0.1.1" set-value "^0.4.3" +union-value@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/union-value/-/union-value-1.0.0.tgz#5c71c34cb5bad5dcebe3ea0cd08207ba5aa1aea4" + dependencies: + arr-union "^3.1.0" + get-value "^2.0.6" + is-extendable "^0.1.1" + set-value "^0.4.3" + unique-stream@^2.0.2: version "2.2.1" resolved "https://registry.yarnpkg.com/unique-stream/-/unique-stream-2.2.1.tgz#5aa003cfbe94c5ff866c4e7d668bb1c4dbadb369" @@ -4712,10 +5731,21 @@ unique-stream@^2.0.2: json-stable-stringify "^1.0.0" through2-filter "^2.0.0" +universalify@^0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.1.tgz#fa71badd4437af4c148841e3b3b165f9e9e590b7" + unpipe@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" +unset-value@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/unset-value/-/unset-value-1.0.0.tgz#8376873f7d2335179ffb1e6fc3a8ed0dfc8ab559" + dependencies: + has-value "^0.3.1" + isobject "^3.0.0" + unzip2@^0.2.5: version "0.2.5" resolved "https://registry.yarnpkg.com/unzip2/-/unzip2-0.2.5.tgz#4ef7a579a78c15c51f550f6a053db194149c8992" @@ -4735,9 +5765,11 @@ urix@^0.1.0, urix@~0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/urix/-/urix-0.1.0.tgz#da937f7a62e21fec1fd18d49b35c2935067a6c72" -user-home@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/user-home/-/user-home-1.1.1.tgz#2b5be23a32b63a7c9deb8d0f28d485724a3df190" +use@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/use/-/use-3.1.0.tgz#14716bf03fdfefd03040aef58d8b4b85f3a7c544" + dependencies: + kind-of "^6.0.2" user-home@^2.0.0: version "2.0.0" @@ -4763,54 +5795,72 @@ uuid@^2.0.1: version "2.0.3" resolved "https://registry.yarnpkg.com/uuid/-/uuid-2.0.3.tgz#67e2e863797215530dff318e5bf9dcebfd47b21a" -uuid@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.0.1.tgz#6544bba2dfda8c1cf17e629a3a305e2bb1fee6c1" +uuid@^3.0.0, uuid@^3.1.0: + version "3.2.1" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.2.1.tgz#12c528bb9d58d0b9265d9a2f6f0fe8be17ff1f14" -v8flags@^2.0.9: - version "2.1.1" - resolved "https://registry.yarnpkg.com/v8flags/-/v8flags-2.1.1.tgz#aab1a1fa30d45f88dd321148875ac02c0b55e5b4" +uws@~9.14.0: + version "9.14.0" + resolved "https://registry.yarnpkg.com/uws/-/uws-9.14.0.tgz#fac8386befc33a7a3705cbd58dc47b430ca4dd95" + +v8flags@^3.0.1: + version "3.0.2" + resolved "https://registry.yarnpkg.com/v8flags/-/v8flags-3.0.2.tgz#ad6a78a20a6b23d03a8debc11211e3cc23149477" dependencies: - user-home "^1.1.1" - -vali-date@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/vali-date/-/vali-date-1.0.0.tgz#1b904a59609fb328ef078138420934f6b86709a6" + homedir-polyfill "^1.0.1" validate-npm-package-license@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.1.tgz#2804babe712ad3379459acfbe24746ab2c303fbc" + version "3.0.3" + resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.3.tgz#81643bcbef1bdfecd4623793dc4648948ba98338" dependencies: - spdx-correct "~1.0.0" - spdx-expression-parse "~1.0.0" + spdx-correct "^3.0.0" + spdx-expression-parse "^3.0.0" -verror@1.3.6: - version "1.3.6" - resolved "https://registry.yarnpkg.com/verror/-/verror-1.3.6.tgz#cff5df12946d297d2baaefaa2689e25be01c005c" - dependencies: - extsprintf "1.0.2" +value-or-function@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/value-or-function/-/value-or-function-3.0.0.tgz#1c243a50b595c1be54a754bfece8563b9ff8d813" -vinyl-fs@^2.0.0: - version "2.4.4" - resolved "https://registry.yarnpkg.com/vinyl-fs/-/vinyl-fs-2.4.4.tgz#be6ff3270cb55dfd7d3063640de81f25d7532239" +verror@1.10.0: + version "1.10.0" + resolved "https://registry.yarnpkg.com/verror/-/verror-1.10.0.tgz#3a105ca17053af55d6e270c1f8288682e18da400" dependencies: - duplexify "^3.2.0" - glob-stream "^5.3.2" + assert-plus "^1.0.0" + core-util-is "1.0.2" + extsprintf "^1.2.0" + +vinyl-fs@^3.0.0: + version "3.0.2" + resolved "https://registry.yarnpkg.com/vinyl-fs/-/vinyl-fs-3.0.2.tgz#1b86258844383f57581fcaac081fe09ef6d6d752" + dependencies: + fs-mkdirp-stream "^1.0.0" + glob-stream "^6.1.0" graceful-fs "^4.0.0" - gulp-sourcemaps "1.6.0" - is-valid-glob "^0.3.0" + is-valid-glob "^1.0.0" lazystream "^1.0.0" - lodash.isequal "^4.0.0" - merge-stream "^1.0.0" - mkdirp "^0.5.0" - object-assign "^4.0.0" - readable-stream "^2.0.4" - strip-bom "^2.0.0" - strip-bom-stream "^1.0.0" + lead "^1.0.0" + object.assign "^4.0.4" + pumpify "^1.3.5" + readable-stream "^2.3.3" + remove-bom-buffer "^3.0.0" + remove-bom-stream "^1.2.0" + resolve-options "^1.1.0" through2 "^2.0.0" - through2-filter "^2.0.0" - vali-date "^1.0.0" - vinyl "^1.0.0" + to-through "^2.0.0" + value-or-function "^3.0.0" + vinyl "^2.0.0" + vinyl-sourcemap "^1.1.0" + +vinyl-sourcemap@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/vinyl-sourcemap/-/vinyl-sourcemap-1.1.0.tgz#92a800593a38703a8cdb11d8b300ad4be63b3e16" + dependencies: + append-buffer "^1.0.2" + convert-source-map "^1.5.0" + graceful-fs "^4.1.6" + normalize-path "^2.1.1" + now-and-later "^2.0.0" + remove-bom-buffer "^3.0.0" + vinyl "^2.0.0" vinyl-sourcemaps-apply@^0.2.0, vinyl-sourcemaps-apply@^0.2.1: version "0.2.1" @@ -4818,14 +5868,6 @@ vinyl-sourcemaps-apply@^0.2.0, vinyl-sourcemaps-apply@^0.2.1: dependencies: source-map "^0.5.1" -vinyl@1.X, vinyl@^1.0.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/vinyl/-/vinyl-1.2.0.tgz#5c88036cf565e5df05558bfc911f8656df218884" - dependencies: - clone "^1.0.0" - clone-stats "^0.0.1" - replace-ext "0.0.1" - vinyl@^0.5.0: version "0.5.3" resolved "https://registry.yarnpkg.com/vinyl/-/vinyl-0.5.3.tgz#b0455b38fc5e0cf30d4325132e461970c2091cde" @@ -4834,9 +5876,16 @@ vinyl@^0.5.0: clone-stats "^0.0.1" replace-ext "0.0.1" -vlq@^0.2.1: - version "0.2.2" - resolved "https://registry.yarnpkg.com/vlq/-/vlq-0.2.2.tgz#e316d5257b40b86bb43cb8d5fea5d7f54d6b0ca1" +vinyl@^2.0.0, vinyl@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/vinyl/-/vinyl-2.1.0.tgz#021f9c2cf951d6b939943c89eb5ee5add4fd924c" + dependencies: + clone "^2.1.1" + clone-buffer "^1.0.0" + clone-stats "^1.0.0" + cloneable-readable "^1.0.0" + remove-trailing-separator "^1.0.1" + replace-ext "^1.0.0" warning@^3.0.0: version "3.0.0" @@ -4844,13 +5893,9 @@ warning@^3.0.0: dependencies: loose-envify "^1.0.0" -weinre@^2.0.0-pre-I0Z7U9OV: - version "2.0.0-pre-I0Z7U9OV" - resolved "https://registry.yarnpkg.com/weinre/-/weinre-2.0.0-pre-I0Z7U9OV.tgz#fef8aa223921f7b40bbbbd4c3ed4302f6fd0a813" - dependencies: - express "2.5.x" - nopt "3.0.x" - underscore "1.7.x" +whatwg-fetch@>=0.10.0: + version "2.0.3" + resolved "https://registry.yarnpkg.com/whatwg-fetch/-/whatwg-fetch-2.0.3.tgz#9c84ec2dcf68187ff00bc64e1274b442176e1c84" whet.extend@~0.9.9: version "0.9.9" @@ -4860,21 +5905,17 @@ which-module@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/which-module/-/which-module-1.0.0.tgz#bba63ca861948994ff307736089e3b96026c2a4f" -which@1, which@^1.2.12, which@^1.2.9: - version "1.2.14" - resolved "https://registry.yarnpkg.com/which/-/which-1.2.14.tgz#9a87c4378f03e827cecaf1acdf56c736c01c14e5" +which@1, which@^1.2.12, which@^1.2.14, which@^1.2.9: + version "1.3.0" + resolved "https://registry.yarnpkg.com/which/-/which-1.3.0.tgz#ff04bdfc010ee547d780bec38e1ac1c2777d253a" dependencies: isexe "^2.0.0" wide-align@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.0.tgz#40edde802a71fea1f070da3e62dcda2e7add96ad" + version "1.1.2" + resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.2.tgz#571e0f1b0604636ebc0dfc21b0339bbe31341710" dependencies: - string-width "^1.0.1" - -window-size@0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/window-size/-/window-size-0.1.0.tgz#5438cd2ea93b202efa3a19fe8887aee7c94f9c9d" + string-width "^1.0.2" window-size@^0.1.2: version "0.1.4" @@ -4884,10 +5925,6 @@ window-size@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/window-size/-/window-size-0.2.0.tgz#b4315bb4214a3d7058ebeee892e13fa24d98b075" -wordwrap@0.0.2: - version "0.0.2" - resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.2.tgz#b79669bb42ecb409f83d583cad52ca17eaa1643f" - wordwrap@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb" @@ -4903,50 +5940,38 @@ wrappy@1: version "1.0.2" resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" -wreck@^6.3.0: - version "6.3.0" - resolved "https://registry.yarnpkg.com/wreck/-/wreck-6.3.0.tgz#a1369769f07bbb62d6a378336a7871fc773c740b" - dependencies: - boom "2.x.x" - hoek "2.x.x" - write@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/write/-/write-0.2.1.tgz#5fc03828e264cea3fe91455476f7a3c566cb0757" dependencies: mkdirp "^0.5.1" -ws@1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/ws/-/ws-1.1.1.tgz#082ddb6c641e85d4bb451f03d52f06eabdb1f018" +ws@~3.3.1: + version "3.3.3" + resolved "https://registry.yarnpkg.com/ws/-/ws-3.3.3.tgz#f1cf84fe2d5e901ebce94efaece785f187a228f2" dependencies: - options ">=0.0.5" - ultron "1.0.x" - -wtf-8@1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/wtf-8/-/wtf-8-1.0.0.tgz#392d8ba2d0f1c34d1ee2d630f15d0efb68e1048a" + async-limiter "~1.0.0" + safe-buffer "~5.1.0" + ultron "~1.1.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" xml2js@>=0.2.4: - version "0.4.17" - resolved "https://registry.yarnpkg.com/xml2js/-/xml2js-0.4.17.tgz#17be93eaae3f3b779359c795b419705a8817e868" + version "0.4.19" + resolved "https://registry.yarnpkg.com/xml2js/-/xml2js-0.4.19.tgz#686c20f213209e94abf0d1bcf1efaa291c7827a7" dependencies: sax ">=0.6.0" - xmlbuilder "^4.1.0" + xmlbuilder "~9.0.1" -xmlbuilder@^4.1.0: - version "4.2.1" - resolved "https://registry.yarnpkg.com/xmlbuilder/-/xmlbuilder-4.2.1.tgz#aa58a3041a066f90eaa16c2f5389ff19f3f461a5" - dependencies: - lodash "^4.0.0" +xmlbuilder@~9.0.1: + version "9.0.7" + resolved "https://registry.yarnpkg.com/xmlbuilder/-/xmlbuilder-9.0.7.tgz#132ee63d2ec5565c557e20f4c22df9aca686b10d" -xmlhttprequest-ssl@1.5.3: - version "1.5.3" - resolved "https://registry.yarnpkg.com/xmlhttprequest-ssl/-/xmlhttprequest-ssl-1.5.3.tgz#185a888c04eca46c3e4070d99f7b49de3528992d" +xmlhttprequest-ssl@~1.5.4: + version "1.5.5" + resolved "https://registry.yarnpkg.com/xmlhttprequest-ssl/-/xmlhttprequest-ssl-1.5.5.tgz#c2876b06168aadc40e57d97e81191ac8f4398b3e" "xtend@>=4.0.0 <4.1.0-0", xtend@^4.0.0, xtend@~4.0.0, xtend@~4.0.1: version "4.0.1" @@ -4956,7 +5981,7 @@ y18n@^3.2.0, y18n@^3.2.1: version "3.2.1" resolved "https://registry.yarnpkg.com/y18n/-/y18n-3.2.1.tgz#6d15fba884c08679c0d77e88e7759e811e07fa41" -yallist@^2.0.0: +yallist@^2.1.2: version "2.1.2" resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52" @@ -4967,13 +5992,19 @@ yargs-parser@^3.2.0: camelcase "^3.0.0" lodash.assign "^4.1.0" -yargs-parser@^4.1.0, yargs-parser@^4.2.0: +yargs-parser@^4.1.0: version "4.2.1" resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-4.2.1.tgz#29cceac0dc4f03c6c87b4a9f217dd18c9f74871c" dependencies: camelcase "^3.0.0" -yargs@3.29.0, yargs@^3.28.0: +yargs-parser@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-5.0.0.tgz#275ecf0d7ffe05c77e64e7c86e4cd94bf0e1228a" + dependencies: + camelcase "^3.0.0" + +yargs@3.29.0: version "3.29.0" resolved "https://registry.yarnpkg.com/yargs/-/yargs-3.29.0.tgz#1aab9660eae79d8b8f675bcaeeab6ee34c2cf69c" dependencies: @@ -5022,9 +6053,9 @@ yargs@^5.0.0: y18n "^3.2.1" yargs-parser "^3.2.0" -yargs@^6.6.0: - version "6.6.0" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-6.6.0.tgz#782ec21ef403345f830a808ca3d513af56065208" +yargs@^7.0.0, yargs@^7.1.0: + version "7.1.0" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-7.1.0.tgz#6ba318eb16961727f5d284f8ea003e8d6154d0c8" dependencies: camelcase "^3.0.0" cliui "^3.2.0" @@ -5038,16 +6069,7 @@ yargs@^6.6.0: string-width "^1.0.2" which-module "^1.0.0" y18n "^3.2.1" - yargs-parser "^4.2.0" - -yargs@~3.10.0: - version "3.10.0" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-3.10.0.tgz#f7ee7bd857dd7c1d2d38c0e74efbd681d1431fd1" - dependencies: - camelcase "^1.0.2" - cliui "^2.1.0" - decamelize "^1.0.0" - window-size "0.1.0" + yargs-parser "^5.0.0" yeast@0.1.2: version "0.1.2"