diff --git a/.travis.yml b/.travis.yml index 671832f0..8492e564 100644 --- a/.travis.yml +++ b/.travis.yml @@ -11,6 +11,7 @@ addons: - libgif-dev before_install: + - npm install -g npm@2 - createdb template_postgis - psql -c "CREATE EXTENSION postgis" template_postgis diff --git a/NEWS.md b/NEWS.md index 57a77b30..44ce75d1 100644 --- a/NEWS.md +++ b/NEWS.md @@ -1,10 +1,34 @@ # Changelog -## 2.20.1 +## 2.22.1 Released 2016-mm-dd +## 2.22.0 + +Released 2016-02-08 + +Announcements: + - Upgrades windshaft to [1.8.3](https://github.com/CartoDB/Windshaft/releases/tag/1.8.3) + + +## 2.21.1 + +Released 2016-02-05 + +Bug fixes: + - Added default config for geojson renderer + + +## 2.21.0 + +Released 2016-02-04 + +Announcements: + - Upgrades windshaft to [1.8.2](https://github.com/CartoDB/Windshaft/releases/tag/1.8.2) + + ## 2.20.0 Released 2016-01-20 @@ -824,7 +848,7 @@ Released 2014-03-10 Enhancements: - - Set statsd prefix for all endpoints + - Set statsd prefix for all endpoints - Respond with a permission denied on attempt to access map tiles waiving signature of someone who had not left any (#170) - Do not log an error on GET / (#177) @@ -864,7 +888,7 @@ Released 2014-02-27 Enhancements: - Upgrades windshaft to 0.19.1 with many performance improvements, - See node_modules/windshaft/NEWS + See node_modules/windshaft/NEWS - Improve speed of instanciating a map (#147, #159, #165) - Give meaningful error on attempts to use map tokens with attribute service (#156) @@ -953,7 +977,7 @@ Bug fixes: Released 2014-01-30 -Bug fixes: +Bug fixes: * layergroup accept both map_key and api_key (#91) * Fix public instanciation of signed template accessing private data (#114) @@ -1076,7 +1100,7 @@ Released 2013-10-03 "[ zoom > 3]" CartoCSS snippets (note the space) * Fix backward compatibility handling of sqlapi.host configuration (#82) * Fix error for invalid text-name in CartoCSS (#81) -* Do not let anonymous requests use authorized renderer caches +* Do not let anonymous requests use authorized renderer caches ## 1.3.4 @@ -1123,7 +1147,7 @@ NOTE: configuration sqlapi.host renamed to sqlapi.domain * Multilayer API changes * Layers passed by index in grid fetching url * Interactivity only specified in layergroup config - * Embed cache_buster within token + * Embed cache_buster within token * Use ISO format for last_modified timestamp * Expected LZMA encoding changed to base64 @@ -1177,7 +1201,7 @@ Released DD//MM//YY Released DD//MM//YY -* Reduce default extent to allow for consistent proj4 round-tripping +* Reduce default extent to allow for consistent proj4 round-tripping * Enhance reset_styles script to use full configuration (#62) * Have reset_styles script also drop extended keys (#58) * Fix example postgis parameter for simplifying input geoms (#63) @@ -1227,7 +1251,7 @@ Released (30/10/12) * Autodetect target mapnik version and let config override it * Add tools/reset_styles script to batch-reset (and optionally convert) styles * Configurable logging format (#4) -* Detailed error on missing user metadata +* Detailed error on missing user metadata * Properly handle unauthenticated requests for metadata * Accept "api_key" in addition to "map_key", both in query_string and POST body (#38) diff --git a/config/environments/development.js.example b/config/environments/development.js.example index bf98ca23..8a1cc7ad 100644 --- a/config/environments/development.js.example +++ b/config/environments/development.js.example @@ -13,7 +13,7 @@ var config = { // Base URLs for the APIs // // See http://github.com/CartoDB/Windshaft-cartodb/wiki/Unified-Map-API - // + // // Base url for the Templated Maps API // "/api/v1/map/named" is the new API, // "/tiles/template" is for compatibility with versions up to 1.6.x @@ -33,7 +33,7 @@ var config = { // to be able to navigate the map without a reload ? // Defaults to 7200 (2 hours) ,mapConfigTTL: 7200 - // idle socket timeout, in milliseconds + // idle socket timeout, in milliseconds ,socket_timeout: 600000 ,enable_cors: true ,cache_enabled: false @@ -147,7 +147,24 @@ var config = { // memory. If we want to enforce this behaviour we have to implement a cache eviction policy for the // internal cache. cacheOnTimeout: true + }, + + geojson: { + dbPoolParams: { + // maximum number of resources to create at any given time + size: 16, + // max milliseconds a resource can go unused before it should be destroyed + idleTimeout: 3000, + // frequency to check for idle resources + reapInterval: 1000 + }, + + // SQL queries will be wrapped with ST_ClipByBox2D + // Returning the portion of a geometry falling within a rectangle + // It will only work if snapToGrid is enabled + clipByBox2d: false, // this requires postgis >=2.2 and geos >=3.5 } + }, http: { timeout: 2000, // the timeout in ms for a http tile request @@ -232,7 +249,7 @@ var config = { serviceId: 'wadus_service_id' } // If useProfiler is true every response will be served with an - // X-Tiler-Profile header containing elapsed timing for various + // X-Tiler-Profile header containing elapsed timing for various // steps taken for producing the response. ,useProfiler:true // Settings for the health check available at /health @@ -250,7 +267,10 @@ var config = { // whether it should intercept tile render errors an act based on them, enabled by default. onTileErrorStrategy: true, // whether the affected tables for a given SQL must query directly postgresql or use the SQL API - cdbQueryTablesFromPostgres: true + cdbQueryTablesFromPostgres: true, + // whether in mapconfig is available stats & metadata for each layer + layerMetadata: true + } }; diff --git a/config/environments/production.js.example b/config/environments/production.js.example index 386f4433..73c68f1d 100644 --- a/config/environments/production.js.example +++ b/config/environments/production.js.example @@ -13,7 +13,7 @@ var config = { // Base URLs for the APIs // // See http://github.com/CartoDB/Windshaft-cartodb/wiki/Unified-Map-API - // + // // Base url for the Templated Maps API // "/api/v1/map/named" is the new API, // "/tiles/template" is for compatibility with versions up to 1.6.x @@ -34,7 +34,7 @@ var config = { // Defaults to 7200 (2 hours) ,mapConfigTTL: 7200 // idle socket timeout, in milliseconds - ,socket_timeout: 600000 + ,socket_timeout: 600000 ,enable_cors: true ,cache_enabled: true ,log_format: ':req[X-Real-IP] :method :req[Host]:url :status :response-time ms -> :res[Content-Type] (:res[X-Tiler-Profiler])' @@ -141,7 +141,24 @@ var config = { // memory. If we want to enforce this behaviour we have to implement a cache eviction policy for the // internal cache. cacheOnTimeout: true + }, + + geojson: { + dbPoolParams: { + // maximum number of resources to create at any given time + size: 16, + // max milliseconds a resource can go unused before it should be destroyed + idleTimeout: 3000, + // frequency to check for idle resources + reapInterval: 1000 + }, + + // SQL queries will be wrapped with ST_ClipByBox2D + // Returning the portion of a geometry falling within a rectangle + // It will only work if snapToGrid is enabled + clipByBox2d: false, // this requires postgis >=2.2 and geos >=3.5 } + }, http: { timeout: 2000, // the timeout in ms for a http tile request @@ -226,7 +243,7 @@ var config = { serviceId: 'wadus_service_id' } // If useProfiler is true every response will be served with an - // X-Tiler-Profile header containing elapsed timing for various + // X-Tiler-Profile header containing elapsed timing for various // steps taken for producing the response. ,useProfiler:false ,serverMetadata: { @@ -250,7 +267,9 @@ var config = { // whether it should intercept tile render errors an act based on them, enabled by default. onTileErrorStrategy: true, // whether the affected tables for a given SQL must query directly postgresql or use the SQL API - cdbQueryTablesFromPostgres: true + cdbQueryTablesFromPostgres: true, + // whether in mapconfig is available stats & metadata for each layer + layerMetadata: false } }; diff --git a/config/environments/staging.js.example b/config/environments/staging.js.example index f692d2ba..f81b88f7 100644 --- a/config/environments/staging.js.example +++ b/config/environments/staging.js.example @@ -13,7 +13,7 @@ var config = { // Base URLs for the APIs // // See http://github.com/CartoDB/Windshaft-cartodb/wiki/Unified-Map-API - // + // // Base url for the Templated Maps API // "/api/v1/maps/named" is the new API, // "/tiles/template" is for compatibility with versions up to 1.6.x @@ -34,7 +34,7 @@ var config = { // Defaults to 7200 (2 hours) ,mapConfigTTL: 7200 // idle socket timeout, in milliseconds - ,socket_timeout: 600000 + ,socket_timeout: 600000 ,enable_cors: true ,cache_enabled: true ,log_format: ':req[X-Real-IP] :method :req[Host]:url :status :response-time ms (:res[X-Tiler-Profiler]) -> :res[Content-Type]' @@ -141,7 +141,24 @@ var config = { // memory. If we want to enforce this behaviour we have to implement a cache eviction policy for the // internal cache. cacheOnTimeout: true + }, + + geojson: { + dbPoolParams: { + // maximum number of resources to create at any given time + size: 16, + // max milliseconds a resource can go unused before it should be destroyed + idleTimeout: 3000, + // frequency to check for idle resources + reapInterval: 1000 + }, + + // SQL queries will be wrapped with ST_ClipByBox2D + // Returning the portion of a geometry falling within a rectangle + // It will only work if snapToGrid is enabled + clipByBox2d: false, // this requires postgis >=2.2 and geos >=3.5 } + }, http: { timeout: 2000, // the timeout in ms for a http tile request @@ -226,7 +243,7 @@ var config = { serviceId: 'wadus_service_id' } // If useProfiler is true every response will be served with an - // X-Tiler-Profile header containing elapsed timing for various + // X-Tiler-Profile header containing elapsed timing for various // steps taken for producing the response. ,useProfiler:true ,serverMetadata: { @@ -250,7 +267,9 @@ var config = { // whether it should intercept tile render errors an act based on them, enabled by default. onTileErrorStrategy: true, // whether the affected tables for a given SQL must query directly postgresql or use the SQL API - cdbQueryTablesFromPostgres: true + cdbQueryTablesFromPostgres: true, + // whether in mapconfig is available stats & metadata for each layer + layerMetadata: true } }; diff --git a/config/environments/test.js.example b/config/environments/test.js.example index 13132e9a..0400be6e 100644 --- a/config/environments/test.js.example +++ b/config/environments/test.js.example @@ -13,7 +13,7 @@ var config = { // Base URLs for the APIs // // See https://github.com/CartoDB/Windshaft-cartodb/wiki/Unified-Map-API - // + // // Base url for the Templated Maps API // "/api/v1/map/named" is the new API, // "/tiles/template" is for compatibility with versions up to 1.6.x @@ -34,7 +34,7 @@ var config = { // Defaults to 7200 (2 hours) ,mapConfigTTL: 7200 // idle socket timeout, in milliseconds - ,socket_timeout: 600000 + ,socket_timeout: 600000 ,enable_cors: true ,cache_enabled: false ,log_format: '[:date] :req[X-Real-IP] :method :req[Host]:url :status :response-time ms -> :res[Content-Type] (:res[X-Tiler-Profiler])' @@ -141,6 +141,22 @@ var config = { // memory. If we want to enforce this behaviour we have to implement a cache eviction policy for the // internal cache. cacheOnTimeout: true + }, + + geojson: { + dbPoolParams: { + // maximum number of resources to create at any given time + size: 16, + // max milliseconds a resource can go unused before it should be destroyed + idleTimeout: 3000, + // frequency to check for idle resources + reapInterval: 1000 + }, + + // SQL queries will be wrapped with ST_ClipByBox2D + // Returning the portion of a geometry falling within a rectangle + // It will only work if snapToGrid is enabled + clipByBox2d: false // this requires postgis >=2.2 and geos >=3.5 } }, http: { @@ -228,7 +244,7 @@ var config = { serviceId: 'wadus_service_id' } // If useProfiler is true every response will be served with an - // X-Tiler-Profile header containing elapsed timing for various + // X-Tiler-Profile header containing elapsed timing for various // steps taken for producing the response. ,useProfiler:true // Settings for the health check available at /health @@ -246,7 +262,9 @@ var config = { // whether it should intercept tile render errors an act based on them, enabled by default. onTileErrorStrategy: true, // whether the affected tables for a given SQL must query directly postgresql or use the SQL API - cdbQueryTablesFromPostgres: true + cdbQueryTablesFromPostgres: true, + // whether in mapconfig is available stats & metadata for each layer + layerMetadata: true } }; diff --git a/docs/Map-API.md b/docs/Map-API.md index bb74d209..df411259 100644 --- a/docs/Map-API.md +++ b/docs/Map-API.md @@ -1,6 +1,6 @@ # Maps API -The CartoDB Maps API allows you to generate maps based on data hosted in your CartoDB account and you can apply custom SQL and CartoCSS to the data. The API generates a XYZ-based URL to fetch Web Mercator projected tiles using web clients such as [Leaflet](http://leafletjs.com), [Google Maps](https://developers.google.com/maps/), or [OpenLayers](http://openlayers.org/). +The CartoDB Maps API allows you to generate maps based on data hosted in your CartoDB account and apply custom SQL and CartoCSS to the data. The API generates a XYZ-based URL to fetch Web Mercator projected tiles, using web clients such as [Leaflet](http://leafletjs.com), [Google Maps](https://developers.google.com/maps/), or [OpenLayers](http://openlayers.org/). You can create two types of maps with the Maps API: diff --git a/docs/anonymous_maps.md b/docs/anonymous_maps.md index ead1ce96..02d35dc9 100644 --- a/docs/anonymous_maps.md +++ b/docs/anonymous_maps.md @@ -28,7 +28,7 @@ POST /api/v1/map } ``` -Should be a [Mapconfig](https://github.com/CartoDB/Windshaft/blob/0.44.1/doc/MapConfig-1.3.0.md). +See [MapConfig File Formats](http://docs.cartodb.com/cartodb-platform/maps-api/mapconfig/) for details. #### Response diff --git a/docs/named_maps.md b/docs/named_maps.md index 62dd44bd..4dac6d5c 100644 --- a/docs/named_maps.md +++ b/docs/named_maps.md @@ -1,6 +1,6 @@ # Named Maps -Named maps are essentially the same as anonymous maps except the MapConfig is stored on the server and the map is given a unique name. Two other big differences are: you can create named maps from private data and that users without an API Key can see them even though they are from that private data. +Named maps are essentially the same as anonymous maps except the MapConfig is stored on the server, and the map is given a unique name. You can create named maps from private data, and users without an API Key can view your Named Map (while keeping your data private). The Named map workflow consists of making a call to your database, referencing a table, inserting your variables into the template where placeholders are defined, and creating custom queries. The main two differences compared to anonymous maps are: @@ -12,7 +12,7 @@ The main two differences compared to anonymous maps are: Template maps are persistent with no preset expiration. They can only be created or deleted by a CartoDB user with a valid API_KEY (see auth section). -**Note:** There is a limit of 4,096 named maps allowed per account. If you need to create more Named Maps, it is recommended to use templates. +**Note:** There is a limit of 4,096 named maps allowed per account. If you need to create more Named maps, it is recommended to use templates. ## Create @@ -91,7 +91,7 @@ auth | |_ method | `"token"` or `"open"` (the default if no `"method"` is given). |_ valid_tokens | when `"method"` is set to `"token"`, the values listed here allow you to instantiate the named map. placeholders | Variables not listed here are not substituted. Variables not provided at instantiation time trigger an error. A default is required for optional variables. Type specification is used for quoting, to avoid injections see template format section below. -layergroup | the layer list definition. This is the MapConfig explained in anonymous maps. See [MapConfig documentation](https://github.com/CartoDB/Windshaft/blob/0.44.1/doc/MapConfig-1.3.0.md) for more info. +layergroup | the layer list definition. This is the MapConfig explained in anonymous maps. See [MapConfig File Format](http://docs.cartodb.com/cartodb-platform/maps-api/mapconfig/) for more info. view (optional) | extra keys to specify the compelling area for the map. It can be used to have a static preview of a named map without having to instantiate it. It is possible to specify it with `center` + `zoom` or with a bounding box `bbox`. Center+zoom takes precedence over bounding box. --- | --- @@ -437,7 +437,7 @@ curl -X GET 'https://documentation.cartodb.com/api/v1/map/named/:template_name?a } ``` -## Use with CartoDB.js +## Use CartoDB.js to Create Named Maps Named maps can be used with CartoDB.js by specifying a named map in a layer source as follows. Named maps are treated almost the same as other layer source types in most other ways. ```js @@ -462,3 +462,11 @@ cartodb.createLayer('map_dom_id',layerSource) 1. [layer.setParams()](http://docs.cartodb.com/cartodb-platform/cartodb-js/api-methods/#layersetparamskey-value) allows you to change the template variables (in the placeholders object) via JavaScript 2. [layer.setAuthToken()](http://docs.cartodb.com/cartodb-platform/cartodb-js/api-methods/#layersetauthtokenauthtoken) allows you to set the auth tokens to create the layer + +### Complete Examples of Named Maps created with CartoDB.js + +- [Named map selectors with interaction](http://bl.ocks.org/ohasselblad/515a8af1f99d5e690484) + +- [Named map with interactivity and config file used to create it](http://bl.ocks.org/ohasselblad/d1a45b8ff5e7bd90cd68) + +- [Toggling sublayers in a Named Map](http://bl.ocks.org/ohasselblad/c1a0f4913610eec53cd3) diff --git a/docs/static_maps_api.md b/docs/static_maps_api.md index 1d6f3160..9c3c2d3d 100644 --- a/docs/static_maps_api.md +++ b/docs/static_maps_api.md @@ -127,7 +127,7 @@ By manipulating the `"urlTemplate"` custom basemaps can be used in generating st **CartoDB** -As described in the [Mapconfig documentation](https://github.com/CartoDB/Windshaft/blob/0.44.1/doc/MapConfig-1.3.0.md), a "cartodb" type layer is now just an alias to a "mapnik" type layer as above, intended for backwards compatibility. +As described in the [MapConfig File Format](http://docs.cartodb.com/cartodb-platform/maps-api/mapconfig/), a "cartodb" type layer is now just an alias to a "mapnik" type layer as above, intended for backwards compatibility. ```javascript { diff --git a/lib/cartodb/server_options.js b/lib/cartodb/server_options.js index ff2800f5..f1a70889 100644 --- a/lib/cartodb/server_options.js +++ b/lib/cartodb/server_options.js @@ -68,7 +68,16 @@ module.exports = { statsInterval: rendererConfig.statsInterval }, renderer: { - mapnik: rendererConfig.mapnik, + mapnik: _.defaults(rendererConfig.mapnik, { + geojson: { + dbPoolParams: { + size: 16, + idleTimeout: 3000, + reapInterval: 1000 + }, + clipByBox2d: false, + } + }), torque: rendererConfig.torque, http: rendererConfig.http }, diff --git a/npm-shrinkwrap.json b/npm-shrinkwrap.json index 7689461d..b545d61d 100644 --- a/npm-shrinkwrap.json +++ b/npm-shrinkwrap.json @@ -1,40 +1,40 @@ { "name": "windshaft-cartodb", - "version": "2.20.0", + "version": "2.22.0", "dependencies": { "body-parser": { "version": "1.14.2", - "from": "body-parser@~1.14.0", + "from": "body-parser@>=1.14.0 <1.15.0", "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.14.2.tgz", "dependencies": { "bytes": { - "version": "2.2.1", + "version": "2.2.0", "from": "bytes@2.2.0", "resolved": "https://registry.npmjs.org/bytes/-/bytes-2.2.0.tgz" }, "content-type": { "version": "1.0.1", - "from": "content-type@~1.0.1", + "from": "content-type@>=1.0.1 <1.1.0", "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.1.tgz" }, "depd": { "version": "1.1.0", - "from": "depd@~1.1.0", + "from": "depd@>=1.1.0 <1.2.0", "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.0.tgz" }, "http-errors": { "version": "1.3.1", - "from": "http-errors@~1.3.1", + "from": "http-errors@>=1.3.1 <1.4.0", "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.3.1.tgz", "dependencies": { "inherits": { "version": "2.0.1", - "from": "inherits@~2.0.1", + "from": "inherits@>=2.0.1 <2.1.0", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz" }, "statuses": { "version": "1.2.1", - "from": "statuses@1", + "from": "statuses@>=1.0.0 <2.0.0", "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.2.1.tgz" } } @@ -46,7 +46,7 @@ }, "on-finished": { "version": "2.3.0", - "from": "on-finished@~2.3.0", + "from": "on-finished@>=2.3.0 <2.4.0", "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", "dependencies": { "ee-first": { @@ -63,7 +63,7 @@ }, "raw-body": { "version": "2.1.5", - "from": "raw-body@~2.1.5", + "from": "raw-body@>=2.1.5 <2.2.0", "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.1.5.tgz", "dependencies": { "unpipe": { @@ -74,9 +74,9 @@ } }, "type-is": { - "version": "1.6.10", - "from": "type-is@~1.6.10", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.10.tgz", + "version": "1.6.11", + "from": "type-is@>=1.6.10 <1.7.0", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.11.tgz", "dependencies": { "media-typer": { "version": "0.3.0", @@ -85,12 +85,12 @@ }, "mime-types": { "version": "2.1.9", - "from": "mime-types@~2.1.8", + "from": "mime-types@>=2.1.2 <2.2.0", "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.9.tgz", "dependencies": { "mime-db": { "version": "1.21.0", - "from": "mime-db@~1.21.0", + "from": "mime-db@>=1.21.0 <1.22.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.21.0.tgz" } } @@ -101,12 +101,12 @@ }, "cartodb-psql": { "version": "0.4.0", - "from": "cartodb-psql@~0.4.0", + "from": "cartodb-psql@>=0.4.0 <0.5.0", "resolved": "https://registry.npmjs.org/cartodb-psql/-/cartodb-psql-0.4.0.tgz", "dependencies": { "pg": { "version": "2.6.2-cdb1", - "from": "pg@git://github.com/CartoDB/node-postgres.git#2.6.2-cdb1", + "from": "git://github.com/CartoDB/node-postgres.git#2.6.2-cdb1", "resolved": "git://github.com/CartoDB/node-postgres.git#836a2dc3131e873fc4ba20cd16e7fb69a7dca98a", "dependencies": { "generic-pool": { @@ -125,26 +125,27 @@ }, "cartodb-redis": { "version": "0.13.0", - "from": "cartodb-redis@~0.13.0", + "from": "cartodb-redis@>=0.13.0 <0.14.0", + "resolved": "https://registry.npmjs.org/cartodb-redis/-/cartodb-redis-0.13.0.tgz", "dependencies": { "redis-mpool": { "version": "0.1.0", - "from": "redis-mpool@git://github.com/CartoDB/node-redis-mpool.git#0.1.0", + "from": "git://github.com/CartoDB/node-redis-mpool.git#0.1.0", "resolved": "git://github.com/CartoDB/node-redis-mpool.git#47510b8d4525ee24aa2e5328976372274a1d144e", "dependencies": { "generic-pool": { "version": "2.1.1", - "from": "generic-pool@~2.1.1", + "from": "generic-pool@>=2.1.1 <2.2.0", "resolved": "https://registry.npmjs.org/generic-pool/-/generic-pool-2.1.1.tgz" }, "redis": { "version": "0.12.1", - "from": "redis@~0.12.1", + "from": "redis@>=0.12.1 <0.13.0", "resolved": "https://registry.npmjs.org/redis/-/redis-0.12.1.tgz" }, "hiredis": { "version": "0.1.17", - "from": "hiredis@~0.1.17", + "from": "hiredis@>=0.1.17 <0.2.0", "resolved": "https://registry.npmjs.org/hiredis/-/hiredis-0.1.17.tgz", "dependencies": { "bindings": { @@ -154,7 +155,7 @@ }, "nan": { "version": "1.1.2", - "from": "nan@~1.1.0", + "from": "nan@>=1.1.0 <1.2.0", "resolved": "https://registry.npmjs.org/nan/-/nan-1.1.2.tgz" } } @@ -165,7 +166,7 @@ }, "debug": { "version": "2.2.0", - "from": "debug@~2.2.0", + "from": "debug@>=2.2.0 <2.3.0", "resolved": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz", "dependencies": { "ms": { @@ -177,27 +178,27 @@ }, "dot": { "version": "1.0.3", - "from": "dot@~1.0.2", + "from": "dot@>=1.0.2 <1.1.0", "resolved": "https://registry.npmjs.org/dot/-/dot-1.0.3.tgz" }, "express": { - "version": "4.13.3", - "from": "express@~4.13.3", - "resolved": "https://registry.npmjs.org/express/-/express-4.13.3.tgz", + "version": "4.13.4", + "from": "express@>=4.13.3 <4.14.0", + "resolved": "https://registry.npmjs.org/express/-/express-4.13.4.tgz", "dependencies": { "accepts": { "version": "1.2.13", - "from": "accepts@~1.2.12", + "from": "accepts@>=1.2.12 <1.3.0", "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.2.13.tgz", "dependencies": { "mime-types": { "version": "2.1.9", - "from": "mime-types@~2.1.8", + "from": "mime-types@>=2.1.9 <2.2.0", "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.9.tgz", "dependencies": { "mime-db": { "version": "1.21.0", - "from": "mime-db@~1.21.0", + "from": "mime-db@>=1.21.0 <1.22.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.21.0.tgz" } } @@ -215,19 +216,19 @@ "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz" }, "content-disposition": { - "version": "0.5.0", - "from": "content-disposition@0.5.0", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.0.tgz" + "version": "0.5.1", + "from": "content-disposition@0.5.1", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.1.tgz" }, "content-type": { "version": "1.0.1", - "from": "content-type@~1.0.1", + "from": "content-type@>=1.0.1 <1.1.0", "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.1.tgz" }, "cookie": { - "version": "0.1.3", - "from": "cookie@0.1.3", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.1.3.tgz" + "version": "0.1.5", + "from": "cookie@0.1.5", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.1.5.tgz" }, "cookie-signature": { "version": "1.0.6", @@ -235,28 +236,28 @@ "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz" }, "depd": { - "version": "1.0.1", - "from": "depd@~1.0.1", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.0.1.tgz" + "version": "1.1.0", + "from": "depd@>=1.1.0 <1.2.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.0.tgz" }, "escape-html": { - "version": "1.0.2", - "from": "escape-html@1.0.2", - "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.2.tgz" + "version": "1.0.3", + "from": "escape-html@>=1.0.3 <1.1.0", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz" }, "etag": { "version": "1.7.0", - "from": "etag@~1.7.0", + "from": "etag@>=1.7.0 <1.8.0", "resolved": "https://registry.npmjs.org/etag/-/etag-1.7.0.tgz" }, "finalhandler": { - "version": "0.4.0", - "from": "finalhandler@0.4.0", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-0.4.0.tgz", + "version": "0.4.1", + "from": "finalhandler@0.4.1", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-0.4.1.tgz", "dependencies": { "unpipe": { "version": "1.0.0", - "from": "unpipe@~1.0.0", + "from": "unpipe@>=1.0.0 <1.1.0", "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz" } } @@ -267,18 +268,18 @@ "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.3.0.tgz" }, "merge-descriptors": { - "version": "1.0.0", - "from": "merge-descriptors@1.0.0", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.0.tgz" + "version": "1.0.1", + "from": "merge-descriptors@1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz" }, "methods": { "version": "1.1.2", - "from": "methods@~1.1.1", + "from": "methods@>=1.1.2 <1.2.0", "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz" }, "on-finished": { "version": "2.3.0", - "from": "on-finished@~2.3.0", + "from": "on-finished@>=2.3.0 <2.4.0", "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", "dependencies": { "ee-first": { @@ -290,7 +291,7 @@ }, "parseurl": { "version": "1.3.1", - "from": "parseurl@~1.3.0", + "from": "parseurl@>=1.3.1 <1.4.0", "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.1.tgz" }, "path-to-regexp": { @@ -300,12 +301,12 @@ }, "proxy-addr": { "version": "1.0.10", - "from": "proxy-addr@~1.0.8", + "from": "proxy-addr@>=1.0.10 <1.1.0", "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-1.0.10.tgz", "dependencies": { "forwarded": { "version": "0.1.0", - "from": "forwarded@~0.1.0", + "from": "forwarded@>=0.1.0 <0.2.0", "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.0.tgz" }, "ipaddr.js": { @@ -322,27 +323,27 @@ }, "range-parser": { "version": "1.0.3", - "from": "range-parser@~1.0.2", + "from": "range-parser@>=1.0.3 <1.1.0", "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.0.3.tgz" }, "send": { - "version": "0.13.0", - "from": "send@0.13.0", - "resolved": "https://registry.npmjs.org/send/-/send-0.13.0.tgz", + "version": "0.13.1", + "from": "send@0.13.1", + "resolved": "https://registry.npmjs.org/send/-/send-0.13.1.tgz", "dependencies": { "destroy": { - "version": "1.0.3", - "from": "destroy@1.0.3", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.3.tgz" + "version": "1.0.4", + "from": "destroy@>=1.0.4 <1.1.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz" }, "http-errors": { "version": "1.3.1", - "from": "http-errors@~1.3.1", + "from": "http-errors@>=1.3.1 <1.4.0", "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.3.1.tgz", "dependencies": { "inherits": { "version": "2.0.1", - "from": "inherits@~2.0.1", + "from": "inherits@>=2.0.1 <2.1.0", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz" } } @@ -359,71 +360,20 @@ }, "statuses": { "version": "1.2.1", - "from": "statuses@~1.2.1", + "from": "statuses@>=1.2.1 <1.3.0", "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.2.1.tgz" } } }, "serve-static": { "version": "1.10.2", - "from": "serve-static@~1.10.0", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.10.2.tgz", - "dependencies": { - "escape-html": { - "version": "1.0.3", - "from": "escape-html@~1.0.3", - "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz" - }, - "send": { - "version": "0.13.1", - "from": "send@0.13.1", - "resolved": "https://registry.npmjs.org/send/-/send-0.13.1.tgz", - "dependencies": { - "depd": { - "version": "1.1.0", - "from": "depd@~1.1.0", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.0.tgz" - }, - "destroy": { - "version": "1.0.4", - "from": "destroy@~1.0.4", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz" - }, - "http-errors": { - "version": "1.3.1", - "from": "http-errors@~1.3.1", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.3.1.tgz", - "dependencies": { - "inherits": { - "version": "2.0.1", - "from": "inherits@~2.0.1", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz" - } - } - }, - "mime": { - "version": "1.3.4", - "from": "mime@1.3.4", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.3.4.tgz" - }, - "ms": { - "version": "0.7.1", - "from": "ms@0.7.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz" - }, - "statuses": { - "version": "1.2.1", - "from": "statuses@~1.2.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.2.1.tgz" - } - } - } - } + "from": "serve-static@>=1.10.2 <1.11.0", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.10.2.tgz" }, "type-is": { - "version": "1.6.10", - "from": "type-is@~1.6.6", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.10.tgz", + "version": "1.6.11", + "from": "type-is@>=1.6.6 <1.7.0", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.11.tgz", "dependencies": { "media-typer": { "version": "0.3.0", @@ -432,12 +382,12 @@ }, "mime-types": { "version": "2.1.9", - "from": "mime-types@~2.1.8", + "from": "mime-types@>=2.1.9 <2.2.0", "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.9.tgz", "dependencies": { "mime-db": { "version": "1.21.0", - "from": "mime-db@~1.21.0", + "from": "mime-db@>=1.21.0 <1.22.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.21.0.tgz" } } @@ -451,14 +401,15 @@ }, "vary": { "version": "1.0.1", - "from": "vary@~1.0.1", + "from": "vary@>=1.0.1 <1.1.0", "resolved": "https://registry.npmjs.org/vary/-/vary-1.0.1.tgz" } } }, "fastly-purge": { "version": "1.0.1", - "from": "fastly-purge@~1.0.1" + "from": "fastly-purge@>=1.0.1 <1.1.0", + "resolved": "https://registry.npmjs.org/fastly-purge/-/fastly-purge-1.0.1.tgz" }, "log4js": { "version": "0.6.25", @@ -467,17 +418,17 @@ "dependencies": { "async": { "version": "0.2.10", - "from": "async@~0.2.0", + "from": "async@>=0.2.0 <0.3.0", "resolved": "https://registry.npmjs.org/async/-/async-0.2.10.tgz" }, "readable-stream": { "version": "1.0.33", - "from": "readable-stream@~1.0.2", + "from": "readable-stream@>=1.0.2 <1.1.0", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.33.tgz", "dependencies": { "core-util-is": { "version": "1.0.2", - "from": "core-util-is@~1.0.0", + "from": "core-util-is@>=1.0.0 <1.1.0", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz" }, "isarray": { @@ -487,19 +438,19 @@ }, "string_decoder": { "version": "0.10.31", - "from": "string_decoder@~0.10.x", + "from": "string_decoder@>=0.10.0 <0.11.0", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz" }, "inherits": { "version": "2.0.1", - "from": "inherits@~2.0.1", + "from": "inherits@>=2.0.1 <2.1.0", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz" } } }, "semver": { "version": "4.3.6", - "from": "semver@~4.3.3", + "from": "semver@>=4.3.3 <4.4.0", "resolved": "https://registry.npmjs.org/semver/-/semver-4.3.6.tgz" }, "underscore": { @@ -516,36 +467,37 @@ }, "lzma": { "version": "1.3.7", - "from": "lzma@~1.3.7", + "from": "lzma@>=1.3.7 <1.4.0", "resolved": "https://registry.npmjs.org/lzma/-/lzma-1.3.7.tgz" }, "node-statsd": { "version": "0.0.7", - "from": "node-statsd@~0.0.7", + "from": "node-statsd@>=0.0.7 <0.1.0", "resolved": "https://registry.npmjs.org/node-statsd/-/node-statsd-0.0.7.tgz" }, "queue-async": { "version": "1.0.7", - "from": "queue-async@~1.0.7", + "from": "queue-async@>=1.0.7 <1.1.0", "resolved": "https://registry.npmjs.org/queue-async/-/queue-async-1.0.7.tgz" }, "redis-mpool": { "version": "0.4.0", - "from": "redis-mpool@~0.4.0", + "from": "redis-mpool@>=0.4.0 <0.5.0", + "resolved": "https://registry.npmjs.org/redis-mpool/-/redis-mpool-0.4.0.tgz", "dependencies": { "generic-pool": { "version": "2.1.1", - "from": "generic-pool@~2.1.1", + "from": "generic-pool@>=2.1.1 <2.2.0", "resolved": "https://registry.npmjs.org/generic-pool/-/generic-pool-2.1.1.tgz" }, "redis": { "version": "0.12.1", - "from": "redis@~0.12.1", + "from": "redis@>=0.12.1 <0.13.0", "resolved": "https://registry.npmjs.org/redis/-/redis-0.12.1.tgz" }, "hiredis": { "version": "0.1.17", - "from": "hiredis@~0.1.17", + "from": "hiredis@>=0.1.17 <0.2.0", "resolved": "https://registry.npmjs.org/hiredis/-/hiredis-0.1.17.tgz", "dependencies": { "bindings": { @@ -555,7 +507,7 @@ }, "nan": { "version": "1.1.2", - "from": "nan@~1.1.0", + "from": "nan@>=1.1.0 <1.2.0", "resolved": "https://registry.npmjs.org/nan/-/nan-1.1.2.tgz" } } @@ -564,27 +516,27 @@ }, "request": { "version": "2.62.0", - "from": "request@~2.62.0", + "from": "request@>=2.62.0 <2.63.0", "resolved": "https://registry.npmjs.org/request/-/request-2.62.0.tgz", "dependencies": { "bl": { - "version": "1.0.1", - "from": "bl@~1.0.0", - "resolved": "https://registry.npmjs.org/bl/-/bl-1.0.1.tgz", + "version": "1.0.2", + "from": "bl@>=1.0.0 <1.1.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-1.0.2.tgz", "dependencies": { "readable-stream": { "version": "2.0.5", - "from": "readable-stream@~2.0.5", + "from": "readable-stream@>=2.0.5 <2.1.0", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.0.5.tgz", "dependencies": { "core-util-is": { "version": "1.0.2", - "from": "core-util-is@~1.0.0", + "from": "core-util-is@>=1.0.0 <1.1.0", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz" }, "inherits": { "version": "2.0.1", - "from": "inherits@~2.0.1", + "from": "inherits@>=2.0.0 <3.0.0", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz" }, "isarray": { @@ -594,17 +546,17 @@ }, "process-nextick-args": { "version": "1.0.6", - "from": "process-nextick-args@~1.0.6", + "from": "process-nextick-args@>=1.0.6 <1.1.0", "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.6.tgz" }, "string_decoder": { "version": "0.10.31", - "from": "string_decoder@~0.10.x", + "from": "string_decoder@>=0.10.0 <0.11.0", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz" }, "util-deprecate": { "version": "1.0.2", - "from": "util-deprecate@~1.0.1", + "from": "util-deprecate@>=1.0.1 <1.1.0", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz" } } @@ -613,61 +565,61 @@ }, "caseless": { "version": "0.11.0", - "from": "caseless@~0.11.0", + "from": "caseless@>=0.11.0 <0.12.0", "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.11.0.tgz" }, "extend": { "version": "3.0.0", - "from": "extend@~3.0.0", + "from": "extend@>=3.0.0 <3.1.0", "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.0.tgz" }, "forever-agent": { "version": "0.6.1", - "from": "forever-agent@~0.6.0", + "from": "forever-agent@>=0.6.0 <0.7.0", "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz" }, "form-data": { "version": "1.0.0-rc3", - "from": "form-data@~1.0.0-rc1", + "from": "form-data@>=1.0.0-rc1 <1.1.0", "resolved": "https://registry.npmjs.org/form-data/-/form-data-1.0.0-rc3.tgz", "dependencies": { "async": { "version": "1.5.2", - "from": "async@^1.4.0", + "from": "async@>=1.4.0 <2.0.0", "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz" } } }, "json-stringify-safe": { "version": "5.0.1", - "from": "json-stringify-safe@~5.0.0", + "from": "json-stringify-safe@>=5.0.0 <5.1.0", "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz" }, "mime-types": { "version": "2.1.9", - "from": "mime-types@~2.1.2", + "from": "mime-types@>=2.1.2 <2.2.0", "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.9.tgz", "dependencies": { "mime-db": { "version": "1.21.0", - "from": "mime-db@~1.21.0", + "from": "mime-db@>=1.21.0 <1.22.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.21.0.tgz" } } }, "node-uuid": { "version": "1.4.7", - "from": "node-uuid@~1.4.0", + "from": "node-uuid@>=1.4.0 <1.5.0", "resolved": "https://registry.npmjs.org/node-uuid/-/node-uuid-1.4.7.tgz" }, "qs": { "version": "5.1.0", - "from": "qs@~5.1.0", + "from": "qs@>=5.1.0 <5.2.0", "resolved": "https://registry.npmjs.org/qs/-/qs-5.1.0.tgz" }, "tunnel-agent": { "version": "0.4.2", - "from": "tunnel-agent@~0.4.0", + "from": "tunnel-agent@>=0.4.0 <0.5.0", "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.4.2.tgz" }, "tough-cookie": { @@ -677,12 +629,12 @@ }, "http-signature": { "version": "0.11.0", - "from": "http-signature@~0.11.0", + "from": "http-signature@>=0.11.0 <0.12.0", "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-0.11.0.tgz", "dependencies": { "assert-plus": { "version": "0.1.5", - "from": "assert-plus@^0.1.5", + "from": "assert-plus@>=0.1.5 <0.2.0", "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-0.1.5.tgz" }, "asn1": { @@ -698,150 +650,150 @@ } }, "oauth-sign": { - "version": "0.8.0", - "from": "oauth-sign@~0.8.0", - "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.0.tgz" + "version": "0.8.1", + "from": "oauth-sign@>=0.8.0 <0.9.0", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.1.tgz" }, "hawk": { - "version": "3.1.2", - "from": "hawk@~3.1.0", - "resolved": "https://registry.npmjs.org/hawk/-/hawk-3.1.2.tgz", + "version": "3.1.3", + "from": "hawk@>=3.1.0 <3.2.0", + "resolved": "https://registry.npmjs.org/hawk/-/hawk-3.1.3.tgz", "dependencies": { "hoek": { "version": "2.16.3", - "from": "hoek@2.x.x", + "from": "hoek@>=2.0.0 <3.0.0", "resolved": "https://registry.npmjs.org/hoek/-/hoek-2.16.3.tgz" }, "boom": { "version": "2.10.1", - "from": "boom@2.x.x", + "from": "boom@>=2.0.0 <3.0.0", "resolved": "https://registry.npmjs.org/boom/-/boom-2.10.1.tgz" }, "cryptiles": { "version": "2.0.5", - "from": "cryptiles@2.x.x", + "from": "cryptiles@>=2.0.0 <3.0.0", "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-2.0.5.tgz" }, "sntp": { "version": "1.0.9", - "from": "sntp@1.x.x", + "from": "sntp@>=1.0.0 <2.0.0", "resolved": "https://registry.npmjs.org/sntp/-/sntp-1.0.9.tgz" } } }, "aws-sign2": { "version": "0.5.0", - "from": "aws-sign2@~0.5.0", + "from": "aws-sign2@>=0.5.0 <0.6.0", "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.5.0.tgz" }, "stringstream": { "version": "0.0.5", - "from": "stringstream@~0.0.4", + "from": "stringstream@>=0.0.4 <0.1.0", "resolved": "https://registry.npmjs.org/stringstream/-/stringstream-0.0.5.tgz" }, "combined-stream": { "version": "1.0.5", - "from": "combined-stream@~1.0.1", + "from": "combined-stream@>=1.0.1 <1.1.0", "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.5.tgz", "dependencies": { "delayed-stream": { "version": "1.0.0", - "from": "delayed-stream@~1.0.0", + "from": "delayed-stream@>=1.0.0 <1.1.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz" } } }, "isstream": { "version": "0.1.2", - "from": "isstream@~0.1.1", + "from": "isstream@>=0.1.1 <0.2.0", "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz" }, "har-validator": { "version": "1.8.0", - "from": "har-validator@^1.6.1", + "from": "har-validator@>=1.6.1 <2.0.0", "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-1.8.0.tgz", "dependencies": { "bluebird": { "version": "2.10.2", - "from": "bluebird@^2.9.30", + "from": "bluebird@>=2.9.30 <3.0.0", "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-2.10.2.tgz" }, "chalk": { "version": "1.1.1", - "from": "chalk@^1.0.0", + "from": "chalk@>=1.0.0 <2.0.0", "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.1.tgz", "dependencies": { "ansi-styles": { "version": "2.1.0", - "from": "ansi-styles@^2.1.0", + "from": "ansi-styles@>=2.1.0 <3.0.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.1.0.tgz" }, "escape-string-regexp": { "version": "1.0.4", - "from": "escape-string-regexp@^1.0.2", + "from": "escape-string-regexp@>=1.0.2 <2.0.0", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.4.tgz" }, "has-ansi": { "version": "2.0.0", - "from": "has-ansi@^2.0.0", + "from": "has-ansi@>=2.0.0 <3.0.0", "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", "dependencies": { "ansi-regex": { "version": "2.0.0", - "from": "ansi-regex@^2.0.0", + "from": "ansi-regex@>=2.0.0 <3.0.0", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.0.0.tgz" } } }, "strip-ansi": { "version": "3.0.0", - "from": "strip-ansi@^3.0.0", + "from": "strip-ansi@>=3.0.0 <4.0.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.0.tgz", "dependencies": { "ansi-regex": { "version": "2.0.0", - "from": "ansi-regex@^2.0.0", + "from": "ansi-regex@>=2.0.0 <3.0.0", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.0.0.tgz" } } }, "supports-color": { "version": "2.0.0", - "from": "supports-color@^2.0.0", + "from": "supports-color@>=2.0.0 <3.0.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz" } } }, "commander": { "version": "2.9.0", - "from": "commander@^2.8.1", + "from": "commander@>=2.8.1 <3.0.0", "resolved": "https://registry.npmjs.org/commander/-/commander-2.9.0.tgz", "dependencies": { "graceful-readlink": { "version": "1.0.1", - "from": "graceful-readlink@>= 1.0.0", + "from": "graceful-readlink@>=1.0.0", "resolved": "https://registry.npmjs.org/graceful-readlink/-/graceful-readlink-1.0.1.tgz" } } }, "is-my-json-valid": { "version": "2.12.4", - "from": "is-my-json-valid@^2.12.0", + "from": "is-my-json-valid@>=2.12.0 <3.0.0", "resolved": "https://registry.npmjs.org/is-my-json-valid/-/is-my-json-valid-2.12.4.tgz", "dependencies": { "generate-function": { "version": "2.0.0", - "from": "generate-function@^2.0.0", + "from": "generate-function@>=2.0.0 <3.0.0", "resolved": "https://registry.npmjs.org/generate-function/-/generate-function-2.0.0.tgz" }, "generate-object-property": { "version": "1.2.0", - "from": "generate-object-property@^1.1.0", + "from": "generate-object-property@>=1.1.0 <2.0.0", "resolved": "https://registry.npmjs.org/generate-object-property/-/generate-object-property-1.2.0.tgz", "dependencies": { "is-property": { "version": "1.0.2", - "from": "is-property@^1.0.0", + "from": "is-property@>=1.0.0 <2.0.0", "resolved": "https://registry.npmjs.org/is-property/-/is-property-1.0.2.tgz" } } @@ -853,7 +805,7 @@ }, "xtend": { "version": "4.0.1", - "from": "xtend@^4.0.0", + "from": "xtend@>=4.0.0 <5.0.0", "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz" } } @@ -864,23 +816,23 @@ }, "step": { "version": "0.0.6", - "from": "step@~0.0.6", + "from": "step@>=0.0.6 <0.1.0", "resolved": "https://registry.npmjs.org/step/-/step-0.0.6.tgz" }, "step-profiler": { "version": "0.2.1", - "from": "step-profiler@~0.2.1", + "from": "step-profiler@>=0.2.1 <0.3.0", "resolved": "https://registry.npmjs.org/step-profiler/-/step-profiler-0.2.1.tgz" }, "underscore": { "version": "1.6.0", - "from": "underscore@~1.6.0", + "from": "underscore@>=1.6.0 <1.7.0", "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.6.0.tgz" }, "windshaft": { - "version": "1.7.0", - "from": "windshaft@1.7.0", - "resolved": "https://registry.npmjs.org/windshaft/-/windshaft-1.7.0.tgz", + "version": "1.8.3", + "from": "windshaft@1.8.3", + "resolved": "https://registry.npmjs.org/windshaft/-/windshaft-1.8.3.tgz", "dependencies": { "mapnik": { "version": "1.4.15-cdb6", @@ -889,7 +841,7 @@ "dependencies": { "nan": { "version": "1.2.0", - "from": "nan@~1.2.0", + "from": "nan@>=1.2.0 <1.3.0", "resolved": "https://registry.npmjs.org/nan/-/nan-1.2.0.tgz" }, "mapnik-vector-tile": { @@ -1268,8 +1220,9 @@ } }, "grainstore": { - "version": "1.1.0", - "from": "grainstore@~1.1.0", + "version": "1.1.1", + "from": "grainstore@1.1.1", + "resolved": "https://registry.npmjs.org/grainstore/-/grainstore-1.1.1.tgz", "dependencies": { "carto": { "version": "0.9.5-cdb2", @@ -1278,39 +1231,39 @@ "dependencies": { "underscore": { "version": "1.4.4", - "from": "underscore@~1.4.3", + "from": "underscore@>=1.4.3 <1.5.0", "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.4.4.tgz" }, "mapnik-reference": { "version": "5.0.9", - "from": "mapnik-reference@~5.0.7", + "from": "mapnik-reference@>=5.0.7 <5.1.0", "resolved": "https://registry.npmjs.org/mapnik-reference/-/mapnik-reference-5.0.9.tgz" }, "xml2js": { "version": "0.2.8", - "from": "xml2js@~0.2.4", + "from": "xml2js@>=0.2.4 <0.3.0", "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.2.8.tgz", "dependencies": { "sax": { "version": "0.5.8", - "from": "sax@0.5.x", + "from": "sax@>=0.5.0 <0.6.0", "resolved": "https://registry.npmjs.org/sax/-/sax-0.5.8.tgz" } } }, "optimist": { "version": "0.6.1", - "from": "optimist@~0.6.0", + "from": "optimist@>=0.6.0 <0.7.0", "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", "dependencies": { "wordwrap": { "version": "0.0.3", - "from": "wordwrap@~0.0.2", + "from": "wordwrap@>=0.0.2 <0.1.0", "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz" }, "minimist": { "version": "0.0.10", - "from": "minimist@~0.0.1", + "from": "minimist@>=0.0.1 <0.1.0", "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.10.tgz" } } @@ -1318,143 +1271,23 @@ } }, "millstone": { - "version": "0.6.14", - "from": "millstone@0.6.14", - "resolved": "https://registry.npmjs.org/millstone/-/millstone-0.6.14.tgz", + "version": "0.6.16", + "from": "millstone@0.6.16", + "resolved": "https://registry.npmjs.org/millstone/-/millstone-0.6.16.tgz", "dependencies": { "generic-pool": { - "version": "2.0.4", - "from": "generic-pool@~2.0.3", - "resolved": "https://registry.npmjs.org/generic-pool/-/generic-pool-2.0.4.tgz" - }, - "request": { - "version": "2.34.0", - "from": "request@~2.34.0", - "resolved": "https://registry.npmjs.org/request/-/request-2.34.0.tgz", - "dependencies": { - "qs": { - "version": "0.6.6", - "from": "qs@~0.6.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-0.6.6.tgz" - }, - "json-stringify-safe": { - "version": "5.0.1", - "from": "json-stringify-safe@~5.0.0", - "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz" - }, - "forever-agent": { - "version": "0.5.2", - "from": "forever-agent@~0.5.0", - "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.5.2.tgz" - }, - "node-uuid": { - "version": "1.4.7", - "from": "node-uuid@~1.4.0", - "resolved": "https://registry.npmjs.org/node-uuid/-/node-uuid-1.4.7.tgz" - }, - "tough-cookie": { - "version": "2.2.1", - "from": "tough-cookie@>=0.12.0", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.2.1.tgz" - }, - "form-data": { - "version": "0.1.4", - "from": "form-data@~0.1.0", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-0.1.4.tgz", - "dependencies": { - "combined-stream": { - "version": "0.0.7", - "from": "combined-stream@~0.0.4", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-0.0.7.tgz", - "dependencies": { - "delayed-stream": { - "version": "0.0.5", - "from": "delayed-stream@0.0.5", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-0.0.5.tgz" - } - } - }, - "async": { - "version": "0.9.2", - "from": "async@~0.9.0", - "resolved": "https://registry.npmjs.org/async/-/async-0.9.2.tgz" - } - } - }, - "tunnel-agent": { - "version": "0.3.0", - "from": "tunnel-agent@~0.3.0", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.3.0.tgz" - }, - "http-signature": { - "version": "0.10.1", - "from": "http-signature@~0.10.0", - "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-0.10.1.tgz", - "dependencies": { - "assert-plus": { - "version": "0.1.5", - "from": "assert-plus@^0.1.5", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-0.1.5.tgz" - }, - "asn1": { - "version": "0.1.11", - "from": "asn1@0.1.11", - "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.1.11.tgz" - }, - "ctype": { - "version": "0.5.3", - "from": "ctype@0.5.3", - "resolved": "https://registry.npmjs.org/ctype/-/ctype-0.5.3.tgz" - } - } - }, - "oauth-sign": { - "version": "0.3.0", - "from": "oauth-sign@~0.3.0", - "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.3.0.tgz" - }, - "hawk": { - "version": "1.0.0", - "from": "hawk@~1.0.0", - "resolved": "https://registry.npmjs.org/hawk/-/hawk-1.0.0.tgz", - "dependencies": { - "hoek": { - "version": "0.9.1", - "from": "hoek@0.9.x", - "resolved": "https://registry.npmjs.org/hoek/-/hoek-0.9.1.tgz" - }, - "boom": { - "version": "0.4.2", - "from": "boom@0.4.x", - "resolved": "https://registry.npmjs.org/boom/-/boom-0.4.2.tgz" - }, - "cryptiles": { - "version": "0.2.2", - "from": "cryptiles@0.2.x", - "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-0.2.2.tgz" - }, - "sntp": { - "version": "0.2.4", - "from": "sntp@0.2.x", - "resolved": "https://registry.npmjs.org/sntp/-/sntp-0.2.4.tgz" - } - } - }, - "aws-sign2": { - "version": "0.5.0", - "from": "aws-sign2@~0.5.0", - "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.5.0.tgz" - } - } + "version": "2.1.1", + "from": "generic-pool@>=2.1.1 <2.2.0", + "resolved": "https://registry.npmjs.org/generic-pool/-/generic-pool-2.1.1.tgz" }, "srs": { "version": "0.4.9", - "from": "srs@~0.4.1", + "from": "srs@>=0.4.6 <0.5.0", "resolved": "https://registry.npmjs.org/srs/-/srs-0.4.9.tgz", "dependencies": { "nan": { "version": "1.8.4", - "from": "nan@~1.8.4", + "from": "nan@>=1.8.4 <1.9.0", "resolved": "https://registry.npmjs.org/nan/-/nan-1.8.4.tgz" }, "node-pre-gyp": { @@ -2181,12 +2014,12 @@ }, "zipfile": { "version": "0.5.9", - "from": "zipfile@~0.5.2", + "from": "zipfile@>=0.5.5 <0.6.0", "resolved": "https://registry.npmjs.org/zipfile/-/zipfile-0.5.9.tgz", "dependencies": { "nan": { "version": "2.1.0", - "from": "nan@~2.1.0", + "from": "nan@>=2.1.0 <2.2.0", "resolved": "https://registry.npmjs.org/nan/-/nan-2.1.0.tgz" }, "node-pre-gyp": { @@ -2970,129 +2803,288 @@ } }, "sqlite3": { - "version": "2.2.7", - "from": "sqlite3@2.x", - "resolved": "https://registry.npmjs.org/sqlite3/-/sqlite3-2.2.7.tgz", + "version": "3.1.1", + "from": "sqlite3@>=2.0.0 <3.0.0||>=3.0.0 <4.0.0", + "resolved": "https://registry.npmjs.org/sqlite3/-/sqlite3-3.1.1.tgz", "dependencies": { "nan": { - "version": "1.1.2", - "from": "nan@1.1.2", - "resolved": "https://registry.npmjs.org/nan/-/nan-1.1.2.tgz" + "version": "2.1.0", + "from": "nan@>=2.1.0 <2.2.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.1.0.tgz" }, "node-pre-gyp": { - "version": "0.5.22", - "from": "node-pre-gyp@0.5.22", - "resolved": "https://registry.npmjs.org/node-pre-gyp/-/node-pre-gyp-0.5.22.tgz", + "version": "0.6.14", + "from": "node-pre-gyp@~0.6.14", "dependencies": { "nopt": { - "version": "3.0.1", + "version": "3.0.4", "from": "nopt@~3.0.1", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.1.tgz", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.4.tgz", "dependencies": { "abbrev": { - "version": "1.0.5", + "version": "1.0.7", "from": "abbrev@1", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.0.5.tgz" + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.0.7.tgz" } } }, "npmlog": { - "version": "0.1.1", - "from": "npmlog@~0.1.1", - "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-0.1.1.tgz", + "version": "1.2.1", + "from": "npmlog@~1.2.0", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-1.2.1.tgz", "dependencies": { "ansi": { "version": "0.3.0", "from": "ansi@~0.3.0", "resolved": "https://registry.npmjs.org/ansi/-/ansi-0.3.0.tgz" + }, + "are-we-there-yet": { + "version": "1.0.4", + "from": "are-we-there-yet@~1.0.0", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.0.4.tgz", + "dependencies": { + "delegates": { + "version": "0.1.0", + "from": "delegates@^0.1.0", + "resolved": "https://registry.npmjs.org/delegates/-/delegates-0.1.0.tgz" + }, + "readable-stream": { + "version": "1.1.13", + "from": "readable-stream@^1.1.13", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.13.tgz", + "dependencies": { + "core-util-is": { + "version": "1.0.1", + "from": "core-util-is@~1.0.0", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.1.tgz" + }, + "isarray": { + "version": "0.0.1", + "from": "isarray@0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz" + }, + "string_decoder": { + "version": "0.10.31", + "from": "string_decoder@~0.10.x", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz" + }, + "inherits": { + "version": "2.0.1", + "from": "inherits@2", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz" + } + } + } + } + }, + "gauge": { + "version": "1.2.2", + "from": "gauge@~1.2.0", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-1.2.2.tgz", + "dependencies": { + "has-unicode": { + "version": "1.0.0", + "from": "has-unicode@^1.0.0", + "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-1.0.0.tgz" + }, + "lodash.pad": { + "version": "3.1.1", + "from": "lodash.pad@^3.0.0", + "resolved": "https://registry.npmjs.org/lodash.pad/-/lodash.pad-3.1.1.tgz", + "dependencies": { + "lodash._basetostring": { + "version": "3.0.1", + "from": "lodash._basetostring@^3.0.0", + "resolved": "https://registry.npmjs.org/lodash._basetostring/-/lodash._basetostring-3.0.1.tgz" + }, + "lodash._createpadding": { + "version": "3.6.1", + "from": "lodash._createpadding@^3.0.0", + "resolved": "https://registry.npmjs.org/lodash._createpadding/-/lodash._createpadding-3.6.1.tgz", + "dependencies": { + "lodash.repeat": { + "version": "3.0.1", + "from": "lodash.repeat@^3.0.0", + "resolved": "https://registry.npmjs.org/lodash.repeat/-/lodash.repeat-3.0.1.tgz" + } + } + } + } + }, + "lodash.padleft": { + "version": "3.1.1", + "from": "lodash.padleft@^3.0.0", + "resolved": "https://registry.npmjs.org/lodash.padleft/-/lodash.padleft-3.1.1.tgz", + "dependencies": { + "lodash._basetostring": { + "version": "3.0.1", + "from": "lodash._basetostring@^3.0.0", + "resolved": "https://registry.npmjs.org/lodash._basetostring/-/lodash._basetostring-3.0.1.tgz" + }, + "lodash._createpadding": { + "version": "3.6.1", + "from": "lodash._createpadding@^3.0.0", + "resolved": "https://registry.npmjs.org/lodash._createpadding/-/lodash._createpadding-3.6.1.tgz", + "dependencies": { + "lodash.repeat": { + "version": "3.0.1", + "from": "lodash.repeat@^3.0.0", + "resolved": "https://registry.npmjs.org/lodash.repeat/-/lodash.repeat-3.0.1.tgz" + } + } + } + } + }, + "lodash.padright": { + "version": "3.1.1", + "from": "lodash.padright@^3.0.0", + "resolved": "https://registry.npmjs.org/lodash.padright/-/lodash.padright-3.1.1.tgz", + "dependencies": { + "lodash._basetostring": { + "version": "3.0.1", + "from": "lodash._basetostring@^3.0.0", + "resolved": "https://registry.npmjs.org/lodash._basetostring/-/lodash._basetostring-3.0.1.tgz" + }, + "lodash._createpadding": { + "version": "3.6.1", + "from": "lodash._createpadding@^3.0.0", + "resolved": "https://registry.npmjs.org/lodash._createpadding/-/lodash._createpadding-3.6.1.tgz", + "dependencies": { + "lodash.repeat": { + "version": "3.0.1", + "from": "lodash.repeat@^3.0.0", + "resolved": "https://registry.npmjs.org/lodash.repeat/-/lodash.repeat-3.0.1.tgz" + } + } + } + } + } + } } } }, "request": { - "version": "2.39.0", + "version": "2.64.0", "from": "request@2.x", - "resolved": "https://registry.npmjs.org/request/-/request-2.39.0.tgz", + "resolved": "https://registry.npmjs.org/request/-/request-2.64.0.tgz", "dependencies": { - "qs": { - "version": "0.6.6", - "from": "qs@~0.6.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-0.6.6.tgz" - }, - "json-stringify-safe": { - "version": "5.0.0", - "from": "json-stringify-safe@~5.0.0", - "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.0.tgz" - }, - "mime-types": { - "version": "1.0.2", - "from": "mime-types@~1.0.1", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-1.0.2.tgz" - }, - "forever-agent": { - "version": "0.5.2", - "from": "forever-agent@~0.5.0", - "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.5.2.tgz" - }, - "node-uuid": { - "version": "1.4.1", - "from": "node-uuid@~1.4.0", - "resolved": "https://registry.npmjs.org/node-uuid/-/node-uuid-1.4.1.tgz" - }, - "tough-cookie": { - "version": "0.12.1", - "from": "tough-cookie@>=0.12.0", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-0.12.1.tgz", + "bl": { + "version": "1.0.0", + "from": "bl@~1.0.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-1.0.0.tgz", "dependencies": { - "punycode": { - "version": "1.3.0", - "from": "punycode@>=0.2.0", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.0.tgz" - } - } - }, - "form-data": { - "version": "0.1.4", - "from": "form-data@~0.1.0", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-0.1.4.tgz", - "dependencies": { - "combined-stream": { - "version": "0.0.5", - "from": "combined-stream@~0.0.4", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-0.0.5.tgz", + "readable-stream": { + "version": "2.0.2", + "from": "readable-stream@~2.0.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.0.2.tgz", "dependencies": { - "delayed-stream": { - "version": "0.0.5", - "from": "delayed-stream@0.0.5", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-0.0.5.tgz" + "core-util-is": { + "version": "1.0.1", + "from": "core-util-is@~1.0.0", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.1.tgz" + }, + "inherits": { + "version": "2.0.1", + "from": "inherits@~2.0.1", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz" + }, + "isarray": { + "version": "0.0.1", + "from": "isarray@0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz" + }, + "process-nextick-args": { + "version": "1.0.3", + "from": "process-nextick-args@~1.0.0", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.3.tgz" + }, + "string_decoder": { + "version": "0.10.31", + "from": "string_decoder@~0.10.x", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz" + }, + "util-deprecate": { + "version": "1.0.1", + "from": "util-deprecate@~1.0.1", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.1.tgz" } } - }, - "mime": { - "version": "1.2.11", - "from": "mime@~1.2.11", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.2.11.tgz" - }, - "async": { - "version": "0.9.0", - "from": "async@~0.9.0", - "resolved": "https://registry.npmjs.org/async/-/async-0.9.0.tgz" } } }, + "caseless": { + "version": "0.11.0", + "from": "caseless@~0.11.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.11.0.tgz" + }, + "extend": { + "version": "3.0.0", + "from": "extend@~3.0.0", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.0.tgz" + }, + "forever-agent": { + "version": "0.6.1", + "from": "forever-agent@~0.6.0", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz" + }, + "form-data": { + "version": "1.0.0-rc3", + "from": "form-data@~1.0.0-rc1", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-1.0.0-rc3.tgz", + "dependencies": { + "async": { + "version": "1.4.2", + "from": "async@^1.4.0", + "resolved": "https://registry.npmjs.org/async/-/async-1.4.2.tgz" + } + } + }, + "json-stringify-safe": { + "version": "5.0.1", + "from": "json-stringify-safe@~5.0.0", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz" + }, + "mime-types": { + "version": "2.1.7", + "from": "mime-types@~2.1.2", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.7.tgz", + "dependencies": { + "mime-db": { + "version": "1.19.0", + "from": "mime-db@~1.19.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.19.0.tgz" + } + } + }, + "node-uuid": { + "version": "1.4.3", + "from": "node-uuid@~1.4.0", + "resolved": "https://registry.npmjs.org/node-uuid/-/node-uuid-1.4.3.tgz" + }, + "qs": { + "version": "5.1.0", + "from": "qs@~5.1.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-5.1.0.tgz" + }, "tunnel-agent": { - "version": "0.4.0", + "version": "0.4.1", "from": "tunnel-agent@~0.4.0", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.4.0.tgz" + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.4.1.tgz" + }, + "tough-cookie": { + "version": "2.1.0", + "from": "tough-cookie@>=0.12.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.1.0.tgz" }, "http-signature": { - "version": "0.10.0", - "from": "http-signature@~0.10.0", - "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-0.10.0.tgz", + "version": "0.11.0", + "from": "http-signature@~0.11.0", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-0.11.0.tgz", "dependencies": { "assert-plus": { - "version": "0.1.2", - "from": "assert-plus@0.1.2", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-0.1.2.tgz" + "version": "0.1.5", + "from": "assert-plus@^0.1.5", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-0.1.5.tgz" }, "asn1": { "version": "0.1.11", @@ -3100,41 +3092,41 @@ "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.1.11.tgz" }, "ctype": { - "version": "0.5.2", - "from": "ctype@0.5.2", - "resolved": "https://registry.npmjs.org/ctype/-/ctype-0.5.2.tgz" + "version": "0.5.3", + "from": "ctype@0.5.3", + "resolved": "https://registry.npmjs.org/ctype/-/ctype-0.5.3.tgz" } } }, "oauth-sign": { - "version": "0.3.0", - "from": "oauth-sign@~0.3.0", - "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.3.0.tgz" + "version": "0.8.0", + "from": "oauth-sign@~0.8.0", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.0.tgz" }, "hawk": { - "version": "1.1.1", - "from": "hawk@1.1.1", - "resolved": "https://registry.npmjs.org/hawk/-/hawk-1.1.1.tgz", + "version": "3.1.0", + "from": "hawk@~3.1.0", + "resolved": "https://registry.npmjs.org/hawk/-/hawk-3.1.0.tgz", "dependencies": { "hoek": { - "version": "0.9.1", - "from": "hoek@0.9.x", - "resolved": "https://registry.npmjs.org/hoek/-/hoek-0.9.1.tgz" + "version": "2.16.3", + "from": "hoek@2.x.x", + "resolved": "https://registry.npmjs.org/hoek/-/hoek-2.16.3.tgz" }, "boom": { - "version": "0.4.2", - "from": "boom@0.4.x", - "resolved": "https://registry.npmjs.org/boom/-/boom-0.4.2.tgz" + "version": "2.9.0", + "from": "boom@^2.8.x", + "resolved": "https://registry.npmjs.org/boom/-/boom-2.9.0.tgz" }, "cryptiles": { - "version": "0.2.2", - "from": "cryptiles@0.2.x", - "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-0.2.2.tgz" + "version": "2.0.5", + "from": "cryptiles@2.x.x", + "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-2.0.5.tgz" }, "sntp": { - "version": "0.2.4", - "from": "sntp@0.2.x", - "resolved": "https://registry.npmjs.org/sntp/-/sntp-0.2.4.tgz" + "version": "1.0.9", + "from": "sntp@1.x.x", + "resolved": "https://registry.npmjs.org/sntp/-/sntp-1.0.9.tgz" } } }, @@ -3147,39 +3139,160 @@ "version": "0.0.4", "from": "stringstream@~0.0.4", "resolved": "https://registry.npmjs.org/stringstream/-/stringstream-0.0.4.tgz" + }, + "combined-stream": { + "version": "1.0.5", + "from": "combined-stream@~1.0.1", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.5.tgz", + "dependencies": { + "delayed-stream": { + "version": "1.0.0", + "from": "delayed-stream@~1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz" + } + } + }, + "isstream": { + "version": "0.1.2", + "from": "isstream@~0.1.1", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz" + }, + "har-validator": { + "version": "1.8.0", + "from": "har-validator@^1.6.1", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-1.8.0.tgz", + "dependencies": { + "bluebird": { + "version": "2.10.2", + "from": "bluebird@^2.9.30", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-2.10.2.tgz" + }, + "chalk": { + "version": "1.1.1", + "from": "chalk@^1.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.1.tgz", + "dependencies": { + "ansi-styles": { + "version": "2.1.0", + "from": "ansi-styles@^2.1.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.1.0.tgz" + }, + "escape-string-regexp": { + "version": "1.0.3", + "from": "escape-string-regexp@^1.0.2", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.3.tgz" + }, + "has-ansi": { + "version": "2.0.0", + "from": "has-ansi@^2.0.0", + "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", + "dependencies": { + "ansi-regex": { + "version": "2.0.0", + "from": "ansi-regex@^2.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.0.0.tgz" + } + } + }, + "strip-ansi": { + "version": "3.0.0", + "from": "strip-ansi@^3.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.0.tgz", + "dependencies": { + "ansi-regex": { + "version": "2.0.0", + "from": "ansi-regex@^2.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.0.0.tgz" + } + } + }, + "supports-color": { + "version": "2.0.0", + "from": "supports-color@^2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz" + } + } + }, + "commander": { + "version": "2.8.1", + "from": "commander@^2.8.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.8.1.tgz", + "dependencies": { + "graceful-readlink": { + "version": "1.0.1", + "from": "graceful-readlink@>= 1.0.0", + "resolved": "https://registry.npmjs.org/graceful-readlink/-/graceful-readlink-1.0.1.tgz" + } + } + }, + "is-my-json-valid": { + "version": "2.12.2", + "from": "is-my-json-valid@^2.12.0", + "resolved": "https://registry.npmjs.org/is-my-json-valid/-/is-my-json-valid-2.12.2.tgz", + "dependencies": { + "generate-function": { + "version": "2.0.0", + "from": "generate-function@^2.0.0", + "resolved": "https://registry.npmjs.org/generate-function/-/generate-function-2.0.0.tgz" + }, + "generate-object-property": { + "version": "1.2.0", + "from": "generate-object-property@^1.1.0", + "resolved": "https://registry.npmjs.org/generate-object-property/-/generate-object-property-1.2.0.tgz", + "dependencies": { + "is-property": { + "version": "1.0.2", + "from": "is-property@^1.0.0", + "resolved": "https://registry.npmjs.org/is-property/-/is-property-1.0.2.tgz" + } + } + }, + "jsonpointer": { + "version": "2.0.0", + "from": "jsonpointer@2.0.0", + "resolved": "https://registry.npmjs.org/jsonpointer/-/jsonpointer-2.0.0.tgz" + }, + "xtend": { + "version": "4.0.0", + "from": "xtend@^4.0.0", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.0.tgz" + } + } + } + } } } }, "semver": { - "version": "3.0.1", - "from": "semver@~3.0.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-3.0.1.tgz" + "version": "5.0.3", + "from": "semver@~5.0.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.0.3.tgz" }, "tar": { - "version": "1.0.0", - "from": "tar@~1.0.0", - "resolved": "https://registry.npmjs.org/tar/-/tar-1.0.0.tgz", + "version": "2.2.1", + "from": "tar@~2.2.0", + "resolved": "https://registry.npmjs.org/tar/-/tar-2.2.1.tgz", "dependencies": { "block-stream": { - "version": "0.0.7", + "version": "0.0.8", "from": "block-stream@*", - "resolved": "https://registry.npmjs.org/block-stream/-/block-stream-0.0.7.tgz" + "resolved": "https://registry.npmjs.org/block-stream/-/block-stream-0.0.8.tgz" }, "fstream": { - "version": "1.0.1", - "from": "fstream@^1.0.0", - "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.1.tgz", + "version": "1.0.8", + "from": "fstream@^1.0.2", + "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.8.tgz", "dependencies": { "graceful-fs": { - "version": "3.0.2", - "from": "graceful-fs@3", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-3.0.2.tgz" + "version": "4.1.2", + "from": "graceful-fs@^4.1.2", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.2.tgz" } } }, "inherits": { "version": "2.0.1", - "from": "inherits@~2.0.1", + "from": "inherits@2", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz" } } @@ -3204,19 +3317,24 @@ "from": "debug@~0.7.2", "resolved": "https://registry.npmjs.org/debug/-/debug-0.7.4.tgz" }, + "rimraf": { + "version": "2.2.8", + "from": "rimraf@~2.2.0", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.2.8.tgz" + }, "fstream": { "version": "0.1.31", "from": "fstream@~0.1.22", "resolved": "https://registry.npmjs.org/fstream/-/fstream-0.1.31.tgz", "dependencies": { "graceful-fs": { - "version": "3.0.2", - "from": "graceful-fs@3", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-3.0.2.tgz" + "version": "3.0.8", + "from": "graceful-fs@~3.0.2", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-3.0.8.tgz" }, "inherits": { "version": "2.0.1", - "from": "inherits@2", + "from": "inherits@~2.0.0", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz" } } @@ -3227,9 +3345,9 @@ "resolved": "https://registry.npmjs.org/tar/-/tar-0.1.20.tgz", "dependencies": { "block-stream": { - "version": "0.0.7", + "version": "0.0.8", "from": "block-stream@*", - "resolved": "https://registry.npmjs.org/block-stream/-/block-stream-0.0.7.tgz" + "resolved": "https://registry.npmjs.org/block-stream/-/block-stream-0.0.8.tgz" }, "inherits": { "version": "2.0.1", @@ -3249,28 +3367,28 @@ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-0.2.14.tgz", "dependencies": { "lru-cache": { - "version": "2.5.0", + "version": "2.7.0", "from": "lru-cache@2", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.5.0.tgz" + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.7.0.tgz" }, "sigmund": { - "version": "1.0.0", + "version": "1.0.1", "from": "sigmund@~1.0.0", - "resolved": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.0.tgz" + "resolved": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.1.tgz" } } }, "inherits": { "version": "2.0.1", - "from": "inherits@2", + "from": "inherits@~2.0.1", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz" } } }, "readable-stream": { - "version": "1.0.27-1", + "version": "1.0.33", "from": "readable-stream@~1.0.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.27-1.tgz", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.33.tgz", "dependencies": { "core-util-is": { "version": "1.0.1", @@ -3283,13 +3401,13 @@ "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz" }, "string_decoder": { - "version": "0.10.25-1", + "version": "0.10.31", "from": "string_decoder@~0.10.x", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.25-1.tgz" + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz" }, "inherits": { "version": "2.0.1", - "from": "inherits@2", + "from": "inherits@~2.0.1", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz" } } @@ -3302,9 +3420,9 @@ } }, "mkdirp": { - "version": "0.5.0", + "version": "0.5.1", "from": "mkdirp@~0.5.0", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.0.tgz", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", "dependencies": { "minimist": { "version": "0.0.8", @@ -3314,14 +3432,14 @@ } }, "rc": { - "version": "0.5.0", - "from": "rc@~0.5.0", - "resolved": "https://registry.npmjs.org/rc/-/rc-0.5.0.tgz", + "version": "1.1.2", + "from": "rc@~1.1.0", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.1.2.tgz", "dependencies": { "minimist": { - "version": "0.0.10", - "from": "minimist@~0.0.7", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.10.tgz" + "version": "1.2.0", + "from": "minimist@^1.1.2", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz" }, "deep-extend": { "version": "0.2.11", @@ -3334,49 +3452,118 @@ "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-0.1.3.tgz" }, "ini": { - "version": "1.1.0", - "from": "ini@~1.1.0", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.1.0.tgz" + "version": "1.3.4", + "from": "ini@~1.3.0", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.4.tgz" } } }, "rimraf": { - "version": "2.2.8", - "from": "rimraf@~2.2.8", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.2.8.tgz" + "version": "2.4.3", + "from": "rimraf@~2.4.0", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.4.3.tgz", + "dependencies": { + "glob": { + "version": "5.0.15", + "from": "glob@^5.0.14", + "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz", + "dependencies": { + "inflight": { + "version": "1.0.4", + "from": "inflight@^1.0.4", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.4.tgz", + "dependencies": { + "wrappy": { + "version": "1.0.1", + "from": "wrappy@1", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.1.tgz" + } + } + }, + "inherits": { + "version": "2.0.1", + "from": "inherits@~2.0.1", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz" + }, + "minimatch": { + "version": "3.0.0", + "from": "minimatch@2 || 3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.0.tgz", + "dependencies": { + "brace-expansion": { + "version": "1.1.1", + "from": "brace-expansion@^1.0.0", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.1.tgz", + "dependencies": { + "balanced-match": { + "version": "0.2.0", + "from": "balanced-match@^0.2.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-0.2.0.tgz" + }, + "concat-map": { + "version": "0.0.1", + "from": "concat-map@0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz" + } + } + } + } + }, + "once": { + "version": "1.3.2", + "from": "once@^1.3.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.3.2.tgz", + "dependencies": { + "wrappy": { + "version": "1.0.1", + "from": "wrappy@1", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.1.tgz" + } + } + }, + "path-is-absolute": { + "version": "1.0.0", + "from": "path-is-absolute@^1.0.0", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.0.tgz" + } + } + } + } } } - }, - "set-immediate": { - "version": "0.1.1", - "from": "set-immediate@0.1.1", - "resolved": "https://registry.npmjs.org/set-immediate/-/set-immediate-0.1.1.tgz" } } }, "mime": { "version": "1.2.11", - "from": "mime@~1.2.9", + "from": "mime@>=1.2.11 <1.3.0", "resolved": "https://registry.npmjs.org/mime/-/mime-1.2.11.tgz" }, "mkdirp": { - "version": "0.3.5", - "from": "mkdirp@~0.3.3", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.3.5.tgz" + "version": "0.5.1", + "from": "mkdirp@>=0.5.0 <0.6.0", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "dependencies": { + "minimist": { + "version": "0.0.8", + "from": "minimist@0.0.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz" + } + } }, "optimist": { "version": "0.6.1", - "from": "optimist@~0.6.0", + "from": "optimist@>=0.6.1 <0.7.0", "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", "dependencies": { "wordwrap": { "version": "0.0.3", - "from": "wordwrap@~0.0.2", + "from": "wordwrap@>=0.0.2 <0.1.0", "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz" }, "minimist": { "version": "0.0.10", - "from": "minimist@~0.0.1", + "from": "minimist@>=0.0.1 <0.1.0", "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.10.tgz" } } @@ -3387,22 +3574,22 @@ }, "tilelive": { "version": "4.5.3", - "from": "tilelive@~4.5.3", + "from": "tilelive@>=4.5.3 <4.6.0", "resolved": "https://registry.npmjs.org/tilelive/-/tilelive-4.5.3.tgz", "dependencies": { "optimist": { "version": "0.6.1", - "from": "optimist@~0.6.0", + "from": "optimist@>=0.6.0 <0.7.0", "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", "dependencies": { "wordwrap": { "version": "0.0.3", - "from": "wordwrap@~0.0.2", + "from": "wordwrap@>=0.0.2 <0.1.0", "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz" }, "minimist": { "version": "0.0.10", - "from": "minimist@~0.0.1", + "from": "minimist@>=0.0.1 <0.1.0", "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.10.tgz" } } @@ -3416,12 +3603,12 @@ "dependencies": { "generic-pool": { "version": "2.1.1", - "from": "generic-pool@~2.1.1", + "from": "generic-pool@>=2.1.1 <2.2.0", "resolved": "https://registry.npmjs.org/generic-pool/-/generic-pool-2.1.1.tgz" }, "mime": { "version": "1.2.11", - "from": "mime@~1.2.9", + "from": "mime@>=1.2.11 <1.3.0", "resolved": "https://registry.npmjs.org/mime/-/mime-1.2.11.tgz" } } @@ -3438,12 +3625,12 @@ "dependencies": { "generic-pool": { "version": "2.1.1", - "from": "generic-pool@~2.1.1", + "from": "generic-pool@>=2.1.1 <2.2.0", "resolved": "https://registry.npmjs.org/generic-pool/-/generic-pool-2.1.1.tgz" }, "xtend": { "version": "3.0.0", - "from": "xtend@~3.0.0", + "from": "xtend@>=3.0.0 <3.1.0", "resolved": "https://registry.npmjs.org/xtend/-/xtend-3.0.0.tgz" } } @@ -3457,14 +3644,14 @@ "dependencies": { "nan": { "version": "1.9.0", - "from": "nan@^1.8.4", + "from": "nan@>=1.8.4 <2.0.0", "resolved": "https://registry.npmjs.org/nan/-/nan-1.9.0.tgz" } } }, "semver": { "version": "5.0.3", - "from": "semver@~5.0.3", + "from": "semver@>=5.0.3 <5.1.0", "resolved": "https://registry.npmjs.org/semver/-/semver-5.0.3.tgz" }, "carto": { @@ -3474,22 +3661,22 @@ "dependencies": { "mapnik-reference": { "version": "6.0.5", - "from": "mapnik-reference@~6.0.2", + "from": "mapnik-reference@>=6.0.2 <6.1.0", "resolved": "https://registry.npmjs.org/mapnik-reference/-/mapnik-reference-6.0.5.tgz" }, "optimist": { "version": "0.6.1", - "from": "optimist@~0.6.0", + "from": "optimist@>=0.6.0 <0.7.0", "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", "dependencies": { "wordwrap": { "version": "0.0.3", - "from": "wordwrap@~0.0.2", + "from": "wordwrap@>=0.0.2 <0.1.0", "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz" }, "minimist": { "version": "0.0.10", - "from": "minimist@~0.0.1", + "from": "minimist@>=0.0.1 <0.1.0", "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.10.tgz" } } @@ -3498,11 +3685,12 @@ }, "cartodb-psql": { "version": "0.6.1", - "from": "cartodb-psql@~0.6.1", + "from": "cartodb-psql@>=0.6.1 <0.7.0", + "resolved": "https://registry.npmjs.org/cartodb-psql/-/cartodb-psql-0.6.1.tgz", "dependencies": { "pg": { "version": "2.6.2-cdb3", - "from": "pg@git://github.com/CartoDB/node-postgres.git#2.6.2-cdb3", + "from": "git://github.com/CartoDB/node-postgres.git#2.6.2-cdb3", "resolved": "git://github.com/CartoDB/node-postgres.git#069c5296d1a093077feff21719641bb9e71fc50e", "dependencies": { "generic-pool": { @@ -3521,7 +3709,8 @@ }, "torque.js": { "version": "2.11.4", - "from": "torque.js@~2.11.0" + "from": "torque.js@>=2.11.0 <2.12.0", + "resolved": "https://registry.npmjs.org/torque.js/-/torque.js-2.11.4.tgz" }, "abaculus": { "version": "1.1.0-cdb4", diff --git a/package.json b/package.json index f1b16e48..bb9c996a 100644 --- a/package.json +++ b/package.json @@ -1,16 +1,13 @@ { "private": true, "name": "windshaft-cartodb", - "version": "2.20.1", + "version": "2.22.1", "description": "A map tile server for CartoDB", "keywords": [ "cartodb" ], "url": "https://github.com/CartoDB/Windshaft-cartodb", - "licenses": [{ - "type": "BSD", - "url": "https://github.com/CartoDB/Windshaft-cartodb/blob/master/LICENCE" - }], + "license": "BSD-3-Clause", "repository": { "type": "git", "url": "git://github.com/CartoDB/Windshaft-cartodb.git" @@ -29,7 +26,7 @@ "node-statsd": "~0.0.7", "underscore" : "~1.6.0", "dot": "~1.0.2", - "windshaft": "1.7.0", + "windshaft": "1.8.3", "step": "~0.0.6", "queue-async": "~1.0.7", "request": "~2.62.0", @@ -56,6 +53,6 @@ }, "engines": { "node": ">=0.8 <0.11", - "npm": ">=1.2.1" + "npm": ">=2.14.16" } } diff --git a/test/acceptance/ported/multilayer.js b/test/acceptance/ported/multilayer.js index 898ff1a4..7e9b984c 100644 --- a/test/acceptance/ported/multilayer.js +++ b/test/acceptance/ported/multilayer.js @@ -400,12 +400,11 @@ describe('multilayer', function() { function jsonp_test(body) { assert.ok(body.layergroupid); expected_token = LayergroupToken.parse(body.layergroupid).token; - assert.deepEqual(body.metadata, { - layers: [ - { type: "mapnik", "meta":{} }, - { type: "mapnik", "meta":{} } - ] - }); + assert.ok(body.metadata.layers.length === 2); + assert.ok(body.metadata.layers[0].type === 'mapnik'); + assert.ok(body.metadata.layers[0].meta); + assert.ok(body.metadata.layers[1].type === 'mapnik'); + assert.ok(body.metadata.layers[1].meta); didRunJsonCallback = true; } eval(res.body); @@ -1278,4 +1277,3 @@ describe('multilayer', function() { }); }); - diff --git a/test/acceptance/ported/multilayer_interactivity.js b/test/acceptance/ported/multilayer_interactivity.js index f4bf728e..44b54d4f 100644 --- a/test/acceptance/ported/multilayer_interactivity.js +++ b/test/acceptance/ported/multilayer_interactivity.js @@ -374,4 +374,3 @@ describe('multilayer interactivity and layers order', function() { chaosScenarios.forEach(testInteractivityLayersOrderScenario); }); - diff --git a/test/acceptance/widgets.js b/test/acceptance/widgets.js deleted file mode 100644 index 2f4483f5..00000000 --- a/test/acceptance/widgets.js +++ /dev/null @@ -1,479 +0,0 @@ -var assert = require('../support/assert'); -var step = require('step'); -var qs = require('querystring'); - -var helper = require(__dirname + '/../support/test_helper'); -var LayergroupToken = require('../../lib/cartodb/models/layergroup_token'); - -var CartodbWindshaft = require('../../lib/cartodb/server'); -var serverOptions = require('../../lib/cartodb/server_options'); -var server = new CartodbWindshaft(serverOptions); -server.setMaxListeners(0); - - -describe('widgets', function() { - - var keysToDelete; - - beforeEach(function() { - keysToDelete = {}; - }); - - afterEach(function(done) { - helper.deleteRedisKeys(keysToDelete, done); - }); - - function getWidget(mapConfig, widgetName, params, callback) { - if (!callback) { - callback = params; - params = {}; - } - - var url = '/api/v1/map'; - if (params && params.filters) { - url += '?' + qs.stringify({ filters: JSON.stringify(params.filters) }); - } - - var layergroupId; - step( - function createLayergroup() { - var next = this; - assert.response(server, - { - url: url, - method: 'POST', - headers: { - host: 'localhost', - 'Content-Type': 'application/json' - }, - data: JSON.stringify(mapConfig) - }, - { - status: 200, - headers: { - 'Content-Type': 'application/json; charset=utf-8' - } - }, - function(res, err) { - if (err) { - return next(err); - } - var parsedBody = JSON.parse(res.body); - var expectedWidgetURLS = { - http: "/api/v1/map/" + parsedBody.layergroupid + "/0/widget/" + widgetName - }; - assert.ok(parsedBody.metadata.layers[0].widgets[widgetName]); - assert.ok( - parsedBody.metadata.layers[0].widgets[widgetName].url.http.match(expectedWidgetURLS.http) - ); - return next(null, parsedBody.layergroupid); - } - ); - }, - function getWidgetResult(err, _layergroupId) { - assert.ifError(err); - - var next = this; - layergroupId = _layergroupId; - - var urlParams = { - own_filter: params.hasOwnProperty('own_filter') ? params.own_filter : 1 - }; - if (params && params.bbox) { - urlParams.bbox = params.bbox; - } - url = '/api/v1/map/' + layergroupId + '/0/widget/' + widgetName + '?' + qs.stringify(urlParams); - - assert.response(server, - { - url: url, - method: 'GET', - headers: { - host: 'localhost' - } - }, - { - status: 200, - headers: { - 'Content-Type': 'application/json; charset=utf-8' - } - }, - function(res, err) { - if (err) { - return next(err); - } - - next(null, res); - } - ); - }, - function finish(err, res) { - keysToDelete['map_cfg|' + LayergroupToken.parse(layergroupId).token] = 0; - keysToDelete['user:localhost:mapviews:global'] = 5; - return callback(err, res); - } - ); - } - - - it("should expose layer list", function(done) { - - var listWidgetMapConfig = { - version: '1.5.0', - layers: [ - { - type: 'mapnik', - options: { - sql: 'select * from test_table', - cartocss: '#layer { marker-fill: red; marker-width: 32; marker-allow-overlap: true; }', - cartocss_version: '2.3.0', - widgets: { - names: { - type: 'list', - options: { - columns: ['name'] - } - } - } - } - } - ] - }; - - getWidget(listWidgetMapConfig, 'names', function(err, res) { - if (err) { - return done(err); - } - - var expectedList = [ - {name:"Hawai"}, - {name:"El Estocolmo"}, - {name:"El Rey del Tallarín"}, - {name:"El Lacón"}, - {name:"El Pico"} - ]; - assert.deepEqual(JSON.parse(res.body).rows, expectedList); - - done(); - }); - }); - - it("should expose layer histogram", function(done) { - var histogramMapConfig = { - version: '1.5.0', - layers: [ - { - type: 'mapnik', - options: { - sql: 'select * from populated_places_simple_reduced', - cartocss: '#layer { marker-fill: red; marker-width: 32; marker-allow-overlap: true; }', - cartocss_version: '2.3.0', - widgets: { - pop_max: { - type: 'histogram', - options: { - column: 'pop_max' - } - } - } - } - } - ] - }; - getWidget(histogramMapConfig, 'pop_max', function(err, res) { - if (err) { - return done(err); - } - - var histogram = JSON.parse(res.body); - assert.ok(histogram.bins.length); - - done(); - }); - }); - - describe('filters', function() { - - describe('category', function() { - var aggregationMapConfig = { - version: '1.5.0', - layers: [ - { - type: 'mapnik', - options: { - sql: 'select * from populated_places_simple_reduced', - cartocss: '#layer { marker-fill: red; marker-width: 32; marker-allow-overlap: true; }', - cartocss_version: '2.3.0', - widgets: { - country_places_count: { - type: 'aggregation', - options: { - column: 'adm0_a3', - aggregation: 'count' - } - } - } - } - } - ] - }; - - it("should expose an aggregation", function(done) { - getWidget(aggregationMapConfig, 'country_places_count', { own_filter: 0 }, function(err, res) { - if (err) { - return done(err); - } - - var aggregation = JSON.parse(res.body); - assert.equal(aggregation.categories.length, 6); - assert.deepEqual(aggregation.categories[0], { value: 769, category: 'USA', agg: false }); - - done(); - }); - }); - - it("should expose a filtered aggregation", function(done) { - var params = { - filters: { - layers: [ - {country_places_count: {accept: ['CAN']}} - ] - } - }; - getWidget(aggregationMapConfig, 'country_places_count', params, function(err, res) { - if (err) { - return done(err); - } - - var aggregation = JSON.parse(res.body); - assert.equal(aggregation.categories.length, 1); - assert.deepEqual(aggregation.categories[0], { value: 256, category: 'CAN', agg: false }); - - done(); - }); - }); - }); - - describe('range', function() { - var histogramMapConfig = { - version: '1.5.0', - layers: [ - { - type: 'mapnik', - options: { - sql: 'select * from populated_places_simple_reduced', - cartocss: '#layer { marker-fill: red; marker-width: 32; marker-allow-overlap: true; }', - cartocss_version: '2.3.0', - widgets: { - country_places_histogram: { - type: 'histogram', - options: { - column: 'pop_max' - } - } - } - } - } - ] - }; - - it("should expose an histogram", function(done) { - getWidget(histogramMapConfig, 'country_places_histogram', { own_filter: 0 }, function(err, res) { - if (err) { - return done(err); - } - - var histogram = JSON.parse(res.body); - // notice min value - assert.deepEqual( - histogram.bins[0], - { bin: 0, freq: 6497, min: 0, max: 742572, avg: 113511.16823149147 } - ); - - done(); - }); - }); - - it("should expose a filtered histogram", function(done) { - var params = { - filters: { - layers: [ - { - country_places_histogram: { min: 4000000 } - } - ] - } - }; - getWidget(histogramMapConfig, 'country_places_histogram', params, function(err, res) { - if (err) { - return done(err); - } - - var histogram = JSON.parse(res.body); - // notice min value - assert.deepEqual(histogram.bins[0], { - bin: 0, - freq: 62, - min: 4000000, - max: 9276403, - avg: 5815009.596774193 - }); - - done(); - }); - }); - }); - - describe('combine widget filters', function() { - var combinedWidgetsMapConfig = { - version: '1.5.0', - layers: [ - { - type: 'mapnik', - options: { - sql: 'select * from populated_places_simple_reduced', - cartocss: '#layer { marker-fill: red; marker-width: 32; marker-allow-overlap: true; }', - cartocss_version: '2.3.0', - widgets: { - country_places_count: { - type: 'aggregation', - options: { - column: 'adm0_a3', - aggregation: 'count' - } - }, - country_places_histogram: { - type: 'histogram', - options: { - column: 'pop_max' - } - } - } - } - } - ] - }; - - it("should expose a filtered aggregation", function(done) { - var params = { - filters: { - layers: [ - { - country_places_count: { reject: ['CHN'] } - } - ] - } - }; - getWidget(combinedWidgetsMapConfig, 'country_places_count', params, function(err, res) { - if (err) { - return done(err); - } - - var aggregation = JSON.parse(res.body); - - // first one would be CHN if reject filter wasn't applied - assert.deepEqual(aggregation.categories[0], { value: 769, category: "USA", agg: false }); - - // confirm 'CHN' was filtered out (reject) - assert.equal(aggregation.categories.reduce(function(sum, row) { - return sum + (row.category === 'CHN' ? 1 : 0); - }, 0), 0); - - done(); - }); - }); - - it("should expose a filtered aggregation", function(done) { - var params = { - filters: { - layers: [ - { - country_places_count: { reject: ['CHN'] }, - country_places_histogram: { min: 7000000 } - } - ] - } - }; - getWidget(combinedWidgetsMapConfig, 'country_places_count', params, function(err, res) { - if (err) { - return done(err); - } - - var aggregation = JSON.parse(res.body); - - // first one would be CHN if reject filter wasn't applied - assert.deepEqual(aggregation.categories[0], { value: 4, category: 'IND', agg: false }); - - // confirm 'CHN' was filtered out (reject) - assert.equal(aggregation.categories.reduce(function(sum, row) { - return sum + (row.category === 'CHN' ? 1 : 0); - }, 0), 0); - - done(); - }); - }); - - it("should allow to filter by bounding box a filtered aggregation", function(done) { - var params = { - filters: { - layers: [ - { - country_places_histogram: { min: 50000 } - } - ] - }, - bbox: '-20,0,45,60' - }; - getWidget(combinedWidgetsMapConfig, 'country_places_count', params, function(err, res) { - if (err) { - return done(err); - } - - var aggregation = JSON.parse(res.body); - - // first one would be CHN if reject filter wasn't applied - assert.deepEqual(aggregation.categories[0], { value: 96, category: "RUS", agg: false }); - - // confirm 'CHN' was filtered out (reject) - assert.equal(aggregation.categories.reduce(function(sum, row) { - return sum + (row.category === 'CHN' ? 1 : 0); - }, 0), 0); - - done(); - }); - }); - - it("should allow to filter by bounding box a filtered aggregation, with reject", function(done) { - var params = { - filters: { - layers: [ - { - country_places_count: { reject: ['RUS'] }, - country_places_histogram: { min: 50000 } - } - ] - }, - bbox: '-20,0,45,60' - }; - getWidget(combinedWidgetsMapConfig, 'country_places_count', params, function(err, res) { - if (err) { - return done(err); - } - - var aggregation = JSON.parse(res.body); - - // first one would be CHN if reject filter wasn't applied - assert.deepEqual(aggregation.categories[0], { value: 77, category: "TUR", agg: false }); - - // confirm 'CHN' was filtered out (reject) - assert.equal(aggregation.categories.reduce(function(sum, row) { - return sum + (row.category === 'CHN' ? 1 : 0); - }, 0), 0); - - done(); - }); - }); - }); - }); - -}); diff --git a/test/acceptance/widgets/aggregation.js b/test/acceptance/widgets/aggregation.js new file mode 100644 index 00000000..0b58fb65 --- /dev/null +++ b/test/acceptance/widgets/aggregation.js @@ -0,0 +1,74 @@ +require('../../support/test_helper'); + +var assert = require('../../support/assert'); +var TestClient = require('../../support/test-client'); + +describe('aggregation widgets', function() { + + var aggregationMapConfig = { + version: '1.5.0', + layers: [ + { + type: 'mapnik', + options: { + sql: 'select * from populated_places_simple_reduced', + cartocss: '#layer { marker-fill: red; marker-width: 32; marker-allow-overlap: true; }', + cartocss_version: '2.3.0', + widgets: { + country_places_count: { + type: 'aggregation', + options: { + column: 'adm0_a3', + aggregation: 'count' + } + } + } + } + } + ] + }; + + it("should expose an aggregation", function(done) { + var testClient = new TestClient(aggregationMapConfig); + testClient.getWidget('country_places_count', { own_filter: 0 }, function(err, res) { + if (err) { + return done(err); + } + + var aggregation = JSON.parse(res.body); + assert.equal(aggregation.categories.length, 6); + assert.deepEqual(aggregation.categories[0], { value: 769, category: 'USA', agg: false }); + + testClient.drain(done); + }); + }); + + describe('filters', function() { + + describe('category', function () { + + it("should expose a filtered aggregation", function (done) { + var params = { + filters: { + layers: [ + {country_places_count: {accept: ['CAN']}} + ] + } + }; + var testClient = new TestClient(aggregationMapConfig); + testClient.getWidget('country_places_count', params, function (err, res) { + if (err) { + return done(err); + } + + var aggregation = JSON.parse(res.body); + assert.equal(aggregation.categories.length, 1); + assert.deepEqual(aggregation.categories[0], { value: 256, category: 'CAN', agg: false }); + + testClient.drain(done); + }); + }); + }); + + }); +}); diff --git a/test/acceptance/widgets/histogram.js b/test/acceptance/widgets/histogram.js new file mode 100644 index 00000000..0eeb4ca6 --- /dev/null +++ b/test/acceptance/widgets/histogram.js @@ -0,0 +1,120 @@ +require('../../support/test_helper'); + +var assert = require('../../support/assert'); +var TestClient = require('../../support/test-client'); + +describe('histogram widgets', function() { + + it("should expose layer histogram", function(done) { + var histogramMapConfig = { + version: '1.5.0', + layers: [ + { + type: 'mapnik', + options: { + sql: 'select * from populated_places_simple_reduced', + cartocss: '#layer { marker-fill: red; marker-width: 32; marker-allow-overlap: true; }', + cartocss_version: '2.3.0', + widgets: { + pop_max: { + type: 'histogram', + options: { + column: 'pop_max' + } + } + } + } + } + ] + }; + + var testClient = new TestClient(histogramMapConfig); + + testClient.getWidget('pop_max', function(err, res) { + if (err) { + return done(err); + } + + var histogram = JSON.parse(res.body); + assert.ok(histogram.bins.length); + + testClient.drain(done); + }); + }); + + describe('filters', function() { + + describe('range', function() { + var histogramMapConfig = { + version: '1.5.0', + layers: [ + { + type: 'mapnik', + options: { + sql: 'select * from populated_places_simple_reduced', + cartocss: '#layer { marker-fill: red; marker-width: 32; marker-allow-overlap: true; }', + cartocss_version: '2.3.0', + widgets: { + country_places_histogram: { + type: 'histogram', + options: { + column: 'pop_max' + } + } + } + } + } + ] + }; + + it("should expose an histogram", function(done) { + var testClient = new TestClient(histogramMapConfig); + testClient.getWidget('country_places_histogram', { own_filter: 0 }, function(err, res) { + if (err) { + return done(err); + } + + var histogram = JSON.parse(res.body); + // notice min value + assert.deepEqual( + histogram.bins[0], + { bin: 0, freq: 6497, min: 0, max: 742572, avg: 113511.16823149147 } + ); + + testClient.drain(done); + }); + }); + + it("should expose a filtered histogram", function(done) { + var params = { + filters: { + layers: [ + { + country_places_histogram: { min: 4000000 } + } + ] + } + }; + var testClient = new TestClient(histogramMapConfig); + testClient.getWidget('country_places_histogram', params, function(err, res) { + if (err) { + return done(err); + } + + var histogram = JSON.parse(res.body); + // notice min value + assert.deepEqual(histogram.bins[0], { + bin: 0, + freq: 62, + min: 4000000, + max: 9276403, + avg: 5815009.596774193 + }); + + testClient.drain(done); + }); + }); + }); + }); + +}); diff --git a/test/acceptance/widgets/list.js b/test/acceptance/widgets/list.js new file mode 100644 index 00000000..87fbf7df --- /dev/null +++ b/test/acceptance/widgets/list.js @@ -0,0 +1,51 @@ +require('../../support/test_helper'); + +var assert = require('../../support/assert'); +var TestClient = require('../../support/test-client'); + +describe('list widgets', function() { + + it("should expose layer list", function(done) { + + var listWidgetMapConfig = { + version: '1.5.0', + layers: [ + { + type: 'mapnik', + options: { + sql: 'select * from test_table', + cartocss: '#layer { marker-fill: red; marker-width: 32; marker-allow-overlap: true; }', + cartocss_version: '2.3.0', + widgets: { + names: { + type: 'list', + options: { + columns: ['name'] + } + } + } + } + } + ] + }; + + var testClient = new TestClient(listWidgetMapConfig); + + testClient.getWidget('names', function(err, res) { + if (err) { + return done(err); + } + + var expectedList = [ + {name:"Hawai"}, + {name:"El Estocolmo"}, + {name:"El Rey del Tallarín"}, + {name:"El Lacón"}, + {name:"El Pico"} + ]; + assert.deepEqual(JSON.parse(res.body).rows, expectedList); + + testClient.drain(done); + }); + }); +}); diff --git a/test/acceptance/widgets/widgets.js b/test/acceptance/widgets/widgets.js new file mode 100644 index 00000000..6fee7a29 --- /dev/null +++ b/test/acceptance/widgets/widgets.js @@ -0,0 +1,162 @@ +require('../../support/test_helper'); + +var assert = require('../../support/assert'); +var TestClient = require('../../support/test-client'); + +describe('widget filters', function() { + + describe('combine widget filters', function() { + var combinedWidgetsMapConfig = { + version: '1.5.0', + layers: [ + { + type: 'mapnik', + options: { + sql: 'select * from populated_places_simple_reduced', + cartocss: '#layer { marker-fill: red; marker-width: 32; marker-allow-overlap: true; }', + cartocss_version: '2.3.0', + widgets: { + country_places_count: { + type: 'aggregation', + options: { + column: 'adm0_a3', + aggregation: 'count' + } + }, + country_places_histogram: { + type: 'histogram', + options: { + column: 'pop_max' + } + } + } + } + } + ] + }; + + it("should expose a filtered aggregation", function(done) { + var params = { + filters: { + layers: [ + { + country_places_count: { reject: ['CHN'] } + } + ] + } + }; + var testClient = new TestClient(combinedWidgetsMapConfig); + testClient.getWidget('country_places_count', params, function(err, res) { + if (err) { + return done(err); + } + + var aggregation = JSON.parse(res.body); + + // first one would be CHN if reject filter wasn't applied + assert.deepEqual(aggregation.categories[0], { value: 769, category: "USA", agg: false }); + + // confirm 'CHN' was filtered out (reject) + assert.equal(aggregation.categories.reduce(function(sum, row) { + return sum + (row.category === 'CHN' ? 1 : 0); + }, 0), 0); + + testClient.drain(done); + }); + }); + + it("should expose a filtered aggregation", function(done) { + var params = { + filters: { + layers: [ + { + country_places_count: { reject: ['CHN'] }, + country_places_histogram: { min: 7000000 } + } + ] + } + }; + var testClient = new TestClient(combinedWidgetsMapConfig); + testClient.getWidget('country_places_count', params, function(err, res) { + if (err) { + return done(err); + } + + var aggregation = JSON.parse(res.body); + + // first one would be CHN if reject filter wasn't applied + assert.deepEqual(aggregation.categories[0], { value: 4, category: 'IND', agg: false }); + + // confirm 'CHN' was filtered out (reject) + assert.equal(aggregation.categories.reduce(function(sum, row) { + return sum + (row.category === 'CHN' ? 1 : 0); + }, 0), 0); + + testClient.drain(done); + }); + }); + + it("should allow to filter by bounding box a filtered aggregation", function(done) { + var params = { + filters: { + layers: [ + { + country_places_histogram: { min: 50000 } + } + ] + }, + bbox: '-20,0,45,60' + }; + var testClient = new TestClient(combinedWidgetsMapConfig); + testClient.getWidget('country_places_count', params, function(err, res) { + if (err) { + return done(err); + } + + var aggregation = JSON.parse(res.body); + + // first one would be CHN if reject filter wasn't applied + assert.deepEqual(aggregation.categories[0], { value: 96, category: "RUS", agg: false }); + + // confirm 'CHN' was filtered out (reject) + assert.equal(aggregation.categories.reduce(function(sum, row) { + return sum + (row.category === 'CHN' ? 1 : 0); + }, 0), 0); + + testClient.drain(done); + }); + }); + + it("should allow to filter by bounding box a filtered aggregation, with reject", function(done) { + var params = { + filters: { + layers: [ + { + country_places_count: { reject: ['RUS'] }, + country_places_histogram: { min: 50000 } + } + ] + }, + bbox: '-20,0,45,60' + }; + var testClient = new TestClient(combinedWidgetsMapConfig); + testClient.getWidget('country_places_count', params, function(err, res) { + if (err) { + return done(err); + } + + var aggregation = JSON.parse(res.body); + + // first one would be CHN if reject filter wasn't applied + assert.deepEqual(aggregation.categories[0], { value: 77, category: "TUR", agg: false }); + + // confirm 'CHN' was filtered out (reject) + assert.equal(aggregation.categories.reduce(function(sum, row) { + return sum + (row.category === 'CHN' ? 1 : 0); + }, 0), 0); + + testClient.drain(done); + }); + }); + }); +}); diff --git a/test/support/test-client.js b/test/support/test-client.js new file mode 100644 index 00000000..d2df611b --- /dev/null +++ b/test/support/test-client.js @@ -0,0 +1,119 @@ +'use strict'; + +var qs = require('querystring'); +var step = require('step'); + +var LayergroupToken = require('../../lib/cartodb/models/layergroup_token'); + +var assert = require('./assert'); +var helper = require('./test_helper'); + +var CartodbWindshaft = require('../../lib/cartodb/server'); +var serverOptions = require('../../lib/cartodb/server_options'); +var server = new CartodbWindshaft(serverOptions); + + +function TestClient(mapConfig) { + this.mapConfig = mapConfig; + this.keysToDelete = {}; +} + +module.exports = TestClient; + +TestClient.prototype.getWidget = function(widgetName, params, callback) { + var self = this; + + if (!callback) { + callback = params; + params = {}; + } + + var url = '/api/v1/map'; + if (params && params.filters) { + url += '?' + qs.stringify({ filters: JSON.stringify(params.filters) }); + } + + var layergroupId; + step( + function createLayergroup() { + var next = this; + assert.response(server, + { + url: url, + method: 'POST', + headers: { + host: 'localhost', + 'Content-Type': 'application/json' + }, + data: JSON.stringify(self.mapConfig) + }, + { + status: 200, + headers: { + 'Content-Type': 'application/json; charset=utf-8' + } + }, + function(res, err) { + if (err) { + return next(err); + } + var parsedBody = JSON.parse(res.body); + var expectedWidgetURLS = { + http: "/api/v1/map/" + parsedBody.layergroupid + "/0/widget/" + widgetName + }; + assert.ok(parsedBody.metadata.layers[0].widgets[widgetName]); + assert.ok( + parsedBody.metadata.layers[0].widgets[widgetName].url.http.match(expectedWidgetURLS.http) + ); + return next(null, parsedBody.layergroupid); + } + ); + }, + function getWidgetResult(err, _layergroupId) { + assert.ifError(err); + + var next = this; + layergroupId = _layergroupId; + + var urlParams = { + own_filter: params.hasOwnProperty('own_filter') ? params.own_filter : 1 + }; + if (params && params.bbox) { + urlParams.bbox = params.bbox; + } + url = '/api/v1/map/' + layergroupId + '/0/widget/' + widgetName + '?' + qs.stringify(urlParams); + + assert.response(server, + { + url: url, + method: 'GET', + headers: { + host: 'localhost' + } + }, + { + status: 200, + headers: { + 'Content-Type': 'application/json; charset=utf-8' + } + }, + function(res, err) { + if (err) { + return next(err); + } + + next(null, res); + } + ); + }, + function finish(err, res) { + self.keysToDelete['map_cfg|' + LayergroupToken.parse(layergroupId).token] = 0; + self.keysToDelete['user:localhost:mapviews:global'] = 5; + return callback(err, res); + } + ); +}; + +TestClient.prototype.drain = function(callback) { + helper.deleteRedisKeys(this.keysToDelete, callback); +};