From 59fb1dea540fd76c27da3676605ffeff7efd0200 Mon Sep 17 00:00:00 2001 From: Raul Ochoa Date: Tue, 6 Oct 2015 18:49:11 +0200 Subject: [PATCH 01/72] Start using mapconfig-extension branch from windshaft --- npm-shrinkwrap.json | 41 ++++++++++++++++++++++++++--------------- package.json | 2 +- 2 files changed, 27 insertions(+), 16 deletions(-) diff --git a/npm-shrinkwrap.json b/npm-shrinkwrap.json index 6370ac3a..727251f8 100644 --- a/npm-shrinkwrap.json +++ b/npm-shrinkwrap.json @@ -68,14 +68,14 @@ "dependencies": { "unpipe": { "version": "1.0.0", - "from": "unpipe@1.0.0", + "from": "unpipe@~1.0.0", "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz" } } }, "type-is": { "version": "1.6.9", - "from": "type-is@~1.6.9", + "from": "type-is@~1.6.6", "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.9.tgz", "dependencies": { "media-typer": { @@ -85,7 +85,7 @@ }, "mime-types": { "version": "2.1.7", - "from": "mime-types@~2.1.7", + "from": "mime-types@~2.1.6", "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.7.tgz", "dependencies": { "mime-db": { @@ -192,7 +192,7 @@ "dependencies": { "mime-types": { "version": "2.1.7", - "from": "mime-types@~2.1.7", + "from": "mime-types@~2.1.6", "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.7.tgz", "dependencies": { "mime-db": { @@ -381,7 +381,7 @@ }, "mime-types": { "version": "2.1.7", - "from": "mime-types@~2.1.7", + "from": "mime-types@~2.1.6", "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.7.tgz", "dependencies": { "mime-db": { @@ -441,7 +441,7 @@ }, "inherits": { "version": "2.0.1", - "from": "inherits@2", + "from": "inherits@~2.0.1", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz" } } @@ -533,7 +533,7 @@ }, "inherits": { "version": "2.0.1", - "from": "inherits@2", + "from": "inherits@~2.0.1", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz" }, "isarray": { @@ -620,9 +620,9 @@ "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.4.1.tgz" }, "tough-cookie": { - "version": "2.0.0", + "version": "2.1.0", "from": "tough-cookie@>=0.12.0", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.0.0.tgz" + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.1.0.tgz" }, "http-signature": { "version": "0.11.0", @@ -711,9 +711,9 @@ "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-1.8.0.tgz", "dependencies": { "bluebird": { - "version": "2.10.1", + "version": "2.10.2", "from": "bluebird@^2.9.30", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-2.10.1.tgz" + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-2.10.2.tgz" }, "chalk": { "version": "1.1.1", @@ -827,8 +827,9 @@ "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.6.0.tgz" }, "windshaft": { - "version": "1.0.1", - "from": "windshaft@~1.0.1", + "version": "1.0.2", + "from": "https://github.com/CartoDB/Windshaft/tarball/mapconfig-extension", + "resolved": "https://github.com/CartoDB/Windshaft/tarball/mapconfig-extension", "dependencies": { "mapnik": { "version": "1.4.15-cdb2", @@ -1301,9 +1302,9 @@ "resolved": "https://registry.npmjs.org/node-uuid/-/node-uuid-1.4.3.tgz" }, "tough-cookie": { - "version": "2.0.0", + "version": "2.1.0", "from": "tough-cookie@>=0.12.0", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.0.0.tgz" + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.1.0.tgz" }, "form-data": { "version": "0.1.4", @@ -2966,6 +2967,11 @@ } } } + }, + "semver": { + "version": "1.1.4", + "from": "semver@~1.1.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-1.1.4.tgz" } } }, @@ -3046,6 +3052,11 @@ } } }, + "semver": { + "version": "5.0.3", + "from": "semver@~5.0.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.0.3.tgz" + }, "carto": { "version": "0.15.1-cdb1", "from": "https://github.com/CartoDB/carto/tarball/0.15.1-cdb1", diff --git a/package.json b/package.json index 473fbbdf..12f9194e 100644 --- a/package.json +++ b/package.json @@ -29,7 +29,7 @@ "node-statsd": "~0.0.7", "underscore" : "~1.6.0", "dot": "~1.0.2", - "windshaft": "~1.0.1", + "windshaft": "https://github.com/CartoDB/Windshaft/tarball/mapconfig-extension", "step": "~0.0.6", "queue-async": "~1.0.7", "request": "~2.62.0", From b80e80bd61707c711b928e1f12a1e3aa599f8576 Mon Sep 17 00:00:00 2001 From: Raul Ochoa Date: Tue, 6 Oct 2015 19:46:52 +0200 Subject: [PATCH 02/72] Do not pass MapStore as it is no longer needed in Attributes backend --- lib/cartodb/server.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/cartodb/server.js b/lib/cartodb/server.js index e7824d2b..c608dc4d 100644 --- a/lib/cartodb/server.js +++ b/lib/cartodb/server.js @@ -131,7 +131,7 @@ module.exports = function(serverOptions) { var rendererStatsReporter = new RendererStatsReporter(rendererCache, rendererCacheOpts.statsInterval); rendererStatsReporter.start(); - var attributesBackend = new windshaft.backend.Attributes(mapStore); + var attributesBackend = new windshaft.backend.Attributes(); var previewBackend = new windshaft.backend.Preview(rendererCache); var tileBackend = new windshaft.backend.Tile(rendererCache); var mapValidatorBackend = new windshaft.backend.MapValidator(tileBackend, attributesBackend); From 9bc95a6071372db87849b473d32381b17b714128 Mon Sep 17 00:00:00 2001 From: Raul Ochoa Date: Tue, 6 Oct 2015 19:47:44 +0200 Subject: [PATCH 03/72] List endpoint for layergroups --- lib/cartodb/controllers/layergroup.js | 37 +++++++- lib/cartodb/server.js | 1 + test/acceptance/lists.js | 121 ++++++++++++++++++++++++++ 3 files changed, 158 insertions(+), 1 deletion(-) create mode 100644 test/acceptance/lists.js diff --git a/lib/cartodb/controllers/layergroup.js b/lib/cartodb/controllers/layergroup.js index 9194c05f..f352b263 100644 --- a/lib/cartodb/controllers/layergroup.js +++ b/lib/cartodb/controllers/layergroup.js @@ -17,6 +17,7 @@ var TablesCacheEntry = require('../cache/model/database_tables_entry'); * @param {TileBackend} tileBackend * @param {PreviewBackend} previewBackend * @param {AttributesBackend} attributesBackend + * @param {ListBackend} listBackend * @param {SurrogateKeysCache} surrogateKeysCache * @param {UserLimitsApi} userLimitsApi * @param {QueryTablesApi} queryTablesApi @@ -24,13 +25,14 @@ var TablesCacheEntry = require('../cache/model/database_tables_entry'); * @constructor */ function LayergroupController(authApi, pgConnection, mapStore, tileBackend, previewBackend, attributesBackend, - surrogateKeysCache, userLimitsApi, queryTablesApi, layergroupAffectedTables) { + listBackend, surrogateKeysCache, userLimitsApi, queryTablesApi, layergroupAffectedTables) { BaseController.call(this, authApi, pgConnection); this.mapStore = mapStore; this.tileBackend = tileBackend; this.previewBackend = previewBackend; this.attributesBackend = attributesBackend; + this.listBackend = listBackend; this.surrogateKeysCache = surrogateKeysCache; this.userLimitsApi = userLimitsApi; this.queryTablesApi = queryTablesApi; @@ -66,6 +68,39 @@ LayergroupController.prototype.register = function(app) { app.get(app.base_url_mapconfig + '/static/bbox/:token/:west,:south,:east,:north/:width/:height.:format', cors(), userMiddleware, this.bbox.bind(this)); + + app.get(app.base_url_mapconfig + + '/:token/list/:listName', cors(), userMiddleware, + this.list.bind(this)); + +}; + +LayergroupController.prototype.list = function(req, res) { + var self = this; + + step( + function setupParams() { + self.req2params(req, this); + }, + function retrieveList(err) { + assert.ifError(err); + + var mapConfigProvider = new MapStoreMapConfigProvider( + self.mapStore, req.context.user, self.userLimitsApi, req.params + ); + self.listBackend.getList(mapConfigProvider, req.params, this); + }, + function finish(err, tile, stats) { + req.profiler.add(stats || {}); + + if (err) { + self.sendError(req, res, err, 'GET LIST'); + } else { + self.sendResponse(req, res, tile, 200); + } + } + ); + }; LayergroupController.prototype.attributes = function(req, res) { diff --git a/lib/cartodb/server.js b/lib/cartodb/server.js index c608dc4d..2745ff23 100644 --- a/lib/cartodb/server.js +++ b/lib/cartodb/server.js @@ -161,6 +161,7 @@ module.exports = function(serverOptions) { tileBackend, previewBackend, attributesBackend, + new windshaft.backend.List(), surrogateKeysCache, userLimitsApi, queryTablesApi, diff --git a/test/acceptance/lists.js b/test/acceptance/lists.js new file mode 100644 index 00000000..9bd07a54 --- /dev/null +++ b/test/acceptance/lists.js @@ -0,0 +1,121 @@ +var assert = require('../support/assert'); +var step = require('step'); + +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('lists', function() { + + var keysToDelete; + + beforeEach(function() { + keysToDelete = {}; + }); + + afterEach(function(done) { + helper.deleteRedisKeys(keysToDelete, done); + }); + + + it("should expose layer list", function(done) { + + var layergroup = { + 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' + }, + lists: { + names: { + columns: ['name'] + } + } + } + ] + }; + + var layergroupId; + step( + function createLayergroup() { + var next = this; + assert.response(server, + { + url: '/api/v1/map', + method: 'POST', + headers: { + host: 'localhost', + 'Content-Type': 'application/json' + }, + data: JSON.stringify(layergroup) + }, + { + status: 200, + headers: { + 'Content-Type': 'application/json; charset=utf-8' + } + }, + function(res, err) { + if (err) { + return next(err); + } + return next(null, JSON.parse(res.body).layergroupid); + } + ); + }, + function getList(err, _layergroupId) { + assert.ifError(err); + + var next = this; + layergroupId = _layergroupId; + + assert.response(server, + { + url: '/api/v1/map/' + layergroupId + '/list/names', + method: 'GET', + headers: { + host: 'localhost' + } + }, + { + status: 200, + headers: { + 'Content-Type': 'application/json; charset=utf-8' + } + }, + function(res, err) { + if (err) { + return next(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), expectedList); + + next(null); + } + ); + }, + function finish(err) { + keysToDelete['map_cfg|' + LayergroupToken.parse(layergroupId).token] = 0; + keysToDelete['user:localhost:mapviews:global'] = 5; + done(err); + } + ); + }); + +}); From 8db1ad6f1912def4bfe68c02686b71580309c0d6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Carlos=20Matall=C3=ADn?= Date: Thu, 22 Oct 2015 13:28:08 +0200 Subject: [PATCH 04/72] newdocs: split files --- docs/Map-API.md | 980 +-------------------------------------- docs/anonymous_maps.md | 200 ++++++++ docs/general_concepts.md | 27 ++ docs/named_maps.md | 424 +++++++++++++++++ docs/quickstart.md | 105 +++++ docs/static_maps_api.md | 212 +++++++++ 6 files changed, 975 insertions(+), 973 deletions(-) create mode 100644 docs/anonymous_maps.md create mode 100644 docs/general_concepts.md create mode 100644 docs/named_maps.md create mode 100644 docs/quickstart.md create mode 100644 docs/static_maps_api.md diff --git a/docs/Map-API.md b/docs/Map-API.md index 75f20301..a93af594 100644 --- a/docs/Map-API.md +++ b/docs/Map-API.md @@ -1,977 +1,11 @@ -## Maps API +# 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/). -You can create two types of maps with the Maps API: +## Documentation -- **Anonymous maps** - You can create maps using your CartoDB public data. Any client can change the read-only SQL and CartoCSS parameters that generate the map tiles. These maps can be created from a JavaScript application alone and no authenticated calls are needed. See [this CartoDB.js example]({{ '/cartodb-platform/cartodb-js.html' | prepend: site.baseurl }}). - -- **Named maps** - There are also maps that have access to your private data. These maps require an owner to setup and modify any SQL and CartoCSS parameters and are not modifiable without new setup calls. - -## Quickstart - -### Anonymous maps - -Here is an example of how to create an anonymous map with JavaScript: - -```javascript -var mapconfig = { - "version": "1.3.1", - "layers": [{ - "type": "cartodb", - "options": { - "cartocss_version": "2.1.1", - "cartocss": "#layer { polygon-fill: #FFF; }", - "sql": "select * from european_countries_e" - } - }] -} - -$.ajax({ - crossOrigin: true, - type: 'POST', - dataType: 'json', - contentType: 'application/json', - url: 'https://documentation.cartodb.com/api/v1/map', - data: JSON.stringify(mapconfig), - success: function(data) { - var templateUrl = 'https://documentation.cartodb.com/api/v1/map/' + data.layergroupid + '/{z}/{x}/{y}.png' - console.log(templateUrl); - } -}) -``` - -### Named maps - -Let's create a named map using some private tables in a CartoDB account. -The following map config sets up a map of European countries that have a white fill color: - -```javascript -{ - "version": "0.0.1", - "name": "test", - "auth": { - "method": "open" - }, - "layergroup": { - "layers": [{ - "type": "mapnik", - "options": { - "cartocss_version": "2.1.1", - "cartocss": "#layer { polygon-fill: #FFF; }", - "sql": "select * from european_countries_e" - } - }] - } -} -``` - -The map config needs to be sent to CartoDB's Map API using an authenticated call. Here we will use a command line tool called `curl`. For more info about this tool, see [this blog post](http://quickleft.com/blog/command-line-tutorials-curl), or type ``man curl`` in bash. Using `curl`, and storing the config from above in a file `mapconfig.json`, the call would look like: - -
-```bash -curl 'https://{account}.cartodb.com/api/v1/map/named?api_key=APIKEY' -H 'Content-Type: application/json' -d @mapconfig.json -``` - -To get the `URL` to fetch the tiles you need to instantiate the map, where `template_id` is the template name from the previous response. - -
-```bash -curl -X POST 'https://{account}.cartodb.com/api/v1/map/named/:template_id' -H 'Content-Type: application/json' -``` - -The response will return JSON with properties for the `layergroupid`, the timestamp (`last_updated`) of the last data modification and some key/value pairs with `metadata` for the `layers`. -Note: all `layers` in `metadata` will always have a `type` string and a `meta` dictionary with the key/value pairs. - -Here is an example response: - -```javascript -{ - "layergroupid": "c01a54877c62831bb51720263f91fb33:0", - "last_updated": "1970-01-01T00:00:00.000Z", - "metadata": { - "layers": [ - { - "type": "mapnik", - "meta": {} - } - ] - } -} -``` - -You can use the `layergroupid` to instantiate a URL template for accessing tiles on the client. Here we use the `layergroupid` from the example response above in this URL template: - -```bash -https://documentation.cartodb.com/api/v1/map/c01a54877c62831bb51720263f91fb33:0/{z}/{x}/{y}.png -``` - -## General Concepts - -The following concepts are the same for every endpoint in the API except when it's noted explicitly. - -### Auth - -By default, users do not have access to private tables in CartoDB. In order to instantiate a map from private table data an API Key is required. Additionally, to include some endpoints, an API Key must be included (e.g. creating a named map). - -To execute an authorized request, `api_key=YOURAPIKEY` should be added to the request URL. The param can be also passed as POST param. Using HTTPS is mandatory when you are performing requests that include your `api_key`. - -### Errors - -Errors are reported using standard HTTP codes and extended information encoded in JSON with this format: - -```javascript -{ - "errors": [ - "access forbidden to table TABLE" - ] -} -``` - -If you use JSONP, the 200 HTTP code is always returned so the JavaScript client can receive errors from the JSON object. - -### CORS support - -All the endpoints, which might be accessed using a web browser, add CORS headers and allow OPTIONS method. - -## Anonymous Maps - -Anonymous maps allows you to instantiate a map given SQL and CartoCSS. It also allows you to add interaction capabilities using [UTF Grid.](https://github.com/mapbox/utfgrid-spec) - -### Instantiate - -#### Definition - -
-```html -POST /api/v1/map -``` - -#### Params - -```javascript -{ - "version": "1.3.0", - "layers": [{ - "type": "mapnik", - "options": { - "cartocss_version": "2.1.1", - "cartocss": "#layer { polygon-fill: #FFF; }", - "sql": "select * from european_countries_e", - "interactivity": ["cartodb_id", "iso3"] - } - }] -} -``` - -Should be a [Mapconfig](https://github.com/CartoDB/Windshaft/blob/0.44.1/doc/MapConfig-1.3.0.md). - -#### Response - -The response includes: - -- **layergroupid** - The ID for that map, used to compose the URL for the tiles. The final URL is: - - ```html - https://{account}.cartodb.com/api/v1/map/:layergroupid/{z}/{x}/{y}.png - ``` - -- **updated_at** - The ISO date of the last time the data involved in the query was updated. - -- **metadata** - Includes information about the layers. - - - -- **cdn_url** - URLs to fetch the data using the best CDN for your zone. - -#### Example - -
REQUEST
-```bash -curl 'https://documentation.cartodb.com/api/v1/map' -H 'Content-Type: application/json' -d @mapconfig.json -``` - -
RESPONSE
-```javascript -{ - "layergroupid": "c01a54877c62831bb51720263f91fb33:0", - "last_updated": "1970-01-01T00:00:00.000Z", - "metadata": { - "layers": [ - { - "type": "mapnik", - "meta": {} - } - ] - }, - "cdn_url": { - "http": "http://cdb.com", - "https": "https://cdb.com" - } -} -``` - -##### Retrieve resources from the layergroup - -###### Mapnik tiles can be accessed using: - -These tiles will get just the mapnik layers. To get individual layers see next section. - -```bash -https://documentation.cartodb.com/api/v1/map/c01a54877c62831bb51720263f91fb33:0/{z}/{x}/{y}.png -``` - -###### Individual layers - -The MapConfig specification holds the layers definition in a 0-based index. Layers can be requested individually in different formats depending on the layer type. - -Individual layers can be accessed using that 0-based index. For UTF grid tiles: - -```bash -https://documentation.cartodb.com/api/v1/map/c01a54877c62831bb51720263f91fb33:0/:layer/{z}/{x}/{y}.grid.json -``` - -In this case, `:layer` as 0 returns the UTF grid tiles/attributes for layer 0, the only layer in the example MapConfig. - -If the MapConfig had a Torque layer at index 1 it could be possible to request it with: - -```bash -https://documentation.cartodb.com/api/v1/map/c01a54877c62831bb51720263f91fb33:0/1/{z}/{x}/{y}.torque.json -``` - -###### Attributes defined in `attributes` section: - -```bash -https://documentation.cartodb.com/api/v1/map/c01a54877c62831bb51720263f91fb33:0/:layer/attributes/:feature_id -``` - -Which returns JSON with the attributes defined, like: - -```javascript -{ "c": 1, "d": 2 } -``` - -###### Blending and layer selection - -```bash -https://documentation.cartodb.com/api/v1/map/c01a54877c62831bb51720263f91fb33:0/:layer_filter/{z}/{x}/{y}.png -``` - -Note: currently format is limited to `png`. - -`:layer_filter` can be used to select some layers to be rendered together. `:layer_filter` supports two formats: - -- `all` alias - -Using `all` as `:layer_filter` will blend all layers in the layergroup - -```bash -https://documentation.cartodb.com/api/v1/map/c01a54877c62831bb51720263f91fb33:0/all/{z}/{x}/{y}.png -``` - -- Filter by layer index - -A list of comma separated layer indexes can be used to just render a subset of layers. For example `0,3,4` will filter and blend layers with indexes 0, 3, and 4. - -```bash -https://documentation.cartodb.com/api/v1/map/c01a54877c62831bb51720263f91fb33:0/0,3,4/{z}/{x}/{y}.png -``` - -Some notes about filtering: - - - Invalid index values or out of bounds indexes will end in `Invalid layer filtering` errors. - - Once a mapnik layer is selected, all mapnik layers will get blended. As this may change in the future **it is - recommended** to always select all mapnik layers if you want to select at least one so you will get a consistent - behavior in the future. - - Ordering is not considered. So right now filtering layers 0,3,4 is the very same thing as filtering 3,4,0. As this - may change in the future **it is recommended** to always select the layers in ascending order so you will get a - consistent behavior in the future. - -### Create JSONP - -The JSONP endpoint is provided in order to allow web browsers access which don't support CORS. - -#### Definition - -
-```bash -GET /api/v1/map?callback=method -``` - -#### Params - -- **config** - Encoded JSON with the params for creating named maps (the variables defined in the template). - -- **lmza** - This attribute contains the same as config but LZMA compressed. It cannot be used at the same time as `config`. - -- **callback** - JSON callback name. - -#### Example - -
REQUEST
-```bash -curl "https://documentation.cartodb.com/api/v1/map?callback=callback&config=%7B%22version%22%3A%221.0.1%22%2C%22layers%22%3A%5B%7B%22type%22%3A%22cartodb%22%2C%22options%22%3A%7B%22sql%22%3A%22select+%2A+from+european_countries_e%22%2C%22cartocss%22%3A%22%23european_countries_e%7B+polygon-fill%3A+%23FF6600%3B+%7D%22%2C%22cartocss_version%22%3A%222.3.0%22%2C%22interactivity%22%3A%5B%22cartodb_id%22%5D%7D%7D%5D%7D" -``` - -
RESPONSE
-```javascript -callback({ - layergroupid: "d9034c133262dfb90285cea26c5c7ad7:0", - cdn_url: { - "http": "http://cdb.com", - "https": "https://cdb.com" - }, - last_updated: "1970-01-01T00:00:00.000Z" -}) -``` - -### Remove - -Anonymous maps cannot be removed by an API call. They will expire after about five minutes but sometimes longer. If an anonymous map expires and tiles are requested from it, an error will be raised. This could happen if a user leaves a map open and after time, returns to the map and attempts to interact with it in a way that requires new tiles (e.g. zoom). The client will need to go through the steps of creating the map again to fix the problem. - - -## 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. - -The main two differences compared to anonymous maps are: - -- **auth layer** - This allows you to control who is able to see the map based on a token auth - -- **templates** - Since the MapConfig is static it can contain some variables so the client can modify the map's appearance using those variables. - -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). - -### Create - -#### Definition - -
-```html -POST /api/v1/map/named -``` - -#### Params - -- **api_key** is required - -
template.json
-```javascript -{ - "version": "0.0.1", - "name": "template_name", - "auth": { - "method": "token", - "valid_tokens": [ - "auth_token1", - "auth_token2" - ] - }, - "placeholders": { - "color": { - "type": "css_color", - "default": "red" - }, - "cartodb_id": { - "type": "number", - "default": 1 - } - }, - "layergroup": { - "version": "1.0.1", - "layers": [ - { - "type": "cartodb", - "options": { - "cartocss_version": "2.1.1", - "cartocss": "#layer { polygon-fill: <%= color %>; }", - "sql": "select * from european_countries_e WHERE cartodb_id = <%= cartodb_id %>" - } - } - ] - }, - "view": { - "zoom": 4, - "center": { - "lng": 0, - "lat": 0 - }, - "bounds": { - "west": -45, - "south": -45, - "east": 45, - "north": 45 - } - } -} -``` - -##### Arguments - -- **name**: There can be at most _one_ template with the same name for any user. Valid names start with a letter or a number, and only contain letters, numbers, dashes (-) or underscores (_). -- **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. -- **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. - - **zoom** The zoom level to use - - **center** - - **lng** The longitude to use for the center - - **lat** The latitude to use for the center - - **bounds** - - **west**: LowerCorner longitude for the bounding box, in decimal degrees (aka most western) - - **south**: LowerCorner latitude for the bounding box, in decimal degrees (aka most southern) - - **east**: UpperCorner longitude for the bounding box, in decimal degrees (aka most eastern) - - **north**: UpperCorner latitude for the bounding box, in decimal degrees (aka most northern) - -#### Template Format - -A templated `layergroup` allows the use of placeholders in the "cartocss" and "sql" elements of the "option" object in any "layer" of a `layergroup` configuration - -Valid placeholder names start with a letter and can only contain letters, numbers, or underscores. They have to be written between the `<%=` and `%>` strings in order to be replaced. - -##### Example - -```javascript -<%= my_color %> -``` - -The set of supported placeholders for a template will need to be explicitly defined with a specific type and default value for each. - -#### Placeholder Types - -The placeholder type will determine the kind of escaping for the associated value. Supported types are: - -- **sql_literal** internal single-quotes will be sql-escaped -- **sql_ident** internal double-quotes will be sql-escaped -- **number** can only contain numerical representation -- **css_color** can only contain color names or hex-values - -Placeholder default values will be used whenever new values are not provided as options at the time of creation on the client. They can also be used to test the template by creating a default version with new options provided. - -When using templates, be very careful about your selections as they can give broad access to your data if they are defined losely. - -
REQUEST
-```html -curl -X POST \ - -H 'Content-Type: application/json' \ - -d @template.json \ - 'https://documentation.cartodb.com/api/v1/map/named?api_key=APIKEY' -``` - -
RESPONSE
-```javascript -{ - "template_id":"name", -} -``` - -### Instantiate - -Instantiating a map allows you to get the information needed to fetch tiles. That temporal map is an anonymous map. - -#### Definition - -
-```html -POST /api/v1/map/named/:template_name -``` - -#### Param - -- **auth_token** optional, but required when `"method"` is set to `"token"` - -```javascript -// params.json -{ - "color": "#ff0000", - "cartodb_id": 3 -} -``` - -The fields you pass as `params.json` depend on the variables allowed by the named map. If there are variables missing it will raise an error (HTTP 400) - -- **auth_token** *optional* if the named map needs auth - -#### Example - -You can initialize a template map by passing all of the required parameters in a POST to `/api/v1/map/named/:template_name`. - -Valid credentials will be needed if required by the template. - -
REQUEST
-```bash -curl -X POST \ - -H 'Content-Type: application/json' \ - -d @params.json \ - 'https://documentation.cartodb.com/api/v1/map/named/@template_name?auth_token=AUTH_TOKEN' -``` - -
Response
-```javascript -{ - "layergroupid": "docs@fd2861af@c01a54877c62831bb51720263f91fb33:123456788", - "last_updated": "2013-11-14T11:20:15.000Z" -} -``` - -
Error
-```javascript -{ - "errors" : ["Some error string here"] -} -``` - -You can then use the `layergroupid` for fetching tiles and grids as you would normally (see anonymous map section). However you'll need to show the `auth_token`, if required by the template. - -### Using JSONP - -There is also a special endpoint to be able to initialize a map using JSONP (for old browsers). - -#### Definition - -
-```bash -GET /api/v1/map/named/:template_name/jsonp -``` - -#### Params - -- **auth_token** optional, but required when `"method"` is set to `"token"` -- **config** Encoded JSON with the params for creating named maps (the variables defined in the template) -- **lmza** This attribute contains the same as config but LZMA compressed. It cannot be used at the same time than `config`. -- **callback:** JSON callback name - -
REQUEST
-```bash -curl 'https://documentation.cartodb.com/api/v1/map/named/:template_name/jsonp?auth_token=AUTH_TOKEN&callback=callback&config=template_params_json' -``` - -
RESPONSE
-```javascript -callback({ - "layergroupid":"c01a54877c62831bb51720263f91fb33:0", - "last_updated":"1970-01-01T00:00:00.000Z" - "cdn_url": { - "http": "http://cdb.com", - "https": "https://cdb.com" - } -}) -``` - -This takes the `callback` function (required), `auth_token` if the template needs auth, and `config` which is the variable for the template (in cases where it has variables). - -```javascript -url += "config=" + encodeURIComponent( -JSON.stringify({ color: 'red' }); -``` - -The response is in this format: - -```javascript -callback({ - layergroupid: "dev@744bd0ed9b047f953fae673d56a47b4d:1390844463021.1401", - last_updated: "2014-01-27T17:41:03.021Z" -}) -``` - -### Update - -#### Definition - -
-```bash -PUT /api/v1/map/named/:template_name -``` - -#### Params - -- **api_key** is required - -#### Response - -Same as updating a map. - -#### Other Info - -Updating a named map removes all the named map instances so they need to be initialized again. - -#### Example - -
REQUEST
-```bash -curl -X PUT \ - -H 'Content-Type: application/json' \ - -d @template.json \ - 'https://documentation.cartodb.com/api/v1/map/named/:template_name?api_key=APIKEY' -``` - -
RESPONSE
-```javascript -{ - "template_id": "@template_name" -} -``` - -If any template has the same name, it will be updated. - -If a template with the same name does NOT exist, a 400 HTTP response is generated with an error in this format: - -```javascript -{ - "errors" : ["error string here"] -} -``` - -### Delete - -Delete the specified template map from the server and it disables any previously initialized versions of the map. - -#### Definition - -
-```bash -DELETE /api/v1/map/named/:template_name -``` - -#### Params - -- **api_key** is required - -#### Example - -
REQUEST
-```bash -curl -X DELETE 'https://documentation.cartodb.com/api/v1/map/named/:template_name?api_key=APIKEY' -``` - -
RESPONSE
-```javascript -{ - "errors" : ["Some error string here"] -} -``` - -On success, a 204 (No Content) response will be issued. Otherwise a 4xx response with an error will be returned. - -### Listing Available Templates - -This allows you to get a list of all available templates. - -#### Definition - -
-```bash -GET /api/v1/map/named/ -``` - -#### Params - -- **api_key** is required - -#### Example - -
REQUEST
-```bash -curl -X GET 'https://documentation.cartodb.com/api/v1/map/named?api_key=APIKEY' -``` - -
RESPONSE
-```javascript -{ - "template_ids": ["@template_name1","@template_name2"] -} -``` - -
ERROR
-```javascript -{ - "errors" : ["Some error string here"] -} -``` - -### Getting a Specific Template - -This gets the definition of a template. - -#### Definition - -
-```bash -GET /api/v1/map/named/:template_name -``` - -#### Params - -- **api_key** is required - -#### Example - -
REQUEST
-```bash -curl -X GET 'https://documentation.cartodb.com/api/v1/map/named/:template_name?api_key=APIKEY' -``` - -
RESPONSE
-```javascript -{ - "template": {...} // see template.json above -} -``` - -
ERROR
-```javascript -{ - "errors" : ["Some error string here"] -} -``` - -### Use with CartoDB.js -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 -var layerSource = { - user_name: '{your_user_name}', - type: 'namedmap', - named_map: { - name: '{template_name}', - layers: [{ - layer_name: "layer1", - interactivity: "column1, column2, ..." - }] - } -} - -cartodb.createLayer('map_dom_id',layerSource) - .addTo(map_object); - -``` - -[CartoDB.js](http://docs.cartodb.com/cartodb-platform/cartodb-js.html) has methods for accessing your named maps. - -1. [layer.setParams()](http://docs.cartodb.com/cartodb-platform/cartodb-js.html#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.html#layersetauthtokenauthtoken) allows you to set the auth tokens to create the layer - -## Static Maps API - -The Static Maps API can be initiated using both named and anonymous maps using the 'layergroupid' token. The API can be used to create static images of parts of maps and thumbnails for use in web design, graphic design, print, field work, and many other applications that require standard image formats. - -### Maps API endpoints - -Begin by instantiating either a named or anonymous map using the `layergroupid token` as demonstrated in the Maps API documentation above. The `layergroupid` token calls to the map and allows for parameters in the definition to generate static images. - -#### Zoom + center - -##### Definition - -
-```bash -GET /api/v1/map/static/center/:token/:z/:lat/:lng/:width/:height.:format -``` - -##### Params - -* **:token**: the layergroupid token from the map instantiation -* **:z**: the zoom level of the map -* **:lat**: the latitude for the center of the map -* **:lng**: the longitude for the center of the map -* **:width**: the width in pixels for the output image -* **:height**: the height in pixels for the output image -* **:format**: the format for the image, supported types: `png`, `jpg` - * **jpg** will have a default quality of 85. - -#### Bounding Box - -##### Definition - -
-```bash -GET /api/v1/map/static/bbox/:token/:bbox/:width/:height.:format` -``` - -##### Params - -* **:token**: the layergroupid token from the map instantiation -* **:bbox**: the bounding box in WGS 84 (EPSG:4326), comma separated values for: - - LowerCorner longitude, in decimal degrees (aka most western) - - LowerCorner latitude, in decimal degrees (aka most southern) - - UpperCorner longitude, in decimal degrees (aka most eastern) - - UpperCorner latitude, in decimal degrees (aka most northern) -* **:width**: the width in pixels for the output image -* **:height**: the height in pixels for the output image -* **:format**: the format for the image, supported types: `png`, `jpg` - * **jpg** will have a default quality of 85. - -Note: you can see this endpoint as: - -```bash -GET /api/v1/map/static/bbox/:token/:west,:south,:east,:north/:width/:height.:format` -``` - -#### Named map - -##### Definition - -
-```bash -GET /api/v1/map/static/named/:name/:width/:height.:format -``` - -##### Params - -* **:name**: the name of the named map -* **:width**: the width in pixels for the output image -* **:height**: the height in pixels for the output image -* **:format**: the format for the image, supported types: `png`, `jpg` - * **jpg** will have a default quality of 85. - -A named maps static image will get its constraints from the [view in the template](#Arguments), if `view` is not present it will estimate the extent based on the involved tables otherwise it fallback to `"zoom": 1`, `"lng": 0` and `"lat": 0`. - -####Layers - -The Static Maps API allows for multiple layers of incorporation into the `MapConfig` to allow for maximum versatility in creating a static map. The examples below were used to generate the static image example in the next section, and appear in the specific order designated. - -**Basemaps** - -```javascript - { - "type": "http", - "options": { - "urlTemplate": "http://{s}.basemaps.cartocdn.com/dark_nolabels/{z}/{x}/{y}.png", - "subdomains": [ - "a", - "b", - "c" - ] - } - }, -``` - -By manipulating the `"urlTemplate"` custom basemaps can be used in generating static images. Supported map types for the Static Maps API are: - - 'http://{s}.basemaps.cartocdn.com/dark_all/{z}/{x}/{y}.png', - 'http://{s}.basemaps.cartocdn.com/dark_nolabels/{z}/{x}/{y}.png', - 'http://{s}.basemaps.cartocdn.com/light_all/{z}/{x}/{y}.png', - 'http://{s}.basemaps.cartocdn.com/light_nolabels/{z}/{x}/{y}.png', - -**Mapnik** - -```javascript - { - "type": "mapnik", - "options": { - "sql": "select null::geometry the_geom_webmercator", - "cartocss": "#layer {\n\tpolygon-fill: #FF3300;\n\tpolygon-opacity: 0;\n\tline-color: #333;\n\tline-width: 0;\n\tline-opacity: 0;\n}", - "cartocss_version": "2.2.0" - } - }, -``` - -**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. - -```javascript - { - "type": "cartodb", - "options": { - "sql": "select * from park", - "cartocss": "/** simple visualization */\n\n#park{\n polygon-fill: #229A00;\n polygon-opacity: 0.7;\n line-color: #FFF;\n line-width: 0;\n line-opacity: 1;\n}", - "cartocss_version": "2.1.1" - } - }, -``` - -Additionally, static images from Torque maps and other map layers can be used together to generate highly customizable and versatile static maps. - - -#### Caching - -It is important to note that generated images are cached from the live data referenced with the `layergroupid token` on the specified CartoDB account. This means that if the data changes, the cached image will also change. When linking dynamically, it is important to take into consideration the state of the data and longevity of the static image to avoid broken images or changes in how the image is displayed. To obtain a static snapshot of the map as it is today and preserve the image long-term regardless of changes in data, the image must be saved and stored locally. - -#### Limits - -* While images can encompass an entirety of a map, the default limit for pixel range is 8192 x 8192. -* Image resolution by default is set to 72 DPI -* JPEG quality by default is 85% -* Timeout limits for generating static maps are the same across the CartoDB Editor and Platform. It is important to ensure timely processing of queries. - - -### Examples - -After instantiating a map from a CartoDB account: - -
REQUEST
-```bash - GET /api/v1/map/static/center/4b615ff367e498e770e7d05e99181873:1420231989550.8699/14/40.71502926732618/-73.96039009094238/600/400.png -``` - -#### Response - -

static-api

- -#### MapConfig - -For this map, the multiple layers, order, and stylings are defined by the MapConfig. - -```javascript -{ - "version": "1.3.0", - "layers": [ - { - "type": "http", - "options": { - "urlTemplate": "http://{s}.basemaps.cartocdn.com/dark_nolabels/{z}/{x}/{y}.png", - "subdomains": [ - "a", - "b", - "c" - ] - } - }, - { - "type": "mapnik", - "options": { - "sql": "select null::geometry the_geom_webmercator", - "cartocss": "#layer {\n\tpolygon-fill: #FF3300;\n\tpolygon-opacity: 0;\n\tline-color: #333;\n\tline-width: 0;\n\tline-opacity: 0;\n}", - "cartocss_version": "2.2.0" - } - }, - { - "type": "cartodb", - "options": { - "sql": "select * from park", - "cartocss": "/** simple visualization */\n\n#park{\n polygon-fill: #229A00;\n polygon-opacity: 0.7;\n line-color: #FFF;\n line-width: 0;\n line-opacity: 1;\n}", - "cartocss_version": "2.1.1" - } - }, - { - "type": "cartodb", - "options": { - "sql": "select * from residential_zoning_2009", - "cartocss": "/** simple visualization */\n\n#residential_zoning_2009{\n polygon-fill: #c7eae5;\n polygon-opacity: 1;\n line-color: #FFF;\n line-width: 0.2;\n line-opacity: 0.5;\n}", - "cartocss_version": "2.1.1" - } - }, - { - "type": "cartodb", - "options": { - "sql": "select * from nycha_developments_july2011", - "cartocss": "/** simple visualization */\n\n#nycha_developments_july2011{\n polygon-fill: #ef3b2c;\n polygon-opacity: 0.7;\n line-color: #FFF;\n line-width: 0;\n line-opacity: 1;\n}", - "cartocss_version": "2.1.1" - } - } - ] -} -``` +* [Quickstart](quickstart.md) +* [General Concepts](general_concepts.md) +* [Anonymous Maps](anonymous_maps.md) +* [Named Maps](named_maps.md) +* [Static Maps API](static_maps_api.md) diff --git a/docs/anonymous_maps.md b/docs/anonymous_maps.md new file mode 100644 index 00000000..79708384 --- /dev/null +++ b/docs/anonymous_maps.md @@ -0,0 +1,200 @@ +## Anonymous Maps + +Anonymous maps allows you to instantiate a map given SQL and CartoCSS. It also allows you to add interaction capabilities using [UTF Grid.](https://github.com/mapbox/utfgrid-spec) + +### Instantiate + +#### Definition + +
+```html +POST /api/v1/map +``` + +#### Params + +```javascript +{ + "version": "1.3.0", + "layers": [{ + "type": "mapnik", + "options": { + "cartocss_version": "2.1.1", + "cartocss": "#layer { polygon-fill: #FFF; }", + "sql": "select * from european_countries_e", + "interactivity": ["cartodb_id", "iso3"] + } + }] +} +``` + +Should be a [Mapconfig](https://github.com/CartoDB/Windshaft/blob/0.44.1/doc/MapConfig-1.3.0.md). + +#### Response + +The response includes: + +- **layergroupid** + The ID for that map, used to compose the URL for the tiles. The final URL is: + + ```html + https://{account}.cartodb.com/api/v1/map/:layergroupid/{z}/{x}/{y}.png + ``` + +- **updated_at** + The ISO date of the last time the data involved in the query was updated. + +- **metadata** + Includes information about the layers. + - + +- **cdn_url** + URLs to fetch the data using the best CDN for your zone. + +#### Example + +
REQUEST
+```bash +curl 'https://documentation.cartodb.com/api/v1/map' -H 'Content-Type: application/json' -d @mapconfig.json +``` + +
RESPONSE
+```javascript +{ + "layergroupid": "c01a54877c62831bb51720263f91fb33:0", + "last_updated": "1970-01-01T00:00:00.000Z", + "metadata": { + "layers": [ + { + "type": "mapnik", + "meta": {} + } + ] + }, + "cdn_url": { + "http": "http://cdb.com", + "https": "https://cdb.com" + } +} +``` + +##### Retrieve resources from the layergroup + +###### Mapnik tiles can be accessed using: + +These tiles will get just the mapnik layers. To get individual layers see next section. + +```bash +https://documentation.cartodb.com/api/v1/map/c01a54877c62831bb51720263f91fb33:0/{z}/{x}/{y}.png +``` + +###### Individual layers + +The MapConfig specification holds the layers definition in a 0-based index. Layers can be requested individually in different formats depending on the layer type. + +Individual layers can be accessed using that 0-based index. For UTF grid tiles: + +```bash +https://documentation.cartodb.com/api/v1/map/c01a54877c62831bb51720263f91fb33:0/:layer/{z}/{x}/{y}.grid.json +``` + +In this case, `:layer` as 0 returns the UTF grid tiles/attributes for layer 0, the only layer in the example MapConfig. + +If the MapConfig had a Torque layer at index 1 it could be possible to request it with: + +```bash +https://documentation.cartodb.com/api/v1/map/c01a54877c62831bb51720263f91fb33:0/1/{z}/{x}/{y}.torque.json +``` + +###### Attributes defined in `attributes` section: + +```bash +https://documentation.cartodb.com/api/v1/map/c01a54877c62831bb51720263f91fb33:0/:layer/attributes/:feature_id +``` + +Which returns JSON with the attributes defined, like: + +```javascript +{ "c": 1, "d": 2 } +``` + +###### Blending and layer selection + +```bash +https://documentation.cartodb.com/api/v1/map/c01a54877c62831bb51720263f91fb33:0/:layer_filter/{z}/{x}/{y}.png +``` + +Note: currently format is limited to `png`. + +`:layer_filter` can be used to select some layers to be rendered together. `:layer_filter` supports two formats: + +- `all` alias + +Using `all` as `:layer_filter` will blend all layers in the layergroup + +```bash +https://documentation.cartodb.com/api/v1/map/c01a54877c62831bb51720263f91fb33:0/all/{z}/{x}/{y}.png +``` + +- Filter by layer index + +A list of comma separated layer indexes can be used to just render a subset of layers. For example `0,3,4` will filter and blend layers with indexes 0, 3, and 4. + +```bash +https://documentation.cartodb.com/api/v1/map/c01a54877c62831bb51720263f91fb33:0/0,3,4/{z}/{x}/{y}.png +``` + +Some notes about filtering: + + - Invalid index values or out of bounds indexes will end in `Invalid layer filtering` errors. + - Once a mapnik layer is selected, all mapnik layers will get blended. As this may change in the future **it is + recommended** to always select all mapnik layers if you want to select at least one so you will get a consistent + behavior in the future. + - Ordering is not considered. So right now filtering layers 0,3,4 is the very same thing as filtering 3,4,0. As this + may change in the future **it is recommended** to always select the layers in ascending order so you will get a + consistent behavior in the future. + +### Create JSONP + +The JSONP endpoint is provided in order to allow web browsers access which don't support CORS. + +#### Definition + +
+```bash +GET /api/v1/map?callback=method +``` + +#### Params + +- **config** + Encoded JSON with the params for creating named maps (the variables defined in the template). + +- **lmza** + This attribute contains the same as config but LZMA compressed. It cannot be used at the same time as `config`. + +- **callback** + JSON callback name. + +#### Example + +
REQUEST
+```bash +curl "https://documentation.cartodb.com/api/v1/map?callback=callback&config=%7B%22version%22%3A%221.0.1%22%2C%22layers%22%3A%5B%7B%22type%22%3A%22cartodb%22%2C%22options%22%3A%7B%22sql%22%3A%22select+%2A+from+european_countries_e%22%2C%22cartocss%22%3A%22%23european_countries_e%7B+polygon-fill%3A+%23FF6600%3B+%7D%22%2C%22cartocss_version%22%3A%222.3.0%22%2C%22interactivity%22%3A%5B%22cartodb_id%22%5D%7D%7D%5D%7D" +``` + +
RESPONSE
+```javascript +callback({ + layergroupid: "d9034c133262dfb90285cea26c5c7ad7:0", + cdn_url: { + "http": "http://cdb.com", + "https": "https://cdb.com" + }, + last_updated: "1970-01-01T00:00:00.000Z" +}) +``` + +### Remove + +Anonymous maps cannot be removed by an API call. They will expire after about five minutes but sometimes longer. If an anonymous map expires and tiles are requested from it, an error will be raised. This could happen if a user leaves a map open and after time, returns to the map and attempts to interact with it in a way that requires new tiles (e.g. zoom). The client will need to go through the steps of creating the map again to fix the problem. diff --git a/docs/general_concepts.md b/docs/general_concepts.md new file mode 100644 index 00000000..3eccb780 --- /dev/null +++ b/docs/general_concepts.md @@ -0,0 +1,27 @@ +## General Concepts + +The following concepts are the same for every endpoint in the API except when it's noted explicitly. + +### Auth + +By default, users do not have access to private tables in CartoDB. In order to instantiate a map from private table data an API Key is required. Additionally, to include some endpoints, an API Key must be included (e.g. creating a named map). + +To execute an authorized request, `api_key=YOURAPIKEY` should be added to the request URL. The param can be also passed as POST param. Using HTTPS is mandatory when you are performing requests that include your `api_key`. + +### Errors + +Errors are reported using standard HTTP codes and extended information encoded in JSON with this format: + +```javascript +{ + "errors": [ + "access forbidden to table TABLE" + ] +} +``` + +If you use JSONP, the 200 HTTP code is always returned so the JavaScript client can receive errors from the JSON object. + +### CORS support + +All the endpoints, which might be accessed using a web browser, add CORS headers and allow OPTIONS method. diff --git a/docs/named_maps.md b/docs/named_maps.md new file mode 100644 index 00000000..efe74098 --- /dev/null +++ b/docs/named_maps.md @@ -0,0 +1,424 @@ +## 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. + +The main two differences compared to anonymous maps are: + +- **auth layer** + This allows you to control who is able to see the map based on a token auth + +- **templates** + Since the MapConfig is static it can contain some variables so the client can modify the map's appearance using those variables. + +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). + +### Create + +#### Definition + +
+```html +POST /api/v1/map/named +``` + +#### Params + +- **api_key** is required + +
template.json
+```javascript +{ + "version": "0.0.1", + "name": "template_name", + "auth": { + "method": "token", + "valid_tokens": [ + "auth_token1", + "auth_token2" + ] + }, + "placeholders": { + "color": { + "type": "css_color", + "default": "red" + }, + "cartodb_id": { + "type": "number", + "default": 1 + } + }, + "layergroup": { + "version": "1.0.1", + "layers": [ + { + "type": "cartodb", + "options": { + "cartocss_version": "2.1.1", + "cartocss": "#layer { polygon-fill: <%= color %>; }", + "sql": "select * from european_countries_e WHERE cartodb_id = <%= cartodb_id %>" + } + } + ] + }, + "view": { + "zoom": 4, + "center": { + "lng": 0, + "lat": 0 + }, + "bounds": { + "west": -45, + "south": -45, + "east": 45, + "north": 45 + } + } +} +``` + +##### Arguments + +- **name**: There can be at most _one_ template with the same name for any user. Valid names start with a letter or a number, and only contain letters, numbers, dashes (-) or underscores (_). +- **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. +- **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. + - **zoom** The zoom level to use + - **center** + - **lng** The longitude to use for the center + - **lat** The latitude to use for the center + - **bounds** + - **west**: LowerCorner longitude for the bounding box, in decimal degrees (aka most western) + - **south**: LowerCorner latitude for the bounding box, in decimal degrees (aka most southern) + - **east**: UpperCorner longitude for the bounding box, in decimal degrees (aka most eastern) + - **north**: UpperCorner latitude for the bounding box, in decimal degrees (aka most northern) + +#### Template Format + +A templated `layergroup` allows the use of placeholders in the "cartocss" and "sql" elements of the "option" object in any "layer" of a `layergroup` configuration + +Valid placeholder names start with a letter and can only contain letters, numbers, or underscores. They have to be written between the `<%=` and `%>` strings in order to be replaced. + +##### Example + +```javascript +<%= my_color %> +``` + +The set of supported placeholders for a template will need to be explicitly defined with a specific type and default value for each. + +#### Placeholder Types + +The placeholder type will determine the kind of escaping for the associated value. Supported types are: + +- **sql_literal** internal single-quotes will be sql-escaped +- **sql_ident** internal double-quotes will be sql-escaped +- **number** can only contain numerical representation +- **css_color** can only contain color names or hex-values + +Placeholder default values will be used whenever new values are not provided as options at the time of creation on the client. They can also be used to test the template by creating a default version with new options provided. + +When using templates, be very careful about your selections as they can give broad access to your data if they are defined losely. + +
REQUEST
+```html +curl -X POST \ + -H 'Content-Type: application/json' \ + -d @template.json \ + 'https://documentation.cartodb.com/api/v1/map/named?api_key=APIKEY' +``` + +
RESPONSE
+```javascript +{ + "template_id":"name", +} +``` + +### Instantiate + +Instantiating a map allows you to get the information needed to fetch tiles. That temporal map is an anonymous map. + +#### Definition + +
+```html +POST /api/v1/map/named/:template_name +``` + +#### Param + +- **auth_token** optional, but required when `"method"` is set to `"token"` + +```javascript +// params.json +{ + "color": "#ff0000", + "cartodb_id": 3 +} +``` + +The fields you pass as `params.json` depend on the variables allowed by the named map. If there are variables missing it will raise an error (HTTP 400) + +- **auth_token** *optional* if the named map needs auth + +#### Example + +You can initialize a template map by passing all of the required parameters in a POST to `/api/v1/map/named/:template_name`. + +Valid credentials will be needed if required by the template. + +
REQUEST
+```bash +curl -X POST \ + -H 'Content-Type: application/json' \ + -d @params.json \ + 'https://documentation.cartodb.com/api/v1/map/named/@template_name?auth_token=AUTH_TOKEN' +``` + +
Response
+```javascript +{ + "layergroupid": "docs@fd2861af@c01a54877c62831bb51720263f91fb33:123456788", + "last_updated": "2013-11-14T11:20:15.000Z" +} +``` + +
Error
+```javascript +{ + "errors" : ["Some error string here"] +} +``` + +You can then use the `layergroupid` for fetching tiles and grids as you would normally (see anonymous map section). However you'll need to show the `auth_token`, if required by the template. + +### Using JSONP + +There is also a special endpoint to be able to initialize a map using JSONP (for old browsers). + +#### Definition + +
+```bash +GET /api/v1/map/named/:template_name/jsonp +``` + +#### Params + +- **auth_token** optional, but required when `"method"` is set to `"token"` +- **config** Encoded JSON with the params for creating named maps (the variables defined in the template) +- **lmza** This attribute contains the same as config but LZMA compressed. It cannot be used at the same time than `config`. +- **callback:** JSON callback name + +
REQUEST
+```bash +curl 'https://documentation.cartodb.com/api/v1/map/named/:template_name/jsonp?auth_token=AUTH_TOKEN&callback=callback&config=template_params_json' +``` + +
RESPONSE
+```javascript +callback({ + "layergroupid":"c01a54877c62831bb51720263f91fb33:0", + "last_updated":"1970-01-01T00:00:00.000Z" + "cdn_url": { + "http": "http://cdb.com", + "https": "https://cdb.com" + } +}) +``` + +This takes the `callback` function (required), `auth_token` if the template needs auth, and `config` which is the variable for the template (in cases where it has variables). + +```javascript +url += "config=" + encodeURIComponent( +JSON.stringify({ color: 'red' }); +``` + +The response is in this format: + +```javascript +callback({ + layergroupid: "dev@744bd0ed9b047f953fae673d56a47b4d:1390844463021.1401", + last_updated: "2014-01-27T17:41:03.021Z" +}) +``` + +### Update + +#### Definition + +
+```bash +PUT /api/v1/map/named/:template_name +``` + +#### Params + +- **api_key** is required + +#### Response + +Same as updating a map. + +#### Other Info + +Updating a named map removes all the named map instances so they need to be initialized again. + +#### Example + +
REQUEST
+```bash +curl -X PUT \ + -H 'Content-Type: application/json' \ + -d @template.json \ + 'https://documentation.cartodb.com/api/v1/map/named/:template_name?api_key=APIKEY' +``` + +
RESPONSE
+```javascript +{ + "template_id": "@template_name" +} +``` + +If any template has the same name, it will be updated. + +If a template with the same name does NOT exist, a 400 HTTP response is generated with an error in this format: + +```javascript +{ + "errors" : ["error string here"] +} +``` + +### Delete + +Delete the specified template map from the server and it disables any previously initialized versions of the map. + +#### Definition + +
+```bash +DELETE /api/v1/map/named/:template_name +``` + +#### Params + +- **api_key** is required + +#### Example + +
REQUEST
+```bash +curl -X DELETE 'https://documentation.cartodb.com/api/v1/map/named/:template_name?api_key=APIKEY' +``` + +
RESPONSE
+```javascript +{ + "errors" : ["Some error string here"] +} +``` + +On success, a 204 (No Content) response will be issued. Otherwise a 4xx response with an error will be returned. + +### Listing Available Templates + +This allows you to get a list of all available templates. + +#### Definition + +
+```bash +GET /api/v1/map/named/ +``` + +#### Params + +- **api_key** is required + +#### Example + +
REQUEST
+```bash +curl -X GET 'https://documentation.cartodb.com/api/v1/map/named?api_key=APIKEY' +``` + +
RESPONSE
+```javascript +{ + "template_ids": ["@template_name1","@template_name2"] +} +``` + +
ERROR
+```javascript +{ + "errors" : ["Some error string here"] +} +``` + +### Getting a Specific Template + +This gets the definition of a template. + +#### Definition + +
+```bash +GET /api/v1/map/named/:template_name +``` + +#### Params + +- **api_key** is required + +#### Example + +
REQUEST
+```bash +curl -X GET 'https://documentation.cartodb.com/api/v1/map/named/:template_name?api_key=APIKEY' +``` + +
RESPONSE
+```javascript +{ + "template": {...} // see template.json above +} +``` + +
ERROR
+```javascript +{ + "errors" : ["Some error string here"] +} +``` + +### Use with CartoDB.js +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 +var layerSource = { + user_name: '{your_user_name}', + type: 'namedmap', + named_map: { + name: '{template_name}', + layers: [{ + layer_name: "layer1", + interactivity: "column1, column2, ..." + }] + } +} + +cartodb.createLayer('map_dom_id',layerSource) + .addTo(map_object); + +``` + +[CartoDB.js](http://docs.cartodb.com/cartodb-platform/cartodb-js.html) has methods for accessing your named maps. + +1. [layer.setParams()](http://docs.cartodb.com/cartodb-platform/cartodb-js.html#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.html#layersetauthtokenauthtoken) allows you to set the auth tokens to create the layer diff --git a/docs/quickstart.md b/docs/quickstart.md new file mode 100644 index 00000000..76e7c6e9 --- /dev/null +++ b/docs/quickstart.md @@ -0,0 +1,105 @@ +## Quickstart + +You can create two types of maps with the Maps API: + +- **Anonymous maps** + You can create maps using your CartoDB public data. Any client can change the read-only SQL and CartoCSS parameters that generate the map tiles. These maps can be created from a JavaScript application alone and no authenticated calls are needed. See [this CartoDB.js example]({{ '/cartodb-platform/cartodb-js.html' | prepend: site.baseurl }}). + +- **Named maps** + There are also maps that have access to your private data. These maps require an owner to setup and modify any SQL and CartoCSS parameters and are not modifiable without new setup calls. + +### Anonymous maps + +Here is an example of how to create an anonymous map with JavaScript: + +```javascript +var mapconfig = { + "version": "1.3.1", + "layers": [{ + "type": "cartodb", + "options": { + "cartocss_version": "2.1.1", + "cartocss": "#layer { polygon-fill: #FFF; }", + "sql": "select * from european_countries_e" + } + }] +} + +$.ajax({ + crossOrigin: true, + type: 'POST', + dataType: 'json', + contentType: 'application/json', + url: 'https://documentation.cartodb.com/api/v1/map', + data: JSON.stringify(mapconfig), + success: function(data) { + var templateUrl = 'https://documentation.cartodb.com/api/v1/map/' + data.layergroupid + '/{z}/{x}/{y}.png' + console.log(templateUrl); + } +}) +``` + +### Named maps + +Let's create a named map using some private tables in a CartoDB account. +The following map config sets up a map of European countries that have a white fill color: + +```javascript +{ + "version": "0.0.1", + "name": "test", + "auth": { + "method": "open" + }, + "layergroup": { + "layers": [{ + "type": "mapnik", + "options": { + "cartocss_version": "2.1.1", + "cartocss": "#layer { polygon-fill: #FFF; }", + "sql": "select * from european_countries_e" + } + }] + } +} +``` + +The map config needs to be sent to CartoDB's Map API using an authenticated call. Here we will use a command line tool called `curl`. For more info about this tool, see [this blog post](http://quickleft.com/blog/command-line-tutorials-curl), or type ``man curl`` in bash. Using `curl`, and storing the config from above in a file `mapconfig.json`, the call would look like: + +
+```bash +curl 'https://{account}.cartodb.com/api/v1/map/named?api_key=APIKEY' -H 'Content-Type: application/json' -d @mapconfig.json +``` + +To get the `URL` to fetch the tiles you need to instantiate the map, where `template_id` is the template name from the previous response. + +
+```bash +curl -X POST 'https://{account}.cartodb.com/api/v1/map/named/:template_id' -H 'Content-Type: application/json' +``` + +The response will return JSON with properties for the `layergroupid`, the timestamp (`last_updated`) of the last data modification and some key/value pairs with `metadata` for the `layers`. +Note: all `layers` in `metadata` will always have a `type` string and a `meta` dictionary with the key/value pairs. + +Here is an example response: + +```javascript +{ + "layergroupid": "c01a54877c62831bb51720263f91fb33:0", + "last_updated": "1970-01-01T00:00:00.000Z", + "metadata": { + "layers": [ + { + "type": "mapnik", + "meta": {} + } + ] + } +} +``` + +You can use the `layergroupid` to instantiate a URL template for accessing tiles on the client. Here we use the `layergroupid` from the example response above in this URL template: + +```bash +https://documentation.cartodb.com/api/v1/map/c01a54877c62831bb51720263f91fb33:0/{z}/{x}/{y}.png +``` diff --git a/docs/static_maps_api.md b/docs/static_maps_api.md new file mode 100644 index 00000000..8f9c22ad --- /dev/null +++ b/docs/static_maps_api.md @@ -0,0 +1,212 @@ +# Static Maps API + +The Static Maps API can be initiated using both named and anonymous maps using the 'layergroupid' token. The API can be used to create static images of parts of maps and thumbnails for use in web design, graphic design, print, field work, and many other applications that require standard image formats. + +## Maps API endpoints + +Begin by instantiating either a named or anonymous map using the `layergroupid token` as demonstrated in the Maps API documentation above. The `layergroupid` token calls to the map and allows for parameters in the definition to generate static images. + +### Zoom + center + +#### Definition + +
+```bash +GET /api/v1/map/static/center/:token/:z/:lat/:lng/:width/:height.:format +``` + +#### Params + +* **:token**: the layergroupid token from the map instantiation +* **:z**: the zoom level of the map +* **:lat**: the latitude for the center of the map +* **:lng**: the longitude for the center of the map +* **:width**: the width in pixels for the output image +* **:height**: the height in pixels for the output image +* **:format**: the format for the image, supported types: `png`, `jpg` + * **jpg** will have a default quality of 85. + +### Bounding Box + +#### Definition + +
+```bash +GET /api/v1/map/static/bbox/:token/:bbox/:width/:height.:format` +``` + +#### Params + +* **:token**: the layergroupid token from the map instantiation +* **:bbox**: the bounding box in WGS 84 (EPSG:4326), comma separated values for: + - LowerCorner longitude, in decimal degrees (aka most western) + - LowerCorner latitude, in decimal degrees (aka most southern) + - UpperCorner longitude, in decimal degrees (aka most eastern) + - UpperCorner latitude, in decimal degrees (aka most northern) +* **:width**: the width in pixels for the output image +* **:height**: the height in pixels for the output image +* **:format**: the format for the image, supported types: `png`, `jpg` + * **jpg** will have a default quality of 85. + +Note: you can see this endpoint as: + +```bash +GET /api/v1/map/static/bbox/:token/:west,:south,:east,:north/:width/:height.:format` +``` + +### Named map + +#### Definition + +
+```bash +GET /api/v1/map/static/named/:name/:width/:height.:format +``` + +#### Params + +* **:name**: the name of the named map +* **:width**: the width in pixels for the output image +* **:height**: the height in pixels for the output image +* **:format**: the format for the image, supported types: `png`, `jpg` + * **jpg** will have a default quality of 85. + +A named maps static image will get its constraints from the [view in the template](#Arguments), if `view` is not present it will estimate the extent based on the involved tables otherwise it fallback to `"zoom": 1`, `"lng": 0` and `"lat": 0`. + +####Layers + +The Static Maps API allows for multiple layers of incorporation into the `MapConfig` to allow for maximum versatility in creating a static map. The examples below were used to generate the static image example in the next section, and appear in the specific order designated. + +**Basemaps** + +```javascript + { + "type": "http", + "options": { + "urlTemplate": "http://{s}.basemaps.cartocdn.com/dark_nolabels/{z}/{x}/{y}.png", + "subdomains": [ + "a", + "b", + "c" + ] + } + }, +``` + +By manipulating the `"urlTemplate"` custom basemaps can be used in generating static images. Supported map types for the Static Maps API are: + + 'http://{s}.basemaps.cartocdn.com/dark_all/{z}/{x}/{y}.png', + 'http://{s}.basemaps.cartocdn.com/dark_nolabels/{z}/{x}/{y}.png', + 'http://{s}.basemaps.cartocdn.com/light_all/{z}/{x}/{y}.png', + 'http://{s}.basemaps.cartocdn.com/light_nolabels/{z}/{x}/{y}.png', + +**Mapnik** + +```javascript + { + "type": "mapnik", + "options": { + "sql": "select null::geometry the_geom_webmercator", + "cartocss": "#layer {\n\tpolygon-fill: #FF3300;\n\tpolygon-opacity: 0;\n\tline-color: #333;\n\tline-width: 0;\n\tline-opacity: 0;\n}", + "cartocss_version": "2.2.0" + } + }, +``` + +**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. + +```javascript + { + "type": "cartodb", + "options": { + "sql": "select * from park", + "cartocss": "/** simple visualization */\n\n#park{\n polygon-fill: #229A00;\n polygon-opacity: 0.7;\n line-color: #FFF;\n line-width: 0;\n line-opacity: 1;\n}", + "cartocss_version": "2.1.1" + } + }, +``` + +Additionally, static images from Torque maps and other map layers can be used together to generate highly customizable and versatile static maps. + + +### Caching + +It is important to note that generated images are cached from the live data referenced with the `layergroupid token` on the specified CartoDB account. This means that if the data changes, the cached image will also change. When linking dynamically, it is important to take into consideration the state of the data and longevity of the static image to avoid broken images or changes in how the image is displayed. To obtain a static snapshot of the map as it is today and preserve the image long-term regardless of changes in data, the image must be saved and stored locally. + +### Limits + +* While images can encompass an entirety of a map, the default limit for pixel range is 8192 x 8192. +* Image resolution by default is set to 72 DPI +* JPEG quality by default is 85% +* Timeout limits for generating static maps are the same across the CartoDB Editor and Platform. It is important to ensure timely processing of queries. + + +## Examples + +After instantiating a map from a CartoDB account: + +
REQUEST
+```bash + GET /api/v1/map/static/center/4b615ff367e498e770e7d05e99181873:1420231989550.8699/14/40.71502926732618/-73.96039009094238/600/400.png +``` + +### Response + +

static-api

+ +### MapConfig + +For this map, the multiple layers, order, and stylings are defined by the MapConfig. + +```javascript +{ + "version": "1.3.0", + "layers": [ + { + "type": "http", + "options": { + "urlTemplate": "http://{s}.basemaps.cartocdn.com/dark_nolabels/{z}/{x}/{y}.png", + "subdomains": [ + "a", + "b", + "c" + ] + } + }, + { + "type": "mapnik", + "options": { + "sql": "select null::geometry the_geom_webmercator", + "cartocss": "#layer {\n\tpolygon-fill: #FF3300;\n\tpolygon-opacity: 0;\n\tline-color: #333;\n\tline-width: 0;\n\tline-opacity: 0;\n}", + "cartocss_version": "2.2.0" + } + }, + { + "type": "cartodb", + "options": { + "sql": "select * from park", + "cartocss": "/** simple visualization */\n\n#park{\n polygon-fill: #229A00;\n polygon-opacity: 0.7;\n line-color: #FFF;\n line-width: 0;\n line-opacity: 1;\n}", + "cartocss_version": "2.1.1" + } + }, + { + "type": "cartodb", + "options": { + "sql": "select * from residential_zoning_2009", + "cartocss": "/** simple visualization */\n\n#residential_zoning_2009{\n polygon-fill: #c7eae5;\n polygon-opacity: 1;\n line-color: #FFF;\n line-width: 0.2;\n line-opacity: 0.5;\n}", + "cartocss_version": "2.1.1" + } + }, + { + "type": "cartodb", + "options": { + "sql": "select * from nycha_developments_july2011", + "cartocss": "/** simple visualization */\n\n#nycha_developments_july2011{\n polygon-fill: #ef3b2c;\n polygon-opacity: 0.7;\n line-color: #FFF;\n line-width: 0;\n line-opacity: 1;\n}", + "cartocss_version": "2.1.1" + } + } + ] +} +``` From 5e0c9377f238824c3de46cbf84722ff025754bc0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Carlos=20Matall=C3=ADn?= Date: Thu, 22 Oct 2015 15:02:01 +0200 Subject: [PATCH 05/72] newdocs: fix titles --- docs/anonymous_maps.md | 32 +++++++++---------- docs/general_concepts.md | 8 ++--- docs/named_maps.md | 68 ++++++++++++++++++++-------------------- docs/quickstart.md | 6 ++-- 4 files changed, 57 insertions(+), 57 deletions(-) diff --git a/docs/anonymous_maps.md b/docs/anonymous_maps.md index 79708384..69e7632b 100644 --- a/docs/anonymous_maps.md +++ b/docs/anonymous_maps.md @@ -1,17 +1,17 @@ -## Anonymous Maps +# Anonymous Maps Anonymous maps allows you to instantiate a map given SQL and CartoCSS. It also allows you to add interaction capabilities using [UTF Grid.](https://github.com/mapbox/utfgrid-spec) -### Instantiate +## Instantiate -#### Definition +### Definition
```html POST /api/v1/map ``` -#### Params +### Params ```javascript { @@ -30,7 +30,7 @@ POST /api/v1/map Should be a [Mapconfig](https://github.com/CartoDB/Windshaft/blob/0.44.1/doc/MapConfig-1.3.0.md). -#### Response +### Response The response includes: @@ -51,7 +51,7 @@ The response includes: - **cdn_url** URLs to fetch the data using the best CDN for your zone. -#### Example +### Example
REQUEST
```bash @@ -78,9 +78,9 @@ curl 'https://documentation.cartodb.com/api/v1/map' -H 'Content-Type: applicatio } ``` -##### Retrieve resources from the layergroup +#### Retrieve resources from the layergroup -###### Mapnik tiles can be accessed using: +##### Mapnik tiles can be accessed using: These tiles will get just the mapnik layers. To get individual layers see next section. @@ -88,7 +88,7 @@ These tiles will get just the mapnik layers. To get individual layers see next s https://documentation.cartodb.com/api/v1/map/c01a54877c62831bb51720263f91fb33:0/{z}/{x}/{y}.png ``` -###### Individual layers +##### Individual layers The MapConfig specification holds the layers definition in a 0-based index. Layers can be requested individually in different formats depending on the layer type. @@ -106,7 +106,7 @@ If the MapConfig had a Torque layer at index 1 it could be possible to request i https://documentation.cartodb.com/api/v1/map/c01a54877c62831bb51720263f91fb33:0/1/{z}/{x}/{y}.torque.json ``` -###### Attributes defined in `attributes` section: +##### Attributes defined in `attributes` section: ```bash https://documentation.cartodb.com/api/v1/map/c01a54877c62831bb51720263f91fb33:0/:layer/attributes/:feature_id @@ -118,7 +118,7 @@ Which returns JSON with the attributes defined, like: { "c": 1, "d": 2 } ``` -###### Blending and layer selection +##### Blending and layer selection ```bash https://documentation.cartodb.com/api/v1/map/c01a54877c62831bb51720263f91fb33:0/:layer_filter/{z}/{x}/{y}.png @@ -154,18 +154,18 @@ Some notes about filtering: may change in the future **it is recommended** to always select the layers in ascending order so you will get a consistent behavior in the future. -### Create JSONP +## Create JSONP The JSONP endpoint is provided in order to allow web browsers access which don't support CORS. -#### Definition +### Definition
```bash GET /api/v1/map?callback=method ``` -#### Params +### Params - **config** Encoded JSON with the params for creating named maps (the variables defined in the template). @@ -176,7 +176,7 @@ GET /api/v1/map?callback=method - **callback** JSON callback name. -#### Example +### Example
REQUEST
```bash @@ -195,6 +195,6 @@ callback({ }) ``` -### Remove +## Remove Anonymous maps cannot be removed by an API call. They will expire after about five minutes but sometimes longer. If an anonymous map expires and tiles are requested from it, an error will be raised. This could happen if a user leaves a map open and after time, returns to the map and attempts to interact with it in a way that requires new tiles (e.g. zoom). The client will need to go through the steps of creating the map again to fix the problem. diff --git a/docs/general_concepts.md b/docs/general_concepts.md index 3eccb780..859c6df9 100644 --- a/docs/general_concepts.md +++ b/docs/general_concepts.md @@ -1,14 +1,14 @@ -## General Concepts +# General Concepts The following concepts are the same for every endpoint in the API except when it's noted explicitly. -### Auth +## Auth By default, users do not have access to private tables in CartoDB. In order to instantiate a map from private table data an API Key is required. Additionally, to include some endpoints, an API Key must be included (e.g. creating a named map). To execute an authorized request, `api_key=YOURAPIKEY` should be added to the request URL. The param can be also passed as POST param. Using HTTPS is mandatory when you are performing requests that include your `api_key`. -### Errors +## Errors Errors are reported using standard HTTP codes and extended information encoded in JSON with this format: @@ -22,6 +22,6 @@ Errors are reported using standard HTTP codes and extended information encoded i If you use JSONP, the 200 HTTP code is always returned so the JavaScript client can receive errors from the JSON object. -### CORS support +## CORS support All the endpoints, which might be accessed using a web browser, add CORS headers and allow OPTIONS method. diff --git a/docs/named_maps.md b/docs/named_maps.md index efe74098..50bfb659 100644 --- a/docs/named_maps.md +++ b/docs/named_maps.md @@ -1,4 +1,4 @@ -## Named Maps +# 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. @@ -12,16 +12,16 @@ 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). -### Create +## Create -#### Definition +### Definition
```html POST /api/v1/map/named ``` -#### Params +### Params - **api_key** is required @@ -76,7 +76,7 @@ POST /api/v1/map/named } ``` -##### Arguments +#### Arguments - **name**: There can be at most _one_ template with the same name for any user. Valid names start with a letter or a number, and only contain letters, numbers, dashes (-) or underscores (_). - **auth**: @@ -95,13 +95,13 @@ POST /api/v1/map/named - **east**: UpperCorner longitude for the bounding box, in decimal degrees (aka most eastern) - **north**: UpperCorner latitude for the bounding box, in decimal degrees (aka most northern) -#### Template Format +### Template Format A templated `layergroup` allows the use of placeholders in the "cartocss" and "sql" elements of the "option" object in any "layer" of a `layergroup` configuration Valid placeholder names start with a letter and can only contain letters, numbers, or underscores. They have to be written between the `<%=` and `%>` strings in order to be replaced. -##### Example +#### Example ```javascript <%= my_color %> @@ -109,7 +109,7 @@ Valid placeholder names start with a letter and can only contain letters, number The set of supported placeholders for a template will need to be explicitly defined with a specific type and default value for each. -#### Placeholder Types +### Placeholder Types The placeholder type will determine the kind of escaping for the associated value. Supported types are: @@ -137,18 +137,18 @@ curl -X POST \ } ``` -### Instantiate +## Instantiate Instantiating a map allows you to get the information needed to fetch tiles. That temporal map is an anonymous map. -#### Definition +### Definition
```html POST /api/v1/map/named/:template_name ``` -#### Param +### Param - **auth_token** optional, but required when `"method"` is set to `"token"` @@ -164,7 +164,7 @@ The fields you pass as `params.json` depend on the variables allowed by the name - **auth_token** *optional* if the named map needs auth -#### Example +### Example You can initialize a template map by passing all of the required parameters in a POST to `/api/v1/map/named/:template_name`. @@ -195,18 +195,18 @@ curl -X POST \ You can then use the `layergroupid` for fetching tiles and grids as you would normally (see anonymous map section). However you'll need to show the `auth_token`, if required by the template. -### Using JSONP +## Using JSONP There is also a special endpoint to be able to initialize a map using JSONP (for old browsers). -#### Definition +### Definition
```bash GET /api/v1/map/named/:template_name/jsonp ``` -#### Params +### Params - **auth_token** optional, but required when `"method"` is set to `"token"` - **config** Encoded JSON with the params for creating named maps (the variables defined in the template) @@ -246,28 +246,28 @@ callback({ }) ``` -### Update +## Update -#### Definition +### Definition
```bash PUT /api/v1/map/named/:template_name ``` -#### Params +### Params - **api_key** is required -#### Response +### Response Same as updating a map. -#### Other Info +### Other Info Updating a named map removes all the named map instances so they need to be initialized again. -#### Example +### Example
REQUEST
```bash @@ -294,22 +294,22 @@ If a template with the same name does NOT exist, a 400 HTTP response is generate } ``` -### Delete +## Delete Delete the specified template map from the server and it disables any previously initialized versions of the map. -#### Definition +### Definition
```bash DELETE /api/v1/map/named/:template_name ``` -#### Params +### Params - **api_key** is required -#### Example +### Example
REQUEST
```bash @@ -325,22 +325,22 @@ curl -X DELETE 'https://documentation.cartodb.com/api/v1/map/named/:template_nam On success, a 204 (No Content) response will be issued. Otherwise a 4xx response with an error will be returned. -### Listing Available Templates +## Listing Available Templates This allows you to get a list of all available templates. -#### Definition +### Definition
```bash GET /api/v1/map/named/ ``` -#### Params +### Params - **api_key** is required -#### Example +### Example
REQUEST
```bash @@ -361,22 +361,22 @@ curl -X GET 'https://documentation.cartodb.com/api/v1/map/named?api_key=APIKEY' } ``` -### Getting a Specific Template +## Getting a Specific Template This gets the definition of a template. -#### Definition +### Definition
```bash GET /api/v1/map/named/:template_name ``` -#### Params +### Params - **api_key** is required -#### Example +### Example
REQUEST
```bash @@ -397,7 +397,7 @@ curl -X GET 'https://documentation.cartodb.com/api/v1/map/named/:template_name?a } ``` -### Use with CartoDB.js +## Use with CartoDB.js 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 diff --git a/docs/quickstart.md b/docs/quickstart.md index 76e7c6e9..5952a26a 100644 --- a/docs/quickstart.md +++ b/docs/quickstart.md @@ -1,4 +1,4 @@ -## Quickstart +# Quickstart You can create two types of maps with the Maps API: @@ -8,7 +8,7 @@ You can create two types of maps with the Maps API: - **Named maps** There are also maps that have access to your private data. These maps require an owner to setup and modify any SQL and CartoCSS parameters and are not modifiable without new setup calls. -### Anonymous maps +## Anonymous maps Here is an example of how to create an anonymous map with JavaScript: @@ -39,7 +39,7 @@ $.ajax({ }) ``` -### Named maps +## Named maps Let's create a named map using some private tables in a CartoDB account. The following map config sets up a map of European countries that have a white fill color: From 36a6af326652df90a7a410776e8842eff8fdec36 Mon Sep 17 00:00:00 2001 From: Raul Ochoa Date: Mon, 26 Oct 2015 10:23:56 +0100 Subject: [PATCH 06/72] Replaces List with Widget backend and changes list access to be layer based --- lib/cartodb/controllers/layergroup.js | 10 +++++----- lib/cartodb/server.js | 2 +- test/acceptance/lists.js | 9 ++++++--- 3 files changed, 12 insertions(+), 9 deletions(-) diff --git a/lib/cartodb/controllers/layergroup.js b/lib/cartodb/controllers/layergroup.js index f352b263..0fa5500c 100644 --- a/lib/cartodb/controllers/layergroup.js +++ b/lib/cartodb/controllers/layergroup.js @@ -17,7 +17,7 @@ var TablesCacheEntry = require('../cache/model/database_tables_entry'); * @param {TileBackend} tileBackend * @param {PreviewBackend} previewBackend * @param {AttributesBackend} attributesBackend - * @param {ListBackend} listBackend + * @param {WidgetBackend} widgetBackend * @param {SurrogateKeysCache} surrogateKeysCache * @param {UserLimitsApi} userLimitsApi * @param {QueryTablesApi} queryTablesApi @@ -25,14 +25,14 @@ var TablesCacheEntry = require('../cache/model/database_tables_entry'); * @constructor */ function LayergroupController(authApi, pgConnection, mapStore, tileBackend, previewBackend, attributesBackend, - listBackend, surrogateKeysCache, userLimitsApi, queryTablesApi, layergroupAffectedTables) { + widgetBackend, surrogateKeysCache, userLimitsApi, queryTablesApi, layergroupAffectedTables) { BaseController.call(this, authApi, pgConnection); this.mapStore = mapStore; this.tileBackend = tileBackend; this.previewBackend = previewBackend; this.attributesBackend = attributesBackend; - this.listBackend = listBackend; + this.widgetBackend = widgetBackend; this.surrogateKeysCache = surrogateKeysCache; this.userLimitsApi = userLimitsApi; this.queryTablesApi = queryTablesApi; @@ -70,7 +70,7 @@ LayergroupController.prototype.register = function(app) { this.bbox.bind(this)); app.get(app.base_url_mapconfig + - '/:token/list/:listName', cors(), userMiddleware, + '/:token/:layer/list/:listName', cors(), userMiddleware, this.list.bind(this)); }; @@ -88,7 +88,7 @@ LayergroupController.prototype.list = function(req, res) { var mapConfigProvider = new MapStoreMapConfigProvider( self.mapStore, req.context.user, self.userLimitsApi, req.params ); - self.listBackend.getList(mapConfigProvider, req.params, this); + self.widgetBackend.getList(mapConfigProvider, req.params, this); }, function finish(err, tile, stats) { req.profiler.add(stats || {}); diff --git a/lib/cartodb/server.js b/lib/cartodb/server.js index 2745ff23..e4079574 100644 --- a/lib/cartodb/server.js +++ b/lib/cartodb/server.js @@ -161,7 +161,7 @@ module.exports = function(serverOptions) { tileBackend, previewBackend, attributesBackend, - new windshaft.backend.List(), + new windshaft.backend.Widget(), surrogateKeysCache, userLimitsApi, queryTablesApi, diff --git a/test/acceptance/lists.js b/test/acceptance/lists.js index 9bd07a54..6c12ff2a 100644 --- a/test/acceptance/lists.js +++ b/test/acceptance/lists.js @@ -35,9 +35,12 @@ describe('lists', function() { cartocss: '#layer { marker-fill: red; marker-width: 32; marker-allow-overlap: true; }', cartocss_version: '2.3.0' }, - lists: { + widgets: { names: { - columns: ['name'] + type: 'list', + options: { + columns: ['name'] + } } } } @@ -80,7 +83,7 @@ describe('lists', function() { assert.response(server, { - url: '/api/v1/map/' + layergroupId + '/list/names', + url: '/api/v1/map/' + layergroupId + '/0/list/names', method: 'GET', headers: { host: 'localhost' From 4b0ecb1251d8dd3a5ae6086334a6c2bbcd6a8818 Mon Sep 17 00:00:00 2001 From: Raul Ochoa Date: Mon, 26 Oct 2015 11:10:59 +0100 Subject: [PATCH 07/72] Adds histogram support, a bit of code duplication --- lib/cartodb/controllers/layergroup.js | 31 +++++++ test/acceptance/histograms.js | 117 ++++++++++++++++++++++++++ 2 files changed, 148 insertions(+) create mode 100644 test/acceptance/histograms.js diff --git a/lib/cartodb/controllers/layergroup.js b/lib/cartodb/controllers/layergroup.js index 0fa5500c..3226ca6e 100644 --- a/lib/cartodb/controllers/layergroup.js +++ b/lib/cartodb/controllers/layergroup.js @@ -73,6 +73,9 @@ LayergroupController.prototype.register = function(app) { '/:token/:layer/list/:listName', cors(), userMiddleware, this.list.bind(this)); + app.get(app.base_url_mapconfig + + '/:token/:layer/histogram/:histogramName', cors(), userMiddleware, + this.histogram.bind(this)); }; LayergroupController.prototype.list = function(req, res) { @@ -103,6 +106,34 @@ LayergroupController.prototype.list = function(req, res) { }; +LayergroupController.prototype.histogram = function(req, res) { + var self = this; + + step( + function setupParams() { + self.req2params(req, this); + }, + function retrieveList(err) { + assert.ifError(err); + + var mapConfigProvider = new MapStoreMapConfigProvider( + self.mapStore, req.context.user, self.userLimitsApi, req.params + ); + self.widgetBackend.getHistogram(mapConfigProvider, req.params, this); + }, + function finish(err, tile, stats) { + req.profiler.add(stats || {}); + + if (err) { + self.sendError(req, res, err, 'GET LIST'); + } else { + self.sendResponse(req, res, tile, 200); + } + } + ); + +}; + LayergroupController.prototype.attributes = function(req, res) { var self = this; diff --git a/test/acceptance/histograms.js b/test/acceptance/histograms.js new file mode 100644 index 00000000..9177383d --- /dev/null +++ b/test/acceptance/histograms.js @@ -0,0 +1,117 @@ +var assert = require('../support/assert'); +var step = require('step'); + +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('lists', function() { + + var keysToDelete; + + beforeEach(function() { + keysToDelete = {}; + }); + + afterEach(function(done) { + helper.deleteRedisKeys(keysToDelete, done); + }); + + + it("should expose layer histogram", function(done) { + + var layergroup = { + 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 layergroupId; + step( + function createLayergroup() { + var next = this; + assert.response(server, + { + url: '/api/v1/map', + method: 'POST', + headers: { + host: 'localhost', + 'Content-Type': 'application/json' + }, + data: JSON.stringify(layergroup) + }, + { + status: 200, + headers: { + 'Content-Type': 'application/json; charset=utf-8' + } + }, + function(res, err) { + if (err) { + return next(err); + } + return next(null, JSON.parse(res.body).layergroupid); + } + ); + }, + function getList(err, _layergroupId) { + assert.ifError(err); + + var next = this; + layergroupId = _layergroupId; + + assert.response(server, + { + url: '/api/v1/map/' + layergroupId + '/0/histogram/pop_max', + method: 'GET', + headers: { + host: 'localhost' + } + }, + { + status: 200, + headers: { + 'Content-Type': 'application/json; charset=utf-8' + } + }, + function(res, err) { + if (err) { + return next(err); + } + + console.log(JSON.parse(res.body)); + + next(null); + } + ); + }, + function finish(err) { + keysToDelete['map_cfg|' + LayergroupToken.parse(layergroupId).token] = 0; + keysToDelete['user:localhost:mapviews:global'] = 5; + done(err); + } + ); + }); + +}); From f9d3e419a0181e620cc90120b18b9e354cd051fb Mon Sep 17 00:00:00 2001 From: Raul Ochoa Date: Mon, 26 Oct 2015 11:12:26 +0100 Subject: [PATCH 08/72] Renames list -> histogram --- test/acceptance/histograms.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/acceptance/histograms.js b/test/acceptance/histograms.js index 9177383d..8bb9da97 100644 --- a/test/acceptance/histograms.js +++ b/test/acceptance/histograms.js @@ -10,7 +10,7 @@ var server = new CartodbWindshaft(serverOptions); server.setMaxListeners(0); -describe('lists', function() { +describe('histograms', function() { var keysToDelete; @@ -75,7 +75,7 @@ describe('lists', function() { } ); }, - function getList(err, _layergroupId) { + function getHistogram(err, _layergroupId) { assert.ifError(err); var next = this; From 6d9182aba8418f85c6c8864c922dc0efee824908 Mon Sep 17 00:00:00 2001 From: Raul Ochoa Date: Mon, 26 Oct 2015 13:42:06 +0100 Subject: [PATCH 09/72] Rename widgets endpoint to honour its name --- lib/cartodb/controllers/layergroup.js | 42 ++++----------------------- test/acceptance/histograms.js | 6 ++-- test/acceptance/lists.js | 2 +- 3 files changed, 10 insertions(+), 40 deletions(-) diff --git a/lib/cartodb/controllers/layergroup.js b/lib/cartodb/controllers/layergroup.js index 3226ca6e..d5b1e05c 100644 --- a/lib/cartodb/controllers/layergroup.js +++ b/lib/cartodb/controllers/layergroup.js @@ -70,15 +70,11 @@ LayergroupController.prototype.register = function(app) { this.bbox.bind(this)); app.get(app.base_url_mapconfig + - '/:token/:layer/list/:listName', cors(), userMiddleware, - this.list.bind(this)); - - app.get(app.base_url_mapconfig + - '/:token/:layer/histogram/:histogramName', cors(), userMiddleware, - this.histogram.bind(this)); + '/:token/:layer/widget/:widgetName', cors(), userMiddleware, + this.widget.bind(this)); }; -LayergroupController.prototype.list = function(req, res) { +LayergroupController.prototype.widget = function(req, res) { var self = this; step( @@ -91,41 +87,13 @@ LayergroupController.prototype.list = function(req, res) { var mapConfigProvider = new MapStoreMapConfigProvider( self.mapStore, req.context.user, self.userLimitsApi, req.params ); - self.widgetBackend.getList(mapConfigProvider, req.params, this); + self.widgetBackend.getWidget(mapConfigProvider, req.params, this); }, function finish(err, tile, stats) { req.profiler.add(stats || {}); if (err) { - self.sendError(req, res, err, 'GET LIST'); - } else { - self.sendResponse(req, res, tile, 200); - } - } - ); - -}; - -LayergroupController.prototype.histogram = function(req, res) { - var self = this; - - step( - function setupParams() { - self.req2params(req, this); - }, - function retrieveList(err) { - assert.ifError(err); - - var mapConfigProvider = new MapStoreMapConfigProvider( - self.mapStore, req.context.user, self.userLimitsApi, req.params - ); - self.widgetBackend.getHistogram(mapConfigProvider, req.params, this); - }, - function finish(err, tile, stats) { - req.profiler.add(stats || {}); - - if (err) { - self.sendError(req, res, err, 'GET LIST'); + self.sendError(req, res, err, 'GET WIDGET'); } else { self.sendResponse(req, res, tile, 200); } diff --git a/test/acceptance/histograms.js b/test/acceptance/histograms.js index 8bb9da97..59cbdbde 100644 --- a/test/acceptance/histograms.js +++ b/test/acceptance/histograms.js @@ -83,7 +83,7 @@ describe('histograms', function() { assert.response(server, { - url: '/api/v1/map/' + layergroupId + '/0/histogram/pop_max', + url: '/api/v1/map/' + layergroupId + '/0/widget/pop_max', method: 'GET', headers: { host: 'localhost' @@ -100,7 +100,9 @@ describe('histograms', function() { return next(err); } - console.log(JSON.parse(res.body)); + var histogram = JSON.parse(res.body); + + assert.ok(histogram.length); next(null); } diff --git a/test/acceptance/lists.js b/test/acceptance/lists.js index 6c12ff2a..f22c20e0 100644 --- a/test/acceptance/lists.js +++ b/test/acceptance/lists.js @@ -83,7 +83,7 @@ describe('lists', function() { assert.response(server, { - url: '/api/v1/map/' + layergroupId + '/0/list/names', + url: '/api/v1/map/' + layergroupId + '/0/widget/names', method: 'GET', headers: { host: 'localhost' From 8b222914c5480a79869afad126f1e128334d068c Mon Sep 17 00:00:00 2001 From: Raul Ochoa Date: Mon, 26 Oct 2015 14:35:51 +0100 Subject: [PATCH 10/72] Add URL to widgets with their endpoints --- lib/cartodb/controllers/map.js | 35 ++++++++++++++++++++++++++++++++++ test/acceptance/lists.js | 4 +++- 2 files changed, 38 insertions(+), 1 deletion(-) diff --git a/lib/cartodb/controllers/map.js b/lib/cartodb/controllers/map.js index f6391db1..e514d8a9 100644 --- a/lib/cartodb/controllers/map.js +++ b/lib/cartodb/controllers/map.js @@ -306,6 +306,8 @@ MapController.prototype.afterLayergroupCreate = function(req, res, mapconfig, la layergroup.layergroupid = layergroup.layergroupid + ':' + result.lastUpdatedTime; layergroup.last_updated = new Date(result.lastUpdatedTime).toISOString(); + addWidgetsUrl(username, layergroup); + if (req.method === 'GET') { var tableCacheEntry = new TablesCacheEntry(dbName, result.affectedTables); var ttl = global.environment.varnish.layergroupTtl || 86400; @@ -324,3 +326,36 @@ MapController.prototype.afterLayergroupCreate = function(req, res, mapconfig, la } ); }; + +function addWidgetsUrl(username, layergroup) { + +// global.environment.serverMetadata + + if (layergroup.metadata && Array.isArray(layergroup.metadata.layers)) { + layergroup.metadata.layers = layergroup.metadata.layers.map(function(layer, layerIndex) { + if (layer.widgets) { + Object.keys(layer.widgets).forEach(function(widgetName) { + var resource = layergroup.layergroupid + '/' + layerIndex + '/widget/' + widgetName; + layer.widgets[widgetName].url = getUrls(username, resource); + }); + } + return layer; + }); + } + +} + +function getUrls(username, resource) { + var cdnUrl = global.environment.serverMetadata && global.environment.serverMetadata.cdn_url; + if (cdnUrl) { + return { + http: 'http://' + cdnUrl.http + '/' + username + '/api/v1/map' + resource, + https: 'https://' + cdnUrl.https + '/' + username + '/api/v1/map' + resource + }; + } else { + var port = global.environment.port; + return { + http: 'http://' + username + '.' + 'localhost.lan:' + port + '/api/v1/map' + resource + }; + } +} diff --git a/test/acceptance/lists.js b/test/acceptance/lists.js index f22c20e0..bc7fdd66 100644 --- a/test/acceptance/lists.js +++ b/test/acceptance/lists.js @@ -71,7 +71,9 @@ describe('lists', function() { if (err) { return next(err); } - return next(null, JSON.parse(res.body).layergroupid); + var parsedBody = JSON.parse(res.body); + assert.ok(parsedBody.metadata.layers[0].widgets.names); + return next(null, parsedBody.layergroupid); } ); }, From 3a05d8c2e80890db96abb9dc0844f5bba1431e5e Mon Sep 17 00:00:00 2001 From: Raul Ochoa Date: Mon, 26 Oct 2015 16:40:39 +0100 Subject: [PATCH 11/72] Widgets inside layer options --- test/acceptance/histograms.js | 14 +++++++------- test/acceptance/lists.js | 14 +++++++------- 2 files changed, 14 insertions(+), 14 deletions(-) diff --git a/test/acceptance/histograms.js b/test/acceptance/histograms.js index 59cbdbde..24537640 100644 --- a/test/acceptance/histograms.js +++ b/test/acceptance/histograms.js @@ -33,13 +33,13 @@ describe('histograms', function() { 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' + cartocss_version: '2.3.0', + widgets: { + pop_max: { + type: 'histogram', + options: { + column: 'pop_max' + } } } } diff --git a/test/acceptance/lists.js b/test/acceptance/lists.js index bc7fdd66..eb468105 100644 --- a/test/acceptance/lists.js +++ b/test/acceptance/lists.js @@ -33,13 +33,13 @@ describe('lists', function() { 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'] + cartocss_version: '2.3.0', + widgets: { + names: { + type: 'list', + options: { + columns: ['name'] + } } } } From 8a9e257cdbc8d523b36f47810a9ad34fa8c2fb04 Mon Sep 17 00:00:00 2001 From: Raul Ochoa Date: Mon, 26 Oct 2015 16:51:21 +0100 Subject: [PATCH 12/72] Adds target to Makefile to just remove and re-install windshaft dep --- Makefile | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/Makefile b/Makefile index 98454b25..7a424cc7 100644 --- a/Makefile +++ b/Makefile @@ -9,6 +9,10 @@ all: clean: rm -rf node_modules/* +update-windshaft: + rm -rf node_modules/windshaft + npm install windshaft + distclean: clean rm config.status* From 7b57d22444fc4d75d1630bb8b66240c674186e50 Mon Sep 17 00:00:00 2001 From: Pablo Alonso Garcia Date: Mon, 26 Oct 2015 17:50:50 +0100 Subject: [PATCH 13/72] Added trailing slash to API endpoint in widget URLs --- lib/cartodb/controllers/map.js | 6 +++--- test/acceptance/lists.js | 5 +++++ 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/lib/cartodb/controllers/map.js b/lib/cartodb/controllers/map.js index e514d8a9..117bb62d 100644 --- a/lib/cartodb/controllers/map.js +++ b/lib/cartodb/controllers/map.js @@ -349,13 +349,13 @@ function getUrls(username, resource) { var cdnUrl = global.environment.serverMetadata && global.environment.serverMetadata.cdn_url; if (cdnUrl) { return { - http: 'http://' + cdnUrl.http + '/' + username + '/api/v1/map' + resource, - https: 'https://' + cdnUrl.https + '/' + username + '/api/v1/map' + resource + http: 'http://' + cdnUrl.http + '/' + username + '/api/v1/map/' + resource, + https: 'https://' + cdnUrl.https + '/' + username + '/api/v1/map/' + resource }; } else { var port = global.environment.port; return { - http: 'http://' + username + '.' + 'localhost.lan:' + port + '/api/v1/map' + resource + http: 'http://' + username + '.' + 'localhost.lan:' + port + '/api/v1/map/' + resource }; } } diff --git a/test/acceptance/lists.js b/test/acceptance/lists.js index eb468105..ab94b79e 100644 --- a/test/acceptance/lists.js +++ b/test/acceptance/lists.js @@ -72,7 +72,12 @@ describe('lists', function() { return next(err); } var parsedBody = JSON.parse(res.body); + var expectedWidgetURLS = { + "http": "http://localhost.localhost.lan:8888" + + "/api/v1/map/adfb1f912ddb9a5af5e9ef0b2229ed3b:1234567890123/0/widget/names" + }; assert.ok(parsedBody.metadata.layers[0].widgets.names); + assert.equal(parsedBody.metadata.layers[0].widgets.names.url.http, expectedWidgetURLS.http); return next(null, parsedBody.layergroupid); } ); From fda405f35dea5d8fc6ae336f4679d36fcd66e9de Mon Sep 17 00:00:00 2001 From: Raul Ochoa Date: Tue, 27 Oct 2015 12:50:27 +0100 Subject: [PATCH 14/72] Unify widgets tests --- test/acceptance/histograms.js | 119 ----------------------- test/acceptance/{lists.js => widgets.js} | 95 +++++++++++++++++- 2 files changed, 94 insertions(+), 120 deletions(-) delete mode 100644 test/acceptance/histograms.js rename test/acceptance/{lists.js => widgets.js} (58%) diff --git a/test/acceptance/histograms.js b/test/acceptance/histograms.js deleted file mode 100644 index 24537640..00000000 --- a/test/acceptance/histograms.js +++ /dev/null @@ -1,119 +0,0 @@ -var assert = require('../support/assert'); -var step = require('step'); - -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('histograms', function() { - - var keysToDelete; - - beforeEach(function() { - keysToDelete = {}; - }); - - afterEach(function(done) { - helper.deleteRedisKeys(keysToDelete, done); - }); - - - it("should expose layer histogram", function(done) { - - var layergroup = { - 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 layergroupId; - step( - function createLayergroup() { - var next = this; - assert.response(server, - { - url: '/api/v1/map', - method: 'POST', - headers: { - host: 'localhost', - 'Content-Type': 'application/json' - }, - data: JSON.stringify(layergroup) - }, - { - status: 200, - headers: { - 'Content-Type': 'application/json; charset=utf-8' - } - }, - function(res, err) { - if (err) { - return next(err); - } - return next(null, JSON.parse(res.body).layergroupid); - } - ); - }, - function getHistogram(err, _layergroupId) { - assert.ifError(err); - - var next = this; - layergroupId = _layergroupId; - - assert.response(server, - { - url: '/api/v1/map/' + layergroupId + '/0/widget/pop_max', - method: 'GET', - headers: { - host: 'localhost' - } - }, - { - status: 200, - headers: { - 'Content-Type': 'application/json; charset=utf-8' - } - }, - function(res, err) { - if (err) { - return next(err); - } - - var histogram = JSON.parse(res.body); - - assert.ok(histogram.length); - - next(null); - } - ); - }, - function finish(err) { - keysToDelete['map_cfg|' + LayergroupToken.parse(layergroupId).token] = 0; - keysToDelete['user:localhost:mapviews:global'] = 5; - done(err); - } - ); - }); - -}); diff --git a/test/acceptance/lists.js b/test/acceptance/widgets.js similarity index 58% rename from test/acceptance/lists.js rename to test/acceptance/widgets.js index ab94b79e..7014ec67 100644 --- a/test/acceptance/lists.js +++ b/test/acceptance/widgets.js @@ -10,7 +10,7 @@ var server = new CartodbWindshaft(serverOptions); server.setMaxListeners(0); -describe('lists', function() { +describe('widgets', function() { var keysToDelete; @@ -128,4 +128,97 @@ describe('lists', function() { ); }); + it("should expose layer histogram", function(done) { + + var layergroup = { + 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 layergroupId; + step( + function createLayergroup() { + var next = this; + assert.response(server, + { + url: '/api/v1/map', + method: 'POST', + headers: { + host: 'localhost', + 'Content-Type': 'application/json' + }, + data: JSON.stringify(layergroup) + }, + { + status: 200, + headers: { + 'Content-Type': 'application/json; charset=utf-8' + } + }, + function(res, err) { + if (err) { + return next(err); + } + return next(null, JSON.parse(res.body).layergroupid); + } + ); + }, + function getHistogram(err, _layergroupId) { + assert.ifError(err); + + var next = this; + layergroupId = _layergroupId; + + assert.response(server, + { + url: '/api/v1/map/' + layergroupId + '/0/widget/pop_max', + method: 'GET', + headers: { + host: 'localhost' + } + }, + { + status: 200, + headers: { + 'Content-Type': 'application/json; charset=utf-8' + } + }, + function(res, err) { + if (err) { + return next(err); + } + + var histogram = JSON.parse(res.body); + + assert.ok(histogram.length); + + next(null); + } + ); + }, + function finish(err) { + keysToDelete['map_cfg|' + LayergroupToken.parse(layergroupId).token] = 0; + keysToDelete['user:localhost:mapviews:global'] = 5; + done(err); + } + ); + }); + }); From 473b20596aec390fff77dcd86feaaa0b34abd432 Mon Sep 17 00:00:00 2001 From: Raul Ochoa Date: Tue, 27 Oct 2015 13:06:15 +0100 Subject: [PATCH 15/72] Adds helper function to retrieve widgets --- test/acceptance/widgets.js | 258 ++++++++++++++++--------------------- 1 file changed, 110 insertions(+), 148 deletions(-) diff --git a/test/acceptance/widgets.js b/test/acceptance/widgets.js index 7014ec67..d2d6652a 100644 --- a/test/acceptance/widgets.js +++ b/test/acceptance/widgets.js @@ -1,5 +1,6 @@ -var assert = require('../support/assert'); -var step = require('step'); +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'); @@ -22,6 +23,89 @@ describe('widgets', function() { helper.deleteRedisKeys(keysToDelete, done); }); + function getWidget(mapConfig, widgetName, filters, callback) { + if (!callback) { + callback = filters; + filters = null; + } + + var url = '/api/v1/map'; + if (filters) { + url += '?' + qs.stringify({filters: JSON.stringify(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": "http://localhost.localhost.lan:8888" + + "/api/v1/map/" + parsedBody.layergroupid + "/0/widget/" + widgetName + }; + assert.ok(parsedBody.metadata.layers[0].widgets[widgetName]); + assert.equal(parsedBody.metadata.layers[0].widgets[widgetName].url.http, expectedWidgetURLS.http); + return next(null, parsedBody.layergroupid); + } + ); + }, + function getWidgetResult(err, _layergroupId) { + assert.ifError(err); + + var next = this; + layergroupId = _layergroupId; + + assert.response(server, + { + url: '/api/v1/map/' + layergroupId + '/0/widget/' + widgetName, + 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) { @@ -47,89 +131,25 @@ describe('widgets', function() { ] }; - var layergroupId; - step( - function createLayergroup() { - var next = this; - assert.response(server, - { - url: '/api/v1/map', - method: 'POST', - headers: { - host: 'localhost', - 'Content-Type': 'application/json' - }, - data: JSON.stringify(layergroup) - }, - { - 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": "http://localhost.localhost.lan:8888" + - "/api/v1/map/adfb1f912ddb9a5af5e9ef0b2229ed3b:1234567890123/0/widget/names" - }; - assert.ok(parsedBody.metadata.layers[0].widgets.names); - assert.equal(parsedBody.metadata.layers[0].widgets.names.url.http, expectedWidgetURLS.http); - return next(null, parsedBody.layergroupid); - } - ); - }, - function getList(err, _layergroupId) { - assert.ifError(err); - - var next = this; - layergroupId = _layergroupId; - - assert.response(server, - { - url: '/api/v1/map/' + layergroupId + '/0/widget/names', - method: 'GET', - headers: { - host: 'localhost' - } - }, - { - status: 200, - headers: { - 'Content-Type': 'application/json; charset=utf-8' - } - }, - function(res, err) { - if (err) { - return next(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), expectedList); - - next(null); - } - ); - }, - function finish(err) { - keysToDelete['map_cfg|' + LayergroupToken.parse(layergroupId).token] = 0; - keysToDelete['user:localhost:mapviews:global'] = 5; - done(err); + getWidget(layergroup, '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), expectedList); + + done(); + }); }); it("should expose layer histogram", function(done) { - var layergroup = { version: '1.5.0', layers: [ @@ -151,74 +171,16 @@ describe('widgets', function() { } ] }; - - var layergroupId; - step( - function createLayergroup() { - var next = this; - assert.response(server, - { - url: '/api/v1/map', - method: 'POST', - headers: { - host: 'localhost', - 'Content-Type': 'application/json' - }, - data: JSON.stringify(layergroup) - }, - { - status: 200, - headers: { - 'Content-Type': 'application/json; charset=utf-8' - } - }, - function(res, err) { - if (err) { - return next(err); - } - return next(null, JSON.parse(res.body).layergroupid); - } - ); - }, - function getHistogram(err, _layergroupId) { - assert.ifError(err); - - var next = this; - layergroupId = _layergroupId; - - assert.response(server, - { - url: '/api/v1/map/' + layergroupId + '/0/widget/pop_max', - method: 'GET', - headers: { - host: 'localhost' - } - }, - { - status: 200, - headers: { - 'Content-Type': 'application/json; charset=utf-8' - } - }, - function(res, err) { - if (err) { - return next(err); - } - - var histogram = JSON.parse(res.body); - - assert.ok(histogram.length); - - next(null); - } - ); - }, - function finish(err) { - keysToDelete['map_cfg|' + LayergroupToken.parse(layergroupId).token] = 0; - keysToDelete['user:localhost:mapviews:global'] = 5; - done(err); + getWidget(layergroup, 'pop_max', function(err, res) { + if (err) { + return done(err); } - ); + + var histogram = JSON.parse(res.body); + assert.ok(histogram.length); + + done(); + }); }); }); From 0285f015e2f5bceb179a036af2c200fe50fbc01e Mon Sep 17 00:00:00 2001 From: Raul Ochoa Date: Tue, 27 Oct 2015 13:18:53 +0100 Subject: [PATCH 16/72] Pass filters within params --- lib/cartodb/controllers/base.js | 1 + test/acceptance/widgets.js | 58 +++++++++++++++++++++++++++++++++ 2 files changed, 59 insertions(+) diff --git a/lib/cartodb/controllers/base.js b/lib/cartodb/controllers/base.js index 24c06875..2f67ecd2 100644 --- a/lib/cartodb/controllers/base.js +++ b/lib/cartodb/controllers/base.js @@ -10,6 +10,7 @@ var lzmaWorker = new LZMA(); // Whitelist query parameters and attach format var REQUEST_QUERY_PARAMS_WHITELIST = [ 'config', + 'filters', 'map_key', 'api_key', 'auth_token', diff --git a/test/acceptance/widgets.js b/test/acceptance/widgets.js index d2d6652a..7b74e4f6 100644 --- a/test/acceptance/widgets.js +++ b/test/acceptance/widgets.js @@ -183,4 +183,62 @@ describe('widgets', function() { }); }); + describe('filters', function() { + var layergroup = { + 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(layergroup, 'country_places_count', function(err, res) { + if (err) { + return done(err); + } + + var aggregation = JSON.parse(res.body); + assert.equal(aggregation.length, 223); + assert.deepEqual(aggregation[0], { count: 769, adm0_a3: 'USA' }); + + done(); + }); + }); + + it("should expose a filtered aggregation", function(done) { + var filters = { + layers: [ + {country_places_count: {accept: ['CAN']}} + ] + }; + getWidget(layergroup, 'country_places_count', filters, function(err, res) { + if (err) { + return done(err); + } + + var aggregation = JSON.parse(res.body); + assert.equal(aggregation.length, 1); + assert.deepEqual(aggregation[0], { count: 256, adm0_a3: 'CAN' }); + + done(); + }); + }); + }); + }); From af0812e9909557713fa4385b64c70619f488ac38 Mon Sep 17 00:00:00 2001 From: Raul Ochoa Date: Tue, 27 Oct 2015 19:08:46 +0100 Subject: [PATCH 17/72] Fix jshint --- test/acceptance/widgets.js | 151 ++++++++++++++++++++++++++----------- 1 file changed, 108 insertions(+), 43 deletions(-) diff --git a/test/acceptance/widgets.js b/test/acceptance/widgets.js index 7b74e4f6..9ee0eb3b 100644 --- a/test/acceptance/widgets.js +++ b/test/acceptance/widgets.js @@ -64,7 +64,10 @@ describe('widgets', function() { "/api/v1/map/" + parsedBody.layergroupid + "/0/widget/" + widgetName }; assert.ok(parsedBody.metadata.layers[0].widgets[widgetName]); - assert.equal(parsedBody.metadata.layers[0].widgets[widgetName].url.http, expectedWidgetURLS.http); + assert.equal( + parsedBody.metadata.layers[0].widgets[widgetName].url.http, + expectedWidgetURLS.http + ); return next(null, parsedBody.layergroupid); } ); @@ -109,7 +112,7 @@ describe('widgets', function() { it("should expose layer list", function(done) { - var layergroup = { + var listWidgetMapConfig = { version: '1.5.0', layers: [ { @@ -131,7 +134,7 @@ describe('widgets', function() { ] }; - getWidget(layergroup, 'names', function(err, res) { + getWidget(listWidgetMapConfig, 'names', function(err, res) { if (err) { return done(err); } @@ -150,7 +153,7 @@ describe('widgets', function() { }); it("should expose layer histogram", function(done) { - var layergroup = { + var histogramMapConfig = { version: '1.5.0', layers: [ { @@ -171,7 +174,7 @@ describe('widgets', function() { } ] }; - getWidget(layergroup, 'pop_max', function(err, res) { + getWidget(histogramMapConfig, 'pop_max', function(err, res) { if (err) { return done(err); } @@ -184,59 +187,121 @@ describe('widgets', function() { }); describe('filters', function() { - var layergroup = { - 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' + + 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(layergroup, 'country_places_count', function(err, res) { - if (err) { - return done(err); - } + it("should expose an aggregation", function(done) { + getWidget(aggregationMapConfig, 'country_places_count', function(err, res) { + if (err) { + return done(err); + } - var aggregation = JSON.parse(res.body); - assert.equal(aggregation.length, 223); - assert.deepEqual(aggregation[0], { count: 769, adm0_a3: 'USA' }); + var aggregation = JSON.parse(res.body); + assert.equal(aggregation.length, 223); + assert.deepEqual(aggregation[0], { count: 769, adm0_a3: 'USA' }); - done(); + done(); + }); + }); + + it("should expose a filtered aggregation", function(done) { + var filters = { + layers: [ + {country_places_count: {accept: ['CAN']}} + ] + }; + getWidget(aggregationMapConfig, 'country_places_count', filters, function(err, res) { + if (err) { + return done(err); + } + + var aggregation = JSON.parse(res.body); + assert.equal(aggregation.length, 1); + assert.deepEqual(aggregation[0], { count: 256, adm0_a3: 'CAN' }); + + done(); + }); }); }); - it("should expose a filtered aggregation", function(done) { - var filters = { + describe('range', function() { + var histogramMapConfig = { + version: '1.5.0', layers: [ - {country_places_count: {accept: ['CAN']}} + { + 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' + } + } + } + } + } ] }; - getWidget(layergroup, 'country_places_count', filters, function(err, res) { - if (err) { - return done(err); - } - var aggregation = JSON.parse(res.body); - assert.equal(aggregation.length, 1); - assert.deepEqual(aggregation[0], { count: 256, adm0_a3: 'CAN' }); + it("should expose an aggregation", function(done) { + getWidget(histogramMapConfig, 'country_places_histogram', function(err, res) { + if (err) { + return done(err); + } - done(); + var histogram = JSON.parse(res.body); + // notice min value + assert.deepEqual(histogram[0], { bucket: 0, buckets: 10, min: 0, max: 3917000, freq: 7229 }); + + done(); + }); + }); + + it("should expose a filtered aggregation", function(done) { + var filters = { + layers: [ + { + country_places_histogram: { min: 4000000 } + } + ] + }; + getWidget(histogramMapConfig, 'country_places_histogram', filters, function(err, res) { + if (err) { + return done(err); + } + + var histogram = JSON.parse(res.body); + // notice min value + assert.deepEqual(histogram[0], { bucket: 0, buckets: 10, min: 4009000, max: 7297054, freq: 50 }); + + done(); + }); }); }); }); From 36369068e187b4670c60bd26723e8ed49c44664d Mon Sep 17 00:00:00 2001 From: Raul Ochoa Date: Tue, 27 Oct 2015 19:11:29 +0100 Subject: [PATCH 18/72] Use match instead of full url --- test/acceptance/widgets.js | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/test/acceptance/widgets.js b/test/acceptance/widgets.js index 9ee0eb3b..653ef7c2 100644 --- a/test/acceptance/widgets.js +++ b/test/acceptance/widgets.js @@ -60,13 +60,11 @@ describe('widgets', function() { } var parsedBody = JSON.parse(res.body); var expectedWidgetURLS = { - "http": "http://localhost.localhost.lan:8888" + - "/api/v1/map/" + parsedBody.layergroupid + "/0/widget/" + widgetName + http: "/api/v1/map/" + parsedBody.layergroupid + "/0/widget/" + widgetName }; assert.ok(parsedBody.metadata.layers[0].widgets[widgetName]); - assert.equal( - parsedBody.metadata.layers[0].widgets[widgetName].url.http, - expectedWidgetURLS.http + assert.ok( + parsedBody.metadata.layers[0].widgets[widgetName].url.http.match(expectedWidgetURLS.http) ); return next(null, parsedBody.layergroupid); } From cf2774c852fafc54989076f6218a95ce42074214 Mon Sep 17 00:00:00 2001 From: Raul Ochoa Date: Wed, 28 Oct 2015 12:06:06 +0100 Subject: [PATCH 19/72] Fix test description --- test/acceptance/widgets.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/acceptance/widgets.js b/test/acceptance/widgets.js index 653ef7c2..3dfb252e 100644 --- a/test/acceptance/widgets.js +++ b/test/acceptance/widgets.js @@ -281,7 +281,7 @@ describe('widgets', function() { }); }); - it("should expose a filtered aggregation", function(done) { + it("should expose a filtered histogram", function(done) { var filters = { layers: [ { From e5afdb1e047bed9b1505b1fe3fbe8cb5d03037c4 Mon Sep 17 00:00:00 2001 From: Raul Ochoa Date: Wed, 28 Oct 2015 12:21:43 +0100 Subject: [PATCH 20/72] Adds test combining two widgets + filters --- test/acceptance/widgets.js | 59 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 59 insertions(+) diff --git a/test/acceptance/widgets.js b/test/acceptance/widgets.js index 3dfb252e..a2ce376e 100644 --- a/test/acceptance/widgets.js +++ b/test/acceptance/widgets.js @@ -302,6 +302,65 @@ describe('widgets', 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 filters = { + layers: [ + { + country_places_count: { reject: ['CHN'] }, + country_places_histogram: { min: 7000000 } + } + ] + }; + getWidget(combinedWidgetsMapConfig, 'country_places_count', filters, 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[0], { count: 4, adm0_a3: 'IND' }); + + // confirm 'CHN' was filtered out (reject) + assert.equal(aggregation.reduce(function(sum, row) { + return sum + (row.adm0_a3 === 'CHN' ? 1 : 0); + }, 0), 0); + + done(); + }); + }); + }); }); }); From 36b91180e49cbbfc4f836841c4407b1c1d62b712 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Carlos=20Matall=C3=ADn?= Date: Wed, 28 Oct 2015 15:51:31 +0100 Subject: [PATCH 21/72] docs: quickstart --- docs/quickstart.md | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/docs/quickstart.md b/docs/quickstart.md index 5952a26a..43768b77 100644 --- a/docs/quickstart.md +++ b/docs/quickstart.md @@ -3,7 +3,7 @@ You can create two types of maps with the Maps API: - **Anonymous maps** - You can create maps using your CartoDB public data. Any client can change the read-only SQL and CartoCSS parameters that generate the map tiles. These maps can be created from a JavaScript application alone and no authenticated calls are needed. See [this CartoDB.js example]({{ '/cartodb-platform/cartodb-js.html' | prepend: site.baseurl }}). + You can create maps using your CartoDB public data. Any client can change the read-only SQL and CartoCSS parameters that generate the map tiles. These maps can be created from a JavaScript application alone and no authenticated calls are needed. See [this CartoDB.js example](/cartodb-platform/cartodb-js/). - **Named maps** There are also maps that have access to your private data. These maps require an owner to setup and modify any SQL and CartoCSS parameters and are not modifiable without new setup calls. @@ -64,24 +64,27 @@ The following map config sets up a map of European countries that have a white f } ``` -The map config needs to be sent to CartoDB's Map API using an authenticated call. Here we will use a command line tool called `curl`. For more info about this tool, see [this blog post](http://quickleft.com/blog/command-line-tutorials-curl), or type ``man curl`` in bash. Using `curl`, and storing the config from above in a file `mapconfig.json`, the call would look like: +The map config needs to be sent to CartoDB's Map API using an authenticated call. Here we will use a command line tool called `curl`. For more info about this tool, see [this blog post](http://quickleft.com/blog/command-line-tutorials-curl), or type `man curl` in bash. Using `curl`, and storing the config from above in a file `mapconfig.json`, the call would look like: + +#### Call -
```bash curl 'https://{account}.cartodb.com/api/v1/map/named?api_key=APIKEY' -H 'Content-Type: application/json' -d @mapconfig.json ``` To get the `URL` to fetch the tiles you need to instantiate the map, where `template_id` is the template name from the previous response. -
+#### Call + ```bash curl -X POST 'https://{account}.cartodb.com/api/v1/map/named/:template_id' -H 'Content-Type: application/json' ``` The response will return JSON with properties for the `layergroupid`, the timestamp (`last_updated`) of the last data modification and some key/value pairs with `metadata` for the `layers`. + Note: all `layers` in `metadata` will always have a `type` string and a `meta` dictionary with the key/value pairs. -Here is an example response: +#### Response ```javascript { From 50a943c131f831c8c0a05f3c2af7bcaed51b29b4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Carlos=20Matall=C3=ADn?= Date: Wed, 28 Oct 2015 15:53:39 +0100 Subject: [PATCH 22/72] docs: quickstart --- docs/quickstart.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/quickstart.md b/docs/quickstart.md index 43768b77..3fb26ad1 100644 --- a/docs/quickstart.md +++ b/docs/quickstart.md @@ -3,7 +3,7 @@ You can create two types of maps with the Maps API: - **Anonymous maps** - You can create maps using your CartoDB public data. Any client can change the read-only SQL and CartoCSS parameters that generate the map tiles. These maps can be created from a JavaScript application alone and no authenticated calls are needed. See [this CartoDB.js example](/cartodb-platform/cartodb-js/). + You can create maps using your CartoDB public data. Any client can change the read-only SQL and CartoCSS parameters that generate the map tiles. These maps can be created from a JavaScript application alone and no authenticated calls are needed. See [this CartoDB.js example](/cartodb-platform/cartodb-js/getting-started/). - **Named maps** There are also maps that have access to your private data. These maps require an owner to setup and modify any SQL and CartoCSS parameters and are not modifiable without new setup calls. From 90487819bf28c38cd57a6007fb210653da035205 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Carlos=20Matall=C3=ADn?= Date: Wed, 28 Oct 2015 16:02:23 +0100 Subject: [PATCH 23/72] docs: anonymous_maps --- docs/anonymous_maps.md | 85 +++++++++++++++++++----------------------- 1 file changed, 39 insertions(+), 46 deletions(-) diff --git a/docs/anonymous_maps.md b/docs/anonymous_maps.md index 69e7632b..cb62a238 100644 --- a/docs/anonymous_maps.md +++ b/docs/anonymous_maps.md @@ -2,16 +2,16 @@ Anonymous maps allows you to instantiate a map given SQL and CartoCSS. It also allows you to add interaction capabilities using [UTF Grid.](https://github.com/mapbox/utfgrid-spec) + ## Instantiate -### Definition +#### Definition -
```html POST /api/v1/map ``` -### Params +#### Params ```javascript { @@ -30,35 +30,28 @@ POST /api/v1/map Should be a [Mapconfig](https://github.com/CartoDB/Windshaft/blob/0.44.1/doc/MapConfig-1.3.0.md). -### Response +#### Response The response includes: -- **layergroupid** - The ID for that map, used to compose the URL for the tiles. The final URL is: - - ```html - https://{account}.cartodb.com/api/v1/map/:layergroupid/{z}/{x}/{y}.png - ``` - -- **updated_at** - The ISO date of the last time the data involved in the query was updated. - -- **metadata** - Includes information about the layers. - - - -- **cdn_url** - URLs to fetch the data using the best CDN for your zone. +Attributes | Description +--- | --- +layergroupid | The ID for that map, used to compose the URL for the tiles. The final URL is: ```html + https://{account}.cartodb.com/api/v1/map/:layergroupid/{z}/{x}/{y}.png``` +updated_at | The ISO date of the last time the data involved in the query was updated. +metadata | Includes information about the layers. +cdn_url | URLs to fetch the data using the best CDN for your zone. ### Example -
REQUEST
+#### Call + ```bash curl 'https://documentation.cartodb.com/api/v1/map' -H 'Content-Type: application/json' -d @mapconfig.json ``` -
RESPONSE
+#### Response + ```javascript { "layergroupid": "c01a54877c62831bb51720263f91fb33:0", @@ -78,9 +71,9 @@ curl 'https://documentation.cartodb.com/api/v1/map' -H 'Content-Type: applicatio } ``` -#### Retrieve resources from the layergroup +### Retrieve resources from the layergroup -##### Mapnik tiles can be accessed using: +#### Mapnik tiles can be accessed using These tiles will get just the mapnik layers. To get individual layers see next section. @@ -88,7 +81,7 @@ These tiles will get just the mapnik layers. To get individual layers see next s https://documentation.cartodb.com/api/v1/map/c01a54877c62831bb51720263f91fb33:0/{z}/{x}/{y}.png ``` -##### Individual layers +#### Individual layers The MapConfig specification holds the layers definition in a 0-based index. Layers can be requested individually in different formats depending on the layer type. @@ -106,7 +99,7 @@ If the MapConfig had a Torque layer at index 1 it could be possible to request i https://documentation.cartodb.com/api/v1/map/c01a54877c62831bb51720263f91fb33:0/1/{z}/{x}/{y}.torque.json ``` -##### Attributes defined in `attributes` section: +#### Attributes defined in `attributes` section ```bash https://documentation.cartodb.com/api/v1/map/c01a54877c62831bb51720263f91fb33:0/:layer/attributes/:feature_id @@ -118,7 +111,7 @@ Which returns JSON with the attributes defined, like: { "c": 1, "d": 2 } ``` -##### Blending and layer selection +#### Blending and layer selection ```bash https://documentation.cartodb.com/api/v1/map/c01a54877c62831bb51720263f91fb33:0/:layer_filter/{z}/{x}/{y}.png @@ -154,47 +147,47 @@ Some notes about filtering: may change in the future **it is recommended** to always select the layers in ascending order so you will get a consistent behavior in the future. + ## Create JSONP The JSONP endpoint is provided in order to allow web browsers access which don't support CORS. -### Definition +#### Definition -
```bash GET /api/v1/map?callback=method ``` -### Params +#### Params -- **config** - Encoded JSON with the params for creating named maps (the variables defined in the template). - -- **lmza** - This attribute contains the same as config but LZMA compressed. It cannot be used at the same time as `config`. - -- **callback** - JSON callback name. +Param | Description +--- | --- +config | Encoded JSON with the params for creating named maps (the variables defined in the template). +lmza | This attribute contains the same as config but LZMA compressed. It cannot be used at the same time as `config`. +callback | JSON callback name. ### Example -
REQUEST
+#### Call + ```bash curl "https://documentation.cartodb.com/api/v1/map?callback=callback&config=%7B%22version%22%3A%221.0.1%22%2C%22layers%22%3A%5B%7B%22type%22%3A%22cartodb%22%2C%22options%22%3A%7B%22sql%22%3A%22select+%2A+from+european_countries_e%22%2C%22cartocss%22%3A%22%23european_countries_e%7B+polygon-fill%3A+%23FF6600%3B+%7D%22%2C%22cartocss_version%22%3A%222.3.0%22%2C%22interactivity%22%3A%5B%22cartodb_id%22%5D%7D%7D%5D%7D" ``` -
RESPONSE
+#### Response + ```javascript callback({ - layergroupid: "d9034c133262dfb90285cea26c5c7ad7:0", - cdn_url: { - "http": "http://cdb.com", - "https": "https://cdb.com" - }, - last_updated: "1970-01-01T00:00:00.000Z" + layergroupid: "d9034c133262dfb90285cea26c5c7ad7:0", + cdn_url: { + "http": "http://cdb.com", + "https": "https://cdb.com" + }, + last_updated: "1970-01-01T00:00:00.000Z" }) ``` + ## Remove Anonymous maps cannot be removed by an API call. They will expire after about five minutes but sometimes longer. If an anonymous map expires and tiles are requested from it, an error will be raised. This could happen if a user leaves a map open and after time, returns to the map and attempts to interact with it in a way that requires new tiles (e.g. zoom). The client will need to go through the steps of creating the map again to fix the problem. From 2c35e27095bccdf44c0f0c174b26290770cb7e4a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Carlos=20Matall=C3=ADn?= Date: Wed, 28 Oct 2015 16:07:04 +0100 Subject: [PATCH 24/72] docs: anonymous_maps --- docs/anonymous_maps.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/docs/anonymous_maps.md b/docs/anonymous_maps.md index cb62a238..ead1ce96 100644 --- a/docs/anonymous_maps.md +++ b/docs/anonymous_maps.md @@ -36,8 +36,7 @@ The response includes: Attributes | Description --- | --- -layergroupid | The ID for that map, used to compose the URL for the tiles. The final URL is: ```html - https://{account}.cartodb.com/api/v1/map/:layergroupid/{z}/{x}/{y}.png``` +layergroupid | The ID for that map, used to compose the URL for the tiles. The final URL is: `https://{account}.cartodb.com/api/v1/map/:layergroupid/{z}/{x}/{y}.png` updated_at | The ISO date of the last time the data involved in the query was updated. metadata | Includes information about the layers. cdn_url | URLs to fetch the data using the best CDN for your zone. From 3eda1750cc7120950fce4cd7ebb160e22dd6dd5f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Carlos=20Matall=C3=ADn?= Date: Wed, 28 Oct 2015 16:26:33 +0100 Subject: [PATCH 25/72] docs: named maps --- docs/named_maps.md | 182 +++++++++++++++++++++++++++------------------ 1 file changed, 110 insertions(+), 72 deletions(-) diff --git a/docs/named_maps.md b/docs/named_maps.md index 50bfb659..fc9b5954 100644 --- a/docs/named_maps.md +++ b/docs/named_maps.md @@ -14,18 +14,20 @@ Template maps are persistent with no preset expiration. They can only be created ## Create -### Definition +#### Definition -
```html POST /api/v1/map/named ``` -### Params +#### Params -- **api_key** is required +Params | Description +--- | --- +api_key | is required + +#### template.json -
template.json
```javascript { "version": "0.0.1", @@ -78,22 +80,32 @@ POST /api/v1/map/named #### Arguments -- **name**: There can be at most _one_ template with the same name for any user. Valid names start with a letter or a number, and only contain letters, numbers, dashes (-) or underscores (_). -- **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. -- **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. - - **zoom** The zoom level to use - - **center** - - **lng** The longitude to use for the center - - **lat** The latitude to use for the center - - **bounds** - - **west**: LowerCorner longitude for the bounding box, in decimal degrees (aka most western) - - **south**: LowerCorner latitude for the bounding box, in decimal degrees (aka most southern) - - **east**: UpperCorner longitude for the bounding box, in decimal degrees (aka most eastern) - - **north**: UpperCorner latitude for the bounding box, in decimal degrees (aka most northern) +Params | Description +--- | --- +name | There can be at most _one_ template with the same name for any user. Valid names start with a letter or a number, and only contain letters, numbers, dashes (-) or underscores (_). + +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. + +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. +--- | --- +|_ zoom | The zoom level to use + +|_ center | +--- | --- +|_ |_ lng | The longitude to use for the center +|_ |_ lat | The latitude to use for the center + +|_ bounds | +--- | --- +|_ |_ west | LowerCorner longitude for the bounding box, in decimal degrees (aka most western) +|_ |_ south | LowerCorner latitude for the bounding box, in decimal degrees (aka most southern) +|_ |_ east | UpperCorner longitude for the bounding box, in decimal degrees (aka most eastern) +|_ |_ north | UpperCorner latitude for the bounding box, in decimal degrees (aka most northern) ### Template Format @@ -113,16 +125,19 @@ The set of supported placeholders for a template will need to be explicitly defi The placeholder type will determine the kind of escaping for the associated value. Supported types are: -- **sql_literal** internal single-quotes will be sql-escaped -- **sql_ident** internal double-quotes will be sql-escaped -- **number** can only contain numerical representation -- **css_color** can only contain color names or hex-values +Types | Description +--- | --- +sql_literal | internal single-quotes will be sql-escaped +sql_ident | internal double-quotes will be sql-escaped +number | can only contain numerical representation +css_color | can only contain color names or hex-values Placeholder default values will be used whenever new values are not provided as options at the time of creation on the client. They can also be used to test the template by creating a default version with new options provided. When using templates, be very careful about your selections as they can give broad access to your data if they are defined losely. -
REQUEST
+#### Call + ```html curl -X POST \ -H 'Content-Type: application/json' \ @@ -130,7 +145,8 @@ curl -X POST \ 'https://documentation.cartodb.com/api/v1/map/named?api_key=APIKEY' ``` -
RESPONSE
+#### Response + ```javascript { "template_id":"name", @@ -141,16 +157,17 @@ curl -X POST \ Instantiating a map allows you to get the information needed to fetch tiles. That temporal map is an anonymous map. -### Definition +#### Definition -
```html POST /api/v1/map/named/:template_name ``` -### Param +#### Param -- **auth_token** optional, but required when `"method"` is set to `"token"` +Param | Description +--- | --- +auth_token | optional, but required when `"method"` is set to `"token"` ```javascript // params.json @@ -162,15 +179,15 @@ POST /api/v1/map/named/:template_name The fields you pass as `params.json` depend on the variables allowed by the named map. If there are variables missing it will raise an error (HTTP 400) -- **auth_token** *optional* if the named map needs auth - ### Example You can initialize a template map by passing all of the required parameters in a POST to `/api/v1/map/named/:template_name`. Valid credentials will be needed if required by the template. -
REQUEST
+ +#### Call + ```bash curl -X POST \ -H 'Content-Type: application/json' \ @@ -178,7 +195,8 @@ curl -X POST \ 'https://documentation.cartodb.com/api/v1/map/named/@template_name?auth_token=AUTH_TOKEN' ``` -
Response
+#### Response + ```javascript { "layergroupid": "docs@fd2861af@c01a54877c62831bb51720263f91fb33:123456788", @@ -186,39 +204,43 @@ curl -X POST \ } ``` -
Error
+#### Error + ```javascript { "errors" : ["Some error string here"] } ``` -You can then use the `layergroupid` for fetching tiles and grids as you would normally (see anonymous map section). However you'll need to show the `auth_token`, if required by the template. +You can then use the `layergroupid` for fetching tiles and grids as you would normally (see anonymous map section). However you'll need to show the `auth_token`, if required by the template. ## Using JSONP There is also a special endpoint to be able to initialize a map using JSONP (for old browsers). -### Definition +#### Definition -
```bash GET /api/v1/map/named/:template_name/jsonp ``` -### Params +#### Params -- **auth_token** optional, but required when `"method"` is set to `"token"` -- **config** Encoded JSON with the params for creating named maps (the variables defined in the template) -- **lmza** This attribute contains the same as config but LZMA compressed. It cannot be used at the same time than `config`. -- **callback:** JSON callback name +Params | Description +--- | --- +auth_token | optional, but required when `"method"` is set to `"token"` +config | Encoded JSON with the params for creating named maps (the variables defined in the template) +lmza | This attribute contains the same as config but LZMA compressed. It cannot be used at the same time than `config`. +callback | JSON callback name + +#### Call -
REQUEST
```bash curl 'https://documentation.cartodb.com/api/v1/map/named/:template_name/jsonp?auth_token=AUTH_TOKEN&callback=callback&config=template_params_json' ``` -
RESPONSE
+#### Response + ```javascript callback({ "layergroupid":"c01a54877c62831bb51720263f91fb33:0", @@ -248,18 +270,20 @@ callback({ ## Update -### Definition +#### Definition
```bash PUT /api/v1/map/named/:template_name ``` -### Params +#### Params -- **api_key** is required +Param | Description +--- | --- +api_key | is required -### Response +#### Response Same as updating a map. @@ -269,7 +293,8 @@ Updating a named map removes all the named map instances so they need to be init ### Example -
REQUEST
+#### Call + ```bash curl -X PUT \ -H 'Content-Type: application/json' \ @@ -277,7 +302,8 @@ curl -X PUT \ 'https://documentation.cartodb.com/api/v1/map/named/:template_name?api_key=APIKEY' ``` -
RESPONSE
+#### Response + ```javascript { "template_id": "@template_name" @@ -298,25 +324,29 @@ If a template with the same name does NOT exist, a 400 HTTP response is generate Delete the specified template map from the server and it disables any previously initialized versions of the map. -### Definition +#### Definition
```bash DELETE /api/v1/map/named/:template_name ``` -### Params +#### Params -- **api_key** is required +Param | Description +--- | --- +api_key | is required ### Example -
REQUEST
+#### Call + ```bash curl -X DELETE 'https://documentation.cartodb.com/api/v1/map/named/:template_name?api_key=APIKEY' ``` -
RESPONSE
+#### Response + ```javascript { "errors" : ["Some error string here"] @@ -329,35 +359,39 @@ On success, a 204 (No Content) response will be issued. Otherwise a 4xx response This allows you to get a list of all available templates. -### Definition +#### Definition -
```bash GET /api/v1/map/named/ ``` -### Params +#### Params -- **api_key** is required +Param | Description +--- | --- +api_key | is required ### Example -
REQUEST
+#### Call + ```bash curl -X GET 'https://documentation.cartodb.com/api/v1/map/named?api_key=APIKEY' ``` -
RESPONSE
+#### Response + ```javascript { "template_ids": ["@template_name1","@template_name2"] } ``` -
ERROR
+#### Error + ```javascript { - "errors" : ["Some error string here"] + "errors" : ["Some error string here"] } ``` @@ -365,32 +399,36 @@ curl -X GET 'https://documentation.cartodb.com/api/v1/map/named?api_key=APIKEY' This gets the definition of a template. -### Definition +#### Definition -
```bash GET /api/v1/map/named/:template_name ``` -### Params +#### Params -- **api_key** is required +Param | Description +--- | --- +api_key | is required ### Example -
REQUEST
+#### Call + ```bash curl -X GET 'https://documentation.cartodb.com/api/v1/map/named/:template_name?api_key=APIKEY' ``` -
RESPONSE
+#### Response + ```javascript { "template": {...} // see template.json above } ``` -
ERROR
+#### Error + ```javascript { "errors" : ["Some error string here"] From 8087f838ef291090a3c1187be2be3e67a2c66c77 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Carlos=20Matall=C3=ADn?= Date: Wed, 28 Oct 2015 16:46:50 +0100 Subject: [PATCH 26/72] docs: named maps --- docs/named_maps.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/named_maps.md b/docs/named_maps.md index fc9b5954..217653ba 100644 --- a/docs/named_maps.md +++ b/docs/named_maps.md @@ -456,7 +456,7 @@ cartodb.createLayer('map_dom_id',layerSource) ``` -[CartoDB.js](http://docs.cartodb.com/cartodb-platform/cartodb-js.html) has methods for accessing your named maps. +[CartoDB.js](http://docs.cartodb.com/cartodb-platform/cartodb-js/) has methods for accessing your named maps. -1. [layer.setParams()](http://docs.cartodb.com/cartodb-platform/cartodb-js.html#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.html#layersetauthtokenauthtoken) allows you to set the auth tokens to create the layer +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 From cc0ebf70a75783f65969d70e66e5cd53e72f149f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Carlos=20Matall=C3=ADn?= Date: Wed, 28 Oct 2015 16:55:11 +0100 Subject: [PATCH 27/72] docs: static maps --- docs/static_maps_api.md | 111 ++++++++++++++++++++++------------------ 1 file changed, 61 insertions(+), 50 deletions(-) diff --git a/docs/static_maps_api.md b/docs/static_maps_api.md index 8f9c22ad..ff97673b 100644 --- a/docs/static_maps_api.md +++ b/docs/static_maps_api.md @@ -17,38 +17,43 @@ GET /api/v1/map/static/center/:token/:z/:lat/:lng/:width/:height.:format #### Params -* **:token**: the layergroupid token from the map instantiation -* **:z**: the zoom level of the map -* **:lat**: the latitude for the center of the map -* **:lng**: the longitude for the center of the map -* **:width**: the width in pixels for the output image -* **:height**: the height in pixels for the output image -* **:format**: the format for the image, supported types: `png`, `jpg` - * **jpg** will have a default quality of 85. +Param | Description +--- | --- +:token | the layergroupid token from the map instantiation +:z | the zoom level of the map +:lat | the latitude for the center of the map + +:format | the format for the image, supported types: `png`, `jpg` +--- | --- +|_ jpg | will have a default quality of 85. ### Bounding Box #### Definition -
```bash GET /api/v1/map/static/bbox/:token/:bbox/:width/:height.:format` ``` #### Params -* **:token**: the layergroupid token from the map instantiation -* **:bbox**: the bounding box in WGS 84 (EPSG:4326), comma separated values for: - - LowerCorner longitude, in decimal degrees (aka most western) - - LowerCorner latitude, in decimal degrees (aka most southern) - - UpperCorner longitude, in decimal degrees (aka most eastern) - - UpperCorner latitude, in decimal degrees (aka most northern) -* **:width**: the width in pixels for the output image -* **:height**: the height in pixels for the output image -* **:format**: the format for the image, supported types: `png`, `jpg` - * **jpg** will have a default quality of 85. +Param | Description +--- | --- +:token | the layergroupid token from the map instantiation -Note: you can see this endpoint as: +:bbox | the bounding box in WGS 84 (EPSG:4326), comma separated values for: +--- | --- + | LowerCorner longitude, in decimal degrees (aka most western) + | LowerCorner latitude, in decimal degrees (aka most southern) + | UpperCorner longitude, in decimal degrees (aka most eastern) + | UpperCorner latitude, in decimal degrees (aka most northern) +:width | the width in pixels for the output image +:height | the height in pixels for the output image +:format | the format for the image, supported types: `png`, `jpg` + +:format | the bounding box in WGS 84 (EPSG:4326), comma separated values for: +--- | --- +|_ jpg | will have a default quality of 85. ```bash GET /api/v1/map/static/bbox/:token/:west,:south,:east,:north/:width/:height.:format` @@ -58,22 +63,26 @@ GET /api/v1/map/static/bbox/:token/:west,:south,:east,:north/:width/:height.:for #### Definition -
```bash GET /api/v1/map/static/named/:name/:width/:height.:format ``` #### Params -* **:name**: the name of the named map -* **:width**: the width in pixels for the output image -* **:height**: the height in pixels for the output image -* **:format**: the format for the image, supported types: `png`, `jpg` - * **jpg** will have a default quality of 85. +Param | Description +--- | --- +:name | the name of the named map +:width | the width in pixels for the output image +:height | the height in pixels for the output image +:height | the height in pixels for the output image + +:format | the format for the image, supported types: `png`, `jpg` +--- | --- +|_ jpg | will have a default quality of 85. A named maps static image will get its constraints from the [view in the template](#Arguments), if `view` is not present it will estimate the extent based on the involved tables otherwise it fallback to `"zoom": 1`, `"lng": 0` and `"lat": 0`. -####Layers +#### Layers The Static Maps API allows for multiple layers of incorporation into the `MapConfig` to allow for maximum versatility in creating a static map. The examples below were used to generate the static image example in the next section, and appear in the specific order designated. @@ -95,22 +104,24 @@ The Static Maps API allows for multiple layers of incorporation into the `MapCon By manipulating the `"urlTemplate"` custom basemaps can be used in generating static images. Supported map types for the Static Maps API are: - 'http://{s}.basemaps.cartocdn.com/dark_all/{z}/{x}/{y}.png', - 'http://{s}.basemaps.cartocdn.com/dark_nolabels/{z}/{x}/{y}.png', - 'http://{s}.basemaps.cartocdn.com/light_all/{z}/{x}/{y}.png', - 'http://{s}.basemaps.cartocdn.com/light_nolabels/{z}/{x}/{y}.png', +``` +'http://{s}.basemaps.cartocdn.com/dark_all/{z}/{x}/{y}.png', +'http://{s}.basemaps.cartocdn.com/dark_nolabels/{z}/{x}/{y}.png', +'http://{s}.basemaps.cartocdn.com/light_all/{z}/{x}/{y}.png', +'http://{s}.basemaps.cartocdn.com/light_nolabels/{z}/{x}/{y}.png', +``` **Mapnik** ```javascript - { - "type": "mapnik", - "options": { - "sql": "select null::geometry the_geom_webmercator", - "cartocss": "#layer {\n\tpolygon-fill: #FF3300;\n\tpolygon-opacity: 0;\n\tline-color: #333;\n\tline-width: 0;\n\tline-opacity: 0;\n}", - "cartocss_version": "2.2.0" - } - }, +{ + "type": "mapnik", + "options": { + "sql": "select null::geometry the_geom_webmercator", + "cartocss": "#layer {\n\tpolygon-fill: #FF3300;\n\tpolygon-opacity: 0;\n\tline-color: #333;\n\tline-width: 0;\n\tline-opacity: 0;\n}", + "cartocss_version": "2.2.0" + } +}, ``` **CartoDB** @@ -118,14 +129,14 @@ By manipulating the `"urlTemplate"` custom basemaps can be used in generating st 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. ```javascript - { - "type": "cartodb", - "options": { - "sql": "select * from park", - "cartocss": "/** simple visualization */\n\n#park{\n polygon-fill: #229A00;\n polygon-opacity: 0.7;\n line-color: #FFF;\n line-width: 0;\n line-opacity: 1;\n}", - "cartocss_version": "2.1.1" - } - }, +{ + "type": "cartodb", + "options": { + "sql": "select * from park", + "cartocss": "/** simple visualization */\n\n#park{\n polygon-fill: #229A00;\n polygon-opacity: 0.7;\n line-color: #FFF;\n line-width: 0;\n line-opacity: 1;\n}", + "cartocss_version": "2.1.1" + } +} ``` Additionally, static images from Torque maps and other map layers can be used together to generate highly customizable and versatile static maps. @@ -142,17 +153,17 @@ It is important to note that generated images are cached from the live data refe * JPEG quality by default is 85% * Timeout limits for generating static maps are the same across the CartoDB Editor and Platform. It is important to ensure timely processing of queries. - ## Examples After instantiating a map from a CartoDB account: -
REQUEST
+#### Call + ```bash GET /api/v1/map/static/center/4b615ff367e498e770e7d05e99181873:1420231989550.8699/14/40.71502926732618/-73.96039009094238/600/400.png ``` -### Response +#### Response

static-api

From cd00680c807f9c5eaf0d459eefed2e2fd61193c9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Carlos=20Matall=C3=ADn?= Date: Wed, 28 Oct 2015 17:00:22 +0100 Subject: [PATCH 28/72] docs: static maps --- docs/static_maps_api.md | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/docs/static_maps_api.md b/docs/static_maps_api.md index ff97673b..a806b8bb 100644 --- a/docs/static_maps_api.md +++ b/docs/static_maps_api.md @@ -89,17 +89,17 @@ The Static Maps API allows for multiple layers of incorporation into the `MapCon **Basemaps** ```javascript - { - "type": "http", - "options": { - "urlTemplate": "http://{s}.basemaps.cartocdn.com/dark_nolabels/{z}/{x}/{y}.png", - "subdomains": [ - "a", - "b", - "c" - ] - } - }, +{ + "type": "http", + "options": { + "urlTemplate": "http://{s}.basemaps.cartocdn.com/dark_nolabels/{z}/{x}/{y}.png", + "subdomains": [ + "a", + "b", + "c" + ] + } +} ``` By manipulating the `"urlTemplate"` custom basemaps can be used in generating static images. Supported map types for the Static Maps API are: From 034b49278834c1bceca86394bcba9146a09c0b6d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Carlos=20Matall=C3=ADn?= Date: Wed, 28 Oct 2015 17:02:16 +0100 Subject: [PATCH 29/72] docs: static maps --- docs/static_maps_api.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/static_maps_api.md b/docs/static_maps_api.md index a806b8bb..15c313c3 100644 --- a/docs/static_maps_api.md +++ b/docs/static_maps_api.md @@ -104,7 +104,7 @@ The Static Maps API allows for multiple layers of incorporation into the `MapCon By manipulating the `"urlTemplate"` custom basemaps can be used in generating static images. Supported map types for the Static Maps API are: -``` +```javascript 'http://{s}.basemaps.cartocdn.com/dark_all/{z}/{x}/{y}.png', 'http://{s}.basemaps.cartocdn.com/dark_nolabels/{z}/{x}/{y}.png', 'http://{s}.basemaps.cartocdn.com/light_all/{z}/{x}/{y}.png', From a3c7b3fc352a448b6a97b3fd5e9a98d569b7d542 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Carlos=20Matall=C3=ADn?= Date: Wed, 28 Oct 2015 17:31:20 +0100 Subject: [PATCH 30/72] docs: fixes --- docs/named_maps.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docs/named_maps.md b/docs/named_maps.md index 217653ba..bf64153a 100644 --- a/docs/named_maps.md +++ b/docs/named_maps.md @@ -179,6 +179,8 @@ auth_token | optional, but required when `"method"` is set to `"token"` The fields you pass as `params.json` depend on the variables allowed by the named map. If there are variables missing it will raise an error (HTTP 400) +- **auth_token** *optional* if the named map needs auth + ### Example You can initialize a template map by passing all of the required parameters in a POST to `/api/v1/map/named/:template_name`. From 277c0ee818408f32d7b964a31e6817ba4766cebc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Carlos=20Matall=C3=ADn?= Date: Wed, 28 Oct 2015 17:38:46 +0100 Subject: [PATCH 31/72] docs: fixes --- docs/static_maps_api.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docs/static_maps_api.md b/docs/static_maps_api.md index 15c313c3..537e672f 100644 --- a/docs/static_maps_api.md +++ b/docs/static_maps_api.md @@ -55,6 +55,8 @@ Param | Description --- | --- |_ jpg | will have a default quality of 85. +Note: you can see this endpoint as + ```bash GET /api/v1/map/static/bbox/:token/:west,:south,:east,:north/:width/:height.:format` ``` From 8e568d0f20de43ede0aa30d485c594aec3ee4795 Mon Sep 17 00:00:00 2001 From: Raul Ochoa Date: Thu, 29 Oct 2015 13:19:49 +0100 Subject: [PATCH 32/72] Adapt tests to new widgets format --- test/acceptance/widgets.js | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/test/acceptance/widgets.js b/test/acceptance/widgets.js index a2ce376e..939ae001 100644 --- a/test/acceptance/widgets.js +++ b/test/acceptance/widgets.js @@ -144,7 +144,7 @@ describe('widgets', function() { {name:"El Lacón"}, {name:"El Pico"} ]; - assert.deepEqual(JSON.parse(res.body), expectedList); + assert.deepEqual(JSON.parse(res.body).rows, expectedList); done(); }); @@ -178,7 +178,7 @@ describe('widgets', function() { } var histogram = JSON.parse(res.body); - assert.ok(histogram.length); + assert.ok(histogram.bins.length); done(); }); @@ -217,8 +217,8 @@ describe('widgets', function() { } var aggregation = JSON.parse(res.body); - assert.equal(aggregation.length, 223); - assert.deepEqual(aggregation[0], { count: 769, adm0_a3: 'USA' }); + assert.equal(aggregation.categories.length, 223); + assert.deepEqual(aggregation.categories[0], { count: 769, adm0_a3: 'USA' }); done(); }); @@ -236,8 +236,8 @@ describe('widgets', function() { } var aggregation = JSON.parse(res.body); - assert.equal(aggregation.length, 1); - assert.deepEqual(aggregation[0], { count: 256, adm0_a3: 'CAN' }); + assert.equal(aggregation.categories.length, 1); + assert.deepEqual(aggregation.categories[0], { count: 256, adm0_a3: 'CAN' }); done(); }); @@ -275,7 +275,7 @@ describe('widgets', function() { var histogram = JSON.parse(res.body); // notice min value - assert.deepEqual(histogram[0], { bucket: 0, buckets: 10, min: 0, max: 3917000, freq: 7229 }); + assert.deepEqual(histogram.bins[0], { bin: 0, min: 0, max: 3917000, freq: 7229 }); done(); }); @@ -296,7 +296,7 @@ describe('widgets', function() { var histogram = JSON.parse(res.body); // notice min value - assert.deepEqual(histogram[0], { bucket: 0, buckets: 10, min: 4009000, max: 7297054, freq: 50 }); + assert.deepEqual(histogram.bins[0], { bin: 0, min: 4009000, max: 7297054, freq: 50 }); done(); }); @@ -350,10 +350,10 @@ describe('widgets', function() { var aggregation = JSON.parse(res.body); // first one would be CHN if reject filter wasn't applied - assert.deepEqual(aggregation[0], { count: 4, adm0_a3: 'IND' }); + assert.deepEqual(aggregation.categories[0], { count: 4, adm0_a3: 'IND' }); // confirm 'CHN' was filtered out (reject) - assert.equal(aggregation.reduce(function(sum, row) { + assert.equal(aggregation.categories.reduce(function(sum, row) { return sum + (row.adm0_a3 === 'CHN' ? 1 : 0); }, 0), 0); From 8a81828a3d0c50770fa54d6d70cb7d76863208e2 Mon Sep 17 00:00:00 2001 From: Raul Ochoa Date: Thu, 29 Oct 2015 16:25:56 +0100 Subject: [PATCH 33/72] Enable bbox query string param --- lib/cartodb/controllers/base.js | 1 + test/acceptance/widgets.js | 91 +++++++++++++++++++++++---------- 2 files changed, 66 insertions(+), 26 deletions(-) diff --git a/lib/cartodb/controllers/base.js b/lib/cartodb/controllers/base.js index 2f67ecd2..3c968711 100644 --- a/lib/cartodb/controllers/base.js +++ b/lib/cartodb/controllers/base.js @@ -11,6 +11,7 @@ var lzmaWorker = new LZMA(); var REQUEST_QUERY_PARAMS_WHITELIST = [ 'config', 'filters', + 'bbox', 'map_key', 'api_key', 'auth_token', diff --git a/test/acceptance/widgets.js b/test/acceptance/widgets.js index 939ae001..2ad3417e 100644 --- a/test/acceptance/widgets.js +++ b/test/acceptance/widgets.js @@ -23,15 +23,15 @@ describe('widgets', function() { helper.deleteRedisKeys(keysToDelete, done); }); - function getWidget(mapConfig, widgetName, filters, callback) { + function getWidget(mapConfig, widgetName, params, callback) { if (!callback) { - callback = filters; - filters = null; + callback = params; + params = null; } var url = '/api/v1/map'; - if (filters) { - url += '?' + qs.stringify({filters: JSON.stringify(filters)}); + if (params && params.filters) { + url += '?' + qs.stringify({ filters: JSON.stringify(params.filters) }); } var layergroupId; @@ -76,9 +76,13 @@ describe('widgets', function() { var next = this; layergroupId = _layergroupId; + var url = '/api/v1/map/' + layergroupId + '/0/widget/' + widgetName; + if (params && params.bbox) { + url += '?' + qs.stringify({bbox: params.bbox}); + } assert.response(server, { - url: '/api/v1/map/' + layergroupId + '/0/widget/' + widgetName, + url: url, method: 'GET', headers: { host: 'localhost' @@ -225,12 +229,14 @@ describe('widgets', function() { }); it("should expose a filtered aggregation", function(done) { - var filters = { - layers: [ - {country_places_count: {accept: ['CAN']}} - ] + var params = { + filters: { + layers: [ + {country_places_count: {accept: ['CAN']}} + ] + } }; - getWidget(aggregationMapConfig, 'country_places_count', filters, function(err, res) { + getWidget(aggregationMapConfig, 'country_places_count', params, function(err, res) { if (err) { return done(err); } @@ -282,14 +288,16 @@ describe('widgets', function() { }); it("should expose a filtered histogram", function(done) { - var filters = { - layers: [ - { - country_places_histogram: { min: 4000000 } - } - ] + var params = { + filters: { + layers: [ + { + country_places_histogram: { min: 4000000 } + } + ] + } }; - getWidget(histogramMapConfig, 'country_places_histogram', filters, function(err, res) { + getWidget(histogramMapConfig, 'country_places_histogram', params, function(err, res) { if (err) { return done(err); } @@ -334,15 +342,46 @@ describe('widgets', function() { }; it("should expose a filtered aggregation", function(done) { - var filters = { - layers: [ - { - country_places_count: { reject: ['CHN'] }, - country_places_histogram: { min: 7000000 } - } - ] + var params = { + filters: { + layers: [ + { + country_places_count: { reject: ['CHN'] } + } + ] + } }; - getWidget(combinedWidgetsMapConfig, 'country_places_count', filters, function(err, res) { + 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], {"count":769,"adm0_a3":"USA"}); + + // confirm 'CHN' was filtered out (reject) + assert.equal(aggregation.categories.reduce(function(sum, row) { + return sum + (row.adm0_a3 === '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); } From b2cd421e2e44f399df15ad9c0fe7ea5909396fc4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Carlos=20Matall=C3=ADn?= Date: Thu, 29 Oct 2015 16:59:51 +0100 Subject: [PATCH 34/72] docs: rearrange overview --- docs/Map-API.md | 8 ++++++++ docs/quickstart.md | 8 -------- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/docs/Map-API.md b/docs/Map-API.md index a93af594..bb74d209 100644 --- a/docs/Map-API.md +++ b/docs/Map-API.md @@ -2,6 +2,14 @@ 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/). +You can create two types of maps with the Maps API: + +- **Anonymous maps** + You can create maps using your CartoDB public data. Any client can change the read-only SQL and CartoCSS parameters that generate the map tiles. These maps can be created from a JavaScript application alone and no authenticated calls are needed. See [this CartoDB.js example](/cartodb-platform/cartodb-js/getting-started/). + +- **Named maps** + There are also maps that have access to your private data. These maps require an owner to setup and modify any SQL and CartoCSS parameters and are not modifiable without new setup calls. + ## Documentation * [Quickstart](quickstart.md) diff --git a/docs/quickstart.md b/docs/quickstart.md index 3fb26ad1..00f084df 100644 --- a/docs/quickstart.md +++ b/docs/quickstart.md @@ -1,13 +1,5 @@ # Quickstart -You can create two types of maps with the Maps API: - -- **Anonymous maps** - You can create maps using your CartoDB public data. Any client can change the read-only SQL and CartoCSS parameters that generate the map tiles. These maps can be created from a JavaScript application alone and no authenticated calls are needed. See [this CartoDB.js example](/cartodb-platform/cartodb-js/getting-started/). - -- **Named maps** - There are also maps that have access to your private data. These maps require an owner to setup and modify any SQL and CartoCSS parameters and are not modifiable without new setup calls. - ## Anonymous maps Here is an example of how to create an anonymous map with JavaScript: From 2c4cb6d42e4025ea11ec524a7900a76add4e29e8 Mon Sep 17 00:00:00 2001 From: Raul Ochoa Date: Thu, 29 Oct 2015 17:18:14 +0100 Subject: [PATCH 35/72] Adds some tests for per widget bbox filters --- test/acceptance/widgets.js | 61 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 61 insertions(+) diff --git a/test/acceptance/widgets.js b/test/acceptance/widgets.js index 2ad3417e..1fe3ae20 100644 --- a/test/acceptance/widgets.js +++ b/test/acceptance/widgets.js @@ -399,6 +399,67 @@ describe('widgets', function() { 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], {"count":96,"adm0_a3":"RUS"}); + + // confirm 'CHN' was filtered out (reject) + assert.equal(aggregation.categories.reduce(function(sum, row) { + return sum + (row.adm0_a3 === '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], {"count":77,"adm0_a3":"TUR"}); + + // confirm 'CHN' was filtered out (reject) + assert.equal(aggregation.categories.reduce(function(sum, row) { + return sum + (row.adm0_a3 === 'CHN' ? 1 : 0); + }, 0), 0); + + done(); + }); + }); }); }); From 4bc8c577290355519a7b8cb47223f96d63a7c466 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Carlos=20Matall=C3=ADn?= Date: Fri, 30 Oct 2015 11:25:42 +0100 Subject: [PATCH 36/72] docs: remove code-title --- docs/named_maps.md | 2 -- docs/static_maps_api.md | 1 - 2 files changed, 3 deletions(-) diff --git a/docs/named_maps.md b/docs/named_maps.md index bf64153a..29303cbc 100644 --- a/docs/named_maps.md +++ b/docs/named_maps.md @@ -274,7 +274,6 @@ callback({ #### Definition -
```bash PUT /api/v1/map/named/:template_name ``` @@ -328,7 +327,6 @@ Delete the specified template map from the server and it disables any previously #### Definition -
```bash DELETE /api/v1/map/named/:template_name ``` diff --git a/docs/static_maps_api.md b/docs/static_maps_api.md index 537e672f..1d6f3160 100644 --- a/docs/static_maps_api.md +++ b/docs/static_maps_api.md @@ -10,7 +10,6 @@ Begin by instantiating either a named or anonymous map using the `layergroupid t #### Definition -
```bash GET /api/v1/map/static/center/:token/:z/:lat/:lng/:width/:height.:format ``` From 7d230cc15dfb232b43c6f46e55ab6233f00621d7 Mon Sep 17 00:00:00 2001 From: Raul Ochoa Date: Wed, 4 Nov 2015 17:21:33 +0100 Subject: [PATCH 37/72] Widgets returning two results --- lib/cartodb/controllers/base.js | 11 +++++---- test/acceptance/widgets.js | 42 ++++++++++++++++++++------------- 2 files changed, 33 insertions(+), 20 deletions(-) diff --git a/lib/cartodb/controllers/base.js b/lib/cartodb/controllers/base.js index 3c968711..d3b84513 100644 --- a/lib/cartodb/controllers/base.js +++ b/lib/cartodb/controllers/base.js @@ -10,12 +10,15 @@ var lzmaWorker = new LZMA(); // Whitelist query parameters and attach format var REQUEST_QUERY_PARAMS_WHITELIST = [ 'config', - 'filters', - 'bbox', 'map_key', 'api_key', 'auth_token', - 'callback' + 'callback', + // widgets & filters + 'filters', + 'bbox', + 'start', + 'end' ]; function BaseController(authApi, pgConnection) { @@ -193,7 +196,7 @@ BaseController.prototype.sendError = function(req, res, err, label) { var statusCode = findStatusCode(err); - debug('[%s ERROR] -- %d: %s', label, statusCode, err); + debug('[%s ERROR] -- %d: %s, %s', label, statusCode, err, err.stack); // If a callback was requested, force status to 200 if (req.query && req.query.callback) { diff --git a/test/acceptance/widgets.js b/test/acceptance/widgets.js index 1fe3ae20..29ad1137 100644 --- a/test/acceptance/widgets.js +++ b/test/acceptance/widgets.js @@ -148,7 +148,7 @@ describe('widgets', function() { {name:"El Lacón"}, {name:"El Pico"} ]; - assert.deepEqual(JSON.parse(res.body).rows, expectedList); + assert.deepEqual(JSON.parse(res.body).ownFilterOn.rows, expectedList); done(); }); @@ -182,7 +182,7 @@ describe('widgets', function() { } var histogram = JSON.parse(res.body); - assert.ok(histogram.bins.length); + assert.ok(histogram.ownFilterOn.bins.length); done(); }); @@ -221,8 +221,8 @@ describe('widgets', function() { } var aggregation = JSON.parse(res.body); - assert.equal(aggregation.categories.length, 223); - assert.deepEqual(aggregation.categories[0], { count: 769, adm0_a3: 'USA' }); + assert.equal(aggregation.ownFilterOn.categories.length, 223); + assert.deepEqual(aggregation.ownFilterOn.categories[0], { count: 769, adm0_a3: 'USA' }); done(); }); @@ -242,8 +242,8 @@ describe('widgets', function() { } var aggregation = JSON.parse(res.body); - assert.equal(aggregation.categories.length, 1); - assert.deepEqual(aggregation.categories[0], { count: 256, adm0_a3: 'CAN' }); + assert.equal(aggregation.ownFilterOn.categories.length, 1); + assert.deepEqual(aggregation.ownFilterOn.categories[0], { count: 256, adm0_a3: 'CAN' }); done(); }); @@ -281,7 +281,10 @@ describe('widgets', function() { var histogram = JSON.parse(res.body); // notice min value - assert.deepEqual(histogram.bins[0], { bin: 0, min: 0, max: 3917000, freq: 7229 }); + assert.deepEqual( + histogram.ownFilterOn.bins[0], + { bin:0, start:0, end:3567600, freq:7229, min:0, max:3917000 } + ); done(); }); @@ -304,7 +307,14 @@ describe('widgets', function() { var histogram = JSON.parse(res.body); // notice min value - assert.deepEqual(histogram.bins[0], { bin: 0, min: 4009000, max: 7297054, freq: 50 }); + assert.deepEqual(histogram.ownFilterOn.bins[0], { + bin: 0, + start: 4009000, + end: 7175700, + freq: 50, + min: 4009000, + max: 7297054 + }); done(); }); @@ -359,10 +369,10 @@ describe('widgets', function() { var aggregation = JSON.parse(res.body); // first one would be CHN if reject filter wasn't applied - assert.deepEqual(aggregation.categories[0], {"count":769,"adm0_a3":"USA"}); + assert.deepEqual(aggregation.ownFilterOn.categories[0], {"count":769,"adm0_a3":"USA"}); // confirm 'CHN' was filtered out (reject) - assert.equal(aggregation.categories.reduce(function(sum, row) { + assert.equal(aggregation.ownFilterOn.categories.reduce(function(sum, row) { return sum + (row.adm0_a3 === 'CHN' ? 1 : 0); }, 0), 0); @@ -389,10 +399,10 @@ describe('widgets', function() { var aggregation = JSON.parse(res.body); // first one would be CHN if reject filter wasn't applied - assert.deepEqual(aggregation.categories[0], { count: 4, adm0_a3: 'IND' }); + assert.deepEqual(aggregation.ownFilterOn.categories[0], { count: 4, adm0_a3: 'IND' }); // confirm 'CHN' was filtered out (reject) - assert.equal(aggregation.categories.reduce(function(sum, row) { + assert.equal(aggregation.ownFilterOn.categories.reduce(function(sum, row) { return sum + (row.adm0_a3 === 'CHN' ? 1 : 0); }, 0), 0); @@ -419,10 +429,10 @@ describe('widgets', function() { var aggregation = JSON.parse(res.body); // first one would be CHN if reject filter wasn't applied - assert.deepEqual(aggregation.categories[0], {"count":96,"adm0_a3":"RUS"}); + assert.deepEqual(aggregation.ownFilterOn.categories[0], {"count":96,"adm0_a3":"RUS"}); // confirm 'CHN' was filtered out (reject) - assert.equal(aggregation.categories.reduce(function(sum, row) { + assert.equal(aggregation.ownFilterOn.categories.reduce(function(sum, row) { return sum + (row.adm0_a3 === 'CHN' ? 1 : 0); }, 0), 0); @@ -450,10 +460,10 @@ describe('widgets', function() { var aggregation = JSON.parse(res.body); // first one would be CHN if reject filter wasn't applied - assert.deepEqual(aggregation.categories[0], {"count":77,"adm0_a3":"TUR"}); + assert.deepEqual(aggregation.ownFilterOn.categories[0], {"count":77,"adm0_a3":"TUR"}); // confirm 'CHN' was filtered out (reject) - assert.equal(aggregation.categories.reduce(function(sum, row) { + assert.equal(aggregation.ownFilterOn.categories.reduce(function(sum, row) { return sum + (row.adm0_a3 === 'CHN' ? 1 : 0); }, 0), 0); From a84dd7cd29987fb500c13164d8dd34981b863918 Mon Sep 17 00:00:00 2001 From: Raul Ochoa Date: Thu, 12 Nov 2015 19:45:49 +0100 Subject: [PATCH 38/72] Add more url params --- lib/cartodb/controllers/base.js | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/lib/cartodb/controllers/base.js b/lib/cartodb/controllers/base.js index d3b84513..88a22c45 100644 --- a/lib/cartodb/controllers/base.js +++ b/lib/cartodb/controllers/base.js @@ -15,10 +15,12 @@ var REQUEST_QUERY_PARAMS_WHITELIST = [ 'auth_token', 'callback', // widgets & filters - 'filters', - 'bbox', - 'start', - 'end' + 'filters', // json + 'own_filter', // 0, 1 + 'bbox', // w,s,e,n + 'bins', // number + 'start', // number + 'end' // number ]; function BaseController(authApi, pgConnection) { From 4c851a0d091ef2e76acaaececbe0abccc9a1f416 Mon Sep 17 00:00:00 2001 From: Raul Ochoa Date: Fri, 13 Nov 2015 10:35:30 +0100 Subject: [PATCH 39/72] Remove npm-shrinkwrap.json to ease development --- npm-shrinkwrap.json | 3124 ------------------------------------------- 1 file changed, 3124 deletions(-) delete mode 100644 npm-shrinkwrap.json diff --git a/npm-shrinkwrap.json b/npm-shrinkwrap.json deleted file mode 100644 index c42f0b6c..00000000 --- a/npm-shrinkwrap.json +++ /dev/null @@ -1,3124 +0,0 @@ -{ - "name": "windshaft-cartodb", - "version": "2.19.1", - "dependencies": { - "body-parser": { - "version": "1.14.1", - "from": "body-parser@~1.14.0", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.14.1.tgz", - "dependencies": { - "bytes": { - "version": "2.1.0", - "from": "bytes@2.1.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-2.1.0.tgz" - }, - "content-type": { - "version": "1.0.1", - "from": "content-type@~1.0.1", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.1.tgz" - }, - "depd": { - "version": "1.1.0", - "from": "depd@~1.1.0", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.0.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" - }, - "statuses": { - "version": "1.2.1", - "from": "statuses@1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.2.1.tgz" - } - } - }, - "iconv-lite": { - "version": "0.4.12", - "from": "iconv-lite@0.4.12", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.12.tgz" - }, - "on-finished": { - "version": "2.3.0", - "from": "on-finished@~2.3.0", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", - "dependencies": { - "ee-first": { - "version": "1.1.1", - "from": "ee-first@1.1.1", - "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz" - } - } - }, - "qs": { - "version": "5.1.0", - "from": "qs@5.1.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-5.1.0.tgz" - }, - "raw-body": { - "version": "2.1.4", - "from": "raw-body@~2.1.4", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.1.4.tgz", - "dependencies": { - "unpipe": { - "version": "1.0.0", - "from": "unpipe@1.0.0", - "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz" - } - } - }, - "type-is": { - "version": "1.6.9", - "from": "type-is@~1.6.6", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.9.tgz", - "dependencies": { - "media-typer": { - "version": "0.3.0", - "from": "media-typer@0.3.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz" - }, - "mime-types": { - "version": "2.1.7", - "from": "mime-types@~2.1.7", - "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" - } - } - } - } - } - } - }, - "cartodb-psql": { - "version": "0.4.0", - "from": "cartodb-psql@~0.4.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", - "resolved": "git://github.com/CartoDB/node-postgres.git#836a2dc3131e873fc4ba20cd16e7fb69a7dca98a", - "dependencies": { - "generic-pool": { - "version": "2.0.3", - "from": "generic-pool@2.0.3", - "resolved": "https://registry.npmjs.org/generic-pool/-/generic-pool-2.0.3.tgz" - }, - "buffer-writer": { - "version": "1.0.0", - "from": "buffer-writer@1.0.0", - "resolved": "https://registry.npmjs.org/buffer-writer/-/buffer-writer-1.0.0.tgz" - } - } - } - } - }, - "cartodb-redis": { - "version": "0.13.0", - "from": "cartodb-redis@~0.13.0", - "dependencies": { - "redis-mpool": { - "version": "0.1.0", - "from": "redis-mpool@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", - "resolved": "https://registry.npmjs.org/generic-pool/-/generic-pool-2.1.1.tgz" - }, - "redis": { - "version": "0.12.1", - "from": "redis@~0.12.1", - "resolved": "https://registry.npmjs.org/redis/-/redis-0.12.1.tgz" - }, - "hiredis": { - "version": "0.1.17", - "from": "hiredis@~0.1.17", - "resolved": "https://registry.npmjs.org/hiredis/-/hiredis-0.1.17.tgz", - "dependencies": { - "bindings": { - "version": "1.2.1", - "from": "bindings@*", - "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.2.1.tgz" - }, - "nan": { - "version": "1.1.2", - "from": "nan@~1.1.0", - "resolved": "https://registry.npmjs.org/nan/-/nan-1.1.2.tgz" - } - } - } - } - } - } - }, - "debug": { - "version": "2.2.0", - "from": "debug@~2.2.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz", - "dependencies": { - "ms": { - "version": "0.7.1", - "from": "ms@0.7.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz" - } - } - }, - "dot": { - "version": "1.0.3", - "from": "dot@~1.0.2", - "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", - "dependencies": { - "accepts": { - "version": "1.2.13", - "from": "accepts@~1.2.12", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.2.13.tgz", - "dependencies": { - "mime-types": { - "version": "2.1.7", - "from": "mime-types@~2.1.7", - "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" - } - } - }, - "negotiator": { - "version": "0.5.3", - "from": "negotiator@0.5.3", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.5.3.tgz" - } - } - }, - "array-flatten": { - "version": "1.1.1", - "from": "array-flatten@1.1.1", - "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" - }, - "content-type": { - "version": "1.0.1", - "from": "content-type@~1.0.1", - "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" - }, - "cookie-signature": { - "version": "1.0.6", - "from": "cookie-signature@1.0.6", - "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" - }, - "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" - }, - "etag": { - "version": "1.7.0", - "from": "etag@~1.7.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", - "dependencies": { - "unpipe": { - "version": "1.0.0", - "from": "unpipe@~1.0.0", - "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz" - } - } - }, - "fresh": { - "version": "0.3.0", - "from": "fresh@0.3.0", - "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" - }, - "methods": { - "version": "1.1.1", - "from": "methods@~1.1.1", - "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.1.tgz" - }, - "on-finished": { - "version": "2.3.0", - "from": "on-finished@~2.3.0", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", - "dependencies": { - "ee-first": { - "version": "1.1.1", - "from": "ee-first@1.1.1", - "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz" - } - } - }, - "parseurl": { - "version": "1.3.0", - "from": "parseurl@~1.3.0", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.0.tgz" - }, - "path-to-regexp": { - "version": "0.1.7", - "from": "path-to-regexp@0.1.7", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz" - }, - "proxy-addr": { - "version": "1.0.8", - "from": "proxy-addr@~1.0.8", - "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-1.0.8.tgz", - "dependencies": { - "forwarded": { - "version": "0.1.0", - "from": "forwarded@~0.1.0", - "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.0.tgz" - }, - "ipaddr.js": { - "version": "1.0.1", - "from": "ipaddr.js@1.0.1", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.0.1.tgz" - } - } - }, - "qs": { - "version": "4.0.0", - "from": "qs@4.0.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-4.0.0.tgz" - }, - "range-parser": { - "version": "1.0.3", - "from": "range-parser@~1.0.2", - "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", - "dependencies": { - "destroy": { - "version": "1.0.3", - "from": "destroy@1.0.3", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.3.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", - "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" - } - } - }, - "serve-static": { - "version": "1.10.0", - "from": "serve-static@~1.10.0", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.10.0.tgz" - }, - "type-is": { - "version": "1.6.9", - "from": "type-is@~1.6.6", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.9.tgz", - "dependencies": { - "media-typer": { - "version": "0.3.0", - "from": "media-typer@0.3.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz" - }, - "mime-types": { - "version": "2.1.7", - "from": "mime-types@~2.1.7", - "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" - } - } - } - } - }, - "utils-merge": { - "version": "1.0.0", - "from": "utils-merge@1.0.0", - "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.0.tgz" - }, - "vary": { - "version": "1.0.1", - "from": "vary@~1.0.1", - "resolved": "https://registry.npmjs.org/vary/-/vary-1.0.1.tgz" - } - } - }, - "fastly-purge": { - "version": "1.0.1", - "from": "fastly-purge@~1.0.1" - }, - "log4js": { - "version": "0.6.25", - "from": "https://github.com/CartoDB/log4js-node/tarball/cdb", - "resolved": "https://github.com/CartoDB/log4js-node/tarball/cdb", - "dependencies": { - "async": { - "version": "0.2.10", - "from": "async@~0.2.0", - "resolved": "https://registry.npmjs.org/async/-/async-0.2.10.tgz" - }, - "readable-stream": { - "version": "1.0.33", - "from": "readable-stream@~1.0.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.33.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.0.1", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz" - } - } - }, - "semver": { - "version": "4.3.6", - "from": "semver@~4.3.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-4.3.6.tgz" - }, - "underscore": { - "version": "1.8.2", - "from": "underscore@1.8.2", - "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.8.2.tgz" - } - } - }, - "lru-cache": { - "version": "2.6.5", - "from": "lru-cache@2.6.5", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.6.5.tgz" - }, - "lzma": { - "version": "1.3.7", - "from": "lzma@~1.3.7", - "resolved": "https://registry.npmjs.org/lzma/-/lzma-1.3.7.tgz" - }, - "node-statsd": { - "version": "0.0.7", - "from": "node-statsd@~0.0.7", - "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", - "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", - "dependencies": { - "generic-pool": { - "version": "2.1.1", - "from": "generic-pool@~2.1.1", - "resolved": "https://registry.npmjs.org/generic-pool/-/generic-pool-2.1.1.tgz" - }, - "redis": { - "version": "0.12.1", - "from": "redis@~0.12.1", - "resolved": "https://registry.npmjs.org/redis/-/redis-0.12.1.tgz" - }, - "hiredis": { - "version": "0.1.17", - "from": "hiredis@~0.1.17", - "resolved": "https://registry.npmjs.org/hiredis/-/hiredis-0.1.17.tgz", - "dependencies": { - "bindings": { - "version": "1.2.1", - "from": "bindings@*", - "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.2.1.tgz" - }, - "nan": { - "version": "1.1.2", - "from": "nan@~1.1.0", - "resolved": "https://registry.npmjs.org/nan/-/nan-1.1.2.tgz" - } - } - } - } - }, - "request": { - "version": "2.62.0", - "from": "request@~2.62.0", - "resolved": "https://registry.npmjs.org/request/-/request-2.62.0.tgz", - "dependencies": { - "bl": { - "version": "1.0.0", - "from": "bl@~1.0.0", - "resolved": "https://registry.npmjs.org/bl/-/bl-1.0.0.tgz", - "dependencies": { - "readable-stream": { - "version": "2.0.4", - "from": "readable-stream@~2.0.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.0.4.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" - }, - "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.2", - "from": "util-deprecate@~1.0.1", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.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.5.0", - "from": "async@^1.4.0", - "resolved": "https://registry.npmjs.org/async/-/async-1.5.0.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.7", - "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.4", - "from": "node-uuid@~1.4.0", - "resolved": "https://registry.npmjs.org/node-uuid/-/node-uuid-1.4.4.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.1", - "from": "tunnel-agent@~0.4.0", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.4.1.tgz" - }, - "tough-cookie": { - "version": "2.2.0", - "from": "tough-cookie@>=0.12.0", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.2.0.tgz" - }, - "http-signature": { - "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.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.8.0", - "from": "oauth-sign@~0.8.0", - "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.0.tgz" - }, - "hawk": { - "version": "3.1.1", - "from": "hawk@~3.1.0", - "resolved": "https://registry.npmjs.org/hawk/-/hawk-3.1.1.tgz", - "dependencies": { - "hoek": { - "version": "2.16.3", - "from": "hoek@2.x.x", - "resolved": "https://registry.npmjs.org/hoek/-/hoek-2.16.3.tgz" - }, - "boom": { - "version": "2.10.1", - "from": "boom@^2.8.x", - "resolved": "https://registry.npmjs.org/boom/-/boom-2.10.1.tgz" - }, - "cryptiles": { - "version": "2.0.5", - "from": "cryptiles@2.x.x", - "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-2.0.5.tgz" - }, - "sntp": { - "version": "1.0.9", - "from": "sntp@1.x.x", - "resolved": "https://registry.npmjs.org/sntp/-/sntp-1.0.9.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" - }, - "stringstream": { - "version": "0.0.5", - "from": "stringstream@~0.0.4", - "resolved": "https://registry.npmjs.org/stringstream/-/stringstream-0.0.5.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.9.0", - "from": "commander@^2.8.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.9.0.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.3", - "from": "is-my-json-valid@^2.12.0", - "resolved": "https://registry.npmjs.org/is-my-json-valid/-/is-my-json-valid-2.12.3.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.1", - "from": "xtend@^4.0.0", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz" - } - } - } - } - } - } - }, - "step": { - "version": "0.0.6", - "from": "step@~0.0.6", - "resolved": "https://registry.npmjs.org/step/-/step-0.0.6.tgz" - }, - "step-profiler": { - "version": "0.2.1", - "from": "step-profiler@~0.2.1", - "resolved": "https://registry.npmjs.org/step-profiler/-/step-profiler-0.2.1.tgz" - }, - "underscore": { - "version": "1.6.0", - "from": "underscore@~1.6.0", - "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.6.0.tgz" - }, - "windshaft": { - "version": "1.5.1", - "from": "https://github.com/CartoDB/Windshaft/tarball/mapconfig-extension", - "resolved": "https://github.com/CartoDB/Windshaft/tarball/mapconfig-extension", - "dependencies": { - "mapnik": { - "version": "1.4.15-cdb5", - "from": "https://github.com/CartoDB/node-mapnik/tarball/1.4.15-cdb5", - "resolved": "https://github.com/CartoDB/node-mapnik/tarball/1.4.15-cdb5", - "dependencies": { - "nan": { - "version": "1.2.0", - "from": "nan@~1.2.0", - "resolved": "https://registry.npmjs.org/nan/-/nan-1.2.0.tgz" - }, - "mapnik-vector-tile": { - "version": "0.5.5", - "from": "mapnik-vector-tile@0.5.5", - "resolved": "https://registry.npmjs.org/mapnik-vector-tile/-/mapnik-vector-tile-0.5.5.tgz" - }, - "node-pre-gyp": { - "version": "0.5.25", - "from": "node-pre-gyp@0.5.25", - "resolved": "https://registry.npmjs.org/node-pre-gyp/-/node-pre-gyp-0.5.25.tgz", - "dependencies": { - "nopt": { - "version": "3.0.1", - "from": "nopt@~3.0.1", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.1.tgz", - "dependencies": { - "abbrev": { - "version": "1.0.5", - "from": "abbrev@1", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.0.5.tgz" - } - } - }, - "npmlog": { - "version": "0.1.1", - "from": "npmlog@~0.1.1", - "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-0.1.1.tgz", - "dependencies": { - "ansi": { - "version": "0.3.0", - "from": "ansi@~0.3.0", - "resolved": "https://registry.npmjs.org/ansi/-/ansi-0.3.0.tgz" - } - } - }, - "request": { - "version": "2.40.0", - "from": "request@2.x", - "resolved": "https://registry.npmjs.org/request/-/request-2.40.0.tgz", - "dependencies": { - "qs": { - "version": "1.0.2", - "from": "qs@~1.0.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-1.0.2.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", - "dependencies": { - "punycode": { - "version": "1.3.1", - "from": "punycode@>=0.2.0", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.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.5", - "from": "combined-stream@~0.0.4", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-0.0.5.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" - } - } - }, - "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" - } - } - }, - "tunnel-agent": { - "version": "0.4.0", - "from": "tunnel-agent@~0.4.0", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.4.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", - "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" - }, - "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.2", - "from": "ctype@0.5.2", - "resolved": "https://registry.npmjs.org/ctype/-/ctype-0.5.2.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.1.1", - "from": "hawk@1.1.1", - "resolved": "https://registry.npmjs.org/hawk/-/hawk-1.1.1.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" - }, - "stringstream": { - "version": "0.0.4", - "from": "stringstream@~0.0.4", - "resolved": "https://registry.npmjs.org/stringstream/-/stringstream-0.0.4.tgz" - } - } - }, - "semver": { - "version": "3.0.1", - "from": "semver@~3.0.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-3.0.1.tgz" - }, - "tar": { - "version": "1.0.1", - "from": "tar@~1.0.0", - "resolved": "https://registry.npmjs.org/tar/-/tar-1.0.1.tgz", - "dependencies": { - "block-stream": { - "version": "0.0.7", - "from": "block-stream@*", - "resolved": "https://registry.npmjs.org/block-stream/-/block-stream-0.0.7.tgz" - }, - "fstream": { - "version": "1.0.2", - "from": "fstream@^1.0.2", - "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.2.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" - } - } - }, - "inherits": { - "version": "2.0.1", - "from": "inherits@2", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz" - } - } - }, - "tar-pack": { - "version": "2.0.0", - "from": "tar-pack@~2.0.0", - "resolved": "https://registry.npmjs.org/tar-pack/-/tar-pack-2.0.0.tgz", - "dependencies": { - "uid-number": { - "version": "0.0.3", - "from": "uid-number@0.0.3", - "resolved": "https://registry.npmjs.org/uid-number/-/uid-number-0.0.3.tgz" - }, - "once": { - "version": "1.1.1", - "from": "once@~1.1.1", - "resolved": "https://registry.npmjs.org/once/-/once-1.1.1.tgz" - }, - "debug": { - "version": "0.7.4", - "from": "debug@~0.7.2", - "resolved": "https://registry.npmjs.org/debug/-/debug-0.7.4.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.0.2", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-3.0.2.tgz" - }, - "inherits": { - "version": "2.0.1", - "from": "inherits@2", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz" - } - } - }, - "tar": { - "version": "0.1.20", - "from": "tar@~0.1.17", - "resolved": "https://registry.npmjs.org/tar/-/tar-0.1.20.tgz", - "dependencies": { - "block-stream": { - "version": "0.0.7", - "from": "block-stream@*", - "resolved": "https://registry.npmjs.org/block-stream/-/block-stream-0.0.7.tgz" - }, - "inherits": { - "version": "2.0.1", - "from": "inherits@2", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz" - } - } - }, - "fstream-ignore": { - "version": "0.0.7", - "from": "fstream-ignore@0.0.7", - "resolved": "https://registry.npmjs.org/fstream-ignore/-/fstream-ignore-0.0.7.tgz", - "dependencies": { - "minimatch": { - "version": "0.2.14", - "from": "minimatch@~0.2.0", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-0.2.14.tgz", - "dependencies": { - "lru-cache": { - "version": "2.5.0", - "from": "lru-cache@2", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.5.0.tgz" - }, - "sigmund": { - "version": "1.0.0", - "from": "sigmund@~1.0.0", - "resolved": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.0.tgz" - } - } - }, - "inherits": { - "version": "2.0.1", - "from": "inherits@2", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz" - } - } - }, - "readable-stream": { - "version": "1.0.31", - "from": "readable-stream@~1.0.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.31.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.0.1", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz" - } - } - }, - "graceful-fs": { - "version": "1.2.3", - "from": "graceful-fs@1.2", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-1.2.3.tgz" - } - } - }, - "mkdirp": { - "version": "0.5.0", - "from": "mkdirp@~0.5.0", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.0.tgz", - "dependencies": { - "minimist": { - "version": "0.0.8", - "from": "minimist@0.0.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz" - } - } - }, - "rc": { - "version": "0.5.1", - "from": "rc@~0.5.0", - "resolved": "https://registry.npmjs.org/rc/-/rc-0.5.1.tgz", - "dependencies": { - "minimist": { - "version": "0.0.10", - "from": "minimist@~0.0.7", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.10.tgz" - }, - "deep-extend": { - "version": "0.2.11", - "from": "deep-extend@~0.2.5", - "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.2.11.tgz" - }, - "strip-json-comments": { - "version": "0.1.3", - "from": "strip-json-comments@0.1.x", - "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" - } - } - }, - "rimraf": { - "version": "2.2.8", - "from": "rimraf@~2.2.8", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.2.8.tgz" - } - } - } - } - }, - "grainstore": { - "version": "1.1.0", - "from": "grainstore@~1.1.0", - "dependencies": { - "carto": { - "version": "0.9.5-cdb2", - "from": "https://github.com/CartoDB/carto/tarball/0.9.5-cdb2", - "resolved": "https://github.com/CartoDB/carto/tarball/0.9.5-cdb2", - "dependencies": { - "underscore": { - "version": "1.4.4", - "from": "underscore@~1.4.3", - "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.4.4.tgz" - }, - "mapnik-reference": { - "version": "5.0.9", - "from": "mapnik-reference@~5.0.7", - "resolved": "https://registry.npmjs.org/mapnik-reference/-/mapnik-reference-5.0.9.tgz" - }, - "xml2js": { - "version": "0.2.8", - "from": "xml2js@~0.2.4", - "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.2.8.tgz", - "dependencies": { - "sax": { - "version": "0.5.8", - "from": "sax@0.5.x", - "resolved": "https://registry.npmjs.org/sax/-/sax-0.5.8.tgz" - } - } - }, - "optimist": { - "version": "0.6.1", - "from": "optimist@~0.6.0", - "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", - "dependencies": { - "wordwrap": { - "version": "0.0.3", - "from": "wordwrap@~0.0.2", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz" - }, - "minimist": { - "version": "0.0.10", - "from": "minimist@~0.0.1", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.10.tgz" - } - } - } - } - }, - "millstone": { - "version": "0.6.14", - "from": "millstone@0.6.14", - "resolved": "https://registry.npmjs.org/millstone/-/millstone-0.6.14.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.4", - "from": "node-uuid@~1.4.0", - "resolved": "https://registry.npmjs.org/node-uuid/-/node-uuid-1.4.4.tgz" - }, - "tough-cookie": { - "version": "2.2.0", - "from": "tough-cookie@>=0.12.0", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.2.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.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" - } - } - }, - "srs": { - "version": "0.4.9", - "from": "srs@~0.4.1", - "resolved": "https://registry.npmjs.org/srs/-/srs-0.4.9.tgz", - "dependencies": { - "nan": { - "version": "1.8.4", - "from": "nan@~1.8.4", - "resolved": "https://registry.npmjs.org/nan/-/nan-1.8.4.tgz" - }, - "node-pre-gyp": { - "version": "0.6.9", - "from": "node-pre-gyp@>=0.6.7 <0.7.0", - "dependencies": { - "nopt": { - "version": "3.0.3", - "from": "nopt@~3.0.1", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.3.tgz", - "dependencies": { - "abbrev": { - "version": "1.0.7", - "from": "abbrev@1", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.0.7.tgz" - } - } - }, - "npmlog": { - "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.0.1", - "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.60.0", - "from": "request@2.x", - "resolved": "https://registry.npmjs.org/request/-/request-2.60.0.tgz", - "dependencies": { - "bl": { - "version": "1.0.0", - "from": "bl@~1.0.0", - "resolved": "https://registry.npmjs.org/bl/-/bl-1.0.0.tgz", - "dependencies": { - "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": { - "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", - "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.2", - "from": "process-nextick-args@~1.0.0", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.2.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" - } - } - } - } - }, - "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-rc2", - "from": "form-data@~1.0.0-rc1", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-1.0.0-rc2.tgz", - "dependencies": { - "async": { - "version": "1.4.0", - "from": "async@^1.2.1", - "resolved": "https://registry.npmjs.org/async/-/async-1.4.0.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.3", - "from": "mime-types@~2.1.2", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.3.tgz", - "dependencies": { - "mime-db": { - "version": "1.15.0", - "from": "mime-db@~1.15.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.15.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": "4.0.0", - "from": "qs@~4.0.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-4.0.0.tgz" - }, - "tunnel-agent": { - "version": "0.4.1", - "from": "tunnel-agent@~0.4.0", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.4.1.tgz" - }, - "tough-cookie": { - "version": "2.0.0", - "from": "tough-cookie@>=0.12.0", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.0.0.tgz" - }, - "http-signature": { - "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.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.8.0", - "from": "oauth-sign@~0.8.0", - "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.0.tgz" - }, - "hawk": { - "version": "3.1.0", - "from": "hawk@~3.1.0", - "resolved": "https://registry.npmjs.org/hawk/-/hawk-3.1.0.tgz", - "dependencies": { - "hoek": { - "version": "2.14.0", - "from": "hoek@2.x.x", - "resolved": "https://registry.npmjs.org/hoek/-/hoek-2.14.0.tgz" - }, - "boom": { - "version": "2.8.0", - "from": "boom@^2.8.x", - "resolved": "https://registry.npmjs.org/boom/-/boom-2.8.0.tgz" - }, - "cryptiles": { - "version": "2.0.4", - "from": "cryptiles@2.x.x", - "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-2.0.4.tgz" - }, - "sntp": { - "version": "1.0.9", - "from": "sntp@1.x.x", - "resolved": "https://registry.npmjs.org/sntp/-/sntp-1.0.9.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" - }, - "stringstream": { - "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.9.34", - "from": "bluebird@^2.9.30", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-2.9.34.tgz" - }, - "chalk": { - "version": "1.1.0", - "from": "chalk@^1.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.0.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.1", - "from": "is-my-json-valid@^2.12.0", - "resolved": "https://registry.npmjs.org/is-my-json-valid/-/is-my-json-valid-2.12.1.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": "1.1.0", - "from": "jsonpointer@^1.1.0", - "resolved": "https://registry.npmjs.org/jsonpointer/-/jsonpointer-1.1.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": "5.0.1", - "from": "semver@~5.0.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.0.1.tgz" - }, - "tar": { - "version": "2.1.1", - "from": "tar@~2.1.0", - "resolved": "https://registry.npmjs.org/tar/-/tar-2.1.1.tgz", - "dependencies": { - "block-stream": { - "version": "0.0.8", - "from": "block-stream@*", - "resolved": "https://registry.npmjs.org/block-stream/-/block-stream-0.0.8.tgz" - }, - "fstream": { - "version": "1.0.7", - "from": "fstream@^1.0.2", - "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.7.tgz", - "dependencies": { - "graceful-fs": { - "version": "3.0.8", - "from": "graceful-fs@3", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-3.0.8.tgz" - } - } - }, - "inherits": { - "version": "2.0.1", - "from": "inherits@2", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz" - } - } - }, - "tar-pack": { - "version": "2.0.0", - "from": "tar-pack@~2.0.0", - "resolved": "https://registry.npmjs.org/tar-pack/-/tar-pack-2.0.0.tgz", - "dependencies": { - "uid-number": { - "version": "0.0.3", - "from": "uid-number@0.0.3", - "resolved": "https://registry.npmjs.org/uid-number/-/uid-number-0.0.3.tgz" - }, - "once": { - "version": "1.1.1", - "from": "once@~1.1.1", - "resolved": "https://registry.npmjs.org/once/-/once-1.1.1.tgz" - }, - "debug": { - "version": "0.7.4", - "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.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.0.0", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz" - } - } - }, - "tar": { - "version": "0.1.20", - "from": "tar@~0.1.17", - "resolved": "https://registry.npmjs.org/tar/-/tar-0.1.20.tgz", - "dependencies": { - "block-stream": { - "version": "0.0.8", - "from": "block-stream@*", - "resolved": "https://registry.npmjs.org/block-stream/-/block-stream-0.0.8.tgz" - }, - "inherits": { - "version": "2.0.1", - "from": "inherits@2", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz" - } - } - }, - "fstream-ignore": { - "version": "0.0.7", - "from": "fstream-ignore@0.0.7", - "resolved": "https://registry.npmjs.org/fstream-ignore/-/fstream-ignore-0.0.7.tgz", - "dependencies": { - "minimatch": { - "version": "0.2.14", - "from": "minimatch@~0.2.0", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-0.2.14.tgz", - "dependencies": { - "lru-cache": { - "version": "2.6.5", - "from": "lru-cache@2", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.6.5.tgz" - }, - "sigmund": { - "version": "1.0.1", - "from": "sigmund@~1.0.0", - "resolved": "https://registry.npmjs.org/sigmund/-/sigmund-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" - } - } - }, - "readable-stream": { - "version": "1.0.33", - "from": "readable-stream@~1.0.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.33.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.0.1", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz" - } - } - }, - "graceful-fs": { - "version": "1.2.3", - "from": "graceful-fs@1.2", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-1.2.3.tgz" - } - } - }, - "mkdirp": { - "version": "0.5.1", - "from": "mkdirp@~0.5.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" - } - } - }, - "rc": { - "version": "1.1.0", - "from": "rc@~1.1.0", - "resolved": "https://registry.npmjs.org/rc/-/rc-1.1.0.tgz", - "dependencies": { - "minimist": { - "version": "1.1.2", - "from": "minimist@^1.1.2", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.1.2.tgz" - }, - "deep-extend": { - "version": "0.2.11", - "from": "deep-extend@~0.2.5", - "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.2.11.tgz" - }, - "strip-json-comments": { - "version": "0.1.3", - "from": "strip-json-comments@0.1.x", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-0.1.3.tgz" - }, - "ini": { - "version": "1.3.4", - "from": "ini@~1.3.0", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.4.tgz" - } - } - }, - "rimraf": { - "version": "2.4.2", - "from": "rimraf@~2.4.0", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.4.2.tgz", - "dependencies": { - "glob": { - "version": "5.0.14", - "from": "glob@^5.0.14", - "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.14.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": "2.0.10", - "from": "minimatch@2.0.x", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-2.0.10.tgz", - "dependencies": { - "brace-expansion": { - "version": "1.1.0", - "from": "brace-expansion@^1.0.0", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.0.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" - } - } - } - } - } - } - } - } - }, - "zipfile": { - "version": "0.5.7", - "from": "zipfile@~0.5.2", - "resolved": "https://registry.npmjs.org/zipfile/-/zipfile-0.5.7.tgz", - "dependencies": { - "nan": { - "version": "1.5.3", - "from": "nan@~1.5.1", - "resolved": "https://registry.npmjs.org/nan/-/nan-1.5.3.tgz" - }, - "node-pre-gyp": { - "version": "0.6.2", - "from": "node-pre-gyp@>=0.6.2 <0.7.0", - "resolved": "https://registry.npmjs.org/node-pre-gyp/-/node-pre-gyp-0.6.2.tgz", - "dependencies": { - "nopt": { - "version": "3.0.1", - "from": "nopt@~3.0.1", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.1.tgz", - "dependencies": { - "abbrev": { - "version": "1.0.5", - "from": "abbrev@1", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.0.5.tgz" - } - } - }, - "npmlog": { - "version": "0.1.1", - "from": "npmlog@~0.1.1", - "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-0.1.1.tgz", - "dependencies": { - "ansi": { - "version": "0.3.0", - "from": "ansi@~0.3.0", - "resolved": "https://registry.npmjs.org/ansi/-/ansi-0.3.0.tgz" - } - } - }, - "request": { - "version": "2.51.0", - "from": "request@2.x", - "resolved": "https://registry.npmjs.org/request/-/request-2.51.0.tgz", - "dependencies": { - "bl": { - "version": "0.9.3", - "from": "bl@~0.9.0", - "resolved": "https://registry.npmjs.org/bl/-/bl-0.9.3.tgz", - "dependencies": { - "readable-stream": { - "version": "1.0.33", - "from": "readable-stream@~1.0.26", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.33.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.0.1", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz" - } - } - } - } - }, - "caseless": { - "version": "0.8.0", - "from": "caseless@~0.8.0", - "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.8.0.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" - }, - "form-data": { - "version": "0.2.0", - "from": "form-data@~0.2.0", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-0.2.0.tgz", - "dependencies": { - "async": { - "version": "0.9.0", - "from": "async@~0.9.0", - "resolved": "https://registry.npmjs.org/async/-/async-0.9.0.tgz" - }, - "mime-types": { - "version": "2.0.7", - "from": "mime-types@~2.0.3", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.0.7.tgz", - "dependencies": { - "mime-db": { - "version": "1.5.0", - "from": "mime-db@~1.5.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.5.0.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" - }, - "node-uuid": { - "version": "1.4.2", - "from": "node-uuid@~1.4.0", - "resolved": "https://registry.npmjs.org/node-uuid/-/node-uuid-1.4.2.tgz" - }, - "qs": { - "version": "2.3.3", - "from": "qs@~2.3.1", - "resolved": "https://registry.npmjs.org/qs/-/qs-2.3.3.tgz" - }, - "tunnel-agent": { - "version": "0.4.0", - "from": "tunnel-agent@~0.4.0", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.4.0.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", - "dependencies": { - "punycode": { - "version": "1.3.2", - "from": "punycode@>=0.2.0", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.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.5.0", - "from": "oauth-sign@~0.5.0", - "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.5.0.tgz" - }, - "hawk": { - "version": "1.1.1", - "from": "hawk@1.1.1", - "resolved": "https://registry.npmjs.org/hawk/-/hawk-1.1.1.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" - }, - "stringstream": { - "version": "0.0.4", - "from": "stringstream@~0.0.4", - "resolved": "https://registry.npmjs.org/stringstream/-/stringstream-0.0.4.tgz" - }, - "combined-stream": { - "version": "0.0.7", - "from": "combined-stream@~0.0.5", - "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" - } - } - } - } - }, - "semver": { - "version": "4.2.0", - "from": "semver@~4.2.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-4.2.0.tgz" - }, - "tar": { - "version": "1.0.3", - "from": "tar@~1.0.2", - "resolved": "https://registry.npmjs.org/tar/-/tar-1.0.3.tgz", - "dependencies": { - "block-stream": { - "version": "0.0.7", - "from": "block-stream@*", - "resolved": "https://registry.npmjs.org/block-stream/-/block-stream-0.0.7.tgz" - }, - "fstream": { - "version": "1.0.3", - "from": "fstream@^1.0.2", - "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.3.tgz", - "dependencies": { - "graceful-fs": { - "version": "3.0.5", - "from": "graceful-fs@3", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-3.0.5.tgz" - } - } - }, - "inherits": { - "version": "2.0.1", - "from": "inherits@2", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz" - } - } - }, - "tar-pack": { - "version": "2.0.0", - "from": "tar-pack@~2.0.0", - "resolved": "https://registry.npmjs.org/tar-pack/-/tar-pack-2.0.0.tgz", - "dependencies": { - "uid-number": { - "version": "0.0.3", - "from": "uid-number@0.0.3", - "resolved": "https://registry.npmjs.org/uid-number/-/uid-number-0.0.3.tgz" - }, - "once": { - "version": "1.1.1", - "from": "once@~1.1.1", - "resolved": "https://registry.npmjs.org/once/-/once-1.1.1.tgz" - }, - "debug": { - "version": "0.7.4", - "from": "debug@~0.7.2", - "resolved": "https://registry.npmjs.org/debug/-/debug-0.7.4.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.5", - "from": "graceful-fs@3", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-3.0.5.tgz" - }, - "inherits": { - "version": "2.0.1", - "from": "inherits@~2.0.0", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz" - } - } - }, - "tar": { - "version": "0.1.20", - "from": "tar@~0.1.17", - "resolved": "https://registry.npmjs.org/tar/-/tar-0.1.20.tgz", - "dependencies": { - "block-stream": { - "version": "0.0.7", - "from": "block-stream@*", - "resolved": "https://registry.npmjs.org/block-stream/-/block-stream-0.0.7.tgz" - }, - "inherits": { - "version": "2.0.1", - "from": "inherits@2", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz" - } - } - }, - "fstream-ignore": { - "version": "0.0.7", - "from": "fstream-ignore@0.0.7", - "resolved": "https://registry.npmjs.org/fstream-ignore/-/fstream-ignore-0.0.7.tgz", - "dependencies": { - "minimatch": { - "version": "0.2.14", - "from": "minimatch@~0.2.0", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-0.2.14.tgz", - "dependencies": { - "lru-cache": { - "version": "2.5.0", - "from": "lru-cache@2", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.5.0.tgz" - }, - "sigmund": { - "version": "1.0.0", - "from": "sigmund@~1.0.0", - "resolved": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.0.tgz" - } - } - }, - "inherits": { - "version": "2.0.1", - "from": "inherits@2", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz" - } - } - }, - "readable-stream": { - "version": "1.0.33", - "from": "readable-stream@~1.0.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.33.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.0.0", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz" - } - } - }, - "graceful-fs": { - "version": "1.2.3", - "from": "graceful-fs@1.2", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-1.2.3.tgz" - } - } - }, - "mkdirp": { - "version": "0.5.0", - "from": "mkdirp@~0.5.0", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.0.tgz", - "dependencies": { - "minimist": { - "version": "0.0.8", - "from": "minimist@0.0.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz" - } - } - }, - "rc": { - "version": "0.5.5", - "from": "rc@~0.5.1", - "resolved": "https://registry.npmjs.org/rc/-/rc-0.5.5.tgz", - "dependencies": { - "minimist": { - "version": "0.0.10", - "from": "minimist@~0.0.7", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.10.tgz" - }, - "deep-extend": { - "version": "0.2.11", - "from": "deep-extend@~0.2.5", - "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.2.11.tgz" - }, - "strip-json-comments": { - "version": "0.1.3", - "from": "strip-json-comments@0.1.x", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-0.1.3.tgz" - }, - "ini": { - "version": "1.3.2", - "from": "ini@~1.3.0", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.2.tgz" - } - } - }, - "rimraf": { - "version": "2.2.8", - "from": "rimraf@~2.2.8", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.2.8.tgz" - } - } - } - } - }, - "sqlite3": { - "version": "2.2.7", - "from": "sqlite3@2.x", - "resolved": "https://registry.npmjs.org/sqlite3/-/sqlite3-2.2.7.tgz", - "dependencies": { - "nan": { - "version": "1.1.2", - "from": "nan@1.1.2", - "resolved": "https://registry.npmjs.org/nan/-/nan-1.1.2.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", - "dependencies": { - "nopt": { - "version": "3.0.1", - "from": "nopt@~3.0.1", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.1.tgz", - "dependencies": { - "abbrev": { - "version": "1.0.5", - "from": "abbrev@1", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.0.5.tgz" - } - } - }, - "npmlog": { - "version": "0.1.1", - "from": "npmlog@~0.1.1", - "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-0.1.1.tgz", - "dependencies": { - "ansi": { - "version": "0.3.0", - "from": "ansi@~0.3.0", - "resolved": "https://registry.npmjs.org/ansi/-/ansi-0.3.0.tgz" - } - } - }, - "request": { - "version": "2.39.0", - "from": "request@2.x", - "resolved": "https://registry.npmjs.org/request/-/request-2.39.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", - "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", - "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" - } - } - }, - "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" - } - } - }, - "tunnel-agent": { - "version": "0.4.0", - "from": "tunnel-agent@~0.4.0", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.4.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", - "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" - }, - "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.2", - "from": "ctype@0.5.2", - "resolved": "https://registry.npmjs.org/ctype/-/ctype-0.5.2.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.1.1", - "from": "hawk@1.1.1", - "resolved": "https://registry.npmjs.org/hawk/-/hawk-1.1.1.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" - }, - "stringstream": { - "version": "0.0.4", - "from": "stringstream@~0.0.4", - "resolved": "https://registry.npmjs.org/stringstream/-/stringstream-0.0.4.tgz" - } - } - }, - "semver": { - "version": "3.0.1", - "from": "semver@~3.0.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-3.0.1.tgz" - }, - "tar": { - "version": "1.0.0", - "from": "tar@~1.0.0", - "resolved": "https://registry.npmjs.org/tar/-/tar-1.0.0.tgz", - "dependencies": { - "block-stream": { - "version": "0.0.7", - "from": "block-stream@*", - "resolved": "https://registry.npmjs.org/block-stream/-/block-stream-0.0.7.tgz" - }, - "fstream": { - "version": "1.0.1", - "from": "fstream@^1.0.0", - "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.1.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" - } - } - }, - "inherits": { - "version": "2.0.1", - "from": "inherits@~2.0.1", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz" - } - } - }, - "tar-pack": { - "version": "2.0.0", - "from": "tar-pack@~2.0.0", - "resolved": "https://registry.npmjs.org/tar-pack/-/tar-pack-2.0.0.tgz", - "dependencies": { - "uid-number": { - "version": "0.0.3", - "from": "uid-number@0.0.3", - "resolved": "https://registry.npmjs.org/uid-number/-/uid-number-0.0.3.tgz" - }, - "once": { - "version": "1.1.1", - "from": "once@~1.1.1", - "resolved": "https://registry.npmjs.org/once/-/once-1.1.1.tgz" - }, - "debug": { - "version": "0.7.4", - "from": "debug@~0.7.2", - "resolved": "https://registry.npmjs.org/debug/-/debug-0.7.4.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" - }, - "inherits": { - "version": "2.0.1", - "from": "inherits@2", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz" - } - } - }, - "tar": { - "version": "0.1.20", - "from": "tar@~0.1.17", - "resolved": "https://registry.npmjs.org/tar/-/tar-0.1.20.tgz", - "dependencies": { - "block-stream": { - "version": "0.0.7", - "from": "block-stream@*", - "resolved": "https://registry.npmjs.org/block-stream/-/block-stream-0.0.7.tgz" - }, - "inherits": { - "version": "2.0.1", - "from": "inherits@2", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz" - } - } - }, - "fstream-ignore": { - "version": "0.0.7", - "from": "fstream-ignore@0.0.7", - "resolved": "https://registry.npmjs.org/fstream-ignore/-/fstream-ignore-0.0.7.tgz", - "dependencies": { - "minimatch": { - "version": "0.2.14", - "from": "minimatch@~0.2.0", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-0.2.14.tgz", - "dependencies": { - "lru-cache": { - "version": "2.5.0", - "from": "lru-cache@2", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.5.0.tgz" - }, - "sigmund": { - "version": "1.0.0", - "from": "sigmund@~1.0.0", - "resolved": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.0.tgz" - } - } - }, - "inherits": { - "version": "2.0.1", - "from": "inherits@2", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz" - } - } - }, - "readable-stream": { - "version": "1.0.27-1", - "from": "readable-stream@~1.0.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.27-1.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.25-1", - "from": "string_decoder@~0.10.x", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.25-1.tgz" - }, - "inherits": { - "version": "2.0.1", - "from": "inherits@2", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz" - } - } - }, - "graceful-fs": { - "version": "1.2.3", - "from": "graceful-fs@1.2", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-1.2.3.tgz" - } - } - }, - "mkdirp": { - "version": "0.5.0", - "from": "mkdirp@~0.5.0", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.0.tgz", - "dependencies": { - "minimist": { - "version": "0.0.8", - "from": "minimist@0.0.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz" - } - } - }, - "rc": { - "version": "0.5.0", - "from": "rc@~0.5.0", - "resolved": "https://registry.npmjs.org/rc/-/rc-0.5.0.tgz", - "dependencies": { - "minimist": { - "version": "0.0.10", - "from": "minimist@~0.0.7", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.10.tgz" - }, - "deep-extend": { - "version": "0.2.11", - "from": "deep-extend@~0.2.5", - "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.2.11.tgz" - }, - "strip-json-comments": { - "version": "0.1.3", - "from": "strip-json-comments@0.1.x", - "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" - } - } - }, - "rimraf": { - "version": "2.2.8", - "from": "rimraf@~2.2.8", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.2.8.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", - "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" - }, - "optimist": { - "version": "0.6.1", - "from": "optimist@~0.6.0", - "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", - "dependencies": { - "wordwrap": { - "version": "0.0.3", - "from": "wordwrap@~0.0.2", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz" - }, - "minimist": { - "version": "0.0.10", - "from": "minimist@~0.0.1", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.10.tgz" - } - } - } - } - } - } - }, - "tilelive": { - "version": "4.5.3", - "from": "tilelive@~4.5.3", - "resolved": "https://registry.npmjs.org/tilelive/-/tilelive-4.5.3.tgz", - "dependencies": { - "optimist": { - "version": "0.6.1", - "from": "optimist@~0.6.0", - "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", - "dependencies": { - "wordwrap": { - "version": "0.0.3", - "from": "wordwrap@~0.0.2", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz" - }, - "minimist": { - "version": "0.0.10", - "from": "minimist@~0.0.1", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.10.tgz" - } - } - } - } - }, - "tilelive-mapnik": { - "version": "0.6.15-cdb3", - "from": "https://github.com/CartoDB/tilelive-mapnik/tarball/0.6.15-cdb3", - "resolved": "https://github.com/CartoDB/tilelive-mapnik/tarball/0.6.15-cdb3", - "dependencies": { - "generic-pool": { - "version": "2.1.1", - "from": "generic-pool@~2.1.1", - "resolved": "https://registry.npmjs.org/generic-pool/-/generic-pool-2.1.1.tgz" - }, - "mime": { - "version": "1.2.11", - "from": "mime@~1.2.9", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.2.11.tgz" - } - } - }, - "tilelive-bridge": { - "version": "1.3.0-cdb3", - "from": "https://github.com/CartoDB/tilelive-bridge/tarball/1.3.0-cdb3", - "resolved": "https://github.com/CartoDB/tilelive-bridge/tarball/1.3.0-cdb3", - "dependencies": { - "mapnik-pool": { - "version": "0.1.1-cdb3", - "from": "https://github.com/CartoDB/mapnik-pool/tarball/0.1.1-cdb3", - "resolved": "https://github.com/CartoDB/mapnik-pool/tarball/0.1.1-cdb3", - "dependencies": { - "generic-pool": { - "version": "2.1.1", - "from": "generic-pool@~2.1.1", - "resolved": "https://registry.npmjs.org/generic-pool/-/generic-pool-2.1.1.tgz" - }, - "xtend": { - "version": "3.0.0", - "from": "xtend@~3.0.0", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-3.0.0.tgz" - } - } - } - } - }, - "canvas": { - "version": "1.2.7-cdb1", - "from": "https://github.com/CartoDB/node-canvas/tarball/1.2.7-cdb1", - "resolved": "https://github.com/CartoDB/node-canvas/tarball/1.2.7-cdb1", - "dependencies": { - "nan": { - "version": "1.9.0", - "from": "nan@^1.8.4", - "resolved": "https://registry.npmjs.org/nan/-/nan-1.9.0.tgz" - } - } - }, - "semver": { - "version": "5.0.3", - "from": "semver@~5.0.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.0.3.tgz" - }, - "carto": { - "version": "0.15.1-cdb1", - "from": "https://github.com/CartoDB/carto/tarball/0.15.1-cdb1", - "resolved": "https://github.com/CartoDB/carto/tarball/0.15.1-cdb1", - "dependencies": { - "mapnik-reference": { - "version": "6.0.5", - "from": "mapnik-reference@~6.0.2", - "resolved": "https://registry.npmjs.org/mapnik-reference/-/mapnik-reference-6.0.5.tgz" - }, - "optimist": { - "version": "0.6.1", - "from": "optimist@~0.6.0", - "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", - "dependencies": { - "wordwrap": { - "version": "0.0.3", - "from": "wordwrap@~0.0.2", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz" - }, - "minimist": { - "version": "0.0.10", - "from": "minimist@~0.0.1", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.10.tgz" - } - } - } - } - }, - "cartodb-psql": { - "version": "0.6.1", - "from": "cartodb-psql@~0.6.1", - "dependencies": { - "pg": { - "version": "2.6.2-cdb3", - "from": "pg@git://github.com/CartoDB/node-postgres.git#2.6.2-cdb3", - "resolved": "git://github.com/CartoDB/node-postgres.git#069c5296d1a093077feff21719641bb9e71fc50e", - "dependencies": { - "generic-pool": { - "version": "2.0.3", - "from": "generic-pool@2.0.3", - "resolved": "https://registry.npmjs.org/generic-pool/-/generic-pool-2.0.3.tgz" - }, - "buffer-writer": { - "version": "1.0.0", - "from": "buffer-writer@1.0.0", - "resolved": "https://registry.npmjs.org/buffer-writer/-/buffer-writer-1.0.0.tgz" - } - } - } - } - }, - "torque.js": { - "version": "2.11.4", - "from": "torque.js@~2.11.0" - }, - "abaculus": { - "version": "1.1.0-cdb3", - "from": "https://github.com/CartoDB/abaculus/tarball/1.1.0-cdb3", - "resolved": "https://github.com/CartoDB/abaculus/tarball/1.1.0-cdb3" - }, - "sphericalmercator": { - "version": "1.0.3", - "from": "sphericalmercator@1.0.3", - "resolved": "https://registry.npmjs.org/sphericalmercator/-/sphericalmercator-1.0.3.tgz" - } - } - } - } -} From e2543792449390bc83b86dac9d063bc14f18d823 Mon Sep 17 00:00:00 2001 From: Raul Ochoa Date: Fri, 13 Nov 2015 10:35:52 +0100 Subject: [PATCH 40/72] Use windshaft's histogram branch --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index f5a462a6..995d319a 100644 --- a/package.json +++ b/package.json @@ -29,7 +29,7 @@ "node-statsd": "~0.0.7", "underscore" : "~1.6.0", "dot": "~1.0.2", - "windshaft": "https://github.com/CartoDB/Windshaft/tarball/mapconfig-extension", + "windshaft": "https://github.com/CartoDB/Windshaft/tarball/mapconfig-extension-histogram", "step": "~0.0.6", "queue-async": "~1.0.7", "request": "~2.62.0", From 9264f4a668324388712abcbdde06cb72810f68dd Mon Sep 17 00:00:00 2001 From: Raul Ochoa Date: Mon, 16 Nov 2015 12:13:54 +0100 Subject: [PATCH 41/72] Re-adds npm-shrinkwrap.json --- npm-shrinkwrap.json | 3124 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 3124 insertions(+) create mode 100644 npm-shrinkwrap.json diff --git a/npm-shrinkwrap.json b/npm-shrinkwrap.json new file mode 100644 index 00000000..f9549fa5 --- /dev/null +++ b/npm-shrinkwrap.json @@ -0,0 +1,3124 @@ +{ + "name": "windshaft-cartodb", + "version": "2.19.1", + "dependencies": { + "body-parser": { + "version": "1.14.1", + "from": "body-parser@~1.14.0", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.14.1.tgz", + "dependencies": { + "bytes": { + "version": "2.1.0", + "from": "bytes@2.1.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-2.1.0.tgz" + }, + "content-type": { + "version": "1.0.1", + "from": "content-type@~1.0.1", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.1.tgz" + }, + "depd": { + "version": "1.1.0", + "from": "depd@~1.1.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.0.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" + }, + "statuses": { + "version": "1.2.1", + "from": "statuses@1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.2.1.tgz" + } + } + }, + "iconv-lite": { + "version": "0.4.12", + "from": "iconv-lite@0.4.12", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.12.tgz" + }, + "on-finished": { + "version": "2.3.0", + "from": "on-finished@~2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "dependencies": { + "ee-first": { + "version": "1.1.1", + "from": "ee-first@1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz" + } + } + }, + "qs": { + "version": "5.1.0", + "from": "qs@5.1.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-5.1.0.tgz" + }, + "raw-body": { + "version": "2.1.4", + "from": "raw-body@~2.1.4", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.1.4.tgz", + "dependencies": { + "unpipe": { + "version": "1.0.0", + "from": "unpipe@1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz" + } + } + }, + "type-is": { + "version": "1.6.9", + "from": "type-is@~1.6.9", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.9.tgz", + "dependencies": { + "media-typer": { + "version": "0.3.0", + "from": "media-typer@0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz" + }, + "mime-types": { + "version": "2.1.7", + "from": "mime-types@~2.1.7", + "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" + } + } + } + } + } + } + }, + "cartodb-psql": { + "version": "0.4.0", + "from": "cartodb-psql@~0.4.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", + "resolved": "git://github.com/CartoDB/node-postgres.git#836a2dc3131e873fc4ba20cd16e7fb69a7dca98a", + "dependencies": { + "generic-pool": { + "version": "2.0.3", + "from": "generic-pool@2.0.3", + "resolved": "https://registry.npmjs.org/generic-pool/-/generic-pool-2.0.3.tgz" + }, + "buffer-writer": { + "version": "1.0.0", + "from": "buffer-writer@1.0.0", + "resolved": "https://registry.npmjs.org/buffer-writer/-/buffer-writer-1.0.0.tgz" + } + } + } + } + }, + "cartodb-redis": { + "version": "0.13.0", + "from": "cartodb-redis@~0.13.0", + "dependencies": { + "redis-mpool": { + "version": "0.1.0", + "from": "redis-mpool@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", + "resolved": "https://registry.npmjs.org/generic-pool/-/generic-pool-2.1.1.tgz" + }, + "redis": { + "version": "0.12.1", + "from": "redis@~0.12.1", + "resolved": "https://registry.npmjs.org/redis/-/redis-0.12.1.tgz" + }, + "hiredis": { + "version": "0.1.17", + "from": "hiredis@~0.1.17", + "resolved": "https://registry.npmjs.org/hiredis/-/hiredis-0.1.17.tgz", + "dependencies": { + "bindings": { + "version": "1.2.1", + "from": "bindings@*", + "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.2.1.tgz" + }, + "nan": { + "version": "1.1.2", + "from": "nan@~1.1.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-1.1.2.tgz" + } + } + } + } + } + } + }, + "debug": { + "version": "2.2.0", + "from": "debug@~2.2.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz", + "dependencies": { + "ms": { + "version": "0.7.1", + "from": "ms@0.7.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz" + } + } + }, + "dot": { + "version": "1.0.3", + "from": "dot@~1.0.2", + "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", + "dependencies": { + "accepts": { + "version": "1.2.13", + "from": "accepts@~1.2.12", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.2.13.tgz", + "dependencies": { + "mime-types": { + "version": "2.1.7", + "from": "mime-types@~2.1.7", + "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" + } + } + }, + "negotiator": { + "version": "0.5.3", + "from": "negotiator@0.5.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.5.3.tgz" + } + } + }, + "array-flatten": { + "version": "1.1.1", + "from": "array-flatten@1.1.1", + "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" + }, + "content-type": { + "version": "1.0.1", + "from": "content-type@~1.0.1", + "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" + }, + "cookie-signature": { + "version": "1.0.6", + "from": "cookie-signature@1.0.6", + "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" + }, + "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" + }, + "etag": { + "version": "1.7.0", + "from": "etag@~1.7.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", + "dependencies": { + "unpipe": { + "version": "1.0.0", + "from": "unpipe@~1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz" + } + } + }, + "fresh": { + "version": "0.3.0", + "from": "fresh@0.3.0", + "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" + }, + "methods": { + "version": "1.1.1", + "from": "methods@~1.1.1", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.1.tgz" + }, + "on-finished": { + "version": "2.3.0", + "from": "on-finished@~2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "dependencies": { + "ee-first": { + "version": "1.1.1", + "from": "ee-first@1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz" + } + } + }, + "parseurl": { + "version": "1.3.0", + "from": "parseurl@~1.3.0", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.0.tgz" + }, + "path-to-regexp": { + "version": "0.1.7", + "from": "path-to-regexp@0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz" + }, + "proxy-addr": { + "version": "1.0.8", + "from": "proxy-addr@~1.0.8", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-1.0.8.tgz", + "dependencies": { + "forwarded": { + "version": "0.1.0", + "from": "forwarded@~0.1.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.0.tgz" + }, + "ipaddr.js": { + "version": "1.0.1", + "from": "ipaddr.js@1.0.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.0.1.tgz" + } + } + }, + "qs": { + "version": "4.0.0", + "from": "qs@4.0.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-4.0.0.tgz" + }, + "range-parser": { + "version": "1.0.3", + "from": "range-parser@~1.0.2", + "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", + "dependencies": { + "destroy": { + "version": "1.0.3", + "from": "destroy@1.0.3", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.3.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" + } + } + }, + "serve-static": { + "version": "1.10.0", + "from": "serve-static@~1.10.0", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.10.0.tgz" + }, + "type-is": { + "version": "1.6.9", + "from": "type-is@~1.6.6", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.9.tgz", + "dependencies": { + "media-typer": { + "version": "0.3.0", + "from": "media-typer@0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz" + }, + "mime-types": { + "version": "2.1.7", + "from": "mime-types@~2.1.7", + "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" + } + } + } + } + }, + "utils-merge": { + "version": "1.0.0", + "from": "utils-merge@1.0.0", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.0.tgz" + }, + "vary": { + "version": "1.0.1", + "from": "vary@~1.0.1", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.0.1.tgz" + } + } + }, + "fastly-purge": { + "version": "1.0.1", + "from": "fastly-purge@~1.0.1" + }, + "log4js": { + "version": "0.6.25", + "from": "https://github.com/CartoDB/log4js-node/tarball/cdb", + "resolved": "https://github.com/CartoDB/log4js-node/tarball/cdb", + "dependencies": { + "async": { + "version": "0.2.10", + "from": "async@~0.2.0", + "resolved": "https://registry.npmjs.org/async/-/async-0.2.10.tgz" + }, + "readable-stream": { + "version": "1.0.33", + "from": "readable-stream@~1.0.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.33.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.0.1", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz" + } + } + }, + "semver": { + "version": "4.3.6", + "from": "semver@~4.3.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-4.3.6.tgz" + }, + "underscore": { + "version": "1.8.2", + "from": "underscore@1.8.2", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.8.2.tgz" + } + } + }, + "lru-cache": { + "version": "2.6.5", + "from": "lru-cache@2.6.5", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.6.5.tgz" + }, + "lzma": { + "version": "1.3.7", + "from": "lzma@~1.3.7", + "resolved": "https://registry.npmjs.org/lzma/-/lzma-1.3.7.tgz" + }, + "node-statsd": { + "version": "0.0.7", + "from": "node-statsd@~0.0.7", + "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", + "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", + "dependencies": { + "generic-pool": { + "version": "2.1.1", + "from": "generic-pool@~2.1.1", + "resolved": "https://registry.npmjs.org/generic-pool/-/generic-pool-2.1.1.tgz" + }, + "redis": { + "version": "0.12.1", + "from": "redis@~0.12.1", + "resolved": "https://registry.npmjs.org/redis/-/redis-0.12.1.tgz" + }, + "hiredis": { + "version": "0.1.17", + "from": "hiredis@~0.1.17", + "resolved": "https://registry.npmjs.org/hiredis/-/hiredis-0.1.17.tgz", + "dependencies": { + "bindings": { + "version": "1.2.1", + "from": "bindings@*", + "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.2.1.tgz" + }, + "nan": { + "version": "1.1.2", + "from": "nan@~1.1.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-1.1.2.tgz" + } + } + } + } + }, + "request": { + "version": "2.62.0", + "from": "request@~2.62.0", + "resolved": "https://registry.npmjs.org/request/-/request-2.62.0.tgz", + "dependencies": { + "bl": { + "version": "1.0.0", + "from": "bl@~1.0.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-1.0.0.tgz", + "dependencies": { + "readable-stream": { + "version": "2.0.4", + "from": "readable-stream@~2.0.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.0.4.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" + }, + "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.2", + "from": "util-deprecate@~1.0.1", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.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.5.0", + "from": "async@^1.4.0", + "resolved": "https://registry.npmjs.org/async/-/async-1.5.0.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.6", + "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.7", + "from": "node-uuid@~1.4.0", + "resolved": "https://registry.npmjs.org/node-uuid/-/node-uuid-1.4.7.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.1", + "from": "tunnel-agent@~0.4.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.4.1.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" + }, + "http-signature": { + "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.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.8.0", + "from": "oauth-sign@~0.8.0", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.0.tgz" + }, + "hawk": { + "version": "3.1.1", + "from": "hawk@~3.1.0", + "resolved": "https://registry.npmjs.org/hawk/-/hawk-3.1.1.tgz", + "dependencies": { + "hoek": { + "version": "2.16.3", + "from": "hoek@2.x.x", + "resolved": "https://registry.npmjs.org/hoek/-/hoek-2.16.3.tgz" + }, + "boom": { + "version": "2.10.1", + "from": "boom@^2.8.x", + "resolved": "https://registry.npmjs.org/boom/-/boom-2.10.1.tgz" + }, + "cryptiles": { + "version": "2.0.5", + "from": "cryptiles@2.x.x", + "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-2.0.5.tgz" + }, + "sntp": { + "version": "1.0.9", + "from": "sntp@1.x.x", + "resolved": "https://registry.npmjs.org/sntp/-/sntp-1.0.9.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" + }, + "stringstream": { + "version": "0.0.5", + "from": "stringstream@~0.0.4", + "resolved": "https://registry.npmjs.org/stringstream/-/stringstream-0.0.5.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.9.0", + "from": "commander@^2.8.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.9.0.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.3", + "from": "is-my-json-valid@^2.12.0", + "resolved": "https://registry.npmjs.org/is-my-json-valid/-/is-my-json-valid-2.12.3.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.1", + "from": "xtend@^4.0.0", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz" + } + } + } + } + } + } + }, + "step": { + "version": "0.0.6", + "from": "step@~0.0.6", + "resolved": "https://registry.npmjs.org/step/-/step-0.0.6.tgz" + }, + "step-profiler": { + "version": "0.2.1", + "from": "step-profiler@~0.2.1", + "resolved": "https://registry.npmjs.org/step-profiler/-/step-profiler-0.2.1.tgz" + }, + "underscore": { + "version": "1.6.0", + "from": "underscore@~1.6.0", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.6.0.tgz" + }, + "windshaft": { + "version": "1.5.1", + "from": "https://github.com/CartoDB/Windshaft/tarball/mapconfig-extension-histogram", + "resolved": "https://github.com/CartoDB/Windshaft/tarball/mapconfig-extension-histogram", + "dependencies": { + "mapnik": { + "version": "1.4.15-cdb5", + "from": "https://github.com/CartoDB/node-mapnik/tarball/1.4.15-cdb5", + "resolved": "https://github.com/CartoDB/node-mapnik/tarball/1.4.15-cdb5", + "dependencies": { + "nan": { + "version": "1.2.0", + "from": "nan@~1.2.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-1.2.0.tgz" + }, + "mapnik-vector-tile": { + "version": "0.5.5", + "from": "mapnik-vector-tile@0.5.5", + "resolved": "https://registry.npmjs.org/mapnik-vector-tile/-/mapnik-vector-tile-0.5.5.tgz" + }, + "node-pre-gyp": { + "version": "0.5.25", + "from": "node-pre-gyp@0.5.25", + "resolved": "https://registry.npmjs.org/node-pre-gyp/-/node-pre-gyp-0.5.25.tgz", + "dependencies": { + "nopt": { + "version": "3.0.1", + "from": "nopt@~3.0.1", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.1.tgz", + "dependencies": { + "abbrev": { + "version": "1.0.5", + "from": "abbrev@1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.0.5.tgz" + } + } + }, + "npmlog": { + "version": "0.1.1", + "from": "npmlog@~0.1.1", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-0.1.1.tgz", + "dependencies": { + "ansi": { + "version": "0.3.0", + "from": "ansi@~0.3.0", + "resolved": "https://registry.npmjs.org/ansi/-/ansi-0.3.0.tgz" + } + } + }, + "request": { + "version": "2.40.0", + "from": "request@2.x", + "resolved": "https://registry.npmjs.org/request/-/request-2.40.0.tgz", + "dependencies": { + "qs": { + "version": "1.0.2", + "from": "qs@~1.0.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-1.0.2.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", + "dependencies": { + "punycode": { + "version": "1.3.1", + "from": "punycode@>=0.2.0", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.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.5", + "from": "combined-stream@~0.0.4", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-0.0.5.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" + } + } + }, + "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" + } + } + }, + "tunnel-agent": { + "version": "0.4.0", + "from": "tunnel-agent@~0.4.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.4.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", + "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" + }, + "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.2", + "from": "ctype@0.5.2", + "resolved": "https://registry.npmjs.org/ctype/-/ctype-0.5.2.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.1.1", + "from": "hawk@1.1.1", + "resolved": "https://registry.npmjs.org/hawk/-/hawk-1.1.1.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" + }, + "stringstream": { + "version": "0.0.4", + "from": "stringstream@~0.0.4", + "resolved": "https://registry.npmjs.org/stringstream/-/stringstream-0.0.4.tgz" + } + } + }, + "semver": { + "version": "3.0.1", + "from": "semver@~3.0.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-3.0.1.tgz" + }, + "tar": { + "version": "1.0.1", + "from": "tar@~1.0.0", + "resolved": "https://registry.npmjs.org/tar/-/tar-1.0.1.tgz", + "dependencies": { + "block-stream": { + "version": "0.0.7", + "from": "block-stream@*", + "resolved": "https://registry.npmjs.org/block-stream/-/block-stream-0.0.7.tgz" + }, + "fstream": { + "version": "1.0.2", + "from": "fstream@^1.0.2", + "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.2.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" + } + } + }, + "inherits": { + "version": "2.0.1", + "from": "inherits@2", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz" + } + } + }, + "tar-pack": { + "version": "2.0.0", + "from": "tar-pack@~2.0.0", + "resolved": "https://registry.npmjs.org/tar-pack/-/tar-pack-2.0.0.tgz", + "dependencies": { + "uid-number": { + "version": "0.0.3", + "from": "uid-number@0.0.3", + "resolved": "https://registry.npmjs.org/uid-number/-/uid-number-0.0.3.tgz" + }, + "once": { + "version": "1.1.1", + "from": "once@~1.1.1", + "resolved": "https://registry.npmjs.org/once/-/once-1.1.1.tgz" + }, + "debug": { + "version": "0.7.4", + "from": "debug@~0.7.2", + "resolved": "https://registry.npmjs.org/debug/-/debug-0.7.4.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.0.2", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-3.0.2.tgz" + }, + "inherits": { + "version": "2.0.1", + "from": "inherits@2", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz" + } + } + }, + "tar": { + "version": "0.1.20", + "from": "tar@~0.1.17", + "resolved": "https://registry.npmjs.org/tar/-/tar-0.1.20.tgz", + "dependencies": { + "block-stream": { + "version": "0.0.7", + "from": "block-stream@*", + "resolved": "https://registry.npmjs.org/block-stream/-/block-stream-0.0.7.tgz" + }, + "inherits": { + "version": "2.0.1", + "from": "inherits@2", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz" + } + } + }, + "fstream-ignore": { + "version": "0.0.7", + "from": "fstream-ignore@0.0.7", + "resolved": "https://registry.npmjs.org/fstream-ignore/-/fstream-ignore-0.0.7.tgz", + "dependencies": { + "minimatch": { + "version": "0.2.14", + "from": "minimatch@~0.2.0", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-0.2.14.tgz", + "dependencies": { + "lru-cache": { + "version": "2.5.0", + "from": "lru-cache@2", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.5.0.tgz" + }, + "sigmund": { + "version": "1.0.0", + "from": "sigmund@~1.0.0", + "resolved": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.0.tgz" + } + } + }, + "inherits": { + "version": "2.0.1", + "from": "inherits@2", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz" + } + } + }, + "readable-stream": { + "version": "1.0.31", + "from": "readable-stream@~1.0.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.31.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.0.1", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz" + } + } + }, + "graceful-fs": { + "version": "1.2.3", + "from": "graceful-fs@1.2", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-1.2.3.tgz" + } + } + }, + "mkdirp": { + "version": "0.5.0", + "from": "mkdirp@~0.5.0", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.0.tgz", + "dependencies": { + "minimist": { + "version": "0.0.8", + "from": "minimist@0.0.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz" + } + } + }, + "rc": { + "version": "0.5.1", + "from": "rc@~0.5.0", + "resolved": "https://registry.npmjs.org/rc/-/rc-0.5.1.tgz", + "dependencies": { + "minimist": { + "version": "0.0.10", + "from": "minimist@~0.0.7", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.10.tgz" + }, + "deep-extend": { + "version": "0.2.11", + "from": "deep-extend@~0.2.5", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.2.11.tgz" + }, + "strip-json-comments": { + "version": "0.1.3", + "from": "strip-json-comments@0.1.x", + "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" + } + } + }, + "rimraf": { + "version": "2.2.8", + "from": "rimraf@~2.2.8", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.2.8.tgz" + } + } + } + } + }, + "grainstore": { + "version": "1.1.0", + "from": "grainstore@~1.1.0", + "dependencies": { + "carto": { + "version": "0.9.5-cdb2", + "from": "https://github.com/CartoDB/carto/tarball/0.9.5-cdb2", + "resolved": "https://github.com/CartoDB/carto/tarball/0.9.5-cdb2", + "dependencies": { + "underscore": { + "version": "1.4.4", + "from": "underscore@~1.4.3", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.4.4.tgz" + }, + "mapnik-reference": { + "version": "5.0.9", + "from": "mapnik-reference@~5.0.7", + "resolved": "https://registry.npmjs.org/mapnik-reference/-/mapnik-reference-5.0.9.tgz" + }, + "xml2js": { + "version": "0.2.8", + "from": "xml2js@~0.2.4", + "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.2.8.tgz", + "dependencies": { + "sax": { + "version": "0.5.8", + "from": "sax@0.5.x", + "resolved": "https://registry.npmjs.org/sax/-/sax-0.5.8.tgz" + } + } + }, + "optimist": { + "version": "0.6.1", + "from": "optimist@~0.6.0", + "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", + "dependencies": { + "wordwrap": { + "version": "0.0.3", + "from": "wordwrap@~0.0.2", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz" + }, + "minimist": { + "version": "0.0.10", + "from": "minimist@~0.0.1", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.10.tgz" + } + } + } + } + }, + "millstone": { + "version": "0.6.14", + "from": "millstone@0.6.14", + "resolved": "https://registry.npmjs.org/millstone/-/millstone-0.6.14.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" + } + } + }, + "srs": { + "version": "0.4.9", + "from": "srs@~0.4.1", + "resolved": "https://registry.npmjs.org/srs/-/srs-0.4.9.tgz", + "dependencies": { + "nan": { + "version": "1.8.4", + "from": "nan@~1.8.4", + "resolved": "https://registry.npmjs.org/nan/-/nan-1.8.4.tgz" + }, + "node-pre-gyp": { + "version": "0.6.9", + "from": "node-pre-gyp@>=0.6.7 <0.7.0", + "dependencies": { + "nopt": { + "version": "3.0.3", + "from": "nopt@~3.0.1", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.3.tgz", + "dependencies": { + "abbrev": { + "version": "1.0.7", + "from": "abbrev@1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.0.7.tgz" + } + } + }, + "npmlog": { + "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.0.1", + "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.60.0", + "from": "request@2.x", + "resolved": "https://registry.npmjs.org/request/-/request-2.60.0.tgz", + "dependencies": { + "bl": { + "version": "1.0.0", + "from": "bl@~1.0.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-1.0.0.tgz", + "dependencies": { + "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": { + "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", + "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.2", + "from": "process-nextick-args@~1.0.0", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.2.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" + } + } + } + } + }, + "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-rc2", + "from": "form-data@~1.0.0-rc1", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-1.0.0-rc2.tgz", + "dependencies": { + "async": { + "version": "1.4.0", + "from": "async@^1.2.1", + "resolved": "https://registry.npmjs.org/async/-/async-1.4.0.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.3", + "from": "mime-types@~2.1.2", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.3.tgz", + "dependencies": { + "mime-db": { + "version": "1.15.0", + "from": "mime-db@~1.15.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.15.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": "4.0.0", + "from": "qs@~4.0.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-4.0.0.tgz" + }, + "tunnel-agent": { + "version": "0.4.1", + "from": "tunnel-agent@~0.4.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.4.1.tgz" + }, + "tough-cookie": { + "version": "2.0.0", + "from": "tough-cookie@>=0.12.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.0.0.tgz" + }, + "http-signature": { + "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.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.8.0", + "from": "oauth-sign@~0.8.0", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.0.tgz" + }, + "hawk": { + "version": "3.1.0", + "from": "hawk@~3.1.0", + "resolved": "https://registry.npmjs.org/hawk/-/hawk-3.1.0.tgz", + "dependencies": { + "hoek": { + "version": "2.14.0", + "from": "hoek@2.x.x", + "resolved": "https://registry.npmjs.org/hoek/-/hoek-2.14.0.tgz" + }, + "boom": { + "version": "2.8.0", + "from": "boom@^2.8.x", + "resolved": "https://registry.npmjs.org/boom/-/boom-2.8.0.tgz" + }, + "cryptiles": { + "version": "2.0.4", + "from": "cryptiles@2.x.x", + "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-2.0.4.tgz" + }, + "sntp": { + "version": "1.0.9", + "from": "sntp@1.x.x", + "resolved": "https://registry.npmjs.org/sntp/-/sntp-1.0.9.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" + }, + "stringstream": { + "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.9.34", + "from": "bluebird@^2.9.30", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-2.9.34.tgz" + }, + "chalk": { + "version": "1.1.0", + "from": "chalk@^1.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.0.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.1", + "from": "is-my-json-valid@^2.12.0", + "resolved": "https://registry.npmjs.org/is-my-json-valid/-/is-my-json-valid-2.12.1.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": "1.1.0", + "from": "jsonpointer@^1.1.0", + "resolved": "https://registry.npmjs.org/jsonpointer/-/jsonpointer-1.1.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": "5.0.1", + "from": "semver@~5.0.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.0.1.tgz" + }, + "tar": { + "version": "2.1.1", + "from": "tar@~2.1.0", + "resolved": "https://registry.npmjs.org/tar/-/tar-2.1.1.tgz", + "dependencies": { + "block-stream": { + "version": "0.0.8", + "from": "block-stream@*", + "resolved": "https://registry.npmjs.org/block-stream/-/block-stream-0.0.8.tgz" + }, + "fstream": { + "version": "1.0.7", + "from": "fstream@^1.0.2", + "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.7.tgz", + "dependencies": { + "graceful-fs": { + "version": "3.0.8", + "from": "graceful-fs@3", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-3.0.8.tgz" + } + } + }, + "inherits": { + "version": "2.0.1", + "from": "inherits@2", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz" + } + } + }, + "tar-pack": { + "version": "2.0.0", + "from": "tar-pack@~2.0.0", + "resolved": "https://registry.npmjs.org/tar-pack/-/tar-pack-2.0.0.tgz", + "dependencies": { + "uid-number": { + "version": "0.0.3", + "from": "uid-number@0.0.3", + "resolved": "https://registry.npmjs.org/uid-number/-/uid-number-0.0.3.tgz" + }, + "once": { + "version": "1.1.1", + "from": "once@~1.1.1", + "resolved": "https://registry.npmjs.org/once/-/once-1.1.1.tgz" + }, + "debug": { + "version": "0.7.4", + "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.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.0.0", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz" + } + } + }, + "tar": { + "version": "0.1.20", + "from": "tar@~0.1.17", + "resolved": "https://registry.npmjs.org/tar/-/tar-0.1.20.tgz", + "dependencies": { + "block-stream": { + "version": "0.0.8", + "from": "block-stream@*", + "resolved": "https://registry.npmjs.org/block-stream/-/block-stream-0.0.8.tgz" + }, + "inherits": { + "version": "2.0.1", + "from": "inherits@2", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz" + } + } + }, + "fstream-ignore": { + "version": "0.0.7", + "from": "fstream-ignore@0.0.7", + "resolved": "https://registry.npmjs.org/fstream-ignore/-/fstream-ignore-0.0.7.tgz", + "dependencies": { + "minimatch": { + "version": "0.2.14", + "from": "minimatch@~0.2.0", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-0.2.14.tgz", + "dependencies": { + "lru-cache": { + "version": "2.6.5", + "from": "lru-cache@2", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.6.5.tgz" + }, + "sigmund": { + "version": "1.0.1", + "from": "sigmund@~1.0.0", + "resolved": "https://registry.npmjs.org/sigmund/-/sigmund-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" + } + } + }, + "readable-stream": { + "version": "1.0.33", + "from": "readable-stream@~1.0.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.33.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.0.1", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz" + } + } + }, + "graceful-fs": { + "version": "1.2.3", + "from": "graceful-fs@1.2", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-1.2.3.tgz" + } + } + }, + "mkdirp": { + "version": "0.5.1", + "from": "mkdirp@~0.5.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" + } + } + }, + "rc": { + "version": "1.1.0", + "from": "rc@~1.1.0", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.1.0.tgz", + "dependencies": { + "minimist": { + "version": "1.1.2", + "from": "minimist@^1.1.2", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.1.2.tgz" + }, + "deep-extend": { + "version": "0.2.11", + "from": "deep-extend@~0.2.5", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.2.11.tgz" + }, + "strip-json-comments": { + "version": "0.1.3", + "from": "strip-json-comments@0.1.x", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-0.1.3.tgz" + }, + "ini": { + "version": "1.3.4", + "from": "ini@~1.3.0", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.4.tgz" + } + } + }, + "rimraf": { + "version": "2.4.2", + "from": "rimraf@~2.4.0", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.4.2.tgz", + "dependencies": { + "glob": { + "version": "5.0.14", + "from": "glob@^5.0.14", + "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.14.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": "2.0.10", + "from": "minimatch@2.0.x", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-2.0.10.tgz", + "dependencies": { + "brace-expansion": { + "version": "1.1.0", + "from": "brace-expansion@^1.0.0", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.0.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" + } + } + } + } + } + } + } + } + }, + "zipfile": { + "version": "0.5.7", + "from": "zipfile@~0.5.2", + "resolved": "https://registry.npmjs.org/zipfile/-/zipfile-0.5.7.tgz", + "dependencies": { + "nan": { + "version": "1.5.3", + "from": "nan@~1.5.1", + "resolved": "https://registry.npmjs.org/nan/-/nan-1.5.3.tgz" + }, + "node-pre-gyp": { + "version": "0.6.2", + "from": "node-pre-gyp@>=0.6.2 <0.7.0", + "resolved": "https://registry.npmjs.org/node-pre-gyp/-/node-pre-gyp-0.6.2.tgz", + "dependencies": { + "nopt": { + "version": "3.0.1", + "from": "nopt@~3.0.1", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.1.tgz", + "dependencies": { + "abbrev": { + "version": "1.0.5", + "from": "abbrev@1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.0.5.tgz" + } + } + }, + "npmlog": { + "version": "0.1.1", + "from": "npmlog@~0.1.1", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-0.1.1.tgz", + "dependencies": { + "ansi": { + "version": "0.3.0", + "from": "ansi@~0.3.0", + "resolved": "https://registry.npmjs.org/ansi/-/ansi-0.3.0.tgz" + } + } + }, + "request": { + "version": "2.51.0", + "from": "request@2.x", + "resolved": "https://registry.npmjs.org/request/-/request-2.51.0.tgz", + "dependencies": { + "bl": { + "version": "0.9.3", + "from": "bl@~0.9.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-0.9.3.tgz", + "dependencies": { + "readable-stream": { + "version": "1.0.33", + "from": "readable-stream@~1.0.26", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.33.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.0.1", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz" + } + } + } + } + }, + "caseless": { + "version": "0.8.0", + "from": "caseless@~0.8.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.8.0.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" + }, + "form-data": { + "version": "0.2.0", + "from": "form-data@~0.2.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-0.2.0.tgz", + "dependencies": { + "async": { + "version": "0.9.0", + "from": "async@~0.9.0", + "resolved": "https://registry.npmjs.org/async/-/async-0.9.0.tgz" + }, + "mime-types": { + "version": "2.0.7", + "from": "mime-types@~2.0.3", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.0.7.tgz", + "dependencies": { + "mime-db": { + "version": "1.5.0", + "from": "mime-db@~1.5.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.5.0.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" + }, + "node-uuid": { + "version": "1.4.2", + "from": "node-uuid@~1.4.0", + "resolved": "https://registry.npmjs.org/node-uuid/-/node-uuid-1.4.2.tgz" + }, + "qs": { + "version": "2.3.3", + "from": "qs@~2.3.1", + "resolved": "https://registry.npmjs.org/qs/-/qs-2.3.3.tgz" + }, + "tunnel-agent": { + "version": "0.4.0", + "from": "tunnel-agent@~0.4.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.4.0.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", + "dependencies": { + "punycode": { + "version": "1.3.2", + "from": "punycode@>=0.2.0", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.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.5.0", + "from": "oauth-sign@~0.5.0", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.5.0.tgz" + }, + "hawk": { + "version": "1.1.1", + "from": "hawk@1.1.1", + "resolved": "https://registry.npmjs.org/hawk/-/hawk-1.1.1.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" + }, + "stringstream": { + "version": "0.0.4", + "from": "stringstream@~0.0.4", + "resolved": "https://registry.npmjs.org/stringstream/-/stringstream-0.0.4.tgz" + }, + "combined-stream": { + "version": "0.0.7", + "from": "combined-stream@~0.0.5", + "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" + } + } + } + } + }, + "semver": { + "version": "4.2.0", + "from": "semver@~4.2.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-4.2.0.tgz" + }, + "tar": { + "version": "1.0.3", + "from": "tar@~1.0.2", + "resolved": "https://registry.npmjs.org/tar/-/tar-1.0.3.tgz", + "dependencies": { + "block-stream": { + "version": "0.0.7", + "from": "block-stream@*", + "resolved": "https://registry.npmjs.org/block-stream/-/block-stream-0.0.7.tgz" + }, + "fstream": { + "version": "1.0.3", + "from": "fstream@^1.0.2", + "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.3.tgz", + "dependencies": { + "graceful-fs": { + "version": "3.0.5", + "from": "graceful-fs@3", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-3.0.5.tgz" + } + } + }, + "inherits": { + "version": "2.0.1", + "from": "inherits@2", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz" + } + } + }, + "tar-pack": { + "version": "2.0.0", + "from": "tar-pack@~2.0.0", + "resolved": "https://registry.npmjs.org/tar-pack/-/tar-pack-2.0.0.tgz", + "dependencies": { + "uid-number": { + "version": "0.0.3", + "from": "uid-number@0.0.3", + "resolved": "https://registry.npmjs.org/uid-number/-/uid-number-0.0.3.tgz" + }, + "once": { + "version": "1.1.1", + "from": "once@~1.1.1", + "resolved": "https://registry.npmjs.org/once/-/once-1.1.1.tgz" + }, + "debug": { + "version": "0.7.4", + "from": "debug@~0.7.2", + "resolved": "https://registry.npmjs.org/debug/-/debug-0.7.4.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.5", + "from": "graceful-fs@3", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-3.0.5.tgz" + }, + "inherits": { + "version": "2.0.1", + "from": "inherits@~2.0.0", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz" + } + } + }, + "tar": { + "version": "0.1.20", + "from": "tar@~0.1.17", + "resolved": "https://registry.npmjs.org/tar/-/tar-0.1.20.tgz", + "dependencies": { + "block-stream": { + "version": "0.0.7", + "from": "block-stream@*", + "resolved": "https://registry.npmjs.org/block-stream/-/block-stream-0.0.7.tgz" + }, + "inherits": { + "version": "2.0.1", + "from": "inherits@2", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz" + } + } + }, + "fstream-ignore": { + "version": "0.0.7", + "from": "fstream-ignore@0.0.7", + "resolved": "https://registry.npmjs.org/fstream-ignore/-/fstream-ignore-0.0.7.tgz", + "dependencies": { + "minimatch": { + "version": "0.2.14", + "from": "minimatch@~0.2.0", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-0.2.14.tgz", + "dependencies": { + "lru-cache": { + "version": "2.5.0", + "from": "lru-cache@2", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.5.0.tgz" + }, + "sigmund": { + "version": "1.0.0", + "from": "sigmund@~1.0.0", + "resolved": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.0.tgz" + } + } + }, + "inherits": { + "version": "2.0.1", + "from": "inherits@2", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz" + } + } + }, + "readable-stream": { + "version": "1.0.33", + "from": "readable-stream@~1.0.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.33.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.0.0", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz" + } + } + }, + "graceful-fs": { + "version": "1.2.3", + "from": "graceful-fs@1.2", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-1.2.3.tgz" + } + } + }, + "mkdirp": { + "version": "0.5.0", + "from": "mkdirp@~0.5.0", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.0.tgz", + "dependencies": { + "minimist": { + "version": "0.0.8", + "from": "minimist@0.0.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz" + } + } + }, + "rc": { + "version": "0.5.5", + "from": "rc@~0.5.1", + "resolved": "https://registry.npmjs.org/rc/-/rc-0.5.5.tgz", + "dependencies": { + "minimist": { + "version": "0.0.10", + "from": "minimist@~0.0.7", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.10.tgz" + }, + "deep-extend": { + "version": "0.2.11", + "from": "deep-extend@~0.2.5", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.2.11.tgz" + }, + "strip-json-comments": { + "version": "0.1.3", + "from": "strip-json-comments@0.1.x", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-0.1.3.tgz" + }, + "ini": { + "version": "1.3.2", + "from": "ini@~1.3.0", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.2.tgz" + } + } + }, + "rimraf": { + "version": "2.2.8", + "from": "rimraf@~2.2.8", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.2.8.tgz" + } + } + } + } + }, + "sqlite3": { + "version": "2.2.7", + "from": "sqlite3@2.x", + "resolved": "https://registry.npmjs.org/sqlite3/-/sqlite3-2.2.7.tgz", + "dependencies": { + "nan": { + "version": "1.1.2", + "from": "nan@1.1.2", + "resolved": "https://registry.npmjs.org/nan/-/nan-1.1.2.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", + "dependencies": { + "nopt": { + "version": "3.0.1", + "from": "nopt@~3.0.1", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.1.tgz", + "dependencies": { + "abbrev": { + "version": "1.0.5", + "from": "abbrev@1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.0.5.tgz" + } + } + }, + "npmlog": { + "version": "0.1.1", + "from": "npmlog@~0.1.1", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-0.1.1.tgz", + "dependencies": { + "ansi": { + "version": "0.3.0", + "from": "ansi@~0.3.0", + "resolved": "https://registry.npmjs.org/ansi/-/ansi-0.3.0.tgz" + } + } + }, + "request": { + "version": "2.39.0", + "from": "request@2.x", + "resolved": "https://registry.npmjs.org/request/-/request-2.39.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", + "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", + "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" + } + } + }, + "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" + } + } + }, + "tunnel-agent": { + "version": "0.4.0", + "from": "tunnel-agent@~0.4.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.4.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", + "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" + }, + "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.2", + "from": "ctype@0.5.2", + "resolved": "https://registry.npmjs.org/ctype/-/ctype-0.5.2.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.1.1", + "from": "hawk@1.1.1", + "resolved": "https://registry.npmjs.org/hawk/-/hawk-1.1.1.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" + }, + "stringstream": { + "version": "0.0.4", + "from": "stringstream@~0.0.4", + "resolved": "https://registry.npmjs.org/stringstream/-/stringstream-0.0.4.tgz" + } + } + }, + "semver": { + "version": "3.0.1", + "from": "semver@~3.0.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-3.0.1.tgz" + }, + "tar": { + "version": "1.0.0", + "from": "tar@~1.0.0", + "resolved": "https://registry.npmjs.org/tar/-/tar-1.0.0.tgz", + "dependencies": { + "block-stream": { + "version": "0.0.7", + "from": "block-stream@*", + "resolved": "https://registry.npmjs.org/block-stream/-/block-stream-0.0.7.tgz" + }, + "fstream": { + "version": "1.0.1", + "from": "fstream@^1.0.0", + "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.1.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" + } + } + }, + "inherits": { + "version": "2.0.1", + "from": "inherits@~2.0.1", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz" + } + } + }, + "tar-pack": { + "version": "2.0.0", + "from": "tar-pack@~2.0.0", + "resolved": "https://registry.npmjs.org/tar-pack/-/tar-pack-2.0.0.tgz", + "dependencies": { + "uid-number": { + "version": "0.0.3", + "from": "uid-number@0.0.3", + "resolved": "https://registry.npmjs.org/uid-number/-/uid-number-0.0.3.tgz" + }, + "once": { + "version": "1.1.1", + "from": "once@~1.1.1", + "resolved": "https://registry.npmjs.org/once/-/once-1.1.1.tgz" + }, + "debug": { + "version": "0.7.4", + "from": "debug@~0.7.2", + "resolved": "https://registry.npmjs.org/debug/-/debug-0.7.4.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" + }, + "inherits": { + "version": "2.0.1", + "from": "inherits@2", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz" + } + } + }, + "tar": { + "version": "0.1.20", + "from": "tar@~0.1.17", + "resolved": "https://registry.npmjs.org/tar/-/tar-0.1.20.tgz", + "dependencies": { + "block-stream": { + "version": "0.0.7", + "from": "block-stream@*", + "resolved": "https://registry.npmjs.org/block-stream/-/block-stream-0.0.7.tgz" + }, + "inherits": { + "version": "2.0.1", + "from": "inherits@2", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz" + } + } + }, + "fstream-ignore": { + "version": "0.0.7", + "from": "fstream-ignore@0.0.7", + "resolved": "https://registry.npmjs.org/fstream-ignore/-/fstream-ignore-0.0.7.tgz", + "dependencies": { + "minimatch": { + "version": "0.2.14", + "from": "minimatch@~0.2.0", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-0.2.14.tgz", + "dependencies": { + "lru-cache": { + "version": "2.5.0", + "from": "lru-cache@2", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.5.0.tgz" + }, + "sigmund": { + "version": "1.0.0", + "from": "sigmund@~1.0.0", + "resolved": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.0.tgz" + } + } + }, + "inherits": { + "version": "2.0.1", + "from": "inherits@2", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz" + } + } + }, + "readable-stream": { + "version": "1.0.27-1", + "from": "readable-stream@~1.0.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.27-1.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.25-1", + "from": "string_decoder@~0.10.x", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.25-1.tgz" + }, + "inherits": { + "version": "2.0.1", + "from": "inherits@2", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz" + } + } + }, + "graceful-fs": { + "version": "1.2.3", + "from": "graceful-fs@1.2", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-1.2.3.tgz" + } + } + }, + "mkdirp": { + "version": "0.5.0", + "from": "mkdirp@~0.5.0", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.0.tgz", + "dependencies": { + "minimist": { + "version": "0.0.8", + "from": "minimist@0.0.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz" + } + } + }, + "rc": { + "version": "0.5.0", + "from": "rc@~0.5.0", + "resolved": "https://registry.npmjs.org/rc/-/rc-0.5.0.tgz", + "dependencies": { + "minimist": { + "version": "0.0.10", + "from": "minimist@~0.0.7", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.10.tgz" + }, + "deep-extend": { + "version": "0.2.11", + "from": "deep-extend@~0.2.5", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.2.11.tgz" + }, + "strip-json-comments": { + "version": "0.1.3", + "from": "strip-json-comments@0.1.x", + "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" + } + } + }, + "rimraf": { + "version": "2.2.8", + "from": "rimraf@~2.2.8", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.2.8.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", + "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" + }, + "optimist": { + "version": "0.6.1", + "from": "optimist@~0.6.0", + "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", + "dependencies": { + "wordwrap": { + "version": "0.0.3", + "from": "wordwrap@~0.0.2", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz" + }, + "minimist": { + "version": "0.0.10", + "from": "minimist@~0.0.1", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.10.tgz" + } + } + } + } + } + } + }, + "tilelive": { + "version": "4.5.3", + "from": "tilelive@~4.5.3", + "resolved": "https://registry.npmjs.org/tilelive/-/tilelive-4.5.3.tgz", + "dependencies": { + "optimist": { + "version": "0.6.1", + "from": "optimist@~0.6.0", + "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", + "dependencies": { + "wordwrap": { + "version": "0.0.3", + "from": "wordwrap@~0.0.2", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz" + }, + "minimist": { + "version": "0.0.10", + "from": "minimist@~0.0.1", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.10.tgz" + } + } + } + } + }, + "tilelive-mapnik": { + "version": "0.6.15-cdb3", + "from": "https://github.com/CartoDB/tilelive-mapnik/tarball/0.6.15-cdb3", + "resolved": "https://github.com/CartoDB/tilelive-mapnik/tarball/0.6.15-cdb3", + "dependencies": { + "generic-pool": { + "version": "2.1.1", + "from": "generic-pool@~2.1.1", + "resolved": "https://registry.npmjs.org/generic-pool/-/generic-pool-2.1.1.tgz" + }, + "mime": { + "version": "1.2.11", + "from": "mime@~1.2.9", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.2.11.tgz" + } + } + }, + "tilelive-bridge": { + "version": "1.3.0-cdb3", + "from": "https://github.com/CartoDB/tilelive-bridge/tarball/1.3.0-cdb3", + "resolved": "https://github.com/CartoDB/tilelive-bridge/tarball/1.3.0-cdb3", + "dependencies": { + "mapnik-pool": { + "version": "0.1.1-cdb3", + "from": "https://github.com/CartoDB/mapnik-pool/tarball/0.1.1-cdb3", + "resolved": "https://github.com/CartoDB/mapnik-pool/tarball/0.1.1-cdb3", + "dependencies": { + "generic-pool": { + "version": "2.1.1", + "from": "generic-pool@~2.1.1", + "resolved": "https://registry.npmjs.org/generic-pool/-/generic-pool-2.1.1.tgz" + }, + "xtend": { + "version": "3.0.0", + "from": "xtend@~3.0.0", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-3.0.0.tgz" + } + } + } + } + }, + "canvas": { + "version": "1.2.7-cdb1", + "from": "https://github.com/CartoDB/node-canvas/tarball/1.2.7-cdb1", + "resolved": "https://github.com/CartoDB/node-canvas/tarball/1.2.7-cdb1", + "dependencies": { + "nan": { + "version": "1.9.0", + "from": "nan@^1.8.4", + "resolved": "https://registry.npmjs.org/nan/-/nan-1.9.0.tgz" + } + } + }, + "semver": { + "version": "5.0.3", + "from": "semver@~5.0.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.0.3.tgz" + }, + "carto": { + "version": "0.15.1-cdb1", + "from": "https://github.com/CartoDB/carto/tarball/0.15.1-cdb1", + "resolved": "https://github.com/CartoDB/carto/tarball/0.15.1-cdb1", + "dependencies": { + "mapnik-reference": { + "version": "6.0.5", + "from": "mapnik-reference@~6.0.2", + "resolved": "https://registry.npmjs.org/mapnik-reference/-/mapnik-reference-6.0.5.tgz" + }, + "optimist": { + "version": "0.6.1", + "from": "optimist@~0.6.0", + "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", + "dependencies": { + "wordwrap": { + "version": "0.0.3", + "from": "wordwrap@~0.0.2", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz" + }, + "minimist": { + "version": "0.0.10", + "from": "minimist@~0.0.1", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.10.tgz" + } + } + } + } + }, + "cartodb-psql": { + "version": "0.6.1", + "from": "cartodb-psql@~0.6.1", + "dependencies": { + "pg": { + "version": "2.6.2-cdb3", + "from": "pg@git://github.com/CartoDB/node-postgres.git#2.6.2-cdb3", + "resolved": "git://github.com/CartoDB/node-postgres.git#069c5296d1a093077feff21719641bb9e71fc50e", + "dependencies": { + "generic-pool": { + "version": "2.0.3", + "from": "generic-pool@2.0.3", + "resolved": "https://registry.npmjs.org/generic-pool/-/generic-pool-2.0.3.tgz" + }, + "buffer-writer": { + "version": "1.0.0", + "from": "buffer-writer@1.0.0", + "resolved": "https://registry.npmjs.org/buffer-writer/-/buffer-writer-1.0.0.tgz" + } + } + } + } + }, + "torque.js": { + "version": "2.11.4", + "from": "torque.js@~2.11.0" + }, + "abaculus": { + "version": "1.1.0-cdb3", + "from": "https://github.com/CartoDB/abaculus/tarball/1.1.0-cdb3", + "resolved": "https://github.com/CartoDB/abaculus/tarball/1.1.0-cdb3" + }, + "sphericalmercator": { + "version": "1.0.3", + "from": "sphericalmercator@1.0.3", + "resolved": "https://registry.npmjs.org/sphericalmercator/-/sphericalmercator-1.0.3.tgz" + } + } + } + } +} From 37ff13493ca4a896065be8ce29682b3adc5a60db Mon Sep 17 00:00:00 2001 From: Raul Ochoa Date: Mon, 16 Nov 2015 12:23:05 +0100 Subject: [PATCH 42/72] Use mapconfig-extension from windshaft --- npm-shrinkwrap.json | 6 +++--- package.json | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/npm-shrinkwrap.json b/npm-shrinkwrap.json index f9549fa5..c020ce4e 100644 --- a/npm-shrinkwrap.json +++ b/npm-shrinkwrap.json @@ -533,7 +533,7 @@ }, "inherits": { "version": "2.0.1", - "from": "inherits@~2.0.1", + "from": "inherits@2", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz" }, "isarray": { @@ -828,8 +828,8 @@ }, "windshaft": { "version": "1.5.1", - "from": "https://github.com/CartoDB/Windshaft/tarball/mapconfig-extension-histogram", - "resolved": "https://github.com/CartoDB/Windshaft/tarball/mapconfig-extension-histogram", + "from": "https://github.com/CartoDB/Windshaft/tarball/mapconfig-extension", + "resolved": "https://github.com/CartoDB/Windshaft/tarball/mapconfig-extension", "dependencies": { "mapnik": { "version": "1.4.15-cdb5", diff --git a/package.json b/package.json index 995d319a..f5a462a6 100644 --- a/package.json +++ b/package.json @@ -29,7 +29,7 @@ "node-statsd": "~0.0.7", "underscore" : "~1.6.0", "dot": "~1.0.2", - "windshaft": "https://github.com/CartoDB/Windshaft/tarball/mapconfig-extension-histogram", + "windshaft": "https://github.com/CartoDB/Windshaft/tarball/mapconfig-extension", "step": "~0.0.6", "queue-async": "~1.0.7", "request": "~2.62.0", From d9614cc1c558a3c0599b94a8f8de327ef6c8268e Mon Sep 17 00:00:00 2001 From: Raul Ochoa Date: Mon, 16 Nov 2015 13:15:01 +0100 Subject: [PATCH 43/72] Add search endpoint --- lib/cartodb/controllers/base.js | 4 +++- lib/cartodb/controllers/layergroup.js | 32 +++++++++++++++++++++++++++ 2 files changed, 35 insertions(+), 1 deletion(-) diff --git a/lib/cartodb/controllers/base.js b/lib/cartodb/controllers/base.js index 88a22c45..5a44500b 100644 --- a/lib/cartodb/controllers/base.js +++ b/lib/cartodb/controllers/base.js @@ -20,7 +20,9 @@ var REQUEST_QUERY_PARAMS_WHITELIST = [ 'bbox', // w,s,e,n 'bins', // number 'start', // number - 'end' // number + 'end', // number + // widgets search + 'q' ]; function BaseController(authApi, pgConnection) { diff --git a/lib/cartodb/controllers/layergroup.js b/lib/cartodb/controllers/layergroup.js index d5b1e05c..e1d56fb2 100644 --- a/lib/cartodb/controllers/layergroup.js +++ b/lib/cartodb/controllers/layergroup.js @@ -72,6 +72,10 @@ LayergroupController.prototype.register = function(app) { app.get(app.base_url_mapconfig + '/:token/:layer/widget/:widgetName', cors(), userMiddleware, this.widget.bind(this)); + + app.get(app.base_url_mapconfig + + '/:token/:layer/widget/:widgetName/search', cors(), userMiddleware, + this.widgetSearch.bind(this)); }; LayergroupController.prototype.widget = function(req, res) { @@ -102,6 +106,34 @@ LayergroupController.prototype.widget = function(req, res) { }; +LayergroupController.prototype.widgetSearch = function(req, res) { + var self = this; + + step( + function setupParams() { + self.req2params(req, this); + }, + function retrieveList(err) { + assert.ifError(err); + + var mapConfigProvider = new MapStoreMapConfigProvider( + self.mapStore, req.context.user, self.userLimitsApi, req.params + ); + self.widgetBackend.search(mapConfigProvider, req.params, this); + }, + function finish(err, tile, stats) { + req.profiler.add(stats || {}); + + if (err) { + self.sendError(req, res, err, 'GET WIDGET'); + } else { + self.sendResponse(req, res, tile, 200); + } + } + ); + +}; + LayergroupController.prototype.attributes = function(req, res) { var self = this; From 1de4753daa8d851a4b46d630c2cb8b76c160d0be Mon Sep 17 00:00:00 2001 From: Raul Ochoa Date: Mon, 16 Nov 2015 18:34:36 +0100 Subject: [PATCH 44/72] fix tests --- test/acceptance/widgets.js | 54 ++++++++++++++++++++------------------ 1 file changed, 29 insertions(+), 25 deletions(-) diff --git a/test/acceptance/widgets.js b/test/acceptance/widgets.js index 29ad1137..6c67bad5 100644 --- a/test/acceptance/widgets.js +++ b/test/acceptance/widgets.js @@ -76,10 +76,14 @@ describe('widgets', function() { var next = this; layergroupId = _layergroupId; - var url = '/api/v1/map/' + layergroupId + '/0/widget/' + widgetName; + var urlParams = { + own_filter: 1 + }; if (params && params.bbox) { - url += '?' + qs.stringify({bbox: params.bbox}); + urlParams.bbox = params.bbox; } + url = '/api/v1/map/' + layergroupId + '/0/widget/' + widgetName + '?' + qs.stringify(urlParams); + assert.response(server, { url: url, @@ -148,7 +152,7 @@ describe('widgets', function() { {name:"El Lacón"}, {name:"El Pico"} ]; - assert.deepEqual(JSON.parse(res.body).ownFilterOn.rows, expectedList); + assert.deepEqual(JSON.parse(res.body).rows, expectedList); done(); }); @@ -182,7 +186,7 @@ describe('widgets', function() { } var histogram = JSON.parse(res.body); - assert.ok(histogram.ownFilterOn.bins.length); + assert.ok(histogram.bins.length); done(); }); @@ -221,8 +225,8 @@ describe('widgets', function() { } var aggregation = JSON.parse(res.body); - assert.equal(aggregation.ownFilterOn.categories.length, 223); - assert.deepEqual(aggregation.ownFilterOn.categories[0], { count: 769, adm0_a3: 'USA' }); + assert.equal(aggregation.categories.length, 12); + assert.deepEqual(aggregation.categories[0], { value: 769, category: 'USA', agg: false }); done(); }); @@ -242,8 +246,8 @@ describe('widgets', function() { } var aggregation = JSON.parse(res.body); - assert.equal(aggregation.ownFilterOn.categories.length, 1); - assert.deepEqual(aggregation.ownFilterOn.categories[0], { count: 256, adm0_a3: 'CAN' }); + assert.equal(aggregation.categories.length, 1); + assert.deepEqual(aggregation.categories[0], { value: 256, category: 'CAN', agg: false }); done(); }); @@ -282,7 +286,7 @@ describe('widgets', function() { var histogram = JSON.parse(res.body); // notice min value assert.deepEqual( - histogram.ownFilterOn.bins[0], + histogram.bins[0], { bin:0, start:0, end:3567600, freq:7229, min:0, max:3917000 } ); @@ -307,13 +311,13 @@ describe('widgets', function() { var histogram = JSON.parse(res.body); // notice min value - assert.deepEqual(histogram.ownFilterOn.bins[0], { + assert.deepEqual(histogram.bins[0], { bin: 0, start: 4009000, - end: 7175700, - freq: 50, + end: 11925750, + freq: 75, min: 4009000, - max: 7297054 + max: 13485000 }); done(); @@ -369,11 +373,11 @@ describe('widgets', function() { var aggregation = JSON.parse(res.body); // first one would be CHN if reject filter wasn't applied - assert.deepEqual(aggregation.ownFilterOn.categories[0], {"count":769,"adm0_a3":"USA"}); + assert.deepEqual(aggregation.categories[0], { value: 769, category: "USA", agg: false }); // confirm 'CHN' was filtered out (reject) - assert.equal(aggregation.ownFilterOn.categories.reduce(function(sum, row) { - return sum + (row.adm0_a3 === 'CHN' ? 1 : 0); + assert.equal(aggregation.categories.reduce(function(sum, row) { + return sum + (row.category === 'CHN' ? 1 : 0); }, 0), 0); done(); @@ -399,11 +403,11 @@ describe('widgets', function() { var aggregation = JSON.parse(res.body); // first one would be CHN if reject filter wasn't applied - assert.deepEqual(aggregation.ownFilterOn.categories[0], { count: 4, adm0_a3: 'IND' }); + assert.deepEqual(aggregation.categories[0], { value: 4, category: 'IND', agg: false }); // confirm 'CHN' was filtered out (reject) - assert.equal(aggregation.ownFilterOn.categories.reduce(function(sum, row) { - return sum + (row.adm0_a3 === 'CHN' ? 1 : 0); + assert.equal(aggregation.categories.reduce(function(sum, row) { + return sum + (row.category === 'CHN' ? 1 : 0); }, 0), 0); done(); @@ -429,11 +433,11 @@ describe('widgets', function() { var aggregation = JSON.parse(res.body); // first one would be CHN if reject filter wasn't applied - assert.deepEqual(aggregation.ownFilterOn.categories[0], {"count":96,"adm0_a3":"RUS"}); + assert.deepEqual(aggregation.categories[0], { value: 96, category: "RUS", agg: false }); // confirm 'CHN' was filtered out (reject) - assert.equal(aggregation.ownFilterOn.categories.reduce(function(sum, row) { - return sum + (row.adm0_a3 === 'CHN' ? 1 : 0); + assert.equal(aggregation.categories.reduce(function(sum, row) { + return sum + (row.category === 'CHN' ? 1 : 0); }, 0), 0); done(); @@ -460,11 +464,11 @@ describe('widgets', function() { var aggregation = JSON.parse(res.body); // first one would be CHN if reject filter wasn't applied - assert.deepEqual(aggregation.ownFilterOn.categories[0], {"count":77,"adm0_a3":"TUR"}); + assert.deepEqual(aggregation.categories[0], { value: 77, category: "TUR", agg: false }); // confirm 'CHN' was filtered out (reject) - assert.equal(aggregation.ownFilterOn.categories.reduce(function(sum, row) { - return sum + (row.adm0_a3 === 'CHN' ? 1 : 0); + assert.equal(aggregation.categories.reduce(function(sum, row) { + return sum + (row.category === 'CHN' ? 1 : 0); }, 0), 0); done(); From 0a38549c5523ffdb354dafc40b3ced5cd94da68f Mon Sep 17 00:00:00 2001 From: Raul Ochoa Date: Mon, 23 Nov 2015 11:00:55 +0100 Subject: [PATCH 45/72] Regenerate npm-shrinkwrap.json --- npm-shrinkwrap.json | 56 ++++++++++++++++++++++----------------------- 1 file changed, 28 insertions(+), 28 deletions(-) diff --git a/npm-shrinkwrap.json b/npm-shrinkwrap.json index c020ce4e..f8eaf683 100644 --- a/npm-shrinkwrap.json +++ b/npm-shrinkwrap.json @@ -58,7 +58,7 @@ }, "qs": { "version": "5.1.0", - "from": "qs@5.1.0", + "from": "qs@~5.1.0", "resolved": "https://registry.npmjs.org/qs/-/qs-5.1.0.tgz" }, "raw-body": { @@ -68,14 +68,14 @@ "dependencies": { "unpipe": { "version": "1.0.0", - "from": "unpipe@1.0.0", + "from": "unpipe@~1.0.0", "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz" } } }, "type-is": { "version": "1.6.9", - "from": "type-is@~1.6.9", + "from": "type-is@~1.6.6", "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.9.tgz", "dependencies": { "media-typer": { @@ -359,7 +359,7 @@ }, "statuses": { "version": "1.2.1", - "from": "statuses@~1.2.1", + "from": "statuses@1", "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.2.1.tgz" } } @@ -425,9 +425,9 @@ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.33.tgz", "dependencies": { "core-util-is": { - "version": "1.0.1", + "version": "1.0.2", "from": "core-util-is@~1.0.0", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.1.tgz" + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz" }, "isarray": { "version": "0.0.1", @@ -527,9 +527,9 @@ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.0.4.tgz", "dependencies": { "core-util-is": { - "version": "1.0.1", + "version": "1.0.2", "from": "core-util-is@~1.0.0", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.1.tgz" + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz" }, "inherits": { "version": "2.0.1", @@ -594,7 +594,7 @@ }, "mime-types": { "version": "2.1.7", - "from": "mime-types@~2.1.6", + "from": "mime-types@~2.1.7", "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.7.tgz", "dependencies": { "mime-db": { @@ -652,9 +652,9 @@ "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.0.tgz" }, "hawk": { - "version": "3.1.1", + "version": "3.1.2", "from": "hawk@~3.1.0", - "resolved": "https://registry.npmjs.org/hawk/-/hawk-3.1.1.tgz", + "resolved": "https://registry.npmjs.org/hawk/-/hawk-3.1.2.tgz", "dependencies": { "hoek": { "version": "2.16.3", @@ -663,7 +663,7 @@ }, "boom": { "version": "2.10.1", - "from": "boom@^2.8.x", + "from": "boom@2.x.x", "resolved": "https://registry.npmjs.org/boom/-/boom-2.10.1.tgz" }, "cryptiles": { @@ -827,14 +827,14 @@ "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.6.0.tgz" }, "windshaft": { - "version": "1.5.1", + "version": "1.6.1", "from": "https://github.com/CartoDB/Windshaft/tarball/mapconfig-extension", "resolved": "https://github.com/CartoDB/Windshaft/tarball/mapconfig-extension", "dependencies": { "mapnik": { - "version": "1.4.15-cdb5", - "from": "https://github.com/CartoDB/node-mapnik/tarball/1.4.15-cdb5", - "resolved": "https://github.com/CartoDB/node-mapnik/tarball/1.4.15-cdb5", + "version": "1.4.15-cdb6", + "from": "https://github.com/CartoDB/node-mapnik/tarball/1.4.15-cdb6", + "resolved": "https://github.com/CartoDB/node-mapnik/tarball/1.4.15-cdb6", "dependencies": { "nan": { "version": "1.2.0", @@ -2995,9 +2995,9 @@ } }, "tilelive-mapnik": { - "version": "0.6.15-cdb3", - "from": "https://github.com/CartoDB/tilelive-mapnik/tarball/0.6.15-cdb3", - "resolved": "https://github.com/CartoDB/tilelive-mapnik/tarball/0.6.15-cdb3", + "version": "0.6.15-cdb5", + "from": "https://github.com/CartoDB/tilelive-mapnik/tarball/0.6.15-cdb5", + "resolved": "https://github.com/CartoDB/tilelive-mapnik/tarball/0.6.15-cdb5", "dependencies": { "generic-pool": { "version": "2.1.1", @@ -3012,14 +3012,14 @@ } }, "tilelive-bridge": { - "version": "1.3.0-cdb3", - "from": "https://github.com/CartoDB/tilelive-bridge/tarball/1.3.0-cdb3", - "resolved": "https://github.com/CartoDB/tilelive-bridge/tarball/1.3.0-cdb3", + "version": "1.3.0-cdb4", + "from": "https://github.com/CartoDB/tilelive-bridge/tarball/1.3.0-cdb4", + "resolved": "https://github.com/CartoDB/tilelive-bridge/tarball/1.3.0-cdb4", "dependencies": { "mapnik-pool": { - "version": "0.1.1-cdb3", - "from": "https://github.com/CartoDB/mapnik-pool/tarball/0.1.1-cdb3", - "resolved": "https://github.com/CartoDB/mapnik-pool/tarball/0.1.1-cdb3", + "version": "0.1.1-cdb4", + "from": "https://github.com/CartoDB/mapnik-pool/tarball/0.1.1-cdb4", + "resolved": "https://github.com/CartoDB/mapnik-pool/tarball/0.1.1-cdb4", "dependencies": { "generic-pool": { "version": "2.1.1", @@ -3109,9 +3109,9 @@ "from": "torque.js@~2.11.0" }, "abaculus": { - "version": "1.1.0-cdb3", - "from": "https://github.com/CartoDB/abaculus/tarball/1.1.0-cdb3", - "resolved": "https://github.com/CartoDB/abaculus/tarball/1.1.0-cdb3" + "version": "1.1.0-cdb4", + "from": "https://github.com/CartoDB/abaculus/tarball/1.1.0-cdb4", + "resolved": "https://github.com/CartoDB/abaculus/tarball/1.1.0-cdb4" }, "sphericalmercator": { "version": "1.0.3", From 7d2f543284098b505193a1d38bed865cf0088e85 Mon Sep 17 00:00:00 2001 From: Raul Ochoa Date: Wed, 2 Dec 2015 18:50:11 +0100 Subject: [PATCH 46/72] Allow column_type query string param --- lib/cartodb/controllers/base.js | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/cartodb/controllers/base.js b/lib/cartodb/controllers/base.js index 5a44500b..ac3ac11c 100644 --- a/lib/cartodb/controllers/base.js +++ b/lib/cartodb/controllers/base.js @@ -21,6 +21,7 @@ var REQUEST_QUERY_PARAMS_WHITELIST = [ 'bins', // number 'start', // number 'end', // number + 'column_type', // string // widgets search 'q' ]; From 76cbc2f863e270ec310bd551d0846d97167bc503 Mon Sep 17 00:00:00 2001 From: Raul Ochoa Date: Wed, 30 Dec 2015 17:44:49 +0100 Subject: [PATCH 47/72] Improve PgQueryRunner public run method Last param is callback function, receiving err + result, no need to keep passing two functions, the query handler and the final callback. It should be easier to understand now as query handler was in a position where it had to know about receiving a callback, that was exposing an implementation detail of PgQueryRunner. --- lib/cartodb/api/query_tables_api.js | 86 +++++++++++-------------- lib/cartodb/api/tables_extent_api.js | 28 ++++---- lib/cartodb/backends/pg_query_runner.js | 13 ++-- test/acceptance/multilayer_server.js | 8 +-- 4 files changed, 65 insertions(+), 70 deletions(-) diff --git a/lib/cartodb/api/query_tables_api.js b/lib/cartodb/api/query_tables_api.js index f7667bfe..af2fc978 100644 --- a/lib/cartodb/api/query_tables_api.js +++ b/lib/cartodb/api/query_tables_api.js @@ -13,26 +13,22 @@ module.exports = QueryTablesApi; QueryTablesApi.prototype.getAffectedTablesInQuery = function (username, sql, callback) { - var query = 'SELECT CDB_QueryTablesText($windshaft$' + prepareSql(sql) + '$windshaft$)'; - this.pgQueryRunner.run(username, query, handleAffectedTablesInQueryRows, callback); + this.pgQueryRunner.run(username, query, function handleAffectedTablesInQueryRows (err, rows) { + if (err){ + var msg = err.message ? err.message : err; + callback(new Error('could not fetch source tables: ' + msg)); + return; + } + + // This is an Array, so no need to split into parts + var tableNames = rows[0].cdb_querytablestext; + return callback(null, tableNames); + }); }; -function handleAffectedTablesInQueryRows(err, rows, callback) { - if (err){ - var msg = err.message ? err.message : err; - callback(new Error('could not fetch source tables: ' + msg)); - return; - } - - // This is an Array, so no need to split into parts - var tableNames = rows[0].cdb_querytablestext; - callback(null, tableNames); -} - QueryTablesApi.prototype.getAffectedTablesAndLastUpdatedTime = function (username, sql, callback) { - var query = [ 'WITH querytables AS (', 'SELECT * FROM CDB_QueryTablesText($windshaft$' + prepareSql(sql) + '$windshaft$) as tablenames', @@ -42,28 +38,26 @@ QueryTablesApi.prototype.getAffectedTablesAndLastUpdatedTime = function (usernam 'WHERE m.tabname = any ((SELECT tablenames from querytables)::regclass[])' ].join(' '); - this.pgQueryRunner.run(username, query, handleAffectedTablesAndLastUpdatedTimeRows, callback); -}; + this.pgQueryRunner.run(username, query, function handleAffectedTablesAndLastUpdatedTimeRows (err, rows) { + if (err || rows.length === 0) { + var msg = err.message ? err.message : err; + callback(new Error('could not fetch affected tables or last updated time: ' + msg)); + return; + } -function handleAffectedTablesAndLastUpdatedTimeRows(err, rows, callback) { - if (err || rows.length === 0) { - var msg = err.message ? err.message : err; - callback(new Error('could not fetch affected tables or last updated time: ' + msg)); - return; - } + var result = rows[0]; - var result = rows[0]; + // This is an Array, so no need to split into parts + var tableNames = result.tablenames; - // This is an Array, so no need to split into parts - var tableNames = result.tablenames; + var lastUpdatedTime = result.max || 0; - var lastUpdatedTime = result.max || 0; - - callback(null, { - affectedTables: tableNames, - lastUpdatedTime: lastUpdatedTime * 1000 + callback(null, { + affectedTables: tableNames, + lastUpdatedTime: lastUpdatedTime * 1000 + }); }); -} +}; QueryTablesApi.prototype.getLastUpdatedTime = function (username, tableNames, callback) { if (!Array.isArray(tableNames) || tableNames.length === 0) { @@ -77,23 +71,21 @@ QueryTablesApi.prototype.getLastUpdatedTime = function (username, tableNames, ca '])' ].join(' '); - this.pgQueryRunner.run(username, query, handleLastUpdatedTimeRows, callback); + this.pgQueryRunner.run(username, query, function handleLastUpdatedTimeRows (err, rows) { + if (err) { + var msg = err.message ? err.message : err; + return callback(new Error('could not fetch affected tables or last updated time: ' + msg)); + } + // when the table has not updated_at means it hasn't been changed so a default last_updated is set + var lastUpdated = 0; + if (rows.length !== 0) { + lastUpdated = rows[0].max || 0; + } + + return callback(null, lastUpdated*1000); + }); }; -function handleLastUpdatedTimeRows(err, rows, callback) { - if (err) { - var msg = err.message ? err.message : err; - return callback(new Error('could not fetch affected tables or last updated time: ' + msg)); - } - // when the table has not updated_at means it hasn't been changed so a default last_updated is set - var lastUpdated = 0; - if (rows.length !== 0) { - lastUpdated = rows[0].max || 0; - } - - return callback(null, lastUpdated*1000); -} - function prepareSql(sql) { return sql .replace(affectedTableRegexCache.bbox, 'ST_MakeEnvelope(0,0,0,0)') diff --git a/lib/cartodb/api/tables_extent_api.js b/lib/cartodb/api/tables_extent_api.js index a6e45c2a..d4293ed7 100644 --- a/lib/cartodb/api/tables_extent_api.js +++ b/lib/cartodb/api/tables_extent_api.js @@ -35,19 +35,17 @@ TablesExtentApi.prototype.getBounds = function (username, tableNames, callback) "FROM ext" ].join(' '); - this.pgQueryRunner.run(username, query, handleBoundsResult, callback); + this.pgQueryRunner.run(username, query, function handleBoundsResult (err, rows) { + if (err) { + var msg = err.message ? err.message : err; + return callback(new Error('could not fetch source tables: ' + msg)); + } + var result = null; + if (rows.length > 0) { + result = { + bounds: rows[0] + }; + } + callback(null, result); + }); }; - -function handleBoundsResult(err, rows, callback) { - if (err) { - var msg = err.message ? err.message : err; - return callback(new Error('could not fetch source tables: ' + msg)); - } - var result = null; - if (rows.length > 0) { - result = { - bounds: rows[0] - }; - } - callback(null, result); -} diff --git a/lib/cartodb/backends/pg_query_runner.js b/lib/cartodb/backends/pg_query_runner.js index 0ba40c3e..bf57f166 100644 --- a/lib/cartodb/backends/pg_query_runner.js +++ b/lib/cartodb/backends/pg_query_runner.js @@ -8,8 +8,14 @@ function PgQueryRunner(pgConnection) { module.exports = PgQueryRunner; - -PgQueryRunner.prototype.run = function(username, query, queryHandler, callback) { +/** + * Runs `query` with `username`'s PostgreSQL role, callback receives error and rows array. + * + * @param {String} username + * @param {String} query + * @param {Function} callback function({Error}, {Array}) second argument is guaranteed to be an array + */ +PgQueryRunner.prototype.run = function(username, query, callback) { var self = this; var params = {}; @@ -33,8 +39,7 @@ PgQueryRunner.prototype.run = function(username, query, queryHandler, callback) }); psql.query(query, function(err, resultSet) { resultSet = resultSet || {}; - var rows = resultSet.rows || []; - queryHandler(err, rows, callback); + return callback(err, resultSet.rows || []); }); } ); diff --git a/test/acceptance/multilayer_server.js b/test/acceptance/multilayer_server.js index ab7686ef..e43070f1 100644 --- a/test/acceptance/multilayer_server.js +++ b/test/acceptance/multilayer_server.js @@ -310,8 +310,8 @@ describe('tests from old api translated to multilayer', function() { it("creates layergroup fails when postgresql queries fail to figure affected tables in query", function(done) { var runQueryFn = PgQueryRunner.prototype.run; - PgQueryRunner.prototype.run = function(username, query, queryHandler, callback) { - return queryHandler(new Error('fake error message'), [], callback); + PgQueryRunner.prototype.run = function(username, query, callback) { + return callback(new Error('fake error message'), []); }; var layergroup = singleLayergroupConfig('select * from gadm4', '#gadm4 { marker-fill: red; }'); @@ -365,8 +365,8 @@ describe('tests from old api translated to multilayer', function() { keysToDelete['user:localhost:mapviews:global'] = 5; var runQueryFn = PgQueryRunner.prototype.run; - PgQueryRunner.prototype.run = function(username, query, queryHandler, callback) { - return queryHandler(new Error('failed to query database for affected tables'), [], callback); + PgQueryRunner.prototype.run = function(username, query, callback) { + return callback(new Error('failed to query database for affected tables'), []); }; // reset internal cacheChannel cache From c664d5392c5cf04a923554517515f8a31c329554 Mon Sep 17 00:00:00 2001 From: Raul Ochoa Date: Wed, 30 Dec 2015 17:48:00 +0100 Subject: [PATCH 48/72] Adds some tests about how to use PgQueryRunner isolated --- test/integration/pg-query-runner.js | 46 +++++++++++++++++++++++++++++ 1 file changed, 46 insertions(+) create mode 100644 test/integration/pg-query-runner.js diff --git a/test/integration/pg-query-runner.js b/test/integration/pg-query-runner.js new file mode 100644 index 00000000..9cb9fcbe --- /dev/null +++ b/test/integration/pg-query-runner.js @@ -0,0 +1,46 @@ +require('../support/test_helper'); + +var assert = require('assert'); + +var RedisPool = require('redis-mpool'); +var cartodbRedis = require('cartodb-redis'); + +var PgConnection = require('../../lib/cartodb/backends/pg_connection'); +var PgQueryRunner = require('../../lib/cartodb/backends/pg_query_runner'); + + +describe('PgQueryRunner', function() { + + var queryRunner; + + before(function() { + var redisPool = new RedisPool(global.environment.redis); + var metadataBackend = cartodbRedis({pool: redisPool}); + var pgConnection = new PgConnection(metadataBackend); + queryRunner = new PgQueryRunner(pgConnection); + }); + + it('should work for happy case', function(done) { + var query = 'select cartodb_id from test_table limit 3'; + queryRunner.run('localhost', query, function(err, result) { + assert.ok(!err, err); + + assert.ok(Array.isArray(result)); + assert.equal(result.length, 3); + + done(); + }); + }); + + it('should receive rows array even on error', function(done) { + var query = 'select __error___ from test_table'; + queryRunner.run('localhost', query, function(err, result) { + assert.ok(err); + + assert.ok(Array.isArray(result)); + assert.equal(result.length, 0); + + done(); + }); + }); +}); From 74898e4261f22edb1b6cfff8a4a8f7c0ae161aa9 Mon Sep 17 00:00:00 2001 From: Raul Ochoa Date: Wed, 30 Dec 2015 17:48:24 +0100 Subject: [PATCH 49/72] Integration tests for QueryTablesApi Again this is more about how it would be possible to use it isolated. --- test/integration/query-tables-api.js | 55 ++++++++++++++++++++++++++++ 1 file changed, 55 insertions(+) create mode 100644 test/integration/query-tables-api.js diff --git a/test/integration/query-tables-api.js b/test/integration/query-tables-api.js new file mode 100644 index 00000000..d05b1ed0 --- /dev/null +++ b/test/integration/query-tables-api.js @@ -0,0 +1,55 @@ +require('../support/test_helper'); + +var assert = require('assert'); + +var RedisPool = require('redis-mpool'); +var cartodbRedis = require('cartodb-redis'); + +var PgConnection = require('../../lib/cartodb/backends/pg_connection'); +var PgQueryRunner = require('../../lib/cartodb/backends/pg_query_runner'); +var QueryTablesApi = require('../../lib/cartodb/api/query_tables_api'); + + +describe('QueryTablesApi', function() { + + var queryTablesApi; + + before(function() { + var redisPool = new RedisPool(global.environment.redis); + var metadataBackend = cartodbRedis({pool: redisPool}); + var pgConnection = new PgConnection(metadataBackend); + var pgQueryRunner = new PgQueryRunner(pgConnection); + queryTablesApi = new QueryTablesApi(pgQueryRunner); + }); + + // Check test/support/sql/windshaft.test.sql to understand where the values come from. + + it('should return an object with affected tables array and last updated time', function(done) { + var query = 'select * from test_table'; + queryTablesApi.getAffectedTablesAndLastUpdatedTime('localhost', query, function(err, result) { + assert.ok(!err, err); + + assert.deepEqual(result, { + affectedTables: [ 'public.test_table' ], + lastUpdatedTime: 1234567890123 + }); + + done(); + }); + }); + + it('should work with private tables', function(done) { + var query = 'select * from test_table_private_1'; + queryTablesApi.getAffectedTablesAndLastUpdatedTime('localhost', query, function(err, result) { + assert.ok(!err, err); + + assert.deepEqual(result, { + affectedTables: [ 'public.test_table_private_1' ], + lastUpdatedTime: 1234567890123 + }); + + done(); + }); + }); + +}); From 6f7bbe4ff521c233432e54ee50a7793183302047 Mon Sep 17 00:00:00 2001 From: Paul Norman Date: Wed, 30 Dec 2015 17:19:41 -0800 Subject: [PATCH 50/72] Move install instructions to their own file --- INSTALL.md | 43 +++++++++++++++++++++++++++++++++++++++++++ README.md | 44 +++----------------------------------------- 2 files changed, 46 insertions(+), 41 deletions(-) create mode 100644 INSTALL.md diff --git a/INSTALL.md b/INSTALL.md new file mode 100644 index 00000000..2c6ed15e --- /dev/null +++ b/INSTALL.md @@ -0,0 +1,43 @@ +# Installing Windshaft-CartoDB # + +## Requirements ## +Make sure that you have the requirements needed. These are + +- Core + - Node.js >=0.8 + - npm >=1.2.1 <2.0.0 + - PostgreSQL >8.3.x, PostGIS >1.5.x + - Redis >2.4.0 (http://www.redis.io) + - Mapnik 2.0.1, 2.0.2, 2.1.0, 2.2.0, 2.3.0. See [Installing Mapnik](https://github.com/CartoDB/Windshaft#installing-mapnik). + - Windshaft: check [Windshaft dependencies and installation notes](https://github.com/CartoDB/Windshaft#dependencies) + - libcairo2-dev, libpango1.0-dev, libjpeg8-dev and libgif-dev for server side canvas support + +- For cache control (optional) + - CartoDB 0.9.5+ (for `CDB_QueryTables`) + - Varnish (http://www.varnish-cache.org) + +- For running the testsuite + - ImageMagick (http://www.imagemagick.org) + + +Dependencies installation example: + + ```shell + sudo add-apt-repository -y ppa:cartodb/cairo + sudo apt-get update + sudo apt-get install -y build-essential checkinstall pkg-config libcairo2-dev libjpeg8-dev libgif-dev + ``` + +## Build/install ## + +To fetch and build all node-based dependencies, run: + +``` +npm install +``` + +Note that the ```npm install``` step will populate the node_modules/ +directory with modules, some of which being compiled on demand. If you +happen to have startup errors you may need to force rebuilding those +modules. At any time just wipe out the node_modules/ directory and run +```npm install``` again. diff --git a/README.md b/README.md index 891050db..88d4b897 100644 --- a/README.md +++ b/README.md @@ -13,32 +13,9 @@ This is the [CartoDB Maps API](http://docs.cartodb.com/cartodb-platform/maps-api * provides a link to varnish high speed cache * provides a [template maps API](https://github.com/CartoDB/Windshaft-cartodb/blob/master/docs/Template-maps.md) -Requirements ------------- - - Core - - Node.js >=0.8 - - npm >=1.2.1 <2.0.0 - - PostgreSQL >8.3.x, PostGIS >1.5.x - - Redis >2.4.0 (http://www.redis.io) - - Mapnik 2.0.1, 2.0.2, 2.1.0, 2.2.0, 2.3.0. See [Installing Mapnik](https://github.com/CartoDB/Windshaft#installing-mapnik). - - Windshaft: check [Windshaft dependencies and installation notes](https://github.com/CartoDB/Windshaft#dependencies) - - libcairo2-dev, libpango1.0-dev, libjpeg8-dev and libgif-dev for server side canvas support - -- For cache control (optional) - - CartoDB 0.9.5+ (for `CDB_QueryTables`) - - Varnish (http://www.varnish-cache.org) - -- For running the testsuite - - ImageMagick (http://www.imagemagick.org) - -Dependencies installation example: - -```shell -sudo add-apt-repository -y ppa:cartodb/cairo -sudo apt-get update -sudo apt-get install -y build-essential checkinstall pkg-config libcairo2-dev libjpeg8-dev libgif-dev -``` - +Install +------- +See [INSTALL.md](INSTALL.md) for detailed installation instructions. Configure --------- @@ -49,21 +26,6 @@ see ```./configure --help``` to see available options. Look at lib/cartodb/server_options.js for more on config -Build/install -------------- - -To fetch and build all node-based dependencies, run: - -``` -npm install -``` - -Note that the ```npm install``` step will populate the node_modules/ -directory with modules, some of which being compiled on demand. If you -happen to have startup errors you may need to force rebuilding those -modules. At any time just wipe out the node_modules/ directory and run -```npm install``` again. - Upgrading --------- From 7ed96ef0bbddd1b99a361350d97ba4f834ae65e2 Mon Sep 17 00:00:00 2001 From: Paul Norman Date: Wed, 30 Dec 2015 23:37:12 -0800 Subject: [PATCH 51/72] Add a list of packages and postgres instructions --- INSTALL.md | 26 ++++++++++++++++++++------ 1 file changed, 20 insertions(+), 6 deletions(-) diff --git a/INSTALL.md b/INSTALL.md index 2c6ed15e..cfb6cfc4 100644 --- a/INSTALL.md +++ b/INSTALL.md @@ -20,13 +20,27 @@ Make sure that you have the requirements needed. These are - ImageMagick (http://www.imagemagick.org) -Dependencies installation example: +On Ubuntu 14.04 the dependencies can be installed with - ```shell - sudo add-apt-repository -y ppa:cartodb/cairo - sudo apt-get update - sudo apt-get install -y build-essential checkinstall pkg-config libcairo2-dev libjpeg8-dev libgif-dev - ``` +```shell +sudo apt-get update +sudo apt-get install -y make g++ pkg-config git-core \ + libgif-dev libjpeg-dev libcairo2-dev \ + libhiredis-dev redis-server \ + nodejs nodejs-legacy npm \ + postgresql-9.3-postgis-2.1 postgresql-plpython-9.3 postgresql-server-dev-9.3 +``` + +On Ubuntu 12.04 the [cartodb/cairo PPA](https://launchpad.net/~cartodb/+archive/ubuntu/cairo) may be useful. + +## PostGIS setup ## + +A `template_postgis` database is expected. One can be set up with + +```shell +createdb --owner postgres --template template0 template_postgis +psql -d template_postgis -c 'CREATE EXTENSION postgis;' +``` ## Build/install ## From 67e921017c58a3c86d2851cfda6b411e51631e1f Mon Sep 17 00:00:00 2001 From: csobier Date: Wed, 6 Jan 2016 08:44:53 -0500 Subject: [PATCH 52/72] added limit amount regarding named maps --- docs/Map-API.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docs/Map-API.md b/docs/Map-API.md index 75f20301..2bb335e9 100644 --- a/docs/Map-API.md +++ b/docs/Map-API.md @@ -352,6 +352,8 @@ 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. + ### Create #### Definition From 8203c878f41b61414618717b6ce4ef3632fecd54 Mon Sep 17 00:00:00 2001 From: Raul Ochoa Date: Tue, 12 Jan 2016 15:53:16 +0100 Subject: [PATCH 53/72] Send 409 error code when maximum number of templates limit is reached Closes #346 --- lib/cartodb/backends/template_maps.js | 6 +- test/integration/template-maps-limits.js | 78 ++++++++++++++++++++++++ 2 files changed, 82 insertions(+), 2 deletions(-) create mode 100644 test/integration/template-maps-limits.js diff --git a/lib/cartodb/backends/template_maps.js b/lib/cartodb/backends/template_maps.js index 680cfe3a..c30b964c 100644 --- a/lib/cartodb/backends/template_maps.js +++ b/lib/cartodb/backends/template_maps.js @@ -224,8 +224,10 @@ o.addTemplate = function(owner, template, callback) { function installTemplateIfDoesNotExist(err, numberOfTemplates) { assert.ifError(err); if ( limit && numberOfTemplates >= limit ) { - throw new Error("User '" + owner + "' reached limit on number of templates " + - "("+ numberOfTemplates + "/" + limit + ")"); + var limitReachedError = new Error("User '" + owner + "' reached limit on number of templates (" + + numberOfTemplates + "/" + limit + ")"); + limitReachedError.http_status = 409; + throw limitReachedError; } self._redisCmd('HSETNX', [ userTemplatesKey, templateName, JSON.stringify(template) ], this); }, diff --git a/test/integration/template-maps-limits.js b/test/integration/template-maps-limits.js new file mode 100644 index 00000000..12150c68 --- /dev/null +++ b/test/integration/template-maps-limits.js @@ -0,0 +1,78 @@ +require('../support/test_helper'); + +var assert = require('assert'); +var redis = require('redis'); +var RedisPool = require('redis-mpool'); +var TemplateMaps = require('../../lib/cartodb/backends/template_maps'); + + +describe('TemplateMaps limits', function() { + + var OWNER = 'username'; + var templateCounter = 0; + function templateUniqueName() { + return 'tpl_' + templateCounter++; + } + function createTemplate() { + return { + version: '0.0.1', + name: templateUniqueName(), + layergroup: { + layers: [ + { + type: 'plain', + options: { + color: 'blue' + } + } + ] + } + }; + } + + var redisClient = redis.createClient(global.environment.redis.port); + var redisPool = new RedisPool(global.environment.redis); + + afterEach(function(done) { + redisClient.del('map_tpl|' + OWNER, done); + }); + + it('should allow to create templates when there is no limit in options', function(done) { + var templateMaps = new TemplateMaps(redisPool); + + templateMaps.addTemplate(OWNER, createTemplate(), function(err, templateName, template) { + assert.ok(!err, err); + assert.ok(template); + + templateMaps.addTemplate(OWNER, createTemplate(), function(err, templateName, template) { + assert.ok(!err, err); + assert.ok(template); + done(); + }); + }); + }); + + it('should allow to create templates with limit in options', function(done) { + var templateMaps = new TemplateMaps(redisPool, {max_user_templates: 1}); + + templateMaps.addTemplate(OWNER, createTemplate(), function(err, templateName, template) { + assert.ok(!err, err); + assert.ok(template); + done(); + }); + }); + + it('should fail to create more templates than allowed by options', function(done) { + var templateMaps = new TemplateMaps(redisPool, {max_user_templates: 1}); + + templateMaps.addTemplate(OWNER, createTemplate(), function(err, templateName, template) { + assert.ok(!err, err); + assert.ok(template); + templateMaps.addTemplate(OWNER, createTemplate(), function(err) { + assert.ok(err); + assert.equal(err.http_status, 409); + done(); + }); + }); + }); +}); From 353919239d3434269904cbdb3d12efb69207161f Mon Sep 17 00:00:00 2001 From: Raul Ochoa Date: Wed, 13 Jan 2016 18:59:33 +0100 Subject: [PATCH 54/72] Attempt to use travis' container based builds --- .travis.yml | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/.travis.yml b/.travis.yml index bbfbe798..5e98dd8c 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,10 +1,11 @@ +sudo: false + addons: postgresql: "9.3" before_install: - sudo apt-get update - - sudo apt-get install -y pkg-config libcairo2-dev libjpeg8-dev libgif-dev - - sudo apt-get install postgresql-plpython-9.3 + - sudo apt-get install -y postgresql-plpython-9.3 pkg-config libcairo2-dev libjpeg8-dev libgif-dev - createdb template_postgis - psql -c "CREATE EXTENSION postgis" template_postgis From 8ea159e0a11cd739c1f881bd13627eb631d4ad51 Mon Sep 17 00:00:00 2001 From: Raul Ochoa Date: Wed, 13 Jan 2016 19:14:58 +0100 Subject: [PATCH 55/72] Remove sudo calls --- .travis.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.travis.yml b/.travis.yml index 5e98dd8c..b9f817dd 100644 --- a/.travis.yml +++ b/.travis.yml @@ -4,8 +4,8 @@ addons: postgresql: "9.3" before_install: - - sudo apt-get update - - sudo apt-get install -y postgresql-plpython-9.3 pkg-config libcairo2-dev libjpeg8-dev libgif-dev + - apt-get update + - apt-get install -y postgresql-plpython-9.3 pkg-config libcairo2-dev libjpeg8-dev libgif-dev - createdb template_postgis - psql -c "CREATE EXTENSION postgis" template_postgis From 74abee27004a5011dd1898a827a54157fa4b946d Mon Sep 17 00:00:00 2001 From: Raul Ochoa Date: Wed, 13 Jan 2016 19:23:30 +0100 Subject: [PATCH 56/72] Use apt addon instead of apt-get install --- .travis.yml | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/.travis.yml b/.travis.yml index b9f817dd..351cf755 100644 --- a/.travis.yml +++ b/.travis.yml @@ -2,10 +2,15 @@ sudo: false addons: postgresql: "9.3" + apt: + packages: + - postgresql-plpython-9.3 + - pkg-config + - libcairo2-dev + - libjpeg8-dev + - libgif-dev before_install: - - apt-get update - - apt-get install -y postgresql-plpython-9.3 pkg-config libcairo2-dev libjpeg8-dev libgif-dev - createdb template_postgis - psql -c "CREATE EXTENSION postgis" template_postgis From 553c64bd8bc687d7314a4388d65ce7c93474c94e Mon Sep 17 00:00:00 2001 From: Raul Ochoa Date: Wed, 13 Jan 2016 19:32:50 +0100 Subject: [PATCH 57/72] Create extension for plpython --- .travis.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.travis.yml b/.travis.yml index 351cf755..1fea4316 100644 --- a/.travis.yml +++ b/.travis.yml @@ -13,6 +13,7 @@ addons: before_install: - createdb template_postgis - psql -c "CREATE EXTENSION postgis" template_postgis + - psql -c "CREATE EXTENSION plpython" template_postgis env: - NPROCS=1 JOBS=1 PGUSER=postgres From 18278da4bbb9e84b856e12b05d94d2c8d0e8e73d Mon Sep 17 00:00:00 2001 From: Raul Ochoa Date: Wed, 13 Jan 2016 19:36:01 +0100 Subject: [PATCH 58/72] Create language instead of extension --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 1fea4316..9ac935ac 100644 --- a/.travis.yml +++ b/.travis.yml @@ -13,7 +13,7 @@ addons: before_install: - createdb template_postgis - psql -c "CREATE EXTENSION postgis" template_postgis - - psql -c "CREATE EXTENSION plpython" template_postgis + - psql -c "CREATE LANGUAGE plpythonu" template_postgis env: - NPROCS=1 JOBS=1 PGUSER=postgres From 04a2d1d33c795fe0264cafe02aa03ae4ff511db8 Mon Sep 17 00:00:00 2001 From: Raul Ochoa Date: Wed, 13 Jan 2016 20:11:24 +0100 Subject: [PATCH 59/72] Remove postgresql-plpython-9.3 --- .travis.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 9ac935ac..9f133944 100644 --- a/.travis.yml +++ b/.travis.yml @@ -4,7 +4,6 @@ addons: postgresql: "9.3" apt: packages: - - postgresql-plpython-9.3 - pkg-config - libcairo2-dev - libjpeg8-dev From 3780aed1b7509ab1d1ea7323db9da34d772a8929 Mon Sep 17 00:00:00 2001 From: Raul Ochoa Date: Wed, 13 Jan 2016 20:14:04 +0100 Subject: [PATCH 60/72] Check with no postgresql-plpython-9.3 at all --- .travis.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 9f133944..41b31179 100644 --- a/.travis.yml +++ b/.travis.yml @@ -12,7 +12,6 @@ addons: before_install: - createdb template_postgis - psql -c "CREATE EXTENSION postgis" template_postgis - - psql -c "CREATE LANGUAGE plpythonu" template_postgis env: - NPROCS=1 JOBS=1 PGUSER=postgres From 19216eaa88b110eeb63dc3b59a54bfb46a41f59f Mon Sep 17 00:00:00 2001 From: Raul Ochoa Date: Wed, 13 Jan 2016 20:21:41 +0100 Subject: [PATCH 61/72] Use create language instead of extension --- test/support/prepare_db.sh | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/test/support/prepare_db.sh b/test/support/prepare_db.sh index fd920e8d..ab9149a2 100755 --- a/test/support/prepare_db.sh +++ b/test/support/prepare_db.sh @@ -78,9 +78,9 @@ if test x"$PREPARE_PGSQL" = xyes; then sed "s/:TESTPASS/${TESTPASS}/" | psql -v ON_ERROR_STOP=1 ${TEST_DB} || exit 1 - psql -c "CREATE EXTENSION plpythonu;" ${TEST_DB} -# curl -L -s https://github.com/CartoDB/cartodb-postgresql/raw/cdb/scripts-available/CDB_QueryStatements.sql -o sql/CDB_QueryStatements.sql -# curl -L -s https://github.com/CartoDB/cartodb-postgresql/raw/cdb/scripts-available/CDB_QueryTables.sql -o sql/CDB_QueryTables.sql + psql -c "CREATE LANGUAGE plpythonu;" ${TEST_DB} + curl -L -s https://github.com/CartoDB/cartodb-postgresql/raw/cdb/scripts-available/CDB_QueryStatements.sql -o sql/CDB_QueryStatements.sql + curl -L -s https://github.com/CartoDB/cartodb-postgresql/raw/cdb/scripts-available/CDB_QueryTables.sql -o sql/CDB_QueryTables.sql cat sql/CDB_QueryStatements.sql sql/CDB_QueryTables.sql | psql -v ON_ERROR_STOP=1 ${TEST_DB} || exit 1 From 97d3bed1d2f5854ec3d14ff510a92e48a6b2719e Mon Sep 17 00:00:00 2001 From: Raul Ochoa Date: Wed, 13 Jan 2016 20:33:12 +0100 Subject: [PATCH 62/72] test with pg 9.4 --- .travis.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 41b31179..671832f0 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,9 +1,10 @@ sudo: false addons: - postgresql: "9.3" + postgresql: "9.4" apt: packages: + - postgresql-plpython-9.4 - pkg-config - libcairo2-dev - libjpeg8-dev From 62b1df970ac8aae470969f964724e97b47cef56a Mon Sep 17 00:00:00 2001 From: Raul Ochoa Date: Thu, 14 Jan 2016 18:16:12 +0100 Subject: [PATCH 63/72] fix json --- docs/MultiLayer-API.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/MultiLayer-API.md b/docs/MultiLayer-API.md index 793a60a9..06e7ce39 100644 --- a/docs/MultiLayer-API.md +++ b/docs/MultiLayer-API.md @@ -17,8 +17,8 @@ Windshaft-CartoDB adds the following attributes in the response object ```json { - http: 'http://cdn_url.com/' - https: 'https://secure.cdn_url.com/' + "http": "http://cdn_url.com/" + "https": "https://secure.cdn_url.com/" } ``` From 45acdd9f39b8fb4aced43dda1e8a1e1c1cf85da1 Mon Sep 17 00:00:00 2001 From: Raul Ochoa Date: Thu, 14 Jan 2016 18:16:31 +0100 Subject: [PATCH 64/72] fix json, 2nd attempt --- docs/MultiLayer-API.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/MultiLayer-API.md b/docs/MultiLayer-API.md index 06e7ce39..febf709b 100644 --- a/docs/MultiLayer-API.md +++ b/docs/MultiLayer-API.md @@ -17,7 +17,7 @@ Windshaft-CartoDB adds the following attributes in the response object ```json { - "http": "http://cdn_url.com/" + "http": "http://cdn_url.com/", "https": "https://secure.cdn_url.com/" } ``` From 5eeaa0272cc56c0b5852055cef2eeaeceb3a0aa7 Mon Sep 17 00:00:00 2001 From: Raul Ochoa Date: Fri, 15 Jan 2016 16:01:01 +0100 Subject: [PATCH 65/72] Use master branch from windshaft and regenerate npm-shrinkwrap.json --- npm-shrinkwrap.json | 918 +++++++++++++++++++++++++++++++------------- package.json | 2 +- 2 files changed, 642 insertions(+), 278 deletions(-) diff --git a/npm-shrinkwrap.json b/npm-shrinkwrap.json index 2cd8eeca..6756417c 100644 --- a/npm-shrinkwrap.json +++ b/npm-shrinkwrap.json @@ -3,14 +3,14 @@ "version": "2.19.2", "dependencies": { "body-parser": { - "version": "1.14.1", + "version": "1.14.2", "from": "body-parser@~1.14.0", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.14.1.tgz", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.14.2.tgz", "dependencies": { "bytes": { - "version": "2.1.0", - "from": "bytes@2.1.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-2.1.0.tgz" + "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", @@ -40,9 +40,9 @@ } }, "iconv-lite": { - "version": "0.4.12", - "from": "iconv-lite@0.4.12", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.12.tgz" + "version": "0.4.13", + "from": "iconv-lite@0.4.13", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.13.tgz" }, "on-finished": { "version": "2.3.0", @@ -57,14 +57,14 @@ } }, "qs": { - "version": "5.1.0", - "from": "qs@5.1.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-5.1.0.tgz" + "version": "5.2.0", + "from": "qs@5.2.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-5.2.0.tgz" }, "raw-body": { - "version": "2.1.4", - "from": "raw-body@~2.1.4", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.1.4.tgz", + "version": "2.1.5", + "from": "raw-body@~2.1.5", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.1.5.tgz", "dependencies": { "unpipe": { "version": "1.0.0", @@ -74,9 +74,9 @@ } }, "type-is": { - "version": "1.6.9", - "from": "type-is@~1.6.9", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.9.tgz", + "version": "1.6.10", + "from": "type-is@~1.6.10", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.10.tgz", "dependencies": { "media-typer": { "version": "0.3.0", @@ -84,14 +84,14 @@ "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz" }, "mime-types": { - "version": "2.1.7", - "from": "mime-types@~2.1.7", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.7.tgz", + "version": "2.1.9", + "from": "mime-types@~2.1.8", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.9.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" + "version": "1.21.0", + "from": "mime-db@~1.21.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.21.0.tgz" } } } @@ -191,14 +191,14 @@ "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.2.13.tgz", "dependencies": { "mime-types": { - "version": "2.1.7", - "from": "mime-types@~2.1.6", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.7.tgz", + "version": "2.1.9", + "from": "mime-types@~2.1.8", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.9.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" + "version": "1.21.0", + "from": "mime-db@~1.21.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.21.0.tgz" } } }, @@ -299,9 +299,9 @@ "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz" }, "proxy-addr": { - "version": "1.0.8", + "version": "1.0.10", "from": "proxy-addr@~1.0.8", - "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-1.0.8.tgz", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-1.0.10.tgz", "dependencies": { "forwarded": { "version": "0.1.0", @@ -309,9 +309,9 @@ "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.0.tgz" }, "ipaddr.js": { - "version": "1.0.1", - "from": "ipaddr.js@1.0.1", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.0.1.tgz" + "version": "1.0.5", + "from": "ipaddr.js@1.0.5", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.0.5.tgz" } } }, @@ -370,9 +370,9 @@ "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.10.0.tgz" }, "type-is": { - "version": "1.6.9", + "version": "1.6.10", "from": "type-is@~1.6.6", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.9.tgz", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.10.tgz", "dependencies": { "media-typer": { "version": "0.3.0", @@ -380,14 +380,14 @@ "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz" }, "mime-types": { - "version": "2.1.7", - "from": "mime-types@~2.1.6", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.7.tgz", + "version": "2.1.9", + "from": "mime-types@~2.1.8", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.9.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" + "version": "1.21.0", + "from": "mime-db@~1.21.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.21.0.tgz" } } } @@ -522,9 +522,9 @@ "resolved": "https://registry.npmjs.org/bl/-/bl-1.0.0.tgz", "dependencies": { "readable-stream": { - "version": "2.0.4", + "version": "2.0.5", "from": "readable-stream@~2.0.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.0.4.tgz", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.0.5.tgz", "dependencies": { "core-util-is": { "version": "1.0.2", @@ -533,7 +533,7 @@ }, "inherits": { "version": "2.0.1", - "from": "inherits@2", + "from": "inherits@~2.0.1", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz" }, "isarray": { @@ -542,9 +542,9 @@ "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" + "version": "1.0.6", + "from": "process-nextick-args@~1.0.6", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.6.tgz" }, "string_decoder": { "version": "0.10.31", @@ -581,9 +581,9 @@ "resolved": "https://registry.npmjs.org/form-data/-/form-data-1.0.0-rc3.tgz", "dependencies": { "async": { - "version": "1.5.0", + "version": "1.5.2", "from": "async@^1.4.0", - "resolved": "https://registry.npmjs.org/async/-/async-1.5.0.tgz" + "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz" } } }, @@ -593,14 +593,14 @@ "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz" }, "mime-types": { - "version": "2.1.7", + "version": "2.1.9", "from": "mime-types@~2.1.2", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.7.tgz", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.9.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" + "version": "1.21.0", + "from": "mime-db@~1.21.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.21.0.tgz" } } }, @@ -615,9 +615,9 @@ "resolved": "https://registry.npmjs.org/qs/-/qs-5.1.0.tgz" }, "tunnel-agent": { - "version": "0.4.1", + "version": "0.4.2", "from": "tunnel-agent@~0.4.0", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.4.1.tgz" + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.4.2.tgz" }, "tough-cookie": { "version": "2.2.1", @@ -726,9 +726,9 @@ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.1.0.tgz" }, "escape-string-regexp": { - "version": "1.0.3", + "version": "1.0.4", "from": "escape-string-regexp@^1.0.2", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.3.tgz" + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.4.tgz" }, "has-ansi": { "version": "2.0.0", @@ -828,8 +828,8 @@ }, "windshaft": { "version": "1.6.2", - "from": "https://github.com/CartoDB/Windshaft/tarball/mapconfig-extension", - "resolved": "https://github.com/CartoDB/Windshaft/tarball/mapconfig-extension", + "from": "https://github.com/CartoDB/Windshaft/tarball/master", + "resolved": "https://github.com/CartoDB/Windshaft/tarball/master", "dependencies": { "mapnik": { "version": "1.4.15-cdb6", @@ -2129,63 +2129,60 @@ } }, "zipfile": { - "version": "0.5.7", + "version": "0.5.9", "from": "zipfile@~0.5.2", - "resolved": "https://registry.npmjs.org/zipfile/-/zipfile-0.5.7.tgz", + "resolved": "https://registry.npmjs.org/zipfile/-/zipfile-0.5.9.tgz", "dependencies": { "nan": { - "version": "1.5.3", - "from": "nan@~1.5.1", - "resolved": "https://registry.npmjs.org/nan/-/nan-1.5.3.tgz" + "version": "2.1.0", + "from": "nan@~2.1.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.1.0.tgz" }, "node-pre-gyp": { - "version": "0.6.2", - "from": "node-pre-gyp@>=0.6.2 <0.7.0", - "resolved": "https://registry.npmjs.org/node-pre-gyp/-/node-pre-gyp-0.6.2.tgz", + "version": "0.6.17", + "from": "node-pre-gyp@~0.6.17", "dependencies": { "nopt": { - "version": "3.0.1", + "version": "3.0.6", "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.6.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": "2.0.0", + "from": "npmlog@~2.0.0", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-2.0.0.tgz", "dependencies": { "ansi": { "version": "0.3.0", "from": "ansi@~0.3.0", "resolved": "https://registry.npmjs.org/ansi/-/ansi-0.3.0.tgz" - } - } - }, - "request": { - "version": "2.51.0", - "from": "request@2.x", - "resolved": "https://registry.npmjs.org/request/-/request-2.51.0.tgz", - "dependencies": { - "bl": { - "version": "0.9.3", - "from": "bl@~0.9.0", - "resolved": "https://registry.npmjs.org/bl/-/bl-0.9.3.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.0.33", - "from": "readable-stream@~1.0.26", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.33.tgz", + "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", + "version": "1.0.2", "from": "core-util-is@~1.0.0", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.1.tgz" + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz" }, "isarray": { "version": "0.0.1", @@ -2206,179 +2203,489 @@ } } }, - "caseless": { - "version": "0.8.0", - "from": "caseless@~0.8.0", - "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.8.0.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" - }, - "form-data": { - "version": "0.2.0", - "from": "form-data@~0.2.0", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-0.2.0.tgz", + "gauge": { + "version": "1.2.2", + "from": "gauge@~1.2.0", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-1.2.2.tgz", "dependencies": { - "async": { - "version": "0.9.0", - "from": "async@~0.9.0", - "resolved": "https://registry.npmjs.org/async/-/async-0.9.0.tgz" + "has-unicode": { + "version": "1.0.1", + "from": "has-unicode@^1.0.0", + "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-1.0.1.tgz" }, - "mime-types": { - "version": "2.0.7", - "from": "mime-types@~2.0.3", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.0.7.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": { - "mime-db": { - "version": "1.5.0", - "from": "mime-db@~1.5.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.5.0.tgz" + "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.67.0", + "from": "request@2.x", + "resolved": "https://registry.npmjs.org/request/-/request-2.67.0.tgz", + "dependencies": { + "bl": { + "version": "1.0.0", + "from": "bl@~1.0.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-1.0.0.tgz", + "dependencies": { + "readable-stream": { + "version": "2.0.4", + "from": "readable-stream@~2.0.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.0.4.tgz", + "dependencies": { + "core-util-is": { + "version": "1.0.2", + "from": "core-util-is@~1.0.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", + "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.2", + "from": "util-deprecate@~1.0.1", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.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" + "caseless": { + "version": "0.11.0", + "from": "caseless@~0.11.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.11.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" + "extend": { + "version": "3.0.0", + "from": "extend@~3.0.0", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.0.tgz" }, - "node-uuid": { - "version": "1.4.2", - "from": "node-uuid@~1.4.0", - "resolved": "https://registry.npmjs.org/node-uuid/-/node-uuid-1.4.2.tgz" + "forever-agent": { + "version": "0.6.1", + "from": "forever-agent@~0.6.1", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz" }, - "qs": { - "version": "2.3.3", - "from": "qs@~2.3.1", - "resolved": "https://registry.npmjs.org/qs/-/qs-2.3.3.tgz" - }, - "tunnel-agent": { - "version": "0.4.0", - "from": "tunnel-agent@~0.4.0", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.4.0.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", + "form-data": { + "version": "1.0.0-rc3", + "from": "form-data@~1.0.0-rc3", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-1.0.0-rc3.tgz", "dependencies": { - "punycode": { - "version": "1.3.2", - "from": "punycode@>=0.2.0", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz" + "async": { + "version": "1.5.0", + "from": "async@^1.4.0", + "resolved": "https://registry.npmjs.org/async/-/async-1.5.0.tgz" } } }, + "json-stringify-safe": { + "version": "5.0.1", + "from": "json-stringify-safe@~5.0.1", + "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.7", + "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.7", + "from": "node-uuid@~1.4.7", + "resolved": "https://registry.npmjs.org/node-uuid/-/node-uuid-1.4.7.tgz" + }, + "qs": { + "version": "5.2.0", + "from": "qs@~5.2.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-5.2.0.tgz" + }, + "tunnel-agent": { + "version": "0.4.1", + "from": "tunnel-agent@~0.4.1", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.4.1.tgz" + }, + "tough-cookie": { + "version": "2.2.1", + "from": "tough-cookie@~2.2.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.2.1.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", + "version": "1.1.0", + "from": "http-signature@~1.1.0", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.1.0.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" + "jsprim": { + "version": "1.2.2", + "from": "jsprim@^1.2.2", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.2.2.tgz", + "dependencies": { + "extsprintf": { + "version": "1.0.2", + "from": "extsprintf@1.0.2", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.0.2.tgz" + }, + "json-schema": { + "version": "0.2.2", + "from": "json-schema@0.2.2", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.2.tgz" + }, + "verror": { + "version": "1.3.6", + "from": "verror@1.3.6", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.3.6.tgz" + } + } }, - "ctype": { - "version": "0.5.3", - "from": "ctype@0.5.3", - "resolved": "https://registry.npmjs.org/ctype/-/ctype-0.5.3.tgz" + "sshpk": { + "version": "1.7.0", + "from": "sshpk@^1.7.0", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.7.0.tgz", + "dependencies": { + "asn1": { + "version": "0.2.3", + "from": "asn1@>=0.2.3 <0.3.0", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.3.tgz" + }, + "assert-plus": { + "version": "0.2.0", + "from": "assert-plus@>=0.2.0 <0.3.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-0.2.0.tgz" + }, + "dashdash": { + "version": "1.10.1", + "from": "dashdash@>=1.10.1 <2.0.0", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.10.1.tgz", + "dependencies": { + "assert-plus": { + "version": "0.1.5", + "from": "assert-plus@0.1.x", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-0.1.5.tgz" + } + } + }, + "jsbn": { + "version": "0.1.0", + "from": "jsbn@>=0.1.0 <0.2.0", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.0.tgz" + }, + "tweetnacl": { + "version": "0.13.2", + "from": "tweetnacl@>=0.13.0 <1.0.0", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.13.2.tgz" + }, + "jodid25519": { + "version": "1.0.2", + "from": "jodid25519@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/jodid25519/-/jodid25519-1.0.2.tgz" + }, + "ecc-jsbn": { + "version": "0.1.1", + "from": "ecc-jsbn@>=0.0.1 <1.0.0", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz" + } + } } } }, "oauth-sign": { - "version": "0.5.0", - "from": "oauth-sign@~0.5.0", - "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.5.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.2", + "from": "hawk@~3.1.0", + "resolved": "https://registry.npmjs.org/hawk/-/hawk-3.1.2.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.10.1", + "from": "boom@2.x.x", + "resolved": "https://registry.npmjs.org/boom/-/boom-2.10.1.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" } } }, "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": "0.6.0", + "from": "aws-sign2@~0.6.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.6.0.tgz" }, "stringstream": { - "version": "0.0.4", + "version": "0.0.5", "from": "stringstream@~0.0.4", - "resolved": "https://registry.npmjs.org/stringstream/-/stringstream-0.0.4.tgz" + "resolved": "https://registry.npmjs.org/stringstream/-/stringstream-0.0.5.tgz" }, "combined-stream": { - "version": "0.0.7", - "from": "combined-stream@~0.0.5", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-0.0.7.tgz", + "version": "1.0.5", + "from": "combined-stream@~1.0.5", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.5.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" + "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.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz" + }, + "is-typedarray": { + "version": "1.0.0", + "from": "is-typedarray@~1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz" + }, + "har-validator": { + "version": "2.0.3", + "from": "har-validator@~2.0.2", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-2.0.3.tgz", + "dependencies": { + "chalk": { + "version": "1.1.1", + "from": "chalk@^1.1.1", + "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.9.0", + "from": "commander@^2.9.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", + "resolved": "https://registry.npmjs.org/graceful-readlink/-/graceful-readlink-1.0.1.tgz" + } + } + }, + "is-my-json-valid": { + "version": "2.12.3", + "from": "is-my-json-valid@^2.12.3", + "resolved": "https://registry.npmjs.org/is-my-json-valid/-/is-my-json-valid-2.12.3.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.1", + "from": "xtend@^4.0.0", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz" + } + } + }, + "pinkie-promise": { + "version": "2.0.0", + "from": "pinkie-promise@^2.0.0", + "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.0.tgz", + "dependencies": { + "pinkie": { + "version": "2.0.1", + "from": "pinkie@^2.0.0", + "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.1.tgz" + } + } } } } } }, "semver": { - "version": "4.2.0", - "from": "semver@~4.2.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-4.2.0.tgz" + "version": "5.1.0", + "from": "semver@~5.1.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.1.0.tgz" }, "tar": { - "version": "1.0.3", - "from": "tar@~1.0.2", - "resolved": "https://registry.npmjs.org/tar/-/tar-1.0.3.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.3", + "version": "1.0.8", "from": "fstream@^1.0.2", - "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.3.tgz", + "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.8.tgz", "dependencies": { "graceful-fs": { - "version": "3.0.5", - "from": "graceful-fs@3", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-3.0.5.tgz" + "version": "4.1.2", + "from": "graceful-fs@^4.1.2", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.2.tgz" } } }, @@ -2390,10 +2697,15 @@ } }, "tar-pack": { - "version": "2.0.0", - "from": "tar-pack@~2.0.0", - "resolved": "https://registry.npmjs.org/tar-pack/-/tar-pack-2.0.0.tgz", + "version": "3.1.0", + "from": "tar-pack@~3.1.0", + "resolved": "https://registry.npmjs.org/tar-pack/-/tar-pack-3.1.0.tgz", "dependencies": { + "graceful-fs": { + "version": "4.1.2", + "from": "graceful-fs@4.1", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.2.tgz" + }, "uid-number": { "version": "0.0.3", "from": "uid-number@0.0.3", @@ -2409,16 +2721,16 @@ "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", + "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.5", - "from": "graceful-fs@3", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-3.0.5.tgz" - }, "inherits": { "version": "2.0.1", "from": "inherits@~2.0.0", @@ -2426,49 +2738,39 @@ } } }, - "tar": { - "version": "0.1.20", - "from": "tar@~0.1.17", - "resolved": "https://registry.npmjs.org/tar/-/tar-0.1.20.tgz", + "fstream-ignore": { + "version": "1.0.3", + "from": "fstream-ignore@~1.0.3", + "resolved": "https://registry.npmjs.org/fstream-ignore/-/fstream-ignore-1.0.3.tgz", "dependencies": { - "block-stream": { - "version": "0.0.7", - "from": "block-stream@*", - "resolved": "https://registry.npmjs.org/block-stream/-/block-stream-0.0.7.tgz" - }, "inherits": { "version": "2.0.1", "from": "inherits@2", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz" - } - } - }, - "fstream-ignore": { - "version": "0.0.7", - "from": "fstream-ignore@0.0.7", - "resolved": "https://registry.npmjs.org/fstream-ignore/-/fstream-ignore-0.0.7.tgz", - "dependencies": { + }, "minimatch": { - "version": "0.2.14", - "from": "minimatch@~0.2.0", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-0.2.14.tgz", + "version": "3.0.0", + "from": "minimatch@^3.0.0", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.0.tgz", "dependencies": { - "lru-cache": { - "version": "2.5.0", - "from": "lru-cache@2", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.5.0.tgz" - }, - "sigmund": { - "version": "1.0.0", - "from": "sigmund@~1.0.0", - "resolved": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.0.tgz" + "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.1", + "from": "balanced-match@^0.2.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-0.2.1.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" + } + } } } - }, - "inherits": { - "version": "2.0.1", - "from": "inherits@2", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz" } } }, @@ -2478,9 +2780,9 @@ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.33.tgz", "dependencies": { "core-util-is": { - "version": "1.0.1", + "version": "1.0.2", "from": "core-util-is@~1.0.0", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.1.tgz" + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz" }, "isarray": { "version": "0.0.1", @@ -2498,18 +2800,13 @@ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz" } } - }, - "graceful-fs": { - "version": "1.2.3", - "from": "graceful-fs@1.2", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-1.2.3.tgz" } } }, "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", @@ -2519,36 +2816,103 @@ } }, "rc": { - "version": "0.5.5", - "from": "rc@~0.5.1", - "resolved": "https://registry.npmjs.org/rc/-/rc-0.5.5.tgz", + "version": "1.1.5", + "from": "rc@~1.1.0", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.1.5.tgz", "dependencies": { - "minimist": { - "version": "0.0.10", - "from": "minimist@~0.0.7", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.10.tgz" - }, "deep-extend": { - "version": "0.2.11", - "from": "deep-extend@~0.2.5", - "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.2.11.tgz" - }, - "strip-json-comments": { - "version": "0.1.3", - "from": "strip-json-comments@0.1.x", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-0.1.3.tgz" + "version": "0.4.0", + "from": "deep-extend@~0.4.0", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.4.0.tgz" }, "ini": { - "version": "1.3.2", + "version": "1.3.4", "from": "ini@~1.3.0", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.2.tgz" + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.4.tgz" + }, + "minimist": { + "version": "1.2.0", + "from": "minimist@^1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz" + }, + "strip-json-comments": { + "version": "1.0.4", + "from": "strip-json-comments@~1.0.4", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-1.0.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.4", + "from": "rimraf@~2.4.0", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.4.4.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", + "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.1", + "from": "balanced-match@^0.2.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-0.2.1.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.3", + "from": "once@^1.3.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.3.3.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" + } + } + } + } } } } diff --git a/package.json b/package.json index 0dda7dcd..7f539bef 100644 --- a/package.json +++ b/package.json @@ -29,7 +29,7 @@ "node-statsd": "~0.0.7", "underscore" : "~1.6.0", "dot": "~1.0.2", - "windshaft": "https://github.com/CartoDB/Windshaft/tarball/mapconfig-extension", + "windshaft": "https://github.com/CartoDB/Windshaft/tarball/master", "step": "~0.0.6", "queue-async": "~1.0.7", "request": "~2.62.0", From 1eb69ae3d1f3b3efe1ff1a43b99dc25b1712e04d Mon Sep 17 00:00:00 2001 From: Raul Ochoa Date: Fri, 15 Jan 2016 16:02:02 +0100 Subject: [PATCH 66/72] Remove make target to update windshaft --- Makefile | 4 ---- 1 file changed, 4 deletions(-) diff --git a/Makefile b/Makefile index 7a424cc7..98454b25 100644 --- a/Makefile +++ b/Makefile @@ -9,10 +9,6 @@ all: clean: rm -rf node_modules/* -update-windshaft: - rm -rf node_modules/windshaft - npm install windshaft - distclean: clean rm config.status* From 3afb7a0eb3961c6032b762119234ffc007bdbc33 Mon Sep 17 00:00:00 2001 From: Raul Ochoa Date: Fri, 15 Jan 2016 17:02:09 +0100 Subject: [PATCH 67/72] Adds some notes about unsupported endpoints --- lib/cartodb/controllers/layergroup.js | 2 ++ lib/cartodb/controllers/map.js | 3 +-- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/lib/cartodb/controllers/layergroup.js b/lib/cartodb/controllers/layergroup.js index e1d56fb2..0a7e7698 100644 --- a/lib/cartodb/controllers/layergroup.js +++ b/lib/cartodb/controllers/layergroup.js @@ -69,6 +69,8 @@ LayergroupController.prototype.register = function(app) { '/static/bbox/:token/:west,:south,:east,:north/:width/:height.:format', cors(), userMiddleware, this.bbox.bind(this)); + // Undocumented/non-supported API endpoint methods. + // Use at your own peril. app.get(app.base_url_mapconfig + '/:token/:layer/widget/:widgetName', cors(), userMiddleware, this.widget.bind(this)); diff --git a/lib/cartodb/controllers/map.js b/lib/cartodb/controllers/map.js index 117bb62d..9fad27f6 100644 --- a/lib/cartodb/controllers/map.js +++ b/lib/cartodb/controllers/map.js @@ -306,6 +306,7 @@ MapController.prototype.afterLayergroupCreate = function(req, res, mapconfig, la layergroup.layergroupid = layergroup.layergroupid + ':' + result.lastUpdatedTime; layergroup.last_updated = new Date(result.lastUpdatedTime).toISOString(); + // TODO this should take into account several URL patterns addWidgetsUrl(username, layergroup); if (req.method === 'GET') { @@ -329,8 +330,6 @@ MapController.prototype.afterLayergroupCreate = function(req, res, mapconfig, la function addWidgetsUrl(username, layergroup) { -// global.environment.serverMetadata - if (layergroup.metadata && Array.isArray(layergroup.metadata.layers)) { layergroup.metadata.layers = layergroup.metadata.layers.map(function(layer, layerIndex) { if (layer.widgets) { From e00661aa34447c746df0ba3f4d53e9991289255e Mon Sep 17 00:00:00 2001 From: Raul Ochoa Date: Fri, 15 Jan 2016 17:17:20 +0100 Subject: [PATCH 68/72] Remove substitution tokens in attributes service test --- .../ported/multilayer_error_cases.js | 40 ------------------- 1 file changed, 40 deletions(-) diff --git a/test/acceptance/ported/multilayer_error_cases.js b/test/acceptance/ported/multilayer_error_cases.js index 2434900d..11c11e63 100644 --- a/test/acceptance/ported/multilayer_error_cases.js +++ b/test/acceptance/ported/multilayer_error_cases.js @@ -64,46 +64,6 @@ describe('multilayer error cases', function() { }); }); - // See https://github.com/CartoDB/Windshaft/issues/154 - it("mapnik tokens cannot be used with attributes service", function(done) { - var layergroup = { - version: '1.1.0', - layers: [ - { options: { - sql: 'select cartodb_id, 1 as n, the_geom, !bbox! as b from test_table limit 1', - cartocss: '#layer { marker-fill:red }', - cartocss_version: '2.0.1', - attributes: { id:'cartodb_id', columns:['n'] }, - geom_column: 'the_geom' - } } - ] - }; - step( - function do_post() - { - var next = this; - assert.response(server, { - url: '/database/windshaft_test/layergroup', - method: 'POST', - headers: {'Content-Type': 'application/json; charset=utf-8' }, - data: JSON.stringify(layergroup) - }, {}, function(res, err) { next(err, res); }); - }, - function do_check(err, res) { - assert.equal(res.statusCode, 400, res.body); - var parsed = JSON.parse(res.body); - assert.ok(parsed.errors); - assert.equal(parsed.errors.length, 1); - var msg = parsed.errors[0]; - assert.ok(msg.match(/Attribute service cannot be activated/), msg); - return null; - }, - function finish(err) { - done(err); - } - ); - }); - it("layergroup with no cartocss_version", function(done) { var layergroup = { version: '1.0.0', From d3f5b03f13ebb9cae31b853a10c70c9431aebe14 Mon Sep 17 00:00:00 2001 From: Raul Ochoa Date: Fri, 15 Jan 2016 17:25:09 +0100 Subject: [PATCH 69/72] Validate current torque metadata keys --- test/acceptance/ported/torque.js | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/test/acceptance/ported/torque.js b/test/acceptance/ported/torque.js index 3d2d9d5a..2784a825 100644 --- a/test/acceptance/ported/torque.js +++ b/test/acceptance/ported/torque.js @@ -216,8 +216,10 @@ describe('torque', function() { assert.ok(tm0, 'No layer 0 in "torque" in metadata:' + JSON.stringify(tm)); var expectedTorqueMetadata = {"start":0,"end":86400000,"data_steps":2,"column_type":"date"}; - assert.deepEqual(tm0, expectedTorqueMetadata); - assert.deepEqual(meta.layers[0].meta, expectedTorqueMetadata); + Object.keys(expectedTorqueMetadata).forEach(function(k) { + assert.equal(tm0[k], expectedTorqueMetadata[k]); + assert.equal(meta.layers[0].meta[k], expectedTorqueMetadata[k]); + }); return null; }, function do_get_tile(err) From 30e479094fffd5025f591892b69bd4f43e2a74fd Mon Sep 17 00:00:00 2001 From: Raul Ochoa Date: Mon, 18 Jan 2016 14:08:01 +0100 Subject: [PATCH 70/72] Fix tests for windshaft master --- test/acceptance/widgets.js | 23 +++++++++++------------ 1 file changed, 11 insertions(+), 12 deletions(-) diff --git a/test/acceptance/widgets.js b/test/acceptance/widgets.js index 6c67bad5..2f4483f5 100644 --- a/test/acceptance/widgets.js +++ b/test/acceptance/widgets.js @@ -26,7 +26,7 @@ describe('widgets', function() { function getWidget(mapConfig, widgetName, params, callback) { if (!callback) { callback = params; - params = null; + params = {}; } var url = '/api/v1/map'; @@ -77,7 +77,7 @@ describe('widgets', function() { layergroupId = _layergroupId; var urlParams = { - own_filter: 1 + own_filter: params.hasOwnProperty('own_filter') ? params.own_filter : 1 }; if (params && params.bbox) { urlParams.bbox = params.bbox; @@ -219,13 +219,13 @@ describe('widgets', function() { }; it("should expose an aggregation", function(done) { - getWidget(aggregationMapConfig, 'country_places_count', function(err, res) { + 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, 12); + assert.equal(aggregation.categories.length, 6); assert.deepEqual(aggregation.categories[0], { value: 769, category: 'USA', agg: false }); done(); @@ -277,8 +277,8 @@ describe('widgets', function() { ] }; - it("should expose an aggregation", function(done) { - getWidget(histogramMapConfig, 'country_places_histogram', function(err, res) { + it("should expose an histogram", function(done) { + getWidget(histogramMapConfig, 'country_places_histogram', { own_filter: 0 }, function(err, res) { if (err) { return done(err); } @@ -287,7 +287,7 @@ describe('widgets', function() { // notice min value assert.deepEqual( histogram.bins[0], - { bin:0, start:0, end:3567600, freq:7229, min:0, max:3917000 } + { bin: 0, freq: 6497, min: 0, max: 742572, avg: 113511.16823149147 } ); done(); @@ -313,11 +313,10 @@ describe('widgets', function() { // notice min value assert.deepEqual(histogram.bins[0], { bin: 0, - start: 4009000, - end: 11925750, - freq: 75, - min: 4009000, - max: 13485000 + freq: 62, + min: 4000000, + max: 9276403, + avg: 5815009.596774193 }); done(); From b5b881e66214ac2342cb023b8c1e538cb9c8c518 Mon Sep 17 00:00:00 2001 From: Raul Ochoa Date: Mon, 18 Jan 2016 14:23:45 +0100 Subject: [PATCH 71/72] Regenerate npm-shrinkwrap.json --- npm-shrinkwrap.json | 983 +++++++++++++++++++++++++++++++------------- 1 file changed, 699 insertions(+), 284 deletions(-) diff --git a/npm-shrinkwrap.json b/npm-shrinkwrap.json index a28c0269..94d2ec34 100644 --- a/npm-shrinkwrap.json +++ b/npm-shrinkwrap.json @@ -3,14 +3,14 @@ "version": "2.19.2", "dependencies": { "body-parser": { - "version": "1.14.1", + "version": "1.14.2", "from": "body-parser@~1.14.0", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.14.1.tgz", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.14.2.tgz", "dependencies": { "bytes": { - "version": "2.1.0", - "from": "bytes@2.1.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-2.1.0.tgz" + "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", @@ -40,9 +40,9 @@ } }, "iconv-lite": { - "version": "0.4.12", - "from": "iconv-lite@0.4.12", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.12.tgz" + "version": "0.4.13", + "from": "iconv-lite@0.4.13", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.13.tgz" }, "on-finished": { "version": "2.3.0", @@ -57,14 +57,14 @@ } }, "qs": { - "version": "5.1.0", - "from": "qs@5.1.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-5.1.0.tgz" + "version": "5.2.0", + "from": "qs@5.2.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-5.2.0.tgz" }, "raw-body": { - "version": "2.1.4", - "from": "raw-body@~2.1.4", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.1.4.tgz", + "version": "2.1.5", + "from": "raw-body@~2.1.5", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.1.5.tgz", "dependencies": { "unpipe": { "version": "1.0.0", @@ -74,9 +74,9 @@ } }, "type-is": { - "version": "1.6.9", - "from": "type-is@~1.6.9", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.9.tgz", + "version": "1.6.10", + "from": "type-is@~1.6.6", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.10.tgz", "dependencies": { "media-typer": { "version": "0.3.0", @@ -84,14 +84,14 @@ "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz" }, "mime-types": { - "version": "2.1.7", - "from": "mime-types@~2.1.7", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.7.tgz", + "version": "2.1.9", + "from": "mime-types@~2.1.8", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.9.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" + "version": "1.21.0", + "from": "mime-db@~1.21.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.21.0.tgz" } } } @@ -191,14 +191,14 @@ "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.2.13.tgz", "dependencies": { "mime-types": { - "version": "2.1.7", - "from": "mime-types@~2.1.7", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.7.tgz", + "version": "2.1.9", + "from": "mime-types@~2.1.6", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.9.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" + "version": "1.21.0", + "from": "mime-db@~1.21.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.21.0.tgz" } } }, @@ -272,9 +272,9 @@ "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.0.tgz" }, "methods": { - "version": "1.1.1", + "version": "1.1.2", "from": "methods@~1.1.1", - "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.1.tgz" + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz" }, "on-finished": { "version": "2.3.0", @@ -289,9 +289,9 @@ } }, "parseurl": { - "version": "1.3.0", + "version": "1.3.1", "from": "parseurl@~1.3.0", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.0.tgz" + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.1.tgz" }, "path-to-regexp": { "version": "0.1.7", @@ -299,9 +299,9 @@ "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz" }, "proxy-addr": { - "version": "1.0.8", + "version": "1.0.10", "from": "proxy-addr@~1.0.8", - "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-1.0.8.tgz", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-1.0.10.tgz", "dependencies": { "forwarded": { "version": "0.1.0", @@ -309,9 +309,9 @@ "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.0.tgz" }, "ipaddr.js": { - "version": "1.0.1", - "from": "ipaddr.js@1.0.1", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.0.1.tgz" + "version": "1.0.5", + "from": "ipaddr.js@1.0.5", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.0.5.tgz" } } }, @@ -365,14 +365,65 @@ } }, "serve-static": { - "version": "1.10.0", + "version": "1.10.1", "from": "serve-static@~1.10.0", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.10.0.tgz" + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.10.1.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" + } + } + } + } }, "type-is": { - "version": "1.6.9", + "version": "1.6.10", "from": "type-is@~1.6.6", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.9.tgz", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.10.tgz", "dependencies": { "media-typer": { "version": "0.3.0", @@ -380,14 +431,14 @@ "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz" }, "mime-types": { - "version": "2.1.7", - "from": "mime-types@~2.1.7", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.7.tgz", + "version": "2.1.9", + "from": "mime-types@~2.1.6", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.9.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" + "version": "1.21.0", + "from": "mime-db@~1.21.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.21.0.tgz" } } } @@ -522,9 +573,9 @@ "resolved": "https://registry.npmjs.org/bl/-/bl-1.0.0.tgz", "dependencies": { "readable-stream": { - "version": "2.0.4", + "version": "2.0.5", "from": "readable-stream@~2.0.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.0.4.tgz", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.0.5.tgz", "dependencies": { "core-util-is": { "version": "1.0.2", @@ -542,9 +593,9 @@ "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" + "version": "1.0.6", + "from": "process-nextick-args@~1.0.6", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.6.tgz" }, "string_decoder": { "version": "0.10.31", @@ -581,9 +632,9 @@ "resolved": "https://registry.npmjs.org/form-data/-/form-data-1.0.0-rc3.tgz", "dependencies": { "async": { - "version": "1.5.0", - "from": "async@^1.4.0", - "resolved": "https://registry.npmjs.org/async/-/async-1.5.0.tgz" + "version": "1.5.2", + "from": "async@1.x", + "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz" } } }, @@ -593,14 +644,14 @@ "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", + "version": "2.1.9", + "from": "mime-types@~2.1.8", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.9.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" + "version": "1.21.0", + "from": "mime-db@~1.21.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.21.0.tgz" } } }, @@ -615,9 +666,9 @@ "resolved": "https://registry.npmjs.org/qs/-/qs-5.1.0.tgz" }, "tunnel-agent": { - "version": "0.4.1", + "version": "0.4.2", "from": "tunnel-agent@~0.4.0", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.4.1.tgz" + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.4.2.tgz" }, "tough-cookie": { "version": "2.2.1", @@ -726,9 +777,9 @@ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.1.0.tgz" }, "escape-string-regexp": { - "version": "1.0.3", + "version": "1.0.4", "from": "escape-string-regexp@^1.0.2", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.3.tgz" + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.4.tgz" }, "has-ansi": { "version": "2.0.0", @@ -774,9 +825,9 @@ } }, "is-my-json-valid": { - "version": "2.12.3", + "version": "2.12.4", "from": "is-my-json-valid@^2.12.0", - "resolved": "https://registry.npmjs.org/is-my-json-valid/-/is-my-json-valid-2.12.3.tgz", + "resolved": "https://registry.npmjs.org/is-my-json-valid/-/is-my-json-valid-2.12.4.tgz", "dependencies": { "generate-function": { "version": "2.0.0", @@ -2129,63 +2180,60 @@ } }, "zipfile": { - "version": "0.5.7", + "version": "0.5.9", "from": "zipfile@~0.5.2", - "resolved": "https://registry.npmjs.org/zipfile/-/zipfile-0.5.7.tgz", + "resolved": "https://registry.npmjs.org/zipfile/-/zipfile-0.5.9.tgz", "dependencies": { "nan": { - "version": "1.5.3", - "from": "nan@~1.5.1", - "resolved": "https://registry.npmjs.org/nan/-/nan-1.5.3.tgz" + "version": "2.1.0", + "from": "nan@~2.1.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.1.0.tgz" }, "node-pre-gyp": { - "version": "0.6.2", - "from": "node-pre-gyp@>=0.6.2 <0.7.0", - "resolved": "https://registry.npmjs.org/node-pre-gyp/-/node-pre-gyp-0.6.2.tgz", + "version": "0.6.17", + "from": "node-pre-gyp@~0.6.17", "dependencies": { "nopt": { - "version": "3.0.1", + "version": "3.0.6", "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.6.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": "2.0.0", + "from": "npmlog@~2.0.0", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-2.0.0.tgz", "dependencies": { "ansi": { "version": "0.3.0", "from": "ansi@~0.3.0", "resolved": "https://registry.npmjs.org/ansi/-/ansi-0.3.0.tgz" - } - } - }, - "request": { - "version": "2.51.0", - "from": "request@2.x", - "resolved": "https://registry.npmjs.org/request/-/request-2.51.0.tgz", - "dependencies": { - "bl": { - "version": "0.9.3", - "from": "bl@~0.9.0", - "resolved": "https://registry.npmjs.org/bl/-/bl-0.9.3.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.0.33", - "from": "readable-stream@~1.0.26", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.33.tgz", + "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", + "version": "1.0.2", "from": "core-util-is@~1.0.0", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.1.tgz" + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz" }, "isarray": { "version": "0.0.1", @@ -2206,179 +2254,489 @@ } } }, - "caseless": { - "version": "0.8.0", - "from": "caseless@~0.8.0", - "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.8.0.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" - }, - "form-data": { - "version": "0.2.0", - "from": "form-data@~0.2.0", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-0.2.0.tgz", + "gauge": { + "version": "1.2.2", + "from": "gauge@~1.2.0", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-1.2.2.tgz", "dependencies": { - "async": { - "version": "0.9.0", - "from": "async@~0.9.0", - "resolved": "https://registry.npmjs.org/async/-/async-0.9.0.tgz" + "has-unicode": { + "version": "1.0.1", + "from": "has-unicode@^1.0.0", + "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-1.0.1.tgz" }, - "mime-types": { - "version": "2.0.7", - "from": "mime-types@~2.0.3", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.0.7.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": { - "mime-db": { - "version": "1.5.0", - "from": "mime-db@~1.5.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.5.0.tgz" + "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.67.0", + "from": "request@2.x", + "resolved": "https://registry.npmjs.org/request/-/request-2.67.0.tgz", + "dependencies": { + "bl": { + "version": "1.0.0", + "from": "bl@~1.0.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-1.0.0.tgz", + "dependencies": { + "readable-stream": { + "version": "2.0.4", + "from": "readable-stream@~2.0.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.0.4.tgz", + "dependencies": { + "core-util-is": { + "version": "1.0.2", + "from": "core-util-is@~1.0.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", + "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.2", + "from": "util-deprecate@~1.0.1", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.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" + "caseless": { + "version": "0.11.0", + "from": "caseless@~0.11.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.11.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" + "extend": { + "version": "3.0.0", + "from": "extend@~3.0.0", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.0.tgz" }, - "node-uuid": { - "version": "1.4.2", - "from": "node-uuid@~1.4.0", - "resolved": "https://registry.npmjs.org/node-uuid/-/node-uuid-1.4.2.tgz" + "forever-agent": { + "version": "0.6.1", + "from": "forever-agent@~0.6.1", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz" }, - "qs": { - "version": "2.3.3", - "from": "qs@~2.3.1", - "resolved": "https://registry.npmjs.org/qs/-/qs-2.3.3.tgz" - }, - "tunnel-agent": { - "version": "0.4.0", - "from": "tunnel-agent@~0.4.0", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.4.0.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", + "form-data": { + "version": "1.0.0-rc3", + "from": "form-data@~1.0.0-rc3", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-1.0.0-rc3.tgz", "dependencies": { - "punycode": { - "version": "1.3.2", - "from": "punycode@>=0.2.0", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz" + "async": { + "version": "1.5.0", + "from": "async@^1.4.0", + "resolved": "https://registry.npmjs.org/async/-/async-1.5.0.tgz" } } }, + "json-stringify-safe": { + "version": "5.0.1", + "from": "json-stringify-safe@~5.0.1", + "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.7", + "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.7", + "from": "node-uuid@~1.4.7", + "resolved": "https://registry.npmjs.org/node-uuid/-/node-uuid-1.4.7.tgz" + }, + "qs": { + "version": "5.2.0", + "from": "qs@~5.2.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-5.2.0.tgz" + }, + "tunnel-agent": { + "version": "0.4.1", + "from": "tunnel-agent@~0.4.1", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.4.1.tgz" + }, + "tough-cookie": { + "version": "2.2.1", + "from": "tough-cookie@~2.2.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.2.1.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", + "version": "1.1.0", + "from": "http-signature@~1.1.0", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.1.0.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" + "jsprim": { + "version": "1.2.2", + "from": "jsprim@^1.2.2", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.2.2.tgz", + "dependencies": { + "extsprintf": { + "version": "1.0.2", + "from": "extsprintf@1.0.2", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.0.2.tgz" + }, + "json-schema": { + "version": "0.2.2", + "from": "json-schema@0.2.2", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.2.tgz" + }, + "verror": { + "version": "1.3.6", + "from": "verror@1.3.6", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.3.6.tgz" + } + } }, - "ctype": { - "version": "0.5.3", - "from": "ctype@0.5.3", - "resolved": "https://registry.npmjs.org/ctype/-/ctype-0.5.3.tgz" + "sshpk": { + "version": "1.7.0", + "from": "sshpk@^1.7.0", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.7.0.tgz", + "dependencies": { + "asn1": { + "version": "0.2.3", + "from": "asn1@>=0.2.3 <0.3.0", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.3.tgz" + }, + "assert-plus": { + "version": "0.2.0", + "from": "assert-plus@>=0.2.0 <0.3.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-0.2.0.tgz" + }, + "dashdash": { + "version": "1.10.1", + "from": "dashdash@>=1.10.1 <2.0.0", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.10.1.tgz", + "dependencies": { + "assert-plus": { + "version": "0.1.5", + "from": "assert-plus@0.1.x", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-0.1.5.tgz" + } + } + }, + "jsbn": { + "version": "0.1.0", + "from": "jsbn@>=0.1.0 <0.2.0", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.0.tgz" + }, + "tweetnacl": { + "version": "0.13.2", + "from": "tweetnacl@>=0.13.0 <1.0.0", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.13.2.tgz" + }, + "jodid25519": { + "version": "1.0.2", + "from": "jodid25519@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/jodid25519/-/jodid25519-1.0.2.tgz" + }, + "ecc-jsbn": { + "version": "0.1.1", + "from": "ecc-jsbn@>=0.0.1 <1.0.0", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz" + } + } } } }, "oauth-sign": { - "version": "0.5.0", - "from": "oauth-sign@~0.5.0", - "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.5.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.2", + "from": "hawk@~3.1.0", + "resolved": "https://registry.npmjs.org/hawk/-/hawk-3.1.2.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.10.1", + "from": "boom@2.x.x", + "resolved": "https://registry.npmjs.org/boom/-/boom-2.10.1.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" } } }, "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": "0.6.0", + "from": "aws-sign2@~0.6.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.6.0.tgz" }, "stringstream": { - "version": "0.0.4", + "version": "0.0.5", "from": "stringstream@~0.0.4", - "resolved": "https://registry.npmjs.org/stringstream/-/stringstream-0.0.4.tgz" + "resolved": "https://registry.npmjs.org/stringstream/-/stringstream-0.0.5.tgz" }, "combined-stream": { - "version": "0.0.7", - "from": "combined-stream@~0.0.5", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-0.0.7.tgz", + "version": "1.0.5", + "from": "combined-stream@~1.0.5", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.5.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" + "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.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz" + }, + "is-typedarray": { + "version": "1.0.0", + "from": "is-typedarray@~1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz" + }, + "har-validator": { + "version": "2.0.3", + "from": "har-validator@~2.0.2", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-2.0.3.tgz", + "dependencies": { + "chalk": { + "version": "1.1.1", + "from": "chalk@^1.1.1", + "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.9.0", + "from": "commander@^2.9.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", + "resolved": "https://registry.npmjs.org/graceful-readlink/-/graceful-readlink-1.0.1.tgz" + } + } + }, + "is-my-json-valid": { + "version": "2.12.3", + "from": "is-my-json-valid@^2.12.3", + "resolved": "https://registry.npmjs.org/is-my-json-valid/-/is-my-json-valid-2.12.3.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.1", + "from": "xtend@^4.0.0", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz" + } + } + }, + "pinkie-promise": { + "version": "2.0.0", + "from": "pinkie-promise@^2.0.0", + "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.0.tgz", + "dependencies": { + "pinkie": { + "version": "2.0.1", + "from": "pinkie@^2.0.0", + "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.1.tgz" + } + } } } } } }, "semver": { - "version": "4.2.0", - "from": "semver@~4.2.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-4.2.0.tgz" + "version": "5.1.0", + "from": "semver@~5.1.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.1.0.tgz" }, "tar": { - "version": "1.0.3", - "from": "tar@~1.0.2", - "resolved": "https://registry.npmjs.org/tar/-/tar-1.0.3.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.3", + "version": "1.0.8", "from": "fstream@^1.0.2", - "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.3.tgz", + "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.8.tgz", "dependencies": { "graceful-fs": { - "version": "3.0.5", - "from": "graceful-fs@3", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-3.0.5.tgz" + "version": "4.1.2", + "from": "graceful-fs@^4.1.2", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.2.tgz" } } }, @@ -2390,10 +2748,15 @@ } }, "tar-pack": { - "version": "2.0.0", - "from": "tar-pack@~2.0.0", - "resolved": "https://registry.npmjs.org/tar-pack/-/tar-pack-2.0.0.tgz", + "version": "3.1.0", + "from": "tar-pack@~3.1.0", + "resolved": "https://registry.npmjs.org/tar-pack/-/tar-pack-3.1.0.tgz", "dependencies": { + "graceful-fs": { + "version": "4.1.2", + "from": "graceful-fs@4.1", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.2.tgz" + }, "uid-number": { "version": "0.0.3", "from": "uid-number@0.0.3", @@ -2409,16 +2772,16 @@ "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", + "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.5", - "from": "graceful-fs@3", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-3.0.5.tgz" - }, "inherits": { "version": "2.0.1", "from": "inherits@~2.0.0", @@ -2426,49 +2789,39 @@ } } }, - "tar": { - "version": "0.1.20", - "from": "tar@~0.1.17", - "resolved": "https://registry.npmjs.org/tar/-/tar-0.1.20.tgz", + "fstream-ignore": { + "version": "1.0.3", + "from": "fstream-ignore@~1.0.3", + "resolved": "https://registry.npmjs.org/fstream-ignore/-/fstream-ignore-1.0.3.tgz", "dependencies": { - "block-stream": { - "version": "0.0.7", - "from": "block-stream@*", - "resolved": "https://registry.npmjs.org/block-stream/-/block-stream-0.0.7.tgz" - }, "inherits": { "version": "2.0.1", "from": "inherits@2", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz" - } - } - }, - "fstream-ignore": { - "version": "0.0.7", - "from": "fstream-ignore@0.0.7", - "resolved": "https://registry.npmjs.org/fstream-ignore/-/fstream-ignore-0.0.7.tgz", - "dependencies": { + }, "minimatch": { - "version": "0.2.14", - "from": "minimatch@~0.2.0", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-0.2.14.tgz", + "version": "3.0.0", + "from": "minimatch@^3.0.0", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.0.tgz", "dependencies": { - "lru-cache": { - "version": "2.5.0", - "from": "lru-cache@2", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.5.0.tgz" - }, - "sigmund": { - "version": "1.0.0", - "from": "sigmund@~1.0.0", - "resolved": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.0.tgz" + "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.1", + "from": "balanced-match@^0.2.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-0.2.1.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" + } + } } } - }, - "inherits": { - "version": "2.0.1", - "from": "inherits@2", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz" } } }, @@ -2478,9 +2831,9 @@ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.33.tgz", "dependencies": { "core-util-is": { - "version": "1.0.1", + "version": "1.0.2", "from": "core-util-is@~1.0.0", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.1.tgz" + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz" }, "isarray": { "version": "0.0.1", @@ -2498,18 +2851,13 @@ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz" } } - }, - "graceful-fs": { - "version": "1.2.3", - "from": "graceful-fs@1.2", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-1.2.3.tgz" } } }, "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", @@ -2519,36 +2867,103 @@ } }, "rc": { - "version": "0.5.5", - "from": "rc@~0.5.1", - "resolved": "https://registry.npmjs.org/rc/-/rc-0.5.5.tgz", + "version": "1.1.5", + "from": "rc@~1.1.0", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.1.5.tgz", "dependencies": { - "minimist": { - "version": "0.0.10", - "from": "minimist@~0.0.7", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.10.tgz" - }, "deep-extend": { - "version": "0.2.11", - "from": "deep-extend@~0.2.5", - "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.2.11.tgz" - }, - "strip-json-comments": { - "version": "0.1.3", - "from": "strip-json-comments@0.1.x", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-0.1.3.tgz" + "version": "0.4.0", + "from": "deep-extend@~0.4.0", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.4.0.tgz" }, "ini": { - "version": "1.3.2", + "version": "1.3.4", "from": "ini@~1.3.0", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.2.tgz" + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.4.tgz" + }, + "minimist": { + "version": "1.2.0", + "from": "minimist@^1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz" + }, + "strip-json-comments": { + "version": "1.0.4", + "from": "strip-json-comments@~1.0.4", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-1.0.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.4", + "from": "rimraf@~2.4.0", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.4.4.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", + "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.1", + "from": "balanced-match@^0.2.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-0.2.1.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.3", + "from": "once@^1.3.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.3.3.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" + } + } + } + } } } } From 1dea84f9bfa166bf2e464f327f173192c372a94f Mon Sep 17 00:00:00 2001 From: Raul Ochoa Date: Tue, 19 Jan 2016 13:00:02 +0100 Subject: [PATCH 72/72] Change redis pool name to report with a valid statsd key --- lib/cartodb/server.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/cartodb/server.js b/lib/cartodb/server.js index e4079574..f4205676 100644 --- a/lib/cartodb/server.js +++ b/lib/cartodb/server.js @@ -36,7 +36,7 @@ module.exports = function(serverOptions) { global.statsClient = StatsClient.getInstance(serverOptions.statsd); var redisPool = new RedisPool(_.defaults(global.environment.redis, { - name: 'windshaft:server', + name: 'windshaft-server', unwatchOnRelease: false, noReadyCheck: true }));