From ab6004f21e8980e7d1130170c729ac2d3522979a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Garc=C3=ADa=20Aubert?= Date: Tue, 8 Mar 2016 14:34:57 +0100 Subject: [PATCH 01/17] Integrated turbo-cartocss for anonymous maps --- lib/cartodb/controllers/map.js | 41 ++++++++++---- lib/cartodb/server.js | 8 ++- .../utils/style/postgres-datasource.js | 55 +++++++++++++++++++ .../utils/style/turbo-cartocss-adapter.js | 55 +++++++++++++++++++ .../utils/style/turbo-cartocss-parser.js | 15 +++++ package.json | 3 +- test/acceptance/multilayer_server.js | 4 +- 7 files changed, 165 insertions(+), 16 deletions(-) create mode 100644 lib/cartodb/utils/style/postgres-datasource.js create mode 100644 lib/cartodb/utils/style/turbo-cartocss-adapter.js create mode 100644 lib/cartodb/utils/style/turbo-cartocss-parser.js diff --git a/lib/cartodb/controllers/map.js b/lib/cartodb/controllers/map.js index ff164e9c..54d018f1 100644 --- a/lib/cartodb/controllers/map.js +++ b/lib/cartodb/controllers/map.js @@ -34,7 +34,7 @@ var MapConfigOverviewsAdapter = require('../models/mapconfig_overviews_adapter') */ function MapController(authApi, pgConnection, templateMaps, mapBackend, metadataBackend, overviewsMetadataApi, - surrogateKeysCache, userLimitsApi, layergroupAffectedTables) { + surrogateKeysCache, userLimitsApi, layergroupAffectedTables, turboCartoCssAdapter) { BaseController.call(this, authApi, pgConnection); @@ -46,6 +46,7 @@ function MapController(authApi, pgConnection, templateMaps, mapBackend, metadata this.surrogateKeysCache = surrogateKeysCache; this.userLimitsApi = userLimitsApi; this.layergroupAffectedTables = layergroupAffectedTables; + this.turboCartoCssAdapter = turboCartoCssAdapter; this.namedLayersAdapter = new MapConfigNamedLayersAdapter(templateMaps); this.overviewsAdapter = new MapConfigOverviewsAdapter(this.overviewsMetadataApi); @@ -152,21 +153,37 @@ MapController.prototype.create = function(req, res, prepareConfigFn) { ); }, function addOverviewsInformation(err, requestMapConfig, datasource) { - assert.ifError(err); - var next = this; - self.overviewsAdapter.getLayers(req.context.user, requestMapConfig.layers, - function(err, layers) { - if (err) { - return next(err); - } + assert.ifError(err); + var next = this; + self.overviewsAdapter.getLayers(req.context.user, requestMapConfig.layers, function(err, layers) { + if (err) { + return next(err); + } - if (layers) { - requestMapConfig.layers = layers; - } - return next(null, requestMapConfig, datasource); + if (layers) { + requestMapConfig.layers = layers; + } + + return next(null, requestMapConfig, datasource); } ); }, + function parseTurboCartoCss(err, requestMapConfig, datasource) { + assert.ifError(err); + + var next = this; + self.turboCartoCssAdapter.getLayers(req.context.user, requestMapConfig.layers, function (err, layers) { + if (err) { + return next(err); + } + + if (layers) { + requestMapConfig.layers = layers; + } + + return next(null, requestMapConfig, datasource); + }); + }, function createLayergroup(err, requestMapConfig, datasource) { assert.ifError(err); mapConfig = new MapConfig(requestMapConfig, datasource || Datasource.EmptyDatasource()); diff --git a/lib/cartodb/server.js b/lib/cartodb/server.js index 39884850..ac1f185d 100644 --- a/lib/cartodb/server.js +++ b/lib/cartodb/server.js @@ -30,6 +30,8 @@ var PgConnection = require('./backends/pg_connection'); var timeoutErrorTilePath = __dirname + '/../../assets/render-timeout-fallback.png'; var timeoutErrorTile = require('fs').readFileSync(timeoutErrorTilePath, {encoding: null}); +var TurboCartocssParser = require('./utils/style/turbo-cartocss-parser'); +var TurboCartocssAdapter = require('./utils/style/turbo-cartocss-adapter'); module.exports = function(serverOptions) { // Make stats client globally accessible @@ -150,6 +152,9 @@ module.exports = function(serverOptions) { var TablesExtentApi = require('./api/tables_extent_api'); var tablesExtentApi = new TablesExtentApi(pgQueryRunner); + var turboCartoCssParser = new TurboCartocssParser(pgQueryRunner); + var turboCartocssAdapter = new TurboCartocssAdapter(turboCartoCssParser); + /******************************************************************************************************************* * Routing ******************************************************************************************************************/ @@ -176,7 +181,8 @@ module.exports = function(serverOptions) { overviewsMetadataApi, surrogateKeysCache, userLimitsApi, - layergroupAffectedTablesCache + layergroupAffectedTablesCache, + turboCartocssAdapter ).register(app); new controller.NamedMaps( diff --git a/lib/cartodb/utils/style/postgres-datasource.js b/lib/cartodb/utils/style/postgres-datasource.js new file mode 100644 index 00000000..fd6e02c1 --- /dev/null +++ b/lib/cartodb/utils/style/postgres-datasource.js @@ -0,0 +1,55 @@ +'use strict'; + +var dot = require('dot'); +dot.templateSettings.strip = false; + +function createTemplate(method) { + return dot.template([ + 'SELECT', + method, + 'FROM ({{=it._sql}}) _table_sql WHERE {{=it._column}} IS NOT NULL' + ].join('\n')); +} + +var methods = { + quantiles: 'CDB_QuantileBins(array_agg(distinct({{=it._column}}::numeric)), {{=it._buckets}}) as quantiles', + equal: 'CDB_EqualIntervalBins(array_agg({{=it._column}}::numeric), {{=it._buckets}}) as equal', + jenks: 'CDB_JenksBins(array_agg(distinct({{=it._column}}::numeric)), {{=it._buckets}}) as jenks', + headtails: 'CDB_HeadsTailsBins(array_agg(distinct({{=it._column}}::numeric)), {{=it._buckets}}) as headtails' +}; + +var methodTemplates = Object.keys(methods).reduce(function(methodTemplates, methodName) { + methodTemplates[methodName] = createTemplate(methods[methodName]); + return methodTemplates; +}, {}); + +function PostgresDatasource (pgQueryRunner, username, query) { + this.pgQueryRunner = pgQueryRunner; + this.username = username; + this.query = query; +} + +PostgresDatasource.prototype.getName = function () { + return 'PostgresDatasource'; +}; + +PostgresDatasource.prototype.getRamp = function (column, buckets, method, callback) { + var methodName = methods.hasOwnProperty(method) ? method : 'quantiles'; + var template = methodTemplates[methodName]; + + var query = template({ _column: column, _sql: this.query, _buckets: buckets }); + + this.pgQueryRunner.run(this.username, query, function (err, result) { + if (err) { + return callback(err); + } + + var ramp = result[0][methodName].sort(function(a, b) { + return a - b; + }); + + return callback(null, ramp); + }); +}; + +module.exports = PostgresDatasource; diff --git a/lib/cartodb/utils/style/turbo-cartocss-adapter.js b/lib/cartodb/utils/style/turbo-cartocss-adapter.js new file mode 100644 index 00000000..873f8a2d --- /dev/null +++ b/lib/cartodb/utils/style/turbo-cartocss-adapter.js @@ -0,0 +1,55 @@ +'use strict'; + +var queue = require('queue-async'); + +function TurboCartocssAdapter(turboCartocssParser) { + this.turboCartocssParser = turboCartocssParser; +} + +module.exports = TurboCartocssAdapter; + +TurboCartocssAdapter.prototype.getLayers = function (username, layers, callback) { + var self = this; + + if (!layers || layers.length === 0) { + return callback(null, layers); + } + + var parseCartoCssQueue = queue(layers.length); + + layers.forEach(function(layer) { + parseCartoCssQueue.defer(self._parseCartoCss.bind(self), username, layer); + }); + + parseCartoCssQueue.awaitAll(function (err, layers) { + if (err) { + return callback(err); + } + + return callback(null, layers); + }); +}; + +TurboCartocssAdapter.prototype._parseCartoCss = function (username, layer, callback) { + if (isNotLayerToParseCartocss(layer)) { + return callback(null, layer); + } + + this.turboCartocssParser.process(username, layer.options.cartocss, layer.options.sql, function (err, cartocss) { + if (err) { + return callback(err); + } + + layer.options.cartocss = cartocss; + + callback(null, layer); + }); +}; + +function isNotLayerToParseCartocss(layer) { + if ( layer.type !== 'mapnik' && layer.type !== 'cartodb' && layer.type !== 'torque' ) { + return true; + } + + return false; +} diff --git a/lib/cartodb/utils/style/turbo-cartocss-parser.js b/lib/cartodb/utils/style/turbo-cartocss-parser.js new file mode 100644 index 00000000..19a7f9c0 --- /dev/null +++ b/lib/cartodb/utils/style/turbo-cartocss-parser.js @@ -0,0 +1,15 @@ +'use strict'; + +var turboCartoCss = require('turbo-cartocss'); +var PostgresDatasource = require('./postgres-datasource'); + +function TurboCartocssParser (pgQueryRunner) { + this.pgQueryRunner = pgQueryRunner; +} + +module.exports = TurboCartocssParser; + +TurboCartocssParser.prototype.process = function (username, cartocss, sql, callback) { + var datasource = new PostgresDatasource(this.pgQueryRunner, username, sql); + turboCartoCss(cartocss, datasource, callback); +}; diff --git a/package.json b/package.json index 60eb890e..a225567c 100644 --- a/package.json +++ b/package.json @@ -37,7 +37,8 @@ "lru-cache": "2.6.5", "lzma": "~1.3.7", "log4js": "https://github.com/CartoDB/log4js-node/tarball/cdb", - "cartodb-query-tables": "https://github.com/CartoDB/node-cartodb-query-tables/tarball/master" + "cartodb-query-tables": "https://github.com/CartoDB/node-cartodb-query-tables/tarball/master", + "turbo-cartocss": "0.4.0" }, "devDependencies": { "istanbul": "~0.3.6", diff --git a/test/acceptance/multilayer_server.js b/test/acceptance/multilayer_server.js index e443f3aa..7462b0eb 100644 --- a/test/acceptance/multilayer_server.js +++ b/test/acceptance/multilayer_server.js @@ -71,8 +71,8 @@ describe('tests from old api translated to multilayer', function() { }, function(res) { var parsed = JSON.parse(res.body); - assert.ok(parsed.errors[0].match(/^style0/)); - assert.ok(parsed.errors[0].match(/missing closing/)); + assert.ok(parsed.errors[0]);q + assert.ok(parsed.errors[0].match(/Unclosed block/)); done(); } ); From 3e0c19a669e041e0d498aabf4681484a32931ed2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Garc=C3=ADa=20Aubert?= Date: Tue, 8 Mar 2016 14:41:10 +0100 Subject: [PATCH 02/17] Fixed typo --- lib/cartodb/controllers/map.js | 2 ++ test/acceptance/multilayer_server.js | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/lib/cartodb/controllers/map.js b/lib/cartodb/controllers/map.js index 54d018f1..0e48c806 100644 --- a/lib/cartodb/controllers/map.js +++ b/lib/cartodb/controllers/map.js @@ -281,6 +281,8 @@ MapController.prototype.instantiateTemplate = function(req, res, prepareParamsFn res.set('X-Layergroup-Id', layergroup.layergroupid); self.surrogateKeysCache.tag(res, new NamedMapsCacheEntry(cdbuser, mapConfigProvider.getTemplateName())); + console.log(layergroup); + self.send(req, res, layergroup, 200); } } diff --git a/test/acceptance/multilayer_server.js b/test/acceptance/multilayer_server.js index 7462b0eb..1594d1ac 100644 --- a/test/acceptance/multilayer_server.js +++ b/test/acceptance/multilayer_server.js @@ -71,7 +71,7 @@ describe('tests from old api translated to multilayer', function() { }, function(res) { var parsed = JSON.parse(res.body); - assert.ok(parsed.errors[0]);q + assert.ok(parsed.errors[0]); assert.ok(parsed.errors[0].match(/Unclosed block/)); done(); } From ecd33e5561c54b0a174948158e6054e171ffa184 Mon Sep 17 00:00:00 2001 From: Raul Ochoa Date: Wed, 2 Mar 2016 12:40:53 +0100 Subject: [PATCH 03/17] TestClient with method to retrieve tiles --- test/support/test-client.js | 113 +++++++++++++++++++++++++++++++++++- 1 file changed, 112 insertions(+), 1 deletion(-) diff --git a/test/support/test-client.js b/test/support/test-client.js index d2df611b..1a29f564 100644 --- a/test/support/test-client.js +++ b/test/support/test-client.js @@ -3,6 +3,8 @@ var qs = require('querystring'); var step = require('step'); +var mapnik = require('windshaft').mapnik; + var LayergroupToken = require('../../lib/cartodb/models/layergroup_token'); var assert = require('./assert'); @@ -13,8 +15,9 @@ var serverOptions = require('../../lib/cartodb/server_options'); var server = new CartodbWindshaft(serverOptions); -function TestClient(mapConfig) { +function TestClient(mapConfig, apiKey) { this.mapConfig = mapConfig; + this.apiKey = apiKey; this.keysToDelete = {}; } @@ -114,6 +117,114 @@ TestClient.prototype.getWidget = function(widgetName, params, callback) { ); }; +TestClient.prototype.getTile = function(z, x, y, params, callback) { + var self = this; + + if (!callback) { + callback = params; + params = {}; + } + + var url = '/api/v1/map'; + + if (this.apiKey) { + url += '?' + qs.stringify({api_key: this.apiKey}); + } + + var layergroupId; + step( + function createLayergroup() { + var next = this; + assert.response(server, + { + url: url, + method: 'POST', + headers: { + host: 'localhost', + 'Content-Type': 'application/json' + }, + data: JSON.stringify(self.mapConfig) + }, + { + status: 200, + headers: { + 'Content-Type': 'application/json; charset=utf-8' + } + }, + function(res, err) { + if (err) { + return next(err); + } + return next(null, JSON.parse(res.body).layergroupid); + } + ); + }, + function getTileResult(err, _layergroupId) { + assert.ifError(err); + + var next = this; + layergroupId = _layergroupId; + + url = '/api/v1/map/' + layergroupId + '/'; + + var layers = params.layers; + if (!!layers) { + layers = Array.isArray(layers) ? layers : [layers]; + url += layers.join(',') + '/'; + } + + var format = params.format || 'png'; + + url += [z,x,y].join('/'); + url += '.' + format; + + if (self.apiKey) { + url += '?' + qs.stringify({api_key: self.apiKey}); + } + + var request = { + url: url, + method: 'GET', + headers: { + host: 'localhost' + } + }; + + + var expectedResponse = { + status: 200, + headers: { + 'Content-Type': 'application/json; charset=utf-8' + } + }; + + var isPng = format === 'png'; + + if (isPng) { + request.encoding = 'binary'; + expectedResponse.headers['Content-Type'] = 'image/png'; + } + + assert.response(server, request, expectedResponse, function(res, err) { + assert.ifError(err); + + var image; + + if (isPng) { + image = mapnik.Image.fromBytes(new Buffer(res.body, 'binary')); + } + + next(null, res, image); + }); + }, + function finish(err, res, image) { + self.keysToDelete['map_cfg|' + LayergroupToken.parse(layergroupId).token] = 0; + self.keysToDelete['user:localhost:mapviews:global'] = 5; + return callback(err, res, image); + } + ); +}; + TestClient.prototype.drain = function(callback) { helper.deleteRedisKeys(this.keysToDelete, callback); }; From affa254b9d9740b8744e1eca10b29478492d18e5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Garc=C3=ADa=20Aubert?= Date: Tue, 8 Mar 2016 20:06:43 +0100 Subject: [PATCH 04/17] Moved and adapted acceptance test for turbo-cartocss integration --- lib/cartodb/controllers/map.js | 2 - test/acceptance/turbo-cartocss-regressions.js | 67 +++++++++ test/acceptance/turbo-cartocss.js | 128 ++++++++++++++++++ ...est_turbo_cartocss_greens_13_4011_3088.png | Bin 0 -> 1710 bytes .../test_turbo_cartocss_reds_13_4011_3088.png | Bin 0 -> 1717 bytes ...es_simple_reduced-turbo-cartocss-2.2.1.png | Bin 0 -> 53192 bytes test/support/prepare_db.sh | 2 +- test/support/test-client.js | 6 +- 8 files changed, 199 insertions(+), 6 deletions(-) create mode 100644 test/acceptance/turbo-cartocss-regressions.js create mode 100644 test/acceptance/turbo-cartocss.js create mode 100644 test/fixtures/test_turbo_cartocss_greens_13_4011_3088.png create mode 100644 test/fixtures/test_turbo_cartocss_reds_13_4011_3088.png create mode 100644 test/fixtures/torque/populated_places_simple_reduced-turbo-cartocss-2.2.1.png diff --git a/lib/cartodb/controllers/map.js b/lib/cartodb/controllers/map.js index 0e48c806..54d018f1 100644 --- a/lib/cartodb/controllers/map.js +++ b/lib/cartodb/controllers/map.js @@ -281,8 +281,6 @@ MapController.prototype.instantiateTemplate = function(req, res, prepareParamsFn res.set('X-Layergroup-Id', layergroup.layergroupid); self.surrogateKeysCache.tag(res, new NamedMapsCacheEntry(cdbuser, mapConfigProvider.getTemplateName())); - console.log(layergroup); - self.send(req, res, layergroup, 200); } } diff --git a/test/acceptance/turbo-cartocss-regressions.js b/test/acceptance/turbo-cartocss-regressions.js new file mode 100644 index 00000000..c429645b --- /dev/null +++ b/test/acceptance/turbo-cartocss-regressions.js @@ -0,0 +1,67 @@ +require('../support/test_helper'); + +var assert = require('../support/assert'); +var TestClient = require('../support/test-client'); + +function makeMapconfig(cartocss) { + return { + "version": "1.4.0", + "layers": [ + { + "type": 'mapnik', + "options": { + "cartocss_version": '2.3.0', + "sql": [ + 'SELECT test_table.*, _prices.price FROM test_table JOIN (' + + ' SELECT 1 AS cartodb_id, 10.00 AS price', + ' UNION', + ' SELECT 2, 10.50', + ' UNION', + ' SELECT 3, 11.00', + ' UNION', + ' SELECT 4, 12.00', + ' UNION', + ' SELECT 5, 21.00', + ') _prices ON _prices.cartodb_id = test_table.cartodb_id' + ].join('\n'), + "cartocss": cartocss + } + } + ] + }; +} + +describe.skip('turbo-cartocss regressions', function() { + + it('should accept // comments', function(done) { + var cartocss = [ + "/** simple visualization */", + "", + "Map {", + " buffer-size: 256;", + "}", + "", + "#county_points_with_population{", + " marker-fill-opacity: 0.1;", + " marker-line-color:#FFFFFF;//#CF1C90;", + " marker-line-width: 0;", + " marker-line-opacity: 0.3;", + " marker-placement: point;", + " marker-type: ellipse;", + " //marker-comp-op: overlay;", + " marker-width: [price];", + " [zoom=5]{marker-width: [price]*2;}", + " [zoom=6]{marker-width: [price]*4;}", + " marker-fill: #000000;", + " marker-allow-overlap: true;", + " ", + "", + "}" + ].join('\n'); + var testClient = new TestClient(makeMapconfig(cartocss)); + testClient.createLayergroup(function(err) { + assert.ok(!err, err); + done(); + }); + }); +}); diff --git a/test/acceptance/turbo-cartocss.js b/test/acceptance/turbo-cartocss.js new file mode 100644 index 00000000..ae2de717 --- /dev/null +++ b/test/acceptance/turbo-cartocss.js @@ -0,0 +1,128 @@ +var assert = require('../support/assert'); +var TestClient = require('../support/test-client'); + +var IMAGE_TOLERANCE_PER_MIL = 20; + +function imageCompareFn(fixture, done) { + return function(err, res, image) { + assert.ok(!err, err); + assert.imageIsSimilarToFile(image, './test/fixtures/' + fixture, IMAGE_TOLERANCE_PER_MIL, done); + }; +} + +function makeMapconfig(cartocss) { + return { + "version": "1.4.0", + "layers": [ + { + "type": 'mapnik', + "options": { + "cartocss_version": '2.3.0', + "sql": [ + 'SELECT test_table.*, _prices.price FROM test_table JOIN (' + + ' SELECT 1 AS cartodb_id, 10.00 AS price', + ' UNION', + ' SELECT 2, 10.50', + ' UNION', + ' SELECT 3, 11.00', + ' UNION', + ' SELECT 4, 12.00', + ' UNION', + ' SELECT 5, 21.00', + ') _prices ON _prices.cartodb_id = test_table.cartodb_id' + ].join('\n'), + "cartocss": cartocss + } + } + ] + }; +} + +describe('turbo-cartocss', function() { + describe('parsing ramp function with colorbrewer for greens and mapnik renderer', function () { + beforeEach(function () { + var turboCartocss = '#layer { marker-fill: ramp([price], colorbrewer(Greens)); }'; + this.testClient = new TestClient(makeMapconfig(turboCartocss)); + }); + + afterEach(function (done) { + this.testClient.drain(done); + }); + + it('should get a tile with turbo-cartocss parsed properly', function (done) { + var fixturePath = 'test_turbo_cartocss_greens_13_4011_3088.png'; + this.testClient.getTile(13, 4011, 3088, imageCompareFn(fixturePath, done)); + }); + }); + + describe('parsing ramp function with colorbrewer for reds and mapnik renderer', function () { + beforeEach(function () { + var turboCartocss = '#layer { marker-fill: ramp([price], colorbrewer(Reds)); }'; + this.testClient = new TestClient(makeMapconfig(turboCartocss)); + }); + + afterEach(function (done) { + this.testClient.drain(done); + }); + + it('should get a tile with turbo-cartocss parsed properly', function (done) { + var fixtureFileName = 'test_turbo_cartocss_reds_13_4011_3088.png'; + this.testClient.getTile(13, 4011, 3088, imageCompareFn(fixtureFileName, done)); + }); + }); + + describe('parsing ramp function with colorbrewer for greens and toque renderer', function () { + var mapConfig = { + version: '1.2.0', + layers: [ + { + type: 'torque', + options: { + sql: "SELECT * FROM populated_places_simple_reduced where the_geom" + + " && ST_MakeEnvelope(-90, 0, 90, 65)", + cartocss: [ + 'Map {', + ' buffer-size:0;', + ' -torque-frame-count:1;', + ' -torque-animation-duration:30;', + ' -torque-time-attribute:"cartodb_id";', + ' -torque-aggregation-function:"count(cartodb_id)";', + ' -torque-resolution:1;', + ' -torque-data-aggregation:linear;', + '};', + '#populated_places_simple_reduced {', + ' comp-op: multiply;', + ' marker-fill-opacity: 1;', + ' marker-line-color: #FFF;', + ' marker-line-width: 0;', + ' marker-line-opacity: 1;', + ' marker-type: rectangle;', + ' marker-width: 3;', + ' marker-fill: ramp([pop_max], colorbrewer(Greens));', + '};' + ].join(' '), + cartocss_version: '2.3.0' + } + } + ] + }; + + beforeEach(function () { + this.testClient = new TestClient(mapConfig); + }); + + afterEach(function (done) { + this.testClient.drain(done); + }); + + it('should get a tile with turbo-cartocss parsed properly', function (done) { + var z = 2; + var x = 2; + var y = 1; + + var pngFixture = 'torque/populated_places_simple_reduced-turbo-cartocss-' + [z, x, y].join('.') + '.png'; + + this.testClient.getTile(z, x, y, { layers: 0, format: 'torque.png' }, imageCompareFn(pngFixture, done)); + }); + }); +}); diff --git a/test/fixtures/test_turbo_cartocss_greens_13_4011_3088.png b/test/fixtures/test_turbo_cartocss_greens_13_4011_3088.png new file mode 100644 index 0000000000000000000000000000000000000000..062352d241c00380f6b3b5e9818485ed0bfe1c74 GIT binary patch literal 1710 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 literal 0 HcmV?d00001 diff --git a/test/fixtures/torque/populated_places_simple_reduced-turbo-cartocss-2.2.1.png b/test/fixtures/torque/populated_places_simple_reduced-turbo-cartocss-2.2.1.png new file mode 100644 index 0000000000000000000000000000000000000000..59f0d5c1d6ccf37772d4717312f4e43ce7126dff GIT binary patch literal 53192 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 literal 0 HcmV?d00001 diff --git a/test/support/prepare_db.sh b/test/support/prepare_db.sh index f573e819..f03d52de 100755 --- a/test/support/prepare_db.sh +++ b/test/support/prepare_db.sh @@ -80,7 +80,7 @@ if test x"$PREPARE_PGSQL" = xyes; then cat sql/_CDB_QueryStatements.sql | psql -v ON_ERROR_STOP=1 ${TEST_DB} || exit 1 - SQL_SCRIPTS='CDB_QueryTables CDB_CartodbfyTable CDB_TableMetadata CDB_ForeignTable CDB_UserTables CDB_ColumnNames CDB_ZoomFromScale CDB_Overviews' + SQL_SCRIPTS='CDB_QueryTables CDB_CartodbfyTable CDB_TableMetadata CDB_ForeignTable CDB_UserTables CDB_ColumnNames CDB_ZoomFromScale CDB_Overviews CDB_QuantileBins CDB_JenksBins CDB_HeadsTailsBins CDB_EqualIntervalBins' for i in ${SQL_SCRIPTS} do curl -L -s https://github.com/CartoDB/cartodb-postgresql/raw/master/scripts-available/$i.sql -o sql/$i.sql diff --git a/test/support/test-client.js b/test/support/test-client.js index 1a29f564..02128e36 100644 --- a/test/support/test-client.js +++ b/test/support/test-client.js @@ -168,7 +168,8 @@ TestClient.prototype.getTile = function(z, x, y, params, callback) { url = '/api/v1/map/' + layergroupId + '/'; var layers = params.layers; - if (!!layers) { + + if (layers !== undefined) { layers = Array.isArray(layers) ? layers : [layers]; url += layers.join(',') + '/'; } @@ -190,7 +191,6 @@ TestClient.prototype.getTile = function(z, x, y, params, callback) { } }; - var expectedResponse = { status: 200, headers: { @@ -198,7 +198,7 @@ TestClient.prototype.getTile = function(z, x, y, params, callback) { } }; - var isPng = format === 'png'; + var isPng = format === 'png' || format === 'torque.png'; if (isPng) { request.encoding = 'binary'; From c6fbb08c8f2b8be963f4942d96700df11c069fe2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Garc=C3=ADa=20Aubert?= Date: Wed, 9 Mar 2016 10:36:57 +0100 Subject: [PATCH 05/17] Regenerated npm-shrinkwrap --- npm-shrinkwrap.json | 1109 +++++++++++++++++++++++++++++++------------ 1 file changed, 816 insertions(+), 293 deletions(-) diff --git a/npm-shrinkwrap.json b/npm-shrinkwrap.json index 373ce17c..88c00b21 100644 --- a/npm-shrinkwrap.json +++ b/npm-shrinkwrap.json @@ -4,93 +4,93 @@ "dependencies": { "body-parser": { "version": "1.14.2", - "from": "body-parser@>=1.14.0 <1.15.0", + "from": "https://registry.npmjs.org/body-parser/-/body-parser-1.14.2.tgz", "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.14.2.tgz", "dependencies": { "bytes": { "version": "2.2.0", - "from": "bytes@2.2.0", + "from": "https://registry.npmjs.org/bytes/-/bytes-2.2.0.tgz", "resolved": "https://registry.npmjs.org/bytes/-/bytes-2.2.0.tgz" }, "content-type": { "version": "1.0.1", - "from": "content-type@>=1.0.1 <1.1.0", + "from": "https://registry.npmjs.org/content-type/-/content-type-1.0.1.tgz", "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.1.tgz" }, "depd": { "version": "1.1.0", - "from": "depd@>=1.1.0 <1.2.0", + "from": "https://registry.npmjs.org/depd/-/depd-1.1.0.tgz", "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.0.tgz" }, "http-errors": { "version": "1.3.1", - "from": "http-errors@>=1.3.1 <1.4.0", + "from": "https://registry.npmjs.org/http-errors/-/http-errors-1.3.1.tgz", "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.3.1.tgz", "dependencies": { "inherits": { "version": "2.0.1", - "from": "inherits@>=2.0.1 <2.1.0", + "from": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz" }, "statuses": { "version": "1.2.1", - "from": "statuses@>=1.0.0 <2.0.0", + "from": "https://registry.npmjs.org/statuses/-/statuses-1.2.1.tgz", "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.2.1.tgz" } } }, "iconv-lite": { "version": "0.4.13", - "from": "iconv-lite@0.4.13", + "from": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.13.tgz", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.13.tgz" }, "on-finished": { "version": "2.3.0", - "from": "on-finished@>=2.3.0 <2.4.0", + "from": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", "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", + "from": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz" } } }, "qs": { "version": "5.2.0", - "from": "qs@5.2.0", + "from": "https://registry.npmjs.org/qs/-/qs-5.2.0.tgz", "resolved": "https://registry.npmjs.org/qs/-/qs-5.2.0.tgz" }, "raw-body": { "version": "2.1.5", - "from": "raw-body@>=2.1.5 <2.2.0", + "from": "https://registry.npmjs.org/raw-body/-/raw-body-2.1.5.tgz", "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.1.5.tgz", "dependencies": { "unpipe": { "version": "1.0.0", - "from": "unpipe@1.0.0", + "from": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz" } } }, "type-is": { "version": "1.6.11", - "from": "type-is@>=1.6.10 <1.7.0", + "from": "https://registry.npmjs.org/type-is/-/type-is-1.6.11.tgz", "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.11.tgz", "dependencies": { "media-typer": { "version": "0.3.0", - "from": "media-typer@0.3.0", + "from": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz" }, "mime-types": { "version": "2.1.9", - "from": "mime-types@>=2.1.9 <2.2.0", + "from": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.9.tgz", "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.9.tgz", "dependencies": { "mime-db": { "version": "1.21.0", - "from": "mime-db@>=1.21.0 <1.22.0", + "from": "https://registry.npmjs.org/mime-db/-/mime-db-1.21.0.tgz", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.21.0.tgz" } } @@ -101,61 +101,66 @@ }, "cartodb-psql": { "version": "0.4.0", - "from": "cartodb-psql@>=0.4.0 <0.5.0", + "from": "https://registry.npmjs.org/cartodb-psql/-/cartodb-psql-0.4.0.tgz", "resolved": "https://registry.npmjs.org/cartodb-psql/-/cartodb-psql-0.4.0.tgz", "dependencies": { "pg": { "version": "2.6.2-cdb1", - "from": "git://github.com/CartoDB/node-postgres.git#2.6.2-cdb1", + "from": "git://github.com/CartoDB/node-postgres.git#836a2dc3131e873fc4ba20cd16e7fb69a7dca98a", "resolved": "git://github.com/CartoDB/node-postgres.git#836a2dc3131e873fc4ba20cd16e7fb69a7dca98a", "dependencies": { "generic-pool": { "version": "2.0.3", - "from": "generic-pool@2.0.3", + "from": "https://registry.npmjs.org/generic-pool/-/generic-pool-2.0.3.tgz", "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", + "from": "https://registry.npmjs.org/buffer-writer/-/buffer-writer-1.0.0.tgz", "resolved": "https://registry.npmjs.org/buffer-writer/-/buffer-writer-1.0.0.tgz" } } } } }, + "cartodb-query-tables": { + "version": "0.1.0", + "from": "https://github.com/CartoDB/node-cartodb-query-tables/tarball/master", + "resolved": "https://github.com/CartoDB/node-cartodb-query-tables/tarball/master" + }, "cartodb-redis": { "version": "0.13.0", - "from": "cartodb-redis@>=0.13.0 <0.14.0", + "from": "https://registry.npmjs.org/cartodb-redis/-/cartodb-redis-0.13.0.tgz", "resolved": "https://registry.npmjs.org/cartodb-redis/-/cartodb-redis-0.13.0.tgz", "dependencies": { "redis-mpool": { "version": "0.1.0", - "from": "git://github.com/CartoDB/node-redis-mpool.git#0.1.0", + "from": "git://github.com/CartoDB/node-redis-mpool.git#47510b8d4525ee24aa2e5328976372274a1d144e", "resolved": "git://github.com/CartoDB/node-redis-mpool.git#47510b8d4525ee24aa2e5328976372274a1d144e", "dependencies": { "generic-pool": { "version": "2.1.1", - "from": "generic-pool@>=2.1.1 <2.2.0", + "from": "https://registry.npmjs.org/generic-pool/-/generic-pool-2.1.1.tgz", "resolved": "https://registry.npmjs.org/generic-pool/-/generic-pool-2.1.1.tgz" }, "redis": { "version": "0.12.1", - "from": "redis@>=0.12.1 <0.13.0", + "from": "https://registry.npmjs.org/redis/-/redis-0.12.1.tgz", "resolved": "https://registry.npmjs.org/redis/-/redis-0.12.1.tgz" }, "hiredis": { "version": "0.1.17", - "from": "hiredis@>=0.1.17 <0.2.0", + "from": "https://registry.npmjs.org/hiredis/-/hiredis-0.1.17.tgz", "resolved": "https://registry.npmjs.org/hiredis/-/hiredis-0.1.17.tgz", "dependencies": { "bindings": { "version": "1.2.1", - "from": "bindings@*", + "from": "https://registry.npmjs.org/bindings/-/bindings-1.2.1.tgz", "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.2.1.tgz" }, "nan": { "version": "1.1.2", - "from": "nan@>=1.1.0 <1.2.0", + "from": "https://registry.npmjs.org/nan/-/nan-1.1.2.tgz", "resolved": "https://registry.npmjs.org/nan/-/nan-1.1.2.tgz" } } @@ -166,228 +171,228 @@ }, "debug": { "version": "2.2.0", - "from": "debug@>=2.2.0 <2.3.0", + "from": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz", "resolved": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz", "dependencies": { "ms": { "version": "0.7.1", - "from": "ms@0.7.1", + "from": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz", "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz" } } }, "dot": { "version": "1.0.3", - "from": "dot@>=1.0.2 <1.1.0", + "from": "https://registry.npmjs.org/dot/-/dot-1.0.3.tgz", "resolved": "https://registry.npmjs.org/dot/-/dot-1.0.3.tgz" }, "express": { "version": "4.13.4", - "from": "express@>=4.13.3 <4.14.0", + "from": "https://registry.npmjs.org/express/-/express-4.13.4.tgz", "resolved": "https://registry.npmjs.org/express/-/express-4.13.4.tgz", "dependencies": { "accepts": { "version": "1.2.13", - "from": "accepts@>=1.2.12 <1.3.0", + "from": "https://registry.npmjs.org/accepts/-/accepts-1.2.13.tgz", "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.2.13.tgz", "dependencies": { "mime-types": { "version": "2.1.9", - "from": "mime-types@>=2.1.6 <2.2.0", + "from": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.9.tgz", "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.9.tgz", "dependencies": { "mime-db": { "version": "1.21.0", - "from": "mime-db@>=1.21.0 <1.22.0", + "from": "https://registry.npmjs.org/mime-db/-/mime-db-1.21.0.tgz", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.21.0.tgz" } } }, "negotiator": { "version": "0.5.3", - "from": "negotiator@0.5.3", + "from": "https://registry.npmjs.org/negotiator/-/negotiator-0.5.3.tgz", "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.5.3.tgz" } } }, "array-flatten": { "version": "1.1.1", - "from": "array-flatten@1.1.1", + "from": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz" }, "content-disposition": { "version": "0.5.1", - "from": "content-disposition@0.5.1", + "from": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.1.tgz", "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.1.tgz" }, "content-type": { "version": "1.0.1", - "from": "content-type@>=1.0.1 <1.1.0", + "from": "https://registry.npmjs.org/content-type/-/content-type-1.0.1.tgz", "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.1.tgz" }, "cookie": { "version": "0.1.5", - "from": "cookie@0.1.5", + "from": "https://registry.npmjs.org/cookie/-/cookie-0.1.5.tgz", "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.1.5.tgz" }, "cookie-signature": { "version": "1.0.6", - "from": "cookie-signature@1.0.6", + "from": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz" }, "depd": { "version": "1.1.0", - "from": "depd@>=1.1.0 <1.2.0", + "from": "https://registry.npmjs.org/depd/-/depd-1.1.0.tgz", "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.0.tgz" }, "escape-html": { "version": "1.0.3", - "from": "escape-html@>=1.0.3 <1.1.0", + "from": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz" }, "etag": { "version": "1.7.0", - "from": "etag@>=1.7.0 <1.8.0", + "from": "https://registry.npmjs.org/etag/-/etag-1.7.0.tgz", "resolved": "https://registry.npmjs.org/etag/-/etag-1.7.0.tgz" }, "finalhandler": { "version": "0.4.1", - "from": "finalhandler@0.4.1", + "from": "https://registry.npmjs.org/finalhandler/-/finalhandler-0.4.1.tgz", "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-0.4.1.tgz", "dependencies": { "unpipe": { "version": "1.0.0", - "from": "unpipe@>=1.0.0 <1.1.0", + "from": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz" } } }, "fresh": { "version": "0.3.0", - "from": "fresh@0.3.0", + "from": "https://registry.npmjs.org/fresh/-/fresh-0.3.0.tgz", "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.3.0.tgz" }, "merge-descriptors": { "version": "1.0.1", - "from": "merge-descriptors@1.0.1", + "from": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz" }, "methods": { "version": "1.1.2", - "from": "methods@>=1.1.2 <1.2.0", + "from": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz" }, "on-finished": { "version": "2.3.0", - "from": "on-finished@>=2.3.0 <2.4.0", + "from": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", "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", + "from": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz" } } }, "parseurl": { "version": "1.3.1", - "from": "parseurl@>=1.3.1 <1.4.0", + "from": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.1.tgz", "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.1.tgz" }, "path-to-regexp": { "version": "0.1.7", - "from": "path-to-regexp@0.1.7", + "from": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz" }, "proxy-addr": { "version": "1.0.10", - "from": "proxy-addr@>=1.0.10 <1.1.0", + "from": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-1.0.10.tgz", "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-1.0.10.tgz", "dependencies": { "forwarded": { "version": "0.1.0", - "from": "forwarded@>=0.1.0 <0.2.0", + "from": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.0.tgz", "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.0.tgz" }, "ipaddr.js": { "version": "1.0.5", - "from": "ipaddr.js@1.0.5", + "from": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.0.5.tgz", "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.0.5.tgz" } } }, "qs": { "version": "4.0.0", - "from": "qs@4.0.0", + "from": "https://registry.npmjs.org/qs/-/qs-4.0.0.tgz", "resolved": "https://registry.npmjs.org/qs/-/qs-4.0.0.tgz" }, "range-parser": { "version": "1.0.3", - "from": "range-parser@>=1.0.3 <1.1.0", + "from": "https://registry.npmjs.org/range-parser/-/range-parser-1.0.3.tgz", "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.0.3.tgz" }, "send": { "version": "0.13.1", - "from": "send@0.13.1", + "from": "https://registry.npmjs.org/send/-/send-0.13.1.tgz", "resolved": "https://registry.npmjs.org/send/-/send-0.13.1.tgz", "dependencies": { "destroy": { "version": "1.0.4", - "from": "destroy@>=1.0.4 <1.1.0", + "from": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz" }, "http-errors": { "version": "1.3.1", - "from": "http-errors@>=1.3.1 <1.4.0", + "from": "https://registry.npmjs.org/http-errors/-/http-errors-1.3.1.tgz", "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.3.1.tgz", "dependencies": { "inherits": { "version": "2.0.1", - "from": "inherits@>=2.0.1 <2.1.0", + "from": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz" } } }, "mime": { "version": "1.3.4", - "from": "mime@1.3.4", + "from": "https://registry.npmjs.org/mime/-/mime-1.3.4.tgz", "resolved": "https://registry.npmjs.org/mime/-/mime-1.3.4.tgz" }, "ms": { "version": "0.7.1", - "from": "ms@0.7.1", + "from": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz", "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz" }, "statuses": { "version": "1.2.1", - "from": "statuses@>=1.2.1 <1.3.0", + "from": "https://registry.npmjs.org/statuses/-/statuses-1.2.1.tgz", "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.2.1.tgz" } } }, "serve-static": { "version": "1.10.2", - "from": "serve-static@>=1.10.2 <1.11.0", + "from": "https://registry.npmjs.org/serve-static/-/serve-static-1.10.2.tgz", "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.10.2.tgz" }, "type-is": { "version": "1.6.11", - "from": "type-is@>=1.6.6 <1.7.0", + "from": "https://registry.npmjs.org/type-is/-/type-is-1.6.11.tgz", "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.11.tgz", "dependencies": { "media-typer": { "version": "0.3.0", - "from": "media-typer@0.3.0", + "from": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz" }, "mime-types": { "version": "2.1.9", - "from": "mime-types@>=2.1.6 <2.2.0", + "from": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.9.tgz", "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.9.tgz", "dependencies": { "mime-db": { "version": "1.21.0", - "from": "mime-db@>=1.21.0 <1.22.0", + "from": "https://registry.npmjs.org/mime-db/-/mime-db-1.21.0.tgz", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.21.0.tgz" } } @@ -396,19 +401,19 @@ }, "utils-merge": { "version": "1.0.0", - "from": "utils-merge@1.0.0", + "from": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.0.tgz", "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.0.tgz" }, "vary": { "version": "1.0.1", - "from": "vary@>=1.0.1 <1.1.0", + "from": "https://registry.npmjs.org/vary/-/vary-1.0.1.tgz", "resolved": "https://registry.npmjs.org/vary/-/vary-1.0.1.tgz" } } }, "fastly-purge": { "version": "1.0.1", - "from": "fastly-purge@>=1.0.1 <1.1.0", + "from": "https://registry.npmjs.org/fastly-purge/-/fastly-purge-1.0.1.tgz", "resolved": "https://registry.npmjs.org/fastly-purge/-/fastly-purge-1.0.1.tgz" }, "log4js": { @@ -418,101 +423,96 @@ "dependencies": { "async": { "version": "0.2.10", - "from": "async@>=0.2.0 <0.3.0", + "from": "https://registry.npmjs.org/async/-/async-0.2.10.tgz", "resolved": "https://registry.npmjs.org/async/-/async-0.2.10.tgz" }, "readable-stream": { "version": "1.0.33", - "from": "readable-stream@>=1.0.2 <1.1.0", + "from": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.33.tgz", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.33.tgz", "dependencies": { "core-util-is": { "version": "1.0.2", - "from": "core-util-is@>=1.0.0 <1.1.0", + "from": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz" }, "isarray": { "version": "0.0.1", - "from": "isarray@0.0.1", + "from": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz" }, "string_decoder": { "version": "0.10.31", - "from": "string_decoder@>=0.10.0 <0.11.0", + "from": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz" }, "inherits": { "version": "2.0.1", - "from": "inherits@>=2.0.1 <2.1.0", + "from": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz" } } }, "semver": { "version": "4.3.6", - "from": "semver@>=4.3.3 <4.4.0", + "from": "https://registry.npmjs.org/semver/-/semver-4.3.6.tgz", "resolved": "https://registry.npmjs.org/semver/-/semver-4.3.6.tgz" }, "underscore": { "version": "1.8.2", - "from": "underscore@1.8.2", + "from": "https://registry.npmjs.org/underscore/-/underscore-1.8.2.tgz", "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.8.2.tgz" } } }, "lru-cache": { "version": "2.6.5", - "from": "lru-cache@2.6.5", + "from": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.6.5.tgz", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.6.5.tgz" }, "lzma": { "version": "1.3.7", - "from": "lzma@>=1.3.7 <1.4.0", + "from": "https://registry.npmjs.org/lzma/-/lzma-1.3.7.tgz", "resolved": "https://registry.npmjs.org/lzma/-/lzma-1.3.7.tgz" }, - "cartodb-query-tables": { - "version": "0.1.0", - "from": "https://github.com/CartoDB/node-cartodb-query-tables/tarball/master", - "resolved": "https://github.com/CartoDB/node-cartodb-query-tables/tarball/master" - }, "node-statsd": { "version": "0.0.7", - "from": "node-statsd@>=0.0.7 <0.1.0", + "from": "https://registry.npmjs.org/node-statsd/-/node-statsd-0.0.7.tgz", "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 <1.1.0", + "from": "https://registry.npmjs.org/queue-async/-/queue-async-1.0.7.tgz", "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 <0.5.0", + "from": "https://registry.npmjs.org/redis-mpool/-/redis-mpool-0.4.0.tgz", "resolved": "https://registry.npmjs.org/redis-mpool/-/redis-mpool-0.4.0.tgz", "dependencies": { "generic-pool": { "version": "2.1.1", - "from": "generic-pool@>=2.1.1 <2.2.0", + "from": "https://registry.npmjs.org/generic-pool/-/generic-pool-2.1.1.tgz", "resolved": "https://registry.npmjs.org/generic-pool/-/generic-pool-2.1.1.tgz" }, "redis": { "version": "0.12.1", - "from": "redis@>=0.12.1 <0.13.0", + "from": "https://registry.npmjs.org/redis/-/redis-0.12.1.tgz", "resolved": "https://registry.npmjs.org/redis/-/redis-0.12.1.tgz" }, "hiredis": { "version": "0.1.17", - "from": "hiredis@>=0.1.17 <0.2.0", + "from": "https://registry.npmjs.org/hiredis/-/hiredis-0.1.17.tgz", "resolved": "https://registry.npmjs.org/hiredis/-/hiredis-0.1.17.tgz", "dependencies": { "bindings": { "version": "1.2.1", - "from": "bindings@*", + "from": "https://registry.npmjs.org/bindings/-/bindings-1.2.1.tgz", "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.2.1.tgz" }, "nan": { "version": "1.1.2", - "from": "nan@>=1.1.0 <1.2.0", + "from": "https://registry.npmjs.org/nan/-/nan-1.1.2.tgz", "resolved": "https://registry.npmjs.org/nan/-/nan-1.1.2.tgz" } } @@ -521,47 +521,47 @@ }, "request": { "version": "2.62.0", - "from": "request@>=2.62.0 <2.63.0", + "from": "https://registry.npmjs.org/request/-/request-2.62.0.tgz", "resolved": "https://registry.npmjs.org/request/-/request-2.62.0.tgz", "dependencies": { "bl": { "version": "1.0.2", - "from": "bl@>=1.0.0 <1.1.0", + "from": "https://registry.npmjs.org/bl/-/bl-1.0.2.tgz", "resolved": "https://registry.npmjs.org/bl/-/bl-1.0.2.tgz", "dependencies": { "readable-stream": { "version": "2.0.5", - "from": "readable-stream@>=2.0.5 <2.1.0", + "from": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.0.5.tgz", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.0.5.tgz", "dependencies": { "core-util-is": { "version": "1.0.2", - "from": "core-util-is@>=1.0.0 <1.1.0", + "from": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", "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 <2.1.0", + "from": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz" }, "isarray": { "version": "0.0.1", - "from": "isarray@0.0.1", + "from": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz" }, "process-nextick-args": { "version": "1.0.6", - "from": "process-nextick-args@>=1.0.6 <1.1.0", + "from": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.6.tgz", "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.6.tgz" }, "string_decoder": { "version": "0.10.31", - "from": "string_decoder@>=0.10.0 <0.11.0", + "from": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", "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 <1.1.0", + "from": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz" } } @@ -570,247 +570,247 @@ }, "caseless": { "version": "0.11.0", - "from": "caseless@>=0.11.0 <0.12.0", + "from": "https://registry.npmjs.org/caseless/-/caseless-0.11.0.tgz", "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.11.0.tgz" }, "extend": { "version": "3.0.0", - "from": "extend@>=3.0.0 <3.1.0", + "from": "https://registry.npmjs.org/extend/-/extend-3.0.0.tgz", "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.0.tgz" }, "forever-agent": { "version": "0.6.1", - "from": "forever-agent@>=0.6.0 <0.7.0", + "from": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", "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 <1.1.0", + "from": "https://registry.npmjs.org/form-data/-/form-data-1.0.0-rc3.tgz", "resolved": "https://registry.npmjs.org/form-data/-/form-data-1.0.0-rc3.tgz", "dependencies": { "async": { "version": "1.5.2", - "from": "async@>=1.4.0 <2.0.0", + "from": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz" } } }, "json-stringify-safe": { "version": "5.0.1", - "from": "json-stringify-safe@>=5.0.0 <5.1.0", + "from": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz" }, "mime-types": { "version": "2.1.9", - "from": "mime-types@>=2.1.2 <2.2.0", + "from": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.9.tgz", "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.9.tgz", "dependencies": { "mime-db": { "version": "1.21.0", - "from": "mime-db@>=1.21.0 <1.22.0", + "from": "https://registry.npmjs.org/mime-db/-/mime-db-1.21.0.tgz", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.21.0.tgz" } } }, "node-uuid": { "version": "1.4.7", - "from": "node-uuid@>=1.4.0 <1.5.0", + "from": "https://registry.npmjs.org/node-uuid/-/node-uuid-1.4.7.tgz", "resolved": "https://registry.npmjs.org/node-uuid/-/node-uuid-1.4.7.tgz" }, "qs": { "version": "5.1.0", - "from": "qs@>=5.1.0 <5.2.0", + "from": "https://registry.npmjs.org/qs/-/qs-5.1.0.tgz", "resolved": "https://registry.npmjs.org/qs/-/qs-5.1.0.tgz" }, "tunnel-agent": { "version": "0.4.2", - "from": "tunnel-agent@>=0.4.0 <0.5.0", + "from": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.4.2.tgz", "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.4.2.tgz" }, "tough-cookie": { "version": "2.2.1", - "from": "tough-cookie@>=0.12.0", + "from": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.2.1.tgz", "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 <0.12.0", + "from": "https://registry.npmjs.org/http-signature/-/http-signature-0.11.0.tgz", "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 <0.2.0", + "from": "https://registry.npmjs.org/assert-plus/-/assert-plus-0.1.5.tgz", "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-0.1.5.tgz" }, "asn1": { "version": "0.1.11", - "from": "asn1@0.1.11", + "from": "https://registry.npmjs.org/asn1/-/asn1-0.1.11.tgz", "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.1.11.tgz" }, "ctype": { "version": "0.5.3", - "from": "ctype@0.5.3", + "from": "https://registry.npmjs.org/ctype/-/ctype-0.5.3.tgz", "resolved": "https://registry.npmjs.org/ctype/-/ctype-0.5.3.tgz" } } }, "oauth-sign": { "version": "0.8.1", - "from": "oauth-sign@>=0.8.0 <0.9.0", + "from": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.1.tgz", "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.1.tgz" }, "hawk": { "version": "3.1.3", - "from": "hawk@>=3.1.0 <3.2.0", + "from": "https://registry.npmjs.org/hawk/-/hawk-3.1.3.tgz", "resolved": "https://registry.npmjs.org/hawk/-/hawk-3.1.3.tgz", "dependencies": { "hoek": { "version": "2.16.3", - "from": "hoek@>=2.0.0 <3.0.0", + "from": "https://registry.npmjs.org/hoek/-/hoek-2.16.3.tgz", "resolved": "https://registry.npmjs.org/hoek/-/hoek-2.16.3.tgz" }, "boom": { "version": "2.10.1", - "from": "boom@>=2.0.0 <3.0.0", + "from": "https://registry.npmjs.org/boom/-/boom-2.10.1.tgz", "resolved": "https://registry.npmjs.org/boom/-/boom-2.10.1.tgz" }, "cryptiles": { "version": "2.0.5", - "from": "cryptiles@>=2.0.0 <3.0.0", + "from": "https://registry.npmjs.org/cryptiles/-/cryptiles-2.0.5.tgz", "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-2.0.5.tgz" }, "sntp": { "version": "1.0.9", - "from": "sntp@>=1.0.0 <2.0.0", + "from": "https://registry.npmjs.org/sntp/-/sntp-1.0.9.tgz", "resolved": "https://registry.npmjs.org/sntp/-/sntp-1.0.9.tgz" } } }, "aws-sign2": { "version": "0.5.0", - "from": "aws-sign2@>=0.5.0 <0.6.0", + "from": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.5.0.tgz", "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.5.0.tgz" }, "stringstream": { "version": "0.0.5", - "from": "stringstream@>=0.0.4 <0.1.0", + "from": "https://registry.npmjs.org/stringstream/-/stringstream-0.0.5.tgz", "resolved": "https://registry.npmjs.org/stringstream/-/stringstream-0.0.5.tgz" }, "combined-stream": { "version": "1.0.5", - "from": "combined-stream@>=1.0.1 <1.1.0", + "from": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.5.tgz", "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 <1.1.0", + "from": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz" } } }, "isstream": { "version": "0.1.2", - "from": "isstream@>=0.1.1 <0.2.0", + "from": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz" }, "har-validator": { "version": "1.8.0", - "from": "har-validator@>=1.6.1 <2.0.0", + "from": "https://registry.npmjs.org/har-validator/-/har-validator-1.8.0.tgz", "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-1.8.0.tgz", "dependencies": { "bluebird": { "version": "2.10.2", - "from": "bluebird@>=2.9.30 <3.0.0", + "from": "https://registry.npmjs.org/bluebird/-/bluebird-2.10.2.tgz", "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-2.10.2.tgz" }, "chalk": { "version": "1.1.1", - "from": "chalk@>=1.0.0 <2.0.0", + "from": "https://registry.npmjs.org/chalk/-/chalk-1.1.1.tgz", "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.1.tgz", "dependencies": { "ansi-styles": { "version": "2.1.0", - "from": "ansi-styles@>=2.1.0 <3.0.0", + "from": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.1.0.tgz", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.1.0.tgz" }, "escape-string-regexp": { "version": "1.0.4", - "from": "escape-string-regexp@>=1.0.2 <2.0.0", + "from": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.4.tgz", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.4.tgz" }, "has-ansi": { "version": "2.0.0", - "from": "has-ansi@>=2.0.0 <3.0.0", + "from": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", "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 <3.0.0", + "from": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.0.0.tgz", "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 <4.0.0", + "from": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.0.tgz", "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 <3.0.0", + "from": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.0.0.tgz", "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 <3.0.0", + "from": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz" } } }, "commander": { "version": "2.9.0", - "from": "commander@>=2.8.1 <3.0.0", + "from": "https://registry.npmjs.org/commander/-/commander-2.9.0.tgz", "resolved": "https://registry.npmjs.org/commander/-/commander-2.9.0.tgz", "dependencies": { "graceful-readlink": { "version": "1.0.1", - "from": "graceful-readlink@>=1.0.0", + "from": "https://registry.npmjs.org/graceful-readlink/-/graceful-readlink-1.0.1.tgz", "resolved": "https://registry.npmjs.org/graceful-readlink/-/graceful-readlink-1.0.1.tgz" } } }, "is-my-json-valid": { "version": "2.12.4", - "from": "is-my-json-valid@>=2.12.0 <3.0.0", + "from": "https://registry.npmjs.org/is-my-json-valid/-/is-my-json-valid-2.12.4.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", - "from": "generate-function@>=2.0.0 <3.0.0", + "from": "https://registry.npmjs.org/generate-function/-/generate-function-2.0.0.tgz", "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 <2.0.0", + "from": "https://registry.npmjs.org/generate-object-property/-/generate-object-property-1.2.0.tgz", "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 <2.0.0", + "from": "https://registry.npmjs.org/is-property/-/is-property-1.0.2.tgz", "resolved": "https://registry.npmjs.org/is-property/-/is-property-1.0.2.tgz" } } }, "jsonpointer": { "version": "2.0.0", - "from": "jsonpointer@2.0.0", + "from": "https://registry.npmjs.org/jsonpointer/-/jsonpointer-2.0.0.tgz", "resolved": "https://registry.npmjs.org/jsonpointer/-/jsonpointer-2.0.0.tgz" }, "xtend": { "version": "4.0.1", - "from": "xtend@>=4.0.0 <5.0.0", + "from": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz" } } @@ -821,22 +821,545 @@ }, "step": { "version": "0.0.6", - "from": "step@>=0.0.6 <0.1.0", + "from": "https://registry.npmjs.org/step/-/step-0.0.6.tgz", "resolved": "https://registry.npmjs.org/step/-/step-0.0.6.tgz" }, "step-profiler": { "version": "0.2.1", - "from": "step-profiler@>=0.2.1 <0.3.0", + "from": "https://registry.npmjs.org/step-profiler/-/step-profiler-0.2.1.tgz", "resolved": "https://registry.npmjs.org/step-profiler/-/step-profiler-0.2.1.tgz" }, + "turbo-cartocss": { + "version": "0.4.0", + "from": "turbo-cartocss@latest", + "resolved": "https://registry.npmjs.org/turbo-cartocss/-/turbo-cartocss-0.4.0.tgz", + "dependencies": { + "browser-request": { + "version": "0.3.3", + "from": "browser-request@>=0.3.3 <0.4.0", + "resolved": "https://registry.npmjs.org/browser-request/-/browser-request-0.3.3.tgz" + }, + "colorbrewer": { + "version": "0.0.2", + "from": "colorbrewer@0.0.2", + "resolved": "https://registry.npmjs.org/colorbrewer/-/colorbrewer-0.0.2.tgz" + }, + "es6-promise": { + "version": "3.1.2", + "from": "es6-promise@>=3.0.2 <4.0.0", + "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-3.1.2.tgz" + }, + "less": { + "version": "2.6.1", + "from": "less@>=2.5.3 <3.0.0", + "resolved": "https://registry.npmjs.org/less/-/less-2.6.1.tgz", + "dependencies": { + "errno": { + "version": "0.1.4", + "from": "errno@>=0.1.1 <0.2.0", + "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.4.tgz", + "dependencies": { + "prr": { + "version": "0.0.0", + "from": "prr@>=0.0.0 <0.1.0", + "resolved": "https://registry.npmjs.org/prr/-/prr-0.0.0.tgz" + } + } + }, + "graceful-fs": { + "version": "4.1.3", + "from": "graceful-fs@>=4.1.2 <5.0.0", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.3.tgz" + }, + "image-size": { + "version": "0.4.0", + "from": "image-size@>=0.4.0 <0.5.0", + "resolved": "https://registry.npmjs.org/image-size/-/image-size-0.4.0.tgz" + }, + "mime": { + "version": "1.3.4", + "from": "mime@>=1.2.11 <2.0.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.3.4.tgz" + }, + "mkdirp": { + "version": "0.5.1", + "from": "mkdirp@>=0.5.0 <0.6.0", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "dependencies": { + "minimist": { + "version": "0.0.8", + "from": "minimist@0.0.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz" + } + } + }, + "promise": { + "version": "7.1.1", + "from": "promise@>=7.1.1 <8.0.0", + "resolved": "https://registry.npmjs.org/promise/-/promise-7.1.1.tgz", + "dependencies": { + "asap": { + "version": "2.0.3", + "from": "asap@>=2.0.3 <2.1.0", + "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.3.tgz" + } + } + }, + "source-map": { + "version": "0.5.3", + "from": "source-map@>=0.5.3 <0.6.0", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.3.tgz" + } + } + }, + "postcss": { + "version": "5.0.19", + "from": "postcss@>=5.0.13 <6.0.0", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.0.19.tgz", + "dependencies": { + "supports-color": { + "version": "3.1.2", + "from": "supports-color@>=3.1.2 <4.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.1.2.tgz", + "dependencies": { + "has-flag": { + "version": "1.0.0", + "from": "has-flag@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz" + } + } + }, + "source-map": { + "version": "0.5.3", + "from": "source-map@>=0.5.1 <0.6.0", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.3.tgz" + }, + "js-base64": { + "version": "2.1.9", + "from": "js-base64@>=2.1.9 <3.0.0", + "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-2.1.9.tgz" + } + } + }, + "postcss-value-parser": { + "version": "3.3.0", + "from": "postcss-value-parser@>=3.2.3 <4.0.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.0.tgz" + }, + "querystring": { + "version": "0.2.0", + "from": "querystring@>=0.2.0 <0.3.0", + "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz" + }, + "request": { + "version": "2.69.0", + "from": "request@>=2.67.0 <3.0.0", + "resolved": "https://registry.npmjs.org/request/-/request-2.69.0.tgz", + "dependencies": { + "aws-sign2": { + "version": "0.6.0", + "from": "aws-sign2@>=0.6.0 <0.7.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.6.0.tgz" + }, + "aws4": { + "version": "1.3.2", + "from": "aws4@>=1.2.1 <2.0.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.3.2.tgz", + "dependencies": { + "lru-cache": { + "version": "4.0.0", + "from": "lru-cache@>=4.0.0 <5.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.0.0.tgz", + "dependencies": { + "pseudomap": { + "version": "1.0.2", + "from": "pseudomap@>=1.0.1 <2.0.0", + "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz" + }, + "yallist": { + "version": "2.0.0", + "from": "yallist@>=2.0.0 <3.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.0.0.tgz" + } + } + } + } + }, + "bl": { + "version": "1.0.3", + "from": "bl@>=1.0.0 <1.1.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-1.0.3.tgz", + "dependencies": { + "readable-stream": { + "version": "2.0.5", + "from": "readable-stream@>=2.0.5 <2.1.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.0.5.tgz", + "dependencies": { + "core-util-is": { + "version": "1.0.2", + "from": "core-util-is@>=1.0.0 <1.1.0", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz" + }, + "inherits": { + "version": "2.0.1", + "from": "inherits@>=2.0.1 <2.1.0", + "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.6", + "from": "process-nextick-args@>=1.0.6 <1.1.0", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.6.tgz" + }, + "string_decoder": { + "version": "0.10.31", + "from": "string_decoder@>=0.10.0 <0.11.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz" + }, + "util-deprecate": { + "version": "1.0.2", + "from": "util-deprecate@>=1.0.1 <1.1.0", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz" + } + } + } + } + }, + "caseless": { + "version": "0.11.0", + "from": "caseless@>=0.11.0 <0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.11.0.tgz" + }, + "combined-stream": { + "version": "1.0.5", + "from": "combined-stream@>=1.0.5 <1.1.0", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.5.tgz", + "dependencies": { + "delayed-stream": { + "version": "1.0.0", + "from": "delayed-stream@>=1.0.0 <1.1.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz" + } + } + }, + "extend": { + "version": "3.0.0", + "from": "extend@>=3.0.0 <3.1.0", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.0.tgz" + }, + "forever-agent": { + "version": "0.6.1", + "from": "forever-agent@>=0.6.1 <0.7.0", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz" + }, + "form-data": { + "version": "1.0.0-rc3", + "from": "form-data@>=1.0.0-rc3 <1.1.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-1.0.0-rc3.tgz", + "dependencies": { + "async": { + "version": "1.5.2", + "from": "async@>=1.4.0 <2.0.0", + "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz" + } + } + }, + "har-validator": { + "version": "2.0.6", + "from": "har-validator@>=2.0.6 <2.1.0", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-2.0.6.tgz", + "dependencies": { + "chalk": { + "version": "1.1.1", + "from": "chalk@>=1.1.1 <2.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.1.tgz", + "dependencies": { + "ansi-styles": { + "version": "2.2.0", + "from": "ansi-styles@>=2.1.0 <3.0.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.0.tgz", + "dependencies": { + "color-convert": { + "version": "1.0.0", + "from": "color-convert@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.0.0.tgz" + } + } + }, + "escape-string-regexp": { + "version": "1.0.5", + "from": "escape-string-regexp@>=1.0.2 <2.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz" + }, + "has-ansi": { + "version": "2.0.0", + "from": "has-ansi@>=2.0.0 <3.0.0", + "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", + "dependencies": { + "ansi-regex": { + "version": "2.0.0", + "from": "ansi-regex@>=2.0.0 <3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.0.0.tgz" + } + } + }, + "strip-ansi": { + "version": "3.0.1", + "from": "strip-ansi@>=3.0.0 <4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "dependencies": { + "ansi-regex": { + "version": "2.0.0", + "from": "ansi-regex@>=2.0.0 <3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.0.0.tgz" + } + } + }, + "supports-color": { + "version": "2.0.0", + "from": "supports-color@>=2.0.0 <3.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 <3.0.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.9.0.tgz", + "dependencies": { + "graceful-readlink": { + "version": "1.0.1", + "from": "graceful-readlink@>=1.0.0", + "resolved": "https://registry.npmjs.org/graceful-readlink/-/graceful-readlink-1.0.1.tgz" + } + } + }, + "is-my-json-valid": { + "version": "2.13.1", + "from": "is-my-json-valid@>=2.12.4 <3.0.0", + "resolved": "https://registry.npmjs.org/is-my-json-valid/-/is-my-json-valid-2.13.1.tgz", + "dependencies": { + "generate-function": { + "version": "2.0.0", + "from": "generate-function@>=2.0.0 <3.0.0", + "resolved": "https://registry.npmjs.org/generate-function/-/generate-function-2.0.0.tgz" + }, + "generate-object-property": { + "version": "1.2.0", + "from": "generate-object-property@>=1.1.0 <2.0.0", + "resolved": "https://registry.npmjs.org/generate-object-property/-/generate-object-property-1.2.0.tgz", + "dependencies": { + "is-property": { + "version": "1.0.2", + "from": "is-property@>=1.0.0 <2.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 <5.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 <3.0.0", + "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.0.tgz", + "dependencies": { + "pinkie": { + "version": "2.0.4", + "from": "pinkie@>=2.0.0 <3.0.0", + "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz" + } + } + } + } + }, + "hawk": { + "version": "3.1.3", + "from": "hawk@>=3.1.0 <3.2.0", + "resolved": "https://registry.npmjs.org/hawk/-/hawk-3.1.3.tgz", + "dependencies": { + "hoek": { + "version": "2.16.3", + "from": "hoek@>=2.0.0 <3.0.0", + "resolved": "https://registry.npmjs.org/hoek/-/hoek-2.16.3.tgz" + }, + "boom": { + "version": "2.10.1", + "from": "boom@>=2.0.0 <3.0.0", + "resolved": "https://registry.npmjs.org/boom/-/boom-2.10.1.tgz" + }, + "cryptiles": { + "version": "2.0.5", + "from": "cryptiles@>=2.0.0 <3.0.0", + "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-2.0.5.tgz" + }, + "sntp": { + "version": "1.0.9", + "from": "sntp@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/sntp/-/sntp-1.0.9.tgz" + } + } + }, + "http-signature": { + "version": "1.1.1", + "from": "http-signature@>=1.1.0 <1.2.0", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.1.1.tgz", + "dependencies": { + "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" + }, + "jsprim": { + "version": "1.2.2", + "from": "jsprim@>=1.2.2 <2.0.0", + "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" + } + } + }, + "sshpk": { + "version": "1.7.4", + "from": "sshpk@>=1.7.0 <2.0.0", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.7.4.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" + }, + "dashdash": { + "version": "1.13.0", + "from": "dashdash@>=1.10.1 <2.0.0", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.13.0.tgz", + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "from": "assert-plus@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.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.14.1", + "from": "tweetnacl@>=0.13.0 <1.0.0", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.1.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" + } + } + } + } + }, + "is-typedarray": { + "version": "1.0.0", + "from": "is-typedarray@>=1.0.0 <1.1.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz" + }, + "isstream": { + "version": "0.1.2", + "from": "isstream@>=0.1.2 <0.2.0", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz" + }, + "json-stringify-safe": { + "version": "5.0.1", + "from": "json-stringify-safe@>=5.0.1 <5.1.0", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz" + }, + "mime-types": { + "version": "2.1.10", + "from": "mime-types@>=2.1.7 <2.2.0", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.10.tgz", + "dependencies": { + "mime-db": { + "version": "1.22.0", + "from": "mime-db@>=1.22.0 <1.23.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.22.0.tgz" + } + } + }, + "node-uuid": { + "version": "1.4.7", + "from": "node-uuid@>=1.4.7 <1.5.0", + "resolved": "https://registry.npmjs.org/node-uuid/-/node-uuid-1.4.7.tgz" + }, + "oauth-sign": { + "version": "0.8.1", + "from": "oauth-sign@>=0.8.0 <0.9.0", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.1.tgz" + }, + "qs": { + "version": "6.0.2", + "from": "qs@>=6.0.2 <6.1.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.0.2.tgz" + }, + "stringstream": { + "version": "0.0.5", + "from": "stringstream@>=0.0.4 <0.1.0", + "resolved": "https://registry.npmjs.org/stringstream/-/stringstream-0.0.5.tgz" + }, + "tough-cookie": { + "version": "2.2.1", + "from": "tough-cookie@>=2.2.0 <2.3.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.2.1.tgz" + }, + "tunnel-agent": { + "version": "0.4.2", + "from": "tunnel-agent@>=0.4.1 <0.5.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.4.2.tgz" + } + } + } + } + }, "underscore": { "version": "1.6.0", - "from": "underscore@>=1.6.0 <1.7.0", + "from": "https://registry.npmjs.org/underscore/-/underscore-1.6.0.tgz", "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.6.0.tgz" }, "windshaft": { "version": "1.13.2", - "from": "windshaft@1.13.2", + "from": "https://registry.npmjs.org/windshaft/-/windshaft-1.13.2.tgz", "resolved": "https://registry.npmjs.org/windshaft/-/windshaft-1.13.2.tgz", "dependencies": { "abaculus": { @@ -851,7 +1374,7 @@ "dependencies": { "nan": { "version": "1.9.0", - "from": "nan@>=1.8.4 <2.0.0", + "from": "https://registry.npmjs.org/nan/-/nan-1.9.0.tgz", "resolved": "https://registry.npmjs.org/nan/-/nan-1.9.0.tgz" } } @@ -863,22 +1386,22 @@ "dependencies": { "mapnik-reference": { "version": "6.0.5", - "from": "mapnik-reference@>=6.0.2 <6.1.0", + "from": "https://registry.npmjs.org/mapnik-reference/-/mapnik-reference-6.0.5.tgz", "resolved": "https://registry.npmjs.org/mapnik-reference/-/mapnik-reference-6.0.5.tgz" }, "optimist": { "version": "0.6.1", - "from": "optimist@>=0.6.0 <0.7.0", + "from": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", "dependencies": { "wordwrap": { "version": "0.0.3", - "from": "wordwrap@>=0.0.2 <0.1.0", + "from": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz", "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz" }, "minimist": { "version": "0.0.10", - "from": "minimist@>=0.0.1 <0.1.0", + "from": "https://registry.npmjs.org/minimist/-/minimist-0.0.10.tgz", "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.10.tgz" } } @@ -887,22 +1410,22 @@ }, "cartodb-psql": { "version": "0.6.1", - "from": "cartodb-psql@>=0.6.1 <0.7.0", + "from": "https://registry.npmjs.org/cartodb-psql/-/cartodb-psql-0.6.1.tgz", "resolved": "https://registry.npmjs.org/cartodb-psql/-/cartodb-psql-0.6.1.tgz", "dependencies": { "pg": { "version": "2.6.2-cdb3", - "from": "git://github.com/CartoDB/node-postgres.git#2.6.2-cdb3", + "from": "git://github.com/CartoDB/node-postgres.git#069c5296d1a093077feff21719641bb9e71fc50e", "resolved": "git://github.com/CartoDB/node-postgres.git#069c5296d1a093077feff21719641bb9e71fc50e", "dependencies": { "generic-pool": { "version": "2.0.3", - "from": "generic-pool@2.0.3", + "from": "https://registry.npmjs.org/generic-pool/-/generic-pool-2.0.3.tgz", "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", + "from": "https://registry.npmjs.org/buffer-writer/-/buffer-writer-1.0.0.tgz", "resolved": "https://registry.npmjs.org/buffer-writer/-/buffer-writer-1.0.0.tgz" } } @@ -911,7 +1434,7 @@ }, "grainstore": { "version": "1.1.1", - "from": "grainstore@1.1.1", + "from": "https://registry.npmjs.org/grainstore/-/grainstore-1.1.1.tgz", "resolved": "https://registry.npmjs.org/grainstore/-/grainstore-1.1.1.tgz", "dependencies": { "carto": { @@ -921,39 +1444,39 @@ "dependencies": { "underscore": { "version": "1.4.4", - "from": "underscore@>=1.4.3 <1.5.0", + "from": "https://registry.npmjs.org/underscore/-/underscore-1.4.4.tgz", "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.4.4.tgz" }, "mapnik-reference": { "version": "5.0.9", - "from": "mapnik-reference@>=5.0.7 <5.1.0", + "from": "https://registry.npmjs.org/mapnik-reference/-/mapnik-reference-5.0.9.tgz", "resolved": "https://registry.npmjs.org/mapnik-reference/-/mapnik-reference-5.0.9.tgz" }, "xml2js": { "version": "0.2.8", - "from": "xml2js@>=0.2.4 <0.3.0", + "from": "https://registry.npmjs.org/xml2js/-/xml2js-0.2.8.tgz", "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.2.8.tgz", "dependencies": { "sax": { "version": "0.5.8", - "from": "sax@>=0.5.0 <0.6.0", + "from": "https://registry.npmjs.org/sax/-/sax-0.5.8.tgz", "resolved": "https://registry.npmjs.org/sax/-/sax-0.5.8.tgz" } } }, "optimist": { "version": "0.6.1", - "from": "optimist@>=0.6.0 <0.7.0", + "from": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", "dependencies": { "wordwrap": { "version": "0.0.3", - "from": "wordwrap@>=0.0.2 <0.1.0", + "from": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz", "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz" }, "minimist": { "version": "0.0.10", - "from": "minimist@>=0.0.1 <0.1.0", + "from": "https://registry.npmjs.org/minimist/-/minimist-0.0.10.tgz", "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.10.tgz" } } @@ -962,22 +1485,22 @@ }, "millstone": { "version": "0.6.16", - "from": "millstone@0.6.16", + "from": "https://registry.npmjs.org/millstone/-/millstone-0.6.16.tgz", "resolved": "https://registry.npmjs.org/millstone/-/millstone-0.6.16.tgz", "dependencies": { "generic-pool": { "version": "2.1.1", - "from": "generic-pool@>=2.1.1 <2.2.0", + "from": "https://registry.npmjs.org/generic-pool/-/generic-pool-2.1.1.tgz", "resolved": "https://registry.npmjs.org/generic-pool/-/generic-pool-2.1.1.tgz" }, "srs": { "version": "0.4.9", - "from": "srs@>=0.4.6 <0.5.0", + "from": "https://registry.npmjs.org/srs/-/srs-0.4.9.tgz", "resolved": "https://registry.npmjs.org/srs/-/srs-0.4.9.tgz", "dependencies": { "nan": { "version": "1.8.4", - "from": "nan@>=1.8.4 <1.9.0", + "from": "https://registry.npmjs.org/nan/-/nan-1.8.4.tgz", "resolved": "https://registry.npmjs.org/nan/-/nan-1.8.4.tgz" }, "node-pre-gyp": { @@ -1704,12 +2227,12 @@ }, "zipfile": { "version": "0.5.9", - "from": "zipfile@>=0.5.5 <0.6.0", + "from": "https://registry.npmjs.org/zipfile/-/zipfile-0.5.9.tgz", "resolved": "https://registry.npmjs.org/zipfile/-/zipfile-0.5.9.tgz", "dependencies": { "nan": { "version": "2.1.0", - "from": "nan@>=2.1.0 <2.2.0", + "from": "https://registry.npmjs.org/nan/-/nan-2.1.0.tgz", "resolved": "https://registry.npmjs.org/nan/-/nan-2.1.0.tgz" }, "node-pre-gyp": { @@ -2494,12 +3017,12 @@ }, "sqlite3": { "version": "3.1.1", - "from": "sqlite3@>=2.0.0 <3.0.0||>=3.0.0 <4.0.0", + "from": "https://registry.npmjs.org/sqlite3/-/sqlite3-3.1.1.tgz", "resolved": "https://registry.npmjs.org/sqlite3/-/sqlite3-3.1.1.tgz", "dependencies": { "nan": { "version": "2.1.0", - "from": "nan@>=2.1.0 <2.2.0", + "from": "https://registry.npmjs.org/nan/-/nan-2.1.0.tgz", "resolved": "https://registry.npmjs.org/nan/-/nan-2.1.0.tgz" }, "node-pre-gyp": { @@ -3226,34 +3749,34 @@ }, "mime": { "version": "1.2.11", - "from": "mime@>=1.2.11 <1.3.0", + "from": "https://registry.npmjs.org/mime/-/mime-1.2.11.tgz", "resolved": "https://registry.npmjs.org/mime/-/mime-1.2.11.tgz" }, "mkdirp": { "version": "0.5.1", - "from": "mkdirp@>=0.5.0 <0.6.0", + "from": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", "dependencies": { "minimist": { "version": "0.0.8", - "from": "minimist@0.0.8", + "from": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz" } } }, "optimist": { "version": "0.6.1", - "from": "optimist@>=0.6.1 <0.7.0", + "from": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", "dependencies": { "wordwrap": { "version": "0.0.3", - "from": "wordwrap@>=0.0.2 <0.1.0", + "from": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz", "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz" }, "minimist": { "version": "0.0.10", - "from": "minimist@>=0.0.1 <0.1.0", + "from": "https://registry.npmjs.org/minimist/-/minimist-0.0.10.tgz", "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.10.tgz" } } @@ -3269,17 +3792,17 @@ "dependencies": { "nan": { "version": "1.2.0", - "from": "nan@>=1.2.0 <1.3.0", + "from": "https://registry.npmjs.org/nan/-/nan-1.2.0.tgz", "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", + "from": "https://registry.npmjs.org/mapnik-vector-tile/-/mapnik-vector-tile-0.5.5.tgz", "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", + "from": "https://registry.npmjs.org/node-pre-gyp/-/node-pre-gyp-0.5.25.tgz", "resolved": "https://registry.npmjs.org/node-pre-gyp/-/node-pre-gyp-0.5.25.tgz", "dependencies": { "nopt": { @@ -3649,32 +4172,32 @@ }, "semver": { "version": "5.0.3", - "from": "semver@>=5.0.3 <5.1.0", + "from": "https://registry.npmjs.org/semver/-/semver-5.0.3.tgz", "resolved": "https://registry.npmjs.org/semver/-/semver-5.0.3.tgz" }, "sphericalmercator": { "version": "1.0.3", - "from": "sphericalmercator@1.0.3", + "from": "https://registry.npmjs.org/sphericalmercator/-/sphericalmercator-1.0.3.tgz", "resolved": "https://registry.npmjs.org/sphericalmercator/-/sphericalmercator-1.0.3.tgz" }, "tilelive": { "version": "4.5.3", - "from": "tilelive@>=4.5.3 <4.6.0", + "from": "https://registry.npmjs.org/tilelive/-/tilelive-4.5.3.tgz", "resolved": "https://registry.npmjs.org/tilelive/-/tilelive-4.5.3.tgz", "dependencies": { "optimist": { "version": "0.6.1", - "from": "optimist@>=0.6.0 <0.7.0", + "from": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", "dependencies": { "wordwrap": { "version": "0.0.3", - "from": "wordwrap@>=0.0.2 <0.1.0", + "from": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz", "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz" }, "minimist": { "version": "0.0.10", - "from": "minimist@>=0.0.1 <0.1.0", + "from": "https://registry.npmjs.org/minimist/-/minimist-0.0.10.tgz", "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.10.tgz" } } @@ -3693,12 +4216,12 @@ "dependencies": { "generic-pool": { "version": "2.1.1", - "from": "generic-pool@>=2.1.1 <2.2.0", + "from": "https://registry.npmjs.org/generic-pool/-/generic-pool-2.1.1.tgz", "resolved": "https://registry.npmjs.org/generic-pool/-/generic-pool-2.1.1.tgz" }, "xtend": { "version": "3.0.0", - "from": "xtend@>=3.0.0 <3.1.0", + "from": "https://registry.npmjs.org/xtend/-/xtend-3.0.0.tgz", "resolved": "https://registry.npmjs.org/xtend/-/xtend-3.0.0.tgz" } } @@ -3712,105 +4235,105 @@ "dependencies": { "generic-pool": { "version": "2.1.1", - "from": "generic-pool@>=2.1.1 <2.2.0", + "from": "https://registry.npmjs.org/generic-pool/-/generic-pool-2.1.1.tgz", "resolved": "https://registry.npmjs.org/generic-pool/-/generic-pool-2.1.1.tgz" }, "mime": { "version": "1.2.11", - "from": "mime@>=1.2.11 <1.3.0", + "from": "https://registry.npmjs.org/mime/-/mime-1.2.11.tgz", "resolved": "https://registry.npmjs.org/mime/-/mime-1.2.11.tgz" } } }, "torque.js": { "version": "2.11.4", - "from": "torque.js@>=2.11.0 <2.12.0", + "from": "https://registry.npmjs.org/torque.js/-/torque.js-2.11.4.tgz", "resolved": "https://registry.npmjs.org/torque.js/-/torque.js-2.11.4.tgz" }, "turbo-cartocss": { "version": "0.4.0", - "from": "turbo-cartocss@>=0.4.0 <0.5.0", + "from": "https://registry.npmjs.org/turbo-cartocss/-/turbo-cartocss-0.4.0.tgz", "resolved": "https://registry.npmjs.org/turbo-cartocss/-/turbo-cartocss-0.4.0.tgz", "dependencies": { "browser-request": { "version": "0.3.3", - "from": "browser-request@>=0.3.3 <0.4.0", + "from": "https://registry.npmjs.org/browser-request/-/browser-request-0.3.3.tgz", "resolved": "https://registry.npmjs.org/browser-request/-/browser-request-0.3.3.tgz" }, "colorbrewer": { "version": "0.0.2", - "from": "colorbrewer@0.0.2", + "from": "https://registry.npmjs.org/colorbrewer/-/colorbrewer-0.0.2.tgz", "resolved": "https://registry.npmjs.org/colorbrewer/-/colorbrewer-0.0.2.tgz" }, "es6-promise": { "version": "3.1.2", - "from": "es6-promise@>=3.0.2 <4.0.0", + "from": "https://registry.npmjs.org/es6-promise/-/es6-promise-3.1.2.tgz", "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-3.1.2.tgz" }, "less": { "version": "2.6.0", - "from": "less@>=2.5.3 <3.0.0", + "from": "https://registry.npmjs.org/less/-/less-2.6.0.tgz", "resolved": "https://registry.npmjs.org/less/-/less-2.6.0.tgz", "dependencies": { "errno": { "version": "0.1.4", - "from": "errno@>=0.1.1 <0.2.0", + "from": "https://registry.npmjs.org/errno/-/errno-0.1.4.tgz", "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.4.tgz", "dependencies": { "prr": { "version": "0.0.0", - "from": "prr@>=0.0.0 <0.1.0", + "from": "https://registry.npmjs.org/prr/-/prr-0.0.0.tgz", "resolved": "https://registry.npmjs.org/prr/-/prr-0.0.0.tgz" } } }, "graceful-fs": { "version": "3.0.8", - "from": "graceful-fs@>=3.0.5 <4.0.0", + "from": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-3.0.8.tgz", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-3.0.8.tgz" }, "image-size": { "version": "0.3.5", - "from": "image-size@>=0.3.5 <0.4.0", + "from": "https://registry.npmjs.org/image-size/-/image-size-0.3.5.tgz", "resolved": "https://registry.npmjs.org/image-size/-/image-size-0.3.5.tgz" }, "mime": { "version": "1.3.4", - "from": "mime@>=1.2.11 <2.0.0", + "from": "https://registry.npmjs.org/mime/-/mime-1.3.4.tgz", "resolved": "https://registry.npmjs.org/mime/-/mime-1.3.4.tgz" }, "mkdirp": { "version": "0.5.1", - "from": "mkdirp@>=0.5.0 <0.6.0", + "from": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", "dependencies": { "minimist": { "version": "0.0.8", - "from": "minimist@0.0.8", + "from": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz" } } }, "promise": { "version": "6.1.0", - "from": "promise@>=6.0.1 <7.0.0", + "from": "https://registry.npmjs.org/promise/-/promise-6.1.0.tgz", "resolved": "https://registry.npmjs.org/promise/-/promise-6.1.0.tgz", "dependencies": { "asap": { "version": "1.0.0", - "from": "asap@>=1.0.0 <1.1.0", + "from": "https://registry.npmjs.org/asap/-/asap-1.0.0.tgz", "resolved": "https://registry.npmjs.org/asap/-/asap-1.0.0.tgz" } } }, "source-map": { "version": "0.4.4", - "from": "source-map@>=0.4.2 <0.5.0", + "from": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz", "dependencies": { "amdefine": { "version": "1.0.0", - "from": "amdefine@>=0.0.4", + "from": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.0.tgz", "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.0.tgz" } } @@ -3819,71 +4342,71 @@ }, "postcss": { "version": "5.0.19", - "from": "postcss@>=5.0.13 <6.0.0", + "from": "https://registry.npmjs.org/postcss/-/postcss-5.0.19.tgz", "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.0.19.tgz", "dependencies": { "supports-color": { "version": "3.1.2", - "from": "supports-color@>=3.1.2 <4.0.0", + "from": "https://registry.npmjs.org/supports-color/-/supports-color-3.1.2.tgz", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.1.2.tgz", "dependencies": { "has-flag": { "version": "1.0.0", - "from": "has-flag@>=1.0.0 <2.0.0", + "from": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz" } } }, "source-map": { "version": "0.5.3", - "from": "source-map@>=0.5.1 <0.6.0", + "from": "https://registry.npmjs.org/source-map/-/source-map-0.5.3.tgz", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.3.tgz" }, "js-base64": { "version": "2.1.9", - "from": "js-base64@>=2.1.9 <3.0.0", + "from": "https://registry.npmjs.org/js-base64/-/js-base64-2.1.9.tgz", "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-2.1.9.tgz" } } }, "postcss-value-parser": { "version": "3.3.0", - "from": "postcss-value-parser@>=3.2.3 <4.0.0", + "from": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.0.tgz", "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.0.tgz" }, "querystring": { "version": "0.2.0", - "from": "querystring@>=0.2.0 <0.3.0", + "from": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz" }, "request": { "version": "2.69.0", - "from": "request@>=2.67.0 <3.0.0", + "from": "https://registry.npmjs.org/request/-/request-2.69.0.tgz", "resolved": "https://registry.npmjs.org/request/-/request-2.69.0.tgz", "dependencies": { "aws-sign2": { "version": "0.6.0", - "from": "aws-sign2@>=0.6.0 <0.7.0", + "from": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.6.0.tgz", "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.6.0.tgz" }, "aws4": { "version": "1.3.2", - "from": "aws4@>=1.2.1 <2.0.0", + "from": "https://registry.npmjs.org/aws4/-/aws4-1.3.2.tgz", "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.3.2.tgz", "dependencies": { "lru-cache": { "version": "4.0.0", - "from": "lru-cache@>=4.0.0 <5.0.0", + "from": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.0.0.tgz", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.0.0.tgz", "dependencies": { "pseudomap": { "version": "1.0.2", - "from": "pseudomap@>=1.0.1 <2.0.0", + "from": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz" }, "yallist": { "version": "2.0.0", - "from": "yallist@>=2.0.0 <3.0.0", + "from": "https://registry.npmjs.org/yallist/-/yallist-2.0.0.tgz", "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.0.0.tgz" } } @@ -3892,42 +4415,42 @@ }, "bl": { "version": "1.0.3", - "from": "bl@>=1.0.0 <1.1.0", + "from": "https://registry.npmjs.org/bl/-/bl-1.0.3.tgz", "resolved": "https://registry.npmjs.org/bl/-/bl-1.0.3.tgz", "dependencies": { "readable-stream": { "version": "2.0.5", - "from": "readable-stream@>=2.0.5 <2.1.0", + "from": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.0.5.tgz", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.0.5.tgz", "dependencies": { "core-util-is": { "version": "1.0.2", - "from": "core-util-is@>=1.0.0 <1.1.0", + "from": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", "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 <2.1.0", + "from": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz" }, "isarray": { "version": "0.0.1", - "from": "isarray@0.0.1", + "from": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz" }, "process-nextick-args": { "version": "1.0.6", - "from": "process-nextick-args@>=1.0.6 <1.1.0", + "from": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.6.tgz", "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.6.tgz" }, "string_decoder": { "version": "0.10.31", - "from": "string_decoder@>=0.10.0 <0.11.0", + "from": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", "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 <1.1.0", + "from": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz" } } @@ -3936,155 +4459,155 @@ }, "caseless": { "version": "0.11.0", - "from": "caseless@>=0.11.0 <0.12.0", + "from": "https://registry.npmjs.org/caseless/-/caseless-0.11.0.tgz", "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.11.0.tgz" }, "combined-stream": { "version": "1.0.5", - "from": "combined-stream@>=1.0.5 <1.1.0", + "from": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.5.tgz", "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 <1.1.0", + "from": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz" } } }, "extend": { "version": "3.0.0", - "from": "extend@>=3.0.0 <3.1.0", + "from": "https://registry.npmjs.org/extend/-/extend-3.0.0.tgz", "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.0.tgz" }, "forever-agent": { "version": "0.6.1", - "from": "forever-agent@>=0.6.1 <0.7.0", + "from": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", "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-rc3 <1.1.0", + "from": "https://registry.npmjs.org/form-data/-/form-data-1.0.0-rc3.tgz", "resolved": "https://registry.npmjs.org/form-data/-/form-data-1.0.0-rc3.tgz", "dependencies": { "async": { "version": "1.5.2", - "from": "async@>=1.4.0 <2.0.0", + "from": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz" } } }, "har-validator": { "version": "2.0.6", - "from": "har-validator@>=2.0.6 <2.1.0", + "from": "https://registry.npmjs.org/har-validator/-/har-validator-2.0.6.tgz", "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-2.0.6.tgz", "dependencies": { "chalk": { "version": "1.1.1", - "from": "chalk@>=1.1.1 <2.0.0", + "from": "https://registry.npmjs.org/chalk/-/chalk-1.1.1.tgz", "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.1.tgz", "dependencies": { "ansi-styles": { "version": "2.2.0", - "from": "ansi-styles@>=2.1.0 <3.0.0", + "from": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.0.tgz", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.0.tgz", "dependencies": { "color-convert": { "version": "1.0.0", - "from": "color-convert@>=1.0.0 <2.0.0", + "from": "https://registry.npmjs.org/color-convert/-/color-convert-1.0.0.tgz", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.0.0.tgz" } } }, "escape-string-regexp": { "version": "1.0.5", - "from": "escape-string-regexp@>=1.0.2 <2.0.0", + "from": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz" }, "has-ansi": { "version": "2.0.0", - "from": "has-ansi@>=2.0.0 <3.0.0", + "from": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", "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 <3.0.0", + "from": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.0.0.tgz", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.0.0.tgz" } } }, "strip-ansi": { "version": "3.0.1", - "from": "strip-ansi@>=3.0.0 <4.0.0", + "from": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", "dependencies": { "ansi-regex": { "version": "2.0.0", - "from": "ansi-regex@>=2.0.0 <3.0.0", + "from": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.0.0.tgz", "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 <3.0.0", + "from": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz" } } }, "commander": { "version": "2.9.0", - "from": "commander@>=2.9.0 <3.0.0", + "from": "https://registry.npmjs.org/commander/-/commander-2.9.0.tgz", "resolved": "https://registry.npmjs.org/commander/-/commander-2.9.0.tgz", "dependencies": { "graceful-readlink": { "version": "1.0.1", - "from": "graceful-readlink@>=1.0.0", + "from": "https://registry.npmjs.org/graceful-readlink/-/graceful-readlink-1.0.1.tgz", "resolved": "https://registry.npmjs.org/graceful-readlink/-/graceful-readlink-1.0.1.tgz" } } }, "is-my-json-valid": { "version": "2.13.1", - "from": "is-my-json-valid@>=2.12.4 <3.0.0", + "from": "https://registry.npmjs.org/is-my-json-valid/-/is-my-json-valid-2.13.1.tgz", "resolved": "https://registry.npmjs.org/is-my-json-valid/-/is-my-json-valid-2.13.1.tgz", "dependencies": { "generate-function": { "version": "2.0.0", - "from": "generate-function@>=2.0.0 <3.0.0", + "from": "https://registry.npmjs.org/generate-function/-/generate-function-2.0.0.tgz", "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 <2.0.0", + "from": "https://registry.npmjs.org/generate-object-property/-/generate-object-property-1.2.0.tgz", "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 <2.0.0", + "from": "https://registry.npmjs.org/is-property/-/is-property-1.0.2.tgz", "resolved": "https://registry.npmjs.org/is-property/-/is-property-1.0.2.tgz" } } }, "jsonpointer": { "version": "2.0.0", - "from": "jsonpointer@2.0.0", + "from": "https://registry.npmjs.org/jsonpointer/-/jsonpointer-2.0.0.tgz", "resolved": "https://registry.npmjs.org/jsonpointer/-/jsonpointer-2.0.0.tgz" }, "xtend": { "version": "4.0.1", - "from": "xtend@>=4.0.0 <5.0.0", + "from": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz" } } }, "pinkie-promise": { "version": "2.0.0", - "from": "pinkie-promise@>=2.0.0 <3.0.0", + "from": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.0.tgz", "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.0.tgz", "dependencies": { "pinkie": { "version": "2.0.4", - "from": "pinkie@>=2.0.0 <3.0.0", + "from": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz" } } @@ -4093,103 +4616,103 @@ }, "hawk": { "version": "3.1.3", - "from": "hawk@>=3.1.0 <3.2.0", + "from": "https://registry.npmjs.org/hawk/-/hawk-3.1.3.tgz", "resolved": "https://registry.npmjs.org/hawk/-/hawk-3.1.3.tgz", "dependencies": { "hoek": { "version": "2.16.3", - "from": "hoek@>=2.0.0 <3.0.0", + "from": "https://registry.npmjs.org/hoek/-/hoek-2.16.3.tgz", "resolved": "https://registry.npmjs.org/hoek/-/hoek-2.16.3.tgz" }, "boom": { "version": "2.10.1", - "from": "boom@>=2.0.0 <3.0.0", + "from": "https://registry.npmjs.org/boom/-/boom-2.10.1.tgz", "resolved": "https://registry.npmjs.org/boom/-/boom-2.10.1.tgz" }, "cryptiles": { "version": "2.0.5", - "from": "cryptiles@>=2.0.0 <3.0.0", + "from": "https://registry.npmjs.org/cryptiles/-/cryptiles-2.0.5.tgz", "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-2.0.5.tgz" }, "sntp": { "version": "1.0.9", - "from": "sntp@>=1.0.0 <2.0.0", + "from": "https://registry.npmjs.org/sntp/-/sntp-1.0.9.tgz", "resolved": "https://registry.npmjs.org/sntp/-/sntp-1.0.9.tgz" } } }, "http-signature": { "version": "1.1.1", - "from": "http-signature@>=1.1.0 <1.2.0", + "from": "https://registry.npmjs.org/http-signature/-/http-signature-1.1.1.tgz", "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.1.1.tgz", "dependencies": { "assert-plus": { "version": "0.2.0", - "from": "assert-plus@>=0.2.0 <0.3.0", + "from": "https://registry.npmjs.org/assert-plus/-/assert-plus-0.2.0.tgz", "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-0.2.0.tgz" }, "jsprim": { "version": "1.2.2", - "from": "jsprim@>=1.2.2 <2.0.0", + "from": "https://registry.npmjs.org/jsprim/-/jsprim-1.2.2.tgz", "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.2.2.tgz", "dependencies": { "extsprintf": { "version": "1.0.2", - "from": "extsprintf@1.0.2", + "from": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.0.2.tgz", "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.0.2.tgz" }, "json-schema": { "version": "0.2.2", - "from": "json-schema@0.2.2", + "from": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.2.tgz", "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.2.tgz" }, "verror": { "version": "1.3.6", - "from": "verror@1.3.6", + "from": "https://registry.npmjs.org/verror/-/verror-1.3.6.tgz", "resolved": "https://registry.npmjs.org/verror/-/verror-1.3.6.tgz" } } }, "sshpk": { "version": "1.7.4", - "from": "sshpk@>=1.7.0 <2.0.0", + "from": "https://registry.npmjs.org/sshpk/-/sshpk-1.7.4.tgz", "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.7.4.tgz", "dependencies": { "asn1": { "version": "0.2.3", - "from": "asn1@>=0.2.3 <0.3.0", + "from": "https://registry.npmjs.org/asn1/-/asn1-0.2.3.tgz", "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.3.tgz" }, "dashdash": { "version": "1.13.0", - "from": "dashdash@>=1.10.1 <2.0.0", + "from": "https://registry.npmjs.org/dashdash/-/dashdash-1.13.0.tgz", "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.13.0.tgz", "dependencies": { "assert-plus": { "version": "1.0.0", - "from": "assert-plus@>=1.0.0 <2.0.0", + "from": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz" } } }, "jsbn": { "version": "0.1.0", - "from": "jsbn@>=0.1.0 <0.2.0", + "from": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.0.tgz", "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.0.tgz" }, "tweetnacl": { "version": "0.14.1", - "from": "tweetnacl@>=0.13.0 <1.0.0", + "from": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.1.tgz", "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.1.tgz" }, "jodid25519": { "version": "1.0.2", - "from": "jodid25519@>=1.0.0 <2.0.0", + "from": "https://registry.npmjs.org/jodid25519/-/jodid25519-1.0.2.tgz", "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", + "from": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz", "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz" } } @@ -4198,59 +4721,59 @@ }, "is-typedarray": { "version": "1.0.0", - "from": "is-typedarray@>=1.0.0 <1.1.0", + "from": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz" }, "isstream": { "version": "0.1.2", - "from": "isstream@>=0.1.2 <0.2.0", + "from": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz" }, "json-stringify-safe": { "version": "5.0.1", - "from": "json-stringify-safe@>=5.0.1 <5.1.0", + "from": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz" }, "mime-types": { "version": "2.1.10", - "from": "mime-types@>=2.1.7 <2.2.0", + "from": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.10.tgz", "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.10.tgz", "dependencies": { "mime-db": { "version": "1.22.0", - "from": "mime-db@>=1.22.0 <1.23.0", + "from": "https://registry.npmjs.org/mime-db/-/mime-db-1.22.0.tgz", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.22.0.tgz" } } }, "node-uuid": { "version": "1.4.7", - "from": "node-uuid@>=1.4.7 <1.5.0", + "from": "https://registry.npmjs.org/node-uuid/-/node-uuid-1.4.7.tgz", "resolved": "https://registry.npmjs.org/node-uuid/-/node-uuid-1.4.7.tgz" }, "oauth-sign": { "version": "0.8.1", - "from": "oauth-sign@>=0.8.0 <0.9.0", + "from": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.1.tgz", "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.1.tgz" }, "qs": { "version": "6.0.2", - "from": "qs@>=6.0.2 <6.1.0", + "from": "https://registry.npmjs.org/qs/-/qs-6.0.2.tgz", "resolved": "https://registry.npmjs.org/qs/-/qs-6.0.2.tgz" }, "stringstream": { "version": "0.0.5", - "from": "stringstream@>=0.0.4 <0.1.0", + "from": "https://registry.npmjs.org/stringstream/-/stringstream-0.0.5.tgz", "resolved": "https://registry.npmjs.org/stringstream/-/stringstream-0.0.5.tgz" }, "tough-cookie": { "version": "2.2.1", - "from": "tough-cookie@>=2.2.0 <2.3.0", + "from": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.2.1.tgz", "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.2.1.tgz" }, "tunnel-agent": { "version": "0.4.2", - "from": "tunnel-agent@>=0.4.1 <0.5.0", + "from": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.4.2.tgz", "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.4.2.tgz" } } From a0073da4b3bfcc11b4c2dc3ba5d7d3e560857f1b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Garc=C3=ADa=20Aubert?= Date: Wed, 9 Mar 2016 11:48:07 +0100 Subject: [PATCH 06/17] Added regression test for turbo-cartocss' integration --- .../utils/style/turbo-cartocss-adapter.js | 7 +-- test/acceptance/multilayer_server.js | 4 +- test/acceptance/turbo-cartocss-regressions.js | 62 +++++++++++-------- 3 files changed, 40 insertions(+), 33 deletions(-) diff --git a/lib/cartodb/utils/style/turbo-cartocss-adapter.js b/lib/cartodb/utils/style/turbo-cartocss-adapter.js index 873f8a2d..44500c9e 100644 --- a/lib/cartodb/utils/style/turbo-cartocss-adapter.js +++ b/lib/cartodb/utils/style/turbo-cartocss-adapter.js @@ -36,12 +36,11 @@ TurboCartocssAdapter.prototype._parseCartoCss = function (username, layer, callb } this.turboCartocssParser.process(username, layer.options.cartocss, layer.options.sql, function (err, cartocss) { - if (err) { - return callback(err); + // Ignore turbo-cartocss errors and continue + if (!err && cartocss) { + layer.options.cartocss = cartocss; } - layer.options.cartocss = cartocss; - callback(null, layer); }); }; diff --git a/test/acceptance/multilayer_server.js b/test/acceptance/multilayer_server.js index 1594d1ac..e443f3aa 100644 --- a/test/acceptance/multilayer_server.js +++ b/test/acceptance/multilayer_server.js @@ -71,8 +71,8 @@ describe('tests from old api translated to multilayer', function() { }, function(res) { var parsed = JSON.parse(res.body); - assert.ok(parsed.errors[0]); - assert.ok(parsed.errors[0].match(/Unclosed block/)); + assert.ok(parsed.errors[0].match(/^style0/)); + assert.ok(parsed.errors[0].match(/missing closing/)); done(); } ); diff --git a/test/acceptance/turbo-cartocss-regressions.js b/test/acceptance/turbo-cartocss-regressions.js index c429645b..52d55b35 100644 --- a/test/acceptance/turbo-cartocss-regressions.js +++ b/test/acceptance/turbo-cartocss-regressions.js @@ -31,35 +31,43 @@ function makeMapconfig(cartocss) { }; } -describe.skip('turbo-cartocss regressions', function() { +describe('turbo-cartocss regressions', function() { + + var cartocss = [ + "/** simple visualization */", + "", + "Map {", + " buffer-size: 256;", + "}", + "", + "#county_points_with_population{", + " marker-fill-opacity: 0.1;", + " marker-line-color:#FFFFFF;//#CF1C90;", + " marker-line-width: 0;", + " marker-line-opacity: 0.3;", + " marker-placement: point;", + " marker-type: ellipse;", + " //marker-comp-op: overlay;", + " marker-width: [price];", + " [zoom=5]{marker-width: [price]*2;}", + " [zoom=6]{marker-width: [price]*4;}", + " marker-fill: #000000;", + " marker-allow-overlap: true;", + " ", + "", + "}" + ].join('\n'); + + beforeEach(function () { + this.testClient = new TestClient(makeMapconfig(cartocss)); + }); + + afterEach(function (done) { + this.testClient.drain(done); + }); it('should accept // comments', function(done) { - var cartocss = [ - "/** simple visualization */", - "", - "Map {", - " buffer-size: 256;", - "}", - "", - "#county_points_with_population{", - " marker-fill-opacity: 0.1;", - " marker-line-color:#FFFFFF;//#CF1C90;", - " marker-line-width: 0;", - " marker-line-opacity: 0.3;", - " marker-placement: point;", - " marker-type: ellipse;", - " //marker-comp-op: overlay;", - " marker-width: [price];", - " [zoom=5]{marker-width: [price]*2;}", - " [zoom=6]{marker-width: [price]*4;}", - " marker-fill: #000000;", - " marker-allow-overlap: true;", - " ", - "", - "}" - ].join('\n'); - var testClient = new TestClient(makeMapconfig(cartocss)); - testClient.createLayergroup(function(err) { + this.testClient.getTile(0, 0, 0, function(err) { assert.ok(!err, err); done(); }); From e9b8c512c92d4a2293e67a7b41e20f942f51e21e Mon Sep 17 00:00:00 2001 From: Raul Ochoa Date: Wed, 9 Mar 2016 18:07:11 +0100 Subject: [PATCH 07/17] Re-indent --- lib/cartodb/controllers/map.js | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/lib/cartodb/controllers/map.js b/lib/cartodb/controllers/map.js index 54d018f1..2f93caa0 100644 --- a/lib/cartodb/controllers/map.js +++ b/lib/cartodb/controllers/map.js @@ -165,8 +165,7 @@ MapController.prototype.create = function(req, res, prepareConfigFn) { } return next(null, requestMapConfig, datasource); - } - ); + }); }, function parseTurboCartoCss(err, requestMapConfig, datasource) { assert.ifError(err); From 050f90a07b19450bea7ac9bda6f24f57ebbbeeaa Mon Sep 17 00:00:00 2001 From: Raul Ochoa Date: Wed, 9 Mar 2016 18:11:34 +0100 Subject: [PATCH 08/17] Regenerate npm-shrinkwrap.json --- npm-shrinkwrap.json | 912 ++++++++++---------------------------------- 1 file changed, 197 insertions(+), 715 deletions(-) diff --git a/npm-shrinkwrap.json b/npm-shrinkwrap.json index 2faf559b..a302cea6 100644 --- a/npm-shrinkwrap.json +++ b/npm-shrinkwrap.json @@ -4,88 +4,93 @@ "dependencies": { "body-parser": { "version": "1.14.2", - "from": "https://registry.npmjs.org/body-parser/-/body-parser-1.14.2.tgz", + "from": "body-parser@>=1.14.0 <1.15.0", "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.14.2.tgz", "dependencies": { "bytes": { "version": "2.2.0", - "from": "https://registry.npmjs.org/bytes/-/bytes-2.2.0.tgz", + "from": "bytes@2.2.0", "resolved": "https://registry.npmjs.org/bytes/-/bytes-2.2.0.tgz" }, "content-type": { "version": "1.0.1", - "from": "https://registry.npmjs.org/content-type/-/content-type-1.0.1.tgz", + "from": "content-type@>=1.0.1 <1.1.0", "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.1.tgz" }, "depd": { "version": "1.1.0", - "from": "https://registry.npmjs.org/depd/-/depd-1.1.0.tgz", + "from": "depd@>=1.1.0 <1.2.0", "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.0.tgz" }, "http-errors": { "version": "1.3.1", - "from": "https://registry.npmjs.org/http-errors/-/http-errors-1.3.1.tgz", + "from": "http-errors@>=1.3.1 <1.4.0", "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.3.1.tgz", "dependencies": { "inherits": { "version": "2.0.1", - "from": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", + "from": "inherits@>=2.0.1 <2.1.0", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz" }, "statuses": { "version": "1.2.1", - "from": "https://registry.npmjs.org/statuses/-/statuses-1.2.1.tgz", + "from": "statuses@>=1.0.0 <2.0.0", "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.2.1.tgz" } } }, "iconv-lite": { "version": "0.4.13", - "from": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.13.tgz", + "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", - "from": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "from": "on-finished@>=2.3.0 <2.4.0", "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", "dependencies": { "ee-first": { "version": "1.1.1", - "from": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "from": "ee-first@1.1.1", "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz" } } }, "qs": { "version": "5.2.0", - "from": "https://registry.npmjs.org/qs/-/qs-5.2.0.tgz", + "from": "qs@5.2.0", "resolved": "https://registry.npmjs.org/qs/-/qs-5.2.0.tgz" }, "raw-body": { - "version": "2.1.5", - "from": "https://registry.npmjs.org/raw-body/-/raw-body-2.1.5.tgz", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.1.5.tgz", + "version": "2.1.6", + "from": "raw-body@>=2.1.5 <2.2.0", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.1.6.tgz", "dependencies": { + "bytes": { + "version": "2.3.0", + "from": "bytes@2.3.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-2.3.0.tgz" + }, "unpipe": { "version": "1.0.0", - "from": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "from": "unpipe@1.0.0", "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz" } } }, "type-is": { - "version": "1.6.11", - "from": "https://registry.npmjs.org/type-is/-/type-is-1.6.11.tgz", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.11.tgz", + "version": "1.6.12", + "from": "type-is@>=1.6.10 <1.7.0", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.12.tgz", "dependencies": { "media-typer": { "version": "0.3.0", - "from": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "from": "media-typer@0.3.0", "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz" }, "mime-types": { "version": "2.1.10", - "from": "mime-types@>=2.1.9 <2.2.0", + "from": "mime-types@>=2.1.10 <2.2.0", "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.10.tgz", "dependencies": { "mime-db": { @@ -101,22 +106,22 @@ }, "cartodb-psql": { "version": "0.4.0", - "from": "https://registry.npmjs.org/cartodb-psql/-/cartodb-psql-0.4.0.tgz", + "from": "cartodb-psql@>=0.4.0 <0.5.0", "resolved": "https://registry.npmjs.org/cartodb-psql/-/cartodb-psql-0.4.0.tgz", "dependencies": { "pg": { "version": "2.6.2-cdb1", - "from": "git://github.com/CartoDB/node-postgres.git#836a2dc3131e873fc4ba20cd16e7fb69a7dca98a", + "from": "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": "https://registry.npmjs.org/generic-pool/-/generic-pool-2.0.3.tgz", + "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": "https://registry.npmjs.org/buffer-writer/-/buffer-writer-1.0.0.tgz", + "from": "buffer-writer@1.0.0", "resolved": "https://registry.npmjs.org/buffer-writer/-/buffer-writer-1.0.0.tgz" } } @@ -130,37 +135,37 @@ }, "cartodb-redis": { "version": "0.13.0", - "from": "https://registry.npmjs.org/cartodb-redis/-/cartodb-redis-0.13.0.tgz", + "from": "cartodb-redis@>=0.13.0 <0.14.0", "resolved": "https://registry.npmjs.org/cartodb-redis/-/cartodb-redis-0.13.0.tgz", "dependencies": { "redis-mpool": { "version": "0.1.0", - "from": "git://github.com/CartoDB/node-redis-mpool.git#47510b8d4525ee24aa2e5328976372274a1d144e", + "from": "git://github.com/CartoDB/node-redis-mpool.git#0.1.0", "resolved": "git://github.com/CartoDB/node-redis-mpool.git#47510b8d4525ee24aa2e5328976372274a1d144e", "dependencies": { "generic-pool": { "version": "2.1.1", - "from": "https://registry.npmjs.org/generic-pool/-/generic-pool-2.1.1.tgz", + "from": "generic-pool@>=2.1.1 <2.2.0", "resolved": "https://registry.npmjs.org/generic-pool/-/generic-pool-2.1.1.tgz" }, "redis": { "version": "0.12.1", - "from": "https://registry.npmjs.org/redis/-/redis-0.12.1.tgz", + "from": "redis@>=0.12.1 <0.13.0", "resolved": "https://registry.npmjs.org/redis/-/redis-0.12.1.tgz" }, "hiredis": { "version": "0.1.17", - "from": "https://registry.npmjs.org/hiredis/-/hiredis-0.1.17.tgz", + "from": "hiredis@>=0.1.17 <0.2.0", "resolved": "https://registry.npmjs.org/hiredis/-/hiredis-0.1.17.tgz", "dependencies": { "bindings": { "version": "1.2.1", - "from": "https://registry.npmjs.org/bindings/-/bindings-1.2.1.tgz", + "from": "bindings@*", "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.2.1.tgz" }, "nan": { "version": "1.1.2", - "from": "https://registry.npmjs.org/nan/-/nan-1.1.2.tgz", + "from": "nan@>=1.1.0 <1.2.0", "resolved": "https://registry.npmjs.org/nan/-/nan-1.1.2.tgz" } } @@ -171,29 +176,29 @@ }, "debug": { "version": "2.2.0", - "from": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz", + "from": "debug@>=2.2.0 <2.3.0", "resolved": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz", "dependencies": { "ms": { "version": "0.7.1", - "from": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz", + "from": "ms@0.7.1", "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz" } } }, "dot": { "version": "1.0.3", - "from": "https://registry.npmjs.org/dot/-/dot-1.0.3.tgz", + "from": "dot@>=1.0.2 <1.1.0", "resolved": "https://registry.npmjs.org/dot/-/dot-1.0.3.tgz" }, "express": { "version": "4.13.4", - "from": "https://registry.npmjs.org/express/-/express-4.13.4.tgz", + "from": "express@>=4.13.3 <4.14.0", "resolved": "https://registry.npmjs.org/express/-/express-4.13.4.tgz", "dependencies": { "accepts": { "version": "1.2.13", - "from": "https://registry.npmjs.org/accepts/-/accepts-1.2.13.tgz", + "from": "accepts@>=1.2.12 <1.3.0", "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.2.13.tgz", "dependencies": { "mime-types": { @@ -210,179 +215,179 @@ }, "negotiator": { "version": "0.5.3", - "from": "https://registry.npmjs.org/negotiator/-/negotiator-0.5.3.tgz", + "from": "negotiator@0.5.3", "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.5.3.tgz" } } }, "array-flatten": { "version": "1.1.1", - "from": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "from": "array-flatten@1.1.1", "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz" }, "content-disposition": { "version": "0.5.1", - "from": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.1.tgz", + "from": "content-disposition@0.5.1", "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.1.tgz" }, "content-type": { "version": "1.0.1", - "from": "https://registry.npmjs.org/content-type/-/content-type-1.0.1.tgz", + "from": "content-type@>=1.0.1 <1.1.0", "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.1.tgz" }, "cookie": { "version": "0.1.5", - "from": "https://registry.npmjs.org/cookie/-/cookie-0.1.5.tgz", + "from": "cookie@0.1.5", "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.1.5.tgz" }, "cookie-signature": { "version": "1.0.6", - "from": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "from": "cookie-signature@1.0.6", "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz" }, "depd": { "version": "1.1.0", - "from": "https://registry.npmjs.org/depd/-/depd-1.1.0.tgz", + "from": "depd@>=1.1.0 <1.2.0", "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.0.tgz" }, "escape-html": { "version": "1.0.3", - "from": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "from": "escape-html@>=1.0.3 <1.1.0", "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz" }, "etag": { "version": "1.7.0", - "from": "https://registry.npmjs.org/etag/-/etag-1.7.0.tgz", + "from": "etag@>=1.7.0 <1.8.0", "resolved": "https://registry.npmjs.org/etag/-/etag-1.7.0.tgz" }, "finalhandler": { "version": "0.4.1", - "from": "https://registry.npmjs.org/finalhandler/-/finalhandler-0.4.1.tgz", + "from": "finalhandler@0.4.1", "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-0.4.1.tgz", "dependencies": { "unpipe": { "version": "1.0.0", - "from": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "from": "unpipe@>=1.0.0 <1.1.0", "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz" } } }, "fresh": { "version": "0.3.0", - "from": "https://registry.npmjs.org/fresh/-/fresh-0.3.0.tgz", + "from": "fresh@0.3.0", "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.3.0.tgz" }, "merge-descriptors": { "version": "1.0.1", - "from": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "from": "merge-descriptors@1.0.1", "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz" }, "methods": { "version": "1.1.2", - "from": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "from": "methods@>=1.1.2 <1.2.0", "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz" }, "on-finished": { "version": "2.3.0", - "from": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "from": "on-finished@>=2.3.0 <2.4.0", "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", "dependencies": { "ee-first": { "version": "1.1.1", - "from": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "from": "ee-first@1.1.1", "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz" } } }, "parseurl": { "version": "1.3.1", - "from": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.1.tgz", + "from": "parseurl@>=1.3.1 <1.4.0", "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.1.tgz" }, "path-to-regexp": { "version": "0.1.7", - "from": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "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.10", - "from": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-1.0.10.tgz", + "from": "proxy-addr@>=1.0.10 <1.1.0", "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-1.0.10.tgz", "dependencies": { "forwarded": { "version": "0.1.0", - "from": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.0.tgz", + "from": "forwarded@>=0.1.0 <0.2.0", "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.0.tgz" }, "ipaddr.js": { "version": "1.0.5", - "from": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.0.5.tgz", + "from": "ipaddr.js@1.0.5", "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.0.5.tgz" } } }, "qs": { "version": "4.0.0", - "from": "https://registry.npmjs.org/qs/-/qs-4.0.0.tgz", + "from": "qs@4.0.0", "resolved": "https://registry.npmjs.org/qs/-/qs-4.0.0.tgz" }, "range-parser": { "version": "1.0.3", - "from": "https://registry.npmjs.org/range-parser/-/range-parser-1.0.3.tgz", + "from": "range-parser@>=1.0.3 <1.1.0", "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.0.3.tgz" }, "send": { "version": "0.13.1", - "from": "https://registry.npmjs.org/send/-/send-0.13.1.tgz", + "from": "send@0.13.1", "resolved": "https://registry.npmjs.org/send/-/send-0.13.1.tgz", "dependencies": { "destroy": { "version": "1.0.4", - "from": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", + "from": "destroy@>=1.0.4 <1.1.0", "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz" }, "http-errors": { "version": "1.3.1", - "from": "https://registry.npmjs.org/http-errors/-/http-errors-1.3.1.tgz", + "from": "http-errors@>=1.3.1 <1.4.0", "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.3.1.tgz", "dependencies": { "inherits": { "version": "2.0.1", - "from": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", + "from": "inherits@>=2.0.1 <2.1.0", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz" } } }, "mime": { "version": "1.3.4", - "from": "https://registry.npmjs.org/mime/-/mime-1.3.4.tgz", + "from": "mime@1.3.4", "resolved": "https://registry.npmjs.org/mime/-/mime-1.3.4.tgz" }, "ms": { "version": "0.7.1", - "from": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz", + "from": "ms@0.7.1", "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz" }, "statuses": { "version": "1.2.1", - "from": "https://registry.npmjs.org/statuses/-/statuses-1.2.1.tgz", + "from": "statuses@>=1.2.1 <1.3.0", "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.2.1.tgz" } } }, "serve-static": { "version": "1.10.2", - "from": "https://registry.npmjs.org/serve-static/-/serve-static-1.10.2.tgz", + "from": "serve-static@>=1.10.2 <1.11.0", "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.10.2.tgz" }, "type-is": { - "version": "1.6.11", - "from": "https://registry.npmjs.org/type-is/-/type-is-1.6.11.tgz", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.11.tgz", + "version": "1.6.12", + "from": "type-is@>=1.6.6 <1.7.0", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.12.tgz", "dependencies": { "media-typer": { "version": "0.3.0", - "from": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "from": "media-typer@0.3.0", "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz" }, "mime-types": { @@ -401,19 +406,19 @@ }, "utils-merge": { "version": "1.0.0", - "from": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.0.tgz", + "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": "https://registry.npmjs.org/vary/-/vary-1.0.1.tgz", + "from": "vary@>=1.0.1 <1.1.0", "resolved": "https://registry.npmjs.org/vary/-/vary-1.0.1.tgz" } } }, "fastly-purge": { "version": "1.0.1", - "from": "https://registry.npmjs.org/fastly-purge/-/fastly-purge-1.0.1.tgz", + "from": "fastly-purge@>=1.0.1 <1.1.0", "resolved": "https://registry.npmjs.org/fastly-purge/-/fastly-purge-1.0.1.tgz" }, "log4js": { @@ -423,96 +428,96 @@ "dependencies": { "async": { "version": "0.2.10", - "from": "https://registry.npmjs.org/async/-/async-0.2.10.tgz", + "from": "async@>=0.2.0 <0.3.0", "resolved": "https://registry.npmjs.org/async/-/async-0.2.10.tgz" }, "readable-stream": { "version": "1.0.33", - "from": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.33.tgz", + "from": "readable-stream@>=1.0.2 <1.1.0", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.33.tgz", "dependencies": { "core-util-is": { "version": "1.0.2", - "from": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "from": "core-util-is@>=1.0.0 <1.1.0", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz" }, "isarray": { "version": "0.0.1", - "from": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "from": "isarray@0.0.1", "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz" }, "string_decoder": { "version": "0.10.31", - "from": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "from": "string_decoder@>=0.10.0 <0.11.0", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz" }, "inherits": { "version": "2.0.1", - "from": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", + "from": "inherits@>=2.0.1 <2.1.0", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz" } } }, "semver": { "version": "4.3.6", - "from": "https://registry.npmjs.org/semver/-/semver-4.3.6.tgz", + "from": "semver@>=4.3.3 <4.4.0", "resolved": "https://registry.npmjs.org/semver/-/semver-4.3.6.tgz" }, "underscore": { "version": "1.8.2", - "from": "https://registry.npmjs.org/underscore/-/underscore-1.8.2.tgz", + "from": "underscore@1.8.2", "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.8.2.tgz" } } }, "lru-cache": { "version": "2.6.5", - "from": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.6.5.tgz", + "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": "https://registry.npmjs.org/lzma/-/lzma-1.3.7.tgz", + "from": "lzma@>=1.3.7 <1.4.0", "resolved": "https://registry.npmjs.org/lzma/-/lzma-1.3.7.tgz" }, "node-statsd": { "version": "0.0.7", - "from": "https://registry.npmjs.org/node-statsd/-/node-statsd-0.0.7.tgz", + "from": "node-statsd@>=0.0.7 <0.1.0", "resolved": "https://registry.npmjs.org/node-statsd/-/node-statsd-0.0.7.tgz" }, "queue-async": { "version": "1.0.7", - "from": "https://registry.npmjs.org/queue-async/-/queue-async-1.0.7.tgz", + "from": "queue-async@>=1.0.7 <1.1.0", "resolved": "https://registry.npmjs.org/queue-async/-/queue-async-1.0.7.tgz" }, "redis-mpool": { "version": "0.4.0", - "from": "https://registry.npmjs.org/redis-mpool/-/redis-mpool-0.4.0.tgz", + "from": "redis-mpool@>=0.4.0 <0.5.0", "resolved": "https://registry.npmjs.org/redis-mpool/-/redis-mpool-0.4.0.tgz", "dependencies": { "generic-pool": { "version": "2.1.1", - "from": "https://registry.npmjs.org/generic-pool/-/generic-pool-2.1.1.tgz", + "from": "generic-pool@>=2.1.1 <2.2.0", "resolved": "https://registry.npmjs.org/generic-pool/-/generic-pool-2.1.1.tgz" }, "redis": { "version": "0.12.1", - "from": "https://registry.npmjs.org/redis/-/redis-0.12.1.tgz", + "from": "redis@>=0.12.1 <0.13.0", "resolved": "https://registry.npmjs.org/redis/-/redis-0.12.1.tgz" }, "hiredis": { "version": "0.1.17", - "from": "https://registry.npmjs.org/hiredis/-/hiredis-0.1.17.tgz", + "from": "hiredis@>=0.1.17 <0.2.0", "resolved": "https://registry.npmjs.org/hiredis/-/hiredis-0.1.17.tgz", "dependencies": { "bindings": { "version": "1.2.1", - "from": "https://registry.npmjs.org/bindings/-/bindings-1.2.1.tgz", + "from": "bindings@*", "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.2.1.tgz" }, "nan": { "version": "1.1.2", - "from": "https://registry.npmjs.org/nan/-/nan-1.1.2.tgz", + "from": "nan@>=1.1.0 <1.2.0", "resolved": "https://registry.npmjs.org/nan/-/nan-1.1.2.tgz" } } @@ -521,7 +526,7 @@ }, "request": { "version": "2.62.0", - "from": "https://registry.npmjs.org/request/-/request-2.62.0.tgz", + "from": "request@>=2.62.0 <2.63.0", "resolved": "https://registry.npmjs.org/request/-/request-2.62.0.tgz", "dependencies": { "bl": { @@ -531,37 +536,37 @@ "dependencies": { "readable-stream": { "version": "2.0.5", - "from": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.0.5.tgz", + "from": "readable-stream@>=2.0.5 <2.1.0", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.0.5.tgz", "dependencies": { "core-util-is": { "version": "1.0.2", - "from": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "from": "core-util-is@>=1.0.0 <1.1.0", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz" }, "inherits": { "version": "2.0.1", - "from": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", + "from": "inherits@>=2.0.1 <2.1.0", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz" }, "isarray": { "version": "0.0.1", - "from": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "from": "isarray@0.0.1", "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz" }, "process-nextick-args": { "version": "1.0.6", - "from": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.6.tgz", + "from": "process-nextick-args@>=1.0.6 <1.1.0", "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.6.tgz" }, "string_decoder": { "version": "0.10.31", - "from": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "from": "string_decoder@>=0.10.0 <0.11.0", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz" }, "util-deprecate": { "version": "1.0.2", - "from": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "from": "util-deprecate@>=1.0.1 <1.1.0", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz" } } @@ -570,39 +575,39 @@ }, "caseless": { "version": "0.11.0", - "from": "https://registry.npmjs.org/caseless/-/caseless-0.11.0.tgz", + "from": "caseless@>=0.11.0 <0.12.0", "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.11.0.tgz" }, "extend": { "version": "3.0.0", - "from": "https://registry.npmjs.org/extend/-/extend-3.0.0.tgz", + "from": "extend@>=3.0.0 <3.1.0", "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.0.tgz" }, "forever-agent": { "version": "0.6.1", - "from": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "from": "forever-agent@>=0.6.0 <0.7.0", "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz" }, "form-data": { "version": "1.0.0-rc3", - "from": "https://registry.npmjs.org/form-data/-/form-data-1.0.0-rc3.tgz", + "from": "form-data@>=1.0.0-rc1 <1.1.0", "resolved": "https://registry.npmjs.org/form-data/-/form-data-1.0.0-rc3.tgz", "dependencies": { "async": { "version": "1.5.2", - "from": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", + "from": "async@>=1.4.0 <2.0.0", "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz" } } }, "json-stringify-safe": { "version": "5.0.1", - "from": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "from": "json-stringify-safe@>=5.0.0 <5.1.0", "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz" }, "mime-types": { "version": "2.1.10", - "from": "mime-types@>=2.1.2 <2.2.0", + "from": "mime-types@>=2.1.10 <2.2.0", "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.10.tgz", "dependencies": { "mime-db": { @@ -614,118 +619,118 @@ }, "node-uuid": { "version": "1.4.7", - "from": "https://registry.npmjs.org/node-uuid/-/node-uuid-1.4.7.tgz", + "from": "node-uuid@>=1.4.0 <1.5.0", "resolved": "https://registry.npmjs.org/node-uuid/-/node-uuid-1.4.7.tgz" }, "qs": { "version": "5.1.0", - "from": "https://registry.npmjs.org/qs/-/qs-5.1.0.tgz", + "from": "qs@>=5.1.0 <5.2.0", "resolved": "https://registry.npmjs.org/qs/-/qs-5.1.0.tgz" }, "tunnel-agent": { "version": "0.4.2", - "from": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.4.2.tgz", + "from": "tunnel-agent@>=0.4.0 <0.5.0", "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.4.2.tgz" }, "tough-cookie": { "version": "2.2.1", - "from": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.2.1.tgz", + "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": "https://registry.npmjs.org/http-signature/-/http-signature-0.11.0.tgz", + "from": "http-signature@>=0.11.0 <0.12.0", "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-0.11.0.tgz", "dependencies": { "assert-plus": { "version": "0.1.5", - "from": "https://registry.npmjs.org/assert-plus/-/assert-plus-0.1.5.tgz", + "from": "assert-plus@>=0.1.5 <0.2.0", "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-0.1.5.tgz" }, "asn1": { "version": "0.1.11", - "from": "https://registry.npmjs.org/asn1/-/asn1-0.1.11.tgz", + "from": "asn1@0.1.11", "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.1.11.tgz" }, "ctype": { "version": "0.5.3", - "from": "https://registry.npmjs.org/ctype/-/ctype-0.5.3.tgz", + "from": "ctype@0.5.3", "resolved": "https://registry.npmjs.org/ctype/-/ctype-0.5.3.tgz" } } }, "oauth-sign": { "version": "0.8.1", - "from": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.1.tgz", + "from": "oauth-sign@>=0.8.0 <0.9.0", "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.1.tgz" }, "hawk": { "version": "3.1.3", - "from": "https://registry.npmjs.org/hawk/-/hawk-3.1.3.tgz", + "from": "hawk@>=3.1.0 <3.2.0", "resolved": "https://registry.npmjs.org/hawk/-/hawk-3.1.3.tgz", "dependencies": { "hoek": { "version": "2.16.3", - "from": "https://registry.npmjs.org/hoek/-/hoek-2.16.3.tgz", + "from": "hoek@>=2.0.0 <3.0.0", "resolved": "https://registry.npmjs.org/hoek/-/hoek-2.16.3.tgz" }, "boom": { "version": "2.10.1", - "from": "https://registry.npmjs.org/boom/-/boom-2.10.1.tgz", + "from": "boom@>=2.0.0 <3.0.0", "resolved": "https://registry.npmjs.org/boom/-/boom-2.10.1.tgz" }, "cryptiles": { "version": "2.0.5", - "from": "https://registry.npmjs.org/cryptiles/-/cryptiles-2.0.5.tgz", + "from": "cryptiles@>=2.0.0 <3.0.0", "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-2.0.5.tgz" }, "sntp": { "version": "1.0.9", - "from": "https://registry.npmjs.org/sntp/-/sntp-1.0.9.tgz", + "from": "sntp@>=1.0.0 <2.0.0", "resolved": "https://registry.npmjs.org/sntp/-/sntp-1.0.9.tgz" } } }, "aws-sign2": { "version": "0.5.0", - "from": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.5.0.tgz", + "from": "aws-sign2@>=0.5.0 <0.6.0", "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.5.0.tgz" }, "stringstream": { "version": "0.0.5", - "from": "https://registry.npmjs.org/stringstream/-/stringstream-0.0.5.tgz", + "from": "stringstream@>=0.0.4 <0.1.0", "resolved": "https://registry.npmjs.org/stringstream/-/stringstream-0.0.5.tgz" }, "combined-stream": { "version": "1.0.5", - "from": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.5.tgz", + "from": "combined-stream@>=1.0.1 <1.1.0", "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.5.tgz", "dependencies": { "delayed-stream": { "version": "1.0.0", - "from": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "from": "delayed-stream@>=1.0.0 <1.1.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz" } } }, "isstream": { "version": "0.1.2", - "from": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "from": "isstream@>=0.1.1 <0.2.0", "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz" }, "har-validator": { "version": "1.8.0", - "from": "https://registry.npmjs.org/har-validator/-/har-validator-1.8.0.tgz", + "from": "har-validator@>=1.6.1 <2.0.0", "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-1.8.0.tgz", "dependencies": { "bluebird": { "version": "2.10.2", - "from": "https://registry.npmjs.org/bluebird/-/bluebird-2.10.2.tgz", + "from": "bluebird@>=2.9.30 <3.0.0", "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-2.10.2.tgz" }, "chalk": { "version": "1.1.1", - "from": "https://registry.npmjs.org/chalk/-/chalk-1.1.1.tgz", + "from": "chalk@>=1.0.0 <2.0.0", "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.1.tgz", "dependencies": { "ansi-styles": { @@ -747,12 +752,12 @@ }, "has-ansi": { "version": "2.0.0", - "from": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", + "from": "has-ansi@>=2.0.0 <3.0.0", "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", "dependencies": { "ansi-regex": { "version": "2.0.0", - "from": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.0.0.tgz", + "from": "ansi-regex@>=2.0.0 <3.0.0", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.0.0.tgz" } } @@ -764,60 +769,60 @@ "dependencies": { "ansi-regex": { "version": "2.0.0", - "from": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.0.0.tgz", + "from": "ansi-regex@>=2.0.0 <3.0.0", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.0.0.tgz" } } }, "supports-color": { "version": "2.0.0", - "from": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "from": "supports-color@>=2.0.0 <3.0.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz" } } }, "commander": { "version": "2.9.0", - "from": "https://registry.npmjs.org/commander/-/commander-2.9.0.tgz", + "from": "commander@>=2.8.1 <3.0.0", "resolved": "https://registry.npmjs.org/commander/-/commander-2.9.0.tgz", "dependencies": { "graceful-readlink": { "version": "1.0.1", - "from": "https://registry.npmjs.org/graceful-readlink/-/graceful-readlink-1.0.1.tgz", + "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.13.0", + "version": "2.13.1", "from": "is-my-json-valid@>=2.12.0 <3.0.0", - "resolved": "https://registry.npmjs.org/is-my-json-valid/-/is-my-json-valid-2.13.0.tgz", + "resolved": "https://registry.npmjs.org/is-my-json-valid/-/is-my-json-valid-2.13.1.tgz", "dependencies": { "generate-function": { "version": "2.0.0", - "from": "https://registry.npmjs.org/generate-function/-/generate-function-2.0.0.tgz", + "from": "generate-function@>=2.0.0 <3.0.0", "resolved": "https://registry.npmjs.org/generate-function/-/generate-function-2.0.0.tgz" }, "generate-object-property": { "version": "1.2.0", - "from": "https://registry.npmjs.org/generate-object-property/-/generate-object-property-1.2.0.tgz", + "from": "generate-object-property@>=1.1.0 <2.0.0", "resolved": "https://registry.npmjs.org/generate-object-property/-/generate-object-property-1.2.0.tgz", "dependencies": { "is-property": { "version": "1.0.2", - "from": "https://registry.npmjs.org/is-property/-/is-property-1.0.2.tgz", + "from": "is-property@>=1.0.0 <2.0.0", "resolved": "https://registry.npmjs.org/is-property/-/is-property-1.0.2.tgz" } } }, "jsonpointer": { "version": "2.0.0", - "from": "https://registry.npmjs.org/jsonpointer/-/jsonpointer-2.0.0.tgz", + "from": "jsonpointer@2.0.0", "resolved": "https://registry.npmjs.org/jsonpointer/-/jsonpointer-2.0.0.tgz" }, "xtend": { "version": "4.0.1", - "from": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", + "from": "xtend@>=4.0.0 <5.0.0", "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz" } } @@ -828,17 +833,17 @@ }, "step": { "version": "0.0.6", - "from": "https://registry.npmjs.org/step/-/step-0.0.6.tgz", + "from": "step@>=0.0.6 <0.1.0", "resolved": "https://registry.npmjs.org/step/-/step-0.0.6.tgz" }, "step-profiler": { "version": "0.2.1", - "from": "https://registry.npmjs.org/step-profiler/-/step-profiler-0.2.1.tgz", + "from": "step-profiler@>=0.2.1 <0.3.0", "resolved": "https://registry.npmjs.org/step-profiler/-/step-profiler-0.2.1.tgz" }, "turbo-cartocss": { "version": "0.4.0", - "from": "turbo-cartocss@latest", + "from": "turbo-cartocss@0.4.0", "resolved": "https://registry.npmjs.org/turbo-cartocss/-/turbo-cartocss-0.4.0.tgz", "dependencies": { "browser-request": { @@ -1361,12 +1366,12 @@ }, "underscore": { "version": "1.6.0", - "from": "https://registry.npmjs.org/underscore/-/underscore-1.6.0.tgz", + "from": "underscore@>=1.6.0 <1.7.0", "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.6.0.tgz" }, "windshaft": { "version": "1.13.2", - "from": "https://registry.npmjs.org/windshaft/-/windshaft-1.13.2.tgz", + "from": "windshaft@1.13.2", "resolved": "https://registry.npmjs.org/windshaft/-/windshaft-1.13.2.tgz", "dependencies": { "abaculus": { @@ -1381,7 +1386,7 @@ "dependencies": { "nan": { "version": "1.9.0", - "from": "https://registry.npmjs.org/nan/-/nan-1.9.0.tgz", + "from": "nan@>=1.8.4 <2.0.0", "resolved": "https://registry.npmjs.org/nan/-/nan-1.9.0.tgz" } } @@ -1393,22 +1398,22 @@ "dependencies": { "mapnik-reference": { "version": "6.0.5", - "from": "https://registry.npmjs.org/mapnik-reference/-/mapnik-reference-6.0.5.tgz", + "from": "mapnik-reference@>=6.0.2 <6.1.0", "resolved": "https://registry.npmjs.org/mapnik-reference/-/mapnik-reference-6.0.5.tgz" }, "optimist": { "version": "0.6.1", - "from": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", + "from": "optimist@>=0.6.0 <0.7.0", "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", "dependencies": { "wordwrap": { "version": "0.0.3", - "from": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz", + "from": "wordwrap@>=0.0.2 <0.1.0", "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz" }, "minimist": { "version": "0.0.10", - "from": "https://registry.npmjs.org/minimist/-/minimist-0.0.10.tgz", + "from": "minimist@>=0.0.1 <0.1.0", "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.10.tgz" } } @@ -1417,22 +1422,22 @@ }, "cartodb-psql": { "version": "0.6.1", - "from": "https://registry.npmjs.org/cartodb-psql/-/cartodb-psql-0.6.1.tgz", + "from": "cartodb-psql@>=0.6.1 <0.7.0", "resolved": "https://registry.npmjs.org/cartodb-psql/-/cartodb-psql-0.6.1.tgz", "dependencies": { "pg": { "version": "2.6.2-cdb3", - "from": "git://github.com/CartoDB/node-postgres.git#069c5296d1a093077feff21719641bb9e71fc50e", + "from": "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": "https://registry.npmjs.org/generic-pool/-/generic-pool-2.0.3.tgz", + "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": "https://registry.npmjs.org/buffer-writer/-/buffer-writer-1.0.0.tgz", + "from": "buffer-writer@1.0.0", "resolved": "https://registry.npmjs.org/buffer-writer/-/buffer-writer-1.0.0.tgz" } } @@ -1441,7 +1446,7 @@ }, "grainstore": { "version": "1.1.1", - "from": "https://registry.npmjs.org/grainstore/-/grainstore-1.1.1.tgz", + "from": "grainstore@1.1.1", "resolved": "https://registry.npmjs.org/grainstore/-/grainstore-1.1.1.tgz", "dependencies": { "carto": { @@ -1451,39 +1456,39 @@ "dependencies": { "underscore": { "version": "1.4.4", - "from": "https://registry.npmjs.org/underscore/-/underscore-1.4.4.tgz", + "from": "underscore@>=1.4.3 <1.5.0", "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.4.4.tgz" }, "mapnik-reference": { "version": "5.0.9", - "from": "https://registry.npmjs.org/mapnik-reference/-/mapnik-reference-5.0.9.tgz", + "from": "mapnik-reference@>=5.0.7 <5.1.0", "resolved": "https://registry.npmjs.org/mapnik-reference/-/mapnik-reference-5.0.9.tgz" }, "xml2js": { "version": "0.2.8", - "from": "https://registry.npmjs.org/xml2js/-/xml2js-0.2.8.tgz", + "from": "xml2js@>=0.2.4 <0.3.0", "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.2.8.tgz", "dependencies": { "sax": { "version": "0.5.8", - "from": "https://registry.npmjs.org/sax/-/sax-0.5.8.tgz", + "from": "sax@>=0.5.0 <0.6.0", "resolved": "https://registry.npmjs.org/sax/-/sax-0.5.8.tgz" } } }, "optimist": { "version": "0.6.1", - "from": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", + "from": "optimist@>=0.6.0 <0.7.0", "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", "dependencies": { "wordwrap": { "version": "0.0.3", - "from": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz", + "from": "wordwrap@>=0.0.2 <0.1.0", "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz" }, "minimist": { "version": "0.0.10", - "from": "https://registry.npmjs.org/minimist/-/minimist-0.0.10.tgz", + "from": "minimist@>=0.0.1 <0.1.0", "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.10.tgz" } } @@ -1492,22 +1497,22 @@ }, "millstone": { "version": "0.6.16", - "from": "https://registry.npmjs.org/millstone/-/millstone-0.6.16.tgz", + "from": "millstone@0.6.16", "resolved": "https://registry.npmjs.org/millstone/-/millstone-0.6.16.tgz", "dependencies": { "generic-pool": { "version": "2.1.1", - "from": "https://registry.npmjs.org/generic-pool/-/generic-pool-2.1.1.tgz", + "from": "generic-pool@>=2.1.1 <2.2.0", "resolved": "https://registry.npmjs.org/generic-pool/-/generic-pool-2.1.1.tgz" }, "srs": { "version": "0.4.9", - "from": "https://registry.npmjs.org/srs/-/srs-0.4.9.tgz", + "from": "srs@>=0.4.6 <0.5.0", "resolved": "https://registry.npmjs.org/srs/-/srs-0.4.9.tgz", "dependencies": { "nan": { "version": "1.8.4", - "from": "https://registry.npmjs.org/nan/-/nan-1.8.4.tgz", + "from": "nan@>=1.8.4 <1.9.0", "resolved": "https://registry.npmjs.org/nan/-/nan-1.8.4.tgz" }, "node-pre-gyp": { @@ -2234,12 +2239,12 @@ }, "zipfile": { "version": "0.5.9", - "from": "https://registry.npmjs.org/zipfile/-/zipfile-0.5.9.tgz", + "from": "zipfile@>=0.5.5 <0.6.0", "resolved": "https://registry.npmjs.org/zipfile/-/zipfile-0.5.9.tgz", "dependencies": { "nan": { "version": "2.1.0", - "from": "https://registry.npmjs.org/nan/-/nan-2.1.0.tgz", + "from": "nan@>=2.1.0 <2.2.0", "resolved": "https://registry.npmjs.org/nan/-/nan-2.1.0.tgz" }, "node-pre-gyp": { @@ -3024,12 +3029,12 @@ }, "sqlite3": { "version": "3.1.1", - "from": "https://registry.npmjs.org/sqlite3/-/sqlite3-3.1.1.tgz", + "from": "sqlite3@>=2.0.0 <3.0.0||>=3.0.0 <4.0.0", "resolved": "https://registry.npmjs.org/sqlite3/-/sqlite3-3.1.1.tgz", "dependencies": { "nan": { "version": "2.1.0", - "from": "https://registry.npmjs.org/nan/-/nan-2.1.0.tgz", + "from": "nan@>=2.1.0 <2.2.0", "resolved": "https://registry.npmjs.org/nan/-/nan-2.1.0.tgz" }, "node-pre-gyp": { @@ -3756,34 +3761,34 @@ }, "mime": { "version": "1.2.11", - "from": "https://registry.npmjs.org/mime/-/mime-1.2.11.tgz", + "from": "mime@>=1.2.11 <1.3.0", "resolved": "https://registry.npmjs.org/mime/-/mime-1.2.11.tgz" }, "mkdirp": { "version": "0.5.1", - "from": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "from": "mkdirp@>=0.5.0 <0.6.0", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", "dependencies": { "minimist": { "version": "0.0.8", - "from": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "from": "minimist@0.0.8", "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz" } } }, "optimist": { "version": "0.6.1", - "from": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", + "from": "optimist@>=0.6.1 <0.7.0", "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", "dependencies": { "wordwrap": { "version": "0.0.3", - "from": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz", + "from": "wordwrap@>=0.0.2 <0.1.0", "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz" }, "minimist": { "version": "0.0.10", - "from": "https://registry.npmjs.org/minimist/-/minimist-0.0.10.tgz", + "from": "minimist@>=0.0.1 <0.1.0", "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.10.tgz" } } @@ -3799,17 +3804,17 @@ "dependencies": { "nan": { "version": "1.2.0", - "from": "https://registry.npmjs.org/nan/-/nan-1.2.0.tgz", + "from": "nan@>=1.2.0 <1.3.0", "resolved": "https://registry.npmjs.org/nan/-/nan-1.2.0.tgz" }, "mapnik-vector-tile": { "version": "0.5.5", - "from": "https://registry.npmjs.org/mapnik-vector-tile/-/mapnik-vector-tile-0.5.5.tgz", + "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": "https://registry.npmjs.org/node-pre-gyp/-/node-pre-gyp-0.5.25.tgz", + "from": "node-pre-gyp@0.5.25", "resolved": "https://registry.npmjs.org/node-pre-gyp/-/node-pre-gyp-0.5.25.tgz", "dependencies": { "nopt": { @@ -4179,32 +4184,32 @@ }, "semver": { "version": "5.0.3", - "from": "https://registry.npmjs.org/semver/-/semver-5.0.3.tgz", + "from": "semver@>=5.0.3 <5.1.0", "resolved": "https://registry.npmjs.org/semver/-/semver-5.0.3.tgz" }, "sphericalmercator": { "version": "1.0.3", - "from": "https://registry.npmjs.org/sphericalmercator/-/sphericalmercator-1.0.3.tgz", + "from": "sphericalmercator@1.0.3", "resolved": "https://registry.npmjs.org/sphericalmercator/-/sphericalmercator-1.0.3.tgz" }, "tilelive": { "version": "4.5.3", - "from": "https://registry.npmjs.org/tilelive/-/tilelive-4.5.3.tgz", + "from": "tilelive@>=4.5.3 <4.6.0", "resolved": "https://registry.npmjs.org/tilelive/-/tilelive-4.5.3.tgz", "dependencies": { "optimist": { "version": "0.6.1", - "from": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", + "from": "optimist@>=0.6.0 <0.7.0", "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", "dependencies": { "wordwrap": { "version": "0.0.3", - "from": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz", + "from": "wordwrap@>=0.0.2 <0.1.0", "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz" }, "minimist": { "version": "0.0.10", - "from": "https://registry.npmjs.org/minimist/-/minimist-0.0.10.tgz", + "from": "minimist@>=0.0.1 <0.1.0", "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.10.tgz" } } @@ -4223,12 +4228,12 @@ "dependencies": { "generic-pool": { "version": "2.1.1", - "from": "https://registry.npmjs.org/generic-pool/-/generic-pool-2.1.1.tgz", + "from": "generic-pool@>=2.1.1 <2.2.0", "resolved": "https://registry.npmjs.org/generic-pool/-/generic-pool-2.1.1.tgz" }, "xtend": { "version": "3.0.0", - "from": "https://registry.npmjs.org/xtend/-/xtend-3.0.0.tgz", + "from": "xtend@>=3.0.0 <3.1.0", "resolved": "https://registry.npmjs.org/xtend/-/xtend-3.0.0.tgz" } } @@ -4242,543 +4247,20 @@ "dependencies": { "generic-pool": { "version": "2.1.1", - "from": "https://registry.npmjs.org/generic-pool/-/generic-pool-2.1.1.tgz", + "from": "generic-pool@>=2.1.1 <2.2.0", "resolved": "https://registry.npmjs.org/generic-pool/-/generic-pool-2.1.1.tgz" }, "mime": { "version": "1.2.11", - "from": "https://registry.npmjs.org/mime/-/mime-1.2.11.tgz", + "from": "mime@>=1.2.11 <1.3.0", "resolved": "https://registry.npmjs.org/mime/-/mime-1.2.11.tgz" } } }, "torque.js": { "version": "2.11.4", - "from": "https://registry.npmjs.org/torque.js/-/torque.js-2.11.4.tgz", + "from": "torque.js@>=2.11.0 <2.12.0", "resolved": "https://registry.npmjs.org/torque.js/-/torque.js-2.11.4.tgz" - }, - "turbo-cartocss": { - "version": "0.4.0", - "from": "https://registry.npmjs.org/turbo-cartocss/-/turbo-cartocss-0.4.0.tgz", - "resolved": "https://registry.npmjs.org/turbo-cartocss/-/turbo-cartocss-0.4.0.tgz", - "dependencies": { - "browser-request": { - "version": "0.3.3", - "from": "https://registry.npmjs.org/browser-request/-/browser-request-0.3.3.tgz", - "resolved": "https://registry.npmjs.org/browser-request/-/browser-request-0.3.3.tgz" - }, - "colorbrewer": { - "version": "0.0.2", - "from": "https://registry.npmjs.org/colorbrewer/-/colorbrewer-0.0.2.tgz", - "resolved": "https://registry.npmjs.org/colorbrewer/-/colorbrewer-0.0.2.tgz" - }, - "es6-promise": { - "version": "3.1.2", - "from": "https://registry.npmjs.org/es6-promise/-/es6-promise-3.1.2.tgz", - "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-3.1.2.tgz" - }, - "less": { - "version": "2.6.1", - "from": "less@>=2.5.3 <3.0.0", - "resolved": "https://registry.npmjs.org/less/-/less-2.6.1.tgz", - "dependencies": { - "errno": { - "version": "0.1.4", - "from": "https://registry.npmjs.org/errno/-/errno-0.1.4.tgz", - "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.4.tgz", - "dependencies": { - "prr": { - "version": "0.0.0", - "from": "https://registry.npmjs.org/prr/-/prr-0.0.0.tgz", - "resolved": "https://registry.npmjs.org/prr/-/prr-0.0.0.tgz" - } - } - }, - "graceful-fs": { - "version": "4.1.3", - "from": "graceful-fs@>=4.1.2 <5.0.0", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.3.tgz" - }, - "image-size": { - "version": "0.4.0", - "from": "image-size@>=0.4.0 <0.5.0", - "resolved": "https://registry.npmjs.org/image-size/-/image-size-0.4.0.tgz" - }, - "mime": { - "version": "1.3.4", - "from": "https://registry.npmjs.org/mime/-/mime-1.3.4.tgz", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.3.4.tgz" - }, - "mkdirp": { - "version": "0.5.1", - "from": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", - "dependencies": { - "minimist": { - "version": "0.0.8", - "from": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz" - } - } - }, - "promise": { - "version": "7.1.1", - "from": "promise@>=7.1.1 <8.0.0", - "resolved": "https://registry.npmjs.org/promise/-/promise-7.1.1.tgz", - "dependencies": { - "asap": { - "version": "2.0.3", - "from": "asap@>=2.0.3 <2.1.0", - "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.3.tgz" - } - } - }, - "source-map": { - "version": "0.5.3", - "from": "source-map@>=0.5.3 <0.6.0", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.3.tgz" - } - } - }, - "postcss": { - "version": "5.0.19", - "from": "https://registry.npmjs.org/postcss/-/postcss-5.0.19.tgz", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.0.19.tgz", - "dependencies": { - "supports-color": { - "version": "3.1.2", - "from": "https://registry.npmjs.org/supports-color/-/supports-color-3.1.2.tgz", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.1.2.tgz", - "dependencies": { - "has-flag": { - "version": "1.0.0", - "from": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz" - } - } - }, - "source-map": { - "version": "0.5.3", - "from": "https://registry.npmjs.org/source-map/-/source-map-0.5.3.tgz", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.3.tgz" - }, - "js-base64": { - "version": "2.1.9", - "from": "https://registry.npmjs.org/js-base64/-/js-base64-2.1.9.tgz", - "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-2.1.9.tgz" - } - } - }, - "postcss-value-parser": { - "version": "3.3.0", - "from": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.0.tgz", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.0.tgz" - }, - "querystring": { - "version": "0.2.0", - "from": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", - "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz" - }, - "request": { - "version": "2.69.0", - "from": "https://registry.npmjs.org/request/-/request-2.69.0.tgz", - "resolved": "https://registry.npmjs.org/request/-/request-2.69.0.tgz", - "dependencies": { - "aws-sign2": { - "version": "0.6.0", - "from": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.6.0.tgz", - "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.6.0.tgz" - }, - "aws4": { - "version": "1.3.2", - "from": "https://registry.npmjs.org/aws4/-/aws4-1.3.2.tgz", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.3.2.tgz", - "dependencies": { - "lru-cache": { - "version": "4.0.0", - "from": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.0.0.tgz", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.0.0.tgz", - "dependencies": { - "pseudomap": { - "version": "1.0.2", - "from": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", - "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz" - }, - "yallist": { - "version": "2.0.0", - "from": "https://registry.npmjs.org/yallist/-/yallist-2.0.0.tgz", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.0.0.tgz" - } - } - } - } - }, - "bl": { - "version": "1.0.3", - "from": "https://registry.npmjs.org/bl/-/bl-1.0.3.tgz", - "resolved": "https://registry.npmjs.org/bl/-/bl-1.0.3.tgz", - "dependencies": { - "readable-stream": { - "version": "2.0.5", - "from": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.0.5.tgz", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.0.5.tgz", - "dependencies": { - "core-util-is": { - "version": "1.0.2", - "from": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz" - }, - "inherits": { - "version": "2.0.1", - "from": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz" - }, - "isarray": { - "version": "0.0.1", - "from": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz" - }, - "process-nextick-args": { - "version": "1.0.6", - "from": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.6.tgz", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.6.tgz" - }, - "string_decoder": { - "version": "0.10.31", - "from": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz" - }, - "util-deprecate": { - "version": "1.0.2", - "from": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz" - } - } - } - } - }, - "caseless": { - "version": "0.11.0", - "from": "https://registry.npmjs.org/caseless/-/caseless-0.11.0.tgz", - "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.11.0.tgz" - }, - "combined-stream": { - "version": "1.0.5", - "from": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.5.tgz", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.5.tgz", - "dependencies": { - "delayed-stream": { - "version": "1.0.0", - "from": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz" - } - } - }, - "extend": { - "version": "3.0.0", - "from": "https://registry.npmjs.org/extend/-/extend-3.0.0.tgz", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.0.tgz" - }, - "forever-agent": { - "version": "0.6.1", - "from": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", - "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz" - }, - "form-data": { - "version": "1.0.0-rc3", - "from": "https://registry.npmjs.org/form-data/-/form-data-1.0.0-rc3.tgz", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-1.0.0-rc3.tgz", - "dependencies": { - "async": { - "version": "1.5.2", - "from": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", - "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz" - } - } - }, - "har-validator": { - "version": "2.0.6", - "from": "https://registry.npmjs.org/har-validator/-/har-validator-2.0.6.tgz", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-2.0.6.tgz", - "dependencies": { - "chalk": { - "version": "1.1.1", - "from": "https://registry.npmjs.org/chalk/-/chalk-1.1.1.tgz", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.1.tgz", - "dependencies": { - "ansi-styles": { - "version": "2.2.0", - "from": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.0.tgz", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.0.tgz", - "dependencies": { - "color-convert": { - "version": "1.0.0", - "from": "https://registry.npmjs.org/color-convert/-/color-convert-1.0.0.tgz", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.0.0.tgz" - } - } - }, - "escape-string-regexp": { - "version": "1.0.5", - "from": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz" - }, - "has-ansi": { - "version": "2.0.0", - "from": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", - "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", - "dependencies": { - "ansi-regex": { - "version": "2.0.0", - "from": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.0.0.tgz", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.0.0.tgz" - } - } - }, - "strip-ansi": { - "version": "3.0.1", - "from": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "dependencies": { - "ansi-regex": { - "version": "2.0.0", - "from": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.0.0.tgz", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.0.0.tgz" - } - } - }, - "supports-color": { - "version": "2.0.0", - "from": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz" - } - } - }, - "commander": { - "version": "2.9.0", - "from": "https://registry.npmjs.org/commander/-/commander-2.9.0.tgz", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.9.0.tgz", - "dependencies": { - "graceful-readlink": { - "version": "1.0.1", - "from": "https://registry.npmjs.org/graceful-readlink/-/graceful-readlink-1.0.1.tgz", - "resolved": "https://registry.npmjs.org/graceful-readlink/-/graceful-readlink-1.0.1.tgz" - } - } - }, - "is-my-json-valid": { - "version": "2.13.1", - "from": "https://registry.npmjs.org/is-my-json-valid/-/is-my-json-valid-2.13.1.tgz", - "resolved": "https://registry.npmjs.org/is-my-json-valid/-/is-my-json-valid-2.13.1.tgz", - "dependencies": { - "generate-function": { - "version": "2.0.0", - "from": "https://registry.npmjs.org/generate-function/-/generate-function-2.0.0.tgz", - "resolved": "https://registry.npmjs.org/generate-function/-/generate-function-2.0.0.tgz" - }, - "generate-object-property": { - "version": "1.2.0", - "from": "https://registry.npmjs.org/generate-object-property/-/generate-object-property-1.2.0.tgz", - "resolved": "https://registry.npmjs.org/generate-object-property/-/generate-object-property-1.2.0.tgz", - "dependencies": { - "is-property": { - "version": "1.0.2", - "from": "https://registry.npmjs.org/is-property/-/is-property-1.0.2.tgz", - "resolved": "https://registry.npmjs.org/is-property/-/is-property-1.0.2.tgz" - } - } - }, - "jsonpointer": { - "version": "2.0.0", - "from": "https://registry.npmjs.org/jsonpointer/-/jsonpointer-2.0.0.tgz", - "resolved": "https://registry.npmjs.org/jsonpointer/-/jsonpointer-2.0.0.tgz" - }, - "xtend": { - "version": "4.0.1", - "from": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz" - } - } - }, - "pinkie-promise": { - "version": "2.0.0", - "from": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.0.tgz", - "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.0.tgz", - "dependencies": { - "pinkie": { - "version": "2.0.4", - "from": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", - "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz" - } - } - } - } - }, - "hawk": { - "version": "3.1.3", - "from": "https://registry.npmjs.org/hawk/-/hawk-3.1.3.tgz", - "resolved": "https://registry.npmjs.org/hawk/-/hawk-3.1.3.tgz", - "dependencies": { - "hoek": { - "version": "2.16.3", - "from": "https://registry.npmjs.org/hoek/-/hoek-2.16.3.tgz", - "resolved": "https://registry.npmjs.org/hoek/-/hoek-2.16.3.tgz" - }, - "boom": { - "version": "2.10.1", - "from": "https://registry.npmjs.org/boom/-/boom-2.10.1.tgz", - "resolved": "https://registry.npmjs.org/boom/-/boom-2.10.1.tgz" - }, - "cryptiles": { - "version": "2.0.5", - "from": "https://registry.npmjs.org/cryptiles/-/cryptiles-2.0.5.tgz", - "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-2.0.5.tgz" - }, - "sntp": { - "version": "1.0.9", - "from": "https://registry.npmjs.org/sntp/-/sntp-1.0.9.tgz", - "resolved": "https://registry.npmjs.org/sntp/-/sntp-1.0.9.tgz" - } - } - }, - "http-signature": { - "version": "1.1.1", - "from": "https://registry.npmjs.org/http-signature/-/http-signature-1.1.1.tgz", - "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.1.1.tgz", - "dependencies": { - "assert-plus": { - "version": "0.2.0", - "from": "https://registry.npmjs.org/assert-plus/-/assert-plus-0.2.0.tgz", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-0.2.0.tgz" - }, - "jsprim": { - "version": "1.2.2", - "from": "https://registry.npmjs.org/jsprim/-/jsprim-1.2.2.tgz", - "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.2.2.tgz", - "dependencies": { - "extsprintf": { - "version": "1.0.2", - "from": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.0.2.tgz", - "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.0.2.tgz" - }, - "json-schema": { - "version": "0.2.2", - "from": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.2.tgz", - "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.2.tgz" - }, - "verror": { - "version": "1.3.6", - "from": "https://registry.npmjs.org/verror/-/verror-1.3.6.tgz", - "resolved": "https://registry.npmjs.org/verror/-/verror-1.3.6.tgz" - } - } - }, - "sshpk": { - "version": "1.7.4", - "from": "https://registry.npmjs.org/sshpk/-/sshpk-1.7.4.tgz", - "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.7.4.tgz", - "dependencies": { - "asn1": { - "version": "0.2.3", - "from": "https://registry.npmjs.org/asn1/-/asn1-0.2.3.tgz", - "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.3.tgz" - }, - "dashdash": { - "version": "1.13.0", - "from": "https://registry.npmjs.org/dashdash/-/dashdash-1.13.0.tgz", - "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.13.0.tgz", - "dependencies": { - "assert-plus": { - "version": "1.0.0", - "from": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz" - } - } - }, - "jsbn": { - "version": "0.1.0", - "from": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.0.tgz", - "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.0.tgz" - }, - "tweetnacl": { - "version": "0.14.1", - "from": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.1.tgz", - "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.1.tgz" - }, - "jodid25519": { - "version": "1.0.2", - "from": "https://registry.npmjs.org/jodid25519/-/jodid25519-1.0.2.tgz", - "resolved": "https://registry.npmjs.org/jodid25519/-/jodid25519-1.0.2.tgz" - }, - "ecc-jsbn": { - "version": "0.1.1", - "from": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz", - "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz" - } - } - } - } - }, - "is-typedarray": { - "version": "1.0.0", - "from": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz" - }, - "isstream": { - "version": "0.1.2", - "from": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz" - }, - "json-stringify-safe": { - "version": "5.0.1", - "from": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz" - }, - "mime-types": { - "version": "2.1.10", - "from": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.10.tgz", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.10.tgz", - "dependencies": { - "mime-db": { - "version": "1.22.0", - "from": "https://registry.npmjs.org/mime-db/-/mime-db-1.22.0.tgz", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.22.0.tgz" - } - } - }, - "node-uuid": { - "version": "1.4.7", - "from": "https://registry.npmjs.org/node-uuid/-/node-uuid-1.4.7.tgz", - "resolved": "https://registry.npmjs.org/node-uuid/-/node-uuid-1.4.7.tgz" - }, - "oauth-sign": { - "version": "0.8.1", - "from": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.1.tgz", - "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.1.tgz" - }, - "qs": { - "version": "6.0.2", - "from": "https://registry.npmjs.org/qs/-/qs-6.0.2.tgz", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.0.2.tgz" - }, - "stringstream": { - "version": "0.0.5", - "from": "https://registry.npmjs.org/stringstream/-/stringstream-0.0.5.tgz", - "resolved": "https://registry.npmjs.org/stringstream/-/stringstream-0.0.5.tgz" - }, - "tough-cookie": { - "version": "2.2.1", - "from": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.2.1.tgz", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.2.1.tgz" - }, - "tunnel-agent": { - "version": "0.4.2", - "from": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.4.2.tgz", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.4.2.tgz" - } - } - } - } } } } From f47842c96d115de80a7ccdfad74cff031f3b9be0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Garc=C3=ADa=20Aubert?= Date: Wed, 9 Mar 2016 20:12:51 +0100 Subject: [PATCH 09/17] Integrated turbo-cartocss adapter for named maps --- lib/cartodb/controllers/map.js | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/lib/cartodb/controllers/map.js b/lib/cartodb/controllers/map.js index 54d018f1..dc0d1162 100644 --- a/lib/cartodb/controllers/map.js +++ b/lib/cartodb/controllers/map.js @@ -256,6 +256,22 @@ MapController.prototype.instantiateTemplate = function(req, res, prepareParamsFn } ); }, + function parseTurboCartoCss(err, requestMapConfig, datasource) { + assert.ifError(err); + + var next = this; + self.turboCartoCssAdapter.getLayers(req.context.user, requestMapConfig.layers, function (err, layers) { + if (err) { + return next(err); + } + + if (layers) { + requestMapConfig.layers = layers; + } + + return next(null, requestMapConfig, datasource); + }); + }, function createLayergroup(err, mapConfig_, rendererParams) { assert.ifError(err); mapConfig = mapConfig_; From dab4b6d56b79baf2ea7585ada2d831ea1b13fa16 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Garc=C3=ADa=20Aubert?= Date: Thu, 10 Mar 2016 20:45:00 +0100 Subject: [PATCH 10/17] Implemented integration of turbo-cartocss for named maps --- lib/cartodb/controllers/map.js | 16 -- lib/cartodb/controllers/named_maps_admin.js | 24 ++- lib/cartodb/server.js | 2 +- .../utils/style/turbo-cartocss-adapter.js | 6 +- ...ss.js => turbo-cartocss-anonymous-maps.js} | 2 +- test/acceptance/turbo-cartocss-named-maps.js | 182 ++++++++++++++++++ 6 files changed, 210 insertions(+), 22 deletions(-) rename test/acceptance/{turbo-cartocss.js => turbo-cartocss-anonymous-maps.js} (98%) create mode 100644 test/acceptance/turbo-cartocss-named-maps.js diff --git a/lib/cartodb/controllers/map.js b/lib/cartodb/controllers/map.js index aac8679c..2f93caa0 100644 --- a/lib/cartodb/controllers/map.js +++ b/lib/cartodb/controllers/map.js @@ -255,22 +255,6 @@ MapController.prototype.instantiateTemplate = function(req, res, prepareParamsFn } ); }, - function parseTurboCartoCss(err, requestMapConfig, datasource) { - assert.ifError(err); - - var next = this; - self.turboCartoCssAdapter.getLayers(req.context.user, requestMapConfig.layers, function (err, layers) { - if (err) { - return next(err); - } - - if (layers) { - requestMapConfig.layers = layers; - } - - return next(null, requestMapConfig, datasource); - }); - }, function createLayergroup(err, mapConfig_, rendererParams) { assert.ifError(err); mapConfig = mapConfig_; diff --git a/lib/cartodb/controllers/named_maps_admin.js b/lib/cartodb/controllers/named_maps_admin.js index cd17b5c7..5a644ea5 100644 --- a/lib/cartodb/controllers/named_maps_admin.js +++ b/lib/cartodb/controllers/named_maps_admin.js @@ -15,11 +15,12 @@ var userMiddleware = require('../middleware/user'); * @param {TemplateMaps} templateMaps * @constructor */ -function NamedMapsAdminController(authApi, pgConnection, templateMaps) { +function NamedMapsAdminController(authApi, pgConnection, templateMaps, turboCartoCssAdapter) { BaseController.call(this, authApi, pgConnection); this.authApi = authApi; this.templateMaps = templateMaps; + this.turboCartoCssAdapter = turboCartoCssAdapter; } util.inherits(NamedMapsAdminController, BaseController); @@ -44,11 +45,30 @@ NamedMapsAdminController.prototype.create = function(req, res) { function checkPerms(){ self.authApi.authorizedByAPIKey(cdbuser, req, this); }, - function addTemplate(err, authenticated) { + function parseTurboCartoCss(err, authenticated) { assert.ifError(err); + ifUnauthenticated(authenticated, 'Only authenticated users can get template maps'); ifInvalidContentType(req, 'template POST data must be of type application/json'); + + var next = this; var cfg = req.body; + + self.turboCartoCssAdapter.getLayers(req.context.user, cfg.layergroup.layers, function (err, layers) { + if (err) { + return next(err); + } + + if (layers) { + cfg.layergroup.layers = layers; + } + + return next(null, cfg); + }); + }, + function addTemplate(err, cfg) { + assert.ifError(err); + self.templateMaps.addTemplate(cdbuser, cfg, this); }, function prepareResponse(err, tpl_id){ diff --git a/lib/cartodb/server.js b/lib/cartodb/server.js index ac1f185d..dd599485 100644 --- a/lib/cartodb/server.js +++ b/lib/cartodb/server.js @@ -196,7 +196,7 @@ module.exports = function(serverOptions) { metadataBackend ).register(app); - new controller.NamedMapsAdmin(authApi, pgConnection, templateMaps).register(app); + new controller.NamedMapsAdmin(authApi, pgConnection, templateMaps, turboCartocssAdapter).register(app); new controller.ServerInfo().register(app); diff --git a/lib/cartodb/utils/style/turbo-cartocss-adapter.js b/lib/cartodb/utils/style/turbo-cartocss-adapter.js index 44500c9e..7f181c4e 100644 --- a/lib/cartodb/utils/style/turbo-cartocss-adapter.js +++ b/lib/cartodb/utils/style/turbo-cartocss-adapter.js @@ -32,7 +32,9 @@ TurboCartocssAdapter.prototype.getLayers = function (username, layers, callback) TurboCartocssAdapter.prototype._parseCartoCss = function (username, layer, callback) { if (isNotLayerToParseCartocss(layer)) { - return callback(null, layer); + return process.nextTick(function () { + callback(null, layer); + }); } this.turboCartocssParser.process(username, layer.options.cartocss, layer.options.sql, function (err, cartocss) { @@ -46,7 +48,7 @@ TurboCartocssAdapter.prototype._parseCartoCss = function (username, layer, callb }; function isNotLayerToParseCartocss(layer) { - if ( layer.type !== 'mapnik' && layer.type !== 'cartodb' && layer.type !== 'torque' ) { + if (!layer || !layer.options || !layer.options.cartocss || !layer.options.sql) { return true; } diff --git a/test/acceptance/turbo-cartocss.js b/test/acceptance/turbo-cartocss-anonymous-maps.js similarity index 98% rename from test/acceptance/turbo-cartocss.js rename to test/acceptance/turbo-cartocss-anonymous-maps.js index ae2de717..32134d94 100644 --- a/test/acceptance/turbo-cartocss.js +++ b/test/acceptance/turbo-cartocss-anonymous-maps.js @@ -38,7 +38,7 @@ function makeMapconfig(cartocss) { }; } -describe('turbo-cartocss', function() { +describe('turbo-cartocss for anonymous maps', function() { describe('parsing ramp function with colorbrewer for greens and mapnik renderer', function () { beforeEach(function () { var turboCartocss = '#layer { marker-fill: ramp([price], colorbrewer(Greens)); }'; diff --git a/test/acceptance/turbo-cartocss-named-maps.js b/test/acceptance/turbo-cartocss-named-maps.js new file mode 100644 index 00000000..6e277520 --- /dev/null +++ b/test/acceptance/turbo-cartocss-named-maps.js @@ -0,0 +1,182 @@ +var assert = require('../support/assert'); +var step = require('step'); +var LayergroupToken = require('../../lib/cartodb/models/layergroup_token'); +var testHelper = require(__dirname + '/../support/test_helper'); +var CartodbWindshaft = require(__dirname + '/../../lib/cartodb/server'); +var serverOptions = require(__dirname + '/../../lib/cartodb/server_options'); +var server = new CartodbWindshaft(serverOptions); + +describe('turbo-cartocss for named maps', function() { + + var keysToDelete; + + beforeEach(function() { + keysToDelete = {}; + }); + + afterEach(function(done) { + testHelper.deleteRedisKeys(keysToDelete, done); + }); + + var expectedCartocss = [ + '#layer {', + ' marker-allow-overlap:true;', + ' marker-fill:#fee5d9;', + ' [ price > 10.25 ] { marker-fill:#fcae91}', + ' [ price > 10.75 ] { marker-fill:#fb6a4a}', + ' [ price > 11.5 ] { marker-fill:#de2d26}', + ' [ price > 16.5 ] { marker-fill:#a50f15}', + '}' + ].join(''); + + var templateId = 'turbo-cartocss-template-1'; + + var template = { + version: '0.0.1', + name: templateId, + auth: { method: 'open' }, + layergroup: { + version: '1.0.0', + layers: [{ + options: { + sql: [ + 'SELECT test_table.*, _prices.price FROM test_table JOIN (' + + ' SELECT 1 AS cartodb_id, 10.00 AS price', + ' UNION', + ' SELECT 2, 10.50', + ' UNION', + ' SELECT 3, 11.00', + ' UNION', + ' SELECT 4, 12.00', + ' UNION', + ' SELECT 5, 21.00', + ') _prices ON _prices.cartodb_id = test_table.cartodb_id' + ].join('\n'), + cartocss: [ + '#layer {' + + ' marker-fill: ramp([price], colorbrewer(Reds));' + + ' marker-allow-overlap:true;' + + '}' + ].join(''), + cartocss_version: '2.0.2' + } + } + ] + } + }; + + var layergroup = { + version: '1.3.0', + layers: [{ + type: 'named', + options: { + name: templateId, + } + }] + }; + + it('should create a template with turbo-cartocss parsed properly', function (done) { + step( + function postTemplate() { + var next = this; + + assert.response(server, { + url: '/api/v1/map/named?api_key=1234', + method: 'POST', + headers: { host: 'localhost', 'Content-Type': 'application/json' }, + data: JSON.stringify(template) + }, {}, + function (res, err) { + next(err, res); + }); + }, + function checkTemplate(err, res) { + assert.ifError(err); + assert.equal(res.statusCode, 200); + assert.deepEqual(JSON.parse(res.body), { + template_id: templateId + }); + + return null; + }, + function createLayergroup(err) { + assert.ifError(err); + + var next = this; + + assert.response(server, { + url: '/api/v1/map', + method: 'POST', + headers: { host: 'localhost', 'Content-Type': 'application/json' }, + data: JSON.stringify(layergroup) + }, {}, + function (res, err) { + next(err, res); + }); + }, + function checkLayergroup(err, res) { + assert.ifError(err); + assert.equal(res.statusCode, 200); + + var parsedBody = JSON.parse(res.body); + + keysToDelete['map_cfg|' + LayergroupToken.parse(parsedBody.layergroupid).token] = 0; + keysToDelete['user:localhost:mapviews:global'] = 5; + + assert.ok(parsedBody.layergroupid); + assert.ok(parsedBody.last_updated); + assert.deepEqual(parsedBody.metadata.layers[0].meta.cartocss, expectedCartocss); + + return parsedBody.layergroupid; + }, + function requestTile(err, layergroupId) { + assert.ifError(err); + + var next = this; + + assert.response(server, { + url: '/api/v1/map/' + layergroupId + '/0/0/0.png', + method: 'GET', + headers: { host: 'localhost' }, + encoding: 'binary' + }, {}, + function(res, err) { + next(err, res); + }); + }, + function checkTile(err, res) { + assert.ifError(err); + + assert.equal(res.statusCode, 200); + assert.equal(res.headers['content-type'], 'image/png'); + + testHelper.checkCache(res); + + return null; + }, + function deleteTemplate(err) { + assert.ifError(err); + + var next = this; + + assert.response(server, { + url: '/api/v1/map/named/' + templateId + '?api_key=1234', + method: 'DELETE', + headers: { host: 'localhost' } + }, {}, function (res, err) { + next(err, res); + }); + }, + function checkDeleteTemplate(err, res) { + assert.ifError(err); + assert.equal(res.statusCode, 204); + assert.ok(!res.body); + + return null; + }, + function finish(err) { + done(err); + } + ); + }); +}); From d937d8970d51fa87f2b67fce8f84a73d87fcbe9d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Garc=C3=ADa=20Aubert?= Date: Thu, 10 Mar 2016 21:25:01 +0100 Subject: [PATCH 11/17] Fixed broken test in turbo-cartocss for named maps --- test/acceptance/turbo-cartocss-named-maps.js | 23 +++++++++++++++++++- 1 file changed, 22 insertions(+), 1 deletion(-) diff --git a/test/acceptance/turbo-cartocss-named-maps.js b/test/acceptance/turbo-cartocss-named-maps.js index 6e277520..763bca09 100644 --- a/test/acceptance/turbo-cartocss-named-maps.js +++ b/test/acceptance/turbo-cartocss-named-maps.js @@ -125,7 +125,6 @@ describe('turbo-cartocss for named maps', function() { assert.ok(parsedBody.layergroupid); assert.ok(parsedBody.last_updated); - assert.deepEqual(parsedBody.metadata.layers[0].meta.cartocss, expectedCartocss); return parsedBody.layergroupid; }, @@ -154,6 +153,28 @@ describe('turbo-cartocss for named maps', function() { return null; }, + function getTemplate() { + var next = this; + + assert.response(server, { + url: '/api/v1/map/named/' + templateId + '?api_key=1234', + method: 'GET', + headers: { host: 'localhost' } + }, {}, + function(res, err) { + next(err, res); + }); + }, + function checkTemplate(err, res) { + assert.ifError(err); + + assert.equal(res.statusCode, 200); + + var bodyParsed = JSON.parse(res.body); + assert.equal(bodyParsed.template.layergroup.layers[0].options.cartocss, expectedCartocss); + + return null; + }, function deleteTemplate(err) { assert.ifError(err); From cc5443152b29bdcfed2041bad904fe661f225983 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Garc=C3=ADa=20Aubert?= Date: Fri, 11 Mar 2016 11:06:51 +0100 Subject: [PATCH 12/17] Now turbo-cartocss is also parsed in template modification. --- lib/cartodb/controllers/named_maps_admin.js | 29 ++++++- test/acceptance/turbo-cartocss-named-maps.js | 82 ++++++++++++++++++-- 2 files changed, 101 insertions(+), 10 deletions(-) diff --git a/lib/cartodb/controllers/named_maps_admin.js b/lib/cartodb/controllers/named_maps_admin.js index 5a644ea5..34013ece 100644 --- a/lib/cartodb/controllers/named_maps_admin.js +++ b/lib/cartodb/controllers/named_maps_admin.js @@ -85,18 +85,39 @@ NamedMapsAdminController.prototype.update = function(req, res) { var cdbuser = req.context.user; var template; var tpl_id; + step( function checkPerms(){ self.authApi.authorizedByAPIKey(cdbuser, req, this); }, - function updateTemplate(err, authenticated) { + function parseTurboCartoCss(err, authenticated) { assert.ifError(err); - ifUnauthenticated(authenticated, 'Only authenticated user can update templated maps'); - ifInvalidContentType(req, 'template PUT data must be of type application/json'); + ifUnauthenticated(authenticated, 'Only authenticated users can get template maps'); + ifInvalidContentType(req, 'template POST data must be of type application/json'); + + var next = this; template = req.body; + + self.turboCartoCssAdapter.getLayers(cdbuser, template.layergroup.layers, function (err, layers) { + if (err) { + return next(err); + } + + if (layers) { + template.layergroup.layers = layers; + } + + return next(); + }); + }, + function updateTemplate(err) { + assert.ifError(err); + + var next = this; + tpl_id = templateName(req.params.template_id); - self.templateMaps.updTemplate(cdbuser, tpl_id, template, this); + self.templateMaps.updTemplate(cdbuser, tpl_id, template, next); }, function prepareResponse(err){ assert.ifError(err); diff --git a/test/acceptance/turbo-cartocss-named-maps.js b/test/acceptance/turbo-cartocss-named-maps.js index 763bca09..4d22e78a 100644 --- a/test/acceptance/turbo-cartocss-named-maps.js +++ b/test/acceptance/turbo-cartocss-named-maps.js @@ -18,6 +18,13 @@ describe('turbo-cartocss for named maps', function() { testHelper.deleteRedisKeys(keysToDelete, done); }); + var turboCartocss = [ + '#layer {' + + ' marker-fill: ramp([price], colorbrewer(Reds));' + + ' marker-allow-overlap:true;' + + '}' + ].join(''); + var expectedCartocss = [ '#layer {', ' marker-allow-overlap:true;', @@ -29,6 +36,24 @@ describe('turbo-cartocss for named maps', function() { '}' ].join(''); + var turboCartocssModified = [ + '#layer {' + + ' marker-fill: ramp([price], colorbrewer(Blues));' + + ' marker-allow-overlap:true;' + + '}' + ].join(''); + + var expectedUpdatedCartocss = [ + '#layer {', + ' marker-allow-overlap:true;', + ' marker-fill:#eff3ff;', + ' [ price > 10.25 ] { marker-fill:#bdd7e7}', + ' [ price > 10.75 ] { marker-fill:#6baed6}', + ' [ price > 11.5 ] { marker-fill:#3182bd}', + ' [ price > 16.5 ] { marker-fill:#08519c}', + '}' + ].join(''); + var templateId = 'turbo-cartocss-template-1'; var template = { @@ -52,12 +77,7 @@ describe('turbo-cartocss for named maps', function() { ' SELECT 5, 21.00', ') _prices ON _prices.cartodb_id = test_table.cartodb_id' ].join('\n'), - cartocss: [ - '#layer {' + - ' marker-fill: ramp([price], colorbrewer(Reds));' + - ' marker-allow-overlap:true;' + - '}' - ].join(''), + cartocss: turboCartocss, cartocss_version: '2.0.2' } } @@ -175,6 +195,56 @@ describe('turbo-cartocss for named maps', function() { return null; }, + function updateTemplate() { + var next = this; + + // clone the previous one and rename it + var changedTemplate = JSON.parse(JSON.stringify(template)); + changedTemplate.layergroup.layers[0].options.cartocss = turboCartocssModified; + + assert.response(server, { + url: '/api/v1/map/named/' + templateId + '/?api_key=1234', + method: 'PUT', + headers: { host: 'localhost', 'Content-Type': 'application/json' }, + data: JSON.stringify(changedTemplate) + }, {}, + function (res, err) { + next(err, res); + }); + }, + function checkUpdatedTemplate(err, res) { + assert.ifError(err); + + assert.equal(res.statusCode, 200); + + assert.deepEqual(JSON.parse(res.body), { + template_id: templateId + }); + + return null; + }, + function getUpdatedTemplate() { + var next = this; + + assert.response(server, { + url: '/api/v1/map/named/' + templateId + '?api_key=1234', + method: 'GET', + headers: { host: 'localhost' } + }, {}, + function(res, err) { + next(err, res); + }); + }, + function checkGetUpdatedTemplate(err, res) { + assert.ifError(err); + + var bodyParsed = JSON.parse(res.body); + + assert.equal(res.statusCode, 200); + assert.equal(bodyParsed.template.layergroup.layers[0].options.cartocss, expectedUpdatedCartocss); + + return null; + }, function deleteTemplate(err) { assert.ifError(err); From 052b58ab90047335b130d539b44cc5003fa1a79a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Garc=C3=ADa=20Aubert?= Date: Fri, 11 Mar 2016 18:28:14 +0100 Subject: [PATCH 13/17] Moved turbo-cartocss integration from named maps admin to named map provider --- lib/cartodb/cache/named_map_provider_cache.js | 4 +- lib/cartodb/controllers/map.js | 1 + lib/cartodb/controllers/named_maps_admin.js | 48 +---- .../models/mapconfig/named_map_provider.js | 15 +- lib/cartodb/server.js | 16 +- test/acceptance/turbo-cartocss-named-maps.js | 189 +++++++----------- .../turbo-cartocss-named-maps-blues.png | Bin 0 -> 356 bytes .../turbo-cartocss-named-maps-reds.png | Bin 0 -> 349 bytes 8 files changed, 109 insertions(+), 164 deletions(-) create mode 100644 test/fixtures/turbo-cartocss-named-maps-blues.png create mode 100644 test/fixtures/turbo-cartocss-named-maps-reds.png diff --git a/lib/cartodb/cache/named_map_provider_cache.js b/lib/cartodb/cache/named_map_provider_cache.js index 0048cb63..7bb8e25c 100644 --- a/lib/cartodb/cache/named_map_provider_cache.js +++ b/lib/cartodb/cache/named_map_provider_cache.js @@ -7,12 +7,13 @@ var queue = require('queue-async'); var LruCache = require("lru-cache"); -function NamedMapProviderCache(templateMaps, pgConnection, userLimitsApi) { +function NamedMapProviderCache(templateMaps, pgConnection, userLimitsApi, turboCartocssAdapter) { this.templateMaps = templateMaps; this.pgConnection = pgConnection; this.userLimitsApi = userLimitsApi; this.namedLayersAdapter = new MapConfigNamedLayersAdapter(templateMaps); + this.turboCartocssAdapter = turboCartocssAdapter; this.providerCache = new LruCache({ max: 2000 }); } @@ -30,6 +31,7 @@ NamedMapProviderCache.prototype.get = function(user, templateId, config, authTok this.pgConnection, this.userLimitsApi, this.namedLayersAdapter, + this.turboCartocssAdapter, user, templateId, config, diff --git a/lib/cartodb/controllers/map.js b/lib/cartodb/controllers/map.js index 2f93caa0..36b7b975 100644 --- a/lib/cartodb/controllers/map.js +++ b/lib/cartodb/controllers/map.js @@ -231,6 +231,7 @@ MapController.prototype.instantiateTemplate = function(req, res, prepareParamsFn self.pgConnection, self.userLimitsApi, self.namedLayersAdapter, + self.turboCartoCssAdapter, cdbuser, req.params.template_id, templateParams, diff --git a/lib/cartodb/controllers/named_maps_admin.js b/lib/cartodb/controllers/named_maps_admin.js index 34013ece..c2d82f8c 100644 --- a/lib/cartodb/controllers/named_maps_admin.js +++ b/lib/cartodb/controllers/named_maps_admin.js @@ -15,12 +15,11 @@ var userMiddleware = require('../middleware/user'); * @param {TemplateMaps} templateMaps * @constructor */ -function NamedMapsAdminController(authApi, pgConnection, templateMaps, turboCartoCssAdapter) { +function NamedMapsAdminController(authApi, pgConnection, templateMaps) { BaseController.call(this, authApi, pgConnection); this.authApi = authApi; this.templateMaps = templateMaps; - this.turboCartoCssAdapter = turboCartoCssAdapter; } util.inherits(NamedMapsAdminController, BaseController); @@ -45,30 +44,11 @@ NamedMapsAdminController.prototype.create = function(req, res) { function checkPerms(){ self.authApi.authorizedByAPIKey(cdbuser, req, this); }, - function parseTurboCartoCss(err, authenticated) { + function addTemplate(err, authenticated) { assert.ifError(err); - ifUnauthenticated(authenticated, 'Only authenticated users can get template maps'); ifInvalidContentType(req, 'template POST data must be of type application/json'); - - var next = this; var cfg = req.body; - - self.turboCartoCssAdapter.getLayers(req.context.user, cfg.layergroup.layers, function (err, layers) { - if (err) { - return next(err); - } - - if (layers) { - cfg.layergroup.layers = layers; - } - - return next(null, cfg); - }); - }, - function addTemplate(err, cfg) { - assert.ifError(err); - self.templateMaps.addTemplate(cdbuser, cfg, this); }, function prepareResponse(err, tpl_id){ @@ -90,34 +70,14 @@ NamedMapsAdminController.prototype.update = function(req, res) { function checkPerms(){ self.authApi.authorizedByAPIKey(cdbuser, req, this); }, - function parseTurboCartoCss(err, authenticated) { + function updateTemplate(err, authenticated) { assert.ifError(err); - ifUnauthenticated(authenticated, 'Only authenticated users can get template maps'); ifInvalidContentType(req, 'template POST data must be of type application/json'); - var next = this; template = req.body; - - self.turboCartoCssAdapter.getLayers(cdbuser, template.layergroup.layers, function (err, layers) { - if (err) { - return next(err); - } - - if (layers) { - template.layergroup.layers = layers; - } - - return next(); - }); - }, - function updateTemplate(err) { - assert.ifError(err); - - var next = this; - tpl_id = templateName(req.params.template_id); - self.templateMaps.updTemplate(cdbuser, tpl_id, template, next); + self.templateMaps.updTemplate(cdbuser, tpl_id, template, this); }, function prepareResponse(err){ assert.ifError(err); diff --git a/lib/cartodb/models/mapconfig/named_map_provider.js b/lib/cartodb/models/mapconfig/named_map_provider.js index 3e09b466..a31bda13 100644 --- a/lib/cartodb/models/mapconfig/named_map_provider.js +++ b/lib/cartodb/models/mapconfig/named_map_provider.js @@ -12,11 +12,12 @@ var QueryTables = require('cartodb-query-tables'); * @type {NamedMapMapConfigProvider} */ function NamedMapMapConfigProvider(templateMaps, pgConnection, userLimitsApi, namedLayersAdapter, - owner, templateId, config, authToken, params) { + turboCartoCssAdapter, owner, templateId, config, authToken, params) { this.templateMaps = templateMaps; this.pgConnection = pgConnection; this.userLimitsApi = userLimitsApi; this.namedLayersAdapter = namedLayersAdapter; + this.turboCartoCssAdapter = turboCartoCssAdapter; this.owner = owner; this.templateName = templateName(templateId); @@ -91,6 +92,18 @@ NamedMapMapConfigProvider.prototype.getMapConfig = function(callback) { } ); }, + function parseTurboCartoCss(err, _mapConfig, datasource) { + assert.ifError(err); + var next = this; + + self.turboCartoCssAdapter.getLayers(self.owner, _mapConfig.layers, function (err, layers) { + if (!err && layers) { + _mapConfig.layers = layers; + } + + return next(null, _mapConfig, datasource); + }); + }, function beforeLayergroupCreate(err, _mapConfig, _datasource) { assert.ifError(err); mapConfig = _mapConfig; diff --git a/lib/cartodb/server.js b/lib/cartodb/server.js index dd599485..28eea3c5 100644 --- a/lib/cartodb/server.js +++ b/lib/cartodb/server.js @@ -142,7 +142,16 @@ module.exports = function(serverOptions) { var layergroupAffectedTablesCache = new LayergroupAffectedTablesCache(); app.layergroupAffectedTablesCache = layergroupAffectedTablesCache; - var namedMapProviderCache = new NamedMapProviderCache(templateMaps, pgConnection, userLimitsApi); + var turboCartoCssParser = new TurboCartocssParser(pgQueryRunner); + var turboCartocssAdapter = new TurboCartocssAdapter(turboCartoCssParser); + + var namedMapProviderCache = new NamedMapProviderCache( + templateMaps, + pgConnection, + userLimitsApi, + turboCartocssAdapter + ); + ['update', 'delete'].forEach(function(eventType) { templateMaps.on(eventType, namedMapProviderCache.invalidate.bind(namedMapProviderCache)); }); @@ -152,9 +161,6 @@ module.exports = function(serverOptions) { var TablesExtentApi = require('./api/tables_extent_api'); var tablesExtentApi = new TablesExtentApi(pgQueryRunner); - var turboCartoCssParser = new TurboCartocssParser(pgQueryRunner); - var turboCartocssAdapter = new TurboCartocssAdapter(turboCartoCssParser); - /******************************************************************************************************************* * Routing ******************************************************************************************************************/ @@ -196,7 +202,7 @@ module.exports = function(serverOptions) { metadataBackend ).register(app); - new controller.NamedMapsAdmin(authApi, pgConnection, templateMaps, turboCartocssAdapter).register(app); + new controller.NamedMapsAdmin(authApi, pgConnection, templateMaps).register(app); new controller.ServerInfo().register(app); diff --git a/test/acceptance/turbo-cartocss-named-maps.js b/test/acceptance/turbo-cartocss-named-maps.js index 4d22e78a..07c81918 100644 --- a/test/acceptance/turbo-cartocss-named-maps.js +++ b/test/acceptance/turbo-cartocss-named-maps.js @@ -5,6 +5,8 @@ var testHelper = require(__dirname + '/../support/test_helper'); var CartodbWindshaft = require(__dirname + '/../../lib/cartodb/server'); var serverOptions = require(__dirname + '/../../lib/cartodb/server_options'); var server = new CartodbWindshaft(serverOptions); +var mapnik = require('windshaft').mapnik; +var IMAGE_TOLERANCE_PER_MIL = 1; describe('turbo-cartocss for named maps', function() { @@ -18,48 +20,18 @@ describe('turbo-cartocss for named maps', function() { testHelper.deleteRedisKeys(keysToDelete, done); }); - var turboCartocss = [ - '#layer {' + - ' marker-fill: ramp([price], colorbrewer(Reds));' + - ' marker-allow-overlap:true;' + - '}' - ].join(''); - - var expectedCartocss = [ - '#layer {', - ' marker-allow-overlap:true;', - ' marker-fill:#fee5d9;', - ' [ price > 10.25 ] { marker-fill:#fcae91}', - ' [ price > 10.75 ] { marker-fill:#fb6a4a}', - ' [ price > 11.5 ] { marker-fill:#de2d26}', - ' [ price > 16.5 ] { marker-fill:#a50f15}', - '}' - ].join(''); - - var turboCartocssModified = [ - '#layer {' + - ' marker-fill: ramp([price], colorbrewer(Blues));' + - ' marker-allow-overlap:true;' + - '}' - ].join(''); - - var expectedUpdatedCartocss = [ - '#layer {', - ' marker-allow-overlap:true;', - ' marker-fill:#eff3ff;', - ' [ price > 10.25 ] { marker-fill:#bdd7e7}', - ' [ price > 10.75 ] { marker-fill:#6baed6}', - ' [ price > 11.5 ] { marker-fill:#3182bd}', - ' [ price > 16.5 ] { marker-fill:#08519c}', - '}' - ].join(''); - var templateId = 'turbo-cartocss-template-1'; var template = { version: '0.0.1', name: templateId, auth: { method: 'open' }, + placeholders: { + color: { + type: "css_color", + default: "Reds" + } + }, layergroup: { version: '1.0.0', layers: [{ @@ -77,7 +49,12 @@ describe('turbo-cartocss for named maps', function() { ' SELECT 5, 21.00', ') _prices ON _prices.cartodb_id = test_table.cartodb_id' ].join('\n'), - cartocss: turboCartocss, + cartocss: [ + '#layer {', + ' marker-fill: ramp([price], colorbrewer(<%= color %>));', + ' marker-allow-overlap:true;', + '}' + ].join('\n'), cartocss_version: '2.0.2' } } @@ -85,15 +62,8 @@ describe('turbo-cartocss for named maps', function() { } }; - var layergroup = { - version: '1.3.0', - layers: [{ - type: 'named', - options: { - name: templateId, - } - }] - }; + var templateParamsReds = { color: 'Reds' }; + var templateParamsBlues = { color: 'Blues' }; it('should create a template with turbo-cartocss parsed properly', function (done) { step( @@ -119,23 +89,26 @@ describe('turbo-cartocss for named maps', function() { return null; }, - function createLayergroup(err) { + function instantiateTemplateWithReds(err) { assert.ifError(err); var next = this; - assert.response(server, { - url: '/api/v1/map', + url: '/api/v1/map/named/' + templateId, method: 'POST', - headers: { host: 'localhost', 'Content-Type': 'application/json' }, - data: JSON.stringify(layergroup) + headers: { + host: 'localhost', + 'Content-Type': 'application/json' + }, + data: JSON.stringify(templateParamsReds) }, {}, - function (res, err) { - next(err, res); + function(res, err) { + return next(err, res); }); }, - function checkLayergroup(err, res) { + function checkInstanciationWithReds(err, res) { assert.ifError(err); + assert.equal(res.statusCode, 200); var parsedBody = JSON.parse(res.body); @@ -148,7 +121,7 @@ describe('turbo-cartocss for named maps', function() { return parsedBody.layergroupid; }, - function requestTile(err, layergroupId) { + function requestTileReds(err, layergroupId) { assert.ifError(err); var next = this; @@ -163,87 +136,77 @@ describe('turbo-cartocss for named maps', function() { next(err, res); }); }, - function checkTile(err, res) { + function checkTileReds(err, res) { assert.ifError(err); + var next = this; + assert.equal(res.statusCode, 200); assert.equal(res.headers['content-type'], 'image/png'); - testHelper.checkCache(res); + var fixturePath = './test/fixtures/turbo-cartocss-named-maps-reds.png'; + var image = mapnik.Image.fromBytes(new Buffer(res.body, 'binary')); - return null; + assert.imageIsSimilarToFile(image, fixturePath, IMAGE_TOLERANCE_PER_MIL, next); }, - function getTemplate() { + function instantiateTemplateWithBlues(err) { + assert.ifError(err); + + var next = this; + assert.response(server, { + url: '/api/v1/map/named/' + templateId, + method: 'POST', + headers: { + host: 'localhost', + 'Content-Type': 'application/json' + }, + data: JSON.stringify(templateParamsBlues) + }, {}, + function(res, err) { + return next(err, res); + }); + }, + function checkInstanciationWithBlues(err, res) { + assert.ifError(err); + assert.equal(res.statusCode, 200); + + var parsedBody = JSON.parse(res.body); + + keysToDelete['map_cfg|' + LayergroupToken.parse(parsedBody.layergroupid).token] = 0; + keysToDelete['user:localhost:mapviews:global'] = 5; + + assert.ok(parsedBody.layergroupid); + assert.ok(parsedBody.last_updated); + + return parsedBody.layergroupid; + }, + function requestTileBlues(err, layergroupId) { + assert.ifError(err); + var next = this; assert.response(server, { - url: '/api/v1/map/named/' + templateId + '?api_key=1234', + url: '/api/v1/map/' + layergroupId + '/0/0/0.png', method: 'GET', - headers: { host: 'localhost' } + headers: { host: 'localhost' }, + encoding: 'binary' }, {}, function(res, err) { next(err, res); }); }, - function checkTemplate(err, res) { + function checkTileBlues(err, res) { assert.ifError(err); - assert.equal(res.statusCode, 200); - - var bodyParsed = JSON.parse(res.body); - assert.equal(bodyParsed.template.layergroup.layers[0].options.cartocss, expectedCartocss); - - return null; - }, - function updateTemplate() { var next = this; - // clone the previous one and rename it - var changedTemplate = JSON.parse(JSON.stringify(template)); - changedTemplate.layergroup.layers[0].options.cartocss = turboCartocssModified; - - assert.response(server, { - url: '/api/v1/map/named/' + templateId + '/?api_key=1234', - method: 'PUT', - headers: { host: 'localhost', 'Content-Type': 'application/json' }, - data: JSON.stringify(changedTemplate) - }, {}, - function (res, err) { - next(err, res); - }); - }, - function checkUpdatedTemplate(err, res) { - assert.ifError(err); - assert.equal(res.statusCode, 200); + assert.equal(res.headers['content-type'], 'image/png'); - assert.deepEqual(JSON.parse(res.body), { - template_id: templateId - }); + var fixturePath = './test/fixtures/turbo-cartocss-named-maps-blues.png'; + var image = mapnik.Image.fromBytes(new Buffer(res.body, 'binary')); - return null; - }, - function getUpdatedTemplate() { - var next = this; - - assert.response(server, { - url: '/api/v1/map/named/' + templateId + '?api_key=1234', - method: 'GET', - headers: { host: 'localhost' } - }, {}, - function(res, err) { - next(err, res); - }); - }, - function checkGetUpdatedTemplate(err, res) { - assert.ifError(err); - - var bodyParsed = JSON.parse(res.body); - - assert.equal(res.statusCode, 200); - assert.equal(bodyParsed.template.layergroup.layers[0].options.cartocss, expectedUpdatedCartocss); - - return null; + assert.imageIsSimilarToFile(image, fixturePath, IMAGE_TOLERANCE_PER_MIL, next); }, function deleteTemplate(err) { assert.ifError(err); diff --git a/test/fixtures/turbo-cartocss-named-maps-blues.png b/test/fixtures/turbo-cartocss-named-maps-blues.png new file mode 100644 index 0000000000000000000000000000000000000000..79f0d5d4c690fad1d1a563ba10aae7bd1c24ee00 GIT binary patch literal 356 zcmeAS@N?(olHy`uVBq!ia0y~yU<5K58911MRQ8&P5Fiy8;1l8sq#=NZhlh=gO;A{r zgM)*cUx-IYoKIAiM_is;Op#MunNvcYO;VdfN|RGsms3WMQ_he>$&$k`io-a8!z!1< zu9U;Ajl*vmN8p^@Nn1OCCi0X7`2{oZsisdZn=@_Wji=wr-6K?i;@do3978JRyuIcr zbVxzOH85%Y#UuAl{1eZLGz(7O=Xfsi;8SPDrBFAaQ}%0qAI_WEcVcGQ^{DsHV<+=* z&Mf)<%OvNrs^Z&#_;Z^}ypBEG`_F32%PBpV(;2q-gx@0+&w}SD8ALx#WAE}&f9CALWdLt90DJ$ z2|RK{;$3}^_R|fe>G~D#S?23;S%Fky0T0@f^(y6M1=DNyUbo`k+0DnfY1f%j!?}yS zo4y3sN}65NG(7eD&)19Y%a81+WeX@S@#=Y&f8aZ>L^)7q)_>MZWjC2$-FPE6A*ftS iReq5+7Avp_{g|%K@PK_w^v_i$AX!gWKbLh*2~7Ynnpi0S literal 0 HcmV?d00001 From a8340fef68f47a3828ae62ecbdf8329b2d1d579a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Garc=C3=ADa=20Aubert?= Date: Fri, 11 Mar 2016 18:33:52 +0100 Subject: [PATCH 14/17] Bump image tolerance in turbo-cartocss test --- test/acceptance/turbo-cartocss-named-maps.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/acceptance/turbo-cartocss-named-maps.js b/test/acceptance/turbo-cartocss-named-maps.js index 07c81918..3c90a973 100644 --- a/test/acceptance/turbo-cartocss-named-maps.js +++ b/test/acceptance/turbo-cartocss-named-maps.js @@ -6,7 +6,7 @@ var CartodbWindshaft = require(__dirname + '/../../lib/cartodb/server'); var serverOptions = require(__dirname + '/../../lib/cartodb/server_options'); var server = new CartodbWindshaft(serverOptions); var mapnik = require('windshaft').mapnik; -var IMAGE_TOLERANCE_PER_MIL = 1; +var IMAGE_TOLERANCE_PER_MIL = 10; describe('turbo-cartocss for named maps', function() { From 178345ab12b09f4ec7eb3c262a27355104ffe2ce Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Garc=C3=ADa=20Aubert?= Date: Mon, 14 Mar 2016 11:18:32 +0100 Subject: [PATCH 15/17] Fixed typo --- lib/cartodb/controllers/named_maps_admin.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/cartodb/controllers/named_maps_admin.js b/lib/cartodb/controllers/named_maps_admin.js index c2d82f8c..3d201049 100644 --- a/lib/cartodb/controllers/named_maps_admin.js +++ b/lib/cartodb/controllers/named_maps_admin.js @@ -72,8 +72,8 @@ NamedMapsAdminController.prototype.update = function(req, res) { }, function updateTemplate(err, authenticated) { assert.ifError(err); - ifUnauthenticated(authenticated, 'Only authenticated users can get template maps'); - ifInvalidContentType(req, 'template POST data must be of type application/json'); + ifUnauthenticated(authenticated, 'Only authenticated user can update templated maps'); + ifInvalidContentType(req, 'template PUT data must be of type application/json'); template = req.body; tpl_id = templateName(req.params.template_id); From f619a97f1a0083cb6e83d160d71dc0f99fe0a3e3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Garc=C3=ADa=20Aubert?= Date: Mon, 14 Mar 2016 12:06:33 +0100 Subject: [PATCH 16/17] Release 2.28.0 --- NEWS.md | 8 ++++++++ package.json | 2 +- 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/NEWS.md b/NEWS.md index 701cea00..68c79862 100644 --- a/NEWS.md +++ b/NEWS.md @@ -1,5 +1,13 @@ # Changelog + +## 2.28.0 + +Released 2016-03-14 + +New features: + - Added [turbo-cartocss](https://github.com/CartoDB/turbo-cartocss) to preprocess CartoCSS. + ## 2.27.0 Released 2016-03-09 diff --git a/package.json b/package.json index 6af7ddb1..86d4c7e3 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "private": true, "name": "windshaft-cartodb", - "version": "2.27.0", + "version": "2.28.0", "description": "A map tile server for CartoDB", "keywords": [ "cartodb" From be61d41f5e244724ecc744224cf0122656a2f01d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Garc=C3=ADa=20Aubert?= Date: Mon, 14 Mar 2016 12:12:56 +0100 Subject: [PATCH 17/17] Stubs next version --- NEWS.md | 4 ++++ package.json | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/NEWS.md b/NEWS.md index 68c79862..c7fd8afd 100644 --- a/NEWS.md +++ b/NEWS.md @@ -1,5 +1,9 @@ # Changelog +## 2.28.1 + +Released 2016-mm-dd + ## 2.28.0 diff --git a/package.json b/package.json index 86d4c7e3..348482bd 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "private": true, "name": "windshaft-cartodb", - "version": "2.28.0", + "version": "2.28.1", "description": "A map tile server for CartoDB", "keywords": [ "cartodb"