diff --git a/.eslintrc.json b/.eslintrc.json new file mode 100644 index 0000000..9eafac4 --- /dev/null +++ b/.eslintrc.json @@ -0,0 +1,34 @@ +{ + "rules": { + "block-scoped-var": 2, + "comma-dangle": [2, "only-multiline"], + "comma-style": 2, + "indent": 2, + "keyword-spacing": 2, + "no-console": 0, + "no-constant-condition": 0, + "no-else-return": 0, + "no-extra-parens": [2, "functions"], + "no-lonely-if": 2, + "no-proto": 2, + "no-unused-vars": [2,{"args": "none"}], + "no-use-before-define": [2,"nofunc"], + "no-useless-escape": 0, + "space-before-blocks": 2, + "space-before-function-paren": [2, "never"], + "space-in-parens": 2, + "require-jsdoc": ["warn", { + "require": { + "FunctionExpression": true + } + }], + "valid-jsdoc": ["warn", { + "requireReturn": false + }] + }, + "env": { + "node": "true", + "es6": "true" + }, + "extends": ["@mapbox/eslint-config-geocoding"] +} diff --git a/.travis.yml b/.travis.yml index 45afbec..40e8388 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,8 +1,17 @@ +dist: xenial language: node_js node_js: -- '4' -- '6' +- 8 +- 10 + +env: + global: + - secure: Ud6+6DgQtUHMf//2loICXJQzKD0cEX2cZGm2Ty9VOttEOaZXq8Z6Kw0QVOf4g5pglfS9E+IprHDGzzuwmhzz0HPafRb6/gFZU2Euj+3nsHZYhbPj5HZTRXjzZXhP6tPbQ1E7Wg6uPvKR9YbFTXC8njPqeEAo2dS6TTcIIB7zu/I= + - secure: Z7g8V0gOqE1r0GyT8NxI7EsjLixC/YlI22iH6n9Ar92X0Dhc7N2wS5FNKILMIICLzJGvCFFA/oc15qcDfkDDeUwq7uGs2cxdTinKZwbGPnfEJ1nuK6VdJfmfdIepGUaiOMQg5UyM8Zi8RBzaW2vP6DO/6Q7a4G0J/V3GNcE1hYg= + - secure: N/oZKx7VKaWdhjQhwRPnO1UfjAmuGE3bmB+4lmGTkEoupo5/g1O2V5bPqPoMQqjQEOlRTZqXx4zu9yF/Ew8Ie7Ra35tNbKYz84xS+5UIK/5FgOshi5z1H+nyzs18oTrM1b5cYqAU14eyaEdUD01Vl30dWAD0MfWbVb9fNdLq+8o= + - secure: A2YjZ6wxGMAA8Cn6UCIBrySqSjuGjQ7XG6kGPabDT6bvXsiWG0wUi6ZqvjM1HL8S9uc5ZoGWZzrIyRYOTwuX100pOn4JjAphyzYD8fN+6etuq+6s8w6kJI7ENzd7d449aXpRQOYGEW3WoApzbGoRk9EHfHhxfHArgwohzBxjFcg= + - secure: CMwaxidCWlxccrPByDsEOcyJ+W6pjXwufb8s8Pe9YecnpEp+ppr6eK5/AYP9bor5QJwS8G/m0JOwDA8Pzn6vhOn/GXCamBCYHtTZPhliYWt9b81ZJbaoqSzJgtkUgyU9DzOkgDa6SJ+jRAmdtcDgDbRcadI7rsA/YVFxeO+mxI0= addons: apt: @@ -11,15 +20,6 @@ addons: packages: - libstdc++6 -env: - global: - - secure: Ud6+6DgQtUHMf//2loICXJQzKD0cEX2cZGm2Ty9VOttEOaZXq8Z6Kw0QVOf4g5pglfS9E+IprHDGzzuwmhzz0HPafRb6/gFZU2Euj+3nsHZYhbPj5HZTRXjzZXhP6tPbQ1E7Wg6uPvKR9YbFTXC8njPqeEAo2dS6TTcIIB7zu/I= - - secure: Z7g8V0gOqE1r0GyT8NxI7EsjLixC/YlI22iH6n9Ar92X0Dhc7N2wS5FNKILMIICLzJGvCFFA/oc15qcDfkDDeUwq7uGs2cxdTinKZwbGPnfEJ1nuK6VdJfmfdIepGUaiOMQg5UyM8Zi8RBzaW2vP6DO/6Q7a4G0J/V3GNcE1hYg= - - secure: N/oZKx7VKaWdhjQhwRPnO1UfjAmuGE3bmB+4lmGTkEoupo5/g1O2V5bPqPoMQqjQEOlRTZqXx4zu9yF/Ew8Ie7Ra35tNbKYz84xS+5UIK/5FgOshi5z1H+nyzs18oTrM1b5cYqAU14eyaEdUD01Vl30dWAD0MfWbVb9fNdLq+8o= - - secure: A2YjZ6wxGMAA8Cn6UCIBrySqSjuGjQ7XG6kGPabDT6bvXsiWG0wUi6ZqvjM1HL8S9uc5ZoGWZzrIyRYOTwuX100pOn4JjAphyzYD8fN+6etuq+6s8w6kJI7ENzd7d449aXpRQOYGEW3WoApzbGoRk9EHfHhxfHArgwohzBxjFcg= - - secure: CMwaxidCWlxccrPByDsEOcyJ+W6pjXwufb8s8Pe9YecnpEp+ppr6eK5/AYP9bor5QJwS8G/m0JOwDA8Pzn6vhOn/GXCamBCYHtTZPhliYWt9b81ZJbaoqSzJgtkUgyU9DzOkgDa6SJ+jRAmdtcDgDbRcadI7rsA/YVFxeO+mxI0= - -sudo: false - -after_success: -- if [[ ${TRAVIS_NODE_VERSION} == "0.10" ]]; then npm run coverage; fi; +script: + - yarn run lint + - yarn run coverage diff --git a/backend.js b/backend.js index 4e02dab..7b42985 100644 --- a/backend.js +++ b/backend.js @@ -1,222 +1,223 @@ -var tilelive = require('@mapbox/tilelive'); -var crypto = require('crypto'); -var mapnik = require('mapnik'); -var util = require('util'); -var sm = new (require('@mapbox/sphericalmercator'))(); - -module.exports = Backend; - -function Backend(opts, callback) { - this._layer = opts.layer || undefined; - this._scale = opts.scale || 1; - this._source = null; - var backend = this; - if (opts.source) { - setsource(opts.source, opts); - } else if (opts.uri) { - tilelive.load(opts.uri, function(err, source) { - if (err) return callback(err); - source.getInfo(function(err, info) { +'use strict'; + +const tilelive = require('@mapbox/tilelive'); +const crypto = require('crypto'); +const mapnik = require('mapnik'); +const sm = new (require('@mapbox/sphericalmercator'))(); + +class Backend { + constructor(opts, callback) { + this._layer = opts.layer || undefined; + this._scale = opts.scale || 1; + this._source = null; + const backend = this; + if (opts.source) { + setsource(opts.source, opts); + } else if (opts.uri) { + tilelive.load(opts.uri, (err, source) => { if (err) return callback(err); - setsource(source, info); + source.getInfo((err, info) => { + if (err) return callback(err); + setsource(source, info); + }); }); - }); - } else { - if (callback) callback(new Error('opts.uri or opts.source must be set')); + } else if (callback) callback(new Error('opts.uri or opts.source must be set')); + + function setsource(source, info) { + backend._minzoom = typeof info.minzoom === 'number' ? info.minzoom : 0; + backend._maxzoom = typeof info.maxzoom === 'number' ? info.maxzoom : 22; + backend._vector_layers = info.vector_layers || undefined; + backend._layer = backend._layer || + (info.vector_layers && info.vector_layers.length && info.vector_layers[0].id) || + '_image'; + backend._fillzoom = 'fillzoom' in info && !isNaN(parseInt(info.fillzoom, 10)) ? + parseInt(info.fillzoom, 10) : + undefined; + backend._source = source; + if (callback) callback(null, backend); + } } - function setsource(source, info) { - backend._minzoom = typeof info.minzoom === 'number' ? info.minzoom : 0; - backend._maxzoom = typeof info.maxzoom === 'number' ? info.maxzoom : 22; - backend._vector_layers = info.vector_layers || undefined; - backend._layer = backend._layer || - (info.vector_layers && info.vector_layers.length && info.vector_layers[0].id) || - '_image'; - backend._fillzoom = 'fillzoom' in info && !isNaN(parseInt(info.fillzoom, 10)) ? - parseInt(info.fillzoom, 10) : - undefined; - backend._source = source; - if (callback) callback(null, backend); + getInfo(callback) { + if (!this._source) return callback(new Error('Tilesource not loaded')); + this._source.getInfo(callback); } -}; -Backend.prototype.getInfo = function(callback) { - if (!this._source) return callback(new Error('Tilesource not loaded')); - this._source.getInfo(callback); -}; + getTile(z, x, y, callback) { + if (!this._source) return callback(new Error('Tilesource not loaded')); + if (z < 0 || x < 0 || y < 0 || x >= Math.pow(2,z) || y >= Math.pow(2,z)) { + return callback(new Error('Tile does not exist')); + } + const backend = this; + const source = backend._source; + // if true, return raw buffer rather than mapnik.VectorTile + const raw_buffer = callback.raw_buffer || false; + const legacy = callback.legacy || false; + const scale = callback.scale || backend._scale; + const upgrade = callback.upgrade || false; + + // If scale > 1 adjusts source data zoom level inversely. + // scale 2x => z-1, scale 4x => z-2, scale 8x => z-3, etc. + let bz, bx, by; + if (legacy && z >= backend._minzoom) { + const d = Math.round(Math.log(scale) / Math.log(2)); + bz = (z - d) > backend._minzoom ? z - d : backend._minzoom; + bx = Math.floor(x / Math.pow(2, z - bz)); + by = Math.floor(y / Math.pow(2, z - bz)); + } else { + bz = z | 0; + bx = x | 0; + by = y | 0; + } -Backend.prototype.getTile = function(z, x, y, callback) { - if (!this._source) return callback(new Error('Tilesource not loaded')); - if (z < 0 || x < 0 || y < 0 || x >= Math.pow(2,z) || y >= Math.pow(2,z)) { - return callback(new Error('Tile does not exist')); - } - var backend = this; - var source = backend._source; - var now = +new Date; - // if true, return raw buffer rather than mapnik.VectorTile - var raw_buffer = callback.raw_buffer || false; - var legacy = callback.legacy || false; - var scale = callback.scale || backend._scale; - var upgrade = callback.upgrade || false; - - // If scale > 1 adjusts source data zoom level inversely. - // scale 2x => z-1, scale 4x => z-2, scale 8x => z-3, etc. - if (legacy && z >= backend._minzoom) { - var d = Math.round(Math.log(scale)/Math.log(2)); - var bz = (z - d) > backend._minzoom ? z - d : backend._minzoom; - var bx = Math.floor(x / Math.pow(2, z - bz)); - var by = Math.floor(y / Math.pow(2, z - bz)); - } else { - var bz = z | 0; - var bx = x | 0; - var by = y | 0; - } + let size = 0; + let headers = {}; - var size = 0; - var headers = {}; + // Overzooming support. + if (bz > backend._maxzoom) { + bz = backend._maxzoom; + bx = Math.floor(x / Math.pow(2, z - bz)); + by = Math.floor(y / Math.pow(2, z - bz)); + headers['x-vector-backend-object'] = 'overzoom'; + } - // Overzooming support. - if (bz > backend._maxzoom) { - bz = backend._maxzoom; - bx = Math.floor(x / Math.pow(2, z - bz)); - by = Math.floor(y / Math.pow(2, z - bz)); - headers['x-vector-backend-object'] = 'overzoom'; - } + function makevtile(data, type) { + // If no last modified is provided, use epoch. + headers['Last-Modified'] = new Date(headers['Last-Modified'] || 0).toUTCString(); - function makevtile(data, type) { - // If no last modified is provided, use epoch. - headers['Last-Modified'] = new Date(headers['Last-Modified'] || 0).toUTCString(); + // Set an ETag if not present. + headers['ETag'] = headers['ETag'] || JSON.stringify(crypto.createHash('md5') + .update((z + ',' + x + ',' + y) + (data && data.toString('binary') || ''), 'utf8') + .digest('hex')); - // Set an ETag if not present. - headers['ETag'] = headers['ETag'] || JSON.stringify(crypto.createHash('md5') - .update((z+','+x+','+y) + (data && data.toString('binary')||''), 'utf8') - .digest('hex')); + // Set content type. + headers['Content-Type'] = 'application/x-protobuf'; - // Set content type. - headers['Content-Type'] = 'application/x-protobuf'; + // Set x-vector-backend-status header. + headers['x-vector-backend-object'] = headers['x-vector-backend-object'] || 'default'; - // Set x-vector-backend-status header. - headers['x-vector-backend-object'] = headers['x-vector-backend-object'] || 'default'; + // Pass-thru of raw buffer (no mapnik.VectorTile) + if (raw_buffer) { + if (data) { + data.tile_type = type; + data.layer_name = backend._layer; + } + return callback(null, data, headers, bz, bx, by); + } - // Pass-thru of raw buffer (no mapnik.VectorTile) - if (raw_buffer) { - if (data) { - data.tile_type = type; - data.layer_name = backend._layer; + // Pass-thru of an upstream mapnik vector tile (not pbf) source. + if (data instanceof mapnik.VectorTile) return callback(null, data, headers); + + const vtile = new mapnik.VectorTile(bz, bx, by); + vtile._srcbytes = size; + if (callback.setSrcData) vtile._srcdata = data; + + // null/zero length data is a solid tile be painted. + if (!data || !data.length) return callback(null, vtile, headers); + + try { + if (type === 'pbf') { + // We use addData here over setData because we know it was just created + // and is empty so skips a clear call internally in mapnik. + vtile.addData(data,{ upgrade:upgrade },(err) => { + if (err) return callback(err); + return callback(null, vtile, headers); + }); + } else { + vtile.addImageBuffer(data, backend._layer, (err) => { + if (err) return callback(err); + return callback(null, vtile, headers); + }); + } + } catch (err) { + return callback(err); } - return callback(null, data, headers, bz, bx, by); } - // Pass-thru of an upstream mapnik vector tile (not pbf) source. - if (data instanceof mapnik.VectorTile) return callback(null, data, headers); + function sourceGet(err, body, head) { + if (typeof backend._fillzoom === 'number' && + err && err.message === 'Tile does not exist' && + bz > backend._fillzoom) { + bz = backend._fillzoom; + bx = Math.floor(x / Math.pow(2, z - bz)); + by = Math.floor(y / Math.pow(2, z - bz)); + headers['x-vector-backend-object'] = 'fillzoom'; + return source.getTile(bz, bx, by, sourceGet); + } + if (err && err.message !== 'Tile does not exist') return callback(err); - var vtile = new mapnik.VectorTile(bz, bx, by); - vtile._srcbytes = size; - if (callback.setSrcData) vtile._srcdata = data; + if (body instanceof mapnik.VectorTile) { + size = body._srcbytes; + headers = head || {}; + return makevtile(body); + } - // null/zero length data is a solid tile be painted. - if (!data || !data.length) return callback(null, vtile, headers); + let compression = false; + if (body && body[0] === 0x78 && body[1] === 0x9C) { + compression = 'inflate'; + } else if (body && body[0] === 0x1F && body[1] === 0x8B) { + compression = 'gunzip'; + } - try { - if (type === 'pbf') { - // We use addData here over setData because we know it was just created - // and is empty so skips a clear call internally in mapnik. - vtile.addData(data,{upgrade:upgrade},function(err) { - if (err) return callback(err); - return callback(null, vtile, headers); - }); + if (!body || !body.length) { + headers['x-vector-backend-object'] = 'empty'; + return makevtile(); + } else if (compression) { + size = body.length; + headers = head || {}; + return makevtile(body, 'pbf'); + // Image sources do not allow overzooming (yet). + } else if (bz < z && headers['x-vector-backend-object'] !== 'fillzoom') { + headers['x-vector-backend-object'] = 'empty'; + return makevtile(); } else { - vtile.addImageBuffer(data, backend._layer, function(err) { - if (err) return callback(err); - return callback(null, vtile, headers); - }); + size = body.length; + headers = head || {}; + return makevtile(body); } - } catch (err) { - return callback(err); } - }; - function sourceGet(err, body, head) { - if (typeof backend._fillzoom === 'number' && - err && err.message === 'Tile does not exist' && - bz > backend._fillzoom) { - bz = backend._fillzoom; - bx = Math.floor(x / Math.pow(2, z - bz)); - by = Math.floor(y / Math.pow(2, z - bz)); - headers['x-vector-backend-object'] = 'fillzoom'; - return source.getTile(bz, bx, by, sourceGet); - } - if (err && err.message !== 'Tile does not exist') return callback(err); + sourceGet.scale = scale; + sourceGet.legacy = legacy; + sourceGet.upgrade = upgrade; + source.getTile(bz, bx, by, sourceGet); - if (body instanceof mapnik.VectorTile) { - size = body._srcbytes; - headers = head || {}; - return makevtile(body); - } - - var compression = false; - if (body && body[0] == 0x78 && body[1] == 0x9C) { - compression = 'inflate'; - } else if (body && body[0] == 0x1F && body[1] == 0x8B) { - compression = 'gunzip'; - } + } - if (!body || !body.length) { - headers['x-vector-backend-object'] = 'empty'; - return makevtile(); - } else if (compression) { - size = body.length; - headers = head || {}; - return makevtile(body, 'pbf'); - // Image sources do not allow overzooming (yet). - } else if (bz < z && headers['x-vector-backend-object'] !== 'fillzoom') { - headers['x-vector-backend-object'] = 'empty'; - return makevtile(); - } else { - size = body.length; - headers = head || {}; - return makevtile(body); - } - }; - - sourceGet.scale = scale; - sourceGet.legacy = legacy; - sourceGet.upgrade = upgrade; - source.getTile(bz, bx, by, sourceGet); - -}; - -// Proxies mapnik vtile.query method with the added convienice of -// letting the tilelive-vector backend do the hard work of finding -// the right tile to use. -Backend.prototype.queryTile = function(z, lon, lat, options, callback) { - var xyz = sm.xyz([lon, lat, lon, lat], z); - this.getTile(z, xyz.minX, xyz.minY, function(err, vtile, head) { - if (err) return callback(err); - vtile.query(lon, lat, options, function(err, features) { + // Proxies mapnik vtile.query method with the added convienice of + // letting the tilelive-vector backend do the hard work of finding + // the right tile to use. + queryTile(z, lon, lat, options, callback) { + const xyz = sm.xyz([lon, lat, lon, lat], z); + this.getTile(z, xyz.minX, xyz.minY, (err, vtile, head) => { if (err) return callback(err); - var results = []; - for (var i = 0; i < features.length; i++) { - results.push({ - id: features[i].id(), - distance: features[i].distance, - layer: features[i].layer, - attributes: features[i].attributes(), - geometry: { - type: 'Point', - coordinates: features[i].x_hit ? - [ features[i].x_hit, features[i].y_hit ] : - [ lon, lat ] - } - }); - } - var headers = {}; - headers['Content-Type'] = 'application/json'; - headers['ETag'] = JSON.stringify(crypto.createHash('md5') - .update(head && head['ETag'] || (z+','+lon+','+lat)) - .digest('hex')); - headers['Last-Modified'] = new Date(head && head['Last-Modified'] || 0).toUTCString(); - return callback(null, results, headers); + vtile.query(lon, lat, options, (err, features) => { + if (err) return callback(err); + const results = []; + for (let i = 0; i < features.length; i++) { + results.push({ + id: features[i].id(), + distance: features[i].distance, + layer: features[i].layer, + attributes: features[i].attributes(), + geometry: { + type: 'Point', + coordinates: features[i].x_hit ? + [features[i].x_hit, features[i].y_hit] : + [lon, lat] + } + }); + } + const headers = {}; + headers['Content-Type'] = 'application/json'; + headers['ETag'] = JSON.stringify(crypto.createHash('md5') + .update(head && head['ETag'] || (z + ',' + lon + ',' + lat)) + .digest('hex')); + headers['Last-Modified'] = new Date(head && head['Last-Modified'] || 0).toUTCString(); + return callback(null, results, headers); + }); }); - }); -}; + } +} + +module.exports = Backend; diff --git a/index.js b/index.js index 33eb3a9..25be388 100644 --- a/index.js +++ b/index.js @@ -1,436 +1,449 @@ -var tilelive = require('@mapbox/tilelive'); -var tiletype = require('@mapbox/tiletype'); -var mapnik = require('mapnik'); -var fs = require('fs'); -var tar = require('tar'); -var url = require('url'); -var qs = require('querystring'); -var zlib = require('zlib'); -var path = require('path'); -var os = require('os'); -var util = require('util'); -var crypto = require('crypto'); -var request = require('request'); -var exists = fs.exists || require('path').exists; -var numeral = require('numeral'); -var sm = new (require('@mapbox/sphericalmercator'))(); -var profiler = require('./tile-profiler'); -var Backend = require('./backend'); -var AWS = require('aws-sdk'); -var s3urls = require('s3urls'); +'use strict'; + +const tilelive = require('@mapbox/tilelive'); +const tiletype = require('@mapbox/tiletype'); +const mapnik = require('mapnik'); +const fs = require('fs'); +const tar = require('tar'); +const url = require('url'); +const qs = require('querystring'); +const zlib = require('zlib'); +const path = require('path'); +const os = require('os'); +const util = require('util'); +const crypto = require('crypto'); +const request = require('request'); +const exists = fs.exists || require('path').exists; +const numeral = require('numeral'); +const sm = new (require('@mapbox/sphericalmercator'))(); +const profiler = require('./tile-profiler'); +const Backend = require('./backend'); +const AWS = require('aws-sdk'); +const s3urls = require('s3urls'); +const { EventEmitter } = require('events'); // Register fonts for xray styles. mapnik.register_fonts(path.resolve(__dirname, 'fonts')); -module.exports = Vector; -module.exports.tm2z = tm2z; -module.exports.xray = xray; -module.exports.mapnik = mapnik; -module.exports.Backend = Backend; -module.exports.strict = true; - function md5(str) { return crypto.createHash('md5').update(str).digest('hex'); -}; - -function Vector(uri, callback) { - if (typeof uri === 'string' || (uri.protocol && !uri.xml)) { - uri = typeof uri === 'string' ? url.parse(uri) : uri; - var filepath = path.resolve(uri.pathname); - fs.readFile(filepath, 'utf8', function(err, xml) { - if (err) return callback(err); - new Vector({ - xml:xml, - base:path.dirname(filepath) - }, callback); - }); - return; - } - - if (!uri.xml) return callback && callback(new Error('No xml')); +} - this._uri = uri; - this._scale = uri.scale || undefined; - this._format = uri.format || undefined; - this._renderer = uri.renderer || undefined; - this._source = uri.source || undefined; - this._backend = uri.backend || undefined; - this._base = path.resolve(uri.base || __dirname); +class Vector extends EventEmitter { + constructor(uri, callback) { + super(); - if (callback) this.once('open', callback); + if (typeof uri === 'string' || (uri.protocol && !uri.xml)) { + uri = typeof uri === 'string' ? url.parse(uri) : uri; + const filepath = path.resolve(uri.pathname); + fs.readFile(filepath, 'utf8', (err, xml) => { + if (err) return callback(err); + new Vector({ + xml:xml, + base:path.dirname(filepath) + }, callback); + }); + return; + } - var s = this; - this.update(uri, function(err) { s.emit('open', err, s); }); -}; -util.inherits(Vector, require('events').EventEmitter); + if (!uri.xml) return callback && callback(new Error('No xml')); -Vector.registerProtocols = function(tilelive) { - tilelive.protocols['vector:'] = Vector; - tilelive.protocols['tm2z:'] = tm2z; - tilelive.protocols['tm2z+http:'] = tm2z; - tilelive.protocols['tm2z+s3:'] = tm2z; -}; + this._uri = uri; + this._scale = uri.scale || undefined; + this._format = uri.format || undefined; + this._renderer = uri.renderer || undefined; + this._source = uri.source || undefined; + this._backend = uri.backend || undefined; + this._base = path.resolve(uri.base || __dirname); -// Helper for callers to ensure source is open. This is not built directly -// into the constructor because there is no good auto cache-keying system -// for these tile sources (ie. sharing/caching is best left to the caller). -Vector.prototype.open = function(callback) { - if (this._map) return callback(null, this); - this.once('open', callback); -}; + if (callback) this.once('open', callback); -Vector.prototype.close = function(callback) { - return callback(); -}; + const s = this; + this.update(uri, (err) => { s.emit('open', err, s); }); + } -// Allows in-place update of XML/backends. -Vector.prototype.update = function(opts, callback) { - var s = this; - var map = new mapnik.Map(256,256); - map.fromString(opts.xml, { - strict: module.exports.strict, - base: this._base + path.sep - }, function(err) { - if (err) { - err.code = 'EMAPNIK'; - return callback(err); - } + static registerProtocols() { + tilelive.protocols['vector:'] = Vector; + tilelive.protocols['tm2z:'] = tm2z; + tilelive.protocols['tm2z+http:'] = tm2z; + tilelive.protocols['tm2z+s3:'] = tm2z; + } - delete s._info; - s._xml = opts.xml; - s._map = map; - s._md5 = crypto.createHash('md5').update(opts.xml).digest('hex'); - s._format = opts.format || map.parameters.format || s._format || 'png8:m=h'; - s._scale = opts.scale || +map.parameters.scale || s._scale || 1; - - var source = map.parameters.source || opts.source; - if (!s._backend || s._source !== source) { - if (!source) return callback(new Error('No backend')); - new Backend({ - uri: source, - scale: s._scale - }, function(err, backend) { - if (err) return callback(err); - s._source = map.parameters.source || opts.source; - s._backend = backend; - return callback(); - }); - } else { - return callback(); - } - }); - return; -}; + /** + * Helper for callers to ensure source is open. This is not built directly + * into the constructor because there is no good auto cache-keying system + * for these tile sources (ie. sharing/caching is best left to the caller). + */ + open(callback) { + if (this._map) return callback(null, this); + this.once('open', callback); + } -Vector.prototype.getTile = function(z, x, y, callback) { - if (!this._map) return callback(new Error('Tilesource not loaded')); - if (z < 0 || x < 0 || y < 0 || x >= Math.pow(2,z) || y >= Math.pow(2,z)) { - return callback(new Error('Tile does not exist')); + close(callback) { + return callback(); } - // Hack around tilelive API - allow params to be passed per request - // as attributes of the callback function. - var format = callback.format || this._format; - var scale = callback.scale || this._scale; - var profile = callback.profile || false; - var legacy = callback.legacy || false; - var upgrade = callback.upgrade || false; - var width = !legacy ? scale * 256 | 0 || 256 : 256; - var height = !legacy ? scale * 256 | 0 || 256 : 256; - - var source = this; - var drawtime; - var loadtime = +new Date; - var cb = function(err, vtile, head) { - if (err && err.message !== 'Tile does not exist') - return callback(err); - - // For xray styles use srcdata tile format. - if (!callback.format && source._xray && vtile._srcdata) { - var type = tiletype.type(vtile._srcdata); - format = type === 'jpg' ? 'jpeg' : - type === 'webp' ? 'webp' : - 'png8:m=h'; - } - var headers = {}; - switch (format.match(/^[a-z]+/i)[0]) { - case 'headers': - // No content type for header-only. - break; - case 'json': - case 'utf': - headers['Content-Type'] = 'application/json'; - break; - case 'jpeg': - headers['Content-Type'] = 'image/jpeg'; - break; - case 'svg': - headers['Content-Type'] = 'image/svg+xml'; - break; - case 'png': - default: - headers['Content-Type'] = 'image/png'; - break; - } - headers['ETag'] = JSON.stringify(crypto.createHash('md5') - .update(scale + source._md5 + (head && head['ETag'] || (z+','+x+','+y))) - .digest('hex')); - headers['Last-Modified'] = new Date(head && head['Last-Modified'] || 0).toUTCString(); - - // Passthrough backend expires header if present. - if (head['Expires']||head['expires']) headers['Expires'] = head['Expires']||head['expires']; - - // Passthrough backend object headers. - headers['x-vector-backend-object'] = head['x-vector-backend-object']; - - // Return headers for 'headers' format. - if (format === 'headers') return callback(null, headers, headers); - - loadtime = (+new Date) - loadtime; - drawtime = +new Date; - var opts = {z:z, x:x, y:y, scale:scale, buffer_size:256 * scale}; - if (format === 'json') { - try { return callback(null, vtile.toJSON(), headers); } - catch(err) { return callback(err); } - } else if (format === 'utf') { - var surface = new mapnik.Grid(width,height); - opts.layer = source._map.parameters.interactivity_layer; - opts.fields = source._map.parameters.interactivity_fields.split(','); - } else if (format === 'svg') { - var surface = new mapnik.CairoSurface('svg',width,height); - if (callback.renderer || this._renderer) { - opts.renderer = callback.renderer || this._renderer; - } - } else { - var surface = new mapnik.Image(width,height); - } - vtile.render(source._map, surface, opts, function(err, image) { + /* + * Allows in-place update of XML/backends. + */ + update(opts, callback) { + const s = this; + const map = new mapnik.Map(256,256); + map.fromString(opts.xml, { + strict: module.exports.strict, + base: this._base + path.sep + }, (err) => { if (err) { err.code = 'EMAPNIK'; return callback(err); } - if (format == 'svg') { - headers['Content-Type'] = 'image/svg+xml'; - return callback(null, image.getData(), headers); - } else if (format === 'utf') { - image.encode({}, function(err, buffer) { + + delete s._info; + s._xml = opts.xml; + s._map = map; + s._md5 = crypto.createHash('md5').update(opts.xml).digest('hex'); + s._format = opts.format || map.parameters.format || s._format || 'png8:m=h'; + s._scale = opts.scale || +map.parameters.scale || s._scale || 1; + + const source = map.parameters.source || opts.source; + if (!s._backend || s._source !== source) { + if (!source) return callback(new Error('No backend')); + new Backend({ + uri: source, + scale: s._scale + }, (err, backend) => { if (err) return callback(err); - return callback(null, buffer, headers); + s._source = map.parameters.source || opts.source; + s._backend = backend; + return callback(); }); } else { - image.encode(format, {}, function(err, buffer) { - if (err) return callback(err); + return callback(); + } + }); + return; + } - buffer._loadtime = loadtime; - buffer._drawtime = (+new Date) - drawtime; - buffer._srcbytes = vtile._srcbytes || 0; + getTile(z, x, y, callback) { + if (!this._map) return callback(new Error('Tilesource not loaded')); + if (z < 0 || x < 0 || y < 0 || x >= Math.pow(2,z) || y >= Math.pow(2,z)) { + return callback(new Error('Tile does not exist')); + } + // Hack around tilelive API - allow params to be passed per request + // as attributes of the callback function. + let format = callback.format || this._format; + const scale = callback.scale || this._scale; + const profile = callback.profile || false; + const legacy = callback.legacy || false; + const upgrade = callback.upgrade || false; + const width = !legacy ? scale * 256 | 0 || 256 : 256; + const height = !legacy ? scale * 256 | 0 || 256 : 256; + + const source = this; + let drawtime; + let loadtime = +new Date; + const cb = (err, vtile, head) => { + if (err && err.message !== 'Tile does not exist') + return callback(err); - if (profile) buffer._layerInfo = profiler.layerInfo(vtile); + // For xray styles use srcdata tile format. + if (!callback.format && source._xray && vtile._srcdata) { + const type = tiletype.type(vtile._srcdata); + format = type === 'jpg' ? 'jpeg' : type === 'webp' ? 'webp' : 'png8:m=h'; + } - return callback(null, buffer, headers); - }); + const headers = {}; + switch (format.match(/^[a-z]+/i)[0]) { + case 'headers': + // No content type for header-only. + break; + case 'json': + case 'utf': + headers['Content-Type'] = 'application/json'; + break; + case 'jpeg': + headers['Content-Type'] = 'image/jpeg'; + break; + case 'svg': + headers['Content-Type'] = 'image/svg+xml'; + break; + case 'png': + default: + headers['Content-Type'] = 'image/png'; + break; } - }); - }; - if (!callback.format && source._xray) { - cb.setSrcData = true; - } - cb.format = format; - cb.scale = scale; - cb.legacy = legacy; - cb.upgrade = upgrade; - source._backend.getTile(z, x, y, cb); -}; + headers['ETag'] = JSON.stringify(crypto.createHash('md5') + .update(scale + source._md5 + (head && head['ETag'] || (z + ',' + x + ',' + y))) + .digest('hex')); + headers['Last-Modified'] = new Date(head && head['Last-Modified'] || 0).toUTCString(); -Vector.prototype.getGrid = function(z, x, y, callback) { - if (!this._map) return callback(new Error('Tilesource not loaded')); - if (!this._map.parameters.interactivity_layer) return callback(new Error('Tilesource has no interactivity_layer')); - if (!this._map.parameters.interactivity_fields) return callback(new Error('Tilesource has no interactivity_fields')); - callback.format = 'utf'; - return this.getTile(z, x, y, callback); -}; + // Passthrough backend expires header if present. + if (head['Expires'] || head['expires']) headers['Expires'] = head['Expires'] || head['expires']; -Vector.prototype.getHeaders = function(z, x, y, callback) { - callback.format = 'headers'; - return this.getTile(z, x, y, callback); -}; + // Passthrough backend object headers. + headers['x-vector-backend-object'] = head['x-vector-backend-object']; -Vector.prototype.getInfo = function(callback) { - if (!this._map) return callback(new Error('Tilesource not loaded')); - if (this._info) return callback(null, this._info); - - var params = this._map.parameters; - this._info = Object.keys(params).reduce(function(memo, key) { - switch (key) { - // The special "json" key/value pair allows JSON to be serialized - // and merged into the metadata of a mapnik XML based source. This - // enables nested properties and non-string datatypes to be - // captured by mapnik XML. - case 'json': - try { var jsondata = JSON.parse(params[key]); } - catch (err) { return callback(err); } - Object.keys(jsondata).reduce(function(memo, key) { - memo[key] = memo[key] || jsondata[key]; - return memo; - }, memo); - break; - case 'bounds': - case 'center': - memo[key] = params[key].split(',').map(function(v) { return parseFloat(v) }); - break; - case 'scale': - memo[key] = params[key].toString(); - break; - default: - memo[key] = params[key]; - break; - } - return memo; - }, {}); - return callback(null, this._info); -}; + // Return headers for 'headers' format. + if (format === 'headers') return callback(null, headers, headers); -// Proxies mapnik vtile.query method with the added convienice of -// letting the tilelive-vector backend do the hard work of finding -// the right tile to use. -Vector.prototype.queryTile = function(z, lon, lat, options, callback) { - this._backend.queryTile(z, lon, lat, options, callback); -}; + loadtime = (+new Date) - loadtime; + drawtime = +new Date; + const opts = { z:z, x:x, y:y, scale:scale, buffer_size:256 * scale }; -Vector.prototype.profile = function(callback) { - var s = this; - var map = new mapnik.Map(256,256); - var xmltime = Date.now(); - var densest = []; - - map.fromString(this._xml, { - strict: module.exports.strict, - base: this._base + '/' - }, function(err) { - if (err) { - err.code = 'EMAPNIK'; - return callback(err); + let surface; + if (format === 'json') { + try { return callback(null, vtile.toJSON(), headers); } + catch (err) { return callback(err); } + } else if (format === 'utf') { + surface = new mapnik.Grid(width,height); + opts.layer = source._map.parameters.interactivity_layer; + opts.fields = source._map.parameters.interactivity_fields.split(','); + } else if (format === 'svg') { + surface = new mapnik.CairoSurface('svg',width,height); + if (callback.renderer || this._renderer) { + opts.renderer = callback.renderer || this._renderer; + } + } else { + surface = new mapnik.Image(width,height); + } + vtile.render(source._map, surface, opts, (err, image) => { + if (err) { + err.code = 'EMAPNIK'; + return callback(err); + } + if (format === 'svg') { + headers['Content-Type'] = 'image/svg+xml'; + return callback(null, image.getData(), headers); + } else if (format === 'utf') { + image.encode({}, (err, buffer) => { + if (err) return callback(err); + return callback(null, buffer, headers); + }); + } else { + image.encode(format, {}, (err, buffer) => { + if (err) return callback(err); + + buffer._loadtime = loadtime; + buffer._drawtime = (+new Date) - drawtime; + buffer._srcbytes = vtile._srcbytes || 0; + + if (profile) buffer._layerInfo = profiler.layerInfo(vtile); + + return callback(null, buffer, headers); + }); + } + }); + }; + if (!callback.format && source._xray) { + cb.setSrcData = true; } + cb.format = format; + cb.scale = scale; + cb.legacy = legacy; + cb.upgrade = upgrade; + source._backend.getTile(z, x, y, cb); + } - xmltime = Date.now() - xmltime; + getGrid(z, x, y, callback) { + if (!this._map) return callback(new Error('Tilesource not loaded')); + if (!this._map.parameters.interactivity_layer) return callback(new Error('Tilesource has no interactivity_layer')); + if (!this._map.parameters.interactivity_fields) return callback(new Error('Tilesource has no interactivity_fields')); + callback.format = 'utf'; + return this.getTile(z, x, y, callback); + } - s.getInfo(function(err, info) { - if (err) return callback(err); + getHeaders(z, x, y, callback) { + callback.format = 'headers'; + return this.getTile(z, x, y, callback); + } + + getInfo(callback) { + if (!this._map) return callback(new Error('Tilesource not loaded')); + if (this._info) return callback(null, this._info); + + const params = this._map.parameters; + this._info = Object.keys(params).reduce((memo, key) => { + switch (key) { + // The special "json" key/value pair allows JSON to be serialized + // and merged into the metadata of a mapnik XML based source. This + // enables nested properties and non-string datatypes to be + // captured by mapnik XML. + case 'json': + try { + const jsondata = JSON.parse(params[key]); + + Object.keys(jsondata).reduce((memo, key) => { + memo[key] = memo[key] || jsondata[key]; + return memo; + }, memo); + } catch (err) { + return callback(err); + } + + break; + case 'bounds': + case 'center': + memo[key] = params[key].split(',').map((v) => { return parseFloat(v); }); + break; + case 'scale': + memo[key] = params[key].toString(); + break; + default: + memo[key] = params[key]; + break; + } + return memo; + }, {} + ); + + return callback(null, this._info); + } + + /* + * Proxies mapnik vtile.query method with the added convienice of + * letting the tilelive-vector backend do the hard work of finding + * the right tile to use. + */ + queryTile(z, lon, lat, options, callback) { + this._backend.queryTile(z, lon, lat, options, callback); + } + + profile(callback) { + const s = this; + const map = new mapnik.Map(256,256); + let xmltime = Date.now(); + const densest = []; - s._backend.getInfo(function(err, backend_info) { + map.fromString(this._xml, { + strict: module.exports.strict, + base: this._base + '/' + }, (err) => { + if (err) { + err.code = 'EMAPNIK'; + return callback(err); + } + + xmltime = Date.now() - xmltime; + + s.getInfo((err, info) => { if (err) return callback(err); - var center = (info.center || backend_info.center).slice(0); - var minzoom = info.minzoom || backend_info.minzoom || 0; - var maxzoom = info.maxzoom || backend_info.maxzoom || 22; - - // wrapx lon value. - center[0] = ((((center[0]+180)%360)+360)%360) - 180; - - var xyz = sm.xyz([center[0], center[1], center[0], center[1]], minzoom); - - getTiles(minzoom, xyz.minX, xyz.minY); - - // Profile derivative four tiles of z,x,y - function getTiles(z, x, y) { - var tiles = []; - var queue = [{z:z, x:x+0, y:y+0}]; - if (x + 1 < Math.pow(2,z)) queue.push({z:z, x:x+1, y:y+0}); - if (y + 1 < Math.pow(2,z)) queue.push({z:z, x:x+0, y:y+1}); - if (x + 1 < Math.pow(2,z) && y + 1 < Math.pow(2,z)) queue.push({z:z, x:x+1, y:y+1}); - getTile(); - function getTile() { - if (queue.length) { - var t = queue.shift(); - s.getTile(t.z, t.x, t.y, function(err, run1, headers) { - if (err) { - err.code = 'EMAPNIK'; - return callback(err); - } - s.getTile(t.z, t.x, t.y, function(err, run2, headers) { - if (err) return callback(err); - t.drawtime = Math.min(run1._drawtime, run2._drawtime); - t.loadtime = run1._loadtime; - t.srcbytes = run1._srcbytes; - t.imgbytes = run1.length; - t.buffer = run1; - tiles.push(t); - getTile(); + s._backend.getInfo((err, backend_info) => { + if (err) return callback(err); + + const center = (info.center || backend_info.center).slice(0); + const minzoom = info.minzoom || backend_info.minzoom || 0; + const maxzoom = info.maxzoom || backend_info.maxzoom || 22; + + // wrapx lon value. + center[0] = ((((center[0] + 180) % 360) + 360) % 360) - 180; + + const xyz = sm.xyz([center[0], center[1], center[0], center[1]], minzoom); + + getTiles(minzoom, xyz.minX, xyz.minY); + + // Profile derivative four tiles of z,x,y + function getTiles(z, x, y) { + const tiles = []; + const queue = [{ z:z, x:x + 0, y:y + 0 }]; + if (x + 1 < Math.pow(2,z)) queue.push({ z:z, x:x + 1, y:y + 0 }); + if (y + 1 < Math.pow(2,z)) queue.push({ z:z, x:x + 0, y:y + 1 }); + if (x + 1 < Math.pow(2,z) && y + 1 < Math.pow(2,z)) queue.push({ z:z, x:x + 1, y:y + 1 }); + getTile(); + function getTile() { + if (queue.length) { + const t = queue.shift(); + s.getTile(t.z, t.x, t.y, (err, run1, headers) => { + if (err) { + err.code = 'EMAPNIK'; + return callback(err); + } + s.getTile(t.z, t.x, t.y, (err, run2, headers) => { + if (err) return callback(err); + t.drawtime = Math.min(run1._drawtime, run2._drawtime); + t.loadtime = run1._loadtime; + t.srcbytes = run1._srcbytes; + t.imgbytes = run1.length; + t.buffer = run1; + tiles.push(t); + getTile(); + }); }); - }); - } else { - tiles.sort(function (a, b) { - if (a.imgbytes < b.imgbytes) return 1; - if (a.imgbytes > b.imgbytes) return -1; - return 0; - }); - densest.push(tiles[0]); - - // Done. - if (z >= maxzoom) return callback(null, { - tiles: densest, - xmltime: xmltime, - drawtime: densest.reduce(stat('drawtime', densest.length), {}), - loadtime: densest.reduce(stat('loadtime', densest.length), {}), - srcbytes: densest.reduce(stat('srcbytes', densest.length), {}), - imgbytes: densest.reduce(stat('imgbytes', densest.length), {}), - }); - - function stat(key, count) { return function(memo, t) { - memo.avg = (memo.avg || 0) + t[key]/count; - memo.min = Math.min(memo.min||Infinity, t[key]); - memo.max = Math.max(memo.max||0, t[key]); - return memo; - }} - - // profiling zxy @ zoom level < center. - // next zxy should remain on center coords. - if (z < center[2]) { - var xyz = sm.xyz([center[0], center[1], center[0], center[1]], z+1); - getTiles(z+1, xyz.minX, xyz.minY); - // profiling zxy @ zoomlevel >= center. - // next zxy descend based on densest tile. } else { - getTiles(z+1, tiles[0].x * 2, tiles[0].y * 2); + tiles.sort((a, b) => { + if (a.imgbytes < b.imgbytes) return 1; + if (a.imgbytes > b.imgbytes) return -1; + return 0; + }); + densest.push(tiles[0]); + + // Done. + if (z >= maxzoom) return callback(null, { + tiles: densest, + xmltime: xmltime, + drawtime: densest.reduce(stat('drawtime', densest.length), {}), + loadtime: densest.reduce(stat('loadtime', densest.length), {}), + srcbytes: densest.reduce(stat('srcbytes', densest.length), {}), + imgbytes: densest.reduce(stat('imgbytes', densest.length), {}), + }); + + /* eslint-disable no-inner-declarations */ + function stat(key, count) { return (memo, t) => { + memo.avg = (memo.avg || 0) + t[key] / count; + memo.min = Math.min(memo.min || Infinity, t[key]); + memo.max = Math.max(memo.max || 0, t[key]); + return memo; + };} + + // profiling zxy @ zoom level < center. + // next zxy should remain on center coords. + if (z < center[2]) { + const xyz = sm.xyz([center[0], center[1], center[0], center[1]], z + 1); + getTiles(z + 1, xyz.minX, xyz.minY); + // profiling zxy @ zoomlevel >= center. + // next zxy descend based on densest tile. + } else { + getTiles(z + 1, tiles[0].x * 2, tiles[0].y * 2); + } } } } - } + }); }); }); - }); -}; + } +} function tm2z(uri, callback) { if (typeof uri === 'string') { uri = url.parse(uri, true); uri.pathname = qs.unescape(uri.pathname); - } + } - var maxsize = { + const maxsize = { file: uri.filesize || 750 * 1024, gunzip: uri.gunzipsize || 5 * 1024 * 1024, xml: uri.xmlsize || 750 * 1024 }; - var id = url.format(uri); + const id = url.format(uri); - var xml; - var base = path.join(os.tmpDir(), md5(id).substr(0,8) + '-' + path.basename(id)); - var parser = tar.Parse(); - var gunzip = zlib.Gunzip(); - var unpacked = false; + let xml; + const base = path.join(os.tmpdir(), md5(id).substr(0,8) + '-' + path.basename(id)); + const parser = new tar.Parse(); + const gunzip = zlib.Gunzip(); + let unpacked = false; - var once = 0; - var error = function(err) { if (!once++) callback(err); }; + let once = 0; + const error = (err) => { if (!once++) callback(err); }; // Check for unpacked manifest - exists(base + '/.unpacked', function(exists) { + exists(base + '/.unpacked', (exists) => { unpacked = exists; if (unpacked) { unpack(); } else { - fs.mkdir(base, function(err) { + fs.mkdir(base, (err) => { if (err && err.code !== 'EEXIST') return callback(err); unpack(); }); @@ -438,55 +451,55 @@ function tm2z(uri, callback) { }); function unpack() { - var stream; - var size = { + let stream; + const size = { file: 0, gunzip: 0, xml: 0 }; - var todo = []; + const todo = []; function chunked(chunk) { size.file += chunk.length; if (size.file > maxsize.file) { - var err = new RangeError('Upload size should not exceed ' + numeral(maxsize.file).format('0b') + '.'); + const err = new RangeError('Upload size should not exceed ' + numeral(maxsize.file).format('0b') + '.'); stream.emit('error', err); } } - gunzip.on('data', function(chunk) { + gunzip.on('data', (chunk) => { size.gunzip += chunk.length; if (size.gunzip > maxsize.gunzip) { - var err = new RangeError('Unzipped size should not exceed ' + numeral(maxsize.gunzip).format('0b') + '.'); + const err = new RangeError('Unzipped size should not exceed ' + numeral(maxsize.gunzip).format('0b') + '.'); gunzip.emit('error', err); } }); - parser.on('entry', function(entry) { - var parts = []; - var filepath = entry.props.path.split('/').slice(1).join('/'); - entry.on('data', function(chunk) { - if (path.basename(filepath).toLowerCase() == 'project.xml') { + parser.on('entry', (entry) => { + const parts = []; + const filepath = entry.props.path.split('/').slice(1).join('/'); + entry.on('data', (chunk) => { + if (path.basename(filepath).toLowerCase() === 'project.xml') { size.xml += chunk.length; if (size.xml > maxsize.xml) { - var err = new RangeError('Unzipped project.xml size should not exceed ' + numeral(maxsize.xml).format('0b') + '.'); + const err = new RangeError('Unzipped project.xml size should not exceed ' + numeral(maxsize.xml).format('0b') + '.'); parser.emit('error', err); } } parts.push(chunk); }); - entry.on('end', function() { - var buffer = Buffer.concat(parts); - if (path.basename(filepath).toLowerCase() == 'project.xml') { + entry.on('end', () => { + const buffer = Buffer.concat(parts); + if (path.basename(filepath).toLowerCase() === 'project.xml') { xml = buffer.toString(); if (unpacked) return load(); } else if (!unpacked && entry.type === 'Directory') { - todo.push(function(next) { fs.mkdir(base + '/' + filepath, next); }); + todo.push((next) => { fs.mkdir(base + '/' + filepath, next); }); } else if (!unpacked && entry.type === 'File') { - todo.push(function(next) { fs.writeFile(base + '/' + filepath, buffer, next); }); + todo.push((next) => { fs.writeFile(base + '/' + filepath, buffer, next); }); } }); }); - parser.on('end', function() { + parser.on('end', () => { // Load was called early via parser. Do nothing. if (unpacked && xml) return; @@ -496,8 +509,8 @@ function tm2z(uri, callback) { // Callback already called with an error. if (once) return; - todo.push(function(next) { fs.writeFile(base + '/.unpacked', '', next); }); - var next = function(err) { + todo.push((next) => { fs.writeFile(base + '/.unpacked', '', next); }); + const next = (err) => { if (err && err.code !== 'EEXIST') return error(err); if (todo.length) { todo.shift()(next); @@ -511,7 +524,7 @@ function tm2z(uri, callback) { gunzip.on('error', error); parser.on('error', error); - switch(uri.protocol) { + switch (uri.protocol) { case 'tm2z:': // The uri from unpacker has already been pulled // down from S3. @@ -523,20 +536,20 @@ function tm2z(uri, callback) { break; case 'tm2z+http:': uri.protocol = 'http:'; - stream = request({ uri: uri, encoding:null }, function(err, res, body) { - if (err) { - error(err); - } else if (res.headers['content-length'] && parseInt(res.headers['content-length'],10) !== body.length) { - error(new Error('Content-Length does not match response body length')); - } - }) + stream = request({ uri: uri, encoding:null }, (err, res, body) => { + if (err) { + error(err); + } else if (res.headers['content-length'] && parseInt(res.headers['content-length'],10) !== body.length) { + error(new Error('Content-Length does not match response body length')); + } + }) .on('data', chunked) .pipe(gunzip) .pipe(parser) .on('error', error); break; - case 'tm2z+s3:': - var s3 = new AWS.S3(); + case 'tm2z+s3:': { + const s3 = new AWS.S3(); stream = s3.getObject(s3urls.fromUrl(uri.href.replace('tm2z+', ''))) .createReadStream() .on('data', chunked) @@ -544,27 +557,28 @@ function tm2z(uri, callback) { .pipe(gunzip) .pipe(parser) .on('error', error); + } break; } - }; + } function load() { if (once++) return; if (!xml) return callback(new Error('project.xml not found in package')); - new Vector({ + Vector({ source: 'mapbox:///mapbox.mapbox-streets-v4', base: base, xml: xml }, callback); - }; -}; + } +} -tm2z.findID = function(source, id, callback) { +tm2z.findID = (source, id, callback) => { callback(new Error('id not found')); }; function xray(opts, callback) { - new Backend(opts, function(err, backend) { + new Backend(opts, (err, backend) => { if (err) return callback(err); if (!backend._vector_layers) return callback(new Error('source must contain a vector_layers property')); new Vector({ @@ -573,7 +587,7 @@ function xray(opts, callback) { vector_layers: backend._vector_layers }), backend: backend - }, function(err, source) { + }, (err, source) => { if (err) return callback(err); source._xray = true; return callback(null, source); @@ -582,8 +596,8 @@ function xray(opts, callback) { } xray.xml = function(opts) { - return util.format(xray.templates.map, opts.map_properties, opts.vector_layers.map(function(layer){ - var rgb = xray.color(layer.id).join(','); + return util.format(xray.templates.map, opts.map_properties, opts.vector_layers.map((layer) => { + const rgb = xray.color(layer.id).join(','); return util.format(xray.templates.layer, layer.id, rgb, rgb, rgb, rgb, rgb, layer.id, layer.id, layer.id, layer.id); }).join('\n')); }; @@ -595,17 +609,24 @@ xray.templates.layer = fs.readFileSync(path.join(__dirname, 'templates', 'layer. xray.templates.params = fs.readFileSync(path.join(__dirname, 'templates', 'params.xml'), 'utf8'); xray.color = function(str) { - var rgb = [0, 0, 0]; - for (var i = 0; i < str.length; i++) { - var v = str.charCodeAt(i); - rgb[v % 3] = (rgb[i % 3] + (13*(v%13))) % 12; + const rgb = [0, 0, 0]; + for (let i = 0; i < str.length; i++) { + const v = str.charCodeAt(i); + rgb[v % 3] = (rgb[i % 3] + (13 * (v % 13))) % 12; } - var r = 4 + rgb[0]; - var g = 4 + rgb[1]; - var b = 4 + rgb[2]; + let r = 4 + rgb[0]; + let g = 4 + rgb[1]; + let b = 4 + rgb[2]; r = (r * 16) + r; g = (g * 16) + g; b = (b * 16) + b; return [r,g,b]; }; +module.exports = Vector; +module.exports.tm2z = tm2z; +module.exports.xray = xray; +module.exports.mapnik = mapnik; +module.exports.Backend = Backend; +module.exports.strict = true; + diff --git a/package-lock.json b/package-lock.json index 48fe27a..cde19f1 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,9 +1,122 @@ { "name": "@mapbox/tilelive-vector", - "version": "4.1.1", + "version": "4.2.0", "lockfileVersion": 1, "requires": true, "dependencies": { + "@babel/code-frame": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.0.0.tgz", + "integrity": "sha512-OfC2uemaknXr87bdLUkWog7nYuliM9Ij5HUcajsVcMCpQrcLmtxRbVFTIqmcSkSeYRBFBRxs2FiUqFJDLdiebA==", + "dev": true, + "requires": { + "@babel/highlight": "^7.0.0" + } + }, + "@babel/generator": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.4.4.tgz", + "integrity": "sha512-53UOLK6TVNqKxf7RUh8NE851EHRxOOeVXKbK2bivdb+iziMyk03Sr4eaE9OELCbyZAAafAKPDwF2TPUES5QbxQ==", + "dev": true, + "requires": { + "@babel/types": "^7.4.4", + "jsesc": "^2.5.1", + "lodash": "^4.17.11", + "source-map": "^0.5.0", + "trim-right": "^1.0.1" + } + }, + "@babel/helper-function-name": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.1.0.tgz", + "integrity": "sha512-A95XEoCpb3TO+KZzJ4S/5uW5fNe26DjBGqf1o9ucyLyCmi1dXq/B3c8iaWTfBk3VvetUxl16e8tIrd5teOCfGw==", + "dev": true, + "requires": { + "@babel/helper-get-function-arity": "^7.0.0", + "@babel/template": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "@babel/helper-get-function-arity": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0.tgz", + "integrity": "sha512-r2DbJeg4svYvt3HOS74U4eWKsUAMRH01Z1ds1zx8KNTPtpTL5JAsdFv8BNyOpVqdFhHkkRDIg5B4AsxmkjAlmQ==", + "dev": true, + "requires": { + "@babel/types": "^7.0.0" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.4.4.tgz", + "integrity": "sha512-Ro/XkzLf3JFITkW6b+hNxzZ1n5OQ80NvIUdmHspih1XAhtN3vPTuUFT4eQnela+2MaZ5ulH+iyP513KJrxbN7Q==", + "dev": true, + "requires": { + "@babel/types": "^7.4.4" + } + }, + "@babel/highlight": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.0.0.tgz", + "integrity": "sha512-UFMC4ZeFC48Tpvj7C8UgLvtkaUuovQX+5xNWrsIoMG8o2z+XFKjKaN9iVmS84dPwVN00W4wPmqvYoZF3EGAsfw==", + "dev": true, + "requires": { + "chalk": "^2.0.0", + "esutils": "^2.0.2", + "js-tokens": "^4.0.0" + } + }, + "@babel/parser": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.4.4.tgz", + "integrity": "sha512-5pCS4mOsL+ANsFZGdvNLybx4wtqAZJ0MJjMHxvzI3bvIsz6sQvzW8XX92EYIkiPtIvcfG3Aj+Ir5VNyjnZhP7w==", + "dev": true + }, + "@babel/template": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.4.4.tgz", + "integrity": "sha512-CiGzLN9KgAvgZsnivND7rkA+AeJ9JB0ciPOD4U59GKbQP2iQl+olF1l76kJOupqidozfZ32ghwBEJDhnk9MEcw==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "@babel/parser": "^7.4.4", + "@babel/types": "^7.4.4" + } + }, + "@babel/traverse": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.4.4.tgz", + "integrity": "sha512-Gw6qqkw/e6AGzlyj9KnkabJX7VcubqPtkUQVAwkc0wUMldr3A/hezNB3Rc5eIvId95iSGkGIOe5hh1kMKf951A==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "@babel/generator": "^7.4.4", + "@babel/helper-function-name": "^7.1.0", + "@babel/helper-split-export-declaration": "^7.4.4", + "@babel/parser": "^7.4.4", + "@babel/types": "^7.4.4", + "debug": "^4.1.0", + "globals": "^11.1.0", + "lodash": "^4.17.11" + } + }, + "@babel/types": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.4.4.tgz", + "integrity": "sha512-dOllgYdnEFOebhkKCjzSVFqw/PmmB8pH6RGOWkY4GsboQNd47b1fBThBSwlHAq9alF9vc1M3+6oqR47R50L0tQ==", + "dev": true, + "requires": { + "esutils": "^2.0.2", + "lodash": "^4.17.11", + "to-fast-properties": "^2.0.0" + } + }, + "@mapbox/eslint-config-geocoding": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@mapbox/eslint-config-geocoding/-/eslint-config-geocoding-2.0.0.tgz", + "integrity": "sha512-qHMcLbzkkGKgPw9LOBhxxbwcVmknRaVCcMUW3LEQMKDZbgTe/RYwo63JzCF7sJMnZY5XboXb+h73eJ5AzdKeRg==", + "dev": true + }, "@mapbox/mapbox-studio-default-style": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/@mapbox/mapbox-studio-default-style/-/mapbox-studio-default-style-2.0.0.tgz", @@ -11,9 +124,9 @@ "dev": true }, "@mapbox/sphericalmercator": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/@mapbox/sphericalmercator/-/sphericalmercator-1.0.5.tgz", - "integrity": "sha1-cCN7l3QJXtHP286nqP0fyCsmkfI=" + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@mapbox/sphericalmercator/-/sphericalmercator-1.1.0.tgz", + "integrity": "sha512-pEsfZyG4OMThlfFQbCte4gegvHUjxXCjz0KZ4Xk8NdOYTQBLflj6U8PL05RPAiuRAMAQNUUKJuL6qYZ5Y4kAWA==" }, "@mapbox/tilejson": { "version": "1.1.0", @@ -27,14 +140,21 @@ } }, "@mapbox/tilelive": { - "version": "5.12.6", - "resolved": "https://registry.npmjs.org/@mapbox/tilelive/-/tilelive-5.12.6.tgz", - "integrity": "sha1-ALPv4LmZ6DB7wcwJnLdw2nZ2aQs=", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/@mapbox/tilelive/-/tilelive-6.0.0.tgz", + "integrity": "sha512-LGqcRe4Zhc2kMZLXQtfmYRBOxIlcWegLRnZOUB8Hb+4fT7ifEzqg4Lm9ambU9AWHwajwEIFD5la3TPCr+p2C0A==", "requires": { "@mapbox/sphericalmercator": "~1.0.1", "minimist": "~0.2.0", "progress-stream": "~0.5.x", "queue-async": "~1.0.7" + }, + "dependencies": { + "@mapbox/sphericalmercator": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@mapbox/sphericalmercator/-/sphericalmercator-1.0.5.tgz", + "integrity": "sha1-cCN7l3QJXtHP286nqP0fyCsmkfI=" + } } }, "@mapbox/tiletype": { @@ -43,9 +163,20 @@ "integrity": "sha1-GhSY9qG3d2MOC006L+2dlJWVYMw=" }, "abbrev": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.0.9.tgz", - "integrity": "sha1-kbR5JYinc4wl813W9jdSovh3YTU=", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==" + }, + "acorn": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.1.1.tgz", + "integrity": "sha512-jPTiwtOxaHNaAPg/dmrJ/beuzLRnXtB0kQPQ8JpotKJgTB6rX6c8mlf315941pyjBSaPg8NHXS9fhP4u17DpGA==", + "dev": true + }, + "acorn-jsx": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.0.1.tgz", + "integrity": "sha512-HJ7CfNHrfJLlNTzIEUTj43LNWGkqpRLxm3YjAlcD0ACydk9XynzYsCBHxut+iqt+1aBXkx9UP/w/ZqMr13XIzg==", "dev": true }, "agentkeepalive": { @@ -55,45 +186,94 @@ "dev": true }, "ajv": { - "version": "5.5.2", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz", - "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=", + "version": "6.10.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.10.0.tgz", + "integrity": "sha512-nffhOpkymDECQyR0mnsUtoCE8RlX38G0rYP+wgLWFyZuUyuuojSSvi/+euOiQBIn63whYwYVIIH1TvE3tu4OEg==", "requires": { - "co": "^4.6.0", - "fast-deep-equal": "^1.0.0", + "fast-deep-equal": "^2.0.1", "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.3.0" - } - }, - "align-text": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/align-text/-/align-text-0.1.4.tgz", - "integrity": "sha1-DNkKVhCT810KmSVsIrcGlDP60Rc=", - "dev": true, - "requires": { - "kind-of": "^3.0.2", - "longest": "^1.0.1", - "repeat-string": "^1.5.2" + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" } }, - "amdefine": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz", - "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=", + "ansi-escapes": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz", + "integrity": "sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==", "dev": true }, "ansi-regex": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" }, "ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "append-transform": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/append-transform/-/append-transform-1.0.0.tgz", + "integrity": "sha512-P009oYkeHyU742iSZJzZZywj4QRJdnTWffaKuJQLablCZ1uz6/cW4yaRgcDaoQ+uwOxxnt0gRUcwfsNP2ri0gw==", + "dev": true, + "requires": { + "default-require-extensions": "^2.0.0" + } + }, + "aproba": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", + "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==" + }, + "archy": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz", + "integrity": "sha1-+cjBN1fMHde8N5rHeyxipcKGjEA=", "dev": true }, + "are-we-there-yet": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz", + "integrity": "sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w==", + "requires": { + "delegates": "^1.0.0", + "readable-stream": "^2.0.6" + }, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + }, + "readable-stream": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, "argparse": { "version": "1.0.10", "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", @@ -104,19 +284,22 @@ } }, "asn1": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.3.tgz", - "integrity": "sha1-2sh4dxPJlmhJ/IGAd36+nB3fO4Y=" + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", + "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", + "requires": { + "safer-buffer": "~2.1.0" + } }, "assert-plus": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" }, - "async": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", - "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=", + "astral-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz", + "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==", "dev": true }, "asynckit": { @@ -125,9 +308,9 @@ "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" }, "aws-sdk": { - "version": "2.282.1", - "resolved": "https://registry.npmjs.org/aws-sdk/-/aws-sdk-2.282.1.tgz", - "integrity": "sha512-2/QFnzANnU/Fy4hdCz93bq8ERG2gANfGytt4cZGEPC0V6ePx22JqYGZMYUmBEGsWDCKbKc8l8QZDDer4r/0QBw==", + "version": "2.448.0", + "resolved": "https://registry.npmjs.org/aws-sdk/-/aws-sdk-2.448.0.tgz", + "integrity": "sha512-RMmdxP0VgI8eq7SehOHINULL6BL84wy9jOngQwJnxCPT/3/5jUuexKjzeFpdXTS4+dVToqj8q9THAbqzuXZ9dQ==", "requires": { "buffer": "4.9.1", "events": "1.1.1", @@ -136,7 +319,7 @@ "querystring": "0.2.0", "sax": "1.2.1", "url": "0.10.3", - "uuid": "3.1.0", + "uuid": "3.3.2", "xml2js": "0.4.19" } }, @@ -146,9 +329,9 @@ "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=" }, "aws4": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.7.0.tgz", - "integrity": "sha512-32NDda82rhwD9/JBCCkB+MRYDp0oSvlo2IL6rQWA10PQi7tDUM3eqMSltXmY+Oyl/7N3P3qNtAlv7X0d9bI28w==" + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.8.0.tgz", + "integrity": "sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ==" }, "balanced-match": { "version": "1.0.0", @@ -164,27 +347,10 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", - "optional": true, "requires": { "tweetnacl": "^0.14.3" } }, - "block-stream": { - "version": "0.0.9", - "resolved": "https://registry.npmjs.org/block-stream/-/block-stream-0.0.9.tgz", - "integrity": "sha1-E+v+d4oDIFz+A3UUgeu0szAMEmo=", - "requires": { - "inherits": "~2.0.0" - } - }, - "boom": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/boom/-/boom-4.3.1.tgz", - "integrity": "sha1-T4owBctKfjiJ90kDD9JbluAdLjE=", - "requires": { - "hoek": "4.x.x" - } - }, "brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", @@ -211,80 +377,172 @@ } } }, - "camelcase": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz", - "integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=", + "caching-transform": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/caching-transform/-/caching-transform-3.0.2.tgz", + "integrity": "sha512-Mtgcv3lh3U0zRii/6qVgQODdPA4G3zhG+jtbCWj39RXuUFTMzH0vcdMtaJS1jPowd+It2Pqr6y3NJMQqOqCE2w==", "dev": true, - "optional": true + "requires": { + "hasha": "^3.0.0", + "make-dir": "^2.0.0", + "package-hash": "^3.0.0", + "write-file-atomic": "^2.4.2" + } + }, + "callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true + }, + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true }, "caseless": { "version": "0.12.0", "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=" }, - "center-align": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/center-align/-/center-align-0.1.3.tgz", - "integrity": "sha1-qg0yYptu6XIgBBHL1EYckHvCt60=", + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dev": true, - "optional": true, "requires": { - "align-text": "^0.1.3", - "lazy-cache": "^1.0.3" + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "dependencies": { + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } } }, - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "chardet": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", + "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", + "dev": true + }, + "chownr": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.1.tgz", + "integrity": "sha512-j38EvO5+LHX84jlo6h4UzmOwi0UgW61WRyPtJz4qaadK5eY3BTS5TY/S1Stc3Uk2lIM6TPevAlULiEJwie860g==" + }, + "cli-cursor": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", + "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=", "dev": true, "requires": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" + "restore-cursor": "^2.0.0" } }, + "cli-width": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.0.tgz", + "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=", + "dev": true + }, "cliui": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz", - "integrity": "sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE=", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-4.1.0.tgz", + "integrity": "sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ==", "dev": true, - "optional": true, "requires": { - "center-align": "^0.1.1", - "right-align": "^0.1.1", - "wordwrap": "0.0.2" + "string-width": "^2.1.1", + "strip-ansi": "^4.0.0", + "wrap-ansi": "^2.0.0" }, "dependencies": { - "wordwrap": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz", - "integrity": "sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8=", + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true + }, + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", "dev": true, - "optional": true + "requires": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + } + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "requires": { + "ansi-regex": "^3.0.0" + } } } }, - "co": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", - "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=" + "code-point-at": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", + "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=" + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true }, "combined-stream": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.6.tgz", - "integrity": "sha1-cj599ugBrFYTETp+RFqbactjKBg=", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.7.tgz", + "integrity": "sha512-brWl9y6vOB1xYPZcpZde3N9zDByXTosAeMDo4p1wzo6UMOX4vumB+TP1RZ76sfE6Md68Q0NJSrE/gbezd4Ul+w==", "requires": { "delayed-stream": "~1.0.0" } }, "commander": { - "version": "2.16.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.16.0.tgz", - "integrity": "sha512-sVXqklSaotK9at437sFlFpyOcJonxe0yST/AG9DkQKUdIE6IqGIMv4SfAQSKaJbSdVEJYItASCrBiVQHq1HQew==", + "version": "2.20.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.0.tgz", + "integrity": "sha512-7j2y+40w61zy6YC2iRNpUe/NwhNyoXrYpHMrSunaMG64nRnaf96zO/KMQR4OyN/UnE5KLyEBnKHd4aG3rskjpQ==", + "dev": true, + "optional": true + }, + "commondir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", "dev": true }, "concat-map": { @@ -292,185 +550,71 @@ "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" }, + "console-control-strings": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", + "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=" + }, + "convert-source-map": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.6.0.tgz", + "integrity": "sha512-eFu7XigvxdZ1ETfbgPBohgyQ/Z++C0eEhTor0qRwBw9unw+L0/6V8wkSuGgzdThkiS5lSpdptOQPD8Ak40a+7A==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.1" + } + }, "core-util-is": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" }, "coveralls": { - "version": "2.11.16", - "resolved": "https://registry.npmjs.org/coveralls/-/coveralls-2.11.16.tgz", - "integrity": "sha1-2pBhJlFC3e6VT2g3kSK+l76KtLE=", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/coveralls/-/coveralls-3.0.3.tgz", + "integrity": "sha512-viNfeGlda2zJr8Gj1zqXpDMRjw9uM54p7wzZdvLRyOgnAfCe974Dq4veZkjJdxQXbmdppu6flEajFYseHYaUhg==", "dev": true, "requires": { - "js-yaml": "3.6.1", - "lcov-parse": "0.0.10", - "log-driver": "1.2.5", - "minimist": "1.2.0", - "request": "2.79.0" + "growl": "~> 1.10.0", + "js-yaml": "^3.11.0", + "lcov-parse": "^0.0.10", + "log-driver": "^1.2.7", + "minimist": "^1.2.0", + "request": "^2.86.0" }, "dependencies": { - "assert-plus": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-0.2.0.tgz", - "integrity": "sha1-104bh+ev/A24qttwIfP+SBAasjQ=", - "dev": true - }, - "aws-sign2": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.6.0.tgz", - "integrity": "sha1-FDQt0428yU0OW4fXY81jYSwOeU8=", - "dev": true - }, - "boom": { - "version": "2.10.1", - "resolved": "https://registry.npmjs.org/boom/-/boom-2.10.1.tgz", - "integrity": "sha1-OciRjO/1eZ+D+UkqhI9iWt0Mdm8=", - "dev": true, - "requires": { - "hoek": "2.x.x" - } - }, - "caseless": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.11.0.tgz", - "integrity": "sha1-cVuW6phBWTzDMGeSP17GDr2k99c=", - "dev": true - }, - "cryptiles": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-2.0.5.tgz", - "integrity": "sha1-O9/s3GCBR8HGcgL6KR59ylnqo7g=", - "dev": true, - "requires": { - "boom": "2.x.x" - } - }, - "form-data": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.1.4.tgz", - "integrity": "sha1-M8GDrPGTJ27KqYFDpp6Uv+4XUNE=", - "dev": true, - "requires": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.5", - "mime-types": "^2.1.12" - } - }, - "har-validator": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-2.0.6.tgz", - "integrity": "sha1-zcvAgYgmWtEZtqWnyKtw7s+10n0=", - "dev": true, - "requires": { - "chalk": "^1.1.1", - "commander": "^2.9.0", - "is-my-json-valid": "^2.12.4", - "pinkie-promise": "^2.0.0" - } - }, - "hawk": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/hawk/-/hawk-3.1.3.tgz", - "integrity": "sha1-B4REvXwWQLD+VA0sm3PVlnjo4cQ=", - "dev": true, - "requires": { - "boom": "2.x.x", - "cryptiles": "2.x.x", - "hoek": "2.x.x", - "sntp": "1.x.x" - } - }, - "hoek": { - "version": "2.16.3", - "resolved": "https://registry.npmjs.org/hoek/-/hoek-2.16.3.tgz", - "integrity": "sha1-ILt0A9POo5jpHcRxCo/xuCdKJe0=", - "dev": true - }, - "http-signature": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.1.1.tgz", - "integrity": "sha1-33LiZwZs0Kxn+3at+OE0qPvPkb8=", - "dev": true, - "requires": { - "assert-plus": "^0.2.0", - "jsprim": "^1.2.2", - "sshpk": "^1.7.0" - } - }, "minimist": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", "dev": true - }, - "qs": { - "version": "6.3.2", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.3.2.tgz", - "integrity": "sha1-51vV9uJoEioqDgvaYwslUMFmUCw=", - "dev": true - }, - "request": { - "version": "2.79.0", - "resolved": "https://registry.npmjs.org/request/-/request-2.79.0.tgz", - "integrity": "sha1-Tf5b9r6LjNw3/Pk+BLZVd3InEN4=", - "dev": true, - "requires": { - "aws-sign2": "~0.6.0", - "aws4": "^1.2.1", - "caseless": "~0.11.0", - "combined-stream": "~1.0.5", - "extend": "~3.0.0", - "forever-agent": "~0.6.1", - "form-data": "~2.1.1", - "har-validator": "~2.0.6", - "hawk": "~3.1.3", - "http-signature": "~1.1.0", - "is-typedarray": "~1.0.0", - "isstream": "~0.1.2", - "json-stringify-safe": "~5.0.1", - "mime-types": "~2.1.7", - "oauth-sign": "~0.8.1", - "qs": "~6.3.0", - "stringstream": "~0.0.4", - "tough-cookie": "~2.3.0", - "tunnel-agent": "~0.4.1", - "uuid": "^3.0.0" - } - }, - "sntp": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/sntp/-/sntp-1.0.9.tgz", - "integrity": "sha1-ZUEYTMkK7qbG57NeJlkIJEPGYZg=", - "dev": true, - "requires": { - "hoek": "2.x.x" - } - }, - "tunnel-agent": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.4.3.tgz", - "integrity": "sha1-Y3PbdpCf5XDgjXNYM2Xtgop07us=", - "dev": true } } }, - "cryptiles": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-3.1.2.tgz", - "integrity": "sha1-qJ+7Ig9c4l7FboxKqKT9e1sNKf4=", + "cp-file": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/cp-file/-/cp-file-6.2.0.tgz", + "integrity": "sha512-fmvV4caBnofhPe8kOcitBwSn2f39QLjnAnGq3gO9dfd75mUytzKNZB1hde6QHunW2Rt+OwuBOMc3i1tNElbszA==", + "dev": true, "requires": { - "boom": "5.x.x" - }, - "dependencies": { - "boom": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/boom/-/boom-5.2.0.tgz", - "integrity": "sha512-Z5BTk6ZRe4tXXQlkqftmsAUANpXmuwlsF5Oov8ThoMbQRzdGTA1ngYRW160GexgOgjsFOKJz0LYhoNi+2AMBUw==", - "requires": { - "hoek": "4.x.x" - } - } + "graceful-fs": "^4.1.2", + "make-dir": "^2.0.0", + "nested-error-stacks": "^2.0.0", + "pify": "^4.0.1", + "safe-buffer": "^5.0.1" + } + }, + "cross-spawn": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "dev": true, + "requires": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" } }, "dashdash": { @@ -481,29 +625,67 @@ "assert-plus": "^1.0.0" } }, + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "requires": { + "ms": "^2.1.1" + } + }, "decamelize": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", - "dev": true, - "optional": true + "dev": true }, "deep-equal": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-0.2.2.tgz", - "integrity": "sha1-hLdFiW80xoTpjyzg5Cq69Du6AX0=", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.0.1.tgz", + "integrity": "sha1-9dJgKStmDghO/0zbyfCK0yR0SLU=", "dev": true }, + "deep-extend": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==" + }, "deep-is": { "version": "0.1.3", "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", "dev": true }, + "default-require-extensions": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/default-require-extensions/-/default-require-extensions-2.0.0.tgz", + "integrity": "sha1-9fj7sYp9bVCyH2QfZJ67Uiz+JPc=", + "dev": true, + "requires": { + "strip-bom": "^3.0.0" + } + }, + "define-properties": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", + "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", + "dev": true, + "requires": { + "object-keys": "^1.0.12" + }, + "dependencies": { + "object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true + } + } + }, "defined": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/defined/-/defined-0.0.0.tgz", - "integrity": "sha1-817qfXBekzuvE7LwOz+D2SFAOz4=", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.0.tgz", + "integrity": "sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM=", "dev": true }, "delayed-stream": { @@ -511,54 +693,283 @@ "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" }, - "ecc-jsbn": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz", - "integrity": "sha1-D8c6ntXw1Tw4GTOYUj735UN3dQU=", - "optional": true, + "delegates": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", + "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=" + }, + "detect-libc": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", + "integrity": "sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=" + }, + "doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, + "requires": { + "esutils": "^2.0.2" + } + }, + "ecc-jsbn": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", + "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", + "requires": { + "jsbn": "~0.1.0", + "safer-buffer": "^2.1.0" + } + }, + "emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", + "dev": true + }, + "end-of-stream": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.1.tgz", + "integrity": "sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q==", + "dev": true, + "requires": { + "once": "^1.4.0" + } + }, + "error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dev": true, "requires": { - "jsbn": "~0.1.0" + "is-arrayish": "^0.2.1" } }, + "es-abstract": { + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.13.0.tgz", + "integrity": "sha512-vDZfg/ykNxQVwup/8E1BZhVzFfBxs9NqMzGcvIJrqg5k2/5Za2bWo40dK2J1pgLngZ7c+Shh8lwYtLGyrwPutg==", + "dev": true, + "requires": { + "es-to-primitive": "^1.2.0", + "function-bind": "^1.1.1", + "has": "^1.0.3", + "is-callable": "^1.1.4", + "is-regex": "^1.0.4", + "object-keys": "^1.0.12" + }, + "dependencies": { + "object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true + } + } + }, + "es-to-primitive": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.0.tgz", + "integrity": "sha512-qZryBOJjV//LaxLTV6UC//WewneB3LcXOL9NP++ozKVXsIIIpm/2c13UDiD9Jp2eThsecw9m3jPqDwTyobcdbg==", + "dev": true, + "requires": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + } + }, + "es6-error": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/es6-error/-/es6-error-4.1.1.tgz", + "integrity": "sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==", + "dev": true + }, "escape-string-regexp": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", "dev": true }, - "escodegen": { - "version": "1.7.1", - "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.7.1.tgz", - "integrity": "sha1-MOz89mypjcZ80v0WKr626vqM5vw=", + "eslint": { + "version": "5.16.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-5.16.0.tgz", + "integrity": "sha512-S3Rz11i7c8AA5JPv7xAH+dOyq/Cu/VXHiHXBPOU1k/JAM5dXqQPt3qcrhpHSorXmrpu2g0gkIBVXAqCpzfoZIg==", "dev": true, "requires": { - "esprima": "^1.2.2", - "estraverse": "^1.9.1", + "@babel/code-frame": "^7.0.0", + "ajv": "^6.9.1", + "chalk": "^2.1.0", + "cross-spawn": "^6.0.5", + "debug": "^4.0.1", + "doctrine": "^3.0.0", + "eslint-scope": "^4.0.3", + "eslint-utils": "^1.3.1", + "eslint-visitor-keys": "^1.0.0", + "espree": "^5.0.1", + "esquery": "^1.0.1", "esutils": "^2.0.2", - "optionator": "^0.5.0", - "source-map": "~0.2.0" + "file-entry-cache": "^5.0.1", + "functional-red-black-tree": "^1.0.1", + "glob": "^7.1.2", + "globals": "^11.7.0", + "ignore": "^4.0.6", + "import-fresh": "^3.0.0", + "imurmurhash": "^0.1.4", + "inquirer": "^6.2.2", + "js-yaml": "^3.13.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.3.0", + "lodash": "^4.17.11", + "minimatch": "^3.0.4", + "mkdirp": "^0.5.1", + "natural-compare": "^1.4.0", + "optionator": "^0.8.2", + "path-is-inside": "^1.0.2", + "progress": "^2.0.0", + "regexpp": "^2.0.1", + "semver": "^5.5.1", + "strip-ansi": "^4.0.0", + "strip-json-comments": "^2.0.1", + "table": "^5.2.3", + "text-table": "^0.2.0" }, "dependencies": { - "esprima": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-1.2.5.tgz", - "integrity": "sha1-CZNQL+r2aBODJXVvMPmlH+7sEek=", + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", "dev": true + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "requires": { + "ansi-regex": "^3.0.0" + } } } }, - "esprima": { - "version": "2.7.3", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz", - "integrity": "sha1-luO3DVd59q1JzQMmc9HDEnZ7pYE=", + "eslint-plugin-es": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-es/-/eslint-plugin-es-1.4.0.tgz", + "integrity": "sha512-XfFmgFdIUDgvaRAlaXUkxrRg5JSADoRC8IkKLc/cISeR3yHVMefFHQZpcyXXEUUPHfy5DwviBcrfqlyqEwlQVw==", + "dev": true, + "requires": { + "eslint-utils": "^1.3.0", + "regexpp": "^2.0.1" + } + }, + "eslint-plugin-node": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-node/-/eslint-plugin-node-9.0.1.tgz", + "integrity": "sha512-fljT5Uyy3lkJzuqhxrYanLSsvaILs9I7CmQ31atTtZ0DoIzRbbvInBh4cQ1CrthFHInHYBQxfPmPt6KLHXNXdw==", + "dev": true, + "requires": { + "eslint-plugin-es": "^1.4.0", + "eslint-utils": "^1.3.1", + "ignore": "^5.1.1", + "minimatch": "^3.0.4", + "resolve": "^1.10.1", + "semver": "^6.0.0" + }, + "dependencies": { + "ignore": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.1.tgz", + "integrity": "sha512-DWjnQIFLenVrwyRCKZT+7a7/U4Cqgar4WG8V++K3hw+lrW1hc/SIwdiGmtxKCVACmHULTuGeBbHJmbwW7/sAvA==", + "dev": true + }, + "semver": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.0.0.tgz", + "integrity": "sha512-0UewU+9rFapKFnlbirLi3byoOuhrSsli/z/ihNnvM24vgF+8sNBiI1LZPBSH9wJKUwaUbw+s3hToDLCXkrghrQ==", + "dev": true + } + } + }, + "eslint-scope": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.3.tgz", + "integrity": "sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg==", + "dev": true, + "requires": { + "esrecurse": "^4.1.0", + "estraverse": "^4.1.1" + }, + "dependencies": { + "estraverse": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz", + "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=", + "dev": true + } + } + }, + "eslint-utils": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-1.3.1.tgz", + "integrity": "sha512-Z7YjnIldX+2XMcjr7ZkgEsOj/bREONV60qYeB/bjMAqqqZ4zxKyWX+BOUkdmRmA9riiIPVvo5x86m5elviOk0Q==", "dev": true }, - "estraverse": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-1.9.3.tgz", - "integrity": "sha1-r2fy3JIlgkFZUJJgkaQAXSnJu0Q=", + "eslint-visitor-keys": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz", + "integrity": "sha512-qzm/XxIbxm/FHyH341ZrbnMUpe+5Bocte9xkmFMzPMjRaZMcXww+MpBptFvtU+79L362nqiLhekCxCxDPaUMBQ==", + "dev": true + }, + "espree": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-5.0.1.tgz", + "integrity": "sha512-qWAZcWh4XE/RwzLJejfcofscgMc9CamR6Tn1+XRXNzrvUSSbiAjGOI/fggztjIi7y9VLPqnICMIPiGyr8JaZ0A==", + "dev": true, + "requires": { + "acorn": "^6.0.7", + "acorn-jsx": "^5.0.0", + "eslint-visitor-keys": "^1.0.0" + } + }, + "esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", "dev": true }, + "esquery": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.0.1.tgz", + "integrity": "sha512-SmiyZ5zIWH9VM+SRUReLS5Q8a7GxtRdxEBVZpm98rJM7Sb+A9DVCndXfkeFUd3byderg+EbDkfnevfCwynWaNA==", + "dev": true, + "requires": { + "estraverse": "^4.0.0" + }, + "dependencies": { + "estraverse": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz", + "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=", + "dev": true + } + } + }, + "esrecurse": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz", + "integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==", + "dev": true, + "requires": { + "estraverse": "^4.1.0" + }, + "dependencies": { + "estraverse": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz", + "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=", + "dev": true + } + } + }, "esutils": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", @@ -570,20 +981,46 @@ "resolved": "https://registry.npmjs.org/events/-/events-1.1.1.tgz", "integrity": "sha1-nr23Y1rQmccNzEwqH1AEKI6L2SQ=" }, + "execa": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", + "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", + "dev": true, + "requires": { + "cross-spawn": "^6.0.0", + "get-stream": "^4.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" + } + }, "extend": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" }, + "external-editor": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.0.3.tgz", + "integrity": "sha512-bn71H9+qWoOQKyZDo25mOMVpSmXROAsTJVVVYzrrtol3d4y+AsKjf4Iwl2Q+IuT0kFSQ1qo166UuIwqYq7mGnA==", + "dev": true, + "requires": { + "chardet": "^0.7.0", + "iconv-lite": "^0.4.24", + "tmp": "^0.0.33" + } + }, "extsprintf": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=" }, "fast-deep-equal": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz", - "integrity": "sha1-wFNHeBfIa1HaqFPIHgWbcz0CNhQ=" + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", + "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=" }, "fast-json-stable-stringify": { "version": "2.0.0", @@ -591,41 +1028,93 @@ "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=" }, "fast-levenshtein": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-1.0.7.tgz", - "integrity": "sha1-AXjc3uAjuSkFGTrwlZ6KdjnP3Lk=", + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", "dev": true }, - "fileset": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/fileset/-/fileset-0.2.1.tgz", - "integrity": "sha1-WI74lzxmI7KnbfRlEFaWuWqsgGc=", + "figures": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", + "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=", + "dev": true, + "requires": { + "escape-string-regexp": "^1.0.5" + } + }, + "file-entry-cache": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-5.0.1.tgz", + "integrity": "sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g==", + "dev": true, + "requires": { + "flat-cache": "^2.0.1" + } + }, + "find-cache-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz", + "integrity": "sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==", + "dev": true, + "requires": { + "commondir": "^1.0.1", + "make-dir": "^2.0.0", + "pkg-dir": "^3.0.0" + } + }, + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dev": true, + "requires": { + "locate-path": "^3.0.0" + } + }, + "flat-cache": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-2.0.1.tgz", + "integrity": "sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA==", + "dev": true, + "requires": { + "flatted": "^2.0.0", + "rimraf": "2.6.3", + "write": "1.0.3" + } + }, + "flatted": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.0.tgz", + "integrity": "sha512-R+H8IZclI8AAkSBRQJLVOsxwAoHd6WC40b4QTNWIjzAa6BXOBfQcM587MXDTVPeYaopFNWHUFLx7eNmHDSxMWg==", + "dev": true + }, + "for-each": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", + "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", + "dev": true, + "requires": { + "is-callable": "^1.1.3" + } + }, + "foreground-child": { + "version": "1.5.6", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-1.5.6.tgz", + "integrity": "sha1-T9ca0t/elnibmApcCilZN8svXOk=", "dev": true, "requires": { - "glob": "5.x", - "minimatch": "2.x" + "cross-spawn": "^4", + "signal-exit": "^3.0.0" }, "dependencies": { - "glob": { - "version": "5.0.15", - "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz", - "integrity": "sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E=", - "dev": true, - "requires": { - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "2 || 3", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "minimatch": { - "version": "2.0.10", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-2.0.10.tgz", - "integrity": "sha1-jQh8OcazjAAbl/ynzm0OHoCvusc=", + "cross-spawn": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-4.0.2.tgz", + "integrity": "sha1-e5JHYhwjrf3ThWAEqCPL45dCTUE=", "dev": true, "requires": { - "brace-expansion": "^1.0.0" + "lru-cache": "^4.0.1", + "which": "^1.2.9" } } } @@ -636,44 +1125,68 @@ "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=" }, "form-data": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.2.tgz", - "integrity": "sha1-SXBJi+YEwgwAXU9cI67NIda0kJk=", + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", + "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", "requires": { "asynckit": "^0.4.0", - "combined-stream": "1.0.6", + "combined-stream": "^1.0.6", "mime-types": "^2.1.12" } }, + "fs-minipass": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-1.2.5.tgz", + "integrity": "sha512-JhBl0skXjUPCFH7x6x61gQxrKyXsxB5gcgePLZCwfyCGGsTISMoIeObbrvVeP6Xmyaudw4TT43qV2Gz+iyd2oQ==", + "requires": { + "minipass": "^2.2.1" + } + }, "fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" }, - "fstream": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.11.tgz", - "integrity": "sha1-XB+x8RdHcRTwYyoOtLcbPLD9MXE=", - "requires": { - "graceful-fs": "^4.1.2", - "inherits": "~2.0.0", - "mkdirp": ">=0.5 0", - "rimraf": "2" - } + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true }, - "generate-function": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/generate-function/-/generate-function-2.0.0.tgz", - "integrity": "sha1-aFj+fAlpt9TpCTM3ZHrHn2DfvnQ=", + "functional-red-black-tree": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", + "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", "dev": true }, - "generate-object-property": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/generate-object-property/-/generate-object-property-1.2.0.tgz", - "integrity": "sha1-nA4cQDCM6AT0eDYYuTf6iPmdUNA=", + "gauge": { + "version": "2.7.4", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", + "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", + "requires": { + "aproba": "^1.0.3", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.0", + "object-assign": "^4.1.0", + "signal-exit": "^3.0.0", + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wide-align": "^1.1.0" + } + }, + "get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true + }, + "get-stream": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", + "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", "dev": true, "requires": { - "is-property": "^1.0.0" + "pump": "^3.0.0" } }, "getpass": { @@ -685,9 +1198,9 @@ } }, "glob": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", - "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", + "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", "requires": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -697,31 +1210,41 @@ "path-is-absolute": "^1.0.0" } }, + "globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true + }, "graceful-fs": { - "version": "4.1.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", - "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=" + "version": "4.1.15", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.15.tgz", + "integrity": "sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA==", + "dev": true + }, + "growl": { + "version": "1.10.5", + "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz", + "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==", + "dev": true }, "handlebars": { - "version": "4.0.11", - "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.0.11.tgz", - "integrity": "sha1-Ywo13+ApS8KB7a5v/F0yn8eYLcw=", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.1.2.tgz", + "integrity": "sha512-nvfrjqvt9xQ8Z/w0ijewdD/vvWDTOweBUm96NTr66Wfvo1mJenBLwcYmPs3TIBP5ruzYGD7Hx/DaM9RmhroGPw==", "dev": true, "requires": { - "async": "^1.4.0", + "neo-async": "^2.6.0", "optimist": "^0.6.1", - "source-map": "^0.4.4", - "uglify-js": "^2.6" + "source-map": "^0.6.1", + "uglify-js": "^3.1.4" }, "dependencies": { "source-map": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz", - "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=", - "dev": true, - "requires": { - "amdefine": ">=0.0.4" - } + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true } } }, @@ -731,44 +1254,54 @@ "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=" }, "har-validator": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.0.3.tgz", - "integrity": "sha1-ukAsJmGU8VlW7xXg/PJCmT9qff0=", + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.3.tgz", + "integrity": "sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==", "requires": { - "ajv": "^5.1.0", + "ajv": "^6.5.5", "har-schema": "^2.0.0" } }, - "has-ansi": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", - "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", "dev": true, "requires": { - "ansi-regex": "^2.0.0" + "function-bind": "^1.1.1" } }, "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "has-symbols": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", - "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.0.tgz", + "integrity": "sha1-uhqPGvKg/DllD1yFA2dwQSIGO0Q=", "dev": true }, - "hawk": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/hawk/-/hawk-6.0.2.tgz", - "integrity": "sha512-miowhl2+U7Qle4vdLqDdPt9m09K6yZhkLDTWGoUiUzrQCn+mHHSmfJgAyGaLRZbPmTqfFFjRV1QWCW0VWUJBbQ==", + "has-unicode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", + "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=" + }, + "hasha": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/hasha/-/hasha-3.0.0.tgz", + "integrity": "sha1-UqMvq4Vp1BymmmH/GiFPjrfIvTk=", + "dev": true, "requires": { - "boom": "4.x.x", - "cryptiles": "3.x.x", - "hoek": "4.x.x", - "sntp": "2.x.x" + "is-stream": "^1.0.1" } }, - "hoek": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/hoek/-/hoek-4.2.1.tgz", - "integrity": "sha512-QLg82fGkfnJ/4iy1xZ81/9SIJiq1NGFUMGs6ParyjBZr6jW2Ufj/snDqTHixNlHdPNwN2RLVD0Pi3igeK9+JfA==" + "hosted-git-info": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.7.1.tgz", + "integrity": "sha512-7T/BxH19zbcCTa8XkMlbK5lTo1WtgkFi3GvdWEyNuc4Vex7/9Dqbnpsf4JMydcfj9HCg4zUWFTL3Za6lapg5/w==", + "dev": true }, "http-signature": { "version": "1.2.0", @@ -780,11 +1313,49 @@ "sshpk": "^1.7.0" } }, + "iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, "ieee754": { "version": "1.1.8", "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.8.tgz", "integrity": "sha1-vjPUCsEO8ZJnAfbwii2G+/0a0+Q=" }, + "ignore": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", + "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", + "dev": true + }, + "ignore-walk": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-3.0.1.tgz", + "integrity": "sha512-DTVlMx3IYPe0/JJcYP7Gxg7ttZZu3IInhuEhbchuqneY9wWe5Ojy2mXLBaQFUQmo0AW2r3qG7m1mg86js+gnlQ==", + "requires": { + "minimatch": "^3.0.4" + } + }, + "import-fresh": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.0.0.tgz", + "integrity": "sha512-pOnA9tfM3Uwics+SaBLCNyZZZbK+4PTu0OPZtLlMIrv17EdBoC15S9Kn8ckJ9TZTyKb3ywNE5y1yeDxxGA7nTQ==", + "dev": true, + "requires": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + } + }, + "imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "dev": true + }, "inflight": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", @@ -799,45 +1370,146 @@ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" }, - "is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", - "dev": true - }, - "is-my-ip-valid": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-my-ip-valid/-/is-my-ip-valid-1.0.0.tgz", - "integrity": "sha512-gmh/eWXROncUzRnIa1Ubrt5b8ep/MGSnfAUI3aRp+sqTCs1tv1Isl8d8F6JmkN3dXKc3ehZMrtiPN9eL03NuaQ==", - "dev": true + "ini": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", + "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==" }, - "is-my-json-valid": { - "version": "2.17.2", - "resolved": "https://registry.npmjs.org/is-my-json-valid/-/is-my-json-valid-2.17.2.tgz", - "integrity": "sha512-IBhBslgngMQN8DDSppmgDv7RNrlFotuuDsKcrCP3+HbFaVivIBU7u9oiiErw8sH4ynx3+gOGQ3q2otkgiSi6kg==", + "inquirer": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-6.3.1.tgz", + "integrity": "sha512-MmL624rfkFt4TG9y/Jvmt8vdmOo836U7Y0Hxr2aFk3RelZEGX4Igk0KabWrcaaZaTv9uzglOqWh1Vly+FAWAXA==", "dev": true, "requires": { - "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" + "ansi-escapes": "^3.2.0", + "chalk": "^2.4.2", + "cli-cursor": "^2.1.0", + "cli-width": "^2.0.0", + "external-editor": "^3.0.3", + "figures": "^2.0.0", + "lodash": "^4.17.11", + "mute-stream": "0.0.7", + "run-async": "^2.2.0", + "rxjs": "^6.4.0", + "string-width": "^2.1.0", + "strip-ansi": "^5.1.0", + "through": "^2.3.6" }, "dependencies": { - "xtend": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", - "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=", + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", "dev": true + }, + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "dev": true, + "requires": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + }, + "dependencies": { + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "requires": { + "ansi-regex": "^3.0.0" + } + } + } + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "requires": { + "ansi-regex": "^4.1.0" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true + } + } } } }, - "is-property": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-property/-/is-property-1.0.2.tgz", - "integrity": "sha1-V/4cTkhHTt1lsJkR8msc1Ald2oQ=", + "invert-kv": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-2.0.0.tgz", + "integrity": "sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA==", + "dev": true + }, + "is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", + "dev": true + }, + "is-callable": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.4.tgz", + "integrity": "sha512-r5p9sxJjYnArLjObpjA4xu5EKI3CuKHkJXMhT7kwbpUyIFD1n5PMAsoPvWnvtZiNz7LjkYDRZhd7FlI0eMijEA==", + "dev": true + }, + "is-date-object": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.1.tgz", + "integrity": "sha1-mqIOtq7rv/d/vTPnTKAbM1gdOhY=", "dev": true }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "is-promise": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz", + "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=", + "dev": true + }, + "is-regex": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.4.tgz", + "integrity": "sha1-VRdIm1RwkbCTDglWVM7SXul+lJE=", + "dev": true, + "requires": { + "has": "^1.0.1" + } + }, + "is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", + "dev": true + }, + "is-symbol": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.2.tgz", + "integrity": "sha512-HS8bZ9ox60yCJLH9snBpIwv9pYUAkcuLhSA1oero1UB5y9aiQpRA8y2ex945AOtCZL1lJDeIk3G5LthswI46Lw==", + "dev": true, + "requires": { + "has-symbols": "^1.0.0" + } + }, "is-typedarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", @@ -859,65 +1531,122 @@ "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=" }, - "istanbul": { - "version": "0.3.22", - "resolved": "https://registry.npmjs.org/istanbul/-/istanbul-0.3.22.tgz", - "integrity": "sha1-PhZNhQIf4ZyYXR8OfvDD4i0BLrY=", - "dev": true, - "requires": { - "abbrev": "1.0.x", - "async": "1.x", - "escodegen": "1.7.x", - "esprima": "2.5.x", - "fileset": "0.2.x", - "handlebars": "^4.0.1", - "js-yaml": "3.x", - "mkdirp": "0.5.x", - "nopt": "3.x", - "once": "1.x", - "resolve": "1.1.x", - "supports-color": "^3.1.0", - "which": "^1.1.1", - "wordwrap": "^1.0.0" + "istanbul-lib-coverage": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.5.tgz", + "integrity": "sha512-8aXznuEPCJvGnMSRft4udDRDtb1V3pkQkMMI5LI+6HuQz5oQ4J2UFn1H82raA3qJtyOLkkwVqICBQkjnGtn5mA==", + "dev": true + }, + "istanbul-lib-hook": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/istanbul-lib-hook/-/istanbul-lib-hook-2.0.7.tgz", + "integrity": "sha512-vrRztU9VRRFDyC+aklfLoeXyNdTfga2EI3udDGn4cZ6fpSXpHLV9X6CHvfoMCPtggg8zvDDmC4b9xfu0z6/llA==", + "dev": true, + "requires": { + "append-transform": "^1.0.0" + } + }, + "istanbul-lib-instrument": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-3.3.0.tgz", + "integrity": "sha512-5nnIN4vo5xQZHdXno/YDXJ0G+I3dAm4XgzfSVTPLQpj/zAV2dV6Juy0yaf10/zrJOJeHoN3fraFe+XRq2bFVZA==", + "dev": true, + "requires": { + "@babel/generator": "^7.4.0", + "@babel/parser": "^7.4.3", + "@babel/template": "^7.4.0", + "@babel/traverse": "^7.4.3", + "@babel/types": "^7.4.0", + "istanbul-lib-coverage": "^2.0.5", + "semver": "^6.0.0" }, "dependencies": { - "esprima": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-2.5.0.tgz", - "integrity": "sha1-84ekb9NEwbGjm6+MIL+0O20AWMw=", + "semver": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.0.0.tgz", + "integrity": "sha512-0UewU+9rFapKFnlbirLi3byoOuhrSsli/z/ihNnvM24vgF+8sNBiI1LZPBSH9wJKUwaUbw+s3hToDLCXkrghrQ==", + "dev": true + } + } + }, + "istanbul-lib-report": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-2.0.8.tgz", + "integrity": "sha512-fHBeG573EIihhAblwgxrSenp0Dby6tJMFR/HvlerBsrCTD5bkUuoNtn3gVh29ZCS824cGGBPn7Sg7cNk+2xUsQ==", + "dev": true, + "requires": { + "istanbul-lib-coverage": "^2.0.5", + "make-dir": "^2.1.0", + "supports-color": "^6.1.0" + } + }, + "istanbul-lib-source-maps": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-3.0.6.tgz", + "integrity": "sha512-R47KzMtDJH6X4/YW9XTx+jrLnZnscW4VpNN+1PViSYTejLVPWv7oov+Duf8YQSPyVRUvueQqz1TcsC6mooZTXw==", + "dev": true, + "requires": { + "debug": "^4.1.1", + "istanbul-lib-coverage": "^2.0.5", + "make-dir": "^2.1.0", + "rimraf": "^2.6.3", + "source-map": "^0.6.1" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true - }, - "supports-color": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", - "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", - "dev": true, - "requires": { - "has-flag": "^1.0.0" - } } } }, + "istanbul-reports": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-2.2.4.tgz", + "integrity": "sha512-QCHGyZEK0bfi9GR215QSm+NJwFKEShbtc7tfbUdLAEzn3kKhLDDZqvljn8rPZM9v8CEOhzL1nlYoO4r1ryl67w==", + "dev": true, + "requires": { + "handlebars": "^4.1.2" + } + }, "jmespath": { "version": "0.15.0", "resolved": "https://registry.npmjs.org/jmespath/-/jmespath-0.15.0.tgz", "integrity": "sha1-o/Iiqarp+Wb10nx5ZRDigJF2Qhc=" }, + "js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true + }, "js-yaml": { - "version": "3.6.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.6.1.tgz", - "integrity": "sha1-bl/mfYsgXOTSL60Ft3geja3MSzA=", + "version": "3.13.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", + "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", "dev": true, "requires": { "argparse": "^1.0.7", - "esprima": "^2.6.0" + "esprima": "^4.0.0" } }, "jsbn": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", - "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", - "optional": true + "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=" + }, + "jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "dev": true + }, + "json-parse-better-errors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", + "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", + "dev": true }, "json-schema": { "version": "0.2.3", @@ -925,21 +1654,21 @@ "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=" }, "json-schema-traverse": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz", - "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A=" + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" + }, + "json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", + "dev": true }, "json-stringify-safe": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=" }, - "jsonpointer": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/jsonpointer/-/jsonpointer-4.0.1.tgz", - "integrity": "sha1-T9kss04OnbPInIYi7PUfm5eMbLk=", - "dev": true - }, "jsprim": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", @@ -951,22 +1680,15 @@ "verror": "1.10.0" } }, - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "lcid": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/lcid/-/lcid-2.0.0.tgz", + "integrity": "sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA==", "dev": true, "requires": { - "is-buffer": "^1.1.5" + "invert-kv": "^2.0.0" } }, - "lazy-cache": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz", - "integrity": "sha1-odePw6UEdMuAhF07O24dpJpEbo4=", - "dev": true, - "optional": true - }, "lcov-parse": { "version": "0.0.10", "resolved": "https://registry.npmjs.org/lcov-parse/-/lcov-parse-0.0.10.tgz", @@ -974,1087 +1696,170 @@ "dev": true }, "levn": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.2.5.tgz", - "integrity": "sha1-uo0znQykphDjo/FFucr0iAcVUFQ=", + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", + "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", + "dev": true, + "requires": { + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2" + } + }, + "load-json-file": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", + "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "parse-json": "^4.0.0", + "pify": "^3.0.0", + "strip-bom": "^3.0.0" + }, + "dependencies": { + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true + } + } + }, + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", "dev": true, "requires": { - "prelude-ls": "~1.1.0", - "type-check": "~0.3.1" + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" } }, "lodash": { - "version": "4.17.10", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.10.tgz", - "integrity": "sha512-UejweD1pDoXu+AD825lWwp4ZGtSwgnpZxb3JDViD7StjQz+Nb/6l093lx4OQ0foGWNRoc19mWy7BzL+UAK2iVg==", + "version": "4.17.11", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", + "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==", "dev": true }, - "log-driver": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/log-driver/-/log-driver-1.2.5.tgz", - "integrity": "sha1-euTsJXMC/XkNVXyxDJcQDYV7AFY=", + "lodash.flattendeep": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz", + "integrity": "sha1-+wMJF/hqMTTlvJvsDWngAT3f7bI=", "dev": true }, - "longest": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz", - "integrity": "sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc=", + "log-driver": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/log-driver/-/log-driver-1.2.7.tgz", + "integrity": "sha512-U7KCmLdqsGHBLeWqYlFA0V0Sl6P08EE1ZrmA9cxjUE0WVqT9qnyVDPz1kzpFEP0jdJuFnasWIfSd7fsaNXkpbg==", "dev": true }, "lru-cache": { - "version": "2.7.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.7.3.tgz", - "integrity": "sha1-bUUk6LlV+V1PW1iFHOId1y+06VI=", - "dev": true + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", + "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", + "dev": true, + "requires": { + "pseudomap": "^1.0.2", + "yallist": "^2.1.2" + }, + "dependencies": { + "yallist": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", + "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", + "dev": true + } + } + }, + "make-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", + "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", + "dev": true, + "requires": { + "pify": "^4.0.1", + "semver": "^5.6.0" + } + }, + "map-age-cleaner": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz", + "integrity": "sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w==", + "dev": true, + "requires": { + "p-defer": "^1.0.0" + } }, "mapnik": { - "version": "3.7.2", - "resolved": "https://registry.npmjs.org/mapnik/-/mapnik-3.7.2.tgz", - "integrity": "sha512-mdpXpSds+Mi+1fABf2spMOQ+lnrJqE3isBMHDxCisZOPvppsTKAyGB9i8cXT+qbewcLgTcezgA8+SbeQQr/v9g==", - "requires": { - "mapnik-vector-tile": "1.6.1", - "nan": "~2.8.0", - "node-pre-gyp": "~0.6.30", - "protozero": "1.5.1" + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/mapnik/-/mapnik-4.2.1.tgz", + "integrity": "sha512-xRGIzwPu3n9T1L8V0izZ7694nWMiHxe9PGy4ghL4PDr/koIqCN0JDD9wsrvt52m53ZZC+zdeXFtuS84JqU74lQ==", + "requires": { + "mapnik-vector-tile": "2.2.1", + "nan": "~2.10.0", + "node-pre-gyp": "~0.10.0" + } + }, + "mapnik-vector-tile": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/mapnik-vector-tile/-/mapnik-vector-tile-2.2.1.tgz", + "integrity": "sha512-+oasa2DfqArIMC7F71ca8CXpDt0rEcq9sJDv+AuhBCZJg+3m2ikDAs/oskEpPpUOwta1hH48Qr+0deCkyB/0Jg==" + }, + "mem": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/mem/-/mem-4.3.0.tgz", + "integrity": "sha512-qX2bG48pTqYRVmDB37rn/6PT7LcR8T7oAX3bf99u1Tt1nzxYfxkgqDwUwolPlXweM0XzBOBFzSx4kfp7KP1s/w==", + "dev": true, + "requires": { + "map-age-cleaner": "^0.1.1", + "mimic-fn": "^2.0.0", + "p-is-promise": "^2.0.0" }, "dependencies": { - "node-pre-gyp": { - "version": "0.6.39", - "resolved": "https://registry.npmjs.org/node-pre-gyp/-/node-pre-gyp-0.6.39.tgz", - "integrity": "sha1-wA6WhgsjwOFCCse+/FBE4deNhkk=", - "requires": { - "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", - "rimraf": "^2.6.1", - "semver": "^5.3.0", - "tar": "^2.2.1", - "tar-pack": "^3.4.0" - }, - "dependencies": { - "detect-libc": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", - "integrity": "sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=" - }, - "hawk": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/hawk/-/hawk-3.1.3.tgz", - "integrity": "sha1-B4REvXwWQLD+VA0sm3PVlnjo4cQ=", - "requires": { - "boom": "2.x.x", - "cryptiles": "2.x.x", - "hoek": "2.x.x", - "sntp": "1.x.x" - }, - "dependencies": { - "boom": { - "version": "2.10.1", - "resolved": "https://registry.npmjs.org/boom/-/boom-2.10.1.tgz", - "integrity": "sha1-OciRjO/1eZ+D+UkqhI9iWt0Mdm8=", - "requires": { - "hoek": "2.x.x" - } - }, - "cryptiles": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-2.0.5.tgz", - "integrity": "sha1-O9/s3GCBR8HGcgL6KR59ylnqo7g=", - "requires": { - "boom": "2.x.x" - } - }, - "hoek": { - "version": "2.16.3", - "resolved": "https://registry.npmjs.org/hoek/-/hoek-2.16.3.tgz", - "integrity": "sha1-ILt0A9POo5jpHcRxCo/xuCdKJe0=" - }, - "sntp": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/sntp/-/sntp-1.0.9.tgz", - "integrity": "sha1-ZUEYTMkK7qbG57NeJlkIJEPGYZg=", - "requires": { - "hoek": "2.x.x" - } - } - } - }, - "mkdirp": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", - "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", - "requires": { - "minimist": "0.0.8" - }, - "dependencies": { - "minimist": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", - "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=" - } - } - }, - "nopt": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-4.0.1.tgz", - "integrity": "sha1-0NRoWv1UFRk8jHUFYC0NF81kR00=", - "requires": { - "abbrev": "1", - "osenv": "^0.1.4" - }, - "dependencies": { - "abbrev": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", - "integrity": "sha1-+PLIh60Qv2f2NPAFtph/7TF5qsg=" - }, - "osenv": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz", - "integrity": "sha1-hc36+uso6Gd/QW4odZK18/SepBA=", - "requires": { - "os-homedir": "^1.0.0", - "os-tmpdir": "^1.0.0" - }, - "dependencies": { - "os-homedir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", - "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=" - }, - "os-tmpdir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", - "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=" - } - } - } - } - }, - "npmlog": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz", - "integrity": "sha1-CKfyqL9zRgR3mp76StXMcXq7lUs=", - "requires": { - "are-we-there-yet": "~1.1.2", - "console-control-strings": "~1.1.0", - "gauge": "~2.7.3", - "set-blocking": "~2.0.0" - }, - "dependencies": { - "are-we-there-yet": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.4.tgz", - "integrity": "sha1-u13KOCu5TwXhUZQ3PRb9O6HKEQ0=", - "requires": { - "delegates": "^1.0.0", - "readable-stream": "^2.0.6" - }, - "dependencies": { - "delegates": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", - "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=" - }, - "readable-stream": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", - "integrity": "sha1-sRwn2IuP8fvgcGQ8+UsMea4bCq8=", - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - }, - "dependencies": { - "core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" - }, - "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" - }, - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" - }, - "process-nextick-args": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", - "integrity": "sha1-o31zL0JxtKsa0HDTVQjoKQeI/6o=" - }, - "safe-buffer": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", - "integrity": "sha1-iTMSr2myEj3vcfV4iQAWce6yyFM=" - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha1-nPFhG6YmhdcDCunkujQUnDrwP8g=", - "requires": { - "safe-buffer": "~5.1.0" - } - }, - "util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" - } - } - } - } - }, - "console-control-strings": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", - "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=" - }, - "gauge": { - "version": "2.7.4", - "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", - "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", - "requires": { - "aproba": "^1.0.3", - "console-control-strings": "^1.0.0", - "has-unicode": "^2.0.0", - "object-assign": "^4.1.0", - "signal-exit": "^3.0.0", - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1", - "wide-align": "^1.1.0" - }, - "dependencies": { - "aproba": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", - "integrity": "sha1-aALmJk79GMeQobDVF/DyYnvyyUo=" - }, - "has-unicode": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", - "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=" - }, - "object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" - }, - "signal-exit": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", - "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=" - }, - "string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", - "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" - }, - "dependencies": { - "code-point-at": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", - "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=" - }, - "is-fullwidth-code-point": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", - "requires": { - "number-is-nan": "^1.0.0" - }, - "dependencies": { - "number-is-nan": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", - "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=" - } - } - } - } - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "requires": { - "ansi-regex": "^2.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" - } - } - }, - "wide-align": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.2.tgz", - "integrity": "sha1-Vx4PGwYEY268DfwhsDObvjE0FxA=", - "requires": { - "string-width": "^1.0.2" - } - } - } - }, - "set-blocking": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=" - } - } - }, - "rc": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.6.tgz", - "integrity": "sha1-6xiYnG1PTxYsOZ953dKfODVWgJI=", - "requires": { - "deep-extend": "~0.4.0", - "ini": "~1.3.0", - "minimist": "^1.2.0", - "strip-json-comments": "~2.0.1" - }, - "dependencies": { - "deep-extend": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.4.2.tgz", - "integrity": "sha1-SLaZwn4zS/ifEIkr5DL25MfTSn8=" - }, - "ini": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", - "integrity": "sha1-7uJfVtscnsYIXgwid4CD9Zar+Sc=" - }, - "minimist": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" - }, - "strip-json-comments": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=" - } - } - }, - "request": { - "version": "2.81.0", - "resolved": "https://registry.npmjs.org/request/-/request-2.81.0.tgz", - "integrity": "sha1-xpKJRqDgbF+Nb4qTM0af/aRimKA=", - "requires": { - "aws-sign2": "~0.6.0", - "aws4": "^1.2.1", - "caseless": "~0.12.0", - "combined-stream": "~1.0.5", - "extend": "~3.0.0", - "forever-agent": "~0.6.1", - "form-data": "~2.1.1", - "har-validator": "~4.2.1", - "hawk": "~3.1.3", - "http-signature": "~1.1.0", - "is-typedarray": "~1.0.0", - "isstream": "~0.1.2", - "json-stringify-safe": "~5.0.1", - "mime-types": "~2.1.7", - "oauth-sign": "~0.8.1", - "performance-now": "^0.2.0", - "qs": "~6.4.0", - "safe-buffer": "^5.0.1", - "stringstream": "~0.0.4", - "tough-cookie": "~2.3.0", - "tunnel-agent": "^0.6.0", - "uuid": "^3.0.0" - }, - "dependencies": { - "aws-sign2": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.6.0.tgz", - "integrity": "sha1-FDQt0428yU0OW4fXY81jYSwOeU8=" - }, - "aws4": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.7.0.tgz", - "integrity": "sha1-1NDpudv8p3vwjusKikcVUP454ok=" - }, - "caseless": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", - "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=" - }, - "combined-stream": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.6.tgz", - "integrity": "sha1-cj599ugBrFYTETp+RFqbactjKBg=", - "requires": { - "delayed-stream": "~1.0.0" - }, - "dependencies": { - "delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" - } - } - }, - "extend": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.1.tgz", - "integrity": "sha1-p1Xqe8Gt/MWjHOfnYtuq3F5jZEQ=" - }, - "forever-agent": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", - "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=" - }, - "form-data": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.1.4.tgz", - "integrity": "sha1-M8GDrPGTJ27KqYFDpp6Uv+4XUNE=", - "requires": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.5", - "mime-types": "^2.1.12" - }, - "dependencies": { - "asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" - } - } - }, - "har-validator": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-4.2.1.tgz", - "integrity": "sha1-M0gdDxu/9gDdID11gSpqX7oALio=", - "requires": { - "ajv": "^4.9.1", - "har-schema": "^1.0.5" - }, - "dependencies": { - "ajv": { - "version": "4.11.8", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-4.11.8.tgz", - "integrity": "sha1-gv+wKynmYq5TvcIK8VlHcGc5xTY=", - "requires": { - "co": "^4.6.0", - "json-stable-stringify": "^1.0.1" - }, - "dependencies": { - "co": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", - "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=" - }, - "json-stable-stringify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz", - "integrity": "sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8=", - "requires": { - "jsonify": "~0.0.0" - }, - "dependencies": { - "jsonify": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz", - "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=" - } - } - } - } - }, - "har-schema": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-1.0.5.tgz", - "integrity": "sha1-0mMTX0MwfALGAq/I/pWXDAFRNp4=" - } - } - }, - "http-signature": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.1.1.tgz", - "integrity": "sha1-33LiZwZs0Kxn+3at+OE0qPvPkb8=", - "requires": { - "assert-plus": "^0.2.0", - "jsprim": "^1.2.2", - "sshpk": "^1.7.0" - }, - "dependencies": { - "assert-plus": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-0.2.0.tgz", - "integrity": "sha1-104bh+ev/A24qttwIfP+SBAasjQ=" - }, - "jsprim": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", - "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", - "requires": { - "assert-plus": "1.0.0", - "extsprintf": "1.3.0", - "json-schema": "0.2.3", - "verror": "1.10.0" - }, - "dependencies": { - "assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" - }, - "extsprintf": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", - "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=" - }, - "json-schema": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", - "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=" - }, - "verror": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", - "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", - "requires": { - "assert-plus": "^1.0.0", - "core-util-is": "1.0.2", - "extsprintf": "^1.2.0" - }, - "dependencies": { - "core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" - } - } - } - } - }, - "sshpk": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.14.1.tgz", - "integrity": "sha1-Ew9Zde3a2WPx1W+SuaxsUfqfg+s=", - "requires": { - "asn1": "~0.2.3", - "assert-plus": "^1.0.0", - "bcrypt-pbkdf": "^1.0.0", - "dashdash": "^1.12.0", - "ecc-jsbn": "~0.1.1", - "getpass": "^0.1.1", - "jsbn": "~0.1.0", - "tweetnacl": "~0.14.0" - }, - "dependencies": { - "asn1": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.3.tgz", - "integrity": "sha1-2sh4dxPJlmhJ/IGAd36+nB3fO4Y=" - }, - "assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" - }, - "bcrypt-pbkdf": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz", - "integrity": "sha1-Y7xdy2EzG5K8Bf1SiVPDNGKgb40=", - "optional": true, - "requires": { - "tweetnacl": "^0.14.3" - } - }, - "dashdash": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", - "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", - "requires": { - "assert-plus": "^1.0.0" - } - }, - "ecc-jsbn": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz", - "integrity": "sha1-D8c6ntXw1Tw4GTOYUj735UN3dQU=", - "optional": true, - "requires": { - "jsbn": "~0.1.0" - } - }, - "getpass": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", - "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", - "requires": { - "assert-plus": "^1.0.0" - } - }, - "jsbn": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", - "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", - "optional": true - }, - "tweetnacl": { - "version": "0.14.5", - "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", - "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", - "optional": true - } - } - } - } - }, - "is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" - }, - "isstream": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=" - }, - "json-stringify-safe": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=" - }, - "mime-types": { - "version": "2.1.18", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.18.tgz", - "integrity": "sha1-bzI/YKg9ERRvgx/xH9ZuL+VQO7g=", - "requires": { - "mime-db": "~1.33.0" - }, - "dependencies": { - "mime-db": { - "version": "1.33.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.33.0.tgz", - "integrity": "sha1-o0kgUKXLm2NFBUHjnZeI0icng9s=" - } - } - }, - "oauth-sign": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.2.tgz", - "integrity": "sha1-Rqarfwrq2N6unsBWV4C31O/rnUM=" - }, - "performance-now": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-0.2.0.tgz", - "integrity": "sha1-M+8wxcd9TqIcWlOGnZG1bY8lVeU=" - }, - "qs": { - "version": "6.4.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.4.0.tgz", - "integrity": "sha1-E+JtKK1rD/qpExLNO/cI7TUecjM=" - }, - "safe-buffer": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", - "integrity": "sha1-iTMSr2myEj3vcfV4iQAWce6yyFM=" - }, - "stringstream": { - "version": "0.0.5", - "resolved": "https://registry.npmjs.org/stringstream/-/stringstream-0.0.5.tgz", - "integrity": "sha1-TkhM1N5aC7vuGORjB3EKioFiGHg=" - }, - "tough-cookie": { - "version": "2.3.4", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.4.tgz", - "integrity": "sha1-7GDO44rGdQY//JelwYlwV47oNlU=", - "requires": { - "punycode": "^1.4.1" - }, - "dependencies": { - "punycode": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=" - } - } - }, - "tunnel-agent": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", - "requires": { - "safe-buffer": "^5.0.1" - } - }, - "uuid": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.2.1.tgz", - "integrity": "sha1-EsUou51Y0LkmXZovbw/ovhf/HxQ=" - } - } - }, - "rimraf": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz", - "integrity": "sha1-LtgVDSShbqhlHm1u8PR8QVjOejY=", - "requires": { - "glob": "^7.0.5" - }, - "dependencies": { - "glob": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", - "integrity": "sha1-wZyd+aAocC1nhhI4SmVSQExjbRU=", - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "dependencies": { - "fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" - }, - "inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "requires": { - "once": "^1.3.0", - "wrappy": "1" - }, - "dependencies": { - "wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" - } - } - }, - "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" - }, - "minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha1-UWbihkV/AzBgZL5Ul+jbsMPTIIM=", - "requires": { - "brace-expansion": "^1.1.7" - }, - "dependencies": { - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha1-PH/L9SnYcibz0vUrlm/1Jx60Qd0=", - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - }, - "dependencies": { - "balanced-match": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" - }, - "concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" - } - } - } - } - }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "requires": { - "wrappy": "1" - }, - "dependencies": { - "wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" - } - } - }, - "path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" - } - } - } - } - }, - "semver": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.0.tgz", - "integrity": "sha1-3Eu8emyp2Rbe5dQ1FvAJK1j3uKs=" - }, - "tar": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/tar/-/tar-2.2.1.tgz", - "integrity": "sha1-jk0qJWwOIYXGsYrWlK7JaLg8sdE=", - "requires": { - "block-stream": "*", - "fstream": "^1.0.2", - "inherits": "2" - }, - "dependencies": { - "block-stream": { - "version": "0.0.9", - "resolved": "https://registry.npmjs.org/block-stream/-/block-stream-0.0.9.tgz", - "integrity": "sha1-E+v+d4oDIFz+A3UUgeu0szAMEmo=", - "requires": { - "inherits": "~2.0.0" - } - }, - "fstream": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.11.tgz", - "integrity": "sha1-XB+x8RdHcRTwYyoOtLcbPLD9MXE=", - "requires": { - "graceful-fs": "^4.1.2", - "inherits": "~2.0.0", - "mkdirp": ">=0.5 0", - "rimraf": "2" - }, - "dependencies": { - "graceful-fs": { - "version": "4.1.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", - "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=" - } - } - }, - "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" - } - } - }, - "tar-pack": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/tar-pack/-/tar-pack-3.4.1.tgz", - "integrity": "sha1-4dvAOpudO6B+iWrQJzF+tnmhCh8=", - "requires": { - "debug": "^2.2.0", - "fstream": "^1.0.10", - "fstream-ignore": "^1.0.5", - "once": "^1.3.3", - "readable-stream": "^2.1.4", - "rimraf": "^2.5.1", - "tar": "^2.2.1", - "uid-number": "^0.0.6" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha1-XRKFFd8TT/Mn6QpMk/Tgd6U2NB8=", - "requires": { - "ms": "2.0.0" - }, - "dependencies": { - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - } - } - }, - "fstream": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.11.tgz", - "integrity": "sha1-XB+x8RdHcRTwYyoOtLcbPLD9MXE=", - "requires": { - "graceful-fs": "^4.1.2", - "inherits": "~2.0.0", - "mkdirp": ">=0.5 0", - "rimraf": "2" - }, - "dependencies": { - "graceful-fs": { - "version": "4.1.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", - "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=" - }, - "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" - } - } - }, - "fstream-ignore": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/fstream-ignore/-/fstream-ignore-1.0.5.tgz", - "integrity": "sha1-nDHa40dnAY/h0kmyTa2mfQktoQU=", - "requires": { - "fstream": "^1.0.0", - "inherits": "2", - "minimatch": "^3.0.0" - }, - "dependencies": { - "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" - }, - "minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha1-UWbihkV/AzBgZL5Ul+jbsMPTIIM=", - "requires": { - "brace-expansion": "^1.1.7" - }, - "dependencies": { - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha1-PH/L9SnYcibz0vUrlm/1Jx60Qd0=", - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - }, - "dependencies": { - "balanced-match": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" - }, - "concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" - } - } - } - } - } - } - }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "requires": { - "wrappy": "1" - }, - "dependencies": { - "wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" - } - } - }, - "readable-stream": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", - "integrity": "sha1-sRwn2IuP8fvgcGQ8+UsMea4bCq8=", - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - }, - "dependencies": { - "core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" - }, - "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" - }, - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" - }, - "process-nextick-args": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", - "integrity": "sha1-o31zL0JxtKsa0HDTVQjoKQeI/6o=" - }, - "safe-buffer": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", - "integrity": "sha1-iTMSr2myEj3vcfV4iQAWce6yyFM=" - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha1-nPFhG6YmhdcDCunkujQUnDrwP8g=", - "requires": { - "safe-buffer": "~5.1.0" - } - }, - "util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" - } - } - }, - "uid-number": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/uid-number/-/uid-number-0.0.6.tgz", - "integrity": "sha1-DqEOgDXo61uOREnwbaHHMGY7qoE=" - } - } - } - } + "mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true } } }, - "mapnik-vector-tile": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/mapnik-vector-tile/-/mapnik-vector-tile-1.6.1.tgz", - "integrity": "sha1-Pf8n1eTx/MZH1ljqislZEh8zn1k=" + "merge-source-map": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/merge-source-map/-/merge-source-map-1.1.0.tgz", + "integrity": "sha512-Qkcp7P2ygktpMPh2mCQZaf3jhN6D3Z/qVZHSdWvQ+2Ef5HgRAPBO57A77+ENm0CPx2+1Ce/MYKi3ymqdfuqibw==", + "dev": true, + "requires": { + "source-map": "^0.6.1" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } }, "mime-db": { - "version": "1.35.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.35.0.tgz", - "integrity": "sha512-JWT/IcCTsB0Io3AhWUMjRqucrHSPsSf2xKLaRldJVULioggvkJvggZ3VXNNSRkCddE6D+BUI4HEIZIA2OjwIvg==" + "version": "1.40.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.40.0.tgz", + "integrity": "sha512-jYdeOMPy9vnxEqFRRo6ZvTZ8d9oPb+k18PKoYNYUe2stVEBPPwsln/qWzdbmaIvnhZ9v2P+CuecK+fpUfsV2mA==" }, "mime-types": { - "version": "2.1.19", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.19.tgz", - "integrity": "sha512-P1tKYHVSZ6uFo26mtnve4HQFE3koh1UWVkp8YUC+ESBHe945xWSoXuHHiGarDqcEZ+whpCDnlNw5LON0kLo+sw==", + "version": "2.1.24", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.24.tgz", + "integrity": "sha512-WaFHS3MCl5fapm3oLxU4eYDw77IQM2ACcxQ9RIxfaC3ooc6PFuBMGZZsYpvoXS5D5QTWPieo1jjLdAm3TBP3cQ==", "requires": { - "mime-db": "~1.35.0" + "mime-db": "1.40.0" } }, + "mimic-fn": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", + "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", + "dev": true + }, "minimatch": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", @@ -2068,6 +1873,23 @@ "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.2.0.tgz", "integrity": "sha1-Tf/lJdriuGTGbC4jxicdev3s784=" }, + "minipass": { + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.3.5.tgz", + "integrity": "sha512-Gi1W4k059gyRbyVUZQ4mEqLm0YIUiGYfvxhF6SIlk3ui1WVxMTGfGdQ2SInh3PDrRTVvPKgULkpJtT4RH10+VA==", + "requires": { + "safe-buffer": "^5.1.2", + "yallist": "^3.0.0" + } + }, + "minizlib": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-1.2.1.tgz", + "integrity": "sha512-7+4oTUOWKg7AuL3vloEWekXY2/D20cevzsrNT2kGWm+39J9hGTCBv8VI5Pm5lXZ/o3/mdR4f8rflAPhnQb8mPA==", + "requires": { + "minipass": "^2.2.1" + } + }, "mkdirp": { "version": "0.5.1", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", @@ -2083,34 +1905,192 @@ } } }, + "ms": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==" + }, + "mute-stream": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz", + "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=", + "dev": true + }, "nan": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.8.0.tgz", - "integrity": "sha1-7XFfP+neArV6XmJS2QqWZ14fCFo=" + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.10.0.tgz", + "integrity": "sha512-bAdJv7fBLhWC+/Bls0Oza+mvTaNQtP+1RyhhhvD95pgUJz6XM5IzgmxOkItJ9tkoCiplvAnXI1tNmmUD/eScyA==" + }, + "natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", + "dev": true + }, + "needle": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/needle/-/needle-2.3.1.tgz", + "integrity": "sha512-CaLXV3W8Vnbps8ZANqDGz7j4x7Yj1LW4TWF/TQuDfj7Cfx4nAPTvw98qgTevtto1oHDrh3pQkaODbqupXlsWTg==", + "requires": { + "debug": "^4.1.0", + "iconv-lite": "^0.4.4", + "sax": "^1.2.4" + }, + "dependencies": { + "sax": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==" + } + } + }, + "neo-async": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.0.tgz", + "integrity": "sha512-MFh0d/Wa7vkKO3Y3LlacqAEeHK0mckVqzDieUKTT+KGxi+zIpeVsFxymkIiRpbpDziHc290Xr9A1O4Om7otoRA==", + "dev": true + }, + "nested-error-stacks": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/nested-error-stacks/-/nested-error-stacks-2.1.0.tgz", + "integrity": "sha512-AO81vsIO1k1sM4Zrd6Hu7regmJN1NSiAja10gc4bX3F0wd+9rQmcuHQaHVQCYIEC8iFXnE+mavh23GOt7wBgug==", + "dev": true + }, + "nice-try": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", + "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", + "dev": true + }, + "node-pre-gyp": { + "version": "0.10.3", + "resolved": "https://registry.npmjs.org/node-pre-gyp/-/node-pre-gyp-0.10.3.tgz", + "integrity": "sha512-d1xFs+C/IPS8Id0qPTZ4bUT8wWryfR/OzzAFxweG+uLN85oPzyo2Iw6bVlLQ/JOdgNonXLCoRyqDzDWq4iw72A==", + "requires": { + "detect-libc": "^1.0.2", + "mkdirp": "^0.5.1", + "needle": "^2.2.1", + "nopt": "^4.0.1", + "npm-packlist": "^1.1.6", + "npmlog": "^4.0.2", + "rc": "^1.2.7", + "rimraf": "^2.6.1", + "semver": "^5.3.0", + "tar": "^4" + } }, "nopt": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz", - "integrity": "sha1-xkZdvwirzU2zWTF/eaxopkayj/k=", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-4.0.1.tgz", + "integrity": "sha1-0NRoWv1UFRk8jHUFYC0NF81kR00=", + "requires": { + "abbrev": "1", + "osenv": "^0.1.4" + } + }, + "normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", "dev": true, "requires": { - "abbrev": "1" + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } + }, + "npm-bundled": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-1.0.6.tgz", + "integrity": "sha512-8/JCaftHwbd//k6y2rEWp6k1wxVfpFzB6t1p825+cUb7Ym2XQfhwIC5KwhrvzZRJu+LtDE585zVaS32+CGtf0g==" + }, + "npm-packlist": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-1.4.1.tgz", + "integrity": "sha512-+TcdO7HJJ8peiiYhvPxsEDhF3PJFGUGRcFsGve3vxvxdcpO2Z4Z7rkosRM0kWj6LfbK/P0gu3dzk5RU1ffvFcw==", + "requires": { + "ignore-walk": "^3.0.1", + "npm-bundled": "^1.0.1" } }, + "npm-run-path": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", + "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", + "dev": true, + "requires": { + "path-key": "^2.0.0" + } + }, + "npmlog": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz", + "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", + "requires": { + "are-we-there-yet": "~1.1.2", + "console-control-strings": "~1.1.0", + "gauge": "~2.7.3", + "set-blocking": "~2.0.0" + } + }, + "number-is-nan": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", + "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=" + }, "numeral": { - "version": "1.5.6", - "resolved": "https://registry.npmjs.org/numeral/-/numeral-1.5.6.tgz", - "integrity": "sha1-ODHbloRRuc9q/5v5WSXx7443sz8=" + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/numeral/-/numeral-2.0.6.tgz", + "integrity": "sha1-StCAk21EPCVhrtnyGX7//iX05QY=" + }, + "nyc": { + "version": "14.1.0", + "resolved": "https://registry.npmjs.org/nyc/-/nyc-14.1.0.tgz", + "integrity": "sha512-iy9fEV8Emevz3z/AanIZsoGa8F4U2p0JKevZ/F0sk+/B2r9E6Qn+EPs0bpxEhnAt6UPlTL8mQZIaSJy8sK0ZFw==", + "dev": true, + "requires": { + "archy": "^1.0.0", + "caching-transform": "^3.0.2", + "convert-source-map": "^1.6.0", + "cp-file": "^6.2.0", + "find-cache-dir": "^2.1.0", + "find-up": "^3.0.0", + "foreground-child": "^1.5.6", + "glob": "^7.1.3", + "istanbul-lib-coverage": "^2.0.5", + "istanbul-lib-hook": "^2.0.7", + "istanbul-lib-instrument": "^3.3.0", + "istanbul-lib-report": "^2.0.8", + "istanbul-lib-source-maps": "^3.0.6", + "istanbul-reports": "^2.2.4", + "js-yaml": "^3.13.1", + "make-dir": "^2.1.0", + "merge-source-map": "^1.1.0", + "resolve-from": "^4.0.0", + "rimraf": "^2.6.3", + "signal-exit": "^3.0.2", + "spawn-wrap": "^1.4.2", + "test-exclude": "^5.2.3", + "uuid": "^3.3.2", + "yargs": "^13.2.2", + "yargs-parser": "^13.0.0" + } }, "oauth-sign": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.2.tgz", - "integrity": "sha1-Rqarfwrq2N6unsBWV4C31O/rnUM=" + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", + "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==" + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" }, "object-inspect": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-0.4.0.tgz", - "integrity": "sha1-9RV8EWwUVbJDsG7pdwM5LFrYn+w=", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.6.0.tgz", + "integrity": "sha512-GJzfBZ6DgDAmnuaM3104jR4s1Myxr3Y3zfIyN4z3UdqN69oSRacNK8UhnobDdC+7J2AHCjGwxQubNJfE70SXXQ==", "dev": true }, "object-keys": { @@ -2126,6 +2106,15 @@ "wrappy": "1" } }, + "onetime": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", + "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", + "dev": true, + "requires": { + "mimic-fn": "^1.0.0" + } + }, "optimist": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", @@ -2150,51 +2139,187 @@ } } }, - "optionator": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.5.0.tgz", - "integrity": "sha1-t1qJlaLUF98ltuTjhi9QqohlE2g=", + "optionator": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz", + "integrity": "sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=", + "dev": true, + "requires": { + "deep-is": "~0.1.3", + "fast-levenshtein": "~2.0.4", + "levn": "~0.3.0", + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2", + "wordwrap": "~1.0.0" + } + }, + "os-homedir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", + "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=" + }, + "os-locale": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-3.1.0.tgz", + "integrity": "sha512-Z8l3R4wYWM40/52Z+S265okfFj8Kt2cC2MKY+xNi3kFs+XGI7WXu/I309QQQYbRW4ijiZ+yxs9pqEhJh0DqW3Q==", + "dev": true, + "requires": { + "execa": "^1.0.0", + "lcid": "^2.0.0", + "mem": "^4.0.0" + } + }, + "os-tmpdir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=" + }, + "osenv": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz", + "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==", + "requires": { + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.0" + } + }, + "p-defer": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-1.0.0.tgz", + "integrity": "sha1-n26xgvbJqozXQwBKfU+WsZaw+ww=", + "dev": true + }, + "p-finally": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", + "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", + "dev": true + }, + "p-is-promise": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/p-is-promise/-/p-is-promise-2.1.0.tgz", + "integrity": "sha512-Y3W0wlRPK8ZMRbNq97l4M5otioeA5lm1z7bkNkxCka8HSPjR0xRWmpCmc9utiaLP9Jb1eD8BgeIxTW4AIF45Pg==", + "dev": true + }, + "p-limit": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.0.tgz", + "integrity": "sha512-pZbTJpoUsCzV48Mc9Nh51VbwO0X9cuPFE8gYwx9BTCt9SF8/b7Zljd2fVgOxhIF/HDTKgpVzs+GPhyKfjLLFRQ==", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dev": true, + "requires": { + "p-limit": "^2.0.0" + } + }, + "p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true + }, + "package-hash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/package-hash/-/package-hash-3.0.0.tgz", + "integrity": "sha512-lOtmukMDVvtkL84rJHI7dpTYq+0rli8N2wlnqUcBuDWCfVhRUfOmnR9SsoHFMLpACvEV60dX7rd0rFaYDZI+FA==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.15", + "hasha": "^3.0.0", + "lodash.flattendeep": "^4.4.0", + "release-zalgo": "^1.0.0" + } + }, + "parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "requires": { + "callsites": "^3.0.0" + } + }, + "parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", + "dev": true, + "requires": { + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" + } + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "dev": true + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" + }, + "path-is-inside": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", + "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=", + "dev": true + }, + "path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", + "dev": true + }, + "path-parse": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", + "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==", + "dev": true + }, + "path-type": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", + "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", "dev": true, "requires": { - "deep-is": "~0.1.2", - "fast-levenshtein": "~1.0.0", - "levn": "~0.2.5", - "prelude-ls": "~1.1.1", - "type-check": "~0.3.1", - "wordwrap": "~0.0.2" + "pify": "^3.0.0" }, "dependencies": { - "wordwrap": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz", - "integrity": "sha1-o9XabNXAvAAI03I0u68b7WMFkQc=", + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", "dev": true } } }, - "path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" - }, "performance-now": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=" }, - "pinkie": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", - "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", + "pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", "dev": true }, - "pinkie-promise": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", - "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", + "pkg-dir": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", + "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", "dev": true, "requires": { - "pinkie": "^2.0.0" + "find-up": "^3.0.0" } }, "prelude-ls": { @@ -2203,6 +2328,17 @@ "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", "dev": true }, + "process-nextick-args": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", + "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==" + }, + "progress": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", + "dev": true + }, "progress-stream": { "version": "0.5.0", "resolved": "https://registry.npmjs.org/progress-stream/-/progress-stream-0.5.0.tgz", @@ -2213,10 +2349,26 @@ "through2": "~0.2.3" } }, - "protozero": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/protozero/-/protozero-1.5.1.tgz", - "integrity": "sha1-Wiffb7bh7XQ/UQgSrnbAgvWxZjg=" + "pseudomap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", + "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=", + "dev": true + }, + "psl": { + "version": "1.1.31", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.1.31.tgz", + "integrity": "sha512-/6pt4+C+T+wZUieKR620OpzN/LlnNKuWjy1iFLQ/UG35JqHlR/89MP1d96dUfkf6Dne3TuLQzOYEYshJ+Hx8mw==" + }, + "pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "dev": true, + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } }, "punycode": { "version": "1.3.2", @@ -2238,6 +2390,45 @@ "resolved": "https://registry.npmjs.org/queue-async/-/queue-async-1.0.7.tgz", "integrity": "sha1-Iq4KHaxKkvW81GNPmTxoKiqBCUU=" }, + "rc": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", + "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", + "requires": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + }, + "dependencies": { + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" + } + } + }, + "read-pkg": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", + "integrity": "sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k=", + "dev": true, + "requires": { + "load-json-file": "^4.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^3.0.0" + } + }, + "read-pkg-up": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-4.0.0.tgz", + "integrity": "sha512-6etQSH7nJGsK0RbG/2TeDzZFa8shjQ1um+SwQQ5cwKy0dhSXdOncEhb1CPpvQG4h7FyOV6EB6YlV0yJvZQNAkA==", + "dev": true, + "requires": { + "find-up": "^3.0.0", + "read-pkg": "^3.0.0" + } + }, "readable-stream": { "version": "1.1.14", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", @@ -2249,39 +2440,46 @@ "string_decoder": "~0.10.x" } }, - "repeat-string": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", - "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", + "regexpp": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-2.0.1.tgz", + "integrity": "sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw==", "dev": true }, + "release-zalgo": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/release-zalgo/-/release-zalgo-1.0.0.tgz", + "integrity": "sha1-CXALflB0Mpc5Mw5TXFqQ+2eFFzA=", + "dev": true, + "requires": { + "es6-error": "^4.0.1" + } + }, "request": { - "version": "2.83.0", - "resolved": "https://registry.npmjs.org/request/-/request-2.83.0.tgz", - "integrity": "sha512-lR3gD69osqm6EYLk9wB/G1W/laGWjzH90t1vEa2xuxHD5KUrSzp9pUSfTm+YC5Nxt2T8nMPEvKlhbQayU7bgFw==", + "version": "2.88.0", + "resolved": "https://registry.npmjs.org/request/-/request-2.88.0.tgz", + "integrity": "sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg==", "requires": { "aws-sign2": "~0.7.0", - "aws4": "^1.6.0", + "aws4": "^1.8.0", "caseless": "~0.12.0", - "combined-stream": "~1.0.5", - "extend": "~3.0.1", + "combined-stream": "~1.0.6", + "extend": "~3.0.2", "forever-agent": "~0.6.1", - "form-data": "~2.3.1", - "har-validator": "~5.0.3", - "hawk": "~6.0.2", + "form-data": "~2.3.2", + "har-validator": "~5.1.0", "http-signature": "~1.2.0", "is-typedarray": "~1.0.0", "isstream": "~0.1.2", "json-stringify-safe": "~5.0.1", - "mime-types": "~2.1.17", - "oauth-sign": "~0.8.2", + "mime-types": "~2.1.19", + "oauth-sign": "~0.9.0", "performance-now": "^2.1.0", - "qs": "~6.5.1", - "safe-buffer": "^5.1.1", - "stringstream": "~0.0.5", - "tough-cookie": "~2.3.3", + "qs": "~6.5.2", + "safe-buffer": "^5.1.2", + "tough-cookie": "~2.4.3", "tunnel-agent": "^0.6.0", - "uuid": "^3.1.0" + "uuid": "^3.3.2" } }, "requestretry": { @@ -2296,12 +2494,43 @@ "when": "^3.7.7" } }, + "require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", + "dev": true + }, + "require-main-filename": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", + "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", + "dev": true + }, "resolve": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", - "integrity": "sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs=", + "version": "1.10.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.10.1.tgz", + "integrity": "sha512-KuIe4mf++td/eFb6wkaPbMDnP6kObCaEtIDuHOUED6MNUo4K670KZUHuuvYPZDxNF0WVLw49n06M2m2dXphEzA==", + "dev": true, + "requires": { + "path-parse": "^1.0.6" + } + }, + "resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", "dev": true }, + "restore-cursor": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", + "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=", + "dev": true, + "requires": { + "onetime": "^2.0.0", + "signal-exit": "^3.0.2" + } + }, "resumer": { "version": "0.0.0", "resolved": "https://registry.npmjs.org/resumer/-/resumer-0.0.0.tgz", @@ -2311,22 +2540,30 @@ "through": "~2.3.4" } }, - "right-align": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/right-align/-/right-align-0.1.3.tgz", - "integrity": "sha1-YTObci/mo1FWiSENJOFMlhSGE+8=", + "rimraf": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", + "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", + "requires": { + "glob": "^7.1.3" + } + }, + "run-async": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.3.0.tgz", + "integrity": "sha1-A3GrSuC91yDUFm19/aZP96RFpsA=", "dev": true, - "optional": true, "requires": { - "align-text": "^0.1.1" + "is-promise": "^2.1.0" } }, - "rimraf": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz", - "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==", + "rxjs": { + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.1.tgz", + "integrity": "sha512-y0j31WJc83wPu31vS1VlAFW5JGrnGC+j+TtGAa1fRQphy48+fDYiDmX8tjGloToEsMkxnouOg/1IzXGKkJnZMg==", + "dev": true, "requires": { - "glob": "^7.0.5" + "tslib": "^1.9.0" } }, "s3signed": { @@ -2368,16 +2605,40 @@ "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.1.tgz", "integrity": "sha1-e45lYZCyKOgaZq6nSEgNgozS03o=" }, - "sigmund": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.1.tgz", - "integrity": "sha1-P/IfGYytIXX587eBhT/ZTQ0ZtZA=", + "semver": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz", + "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==" + }, + "set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=" + }, + "shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", + "dev": true, + "requires": { + "shebang-regex": "^1.0.0" + } + }, + "shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", "dev": true }, + "signal-exit": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", + "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=" + }, "simple-statistics": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/simple-statistics/-/simple-statistics-0.8.1.tgz", - "integrity": "sha1-Wn9rZLN/oIjv/kE68NY0OySoPxI=", + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/simple-statistics/-/simple-statistics-7.0.2.tgz", + "integrity": "sha512-wqTjlmbiaL6Fqaw28tSjQrthjxVV17MMfi/H/qvE0jAvtLspB2S7gEtcR27uvhSRAa64LhjhoO169rX8sFW3pg==", "dev": true }, "single-line-log": { @@ -2385,33 +2646,86 @@ "resolved": "https://registry.npmjs.org/single-line-log/-/single-line-log-0.3.1.tgz", "integrity": "sha1-p61lB/IYzl3+FsS/LWWSRkGeegY=" }, - "sntp": { + "slice-ansi": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/sntp/-/sntp-2.1.0.tgz", - "integrity": "sha512-FL1b58BDrqS3A11lJ0zEdnJ3UOKqVxawAkF3k7F0CVN7VQ34aZrV+G8BZ1WC9ZL7NyrwsW0oviwsWDgRuVYtJg==", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-2.1.0.tgz", + "integrity": "sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==", + "dev": true, "requires": { - "hoek": "4.x.x" + "ansi-styles": "^3.2.0", + "astral-regex": "^1.0.0", + "is-fullwidth-code-point": "^2.0.0" + }, + "dependencies": { + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true + } } }, "source-map": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.2.0.tgz", - "integrity": "sha1-2rc/vPwrqBm03gO9b26qSBZLP50=", + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + }, + "spawn-wrap": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/spawn-wrap/-/spawn-wrap-1.4.2.tgz", + "integrity": "sha512-vMwR3OmmDhnxCVxM8M+xO/FtIp6Ju/mNaDfCMMW7FDcLRTPFWUswec4LXJHTJE2hwTI9O0YBfygu4DalFl7Ylg==", + "dev": true, + "requires": { + "foreground-child": "^1.5.6", + "mkdirp": "^0.5.0", + "os-homedir": "^1.0.1", + "rimraf": "^2.6.2", + "signal-exit": "^3.0.2", + "which": "^1.3.0" + } + }, + "spdx-correct": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.0.tgz", + "integrity": "sha512-lr2EZCctC2BNR7j7WzJ2FpDznxky1sjfxvvYEyzxNyb6lZXHODmEoJeFu4JupYlkfha1KZpJyoqiJ7pgA1qq8Q==", + "dev": true, + "requires": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-exceptions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.2.0.tgz", + "integrity": "sha512-2XQACfElKi9SlVb1CYadKDXvoajPgBVPn/gOQLrTvHdElaVhr7ZEbqJaRnJLVNeaI4cMEAgVCeBMKF6MWRDCRA==", + "dev": true + }, + "spdx-expression-parse": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz", + "integrity": "sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg==", "dev": true, - "optional": true, "requires": { - "amdefine": ">=0.0.4" + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" } }, + "spdx-license-ids": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.4.tgz", + "integrity": "sha512-7j8LYJLeY/Yb6ACbQ7F76qy5jHkp0U6jgBfJsk97bwWlVUnUWsAgpyaCvo17h0/RQGnQ036tVDomiwoI4pDkQA==", + "dev": true + }, "speedometer": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/speedometer/-/speedometer-0.1.4.tgz", "integrity": "sha1-mHbb0qFp0xFUAtSObqYynIgWpQ0=" }, "spherical": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/spherical/-/spherical-0.1.0.tgz", - "integrity": "sha1-H+rMS4O80NwtiV74rbhfil7FQ8I=", + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/spherical/-/spherical-0.2.0.tgz", + "integrity": "sha1-IHYdntltoSoPQil1XmKssaPcchA=", "requires": { "wgs84": "0.0.0" } @@ -2423,9 +2737,9 @@ "dev": true }, "sshpk": { - "version": "1.14.2", - "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.14.2.tgz", - "integrity": "sha1-xvxhZIo9nE52T9P8306hBeSSupg=", + "version": "1.16.1", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", + "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", "requires": { "asn1": "~0.2.3", "assert-plus": "^1.0.0", @@ -2438,78 +2752,182 @@ "tweetnacl": "~0.14.0" } }, + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + }, + "string.prototype.trim": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.1.2.tgz", + "integrity": "sha1-0E3iyJ4Tf019IG8Ia17S+ua+jOo=", + "dev": true, + "requires": { + "define-properties": "^1.1.2", + "es-abstract": "^1.5.0", + "function-bind": "^1.0.2" + } + }, "string_decoder": { "version": "0.10.31", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" }, - "stringstream": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/stringstream/-/stringstream-0.0.6.tgz", - "integrity": "sha512-87GEBAkegbBcweToUrdzf3eLhWNg06FJTebl4BVJz/JgWy8CvEr9dRtX5qWphiynMSQlxxi+QqN0z5T32SLlhA==" - }, "strip-ansi": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "dev": true, "requires": { "ansi-regex": "^2.0.0" } }, - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", "dev": true }, - "tape": { - "version": "2.13.4", - "resolved": "https://registry.npmjs.org/tape/-/tape-2.13.4.tgz", - "integrity": "sha1-Wk0nKgKeq0qZJr9KbWBqdzQ+xJA=", + "strip-eof": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", + "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", + "dev": true + }, + "strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=" + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", "dev": true, "requires": { - "deep-equal": "~0.2.0", - "defined": "~0.0.0", - "glob": "~3.2.9", - "inherits": "~2.0.1", - "object-inspect": "~0.4.0", - "resumer": "~0.0.0", - "through": "~2.3.4" + "has-flag": "^3.0.0" + } + }, + "table": { + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/table/-/table-5.2.3.tgz", + "integrity": "sha512-N2RsDAMvDLvYwFcwbPyF3VmVSSkuF+G1e+8inhBLtHpvwXGw4QRPEZhihQNeEN0i1up6/f6ObCJXNdlRG3YVyQ==", + "dev": true, + "requires": { + "ajv": "^6.9.1", + "lodash": "^4.17.11", + "slice-ansi": "^2.1.0", + "string-width": "^3.0.0" }, "dependencies": { - "glob": { - "version": "3.2.11", - "resolved": "https://registry.npmjs.org/glob/-/glob-3.2.11.tgz", - "integrity": "sha1-Spc/Y1uRkPcV0QmH1cAP0oFevj0=", + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true + }, + "string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", "dev": true, "requires": { - "inherits": "2", - "minimatch": "0.3" + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" } }, - "minimatch": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-0.3.0.tgz", - "integrity": "sha1-J12O2qxPG7MyZHIInnlJyDlGmd0=", + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "requires": { + "ansi-regex": "^4.1.0" + } + } + } + }, + "tape": { + "version": "4.10.1", + "resolved": "https://registry.npmjs.org/tape/-/tape-4.10.1.tgz", + "integrity": "sha512-G0DywYV1jQeY3axeYnXUOt6ktnxS9OPJh97FGR3nrua8lhWi1zPflLxcAHavZ7Jf3qUfY7cxcVIVFa4mY2IY1w==", + "dev": true, + "requires": { + "deep-equal": "~1.0.1", + "defined": "~1.0.0", + "for-each": "~0.3.3", + "function-bind": "~1.1.1", + "glob": "~7.1.3", + "has": "~1.0.3", + "inherits": "~2.0.3", + "minimist": "~1.2.0", + "object-inspect": "~1.6.0", + "resolve": "~1.10.0", + "resumer": "~0.0.0", + "string.prototype.trim": "~1.1.2", + "through": "~2.3.8" + }, + "dependencies": { + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true + }, + "resolve": { + "version": "1.10.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.10.1.tgz", + "integrity": "sha512-KuIe4mf++td/eFb6wkaPbMDnP6kObCaEtIDuHOUED6MNUo4K670KZUHuuvYPZDxNF0WVLw49n06M2m2dXphEzA==", "dev": true, "requires": { - "lru-cache": "2", - "sigmund": "~1.0.0" + "path-parse": "^1.0.6" } } } }, "tar": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/tar/-/tar-2.2.1.tgz", - "integrity": "sha1-jk0qJWwOIYXGsYrWlK7JaLg8sdE=", + "version": "4.4.8", + "resolved": "https://registry.npmjs.org/tar/-/tar-4.4.8.tgz", + "integrity": "sha512-LzHF64s5chPQQS0IYBn9IN5h3i98c12bo4NCO7e0sGM2llXQ3p2FGC5sdENN4cTW48O915Sh+x+EXx7XW96xYQ==", + "requires": { + "chownr": "^1.1.1", + "fs-minipass": "^1.2.5", + "minipass": "^2.3.4", + "minizlib": "^1.1.1", + "mkdirp": "^0.5.0", + "safe-buffer": "^5.1.2", + "yallist": "^3.0.2" + } + }, + "test-exclude": { + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-5.2.3.tgz", + "integrity": "sha512-M+oxtseCFO3EDtAaGH7iiej3CBkzXqFMbzqYAACdzKui4eZA+pq3tZEwChvOdNfa7xxy8BfbmgJSIr43cC/+2g==", + "dev": true, "requires": { - "block-stream": "*", - "fstream": "^1.0.2", - "inherits": "2" + "glob": "^7.1.3", + "minimatch": "^3.0.4", + "read-pkg-up": "^4.0.0", + "require-main-filename": "^2.0.0" } }, + "text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", + "dev": true + }, "through": { "version": "2.3.8", "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", @@ -2525,11 +2943,27 @@ "xtend": "~2.1.1" } }, + "tmp": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", + "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", + "dev": true, + "requires": { + "os-tmpdir": "~1.0.2" + } + }, + "to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", + "dev": true + }, "tough-cookie": { - "version": "2.3.4", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.4.tgz", - "integrity": "sha512-TZ6TTfI5NtZnuyy/Kecv+CnoROnyXn2DN97LontgQpCwsX2XyLYCC0ENhYkehSOwAp8rTQKc/NUIF7BkQ5rKLA==", + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.4.3.tgz", + "integrity": "sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ==", "requires": { + "psl": "^1.1.24", "punycode": "^1.4.1" }, "dependencies": { @@ -2540,6 +2974,18 @@ } } }, + "trim-right": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz", + "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=", + "dev": true + }, + "tslib": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.9.3.tgz", + "integrity": "sha512-4krF8scpejhaOgqzBEcGM7yDIEfi0/8+8zDRZhNZZ2kjmHJ4hv3zCbQWxoJGz1iw5U0Jl0nma13xzHXcncMavQ==", + "dev": true + }, "tunnel-agent": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", @@ -2551,8 +2997,7 @@ "tweetnacl": { "version": "0.14.5", "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", - "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", - "optional": true + "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=" }, "type-check": { "version": "0.3.2", @@ -2564,37 +3009,44 @@ } }, "uglify-js": { - "version": "2.8.29", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.8.29.tgz", - "integrity": "sha1-KcVzMUgFe7Th913zW3qcty5qWd0=", + "version": "3.5.11", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.5.11.tgz", + "integrity": "sha512-izPJg8RsSyqxbdnqX36ExpbH3K7tDBsAU/VfNv89VkMFy3z39zFjunQGsSHOlGlyIfGLGprGeosgQno3bo2/Kg==", "dev": true, "optional": true, "requires": { - "source-map": "~0.5.1", - "uglify-to-browserify": "~1.0.0", - "yargs": "~3.10.0" + "commander": "~2.20.0", + "source-map": "~0.6.1" }, "dependencies": { "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true, "optional": true } } }, - "uglify-to-browserify": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz", - "integrity": "sha1-bgkk1r2mta/jSeOabWMoUKD4grc=", - "dev": true, - "optional": true - }, "underscore": { - "version": "1.8.3", - "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.8.3.tgz", - "integrity": "sha1-Tz+1OxBuYJf8+ctBCfKl6b36UCI=" + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.9.1.tgz", + "integrity": "sha512-5/4etnCkd9c8gwgowi5/om/mYO5ajCaOgdzj/oW+0eQV9WxKBDZw5+ycmKmeaTXjInS/W0BzpGLo2xR2aBwZdg==" + }, + "uri-js": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", + "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", + "requires": { + "punycode": "^2.1.0" + }, + "dependencies": { + "punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" + } + } }, "url": { "version": "0.10.3", @@ -2605,10 +3057,25 @@ "querystring": "0.2.0" } }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" + }, "uuid": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.1.0.tgz", - "integrity": "sha512-DIWtzUkw04M4k3bf1IcpS2tngXEL26YUD2M0tMDUpnUrz2hgzUBlD55a4FjdLGPvfHxS6uluGWvaVEqgBcVa+g==" + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz", + "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==" + }, + "validate-npm-package-license": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "dev": true, + "requires": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } }, "verror": { "version": "1.10.0", @@ -2640,12 +3107,19 @@ "isexe": "^2.0.0" } }, - "window-size": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.0.tgz", - "integrity": "sha1-VDjNLqk7IC76Ohn+iIeu58lPnJ0=", - "dev": true, - "optional": true + "which-module": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", + "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", + "dev": true + }, + "wide-align": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", + "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", + "requires": { + "string-width": "^1.0.2 || 2" + } }, "wordwrap": { "version": "1.0.0", @@ -2653,11 +3127,41 @@ "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=", "dev": true }, + "wrap-ansi": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", + "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", + "dev": true, + "requires": { + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1" + } + }, "wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" }, + "write": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/write/-/write-1.0.3.tgz", + "integrity": "sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig==", + "dev": true, + "requires": { + "mkdirp": "^0.5.1" + } + }, + "write-file-atomic": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.4.2.tgz", + "integrity": "sha512-s0b6vB3xIVRLWywa6X9TOMA7k9zio0TMOsl9ZnDkliA/cfJlpHXAscj0gbHVJiTdIuAYpIyqS5GW91fqm6gG5g==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.11", + "imurmurhash": "^0.1.4", + "signal-exit": "^3.0.2" + } + }, "xml2js": { "version": "0.4.19", "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.19.tgz", @@ -2680,17 +3184,78 @@ "object-keys": "~0.4.0" } }, + "y18n": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz", + "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==", + "dev": true + }, + "yallist": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.0.3.tgz", + "integrity": "sha512-S+Zk8DEWE6oKpV+vI3qWkaK+jSbIK86pCwe2IF/xwIpQ8jEuxpw9NyaGjmp9+BoJv5FV2piqCDcoCtStppiq2A==" + }, "yargs": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz", - "integrity": "sha1-9+572FfdfB0tOMDnTvvWgdFDH9E=", + "version": "13.2.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.2.2.tgz", + "integrity": "sha512-WyEoxgyTD3w5XRpAQNYUB9ycVH/PQrToaTXdYXRdOXvEy1l19br+VJsc0vcO8PTGg5ro/l/GY7F/JMEBmI0BxA==", + "dev": true, + "requires": { + "cliui": "^4.0.0", + "find-up": "^3.0.0", + "get-caller-file": "^2.0.1", + "os-locale": "^3.1.0", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^3.0.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^13.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true + }, + "string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "dev": true, + "requires": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + } + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "requires": { + "ansi-regex": "^4.1.0" + } + } + } + }, + "yargs-parser": { + "version": "13.1.0", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.0.tgz", + "integrity": "sha512-Yq+32PrijHRri0vVKQEm+ys8mbqWjLiwQkMFNXEENutzLPP0bE4Lcd4iA3OQY5HF+GD3xXxf0MEHb8E4/SA3AA==", "dev": true, - "optional": true, "requires": { - "camelcase": "^1.0.2", - "cliui": "^2.1.0", - "decamelize": "^1.0.0", - "window-size": "0.1.0" + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" } } } diff --git a/package.json b/package.json index 9d4fee2..8db6a16 100644 --- a/package.json +++ b/package.json @@ -14,30 +14,34 @@ ], "dependencies": { "mapnik": "3.x || 4.x", - "@mapbox/sphericalmercator": "~1.0.5", + "@mapbox/sphericalmercator": "~1.1.0", "aws-sdk": "^2.2.30", "s3urls": "^1.3.0", - "@mapbox/tilelive": "~5.12.0", + "@mapbox/tilelive": "~6.0.0", "@mapbox/tiletype": "0.3.x", - "numeral": "~1.5.3", - "request": "~2.83.0", - "spherical": "~0.1.0", - "tar": "~2.2.1", - "underscore": "~1.8.0" + "numeral": "~2.0.6", + "request": "~2.88.0", + "spherical": "~0.2.0", + "tar": "~4.4.8", + "underscore": "~1.9.0" }, "devDependencies": { "@mapbox/mapbox-studio-default-style": "2.0.0", + "@mapbox/eslint-config-geocoding": "^2.0.0", "@mapbox/tilejson": "^1.1.0", - "coveralls": "~2.11.2", - "istanbul": "~0.3.17", - "simple-statistics": "~0.8.0", - "tape": "2.13.x" + "coveralls": "~3.0.3", + "eslint": "^5.3.0", + "eslint-plugin-node": "^9.0.1", + "nyc": "^14.1.0", + "simple-statistics": "~7.0.2", + "tape": "4.10.x" }, "scripts": { "test": "tape test/*.js", - "coverage": "istanbul cover tape test/*.js && coveralls < ./coverage/lcov.info" + "lint": "eslint *.js test", + "coverage": "nyc tape test/*.js && nyc report --reporter=text-lconv | coveralls" }, "engine": { - "node": ">4.0.0" + "node": ">=8" } } diff --git a/test/backend.js b/test/backend.js index dcb16e3..6484640 100644 --- a/test/backend.js +++ b/test/backend.js @@ -1,285 +1,283 @@ -var test = require('tape'); -var tilelive = require('@mapbox/tilelive'); -var url = require('url'); -var Backend = require('..').Backend; -var mapnik = require('..').mapnik; -var path = require('path'); -var fs = require('fs'); -var Testsource = require('./testsource'); -var zlib = require('zlib'); -var UPDATE = process.env.UPDATE; +'use strict'; + +const test = require('tape'); +const tilelive = require('@mapbox/tilelive'); +const Backend = require('..').Backend; +const mapnik = require('..').mapnik; +const fs = require('fs'); +const Testsource = require('./testsource'); +const zlib = require('zlib'); +const UPDATE = process.env.UPDATE; // Tilelive test source. tilelive.protocols['test:'] = Testsource; - test('invalid', function(t) { - new Backend({}, function(err) { - t.equal('Error: opts.uri or opts.source must be set', err.toString()); - t.end(); - }); - }); - test('async default opts', function(t) { - new Backend({ uri:'test:///a' }, function(err, source) { - t.ifError(err); - t.equal(1, source._scale); - t.equal(0, source._minzoom); - t.equal(1, source._maxzoom); - t.equal(undefined, source._fillzoom); - t.end(); - }); +test('invalid', (t) => { + new Backend({}, (err) => { + t.equal('Error: opts.uri or opts.source must be set', err.toString()); + t.end(); }); - test('sync default opts', function(t) { - var source = new Backend({ source: new Testsource('a') }); +}); +test('async default opts', (t) => { + new Backend({ uri:'test:///a' }, (err, source) => { + t.ifError(err); t.equal(1, source._scale); t.equal(0, source._minzoom); - t.equal(22, source._maxzoom); + t.equal(1, source._maxzoom); t.equal(undefined, source._fillzoom); - - source = new Backend({ - source: new Testsource('a'), - minzoom: 2, - maxzoom: 22, - fillzoom: 4 - }); - t.equal(1, source._scale); - t.equal(2, source._minzoom); - t.equal(22, source._maxzoom); - t.equal(4, source._fillzoom); t.end(); }); - test('proxies getInfo', function(t) { - var source = new Testsource('a'); - var wrapped = new Backend({ - source: source, - minzoom: 0, - maxzoom: 1 - }); - source.getInfo(function(err, a) { +}); +test('sync default opts', (t) => { + let source = new Backend({ source: new Testsource('a') }); + t.equal(1, source._scale); + t.equal(0, source._minzoom); + t.equal(22, source._maxzoom); + t.equal(undefined, source._fillzoom); + + source = new Backend({ + source: new Testsource('a'), + minzoom: 2, + maxzoom: 22, + fillzoom: 4 + }); + t.equal(1, source._scale); + t.equal(2, source._minzoom); + t.equal(22, source._maxzoom); + t.equal(4, source._fillzoom); + t.end(); +}); +test('proxies getInfo', (t) => { + const source = new Testsource('a'); + const wrapped = new Backend({ + source: source, + minzoom: 0, + maxzoom: 1 + }); + source.getInfo((err, a) => { + t.ifError(err); + wrapped.getInfo((err, b) => { t.ifError(err); - wrapped.getInfo(function(err, b) { - t.ifError(err); - t.deepEqual(a, b); - t.end(); - }); + t.deepEqual(a, b); + t.end(); }); }); +}); - var sources = { - a: new Backend({ source: new Testsource('a'), minzoom:0, maxzoom: 1 }), - b: new Backend({ source: new Testsource('b'), minzoom:0, maxzoom: 2, fillzoom: 1 }), - c: new Backend({ source: new Testsource('b'), minzoom:0, maxzoom: 2, fillzoom: 1, scale: 2, legacy: true }), - h: new Backend({ source: new Testsource('b'), minzoom:0, maxzoom: 2, fillzoom: 1, scale: 2 }), - i: new Backend({ source: new Testsource('i'), minzoom:0, maxzoom: 1 }), - invalid: new Backend({ source: new Testsource('invalid'), minzoom:0, maxzoom: 1 }), - iv: new Backend({ source: new Testsource('i'), minzoom:0, maxzoom: 1, vector_layers: [{id:'custom_layer_name'}] }), - gz: new Backend({ source: new Testsource('gz'), minzoom:0, maxzoom: 0 }), - }; - sources.d = new Backend({ source: sources.a, minzoom:0, maxzoom:1 }); - var tests = { - // 2.0.0, 2.0.1 test overzooming. - // 0.0.1 test that solid bg tiles are generated for 0-length protobufs. - a: ['0.0.0', '1.0.0', '1.0.1', '1.1.0', '1.1.1', '2.0.0', '2.0.1'], - // 2.1.1 should use z2 vector tile -- a coastline shapefile - // 2.1.2 should use fillzoom -- place dots, like the others - b: ['0.0.0', '1.0.0', '1.0.1', '1.1.0', '1.1.1', '2.1.1', '2.1.2'], - // test the a legacy flag overriding the scale factor of the request affecting the output tile size - c: ['0.0.0', '1.0.0', '1.0.1', '1.1.0', '1.1.1', '2.1.1', '2.1.2', '3.2.2', '3.2.3', '3.2.4'], - // proxies through vector tiles (rather than PBFs) from a source. - d: ['0.0.0', '1.0.0', '1.0.1', '1.1.0', '1.1.1', '2.0.0', '2.0.1'], - // test the scale factor of the request affecting the output tile size - h: ['0.0.0', '1.0.0', '1.0.1', '1.1.0', '1.1.1', '2.1.1', '2.1.2', '3.2.2', '3.2.3', '3.2.4'], - // wraps image source with vector tiles. - i: ['0.0.0', '1.0.0', '1.0.1', '1.1.0', '1.1.1', '2.0.0', '2.0.1'], - // wraps image source with vector tiles, with named vector layer. - iv: ['0.0.0'], - // loads gzip compressed protobuf. - gz: ['0.0.0'], - // Invalid tiles that are empty - invalid: ['1.1.0', '1.1.1'], - }; - Object.keys(tests).forEach(function(source) { - tests[source].forEach(function(key) { - var z = key.split('.')[0] | 0; - var x = key.split('.')[1] | 0; - var y = key.split('.')[2] | 0; - test('should render ' + source + ' (' + key + ') to mapnik.VectorTile' , function(t) { - var cbTile = function(err, vtile, headers) { - t.ifError(err); - // Returns a vector tile. - t.ok(vtile instanceof mapnik.VectorTile); - // No backend tiles last modified defaults to Date 0. - // Otherwise, Last-Modified from backend should be passed. - if (source == 'invalid' || (source == 'i' && ['2.0.0','2.0.1'].indexOf(key) >= 0)) { - t.equal(headers['Last-Modified'], new Date(0).toUTCString()); - t.equal(headers['x-vector-backend-object'], 'empty', 'backend-object=empty'); - } else { - t.equal(headers['Last-Modified'], Testsource.now.toUTCString()); - t.equal(headers['x-vector-backend-object'], 'default', 'backend-object=default'); - } - // Check for presence of ETag and store away for later - // ETag comparison. - t.ok('ETag' in headers); - // Content-Type. - t.equal(headers['Content-Type'], 'application/x-protobuf'); - // Size stats attached to buffer. - t.equal('number', typeof vtile._srcbytes); - // Compare vtile contents to expected fixtures. - // if source is c, test legacy scale factor - // at zoom > 1 it will compare with data at previous zoom level. - if (source === 'c') { - if (key[0] > 1) { - key[0] -= 1; - var fixtpath = __dirname + '/expected/backend-' + source + '.' + key + '.json'; - if (UPDATE) fs.writeFileSync(fixtpath, JSON.stringify(vtile.toJSON(), replacer, 2)); - t.deepEqual( - JSON.parse(JSON.stringify(vtile.toJSON(), replacer)), - JSON.parse(fs.readFileSync(fixtpath)) - ); - } - } else { - var fixtpath = __dirname + '/expected/backend-' + source + '.' + key + '.json'; +const sources = { + a: new Backend({ source: new Testsource('a'), minzoom:0, maxzoom: 1 }), + b: new Backend({ source: new Testsource('b'), minzoom:0, maxzoom: 2, fillzoom: 1 }), + c: new Backend({ source: new Testsource('b'), minzoom:0, maxzoom: 2, fillzoom: 1, scale: 2, legacy: true }), + h: new Backend({ source: new Testsource('b'), minzoom:0, maxzoom: 2, fillzoom: 1, scale: 2 }), + i: new Backend({ source: new Testsource('i'), minzoom:0, maxzoom: 1 }), + invalid: new Backend({ source: new Testsource('invalid'), minzoom:0, maxzoom: 1 }), + iv: new Backend({ source: new Testsource('i'), minzoom:0, maxzoom: 1, vector_layers: [{ id:'custom_layer_name' }] }), + gz: new Backend({ source: new Testsource('gz'), minzoom:0, maxzoom: 0 }), +}; +sources.d = new Backend({ source: sources.a, minzoom:0, maxzoom:1 }); +const tests = { + // 2.0.0, 2.0.1 test overzooming. + // 0.0.1 test that solid bg tiles are generated for 0-length protobufs. + a: ['0.0.0', '1.0.0', '1.0.1', '1.1.0', '1.1.1', '2.0.0', '2.0.1'], + // 2.1.1 should use z2 vector tile -- a coastline shapefile + // 2.1.2 should use fillzoom -- place dots, like the others + b: ['0.0.0', '1.0.0', '1.0.1', '1.1.0', '1.1.1', '2.1.1', '2.1.2'], + // test the a legacy flag overriding the scale factor of the request affecting the output tile size + c: ['0.0.0', '1.0.0', '1.0.1', '1.1.0', '1.1.1', '2.1.1', '2.1.2', '3.2.2', '3.2.3', '3.2.4'], + // proxies through vector tiles (rather than PBFs) from a source. + d: ['0.0.0', '1.0.0', '1.0.1', '1.1.0', '1.1.1', '2.0.0', '2.0.1'], + // test the scale factor of the request affecting the output tile size + h: ['0.0.0', '1.0.0', '1.0.1', '1.1.0', '1.1.1', '2.1.1', '2.1.2', '3.2.2', '3.2.3', '3.2.4'], + // wraps image source with vector tiles. + i: ['0.0.0', '1.0.0', '1.0.1', '1.1.0', '1.1.1', '2.0.0', '2.0.1'], + // wraps image source with vector tiles, with named vector layer. + iv: ['0.0.0'], + // loads gzip compressed protobuf. + gz: ['0.0.0'], + // Invalid tiles that are empty + invalid: ['1.1.0', '1.1.1'], +}; +Object.keys(tests).forEach((source) => { + tests[source].forEach((key) => { + const z = key.split('.')[0] | 0; + const x = key.split('.')[1] | 0; + const y = key.split('.')[2] | 0; + test('should render ' + source + ' (' + key + ') to mapnik.VectorTile' , (t) => { + const cbTile = function(err, vtile, headers) { + t.ifError(err); + // Returns a vector tile. + t.ok(vtile instanceof mapnik.VectorTile); + // No backend tiles last modified defaults to Date 0. + // Otherwise, Last-Modified from backend should be passed. + if (source === 'invalid' || (source === 'i' && ['2.0.0','2.0.1'].indexOf(key) >= 0)) { + t.equal(headers['Last-Modified'], new Date(0).toUTCString()); + t.equal(headers['x-vector-backend-object'], 'empty', 'backend-object=empty'); + } else { + t.equal(headers['Last-Modified'], Testsource.now.toUTCString()); + t.equal(headers['x-vector-backend-object'], 'default', 'backend-object=default'); + } + // Check for presence of ETag and store away for later + // ETag comparison. + t.ok('ETag' in headers); + // Content-Type. + t.equal(headers['Content-Type'], 'application/x-protobuf'); + // Size stats attached to buffer. + t.equal('number', typeof vtile._srcbytes); + // Compare vtile contents to expected fixtures. + // if source is c, test legacy scale factor + // at zoom > 1 it will compare with data at previous zoom level. + if (source === 'c') { + if (parseInt(key[0]) > 1) { + const fixtpath = __dirname + '/expected/backend-' + source + '.' + key + '.json'; if (UPDATE) fs.writeFileSync(fixtpath, JSON.stringify(vtile.toJSON(), replacer, 2)); t.deepEqual( JSON.parse(JSON.stringify(vtile.toJSON(), replacer)), JSON.parse(fs.readFileSync(fixtpath)) ); } - t.end(); - }; - if (source === 'c') { - cbTile.legacy = true; + } else { + const fixtpath = __dirname + '/expected/backend-' + source + '.' + key + '.json'; + if (UPDATE) fs.writeFileSync(fixtpath, JSON.stringify(vtile.toJSON(), replacer, 2)); + t.deepEqual( + JSON.parse(JSON.stringify(vtile.toJSON(), replacer)), + JSON.parse(fs.readFileSync(fixtpath)) + ); } - sources[source].getTile(z,x,y, cbTile); - }); + t.end(); + }; + if (source === 'c') { + cbTile.legacy = true; + } + sources[source].getTile(z,x,y, cbTile); + }); - test('should render ' + source + ' (' + key + ') to raw Buffer' , function(t) { - var cbTile = function(err, buffer, headers, bz, bx, by) { - t.ok(bz !== undefined); - t.ok(bx !== undefined); - t.ok(by !== undefined); - t.ifError(err); - // Returns a vector tile. - if (buffer && buffer.length) { - t.ok(buffer instanceof Buffer); - } - if (buffer) { - t.ok(buffer.tile_type === 'pbf' || buffer.tile_type === undefined); - t.ok(typeof(buffer.layer_name) === 'string' || buffer.layer_name === undefined); - } - // No backend tiles last modified defaults to Date 0. - // Otherwise, Last-Modified from backend should be passed. - if (source == 'invalid' || (source == 'i' && ['2.0.0','2.0.1'].indexOf(key) >= 0)) { - t.equal(headers['Last-Modified'], new Date(0).toUTCString()); - t.equal(headers['x-vector-backend-object'], 'empty', 'backend-object=empty'); - } else { - t.equal(headers['Last-Modified'], Testsource.now.toUTCString()); - t.equal(headers['x-vector-backend-object'], 'default', 'backend-object=default'); - } - // Check for presence of ETag and store away for later - // ETag comparison. - t.ok('ETag' in headers); - // Content-Type. - t.equal(headers['Content-Type'], 'application/x-protobuf'); + test('should render ' + source + ' (' + key + ') to raw Buffer' , (t) => { + const cbTile = function(err, buffer, headers, bz, bx, by) { + t.ok(bz !== undefined); + t.ok(bx !== undefined); + t.ok(by !== undefined); + t.ifError(err); + // Returns a vector tile. + if (buffer && buffer.length) { + t.ok(buffer instanceof Buffer); + } + if (buffer) { + t.ok(buffer.tile_type === 'pbf' || buffer.tile_type === undefined); + t.ok(typeof(buffer.layer_name) === 'string' || buffer.layer_name === undefined); + } + // No backend tiles last modified defaults to Date 0. + // Otherwise, Last-Modified from backend should be passed. + if (source === 'invalid' || (source === 'i' && ['2.0.0','2.0.1'].indexOf(key) >= 0)) { + t.equal(headers['Last-Modified'], new Date(0).toUTCString()); + t.equal(headers['x-vector-backend-object'], 'empty', 'backend-object=empty'); + } else { + t.equal(headers['Last-Modified'], Testsource.now.toUTCString()); + t.equal(headers['x-vector-backend-object'], 'default', 'backend-object=default'); + } + // Check for presence of ETag and store away for later + // ETag comparison. + t.ok('ETag' in headers); + // Content-Type. + t.equal(headers['Content-Type'], 'application/x-protobuf'); - var vtile = new mapnik.VectorTile(bz,bx,by); - if (buffer && buffer.length) { - if (buffer.tile_type === 'pbf') { + const vtile = new mapnik.VectorTile(bz,bx,by); + if (buffer && buffer.length) { + if (buffer.tile_type === 'pbf') { vtile.addData(buffer); - } else { + } else { vtile.addImageBuffer(buffer,sources[source]._layer); - } } + } - // Compare vtile contents to expected fixtures. - // if source is c, test legacy scale factor - // at zoom > 1 it will compare with data at previous zoom level. - if (source === 'c') { - if (key[0] > 1) { - key[0] -= 1; - var fixtpath = __dirname + '/expected/backend-' + source + '.' + key + '-raw.json'; - if (UPDATE) fs.writeFileSync(fixtpath, JSON.stringify(vtile.toJSON(), replacer, 2)); - t.deepEqual( - JSON.parse(JSON.stringify(vtile.toJSON(), replacer)), - JSON.parse(fs.readFileSync(fixtpath)) - ); - } - } else { - var fixtpath = __dirname + '/expected/backend-' + source + '.' + key + '-raw.json'; + // Compare vtile contents to expected fixtures. + // if source is c, test legacy scale factor + // at zoom > 1 it will compare with data at previous zoom level. + if (source === 'c') { + if (parseInt(key[0]) > 1) { + const fixtpath = __dirname + '/expected/backend-' + source + '.' + key + '-raw.json'; if (UPDATE) fs.writeFileSync(fixtpath, JSON.stringify(vtile.toJSON(), replacer, 2)); t.deepEqual( JSON.parse(JSON.stringify(vtile.toJSON(), replacer)), JSON.parse(fs.readFileSync(fixtpath)) ); } - t.end(); - }; - if (source === 'c') { - cbTile.legacy = true; + } else { + const fixtpath = __dirname + '/expected/backend-' + source + '.' + key + '-raw.json'; + if (UPDATE) fs.writeFileSync(fixtpath, JSON.stringify(vtile.toJSON(), replacer, 2)); + t.deepEqual( + JSON.parse(JSON.stringify(vtile.toJSON(), replacer)), + JSON.parse(fs.readFileSync(fixtpath)) + ); } - cbTile.raw_buffer = true; - sources[source].getTile(z,x,y, cbTile); - }); - }); - }); - test('treats unknown buffer as image', function(t) { - Testsource.tiles.invalid['1.0.0'] = new Buffer('asdf'); // invalid deflate - sources.invalid.getTile(1, 0, 0, function(err, vtile) { - t.ifError(err); - t.deepEqual(vtile.toJSON()[0].name, '_image'); - t.end(); - }); - }); - test('errors out on bad protobuf x', function(t) { - zlib.deflate(new Buffer('asdf'), function(err, deflated) { - if (err) throw err; - Testsource.tiles.invalid['1.0.1'] = deflated; // invalid protobuf - sources.invalid.getTile(1, 0, 1, function(err, vtile) { - t.ok(err); - t.equal(err.message, 'Vector Tile Buffer contains invalid tag'); t.end(); - }); + }; + if (source === 'c') { + cbTile.legacy = true; + } + cbTile.raw_buffer = true; + sources[source].getTile(z,x,y, cbTile); }); }); - test('errors out on invalid backend tile request - out of range y', function(t) { - sources.a.getTile(1, 0, 2, function(err) { - t.throws(function() { if (err) throw err; }); - t.equal('Tile does not exist', err.message); - t.end(); - }); +}); +test('treats unknown buffer as image', (t) => { + Testsource.tiles.invalid['1.0.0'] = new Buffer.from('asdf'); // invalid deflate + sources.invalid.getTile(1, 0, 0, (err, vtile) => { + t.ifError(err); + t.deepEqual(vtile.toJSON()[0].name, '_image'); + t.end(); }); - test('errors out on invalid backend tile request - out of range x', function(t) { - sources.a.getTile(1, 2, 0, function(err) { - t.throws(function() { if (err) throw err; }); - t.equal('Tile does not exist', err.message); +}); +test('errors out on bad protobuf x', (t) => { + zlib.deflate(new Buffer.from('asdf'), (err, deflated) => { + if (err) throw err; + Testsource.tiles.invalid['1.0.1'] = deflated; // invalid protobuf + sources.invalid.getTile(1, 0, 1, (err, vtile) => { + t.ok(err); + t.equal(err.message, 'Vector Tile Buffer contains invalid tag'); t.end(); }); }); - test('errors out on invalid backedn tile request - negative x', function(t) { - sources.a.getTile(1, -1, 0, function(err) { - t.throws(function() { if (err) throw err; }); - t.equal('Tile does not exist', err.message); - t.end(); - }); +}); +test('errors out on invalid backend tile request - out of range y', (t) => { + sources.a.getTile(1, 0, 2, (err) => { + t.throws(() => { if (err) throw err; }); + t.equal('Tile does not exist', err.message); + t.end(); }); - test('errors out on invalid backend tile request - negative y', function(t) { - sources.a.getTile(1, 0, -1, function(err) { - t.throws(function() { if (err) throw err; }); - t.equal('Tile does not exist', err.message); - t.end(); - }); +}); +test('errors out on invalid backend tile request - out of range x', (t) => { + sources.a.getTile(1, 2, 0, (err) => { + t.throws(() => { if (err) throw err; }); + t.equal('Tile does not exist', err.message); + t.end(); }); - test('errors out on invalid backend tile request - negative z', function(t) { - sources.a.getTile(-1, 0, 0, function(err) { - t.throws(function() { if (err) throw err; }); - t.equal('Tile does not exist', err.message); - t.end(); - }); +}); +test('errors out on invalid backedn tile request - negative x', (t) => { + sources.a.getTile(1, -1, 0, (err) => { + t.throws(() => { if (err) throw err; }); + t.equal('Tile does not exist', err.message); + t.end(); + }); +}); +test('errors out on invalid backend tile request - negative y', (t) => { + sources.a.getTile(1, 0, -1, (err) => { + t.throws(() => { if (err) throw err; }); + t.equal('Tile does not exist', err.message); + t.end(); }); +}); +test('errors out on invalid backend tile request - negative z', (t) => { + sources.a.getTile(-1, 0, 0, (err) => { + t.throws(() => { if (err) throw err; }); + t.equal('Tile does not exist', err.message); + t.end(); + }); +}); -test('query', function(t) { - var lonlat = [-77.0131, 38.8829]; - var filepath = __dirname + '/expected/query-' + lonlat.join(',') + '.json'; - sources.a.queryTile(22, lonlat[0], lonlat[1], { tolerance: 10000 }, function(err, data, headers) { +test('query', (t) => { + const lonlat = [-77.0131, 38.8829]; + const filepath = __dirname + '/expected/query-' + lonlat.join(',') + '.json'; + sources.a.queryTile(22, lonlat[0], lonlat[1], { tolerance: 10000 }, (err, data, headers) => { t.ifError(err); t.equal(headers['Content-Type'], 'application/json'); @@ -301,13 +299,13 @@ test('query', function(t) { function replacer(key, value) { if (key === 'raster') { - if ("data" in value) + if ('data' in value) { value = value.data; } - var ln = value.length || 0; - var buffer = new Buffer(ln); - for (var i = 0; i < ln; i++) buffer.writeUInt8(value[i], i); + const ln = value.length || 0; + const buffer = new Buffer(ln); + for (let i = 0; i < ln; i++) buffer.writeUInt8(value[i], i); return buffer.toString('hex'); } else { return value; diff --git a/test/file.js b/test/file.js index 0217cd6..be05d96 100644 --- a/test/file.js +++ b/test/file.js @@ -1,13 +1,15 @@ -var test = require('tape'); -var path = require('path'); -var Vector = require('..'); -var tilelive = require('@mapbox/tilelive'); -var TileJSON = require('@mapbox/tilejson'); +'use strict'; + +const test = require('tape'); +const path = require('path'); +const Vector = require('..'); +const tilelive = require('@mapbox/tilelive'); +const TileJSON = require('@mapbox/tilejson'); // Register vector:, tm2z:, tm2z+http: and mapbox: tilelive protocols Vector.registerProtocols(tilelive); tilelive.protocols['mapbox:'] = function Source(uri, callback) { - var MapboxAccessToken = process.env.MapboxAccessToken; + const MapboxAccessToken = process.env.MapboxAccessToken; if (!MapboxAccessToken) return callback(new Error('env var MapboxAccessToken is required')); return new TileJSON('http://a.tiles.mapbox.com/v4' + uri.pathname + '.json?access_token=' + MapboxAccessToken, callback); }; @@ -15,16 +17,16 @@ tilelive.protocols['mapbox:'] = function Source(uri, callback) { // Register font Vector.mapnik.register_fonts(path.join(__dirname, 'fonts', 'source-sans-pro')); -test('file ENOENT', function(assert) { - Vector('/does-not-exist', function(err, source) { +test('file ENOENT', (assert) => { + new Vector('/does-not-exist', (err, source) => { assert.equal(err.code, 'ENOENT'); assert.end(); }); }); -test('file xml', function(assert) { - var filepath = path.join(path.dirname(require.resolve('@mapbox/mapbox-studio-default-style')),'project.xml'); - Vector(filepath, function(err, source) { +test('file xml', (assert) => { + const filepath = path.join(path.dirname(require.resolve('@mapbox/mapbox-studio-default-style')),'project.xml'); + new Vector(filepath, (err, source) => { assert.ifError(err); assert.equal(source instanceof Vector, true, 'returns source'); assert.equal(source._base, path.dirname(require.resolve('@mapbox/mapbox-studio-default-style')), 'sets base'); diff --git a/test/image.js b/test/image.js index 3bbbf9e..7493e57 100644 --- a/test/image.js +++ b/test/image.js @@ -1,10 +1,7 @@ -var fs = require('fs'); -var util = require('util'); -var path = require('path'); -var spawn = require('child_process').spawn; -var exec = require('child_process').exec; -var existsSync = require('fs').existsSync || require('path').existsSync; -var mapnik = require('mapnik'); +'use strict'; + +const fs = require('fs'); +const mapnik = require('mapnik'); function imageEqualsFile(buffer, file, meanError, callback) { if (typeof meanError == 'function') { @@ -12,17 +9,17 @@ function imageEqualsFile(buffer, file, meanError, callback) { meanError = 0.05; } - var fixturesize = fs.statSync(file).size; - var sizediff = Math.abs(fixturesize - buffer.length) / fixturesize; + const fixturesize = fs.statSync(file).size; + const sizediff = Math.abs(fixturesize - buffer.length) / fixturesize; if (sizediff > meanError) { return callback(new Error('Image size is too different from fixture: ' + buffer.length + ' vs. ' + fixturesize)); } - var expectImage = new mapnik.Image.fromBytesSync(fs.readFileSync(file)); - var resultImage = new mapnik.Image.fromBytesSync(buffer); - var pxDiff = expectImage.compare(resultImage); + const expectImage = new mapnik.Image.fromBytesSync(fs.readFileSync(file)); + const resultImage = new mapnik.Image.fromBytesSync(buffer); + const pxDiff = expectImage.compare(resultImage); // Allow < 2% of pixels to vary by > default comparison threshold of 16. - var pxThresh = resultImage.width() * resultImage.height() * 0.02; + const pxThresh = resultImage.width() * resultImage.height() * 0.02; if (pxDiff > pxThresh) { callback(new Error('Image is too different from fixture: ' + pxDiff + ' pixels > ' + pxThresh + ' pixels')); diff --git a/test/test.js b/test/test.js index e780720..66c3ca0 100644 --- a/test/test.js +++ b/test/test.js @@ -1,18 +1,19 @@ -var test = require('tape'); -var tilelive = require('@mapbox/tilelive'); -var url = require('url'); -var Vector = require('..'); -var path = require('path'); -var fs = require('fs'); -var imageEqualsFile = require('./image.js'); -var Testsource = require('./testsource'); -var zlib = require('zlib'); -var UPDATE = process.env.UPDATE; +'use strict'; + +const test = require('tape'); +const tilelive = require('@mapbox/tilelive'); +const Vector = require('..'); +const path = require('path'); +const fs = require('fs'); +const imageEqualsFile = require('./image.js'); +const Testsource = require('./testsource'); +const zlib = require('zlib'); +const UPDATE = process.env.UPDATE; // Tilelive test source. tilelive.protocols['test:'] = Testsource; -var xml = { +const xml = { a: fs.readFileSync(path.resolve(__dirname + '/fixtures/a.xml'), 'utf8'), b: fs.readFileSync(path.resolve(__dirname + '/fixtures/b.xml'), 'utf8'), c: fs.readFileSync(path.resolve(__dirname + '/fixtures/c.xml'), 'utf8'), @@ -26,60 +27,60 @@ var xml = { invalid: fs.readFileSync(path.resolve(__dirname + '/fixtures/invalid.xml'), 'utf8') }; -test('should fail without backend', function(t) { - new Vector({ xml: xml.c }, function(err) { +test('should fail without backend', (t) => { + new Vector({ xml: xml.c }, (err) => { t.equal(err.message, 'No backend'); t.end(); }); }); -test('should fail without xml', function(t) { - new Vector({ backend: new Testsource() }, function(err) { +test('should fail without xml', (t) => { + new Vector({ backend: new Testsource() }, (err) => { t.equal(err.message, 'No xml'); t.end(); }); }); -test('should load with callback', function(t) { - new Vector({ backend: new Testsource(), xml: xml.a }, function(err, source) { +test('should load with callback', (t) => { + new Vector({ backend: new Testsource(), xml: xml.a }, (err, source) => { t.ifError(err); t.ok(source); t.end(); }); }); -test('#open should call all listeners', function(t) { - var v = new Vector({ backend: new Testsource(), xml: xml.a }); - var remaining = 3; - for (var i = 0; i < remaining; i++) v.open(function(err, source) { +test('#open should call all listeners', (t) => { + const v = new Vector({ backend: new Testsource(), xml: xml.a }); + let remaining = 3; + for (let i = 0; i < remaining; i++) v.open((err, source) => { t.ifError(err); t.ok(source); if (!--remaining) t.end(); }); }); -test('should get info', function(t) { - new Vector({ backend: new Testsource(), xml: xml.a }, function(err, source) { +test('should get info', (t) => { + new Vector({ backend: new Testsource(), xml: xml.a }, (err, source) => { t.ifError(err); t.ok(source); - source.getInfo(function(err, info) { + source.getInfo((err, info) => { t.ifError(err); t.equal('test-a', info.name); t.equal(0, info.minzoom); t.equal(8, info.maxzoom); t.deepEqual([0,0,2], info.center); t.deepEqual([-180,-85.0511,180,85.0511], info.bounds); - t.deepEqual({"level2":"property"}, info.level1, 'JSON key stores deep attribute data'); + t.deepEqual({ 'level2':'property' }, info.level1, 'JSON key stores deep attribute data'); t.deepEqual('1', info.scale, 'JSON key does not overwrite other params'); t.end(); }); }); }); -test('should update xml, backend', function(t) { - new Vector({xml:xml.a}, function(err, source) { +test('should update xml, backend', (t) => { + new Vector({ xml:xml.a }, (err, source) => { t.ifError(err); - source.getInfo(function(err, info) { + source.getInfo((err, info) => { t.ifError(err); t.equal('test-a', info.name); - source.update({xml:xml.b}, function(err) { + source.update({ xml:xml.b }, (err) => { t.ifError(err); - source.getInfo(function(err, info) { + source.getInfo((err, info) => { t.ifError(err); t.equal('test-b', info.name); t.end(); @@ -88,17 +89,17 @@ test('should update xml, backend', function(t) { }); }); }); -test('should use fallback backend', function(t) { - new Vector({ source:'test:///a', xml: xml.c }, function(err, source) { +test('should use fallback backend', (t) => { + new Vector({ source:'test:///a', xml: xml.c }, (err, source) => { t.ifError(err); t.ok(source); t.end(); }); }); -test('passes through backend expires header', function(t) { - new Vector({ source:'test:///expires', xml: xml.expires }, function(err, source) { +test('passes through backend expires header', (t) => { + new Vector({ source:'test:///expires', xml: xml.expires }, (err, source) => { t.ifError(err); - source.getTile(0, 0, 0, function(err, buffer, headers) { + source.getTile(0, 0, 0, (err, buffer, headers) => { t.ifError(err); t.ok(buffer); t.equal(headers.Expires, 'Wed, 01 Jan 2020 00:00:00 GMT'); @@ -107,7 +108,7 @@ test('passes through backend expires header', function(t) { }); }); -var sources = { +const sources = { a: new Vector({ backend: new Testsource('a'), xml: xml.a }), 'a@vt': new Vector({ backend: new Vector.Backend('test:///a'), xml: xml.a }), 'a.vt2': new Vector({ backend: new Testsource('a'), xml: xml.a }), @@ -123,7 +124,7 @@ var sources = { 'i@2x': new Vector({ backend: new Testsource('i'), xml: xml.i }), invalid: new Vector({ backend: new Testsource('invalid'), xml: xml.invalid }) }; -var tests = { +const tests = { // 2.0.0, 2.0.1 test overzooming. a: ['0.0.0', '1.0.0', '1.0.1', '1.1.0', '1.1.1', '2.0.0', '2.0.1'], 'a@vt': ['0.0.0', '1.0.0', '1.0.1', '1.1.0', '1.1.1', '2.0.0', '2.0.1'], @@ -152,23 +153,22 @@ var tests = { invalid: ['1.1.0', '1.1.1'], }; -var formats = { +const formats = { json: { ctype: 'application/json' }, jpeg: { ctype: 'image/jpeg' }, png: { ctype: 'image/png' }, - svg: { ctype: 'image/svg+xml', renderer: 'cairo' }, svg: { ctype: 'image/svg+xml', renderer: 'svg' }, utf: { ctype: 'application/json' } }; -var etags = {}; -Object.keys(tests).forEach(function(source) { - tests[source].forEach(function(key) { - var z = key.split('.')[0] | 0; - var x = key.split('.')[1] | 0; - var y = key.split('.')[2] | 0; - var remaining = 2; - test('should render ' + source + ' (' + key + ')', function(t) { - var cbTile = function(err, buffer, headers) { +const etags = {}; +Object.keys(tests).forEach((source) => { + tests[source].forEach((key) => { + const z = key.split('.')[0] | 0; + const x = key.split('.')[1] | 0; + const y = key.split('.')[2] | 0; + let remaining = 2; + test('should render ' + source + ' (' + key + ')', (t) => { + const cbTile = function(err, buffer, headers) { t.ifError(err); // No backend tiles last modified defaults to Date 0. // Otherwise, Last-Modified from backend should be passed. @@ -192,12 +192,12 @@ Object.keys(tests).forEach(function(source) { if (UPDATE) { fs.writeFileSync(__dirname + '/expected/' + source + '.' + key + '.png', buffer); } - imageEqualsFile(buffer, __dirname + '/expected/' + source + '.' + key + '.png', function(err) { + imageEqualsFile(buffer, __dirname + '/expected/' + source + '.' + key + '.png', (err) => { t.ifError(err); if (!--remaining) t.end(); }); }; - var cbHead = function(err, headers) { + const cbHead = function(err, headers) { t.ifError(err); // No backend tiles last modified defaults to Date 0. // Otherwise, Last-Modified from backend should be passed. @@ -226,12 +226,12 @@ Object.keys(tests).forEach(function(source) { }); }); }); -Object.keys(formats).forEach(function(format) { - test('format a (0.0.0) as ' + format, function(t) { - var source = 'a'; - var key = '0.0.0'; - var filepath = __dirname + '/expected/' + source + '.' + key + '.' + format; - var cbTile = function(err, buffer, headers) { +Object.keys(formats).forEach((format) => { + test('format a (0.0.0) as ' + format, (t) => { + const source = 'a'; + const key = '0.0.0'; + let filepath = __dirname + '/expected/' + source + '.' + key + '.' + format; + const cbTile = function(err, buffer, headers) { t.ifError(err); t.equal(headers['Content-Type'], formats[format].ctype); if (format === 'utf' || format === 'json') { @@ -241,7 +241,7 @@ Object.keys(formats).forEach(function(format) { t.deepEqual(buffer, JSON.parse(fs.readFileSync(filepath, 'utf8'))); t.end(); } else if (format === 'svg') { - filepath = filepath.replace(key,key+'-'+formats[format].renderer); + filepath = filepath.replace(key,key + '-' + formats[format].renderer); if (UPDATE) { fs.writeFileSync(filepath, buffer); } @@ -251,24 +251,24 @@ Object.keys(formats).forEach(function(format) { if (UPDATE) { fs.writeFileSync(filepath, buffer); } - imageEqualsFile(buffer, filepath, function(err) { + imageEqualsFile(buffer, filepath, (err) => { t.ifError(err); t.end(); }); } }; cbTile.format = format; - if (format == 'png') cbTile.format = 'png8:m=h'; + if (format === 'png') cbTile.format = 'png8:m=h'; if (formats[format].renderer) { cbTile.renderer = formats[format].renderer; } sources[source].getTile(0,0,0, cbTile); }); }); -test('query', function(t) { - var lonlat = [-77.0131, 38.8829]; - var filepath = __dirname + '/expected/query-' + lonlat.join(',') + '.json'; - sources.a.queryTile(22, lonlat[0], lonlat[1], { tolerance: 10000 }, function(err, data, headers) { +test('query', (t) => { + const lonlat = [-77.0131, 38.8829]; + const filepath = __dirname + '/expected/query-' + lonlat.join(',') + '.json'; + sources.a.queryTile(22, lonlat[0], lonlat[1], { tolerance: 10000 }, (err, data, headers) => { t.ifError(err); t.equal(headers['Content-Type'], 'application/json'); @@ -287,76 +287,76 @@ test('query', function(t) { t.end(); }); }); -test('errors out on invalid tile request - out of range y', function(t) { - sources.a.getTile(1, 0, 2, function(err) { - t.throws(function() { if (err) throw err; }); +test('errors out on invalid tile request - out of range y', (t) => { + sources.a.getTile(1, 0, 2, (err) => { + t.throws(() => { if (err) throw err; }); t.equal('Tile does not exist', err.message); t.end(); }); }); -test('errors out on invalid tile request - out of range x', function(t) { - sources.a.getTile(1, 2, 0, function(err) { - t.throws(function() { if (err) throw err; }); +test('errors out on invalid tile request - out of range x', (t) => { + sources.a.getTile(1, 2, 0, (err) => { + t.throws(() => { if (err) throw err; }); t.equal('Tile does not exist', err.message); t.end(); }); }); -test('errors out on invalid tile request - negative x', function(t) { - sources.a.getTile(1, -1, 0, function(err) { - t.throws(function() { if (err) throw err; }); +test('errors out on invalid tile request - negative x', (t) => { + sources.a.getTile(1, -1, 0, (err) => { + t.throws(() => { if (err) throw err; }); t.equal('Tile does not exist', err.message); t.end(); }); }); -test('errors out on invalid tile request - negative y', function(t) { - sources.a.getTile(1, 0, -1, function(err) { - t.throws(function() { if (err) throw err; }); +test('errors out on invalid tile request - negative y', (t) => { + sources.a.getTile(1, 0, -1, (err) => { + t.throws(() => { if (err) throw err; }); t.equal('Tile does not exist', err.message); t.end(); }); }); -test('errors out on invalid tile request - negative z', function(t) { - sources.a.getTile(-1, 0, 0, function(err) { - t.throws(function() { if (err) throw err; }); +test('errors out on invalid tile request - negative z', (t) => { + sources.a.getTile(-1, 0, 0, (err) => { + t.throws(() => { if (err) throw err; }); t.equal('Tile does not exist', err.message); t.end(); }); }); -test('errors out on bad deflate', function(t) { - Testsource.tiles.invalid['1.0.0'] = new Buffer('asdf'); // invalid deflate - sources.invalid.getTile(1, 0, 0, function(err) { +test('errors out on bad deflate', (t) => { + Testsource.tiles.invalid['1.0.0'] = new Buffer.from('asdf'); // invalid deflate + sources.invalid.getTile(1, 0, 0, (err) => { t.equal('image_reader: can\'t determine type from input data', err.message); t.end(); }); }); -test('errors out on bad protobuf', function(t) { - zlib.deflate(new Buffer('asdf'), function(err, deflated) { +test('errors out on bad protobuf', (t) => { + zlib.deflate(new Buffer.from('asdf'), (err, deflated) => { if (err) throw err; Testsource.tiles.invalid['1.0.1'] = deflated; // invalid protobuf - sources.invalid.getTile(1, 0, 1, function(err) { + sources.invalid.getTile(1, 0, 1, (err) => { t.equal('Vector Tile Buffer contains invalid tag', err.message); t.end(); }); }); }); -test('same backend/xml => same ETags', function(t) { - tests.a.slice(0,4).forEach(function(key) { +test('same backend/xml => same ETags', (t) => { + tests.a.slice(0,4).forEach((key) => { t.equal(etags.a[key], etags.d[key]); }); t.end(); }); -test('diff blank tiles => diff ETags', function(t) { +test('diff blank tiles => diff ETags', (t) => { t.notEqual(etags.invalid['1.1.0'], etags.invalid['1.1.1']); t.end(); }); -test('diff backend => diff ETags', function(t) { - tests.a.slice(0,4).forEach(function(key) { +test('diff backend => diff ETags', (t) => { + tests.a.slice(0,4).forEach((key) => { t.notEqual(etags.a[key], etags.b[key]); }); t.end(); }); -test('diff scale => diff ETags', function(t) { - tests.a.slice(0,4).forEach(function(key) { +test('diff scale => diff ETags', (t) => { + tests.a.slice(0,4).forEach((key) => { t.notEqual(etags.b[key], etags.c[key]); }); t.end(); diff --git a/test/testsource.js b/test/testsource.js index edbacf3..c449408 100644 --- a/test/testsource.js +++ b/test/testsource.js @@ -1,25 +1,26 @@ -var tilelive = require('@mapbox/tilelive'); -var zlib = require('zlib'); -var fs = require('fs'); -var path = require('path'); +'use strict'; + +const zlib = require('zlib'); +const fs = require('fs'); +const path = require('path'); module.exports = Testsource; // Load fixture data. -var infos = { +const infos = { a: { minzoom:0, maxzoom:1, vector_layers: [ { - "id": "coastline", - "description": "", - "minzoom": 0, - "maxzoom": 22, - "fields": { - "FeatureCla": "String", - "Note": "String", - "ScaleRank": "Number" + 'id': 'coastline', + 'description': '', + 'minzoom': 0, + 'maxzoom': 22, + 'fields': { + 'FeatureCla': 'String', + 'Note': 'String', + 'ScaleRank': 'Number' } } ] @@ -30,14 +31,14 @@ var infos = { fillzoom:1, vector_layers: [ { - "id": "coastline", - "description": "", - "minzoom": 0, - "maxzoom": 22, - "fields": { - "FeatureCla": "String", - "Note": "String", - "ScaleRank": "Number" + 'id': 'coastline', + 'description': '', + 'minzoom': 0, + 'maxzoom': 22, + 'fields': { + 'FeatureCla': 'String', + 'Note': 'String', + 'ScaleRank': 'Number' } } ] @@ -56,14 +57,14 @@ var infos = { maxzoom:0, vector_layers: [ { - "id": "coastline", - "description": "", - "minzoom": 0, - "maxzoom": 22, - "fields": { - "FeatureCla": "String", - "Note": "String", - "ScaleRank": "Number" + 'id': 'coastline', + 'description': '', + 'minzoom': 0, + 'maxzoom': 22, + 'fields': { + 'FeatureCla': 'String', + 'Note': 'String', + 'ScaleRank': 'Number' } } ] @@ -73,14 +74,14 @@ var infos = { maxzoom:1, vector_layers: [ { - "id": "coastline", - "description": "", - "minzoom": 0, - "maxzoom": 22, - "fields": { - "FeatureCla": "String", - "Note": "String", - "ScaleRank": "Number" + 'id': 'coastline', + 'description': '', + 'minzoom': 0, + 'maxzoom': 22, + 'fields': { + 'FeatureCla': 'String', + 'Note': 'String', + 'ScaleRank': 'Number' } } ] @@ -90,14 +91,14 @@ var infos = { maxzoom:2, vector_layers: [ { - "id": "coastline", - "description": "", - "minzoom": 0, - "maxzoom": 22, - "fields": { - "FeatureCla": "String", - "Note": "String", - "ScaleRank": "Number" + 'id': 'coastline', + 'description': '', + 'minzoom': 0, + 'maxzoom': 22, + 'fields': { + 'FeatureCla': 'String', + 'Note': 'String', + 'ScaleRank': 'Number' } } ] @@ -105,28 +106,28 @@ var infos = { }; Testsource.tiles = { - a: fs.readdirSync(path.resolve(path.join(__dirname, 'fixtures','a'))).reduce(function(memo, basename) { - var key = basename.split('.').slice(0,3).join('.'); + a: fs.readdirSync(path.resolve(path.join(__dirname, 'fixtures','a'))).reduce((memo, basename) => { + const key = basename.split('.').slice(0,3).join('.'); memo[key] = fs.readFileSync(path.resolve(path.join(__dirname, 'fixtures', 'a', basename))); return memo; }, {}), - b: fs.readdirSync(path.resolve(path.join(__dirname, 'fixtures','b'))).reduce(function(memo, basename) { - var key = basename.split('.').slice(0,3).join('.'); + b: fs.readdirSync(path.resolve(path.join(__dirname, 'fixtures','b'))).reduce((memo, basename) => { + const key = basename.split('.').slice(0,3).join('.'); memo[key] = fs.readFileSync(path.resolve(path.join(__dirname, 'fixtures', 'b', basename))); return memo; }, {}), - i: fs.readdirSync(path.resolve(path.join(__dirname, 'fixtures','i'))).reduce(function(memo, basename) { - var key = basename.split('.').slice(0,3).join('.'); + i: fs.readdirSync(path.resolve(path.join(__dirname, 'fixtures','i'))).reduce((memo, basename) => { + const key = basename.split('.').slice(0,3).join('.'); memo[key] = fs.readFileSync(path.resolve(path.join(__dirname, 'fixtures', 'i', basename))); return memo; }, {}), - gz: fs.readdirSync(path.resolve(path.join(__dirname, 'fixtures','gz'))).reduce(function(memo, basename) { - var key = basename.split('.').slice(0,3).join('.'); + gz: fs.readdirSync(path.resolve(path.join(__dirname, 'fixtures','gz'))).reduce((memo, basename) => { + const key = basename.split('.').slice(0,3).join('.'); memo[key] = fs.readFileSync(path.resolve(path.join(__dirname, 'fixtures', 'gz', basename))); return memo; }, {}), - expires: fs.readdirSync(path.resolve(path.join(__dirname, 'fixtures','a'))).reduce(function(memo, basename) { - var key = basename.split('.').slice(0,3).join('.'); + expires: fs.readdirSync(path.resolve(path.join(__dirname, 'fixtures','a'))).reduce((memo, basename) => { + const key = basename.split('.').slice(0,3).join('.'); memo[key] = fs.readFileSync(path.resolve(path.join(__dirname, 'fixtures', 'a', basename))); return memo; }, {}), @@ -134,7 +135,7 @@ Testsource.tiles = { }; // Additional error tile fixtures. -zlib.deflate(new Buffer(0), function(err, deflated) { +zlib.deflate(new Buffer(0), (err, deflated) => { if (err) throw err; Testsource.tiles.invalid['0.0.0'] = deflated; }); @@ -153,20 +154,20 @@ function Testsource(uri, callback) { }; this.stats = {}; return callback && callback(null, this); -}; +} Testsource.prototype.getTile = function(z,x,y,callback) { - var key = [z,x,y].join('.'); - if (callback.scale == undefined) { - return callback(new Error("Expected the callback to carry through scale option")); + const key = [z,x,y].join('.'); + if (callback.scale === undefined) { + return callback(new Error('Expected the callback to carry through scale option')); } - if (callback.legacy == undefined) { - return callback(new Error("Expected the callback to carry through legacy option")); + if (callback.legacy === undefined) { + return callback(new Error('Expected the callback to carry through legacy option')); } - if (callback.upgrade == undefined) { - return callback(new Error("Expected the callback to carry through upgrade option")); + if (callback.upgrade === undefined) { + return callback(new Error('Expected the callback to carry through upgrade option')); } // Count number of times each key is requested for tests. @@ -174,7 +175,7 @@ Testsource.prototype.getTile = function(z,x,y,callback) { this.stats[key]++; // Headers. - var headers = { + const headers = { 'Last-Modified': Testsource.now.toUTCString(), 'ETag':'73f12a518adef759138c142865287a18', 'Content-Type':'application/x-protobuf' diff --git a/test/tile-profiler.js b/test/tile-profiler.js index 4fa5611..d456911 100644 --- a/test/tile-profiler.js +++ b/test/tile-profiler.js @@ -1,23 +1,24 @@ -var test = require('tape'); -var tilelive = require('@mapbox/tilelive'); -var Vector = require('..'); -var profiler = require('../tile-profiler'); -var Testsource = require('./testsource'); -var ss = require('simple-statistics'); -var fs = require('fs'); -var path = require('path'); -var zlib = require('zlib'); -var _ = require('underscore'); +'use strict'; + +const test = require('tape'); +const tilelive = require('@mapbox/tilelive'); +const Vector = require('..'); +const profiler = require('../tile-profiler'); +const Testsource = require('./testsource'); +const ss = require('simple-statistics'); +const fs = require('fs'); +const path = require('path'); +const _ = require('underscore'); // Tilelive test source. tilelive.protocols['test:'] = Testsource; -var xml = fs.readFileSync(path.resolve(__dirname + '/fixtures/a.xml'), 'utf8'); +const xml = fs.readFileSync(path.resolve(__dirname + '/fixtures/a.xml'), 'utf8'); -test('finds layer information', function(t) { - new Vector({ uri:'test:///a', xml: xml }, function(err, source) { +test('finds layer information', (t) => { + new Vector({ uri:'test:///a', xml: xml }, (err, source) => { t.ifError(err); - var cb = function(err, vtile, headers) { + const cb = function(err, vtile, headers) { t.ifError(err); t.ok(vtile._layerInfo); t.end(); @@ -27,16 +28,16 @@ test('finds layer information', function(t) { }); }); -test('returns expected layer information', function(t) { - new Vector({ uri:'test:///a', xml: xml }, function(err, source) { +test('returns expected layer information', (t) => { + new Vector({ uri:'test:///a', xml: xml }, (err, source) => { t.ifError(err); - source._backend.getTile(0,0,0, function(err, vtile, headers) { + source._backend.getTile(0,0,0, (err, vtile, headers) => { if (err) throw err; - var tile = vtile; - var layerInfo = profiler.layerInfo(tile); + const tile = vtile; + const layerInfo = profiler.layerInfo(tile); // Tile has a 'coastline' layer - var coastline = _(layerInfo).where({ name: 'coastline' })[0]; + const coastline = _(layerInfo).where({ name: 'coastline' })[0]; t.ok(coastline); // Tile contains 4177 features @@ -52,7 +53,7 @@ test('returns expected layer information', function(t) { t.equal(ss.min(coastline.duplicateCoordCount), 0); // Max/Min distance between consecutive coords - var diff = Math.abs(ss.max(coastline.coordDistance) - 570446.5598775251); + const diff = Math.abs(ss.max(coastline.coordDistance) - 570446.5598775251); t.ok(diff < 0.1); t.equal(ss.min(coastline.coordDistance), 1181.6043940629547); diff --git a/test/tm2z.js b/test/tm2z.js index 3db9547..3eb7efc 100644 --- a/test/tm2z.js +++ b/test/tm2z.js @@ -1,30 +1,25 @@ -var test = require('tape'); -var tilelive = require('@mapbox/tilelive'); -var TileJSON = require('@mapbox/tilejson'); -var url = require('url'); -var assert = require('assert'); -var path = require('path'); -var fs = require('fs'); -var crypto = require('crypto'); -var Vector = require('..'); +'use strict'; -function md5(str) { - return crypto.createHash('md5').update(str).digest('hex'); -} +const test = require('tape'); +const tilelive = require('@mapbox/tilelive'); +const TileJSON = require('@mapbox/tilejson'); +const path = require('path'); +const fs = require('fs'); +const Vector = require('..'); // skip tests that require s3 authentication if necessary // use ~$ TILELIVE_VECTOR_NO_AUTH=true npm test -var TILELIVE_VECTOR_NO_AUTH = (process.env.TILELIVE_VECTOR_NO_AUTH) ? process.env.TILELIVE_VECTOR_NO_AUTH : false; +const TILELIVE_VECTOR_NO_AUTH = (process.env.TILELIVE_VECTOR_NO_AUTH) ? process.env.TILELIVE_VECTOR_NO_AUTH : false; // Load fixture data. -var fixtureDir = path.resolve(__dirname, 'fixtures', 'tm2z'), +const fixtureDir = path.resolve(__dirname, 'fixtures', 'tm2z'), remotePath = 'http://mapbox.s3.amazonaws.com/tilelive-vector/test-tm2z.tm2z', xml = fs.readFileSync(path.join(fixtureDir, 'project', 'project.xml'), 'utf8'); // Register vector:, tm2z:, tm2z+http: and mapbox: tilelive protocols Vector.registerProtocols(tilelive); tilelive.protocols['mapbox:'] = function Source(uri, callback) { - var MapboxAccessToken = process.env.MapboxAccessToken; + const MapboxAccessToken = process.env.MapboxAccessToken; if (!MapboxAccessToken) return callback(new Error('env var MapboxAccessToken is required')); return new TileJSON('http://a.tiles.mapbox.com/v4' + uri.pathname + '.json?access_token=' + MapboxAccessToken, callback); }; @@ -32,10 +27,10 @@ tilelive.protocols['mapbox:'] = function Source(uri, callback) { // Register font Vector.mapnik.register_fonts(path.join(__dirname, 'fonts', 'source-sans-pro')); -['cold', 'warm'].forEach(function(label) { - test(label + ': tm2z+http content length error', function(assert) { - var server = require('http').createServer(function(req, res) { - var buffer = fs.readFileSync(path.join(fixtureDir, 'patternstyle.tm2z')); +['cold', 'warm'].forEach((label) => { + test(label + ': tm2z+http content length error', (assert) => { + const server = require('http').createServer((req, res) => { + const buffer = fs.readFileSync(path.join(fixtureDir, 'patternstyle.tm2z')); res.setHeader('content-length', buffer.length); res.writeHead(200); res.write(buffer.slice(0,250e3)); @@ -44,7 +39,7 @@ Vector.mapnik.register_fonts(path.join(__dirname, 'fonts', 'source-sans-pro')); server.listen(9191, afterListen); function afterListen(err) { assert.ifError(err); - tilelive.load('tm2z+http://127.0.0.1:9191/patternstyle.tm2z', function(err, source) { + tilelive.load('tm2z+http://127.0.0.1:9191/patternstyle.tm2z', (err, source) => { assert.ok(err, 'has error'); assert.equal(err.code, undefined, 'not a mapnik error'); server.close(afterClose); @@ -57,8 +52,8 @@ Vector.mapnik.register_fonts(path.join(__dirname, 'fonts', 'source-sans-pro')); }); }); -test('tm2z+http ENOTFOUND or Z_DATA_ERROR', function(assert) { - tilelive.load('tm2z+http://not-a-valid-domain/patternstyle.tm2z', function(err, source) { +test('tm2z+http ENOTFOUND or Z_DATA_ERROR', (assert) => { + tilelive.load('tm2z+http://not-a-valid-domain/patternstyle.tm2z', (err, source) => { assert.ok(err, 'has error'); if (err.code && err.code === 'Z_DATA_ERROR') { assert.equal(err.code, 'Z_DATA_ERROR', 'code: Z_DATA_ERROR'); @@ -69,167 +64,167 @@ test('tm2z+http ENOTFOUND or Z_DATA_ERROR', function(assert) { }); }); -test('exposes the mapnik binding', function(t) { +test('exposes the mapnik binding', (t) => { t.ok(Vector.mapnik); t.end(); }); -test('direct load (string uri)', function(t) { - Vector.tm2z('tm2z://' + path.join(fixtureDir, 'project.tm2z'), function(err, source) { +test('direct load (string uri)', (t) => { + Vector.tm2z('tm2z://' + path.join(fixtureDir, 'project.tm2z'), (err, source) => { t.ifError(err); t.end(); }); }); -test('direct load (object uri)', function(t) { - Vector.tm2z({ protocol:'tm2z:', pathname: path.join(fixtureDir, 'project.tm2z') }, function(err, source) { +test('direct load (object uri)', (t) => { + Vector.tm2z({ protocol:'tm2z:', pathname: path.join(fixtureDir, 'project.tm2z') }, (err, source) => { t.ifError(err); t.end(); }); }); -test('loads a tm2z url', function(t) { - tilelive.load('tm2z://' + path.join(fixtureDir, 'project.tm2z'), function(err, source) { +test('loads a tm2z url', (t) => { + tilelive.load('tm2z://' + path.join(fixtureDir, 'project.tm2z'), (err, source) => { t.ifError(err); t.end(); }); }); -test('loads a tm2z url once', function(t) { - tilelive.load('tm2z://' + path.join(fixtureDir, 'doublecall.tm2z'), function(err, source) { +test('loads a tm2z url once', (t) => { + tilelive.load('tm2z://' + path.join(fixtureDir, 'doublecall.tm2z'), (err, source) => { t.ifError(err); t.end(); }); }); -test('matches expected xml', function(t) { - tilelive.load('tm2z://' + path.join(fixtureDir, 'project.tm2z'), function(err, source) { +test('matches expected xml', (t) => { + tilelive.load('tm2z://' + path.join(fixtureDir, 'project.tm2z'), (err, source) => { t.ifError(err); t.equal(source._xml, xml); t.end(); }); }); -test('gunzips then untars', function(t) { - tilelive.load('tm2z://' + path.join(fixtureDir, 'project.tar.gz'), function(err, source) { +test('gunzips then untars', (t) => { + tilelive.load('tm2z://' + path.join(fixtureDir, 'project.tar.gz'), (err, source) => { t.ifError(err); t.end(); }); }); -test('errors out if not gzipped', function(t) { - tilelive.load('tm2z://' + path.join(fixtureDir, 'project.tar'), function(err, source) { +test('errors out if not gzipped', (t) => { + tilelive.load('tm2z://' + path.join(fixtureDir, 'project.tar'), (err, source) => { t.equal(err.code, 'Z_DATA_ERROR'); t.equal(err.message, 'incorrect header check'); t.end(); }); }); -test('errors out on bad gunzip', function(t) { - tilelive.load('tm2z://' + path.join(fixtureDir, 'doublezip.tm2z'), function(err, source) { +test('errors out on bad gunzip', (t) => { + tilelive.load('tm2z://' + path.join(fixtureDir, 'doublezip.tm2z'), (err, source) => { t.equal(err.message, 'invalid tar file'); t.end(); }); }); -test('errors out if file size exceeds max size', function(t) { - tilelive.load('tm2z://' + path.join(fixtureDir, 'filesize.tm2z'), function(err, source) { +test('errors out if file size exceeds max size', (t) => { + tilelive.load('tm2z://' + path.join(fixtureDir, 'filesize.tm2z'), (err, source) => { t.equal(err instanceof RangeError, true); t.equal(err.message, 'Upload size should not exceed 750KB.'); t.end(); }); }); -test('errors out if file size exceeds custom max size', function(t) { +test('errors out if file size exceeds custom max size', (t) => { tilelive.load({ protocol: 'tm2z:', pathname: path.join(fixtureDir, 'filesize.tm2z'), filesize: 500 * 1024 - }, function(err, source) { + }, (err, source) => { t.equal(err instanceof RangeError, true); t.equal(err.message, 'Upload size should not exceed 500KB.'); t.end(); }); }); -test('errors out if unzipped size exceeds max size', function(t) { - tilelive.load('tm2z://' + path.join(fixtureDir, 'gunzipsize.tm2z'), function(err, source) { +test('errors out if unzipped size exceeds max size', (t) => { + tilelive.load('tm2z://' + path.join(fixtureDir, 'gunzipsize.tm2z'), (err, source) => { t.equal(err instanceof RangeError, true); t.equal(err.message, 'Unzipped size should not exceed 5MB.'); t.end(); }); }); -test('errors out if unzipped size exceeds custom max size', function(t) { +test('errors out if unzipped size exceeds custom max size', (t) => { tilelive.load({ protocol: 'tm2z:', pathname: path.join(fixtureDir, 'gunzipsize.tm2z'), gunzipsize: 1024 * 1024 - }, function(err, source) { + }, (err, source) => { t.equal(err instanceof RangeError, true); t.equal(err.message, 'Unzipped size should not exceed 1MB.'); t.end(); }); }); -test('errors out if unzipped project.xml size exceeds max size', function(t) { - tilelive.load('tm2z://' + path.join(fixtureDir, 'xmlsize.tm2z'), function(err, source) { +test('errors out if unzipped project.xml size exceeds max size', (t) => { + tilelive.load('tm2z://' + path.join(fixtureDir, 'xmlsize.tm2z'), (err, source) => { t.equal(err instanceof RangeError, true); t.equal(err.message, 'Unzipped project.xml size should not exceed 750KB.'); t.end(); }); }); -test('errors out if unzipped project.xml size exceeds custom max size', function(t) { +test('errors out if unzipped project.xml size exceeds custom max size', (t) => { tilelive.load({ protocol: 'tm2z:', pathname: path.join(fixtureDir, 'xmlsize.tm2z'), xmlsize: 300 * 1024 - }, function(err, source) { + }, (err, source) => { t.equal(err instanceof RangeError, true); t.equal(err.message, 'Unzipped project.xml size should not exceed 300KB.'); t.end(); }); }); -test('errors out if not a directory', function(t) { - tilelive.load('tm2z://' + path.join(fixtureDir, 'nodirectory.tm2z'), function(err, source) { +test('errors out if not a directory', (t) => { + tilelive.load('tm2z://' + path.join(fixtureDir, 'nodirectory.tm2z'), (err, source) => { t.ok(err.message.indexOf('EISDIR') !== -1); t.end(); }); }); -test('errors out if missing project.xml', function(t) { - tilelive.load('tm2z://' + path.join(fixtureDir, 'empty.tm2z'), function(err, source) { +test('errors out if missing project.xml', (t) => { + tilelive.load('tm2z://' + path.join(fixtureDir, 'empty.tm2z'), (err, source) => { t.equal(err.message, 'project.xml not found in package'); t.end(); }); }); -test('errors out on invalid project.xml', function(t) { - tilelive.load('tm2z://' + path.join(fixtureDir, 'malformed.tm2z'), function(err, source) { +test('errors out on invalid project.xml', (t) => { + tilelive.load('tm2z://' + path.join(fixtureDir, 'malformed.tm2z'), (err, source) => { t.equal('EMAPNIK', err.code); // err.message on windows is completely different - //assert(err.message.split(':')[0], 'expected < at line 1'); + // assert(err.message.split(':')[0], 'expected < at line 1'); t.end(); }); }); -test('errors out if style references a missing font', function(t) { - tilelive.load('tm2z://' + path.join(fixtureDir, 'missing_font.tm2z'), function(err, source) { +test('errors out if style references a missing font', (t) => { + tilelive.load('tm2z://' + path.join(fixtureDir, 'missing_font.tm2z'), (err, source) => { t.equal('EMAPNIK', err.code); t.equal(err.message.split("'")[0], 'Failed to find font face '); t.end(); }); }); -test('does not error out if style references a registered font', function(t) { - tilelive.load('tm2z://' + path.join(fixtureDir, 'project.tm2z'), function(err, source) { +test('does not error out if style references a registered font', (t) => { + tilelive.load('tm2z://' + path.join(fixtureDir, 'project.tm2z'), (err, source) => { t.ifError(err); t.end(); }); }); -test('errors out if style references a missing image', function(t) { - tilelive.load('tm2z://' + path.join(fixtureDir, 'missing_image.tm2z'), function(err, source) { +test('errors out if style references a missing image', (t) => { + tilelive.load('tm2z://' + path.join(fixtureDir, 'missing_image.tm2z'), (err, source) => { t.equal('EMAPNIK', err.code); t.equal(err.message.split(':')[0], 'file could not be found'); t.end(); }); }); -test('errors out if style causes parse error', function(t) { - tilelive.load('tm2z://' + path.join(fixtureDir, 'invalid_parsecolor.tm2z'), function(err, source) { - source.getTile(3, 4, 3, function(err, run1, headers) { +test('errors out if style causes parse error', (t) => { + tilelive.load('tm2z://' + path.join(fixtureDir, 'invalid_parsecolor.tm2z'), (err, source) => { + source.getTile(3, 4, 3, (err, run1, headers) => { t.equal('EMAPNIK', err.code); t.equal(err.message.split(':')[0], 'Failed to parse color'); t.end(); }); }); }); -test('profiles a tm2z file', function(t) { - tilelive.load('tm2z://' + path.join(fixtureDir, 'project-v6.tm2z'), function(err, source) { +test('profiles a tm2z file', (t) => { + tilelive.load('tm2z://' + path.join(fixtureDir, 'project-v6.tm2z'), (err, source) => { t.ifError(err); - source.profile(function(err, profile) { + source.profile((err, profile) => { t.ifError(err); t.deepEqual([ 'tiles', @@ -244,8 +239,8 @@ test('profiles a tm2z file', function(t) { t.deepEqual(['avg','min','max'], Object.keys(profile.loadtime)); t.deepEqual(['avg','min','max'], Object.keys(profile.srcbytes)); t.deepEqual(['avg','min','max'], Object.keys(profile.imgbytes)); - var expected_tiles = [ '0/0/0', '1/1/0', '2/2/1', '3/4/3', '4/9/6', '5/19/12', '6/39/24', '7/79/48', '8/159/96', '9/319/193', '10/638/387', '11/1276/774', '12/2553/1548', '13/5107/3096', '14/10214/6192', '15/20429/12384', '16/40859/24769', '17/81718/49538', '18/163437/99077', '19/326874/198154', '20/653749/396308', '21/1307499/792616', '22/2614998/1585232' ]; - var actual_tiles = profile.tiles.map(function(t) { return t.z + '/' + t.x + '/' + t.y }); + const expected_tiles = ['0/0/0', '1/1/0', '2/2/1', '3/4/3', '4/9/6', '5/19/12', '6/39/24', '7/79/48', '8/159/96', '9/319/193', '10/638/387', '11/1276/774', '12/2553/1548', '13/5107/3096', '14/10214/6192', '15/20429/12384', '16/40859/24769', '17/81718/49538', '18/163437/99077', '19/326874/198154', '20/653749/396308', '21/1307499/792616', '22/2614998/1585232']; + const actual_tiles = profile.tiles.map((t) => { return t.z + '/' + t.x + '/' + t.y; }); // Note: due to frequent data instability in upstream data // we only test the # of tiles now and not the exact z/x/y // https://github.com/mapbox/tilelive-vector/pull/134 @@ -256,10 +251,10 @@ test('profiles a tm2z file', function(t) { }); }); }); -test('profiles tm2z with very southern data', function(t) { - tilelive.load('tm2z://' + path.join(fixtureDir, 'invalid.tm2z'), function(err, source) { +test('profiles tm2z with very southern data', (t) => { + tilelive.load('tm2z://' + path.join(fixtureDir, 'invalid.tm2z'), (err, source) => { t.ifError(err); - source.profile(function(err, profile) { + source.profile((err, profile) => { t.ifError(err); t.deepEqual([ 'tiles', @@ -274,42 +269,42 @@ test('profiles tm2z with very southern data', function(t) { }); }); -test('loads a tm2z+http url', function(t) { - tilelive.load('tm2z+' + remotePath, function(err, source) { +test('loads a tm2z+http url', (t) => { + tilelive.load('tm2z+' + remotePath, (err, source) => { t.ifError(err); t.end(); }); }); -test('matches expected xml', function(t) { - tilelive.load('tm2z+' + remotePath, function(err, source) { +test('matches expected xml', (t) => { + tilelive.load('tm2z+' + remotePath, (err, source) => { t.ifError(err); t.equal(xml, source._xml); t.end(); }); }); -test('errors out on an invalid S3 url', function(t) { - tilelive.load('tm2z+http://mapbox.s3.amazonaws.com/tilelive-vector/invalid.tm2z', function(err, source) { +test('errors out on an invalid S3 url', (t) => { + tilelive.load('tm2z+http://mapbox.s3.amazonaws.com/tilelive-vector/invalid.tm2z', (err, source) => { t.equal('Z_DATA_ERROR', err.code); t.end(); }); }); -test('errors out on private object with tm2z+http protocol', {skip: TILELIVE_VECTOR_NO_AUTH}, function(t) { - tilelive.load('tm2z+http://mapbox.s3.amazonaws.com/tilelive-vector/test-tm2z-private.tm2z', function(err, source) { +test('errors out on private object with tm2z+http protocol', { skip: TILELIVE_VECTOR_NO_AUTH }, (t) => { + tilelive.load('tm2z+http://mapbox.s3.amazonaws.com/tilelive-vector/test-tm2z-private.tm2z', (err, source) => { t.equal('Z_DATA_ERROR', err.code); t.end(); }); }); -test('load private tm2z from s3 using tm2z+s3 protocol', {skip: TILELIVE_VECTOR_NO_AUTH}, function(t) { - tilelive.load('tm2z+s3://mapbox/tilelive-vector/test-tm2z-private.tm2z', function(err, source) { +test('load private tm2z from s3 using tm2z+s3 protocol', { skip: TILELIVE_VECTOR_NO_AUTH }, (t) => { + tilelive.load('tm2z+s3://mapbox/tilelive-vector/test-tm2z-private.tm2z', (err, source) => { t.ifError(err); t.end(); }); }); -test('errors out on tm2z file on s3 where we do not have access', {skip: TILELIVE_VECTOR_NO_AUTH}, function(t) { - tilelive.load('tm2z+s3://example/does-not-exist.tm2z', function(err, source) { +test('errors out on tm2z file on s3 where we do not have access', { skip: TILELIVE_VECTOR_NO_AUTH }, (t) => { + tilelive.load('tm2z+s3://example/does-not-exist.tm2z', (err, source) => { t.equal(err.code, 'AccessDenied'); t.end(); }); diff --git a/test/xray.js b/test/xray.js index a5624d4..712f75c 100644 --- a/test/xray.js +++ b/test/xray.js @@ -1,124 +1,126 @@ -var test = require('tape'); -var tilelive = require('@mapbox/tilelive'); -var imageEqualsFile = require('./image.js'); -var Testsource = require('./testsource'); -var xray = require('..').xray; -var fs = require('fs'); -var UPDATE = process.env.UPDATE; -var path = require('path'); +'use strict'; + +const test = require('tape'); +const tilelive = require('@mapbox/tilelive'); +const imageEqualsFile = require('./image.js'); +const Testsource = require('./testsource'); +const xray = require('..').xray; +const fs = require('fs'); +const UPDATE = process.env.UPDATE; +const path = require('path'); // Tilelive test source. tilelive.protocols['test:'] = Testsource; -test('invalid', function(t) { - new xray({}, function(err) { +test('invalid', (t) => { + xray({}, (err) => { t.equal('Error: opts.uri or opts.source must be set', err.toString()); t.end(); }); }); -test('invalid-novector', function(t) { - new xray({uri:'test:///invalid-novector'}, function(err) { +test('invalid-novector', (t) => { + xray({ uri:'test:///invalid-novector' }, (err) => { t.equal('Error: source must contain a vector_layers property', err.toString()); t.end(); }); }); -test('loads uri', function(t) { - new xray({uri:'test:///a'}, function(err, source) { +test('loads uri', (t) => { + xray({ uri:'test:///a' }, (err, source) => { t.ifError(err); t.ok(!!source); - source.getTile(0,0,0, function(err,buffer) { + source.getTile(0,0,0, (err,buffer) => { t.ifError(err); if (UPDATE) { fs.writeFileSync(path.join(__dirname, 'expected', 'xray-a-0-0-0.png'), buffer); } - imageEqualsFile(buffer, path.join(__dirname, 'expected', 'xray-a-0-0-0.png'), function(err) { + imageEqualsFile(buffer, path.join(__dirname, 'expected', 'xray-a-0-0-0.png'), (err) => { t.ifError(err); t.end(); }); }); }); }); -test('loads uri + transparent', function(t) { - new xray({uri:'test:///a', transparent:true}, function(err, source) { +test('loads uri + transparent', (t) => { + xray({ uri:'test:///a', transparent:true }, (err, source) => { t.ifError(err); t.ok(!!source); - source.getTile(0,0,0, function(err,buffer) { + source.getTile(0,0,0, (err,buffer) => { t.ifError(err); if (UPDATE) { fs.writeFileSync(path.join(__dirname, 'expected', 'xray-a-0-0-0-transparent.png'), buffer); } - imageEqualsFile(buffer, path.join(__dirname, 'expected', 'xray-a-0-0-0-transparent.png'), function(err) { + imageEqualsFile(buffer, path.join(__dirname, 'expected', 'xray-a-0-0-0-transparent.png'), (err) => { t.ifError(err); t.end(); }); }); }); }); -test('loads source', function(t) { - var source = new Testsource('a'); - new xray({ +test('loads source', (t) => { + const source = new Testsource('a'); + xray({ source: source, minzoom: 0, maxzoom: 1, vector_layers: [{ id:'coastline' }] - }, function(err, source) { + }, (err, source) => { t.ifError(err); t.ok(!!source); t.end(); }); }); -test('loads raster source', function(t) { - new xray({uri:'test:///i'}, function(err, source) { +test('loads raster source', (t) => { + xray({ uri:'test:///i' }, (err, source) => { t.ifError(err); t.ok(!!source); - source.getTile(0,0,0, function(err,buffer) { + source.getTile(0,0,0, (err,buffer) => { t.ifError(err); if (UPDATE) { fs.writeFileSync(__dirname + '/expected/xray-i-0-0-0.png', buffer); } - imageEqualsFile(buffer, __dirname + '/expected/xray-i-0-0-0.png', function(err) { + imageEqualsFile(buffer, __dirname + '/expected/xray-i-0-0-0.png', (err) => { t.ifError(err); t.end(); }); }); }); }); -test('color', function(t) { - var results = { +test('color', (t) => { + const results = { '': [68,68,68], 'a': [68,170,68], 'ab': [68,170,85], 'world': [136,221,102], 'rivers and lakes': [170,153,85] }; - for (var key in results) { + for (const key in results) { t.deepEqual(xray.color(key), results[key]); } t.end(); }); -test('xml', function(t) { - var results = { +test('xml', (t) => { + const results = { 'xray-single.xml': xray.xml({ map_properties: 'background-color="#000000"', vector_layers: [ - { "id": "coastline" } + { 'id': 'coastline' } ] }), 'xray-multi.xml': xray.xml({ map_properties: 'background-color="#000000"', vector_layers: [ - { "id": "coastline" }, - { "id": "countries" }, - { "id": "water" }, - { "id": "landuse" } + { 'id': 'coastline' }, + { 'id': 'countries' }, + { 'id': 'water' }, + { 'id': 'landuse' } ] }) }; - for (var key in results) { + for (const key in results) { if (UPDATE) { fs.writeFileSync(path.join(__dirname, 'expected', key), results[key]); } - var expected = fs.readFileSync(path.join(__dirname, 'expected', key), 'utf8'); + const expected = fs.readFileSync(path.join(__dirname, 'expected', key), 'utf8'); t.equal(expected, results[key]); } t.end(); diff --git a/tile-profiler.js b/tile-profiler.js index fc8f66c..c8e076b 100644 --- a/tile-profiler.js +++ b/tile-profiler.js @@ -1,15 +1,17 @@ -var _ = require('underscore'); -var spherical = require('spherical'); +'use strict'; + +const _ = require('underscore'); +const spherical = require('spherical'); module.exports = { layerInfo: function(vtile) { - var jsonsizes = vtile.toJSON().reduce(function(memo, l) { + const jsonsizes = vtile.toJSON().reduce((memo, l) => { memo[l.name] = JSON.stringify(l).length; return memo; }, {}); - return JSON.parse(vtile.toGeoJSON('__array__')).map(function(layer) { - var info = { + return JSON.parse(vtile.toGeoJSON('__array__')).map((layer) => { + const info = { name: layer.name, // name of the layer coordCount: [], // # coords per feature duplicateCoordCount: [], // # duplicate coords per feature @@ -24,8 +26,8 @@ module.exports = { }; function featureDetails(info, feature) { - var coords = flattenGeoJsonCoords(feature.geometry); - var coordDistances = coords.map(findDistances); + const coords = flattenGeoJsonCoords(feature.geometry); + const coordDistances = coords.map(findDistances); coordDistances.shift(); info.coordCount.push(coords.length); @@ -48,8 +50,8 @@ function findDistances(coord, index, coordinates) { } function flattenGeoJsonCoords(geometry) { - if (geometry.type === 'Point') return [ geometry.coordinates ]; + if (geometry.type === 'Point') return [geometry.coordinates]; if (geometry.type === 'LineString' || geometry.type === 'MultiPoint') return geometry.coordinates; - if (geometry.type == 'Polygon' || geometry.type === 'MultiLineString') return _(geometry.coordinates).flatten(true); + if (geometry.type === 'Polygon' || geometry.type === 'MultiLineString') return _(geometry.coordinates).flatten(true); if (geometry.type === 'MultiPolygon') return _(geometry.coordinates).flatten(); }