From 78408e50c52e0068b8f2523391252864dc0aa5ab Mon Sep 17 00:00:00 2001 From: yuua Date: Thu, 29 Dec 2016 10:54:57 +0900 Subject: [PATCH 001/112] impala query_runner get_tables error fix --- redash/query_runner/impala_ds.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/redash/query_runner/impala_ds.py b/redash/query_runner/impala_ds.py index e3337006..dec4c3c0 100644 --- a/redash/query_runner/impala_ds.py +++ b/redash/query_runner/impala_ds.py @@ -82,11 +82,11 @@ class Impala(BaseSQLQueryRunner): def _get_tables(self, schema_dict): schemas_query = "show schemas;" tables_query = "show tables in %s;" - columns_query = "show column stats %s;" + columns_query = "show column stats %s.%s;" - for schema_name in map(lambda a: a['name'], self._run_query_internal(schemas_query)): - for table_name in map(lambda a: a['name'], self._run_query_internal(tables_query % schema_name)): - columns = map(lambda a: a['Column'], self._run_query_internal(columns_query % table_name)) + for schema_name in filter(lambda a: len(a) > 0, map(lambda a: str(a['name']), self._run_query_internal(schemas_query))): + for table_name in filter(lambda a: len(a) > 0, map(lambda a: str(a['name']), self._run_query_internal(tables_query % schema_name))): + columns = filter(lambda a: len(a) > 0, map(lambda a: str(a['Column']), self._run_query_internal(columns_query % (schema_name, table_name)))) if schema_name != 'default': table_name = '{}.{}'.format(schema_name, table_name) From af978e966d693d01faf304129d1392f3b5e0fc9d Mon Sep 17 00:00:00 2001 From: deecay Date: Tue, 14 Feb 2017 16:53:11 +0900 Subject: [PATCH 002/112] Show vertical scrollbar for IE --- client/app/assets/css/superflat_redash.css | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/app/assets/css/superflat_redash.css b/client/app/assets/css/superflat_redash.css index ba9ed52a..912f6193 100644 --- a/client/app/assets/css/superflat_redash.css +++ b/client/app/assets/css/superflat_redash.css @@ -6430,7 +6430,7 @@ a { } html { overflow-x: hidden\0/; - -ms-overflow-style: none; + -ms-overflow-style: scroll; } html, body { From b2e747caef0ac5a4f4f08f5dd7ef04b5c415f346 Mon Sep 17 00:00:00 2001 From: Alexander Shepelin Date: Sat, 18 Feb 2017 23:10:15 +0300 Subject: [PATCH 003/112] refactor schema-browser directive to component style --- client/app/pages/queries/query.html | 5 ++- client/app/pages/queries/schema-browser.html | 15 ++++--- client/app/pages/queries/schema-browser.js | 41 ++++++++++---------- 3 files changed, 33 insertions(+), 28 deletions(-) diff --git a/client/app/pages/queries/query.html b/client/app/pages/queries/query.html index f3da2305..b93999e4 100644 --- a/client/app/pages/queries/query.html +++ b/client/app/pages/queries/query.html @@ -83,7 +83,10 @@
- +
diff --git a/client/app/pages/queries/schema-browser.html b/client/app/pages/queries/schema-browser.html index ed83a4bd..2a9b6d45 100644 --- a/client/app/pages/queries/schema-browser.html +++ b/client/app/pages/queries/schema-browser.html @@ -1,13 +1,16 @@
- +
-
-
-
- {{table.name}} - ({{table.size}}) +
+
+
+ + + {{table.name}} + ({{table.size}}) +
{{column}}
diff --git a/client/app/pages/queries/schema-browser.js b/client/app/pages/queries/schema-browser.js index e1912790..604c114d 100644 --- a/client/app/pages/queries/schema-browser.js +++ b/client/app/pages/queries/schema-browser.js @@ -1,31 +1,30 @@ import template from './schema-browser.html'; -function schemaBrowser() { - return { - restrict: 'E', - scope: { - schema: '=', - }, - template, - link($scope) { - $scope.showTable = (table) => { - table.collapsed = !table.collapsed; - $scope.$broadcast('vsRepeatTrigger'); - }; +function SchemaBrowserCtrl($scope) { + this.showTable = (table) => { + table.collapsed = !table.collapsed; + $scope.$broadcast('vsRepeatTrigger'); + }; - $scope.getSize = (table) => { - let size = 18; + this.getSize = (table) => { + let size = 18; - if (!table.collapsed) { - size += 18 * table.columns.length; - } + if (!table.collapsed) { + size += 18 * table.columns.length; + } - return size; - }; - }, + return size; }; } +const SchemaBrowser = { + bindings: { + schema: '<', + }, + controller: SchemaBrowserCtrl, + template, +}; + export default function (ngModule) { - ngModule.directive('schemaBrowser', schemaBrowser); + ngModule.component('schemaBrowser', SchemaBrowser); } From 2e751b3dadfd47f1729ddcf7eeff12a192c530c0 Mon Sep 17 00:00:00 2001 From: Arik Fraimovich Date: Sun, 19 Feb 2017 09:20:25 +0200 Subject: [PATCH 004/112] Fix: dashboards without tags break rendering --- client/app/pages/dashboards/dashboard-list.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/app/pages/dashboards/dashboard-list.js b/client/app/pages/dashboards/dashboard-list.js index fb3abd0b..892740db 100644 --- a/client/app/pages/dashboards/dashboard-list.js +++ b/client/app/pages/dashboards/dashboard-list.js @@ -46,7 +46,7 @@ function DashboardListCtrl(Dashboard, $location, clientConfig) { this.update = () => { this.dashboards.$promise.then((data) => { const filteredDashboards = data.map((dashboard) => { - dashboard.tags = dashboard.name.match(TAGS_REGEX).map(tag => tag.replace(/:$/, '')); + dashboard.tags = (dashboard.name.match(TAGS_REGEX) || []).map(tag => tag.replace(/:$/, '')); dashboard.untagged_name = dashboard.name.replace(TAGS_REGEX, '').trim(); return dashboard; }).filter((value) => { From a98df9439989b145bb7d06f37b4d49bff6286a06 Mon Sep 17 00:00:00 2001 From: Allen Short Date: Mon, 20 Feb 2017 12:20:55 -0600 Subject: [PATCH 005/112] Fix race condition in query task status reporting --- redash/tasks/queries.py | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/redash/tasks/queries.py b/redash/tasks/queries.py index 1bcbe3be..cc18ec59 100644 --- a/redash/tasks/queries.py +++ b/redash/tasks/queries.py @@ -155,23 +155,25 @@ class QueryTask(object): return self._async_result.id def to_dict(self): - if self._async_result.status == 'STARTED': - updated_at = self._async_result.result.get('start_time', 0) + task_info = self._async_result._get_task_meta() + result, task_status = task_info['result'], task_info['status'] + if task_status == 'STARTED': + updated_at = result.get('start_time', 0) else: updated_at = 0 - status = self.STATUSES[self._async_result.status] + status = self.STATUSES[task_status] - if isinstance(self._async_result.result, Exception): - error = self._async_result.result.message + if isinstance(result, Exception): + error = result.message status = 4 - elif self._async_result.status == 'REVOKED': + elif task_status == 'REVOKED': error = 'Query execution cancelled.' else: error = '' - if self._async_result.successful() and not error: - query_result_id = self._async_result.result + if task_status == 'SUCCESS' and not error: + query_result_id = result else: query_result_id = None From 8b59815bf21e9d69df9f3da2e4d16c639d3c1b5f Mon Sep 17 00:00:00 2001 From: Alexander Shepelin Date: Mon, 20 Feb 2017 23:56:21 +0300 Subject: [PATCH 006/112] add 'refresh schema' button to schema-browser --- client/app/assets/css/redash.css | 10 +++++++ client/app/pages/queries/query.html | 1 + client/app/pages/queries/schema-browser.html | 7 ++++- client/app/pages/queries/schema-browser.js | 1 + client/app/pages/queries/view.js | 29 ++++++++++++-------- client/app/services/data-source.js | 2 +- 6 files changed, 36 insertions(+), 14 deletions(-) diff --git a/client/app/assets/css/redash.css b/client/app/assets/css/redash.css index 9f01e388..a04e41be 100644 --- a/client/app/assets/css/redash.css +++ b/client/app/assets/css/redash.css @@ -415,6 +415,16 @@ counter-renderer counter-name { background-color: white; } +.schema-control { + display: flex; + padding: 5px 0; +} + +.schema-control .form-control { + height: 30px; + margin-right: 5px; +} + .schema-browser { height: calc(100% - 45px); overflow-y: auto; diff --git a/client/app/pages/queries/query.html b/client/app/pages/queries/query.html index b93999e4..439a34f6 100644 --- a/client/app/pages/queries/query.html +++ b/client/app/pages/queries/query.html @@ -85,6 +85,7 @@
diff --git a/client/app/pages/queries/schema-browser.html b/client/app/pages/queries/schema-browser.html index 2a9b6d45..65905cd9 100644 --- a/client/app/pages/queries/schema-browser.html +++ b/client/app/pages/queries/schema-browser.html @@ -1,6 +1,11 @@
-
+
+
diff --git a/client/app/pages/queries/schema-browser.js b/client/app/pages/queries/schema-browser.js index 604c114d..ece96de5 100644 --- a/client/app/pages/queries/schema-browser.js +++ b/client/app/pages/queries/schema-browser.js @@ -20,6 +20,7 @@ function SchemaBrowserCtrl($scope) { const SchemaBrowser = { bindings: { schema: '<', + onRefresh: '&', }, controller: SchemaBrowserCtrl, template, diff --git a/client/app/pages/queries/view.js b/client/app/pages/queries/view.js index 3c1dc568..369be50f 100644 --- a/client/app/pages/queries/view.js +++ b/client/app/pages/queries/view.js @@ -43,26 +43,31 @@ function QueryViewCtrl($scope, Events, $route, $routeParams, $http, $location, $ return dataSourceId; } - function updateSchema() { - $scope.hasSchema = false; - $scope.editorSize = 'col-md-12'; - DataSource.getSchema({ id: $scope.query.data_source_id }, (data) => { - if (data && data.length > 0) { + function toggleSchemaBrowser(hasSchema) { + $scope.hasSchema = hasSchema; + $scope.editorSize = hasSchema ? 'col-md-9' : 'col-md-12'; + } + + function getSchema(refresh = undefined) { + DataSource.getSchema({ id: $scope.query.data_source_id, refresh }, (data) => { + const hasSchema = data && (data.length > 0); + if (hasSchema) { $scope.schema = data; data.forEach((table) => { table.collapsed = true; }); - - $scope.editorSize = 'col-md-9'; - $scope.hasSchema = true; - } else { - $scope.schema = undefined; - $scope.hasSchema = false; - $scope.editorSize = 'col-md-12'; } + toggleSchemaBrowser(hasSchema); }); } + function updateSchema() { + toggleSchemaBrowser(false); + getSchema(); + } + + $scope.refreshSchema = () => getSchema(true); + function updateDataSources(dataSources) { // Filter out data sources the user can't query (or used by current query): $scope.dataSources = dataSources.filter(dataSource => diff --git a/client/app/services/data-source.js b/client/app/services/data-source.js index d7a9cbc8..b6d42379 100644 --- a/client/app/services/data-source.js +++ b/client/app/services/data-source.js @@ -3,7 +3,7 @@ function DataSource($resource) { get: { method: 'GET', cache: false, isArray: false }, query: { method: 'GET', cache: false, isArray: true }, test: { method: 'POST', cache: false, isArray: false, url: 'api/data_sources/:id/test' }, - getSchema: { method: 'GET', cache: true, isArray: true, url: 'api/data_sources/:id/schema' }, + getSchema: { method: 'GET', cache: false, isArray: true, url: 'api/data_sources/:id/schema' }, }; const DataSourceResource = $resource('api/data_sources/:id', { id: '@id' }, actions); From 3864f11694abe26949a9fc560e78f4f66fdcdd5c Mon Sep 17 00:00:00 2001 From: deecay Date: Tue, 21 Feb 2017 16:56:45 +0900 Subject: [PATCH 007/112] Add: Counter option to count resultset row count. --- client/app/visualizations/counter/counter-editor.html | 10 ++++++++-- client/app/visualizations/counter/index.js | 5 +++-- 2 files changed, 11 insertions(+), 4 deletions(-) diff --git a/client/app/visualizations/counter/counter-editor.html b/client/app/visualizations/counter/counter-editor.html index df0cda25..ab760ef9 100644 --- a/client/app/visualizations/counter/counter-editor.html +++ b/client/app/visualizations/counter/counter-editor.html @@ -2,13 +2,13 @@
- +
- +
@@ -25,4 +25,10 @@
+
+
+ + Count Rows +
+
diff --git a/client/app/visualizations/counter/index.js b/client/app/visualizations/counter/index.js index 1e2a7f87..11b24a8e 100644 --- a/client/app/visualizations/counter/index.js +++ b/client/app/visualizations/counter/index.js @@ -14,10 +14,11 @@ function CounterRenderer() { const counterColName = $scope.visualization.options.counterColName; const targetColName = $scope.visualization.options.targetColName; - if (counterColName) { + if ($scope.visualization.options.countRow) { + $scope.counterValue = queryData.length; + } else if (counterColName) { $scope.counterValue = queryData[rowNumber][counterColName]; } - if (targetColName) { $scope.targetValue = queryData[targetRowNumber][targetColName]; From 18a157ac846c7e444988ede8b6eac6e809865ec6 Mon Sep 17 00:00:00 2001 From: Takahiro Okada Date: Tue, 21 Feb 2017 22:26:50 +0900 Subject: [PATCH 008/112] handle count(*) in dynamo db --- redash/query_runner/dynamodb_sql.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/redash/query_runner/dynamodb_sql.py b/redash/query_runner/dynamodb_sql.py index 503b5275..a45f1f50 100644 --- a/redash/query_runner/dynamodb_sql.py +++ b/redash/query_runner/dynamodb_sql.py @@ -102,6 +102,8 @@ class DynamoDBSQL(BaseSQLQueryRunner): columns = [] rows = [] + if isinstance(result, basestring): + result = [{"value": result}] for item in res_dict: if not columns: From 2a447137d4b07fb14eda5df030704b8e478a1de9 Mon Sep 17 00:00:00 2001 From: Allen Short Date: Tue, 21 Feb 2017 13:11:32 -0600 Subject: [PATCH 009/112] Fix: make errors from Presto runner JSON-serializable --- redash/query_runner/presto.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/redash/query_runner/presto.py b/redash/query_runner/presto.py index 3b6e16b2..715fe6e4 100644 --- a/redash/query_runner/presto.py +++ b/redash/query_runner/presto.py @@ -121,6 +121,8 @@ class Presto(BaseQueryRunner): except Exception, ex: json_data = None error = ex.message + if not isinstance(error, basestring): + error = unicode(error) return json_data, error From db465ffe58a425b651930eaf1778ef179ed42d2a Mon Sep 17 00:00:00 2001 From: Arik Fraimovich Date: Wed, 22 Feb 2017 10:06:00 +0200 Subject: [PATCH 010/112] Rename res_dict to result and add comment. --- redash/query_runner/dynamodb_sql.py | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/redash/query_runner/dynamodb_sql.py b/redash/query_runner/dynamodb_sql.py index a45f1f50..7d433b2e 100644 --- a/redash/query_runner/dynamodb_sql.py +++ b/redash/query_runner/dynamodb_sql.py @@ -2,7 +2,6 @@ import json import logging import sys - from redash.query_runner import * from redash.utils import JSONEncoder @@ -98,14 +97,17 @@ class DynamoDBSQL(BaseSQLQueryRunner): try: engine = self._connect() - res_dict = engine.execute(query if str(query).endswith(';') else str(query)+';') + result = engine.execute(query if str(query).endswith(';') else str(query)+';') columns = [] rows = [] + + # When running a count query it returns the value as a string, in which case + # we transform it into a dictionary to be the same as regular queries. if isinstance(result, basestring): result = [{"value": result}] - for item in res_dict: + for item in result: if not columns: for k, v in item.iteritems(): columns.append({ From e6fc73f4440a69351e56e6db4b9c1f07f3970c6e Mon Sep 17 00:00:00 2001 From: Arik Fraimovich Date: Wed, 22 Feb 2017 12:40:22 +0200 Subject: [PATCH 011/112] Fix: Redash was using too many db connections Fixes #1561. The issue was caused by creating a new Flask app instance on every task execution, resulting in creating a new SQLALchemy connection pool and a new database connection. --- redash/tasks/alerts.py | 3 +-- redash/tasks/base.py | 18 ------------------ redash/tasks/general.py | 7 +++---- redash/tasks/queries.py | 11 +++++------ redash/worker.py | 28 +++++++++++++++++++++++++--- 5 files changed, 34 insertions(+), 33 deletions(-) delete mode 100644 redash/tasks/base.py diff --git a/redash/tasks/alerts.py b/redash/tasks/alerts.py index bd5bd0cc..657d7302 100644 --- a/redash/tasks/alerts.py +++ b/redash/tasks/alerts.py @@ -4,7 +4,6 @@ import datetime from redash.worker import celery from redash import utils from redash import models, settings -from .base import BaseTask logger = get_task_logger(__name__) @@ -34,7 +33,7 @@ def should_notify(alert, new_state): return new_state != alert.state or (alert.state == models.Alert.TRIGGERED_STATE and passed_rearm_threshold) -@celery.task(name="redash.tasks.check_alerts_for_query", base=BaseTask) +@celery.task(name="redash.tasks.check_alerts_for_query") def check_alerts_for_query(query_id): logger.debug("Checking query %d for alerts", query_id) diff --git a/redash/tasks/base.py b/redash/tasks/base.py deleted file mode 100644 index 81ac989d..00000000 --- a/redash/tasks/base.py +++ /dev/null @@ -1,18 +0,0 @@ -from celery import Task -from redash import create_app -from flask import has_app_context, current_app - - -class BaseTask(Task): - abstract = True - - def after_return(self, *args, **kwargs): - if hasattr(self, 'app_ctx'): - self.app_ctx.pop() - - def __call__(self, *args, **kwargs): - if not has_app_context(): - flask_app = current_app or create_app() - self.app_ctx = flask_app.app_context() - self.app_ctx.push() - return super(BaseTask, self).__call__(*args, **kwargs) diff --git a/redash/tasks/general.py b/redash/tasks/general.py index d03bfc7d..23936424 100644 --- a/redash/tasks/general.py +++ b/redash/tasks/general.py @@ -4,12 +4,11 @@ from flask_mail import Message from redash.worker import celery from redash.version_check import run_version_check from redash import models, mail, settings -from .base import BaseTask logger = get_task_logger(__name__) -@celery.task(name="redash.tasks.record_event", base=BaseTask) +@celery.task(name="redash.tasks.record_event") def record_event(raw_event): event = models.Event.record(raw_event) models.db.session.commit() @@ -28,7 +27,7 @@ def record_event(raw_event): logger.exception("Failed posting to %s", hook) -@celery.task(name="redash.tasks.version_check", base=BaseTask) +@celery.task(name="redash.tasks.version_check") def version_check(): run_version_check() @@ -46,7 +45,7 @@ def subscribe(form): requests.post('https://beacon.redash.io/subscribe', json=data) -@celery.task(name="redash.tasks.send_mail", base=BaseTask) +@celery.task(name="redash.tasks.send_mail") def send_mail(to, subject, html, text): from redash.wsgi import app diff --git a/redash/tasks/queries.py b/redash/tasks/queries.py index 1bcbe3be..59796319 100644 --- a/redash/tasks/queries.py +++ b/redash/tasks/queries.py @@ -9,7 +9,6 @@ from redash import redis_connection, models, statsd_client, settings, utils from redash.utils import gen_query_hash from redash.worker import celery from redash.query_runner import InterruptException -from .base import BaseTask from .alerts import check_alerts_for_query logger = get_task_logger(__name__) @@ -248,7 +247,7 @@ def enqueue_query(query, data_source, user_id, scheduled=False, metadata={}): return job -@celery.task(name="redash.tasks.refresh_queries", base=BaseTask) +@celery.task(name="redash.tasks.refresh_queries") def refresh_queries(): logger.info("Refreshing queries...") @@ -285,7 +284,7 @@ def refresh_queries(): statsd_client.gauge('manager.seconds_since_refresh', now - float(status.get('last_refresh_at', now))) -@celery.task(name="redash.tasks.cleanup_tasks", base=BaseTask) +@celery.task(name="redash.tasks.cleanup_tasks") def cleanup_tasks(): in_progress = QueryTaskTracker.all(QueryTaskTracker.IN_PROGRESS_LIST) for tracker in in_progress: @@ -317,7 +316,7 @@ def cleanup_tasks(): QueryTaskTracker.prune(QueryTaskTracker.DONE_LIST, 1000) -@celery.task(name="redash.tasks.cleanup_query_results", base=BaseTask) +@celery.task(name="redash.tasks.cleanup_query_results") def cleanup_query_results(): """ Job to cleanup unused query results -- such that no query links to them anymore, and older than @@ -338,7 +337,7 @@ def cleanup_query_results(): logger.info("Deleted %d unused query results.", deleted_count) -@celery.task(name="redash.tasks.refresh_schemas", base=BaseTask) +@celery.task(name="redash.tasks.refresh_schemas") def refresh_schemas(): """ Refreshes the data sources schemas. @@ -464,6 +463,6 @@ class QueryExecutor(object): # user_id is added last as a keyword argument for backward compatability -- to support executing previously submitted # jobs before the upgrade to this version. -@celery.task(name="redash.tasks.execute_query", bind=True, base=BaseTask, track_started=True) +@celery.task(name="redash.tasks.execute_query", bind=True, track_started=True) def execute_query(self, query, data_source_id, metadata, user_id=None): return QueryExecutor(self, query, data_source_id, user_id, metadata).run() diff --git a/redash/worker.py b/redash/worker.py index f1288119..19fabad9 100644 --- a/redash/worker.py +++ b/redash/worker.py @@ -2,10 +2,12 @@ from __future__ import absolute_import from random import randint from celery import Celery +from flask import current_app from datetime import timedelta from celery.schedules import crontab -from redash import settings, __version__ -from redash.metrics import celery +from celery.signals import worker_process_init +from redash import settings, __version__, create_app +from redash.metrics import celery as celery_metrics celery = Celery('redash', @@ -48,9 +50,29 @@ celery.conf.update(CELERY_RESULT_BACKEND=settings.CELERY_BACKEND, if settings.SENTRY_DSN: from raven import Client - from raven.contrib.celery import register_signal, register_logger_signal + from raven.contrib.celery import register_signal client = Client(settings.SENTRY_DSN, release=__version__) register_signal(client) +# Create a new Task base class, that pushes a new Flask app context to allow DB connections if needed. +TaskBase = celery.Task + + +class ContextTask(TaskBase): + abstract = True + + def __call__(self, *args, **kwargs): + with current_app.app_context(): + return TaskBase.__call__(self, *args, **kwargs) + +celery.Task = ContextTask + + +# Create Flask app after forking a new worker, to make sure no resources are shared between processes. +@worker_process_init.connect +def init_celery_flask_app(**kwargs): + app = create_app() + app.app_context().push() + From 907b33b5a00d519b7de7e2c0a67f91e7dfc3721d Mon Sep 17 00:00:00 2001 From: Arik Fraimovich Date: Wed, 22 Feb 2017 14:06:47 +0200 Subject: [PATCH 012/112] Fix: tests failling because they run on different app contextes --- redash/models.py | 3 +++ tests/tasks/test_refresh_queries.py | 1 + 2 files changed, 4 insertions(+) diff --git a/redash/models.py b/redash/models.py index 9f00f44b..5bf34073 100644 --- a/redash/models.py +++ b/redash/models.py @@ -424,6 +424,9 @@ class DataSource(BelongsToOrgMixin, db.Model): __tablename__ = 'data_sources' __table_args__ = (db.Index('data_sources_org_id_name', 'org_id', 'name'),) + def __eq__(self, other): + return self.id == other.id + def to_dict(self, all=False, with_permissions_for=None): d = { 'id': self.id, diff --git a/tests/tasks/test_refresh_queries.py b/tests/tasks/test_refresh_queries.py index 03dbfdd8..a43bc632 100644 --- a/tests/tasks/test_refresh_queries.py +++ b/tests/tasks/test_refresh_queries.py @@ -29,6 +29,7 @@ class TestRefreshQueries(BaseTestCase): query_hash=query.query_hash) query.latest_query_data = query_result db.session.add(query) + db.session.commit() query.data_source.pause() From 84ca02be09c0e5ba48e81546a1950011022daf19 Mon Sep 17 00:00:00 2001 From: Arik Fraimovich Date: Wed, 22 Feb 2017 15:52:22 +0200 Subject: [PATCH 013/112] Fix: download links broken on dashboards --- client/app/assets/css/redash.css | 9 +++++++++ client/app/pages/dashboards/widget.html | 4 ++-- client/app/services/query-result.js | 4 ++++ 3 files changed, 15 insertions(+), 2 deletions(-) diff --git a/client/app/assets/css/redash.css b/client/app/assets/css/redash.css index 9f01e388..cc9770f0 100644 --- a/client/app/assets/css/redash.css +++ b/client/app/assets/css/redash.css @@ -674,3 +674,12 @@ div.table-name:hover { .m-2{ margin:2px; } + +.dropdown-menu > .disabled{ + cursor: not-allowed; +} + +/* The real magic ;) */ +.dropdown-menu > .disabled > a{ + pointer-events: none; +} diff --git a/client/app/pages/dashboards/widget.html b/client/app/pages/dashboards/widget.html index fc020a36..f4627454 100644 --- a/client/app/pages/dashboards/widget.html +++ b/client/app/pages/dashboards/widget.html @@ -17,8 +17,8 @@ diff --git a/client/app/services/query-result.js b/client/app/services/query-result.js index 01974d2c..f3a4304d 100644 --- a/client/app/services/query-result.js +++ b/client/app/services/query-result.js @@ -216,6 +216,10 @@ function QueryResultService($resource, $timeout, $q) { return this.filteredData; } + isEmpty() { + return this.getData() === null || this.getData().length === 0; + } + getChartData(mapping) { const series = {}; From 2d82c4dc985093b62c32b22188f73a1a97e8ec4b Mon Sep 17 00:00:00 2001 From: Arik Fraimovich Date: Wed, 22 Feb 2017 16:19:22 +0200 Subject: [PATCH 014/112] Fix: multi filters broken on dashboards --- client/app/components/filters.html | 4 ++-- client/app/services/query-result.js | 6 +++++- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/client/app/components/filters.html b/client/app/components/filters.html index 6035f08e..58971ab6 100644 --- a/client/app/components/filters.html +++ b/client/app/components/filters.html @@ -1,14 +1,14 @@
- + {{filter.friendlyName}}: {{$select.selected | filterValue:filter}} {{value | filterValue:filter }} - + {{filter.friendlyName}}: {{$item | filterValue:filter}} {{value | filterValue:filter }} diff --git a/client/app/services/query-result.js b/client/app/services/query-result.js index f3a4304d..55104ada 100644 --- a/client/app/services/query-result.js +++ b/client/app/services/query-result.js @@ -343,7 +343,11 @@ function QueryResultService($resource, $timeout, $q) { filters.forEach((filter) => { filter.values.push(row[filter.name]); if (filter.values.length === 1) { - filter.current = row[filter.name]; + if (filter.multiple) { + filter.current = [row[filter.name]]; + } else { + filter.current = row[filter.name]; + } } }); }); From ca3e125da83a41740f9c3ac99ad14df572066066 Mon Sep 17 00:00:00 2001 From: Allen Short Date: Wed, 1 Feb 2017 22:39:27 -0600 Subject: [PATCH 015/112] Refactor outdated_queries/refresh_queries tests --- redash/models.py | 3 +- tests/tasks/test_refresh_queries.py | 132 ++++++++-------------------- tests/test_models.py | 91 +++++++++++++++++-- 3 files changed, 122 insertions(+), 104 deletions(-) diff --git a/redash/models.py b/redash/models.py index 5bf34073..cadb6e3d 100644 --- a/redash/models.py +++ b/redash/models.py @@ -789,7 +789,8 @@ class Query(ChangeTrackingMixin, TimestampMixin, BelongsToOrgMixin, db.Model): queries = (db.session.query(Query) .join(QueryResult) .join(DataSource) - .filter(Query.schedule != None)) + .filter(Query.schedule != None) + .order_by(Query.id)) now = utils.utcnow() outdated_queries = {} diff --git a/tests/tasks/test_refresh_queries.py b/tests/tasks/test_refresh_queries.py index a43bc632..12ce75a5 100644 --- a/tests/tasks/test_refresh_queries.py +++ b/tests/tasks/test_refresh_queries.py @@ -1,109 +1,47 @@ -import datetime from mock import patch, call, ANY from tests import BaseTestCase -from redash.utils import utcnow from redash.tasks import refresh_queries -from redash.models import db +from redash.models import Query -# TODO: this test should be split into two: -# 1. tests for Query.outdated_queries method -# 2. test for the refresh_query task -class TestRefreshQueries(BaseTestCase): +class TestRefreshQuery(BaseTestCase): def test_enqueues_outdated_queries(self): - query = self.factory.create_query(schedule="60") - retrieved_at = utcnow() - datetime.timedelta(minutes=10) - query_result = self.factory.create_query_result(retrieved_at=retrieved_at, query_text=query.query_text, - query_hash=query.query_hash) - query.latest_query_data = query_result - db.session.add(query) - - with patch('redash.tasks.queries.enqueue_query') as add_job_mock: + """ + refresh_queries() launches an execution task for each query returned + from Query.outdated_queries(). + """ + query1 = self.factory.create_query() + query2 = self.factory.create_query( + query_text="select 42;", + data_source=self.factory.create_data_source()) + oq = staticmethod(lambda: [query1, query2]) + with patch('redash.tasks.queries.enqueue_query') as add_job_mock, \ + patch.object(Query, 'outdated_queries', oq): refresh_queries() - add_job_mock.assert_called_with(query.query_text, query.data_source, query.user_id, scheduled=True, metadata=ANY) + self.assertEqual(add_job_mock.call_count, 2) + add_job_mock.assert_has_calls([ + call(query1.query_text, query1.data_source, query1.user_id, + scheduled=True, metadata=ANY), + call(query2.query_text, query2.data_source, query2.user_id, + scheduled=True, metadata=ANY)], any_order=True) def test_doesnt_enqueue_outdated_queries_for_paused_data_source(self): - query = self.factory.create_query(schedule="60") - retrieved_at = utcnow() - datetime.timedelta(minutes=10) - query_result = self.factory.create_query_result(retrieved_at=retrieved_at, query_text=query.query_text, - query_hash=query.query_hash) - query.latest_query_data = query_result - db.session.add(query) - db.session.commit() - + """ + refresh_queries() does not launch execution tasks for queries whose + data source is paused. + """ + query = self.factory.create_query() + oq = staticmethod(lambda: [query]) query.data_source.pause() + with patch.object(Query, 'outdated_queries', oq): + with patch('redash.tasks.queries.enqueue_query') as add_job_mock: + refresh_queries() + add_job_mock.assert_not_called() - with patch('redash.tasks.queries.enqueue_query') as add_job_mock: - refresh_queries() - add_job_mock.assert_not_called() + query.data_source.resume() - query.data_source.resume() - - with patch('redash.tasks.queries.enqueue_query') as add_job_mock: - refresh_queries() - add_job_mock.assert_called_with(query.query_text, query.data_source, query.user_id, scheduled=True, metadata=ANY) - - def test_skips_fresh_queries(self): - query = self.factory.create_query(schedule="1200") - retrieved_at = utcnow() - datetime.timedelta(minutes=10) - query_result = self.factory.create_query_result(retrieved_at=retrieved_at, query_text=query.query_text, - query_hash=query.query_hash) - - with patch('redash.tasks.queries.enqueue_query') as add_job_mock: - refresh_queries() - self.assertFalse(add_job_mock.called) - - def test_skips_queries_with_no_ttl(self): - query = self.factory.create_query(schedule=None) - retrieved_at = utcnow() - datetime.timedelta(minutes=10) - query_result = self.factory.create_query_result(retrieved_at=retrieved_at, query_text=query.query_text, - query_hash=query.query_hash) - - with patch('redash.tasks.queries.enqueue_query') as add_job_mock: - refresh_queries() - self.assertFalse(add_job_mock.called) - - def test_enqueues_query_only_once(self): - query = self.factory.create_query(schedule="60") - query2 = self.factory.create_query(schedule="60", query_text=query.query_text, query_hash=query.query_hash) - retrieved_at = utcnow() - datetime.timedelta(minutes=10) - query_result = self.factory.create_query_result(retrieved_at=retrieved_at, query_text=query.query_text, - query_hash=query.query_hash) - query.latest_query_data = query_result - query2.latest_query_data = query_result - db.session.add_all([query, query2]) - - with patch('redash.tasks.queries.enqueue_query') as add_job_mock: - refresh_queries() - add_job_mock.assert_called_once_with(query.query_text, query.data_source, query.user_id, scheduled=True, metadata=ANY)#{'Query ID': query.id, 'Username': 'Scheduled'}) - - def test_enqueues_query_with_correct_data_source(self): - query = self.factory.create_query(schedule="60", data_source=self.factory.create_data_source()) - query2 = self.factory.create_query(schedule="60", query_text=query.query_text, query_hash=query.query_hash) - retrieved_at = utcnow() - datetime.timedelta(minutes=10) - query_result = self.factory.create_query_result(retrieved_at=retrieved_at, query_text=query.query_text, - query_hash=query.query_hash) - query.latest_query_data = query_result - query2.latest_query_data = query_result - db.session.add_all([query, query2]) - - with patch('redash.tasks.queries.enqueue_query') as add_job_mock: - refresh_queries() - add_job_mock.assert_has_calls([call(query2.query_text, query2.data_source, query2.user_id, scheduled=True, metadata=ANY), - call(query.query_text, query.data_source, query.user_id, scheduled=True, metadata=ANY)], - any_order=True) - self.assertEquals(2, add_job_mock.call_count) - - def test_enqueues_only_for_relevant_data_source(self): - query = self.factory.create_query(schedule="60") - query2 = self.factory.create_query(schedule="3600", query_text=query.query_text, query_hash=query.query_hash) - retrieved_at = utcnow() - datetime.timedelta(minutes=10) - query_result = self.factory.create_query_result(retrieved_at=retrieved_at, query_text=query.query_text, - query_hash=query.query_hash) - query.latest_query_data = query_result - query2.latest_query_data = query_result - db.session.add_all([query, query2]) - - with patch('redash.tasks.queries.enqueue_query') as add_job_mock: - refresh_queries() - add_job_mock.assert_called_once_with(query.query_text, query.data_source, query.user_id, scheduled=True, metadata=ANY) + with patch('redash.tasks.queries.enqueue_query') as add_job_mock: + refresh_queries() + add_job_mock.assert_called_with( + query.query_text, query.data_source, query.user_id, + scheduled=True, metadata=ANY) diff --git a/tests/test_models.py b/tests/test_models.py index 90576b3b..f3dfe91a 100644 --- a/tests/test_models.py +++ b/tests/test_models.py @@ -30,31 +30,37 @@ class ShouldScheduleNextTest(TestCase): def test_interval_schedule_that_needs_reschedule(self): now = utcnow() two_hours_ago = now - datetime.timedelta(hours=2) - self.assertTrue(models.should_schedule_next(two_hours_ago, now, "3600")) + self.assertTrue(models.should_schedule_next(two_hours_ago, now, "3600", + 0)) def test_interval_schedule_that_doesnt_need_reschedule(self): now = utcnow() half_an_hour_ago = now - datetime.timedelta(minutes=30) - self.assertFalse(models.should_schedule_next(half_an_hour_ago, now, "3600")) + self.assertFalse(models.should_schedule_next(half_an_hour_ago, now, + "3600", 0)) def test_exact_time_that_needs_reschedule(self): now = utcnow() yesterday = now - datetime.timedelta(days=1) scheduled_datetime = now - datetime.timedelta(hours=3) scheduled_time = "{:02d}:00".format(scheduled_datetime.hour) - self.assertTrue(models.should_schedule_next(yesterday, now, scheduled_time)) + self.assertTrue(models.should_schedule_next(yesterday, now, + scheduled_time, 0)) def test_exact_time_that_doesnt_need_reschedule(self): now = date_parse("2015-10-16 20:10") yesterday = date_parse("2015-10-15 23:07") schedule = "23:00" - self.assertFalse(models.should_schedule_next(yesterday, now, schedule)) + self.assertFalse(models.should_schedule_next(yesterday, now, schedule, + 0)) def test_exact_time_with_day_change(self): now = utcnow().replace(hour=0, minute=1) - previous = (now - datetime.timedelta(days=2)).replace(hour=23, minute=59) + previous = (now - datetime.timedelta(days=2)).replace(hour=23, + minute=59) schedule = "23:59".format(now.hour + 3) - self.assertTrue(models.should_schedule_next(previous, now, schedule)) + self.assertTrue(models.should_schedule_next(previous, now, schedule, + 0)) class QueryOutdatedQueriesTest(BaseTestCase): @@ -92,6 +98,79 @@ class QueryOutdatedQueriesTest(BaseTestCase): queries = models.Query.outdated_queries() self.assertIn(query, queries) + def test_enqueues_query_only_once(self): + """ + Only one query per data source with the same text will be reported by + Query.outdated_queries(). + """ + query = self.factory.create_query(schedule="60") + query2 = self.factory.create_query( + schedule="60", query_text=query.query_text, + query_hash=query.query_hash) + retrieved_at = utcnow() - datetime.timedelta(minutes=10) + query_result = self.factory.create_query_result( + retrieved_at=retrieved_at, query_text=query.query_text, + query_hash=query.query_hash) + query.latest_query_data = query_result + query2.latest_query_data = query_result + + self.assertEqual(list(models.Query.outdated_queries()), [query2]) + + def test_enqueues_query_with_correct_data_source(self): + """ + Queries from different data sources will be reported by + Query.outdated_queries() even if they have the same query text. + """ + query = self.factory.create_query( + schedule="60", data_source=self.factory.create_data_source()) + query2 = self.factory.create_query( + schedule="60", query_text=query.query_text, + query_hash=query.query_hash) + retrieved_at = utcnow() - datetime.timedelta(minutes=10) + query_result = self.factory.create_query_result( + retrieved_at=retrieved_at, query_text=query.query_text, + query_hash=query.query_hash) + query.latest_query_data = query_result + query2.latest_query_data = query_result + + self.assertEqual(list(models.Query.outdated_queries()), + [query2, query]) + + def test_enqueues_only_for_relevant_data_source(self): + """ + If multiple queries with the same text exist, only ones that are + scheduled to be refreshed are reported by Query.outdated_queries(). + """ + query = self.factory.create_query(schedule="60") + query2 = self.factory.create_query( + schedule="3600", query_text=query.query_text, + query_hash=query.query_hash) + retrieved_at = utcnow() - datetime.timedelta(minutes=10) + query_result = self.factory.create_query_result( + retrieved_at=retrieved_at, query_text=query.query_text, + query_hash=query.query_hash) + query.latest_query_data = query_result + query2.latest_query_data = query_result + + self.assertEqual(list(models.Query.outdated_queries()), [query]) + + def test_failure_extends_schedule(self): + """ + Execution failures recorded for a query result in exponential backoff + for scheduling future execution. + """ + query = self.factory.create_query(schedule="60", schedule_failures=4) + retrieved_at = utcnow() - datetime.timedelta(minutes=14) + query_result = self.factory.create_query_result( + retrieved_at=retrieved_at, query_text=query.query_text, + query_hash=query.query_hash) + query.latest_query_data = query_result + + self.assertEqual(list(models.Query.outdated_queries()), []) + + query_result.retrieved_at = utcnow() - datetime.timedelta(minutes=15) + self.assertEqual(list(models.Query.outdated_queries()), [query]) + class QueryArchiveTest(BaseTestCase): def setUp(self): From 2407b115e4d17de7d6317eb418d32ccc2559eaab Mon Sep 17 00:00:00 2001 From: Allen Short Date: Fri, 3 Feb 2017 01:46:02 -0600 Subject: [PATCH 016/112] Exponential backoff for failing queries --- migrations/versions/d1eae8b9893e_.py | 25 ++++++++ redash/models.py | 10 ++- redash/tasks/queries.py | 51 ++++++++++++---- tests/tasks/test_queries.py | 91 ++++++++++++++++++++++++++-- tests/tasks/test_refresh_queries.py | 6 +- tests/test_models.py | 12 +++- 6 files changed, 169 insertions(+), 26 deletions(-) create mode 100644 migrations/versions/d1eae8b9893e_.py diff --git a/migrations/versions/d1eae8b9893e_.py b/migrations/versions/d1eae8b9893e_.py new file mode 100644 index 00000000..9d7d5fc5 --- /dev/null +++ b/migrations/versions/d1eae8b9893e_.py @@ -0,0 +1,25 @@ +"""add Query.schedule_failures + +Revision ID: d1eae8b9893e +Revises: 65fc9ede4746 +Create Date: 2017-02-03 01:45:02.954923 + +""" +from alembic import op +import sqlalchemy as sa + + +# revision identifiers, used by Alembic. +revision = 'd1eae8b9893e' +down_revision = '65fc9ede4746' +branch_labels = None +depends_on = None + + +def upgrade(): + op.add_column('queries', sa.Column('schedule_failures', sa.Integer(), + nullable=False, server_default='0')) + + +def downgrade(): + op.drop_column('queries', 'schedule_failures') diff --git a/redash/models.py b/redash/models.py index cadb6e3d..fd67442c 100644 --- a/redash/models.py +++ b/redash/models.py @@ -645,7 +645,7 @@ class QueryResult(db.Model, BelongsToOrgMixin): return self.data_source.groups -def should_schedule_next(previous_iteration, now, schedule): +def should_schedule_next(previous_iteration, now, schedule, failures): if schedule.isdigit(): ttl = int(schedule) next_iteration = previous_iteration + datetime.timedelta(seconds=ttl) @@ -662,7 +662,8 @@ def should_schedule_next(previous_iteration, now, schedule): previous_iteration = normalized_previous_iteration - datetime.timedelta(days=1) next_iteration = (previous_iteration + datetime.timedelta(days=1)).replace(hour=hour, minute=minute) - + if failures: + next_iteration += datetime.timedelta(minutes=2**failures) return now > next_iteration @@ -688,6 +689,7 @@ class Query(ChangeTrackingMixin, TimestampMixin, BelongsToOrgMixin, db.Model): is_archived = Column(db.Boolean, default=False, index=True) is_draft = Column(db.Boolean, default=True, index=True) schedule = Column(db.String(10), nullable=True) + schedule_failures = Column(db.Integer, default=0) visualizations = db.relationship("Visualization", cascade="all, delete-orphan") options = Column(MutableDict.as_mutable(PseudoJSON), default={}) @@ -795,7 +797,8 @@ class Query(ChangeTrackingMixin, TimestampMixin, BelongsToOrgMixin, db.Model): now = utils.utcnow() outdated_queries = {} for query in queries: - if should_schedule_next(query.latest_query_data.retrieved_at, now, query.schedule): + if should_schedule_next(query.latest_query_data.retrieved_at, now, + query.schedule, query.schedule_failures): key = "{}:{}".format(query.query_hash, query.data_source.id) outdated_queries[key] = query @@ -893,6 +896,7 @@ class Query(ChangeTrackingMixin, TimestampMixin, BelongsToOrgMixin, db.Model): @listens_for(Query.query_text, 'set') def gen_query_hash(target, val, oldval, initiator): target.query_hash = utils.gen_query_hash(val) + target.schedule_failures = 0 @listens_for(Query.user_id, 'set') diff --git a/redash/tasks/queries.py b/redash/tasks/queries.py index 59796319..52d75a7c 100644 --- a/redash/tasks/queries.py +++ b/redash/tasks/queries.py @@ -197,7 +197,8 @@ class QueryTask(object): return self._async_result.revoke(terminate=True, signal='SIGINT') -def enqueue_query(query, data_source, user_id, scheduled=False, metadata={}): +def enqueue_query(query, data_source, user_id, scheduled_query=None, + metadata={}): query_hash = gen_query_hash(query) logging.info("Inserting job for %s with metadata=%s", query_hash, metadata) try_count = 0 @@ -223,14 +224,21 @@ def enqueue_query(query, data_source, user_id, scheduled=False, metadata={}): if not job: pipe.multi() - if scheduled: + if scheduled_query: queue_name = data_source.scheduled_queue_name + scheduled_query_id = scheduled_query.id else: queue_name = data_source.queue_name + scheduled_query_id = None - result = execute_query.apply_async(args=(query, data_source.id, metadata, user_id), queue=queue_name) + result = execute_query.apply_async(args=( + query, data_source.id, metadata, user_id, + scheduled_query_id), + queue=queue_name) job = QueryTask(async_result=result) - tracker = QueryTaskTracker.create(result.id, 'created', query_hash, data_source.id, scheduled, metadata) + tracker = QueryTaskTracker.create( + result.id, 'created', query_hash, data_source.id, + scheduled_query is not None, metadata) tracker.save(connection=pipe) logging.info("[%s] Created new job: %s", query_hash, job.id) @@ -262,7 +270,7 @@ def refresh_queries(): logging.info("Skipping refresh of %s because datasource - %s is paused (%s).", query.id, query.data_source.name, query.data_source.pause_reason) else: enqueue_query(query.query_text, query.data_source, query.user_id, - scheduled=True, + scheduled_query=query, metadata={'Query ID': query.id, 'Username': 'Scheduled'}) query_ids.append(query.id) @@ -378,7 +386,8 @@ class QueryExecutionError(Exception): # We could have created this as a celery.Task derived class, and act as the task itself. But this might result in weird # issues as the task class created once per process, so decided to have a plain object instead. class QueryExecutor(object): - def __init__(self, task, query, data_source_id, user_id, metadata): + def __init__(self, task, query, data_source_id, user_id, metadata, + scheduled_query): self.task = task self.query = query self.data_source_id = data_source_id @@ -389,6 +398,7 @@ class QueryExecutor(object): else: self.user = None self.query_hash = gen_query_hash(self.query) + self.scheduled_query = scheduled_query # Load existing tracker or create a new one if the job was created before code update: self.tracker = QueryTaskTracker.get_by_task_id(task.request.id) or QueryTaskTracker.create(task.request.id, 'created', @@ -423,7 +433,14 @@ class QueryExecutor(object): if error: self.tracker.update(state='failed') result = QueryExecutionError(error) + if self.scheduled_query: + self.scheduled_query.schedule_failures += 1 + models.db.session.add(self.scheduled_query) else: + if (self.scheduled_query and + self.scheduled_query.schedule_failures > 0): + self.scheduled_query.schedule_failures = 0 + models.db.session.add(self.scheduled_query) query_result, updated_query_ids = models.QueryResult.store_result( self.data_source.org, self.data_source, self.query_hash, self.query, data, @@ -450,10 +467,14 @@ class QueryExecutor(object): return annotated_query def _log_progress(self, state): - logger.info(u"task=execute_query state=%s query_hash=%s type=%s ds_id=%d task_id=%s queue=%s query_id=%s username=%s", - state, - self.query_hash, self.data_source.type, self.data_source.id, self.task.request.id, self.task.request.delivery_info['routing_key'], - self.metadata.get('Query ID', 'unknown'), self.metadata.get('Username', 'unknown')) + logger.info( + u"task=execute_query state=%s query_hash=%s type=%s ds_id=%d " + "task_id=%s queue=%s query_id=%s username=%s", + state, self.query_hash, self.data_source.type, self.data_source.id, + self.task.request.id, + self.task.request.delivery_info['routing_key'], + self.metadata.get('Query ID', 'unknown'), + self.metadata.get('Username', 'unknown')) self.tracker.update(state=state) def _load_data_source(self): @@ -464,5 +485,11 @@ class QueryExecutor(object): # user_id is added last as a keyword argument for backward compatability -- to support executing previously submitted # jobs before the upgrade to this version. @celery.task(name="redash.tasks.execute_query", bind=True, track_started=True) -def execute_query(self, query, data_source_id, metadata, user_id=None): - return QueryExecutor(self, query, data_source_id, user_id, metadata).run() +def execute_query(self, query, data_source_id, metadata, user_id=None, + scheduled_query_id=None): + if scheduled_query_id is not None: + scheduled_query = models.Query.query.get(scheduled_query_id) + else: + scheduled_query = None + return QueryExecutor(self, query, data_source_id, user_id, metadata, + scheduled_query).run() diff --git a/tests/tasks/test_queries.py b/tests/tasks/test_queries.py index 198c2ea0..15ea846f 100644 --- a/tests/tasks/test_queries.py +++ b/tests/tasks/test_queries.py @@ -1,11 +1,14 @@ -from tests import BaseTestCase -from redash import redis_connection -from redash.tasks.queries import QueryTaskTracker, enqueue_query, execute_query from unittest import TestCase -from mock import MagicMock from collections import namedtuple import uuid +import mock + +from tests import BaseTestCase +from redash import redis_connection, models +from redash.query_runner.pg import PostgreSQL +from redash.tasks.queries import QueryTaskTracker, enqueue_query, execute_query + class TestPrune(TestCase): def setUp(self): @@ -45,7 +48,7 @@ def gen_hash(*args, **kwargs): class TestEnqueueTask(BaseTestCase): def test_multiple_enqueue_of_same_query(self): query = self.factory.create_query() - execute_query.apply_async = MagicMock(side_effect=gen_hash) + execute_query.apply_async = mock.MagicMock(side_effect=gen_hash) enqueue_query(query.query_text, query.data_source, True, {'Username': 'Arik', 'Query ID': query.id}) enqueue_query(query.query_text, query.data_source, True, {'Username': 'Arik', 'Query ID': query.id}) @@ -58,7 +61,7 @@ class TestEnqueueTask(BaseTestCase): def test_multiple_enqueue_of_different_query(self): query = self.factory.create_query() - execute_query.apply_async = MagicMock(side_effect=gen_hash) + execute_query.apply_async = mock.MagicMock(side_effect=gen_hash) enqueue_query(query.query_text, query.data_source, True, {'Username': 'Arik', 'Query ID': query.id}) enqueue_query(query.query_text + '2', query.data_source, True, {'Username': 'Arik', 'Query ID': query.id}) @@ -68,3 +71,79 @@ class TestEnqueueTask(BaseTestCase): self.assertEqual(3, redis_connection.zcard(QueryTaskTracker.WAITING_LIST)) self.assertEqual(0, redis_connection.zcard(QueryTaskTracker.IN_PROGRESS_LIST)) self.assertEqual(0, redis_connection.zcard(QueryTaskTracker.DONE_LIST)) + + +class QueryExecutorTests(BaseTestCase): + + def test_success(self): + """ + ``execute_query`` invokes the query runner and stores a query result. + """ + cm = mock.patch("celery.app.task.Context.delivery_info", + {'routing_key': 'test'}) + with cm, mock.patch.object(PostgreSQL, "run_query") as qr: + qr.return_value = ([1, 2], None) + result_id = execute_query("SELECT 1, 2", + self.factory.data_source.id, {}) + self.assertEqual(1, qr.call_count) + result = models.QueryResult.query.get(result_id) + self.assertEqual(result.data, '{1,2}') + + def test_success_scheduled(self): + """ + Scheduled queries remember their latest results. + """ + cm = mock.patch("celery.app.task.Context.delivery_info", + {'routing_key': 'test'}) + q = self.factory.create_query(query_text="SELECT 1, 2", schedule=300) + with cm, mock.patch.object(PostgreSQL, "run_query") as qr: + qr.return_value = ([1, 2], None) + result_id = execute_query( + "SELECT 1, 2", + self.factory.data_source.id, {}, + scheduled_query_id=q.id) + models.db.session.refresh(q) + self.assertEqual(q.schedule_failures, 0) + result = models.QueryResult.query.get(result_id) + self.assertEqual(q.latest_query_data, result) + + def test_failure_scheduled(self): + """ + Scheduled queries that fail have their failure recorded. + """ + cm = mock.patch("celery.app.task.Context.delivery_info", + {'routing_key': 'test'}) + q = self.factory.create_query(query_text="SELECT 1, 2", schedule=300) + with cm, mock.patch.object(PostgreSQL, "run_query") as qr: + qr.exception = ValueError("broken") + execute_query("SELECT 1, 2", + self.factory.data_source.id, {}, + scheduled_query_id=q.id) + self.assertEqual(q.schedule_failures, 1) + execute_query("SELECT 1, 2", + self.factory.data_source.id, {}, + scheduled_query_id=q.id) + models.db.session.refresh(q) + self.assertEqual(q.schedule_failures, 2) + + def test_success_after_failure(self): + """ + Query execution success resets the failure counter. + """ + cm = mock.patch("celery.app.task.Context.delivery_info", + {'routing_key': 'test'}) + q = self.factory.create_query(query_text="SELECT 1, 2", schedule=300) + with cm, mock.patch.object(PostgreSQL, "run_query") as qr: + qr.exception = ValueError("broken") + execute_query("SELECT 1, 2", + self.factory.data_source.id, {}, + scheduled_query_id=q.id) + models.db.session.refresh(q) + self.assertEqual(q.schedule_failures, 1) + with cm, mock.patch.object(PostgreSQL, "run_query") as qr: + qr.return_value = ([1, 2], None) + execute_query("SELECT 1, 2", + self.factory.data_source.id, {}, + scheduled_query_id=q.id) + models.db.session.refresh(q) + self.assertEqual(q.schedule_failures, 0) diff --git a/tests/tasks/test_refresh_queries.py b/tests/tasks/test_refresh_queries.py index 12ce75a5..90641ed1 100644 --- a/tests/tasks/test_refresh_queries.py +++ b/tests/tasks/test_refresh_queries.py @@ -21,9 +21,9 @@ class TestRefreshQuery(BaseTestCase): self.assertEqual(add_job_mock.call_count, 2) add_job_mock.assert_has_calls([ call(query1.query_text, query1.data_source, query1.user_id, - scheduled=True, metadata=ANY), + scheduled_query=query1, metadata=ANY), call(query2.query_text, query2.data_source, query2.user_id, - scheduled=True, metadata=ANY)], any_order=True) + scheduled_query=query2, metadata=ANY)], any_order=True) def test_doesnt_enqueue_outdated_queries_for_paused_data_source(self): """ @@ -44,4 +44,4 @@ class TestRefreshQuery(BaseTestCase): refresh_queries() add_job_mock.assert_called_with( query.query_text, query.data_source, query.user_id, - scheduled=True, metadata=ANY) + scheduled_query=query, metadata=ANY) diff --git a/tests/test_models.py b/tests/test_models.py index f3dfe91a..3ae389a1 100644 --- a/tests/test_models.py +++ b/tests/test_models.py @@ -62,6 +62,14 @@ class ShouldScheduleNextTest(TestCase): self.assertTrue(models.should_schedule_next(previous, now, schedule, 0)) + def test_backoff(self): + now = utcnow() + two_hours_ago = now - datetime.timedelta(hours=2) + self.assertTrue(models.should_schedule_next(two_hours_ago, now, "3600", + 5)) + self.assertFalse(models.should_schedule_next(two_hours_ago, now, + "3600", 10)) + class QueryOutdatedQueriesTest(BaseTestCase): # TODO: this test can be refactored to use mock version of should_schedule_next to simplify it. @@ -160,7 +168,7 @@ class QueryOutdatedQueriesTest(BaseTestCase): for scheduling future execution. """ query = self.factory.create_query(schedule="60", schedule_failures=4) - retrieved_at = utcnow() - datetime.timedelta(minutes=14) + retrieved_at = utcnow() - datetime.timedelta(minutes=16) query_result = self.factory.create_query_result( retrieved_at=retrieved_at, query_text=query.query_text, query_hash=query.query_hash) @@ -168,7 +176,7 @@ class QueryOutdatedQueriesTest(BaseTestCase): self.assertEqual(list(models.Query.outdated_queries()), []) - query_result.retrieved_at = utcnow() - datetime.timedelta(minutes=15) + query_result.retrieved_at = utcnow() - datetime.timedelta(minutes=17) self.assertEqual(list(models.Query.outdated_queries()), [query]) From 1350555931606e49096dcd6ee39cff9a7b6a972f Mon Sep 17 00:00:00 2001 From: Arik Fraimovich Date: Wed, 22 Feb 2017 21:57:16 +0200 Subject: [PATCH 017/112] Update CHANGELOG. --- CHANGELOG.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index f5c7c1be..9515cca1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -30,6 +30,10 @@ - Fix: extra whitespace created by the filters component. - Fix: query results cleanup task was trying to delete query objects. - Fix: alert subscriptions were not triggered. +- [DynamoDB] Fix: count(*) queries were broken. +- Fix: Redash is using too many database connections. +- Fix: download links were not working in dashboards. +- Fix: the first selection in multi filters was broken in dashboards. ### Other From 2f019a08974a49eb4389fc9b66c9bc2972c874d2 Mon Sep 17 00:00:00 2001 From: Arik Fraimovich Date: Wed, 22 Feb 2017 21:58:12 +0200 Subject: [PATCH 018/112] Update CHANGELOG.md --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 9515cca1..fcc16e43 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -30,7 +30,7 @@ - Fix: extra whitespace created by the filters component. - Fix: query results cleanup task was trying to delete query objects. - Fix: alert subscriptions were not triggered. -- [DynamoDB] Fix: count(*) queries were broken. +- [DynamoDB] Fix: count(*) queries were broken. (@kopanitsa) - Fix: Redash is using too many database connections. - Fix: download links were not working in dashboards. - Fix: the first selection in multi filters was broken in dashboards. From 2bb11dffcafa274c50dc024b6df18e392ff099f3 Mon Sep 17 00:00:00 2001 From: Arik Fraimovich Date: Wed, 22 Feb 2017 22:11:26 +0200 Subject: [PATCH 019/112] add v1-rc.2 release date. --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index fcc16e43..f95d306e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,6 @@ # Change Log -## v1.0.0-rc.2 - Unreleased +## v1.0.0-rc.2 - 2017-02-22 ### Changed From 09239439ae031e6bc8cd0e81cadfdd08fafbb19b Mon Sep 17 00:00:00 2001 From: Arik Fraimovich Date: Thu, 23 Feb 2017 12:51:38 +0200 Subject: [PATCH 020/112] Fix: keyboard shortcuts didn't work in parameter inputs --- client/app/pages/queries/query-editor.js | 8 +--- client/app/pages/queries/query.html | 3 +- client/app/pages/queries/source-view.js | 23 ++++------- client/app/pages/queries/view.js | 50 ++++++++++++++--------- client/app/services/keyboard-shortcuts.js | 4 +- 5 files changed, 42 insertions(+), 46 deletions(-) diff --git a/client/app/pages/queries/query-editor.js b/client/app/pages/queries/query-editor.js index 6165bce4..26e289dd 100644 --- a/client/app/pages/queries/query-editor.js +++ b/client/app/pages/queries/query-editor.js @@ -3,7 +3,7 @@ import 'brace/mode/python'; import 'brace/mode/sql'; import 'brace/mode/json'; import 'brace/ext/language_tools'; -import { each, map } from 'underscore'; +import { map } from 'underscore'; // By default Ace will try to load snippet files for the different modes and fail. // We don't need them, so we use these placeholders until we define our own. @@ -25,7 +25,6 @@ function queryEditor(QuerySnippet) { query: '=', schema: '=', syntax: '=', - shortcuts: '=', }, template: '
', link: { @@ -47,11 +46,6 @@ function queryEditor(QuerySnippet) { editor.commands.bindKey('Cmd+L', null); editor.commands.bindKey('Ctrl+L', null); - each($scope.shortcuts, (fn, key) => { - key = key.replace('meta', 'Cmd').replace('ctrl', 'Ctrl'); - editor.commands.bindKey(key, () => fn()); - }); - QuerySnippet.query((snippets) => { window.ace.acequire(['ace/snippets'], (snippetsModule) => { const snippetManager = snippetsModule.snippetManager; diff --git a/client/app/pages/queries/query.html b/client/app/pages/queries/query.html index f3da2305..5b14105b 100644 --- a/client/app/pages/queries/query.html +++ b/client/app/pages/queries/query.html @@ -128,8 +128,7 @@

+ syntax="dataSource.syntax">

diff --git a/client/app/pages/queries/source-view.js b/client/app/pages/queries/source-view.js index 86db0e03..b9d4ff1e 100644 --- a/client/app/pages/queries/source-view.js +++ b/client/app/pages/queries/source-view.js @@ -29,24 +29,19 @@ function QuerySourceCtrl(Events, toastr, $controller, $scope, $location, $http, }, }); - $scope.shortcuts = { - 'meta+s': function save() { + const shortcuts = { + 'mod+s': function save() { if ($scope.canEdit) { $scope.saveQuery(); } }, - 'ctrl+s': function save() { - if ($scope.canEdit) { - $scope.saveQuery(); - } - }, - // Cmd+Enter for Mac - 'meta+enter': $scope.executeQuery, - // Ctrl+Enter for PC - 'ctrl+enter': $scope.executeQuery, }; - KeyboardShortcuts.bind($scope.shortcuts); + KeyboardShortcuts.bind(shortcuts); + + $scope.$on('$destroy', () => { + KeyboardShortcuts.unbind(shortcuts); + }); // @override $scope.saveQuery = (options, data) => { @@ -106,10 +101,6 @@ function QuerySourceCtrl(Events, toastr, $controller, $scope, $location, $http, $scope.$watch('query.query', (newQueryText) => { $scope.isDirty = (newQueryText !== queryText); }); - - $scope.$on('$destroy', () => { - KeyboardShortcuts.unbind($scope.shortcuts); - }); } export default function (ngModule) { diff --git a/client/app/pages/queries/view.js b/client/app/pages/queries/view.js index 3c1dc568..30156d55 100644 --- a/client/app/pages/queries/view.js +++ b/client/app/pages/queries/view.js @@ -1,9 +1,9 @@ import { pick, any, some, find } from 'underscore'; import template from './query.html'; -function QueryViewCtrl($scope, Events, $route, $routeParams, $http, $location, $window, $q, - Title, AlertDialog, Notifications, clientConfig, toastr, $uibModal, currentUser, - Query, DataSource) { +function QueryViewCtrl($scope, Events, $route, $routeParams, $location, $window, $q, + KeyboardShortcuts, Title, AlertDialog, Notifications, clientConfig, toastr, $uibModal, + currentUser, Query, DataSource) { const DEFAULT_TAB = 'table'; function getQueryResult(maxAge) { @@ -85,11 +85,38 @@ function QueryViewCtrl($scope, Events, $route, $routeParams, $http, $location, $ updateSchema(); } + $scope.executeQuery = () => { + if (!$scope.canExecuteQuery()) { + return; + } + + if (!$scope.query.query) { + return; + } + + getQueryResult(0); + $scope.lockButton(true); + $scope.cancelling = false; + Events.record('execute', 'query', $scope.query.id); + + Notifications.getPermissions(); + }; + + $scope.currentUser = currentUser; $scope.dataSource = {}; $scope.query = $route.current.locals.query; $scope.showPermissionsControl = clientConfig.showPermissionsControl; + const shortcuts = { + 'mod+enter': $scope.executeQuery, + }; + + KeyboardShortcuts.bind(shortcuts); + + $scope.$on('$destroy', () => { + KeyboardShortcuts.unbind(shortcuts); + }); Events.record('view', 'query', $scope.query.id); if ($scope.query.hasResult() || $scope.query.paramsRequired()) { @@ -172,23 +199,6 @@ function QueryViewCtrl($scope, Events, $route, $routeParams, $http, $location, $ $scope.saveQuery(undefined, { name: $scope.query.name }); }; - $scope.executeQuery = () => { - if (!$scope.canExecuteQuery()) { - return; - } - - if (!$scope.query.query) { - return; - } - - getQueryResult(0); - $scope.lockButton(true); - $scope.cancelling = false; - Events.record('execute', 'query', $scope.query.id); - - Notifications.getPermissions(); - }; - $scope.cancelExecution = () => { $scope.cancelling = true; $scope.queryResult.cancelExecution(); diff --git a/client/app/services/keyboard-shortcuts.js b/client/app/services/keyboard-shortcuts.js index f81c607c..d8201320 100644 --- a/client/app/services/keyboard-shortcuts.js +++ b/client/app/services/keyboard-shortcuts.js @@ -1,10 +1,12 @@ import { each } from 'underscore'; import Mousetrap from 'mousetrap'; +import 'mousetrap/plugins/global-bind/mousetrap-global-bind'; + function KeyboardShortcuts() { this.bind = function bind(keymap) { each(keymap, (fn, key) => { - Mousetrap.bind(key, (e) => { + Mousetrap.bindGlobal(key, (e) => { e.preventDefault(); fn(); }); From 683e369d86791fb96f6357b9727af9b77eba57fa Mon Sep 17 00:00:00 2001 From: Michael Andy Date: Thu, 23 Feb 2017 23:41:58 +1100 Subject: [PATCH 021/112] dashboard-list.js sorts dashboards and updates page-header --- client/app/pages/dashboards/dashboard-list.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/client/app/pages/dashboards/dashboard-list.js b/client/app/pages/dashboards/dashboard-list.js index 892740db..0150c803 100644 --- a/client/app/pages/dashboards/dashboard-list.js +++ b/client/app/pages/dashboards/dashboard-list.js @@ -39,6 +39,7 @@ function DashboardListCtrl(Dashboard, $location, clientConfig) { this.dashboards.$promise.then((data) => { const out = data.map(dashboard => dashboard.name.match(TAGS_REGEX)); this.allTags = _.unique(_.flatten(out)).filter(e => e).map(tag => tag.replace(/:$/, '')); + this.allTags.sort(); }); this.paginator = new Paginator([], { page }); @@ -82,6 +83,7 @@ export default function (ngModule) { const route = { template: '', reloadOnSearch: false, + title: 'Dashboards', }; return { From fcfd204ec6711e9e95a9a9fcd5582cae1b7cce33 Mon Sep 17 00:00:00 2001 From: rmakulov Date: Mon, 20 Feb 2017 16:52:13 +0300 Subject: [PATCH 022/112] atsd query runner --- redash/query_runner/axibase_tsd.py | 191 +++++++++++++++++++++++++++++ redash/settings.py | 5 +- requirements.txt | 1 + 3 files changed, 195 insertions(+), 2 deletions(-) create mode 100644 redash/query_runner/axibase_tsd.py diff --git a/redash/query_runner/axibase_tsd.py b/redash/query_runner/axibase_tsd.py new file mode 100644 index 00000000..6f5e71d5 --- /dev/null +++ b/redash/query_runner/axibase_tsd.py @@ -0,0 +1,191 @@ +from io import StringIO +import json +import logging +import sys +import uuid + +import pandas as pd +import atsd_client +from atsd_client.exceptions import SQLException +from atsd_client.services import SQLService, MetricsService + +from redash.query_runner import * +from redash.utils import JSONEncoder + +logger = logging.getLogger(__name__) + +types_map = { + 'long': TYPE_INTEGER, + + 'bigint': TYPE_INTEGER, + 'integer': TYPE_INTEGER, + 'smallint': TYPE_INTEGER, + + 'float': TYPE_FLOAT, + 'double': TYPE_FLOAT, + 'decimal': TYPE_FLOAT, + + 'string': TYPE_STRING, + 'date': TYPE_DATE, + 'xsd:dateTimeStamp': TYPE_DATETIME +} + + +def resolve_redash_type(type_in_atsd): + """ + Retrieve corresponding redash type + :param type_in_atsd: `str` + :return: redash type constant + """ + if isinstance(type_in_atsd, dict): + type_in_redash = types_map.get(type_in_atsd['base']) + else: + type_in_redash = types_map.get(type_in_atsd) + return type_in_redash + + +def generate_rows_and_columns(csv_response): + """ + Prepare rows and columns in redash format from ATSD csv response + :param csv_response: `str` + :return: prepared rows and columns + """ + meta, data = csv_response.split('\n', 1) + meta = meta[1:] + + meta_with_padding = meta + '=' * (4 - len(meta) % 4) + meta_decoded = meta_with_padding.decode('base64') + meta_json = json.loads(meta_decoded) + meta_columns = meta_json['tableSchema']['columns'] + + df = pd.read_csv(StringIO(data), sep=',') + columns = [{'friendly_name': i['titles'], + 'type': resolve_redash_type(i['datatype']), + 'name': i['name']} + for i in meta_columns] + column_names = [c['name'] for c in columns] + rows = [dict(zip(column_names, row)) for row in df.values] + return columns, rows + + +class AxibaseTSD(BaseQueryRunner): + noop_query = "SELECT 1" + + @classmethod + def name(cls): + return "Axibase Time Series Database" + + @classmethod + def configuration_schema(cls): + return { + 'type': 'object', + 'properties': { + 'protocol': { + 'type': 'string', + 'title': 'Protocol', + 'default': 'http' + }, + 'hostname': { + 'type': 'string', + 'title': 'Host', + 'default': 'axibase_tsd_hostname' + }, + 'port': { + 'type': 'number', + 'title': 'Port', + 'default': 8088 + }, + 'username': { + 'type': 'string' + }, + 'password': { + 'type': 'string', + 'title': 'Password' + }, + 'timeout': { + 'type': 'number', + 'default': 600, + 'title': 'Connection Timeout' + }, + 'min_insert_date': { + 'type': 'string', + 'title': 'Metric Minimum Insert Date' + }, + 'expression': { + 'type': 'string', + 'title': 'Metric Filter' + }, + 'limit': { + 'type': 'number', + 'default': 5000, + 'title': 'Metric Limit' + }, + 'trust_certificate': { + 'type': 'boolean', + 'title': 'Trust SSL Certificate' + } + }, + 'required': ['username', 'password', 'hostname', 'protocol', 'port'], + 'secret': ['password'] + } + + def __init__(self, configuration): + super(AxibaseTSD, self).__init__(configuration) + self.url = '{0}://{1}:{2}'.format(self.configuration.get('protocol', 'http'), + self.configuration.get('hostname', 'localhost'), + self.configuration.get('port', 8088)) + + def run_query(self, query, user): + connection = atsd_client.connect_url(self.url, + self.configuration.get('username'), + self.configuration.get('password'), + verify=self.configuration.get('trust_certificate', False), + timeout=self.configuration.get('timeout', 600)) + sql = SQLService(connection) + query_id = str(uuid.uuid4()) + + try: + logger.debug("SQL running query: %s", query) + data = sql.query_with_params(query, {'outputFormat': 'csv', 'metadataFormat': 'EMBED', + 'queryId': query_id}) + + columns, rows = generate_rows_and_columns(data) + + data = {'columns': columns, 'rows': rows} + json_data = json.dumps(data, cls=JSONEncoder) + error = None + + except SQLException as e: + json_data = None + error = e.content + except (KeyboardInterrupt, InterruptException): + sql.cancel_query(query_id) + error = "Query cancelled by user." + json_data = None + except Exception: + raise sys.exc_info()[1], None, sys.exc_info()[2] + + return json_data, error + + def get_schema(self, get_stats=False): + connection = atsd_client.connect_url(self.url, + self.configuration.get('username'), + self.configuration.get('password'), + verify=self.configuration.get('trust_certificate', False), + timeout=self.configuration.get('timeout', 600)) + metrics = MetricsService(connection) + ml = metrics.list(expression=self.configuration.get('expression', None), + minInsertDate=self.configuration.get('min_insert_date', None), + limit=self.configuration.get('limit', 5000)) + metrics_list = [i.name.encode('utf-8') for i in ml] + metrics_list.append('atsd_series') + schema = {} + default_columns = ['entity', 'datetime', 'time', 'metric', 'value', 'text', + 'tags', 'entity.tags', 'metric.tags'] + for table_name in metrics_list: + schema[table_name] = {'name': "'{}'".format(table_name), + 'columns': default_columns} + values = schema.values() + return values + +register(AxibaseTSD) diff --git a/redash/settings.py b/redash/settings.py index f26f4e65..99accf07 100644 --- a/redash/settings.py +++ b/redash/settings.py @@ -185,7 +185,8 @@ default_query_runners = [ 'redash.query_runner.mssql', 'redash.query_runner.jql', 'redash.query_runner.google_analytics', - 'redash.query_runner.snowflake' + 'redash.query_runner.snowflake', + 'redash.query_runner.axibase_tsd' ] enabled_query_runners = array_from_string(os.environ.get("REDASH_ENABLED_QUERY_RUNNERS", ",".join(default_query_runners))) @@ -241,7 +242,7 @@ COMMON_CLIENT_CONFIG = { 'showPermissionsControl': FEATURE_SHOW_PERMISSIONS_CONTROL, 'allowCustomJSVisualizations': FEATURE_ALLOW_CUSTOM_JS_VISUALIZATIONS, 'dateFormat': DATE_FORMAT, - 'dateTimeFormat': "{0} HH:mm".format(DATE_FORMAT), + 'dateTimeFormat': "{0} HH:mm:ss".format(DATE_FORMAT), 'allowAllToEditQueries': FEATURE_ALLOW_ALL_TO_EDIT_QUERIES, 'mailSettingsMissing': MAIL_DEFAULT_SENDER is None, 'logoUrl': LOGO_URL diff --git a/requirements.txt b/requirements.txt index b703b559..b20df79c 100644 --- a/requirements.txt +++ b/requirements.txt @@ -28,6 +28,7 @@ SQLAlchemy==1.1.4 sqlparse==0.1.8 wsgiref==0.1.2 honcho==0.5.0 +atsd_client==2.0.9 statsd==2.1.2 gunicorn==19.4.5 celery==3.1.23 From 8c481cd7a76a0ae98c64e1c67bee86ac0e1cb907 Mon Sep 17 00:00:00 2001 From: rmakulov Date: Mon, 27 Feb 2017 15:50:29 +0300 Subject: [PATCH 023/112] added propertyOrder field --- redash/query_runner/__init__.py | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/redash/query_runner/__init__.py b/redash/query_runner/__init__.py index b85b09e8..2e7cb932 100644 --- a/redash/query_runner/__init__.py +++ b/redash/query_runner/__init__.py @@ -1,6 +1,7 @@ import logging import json +from collections import OrderedDict from redash import settings logger = logging.getLogger(__name__) @@ -111,13 +112,16 @@ class BaseQueryRunner(object): @classmethod def to_dict(cls): + schema = cls.configuration_schema() + schema_properties = schema['properties'] + ordered_properties = sorted(schema_properties.items(), + key=lambda (k, v): ("propertyOrder" not in v, v.get("propertyOrder", None))) + schema['properties'] = OrderedDict(ordered_properties) return { 'name': cls.name(), 'type': cls.type(), - 'configuration_schema': cls.configuration_schema() + 'configuration_schema': schema } - - class BaseSQLQueryRunner(BaseQueryRunner): def __init__(self, configuration): super(BaseSQLQueryRunner, self).__init__(configuration) From 6b6df84bce950fd87d7b95812db2c2df193f4961 Mon Sep 17 00:00:00 2001 From: Arik Fraimovich Date: Mon, 27 Feb 2017 15:30:30 +0200 Subject: [PATCH 024/112] Fix: map visualization had severe performance issue. Close #1603. --- client/app/visualizations/map/index.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/app/visualizations/map/index.js b/client/app/visualizations/map/index.js index 342d3242..d1190fe6 100644 --- a/client/app/visualizations/map/index.js +++ b/client/app/visualizations/map/index.js @@ -204,7 +204,7 @@ function mapRenderer() { } } - $scope.$watch('queryResult && queryResult.getData()', render, true); + $scope.$watch('queryResult && queryResult.getData()', render); $scope.$watch('visualization.options', render, true); angular.element(window).on('resize', resize); $scope.$watch('visualization.options.height', resize); From 222a6069cb6984838989647fe91dd6771cc15c84 Mon Sep 17 00:00:00 2001 From: Arik Fraimovich Date: Mon, 27 Feb 2017 15:44:19 +0200 Subject: [PATCH 025/112] Fix: pemrission dialog wasn't rendering. Closes #1633. --- client/app/components/permissions-editor/index.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/client/app/components/permissions-editor/index.js b/client/app/components/permissions-editor/index.js index 84a34b5c..04197036 100644 --- a/client/app/components/permissions-editor/index.js +++ b/client/app/components/permissions-editor/index.js @@ -9,6 +9,8 @@ const PermissionsEditorComponent = { dismiss: '&', }, controller($http, User) { + 'ngInject'; + this.grantees = []; this.newGrantees = {}; this.aclUrl = this.resolve.aclUrl.url; From ef020e88e7921b8e6b6dac62667eb4a8d285a0e6 Mon Sep 17 00:00:00 2001 From: Arik Fraimovich Date: Mon, 27 Feb 2017 17:42:44 +0200 Subject: [PATCH 026/112] Fix: word cloud visualization didn't show column names --- client/app/visualizations/word-cloud/word-cloud-editor.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/app/visualizations/word-cloud/word-cloud-editor.html b/client/app/visualizations/word-cloud/word-cloud-editor.html index 84206dd9..91b4c321 100644 --- a/client/app/visualizations/word-cloud/word-cloud-editor.html +++ b/client/app/visualizations/word-cloud/word-cloud-editor.html @@ -2,7 +2,7 @@
- +
From bccfef533e9225817e9c8353a87308b9c0f01294 Mon Sep 17 00:00:00 2001 From: Arik Fraimovich Date: Mon, 27 Feb 2017 17:51:00 +0200 Subject: [PATCH 027/112] Fix: wrong timestamps in admin tasks page --- client/app/filters/datetime.js | 2 ++ client/app/pages/admin/tasks/tasks.html | 6 +++--- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/client/app/filters/datetime.js b/client/app/filters/datetime.js index 743a35bf..edcc5258 100644 --- a/client/app/filters/datetime.js +++ b/client/app/filters/datetime.js @@ -1,6 +1,8 @@ import moment from 'moment'; export default function (ngModule) { + ngModule.filter('toMilliseconds', () => value => value * 1000.0); + ngModule.filter('dateTime', clientConfig => function dateTime(value) { if (!value) { diff --git a/client/app/pages/admin/tasks/tasks.html b/client/app/pages/admin/tasks/tasks.html index e4f88ab4..2b42a230 100644 --- a/client/app/pages/admin/tasks/tasks.html +++ b/client/app/pages/admin/tasks/tasks.html @@ -38,9 +38,9 @@ {{row.query_id}} {{row.query_hash}} {{row.run_time | durationHumanize}} - {{row.created_at | dateTime }} - {{row.started_at | dateTime }} - {{row.updated_at | dateTime }} + {{row.created_at | toMilliseconds | dateTime }} + {{row.started_at | toMilliseconds | dateTime }} + {{row.updated_at | toMilliseconds | dateTime }} From ebaf0127018c5bf883eefa1c202f83a605677f12 Mon Sep 17 00:00:00 2001 From: rmakulov Date: Mon, 27 Feb 2017 19:05:43 +0300 Subject: [PATCH 028/112] propertyOrder replaced with the field that defines an order --- redash/query_runner/__init__.py | 22 +++++++++++++++++----- 1 file changed, 17 insertions(+), 5 deletions(-) diff --git a/redash/query_runner/__init__.py b/redash/query_runner/__init__.py index 2e7cb932..735b9887 100644 --- a/redash/query_runner/__init__.py +++ b/redash/query_runner/__init__.py @@ -1,3 +1,4 @@ +import sys import logging import json @@ -44,6 +45,13 @@ class InterruptException(Exception): pass +def index(l, x): # Allow non-full key list to be used in sorting + try: + return l.index(x) + except ValueError: + return sys.maxint, x + + class BaseQueryRunner(object): noop_query = None @@ -113,15 +121,17 @@ class BaseQueryRunner(object): @classmethod def to_dict(cls): schema = cls.configuration_schema() - schema_properties = schema['properties'] - ordered_properties = sorted(schema_properties.items(), - key=lambda (k, v): ("propertyOrder" not in v, v.get("propertyOrder", None))) - schema['properties'] = OrderedDict(ordered_properties) + if 'order' in schema.keys(): + order = schema['order'] + schema_properties = schema['properties'] + schema['properties'] = OrderedDict(sorted(schema_properties.items(), key=lambda t: index(order, t[0]))) return { 'name': cls.name(), 'type': cls.type(), 'configuration_schema': schema } + + class BaseSQLQueryRunner(BaseQueryRunner): def __init__(self, configuration): super(BaseSQLQueryRunner, self).__init__(configuration) @@ -142,6 +152,7 @@ class BaseSQLQueryRunner(BaseQueryRunner): res = self._run_query_internal('select count(*) as cnt from %s' % t) tables_dict[t]['size'] = res[0]['cnt'] + query_runners = {} @@ -151,7 +162,8 @@ def register(query_runner_class): logger.debug("Registering %s (%s) query runner.", query_runner_class.name(), query_runner_class.type()) query_runners[query_runner_class.type()] = query_runner_class else: - logger.debug("%s query runner enabled but not supported, not registering. Either disable or install missing dependencies.", query_runner_class.name()) + logger.debug("%s query runner enabled but not supported, not registering. Either disable or install missing " + "dependencies.", query_runner_class.name()) def get_query_runner(query_runner_type, configuration): From 15a87db5d503afc78fb6f7dea3ca9c5b2fdb3b05 Mon Sep 17 00:00:00 2001 From: Arik Fraimovich Date: Tue, 28 Feb 2017 12:14:58 +0200 Subject: [PATCH 029/112] Fix: remove 29402hashKey from Pivot table --- client/app/visualizations/pivot/index.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/client/app/visualizations/pivot/index.js b/client/app/visualizations/pivot/index.js index e723e4d0..ad6aae01 100644 --- a/client/app/visualizations/pivot/index.js +++ b/client/app/visualizations/pivot/index.js @@ -1,3 +1,4 @@ +import angular from 'angular'; import $ from 'jquery'; import 'pivottable'; import 'pivottable/dist/pivot.css'; @@ -20,7 +21,7 @@ function pivotTableRenderer() { if ($scope.queryResult.getData() !== null) { // We need to give the pivot table its own copy of the data, because it changes // it which interferes with other visualizations. - data = $.extend(true, [], $scope.queryResult.getRawData()); + data = angular.copy($scope.queryResult.getRawData()); const options = { renderers: $.pivotUtilities.renderers, onRefresh(config) { From a2c7f6df7a3e8ae829760be023c29211a6402396 Mon Sep 17 00:00:00 2001 From: Arik Fraimovich Date: Tue, 28 Feb 2017 12:50:27 +0200 Subject: [PATCH 030/112] Friendlier labels for archived state of dashboard/query --- client/app/pages/dashboards/dashboard-list.html | 2 +- client/app/pages/dashboards/dashboard.html | 11 +++++------ client/app/pages/home/home.html | 4 ++-- client/app/pages/queries-list/queries-list.html | 2 +- .../pages/queries/queries-search-results-page.html | 2 +- client/app/pages/queries/query.html | 6 ++---- 6 files changed, 12 insertions(+), 15 deletions(-) diff --git a/client/app/pages/dashboards/dashboard-list.html b/client/app/pages/dashboards/dashboard-list.html index eaef67bf..c03fd170 100644 --- a/client/app/pages/dashboards/dashboard-list.html +++ b/client/app/pages/dashboards/dashboard-list.html @@ -24,7 +24,7 @@ {{ dashboard.untagged_name }} - Unpublished + Unpublished {{ dashboard.created_at | dateTime }} diff --git a/client/app/pages/dashboards/dashboard.html b/client/app/pages/dashboards/dashboard.html index c7729f09..eb8c3c45 100644 --- a/client/app/pages/dashboards/dashboard.html +++ b/client/app/pages/dashboards/dashboard.html @@ -1,7 +1,10 @@
-

{{$ctrl.dashboard.name}} Unpublished

+

{{$ctrl.dashboard.name}} + Unpublished + Archived +

@@ -33,7 +36,7 @@ -
+
@@ -50,10 +53,6 @@
-
- This dashboard is archived and won't appear in the dashboards list or search results. -
-
diff --git a/client/app/pages/home/home.html b/client/app/pages/home/home.html index 82b6d3af..67d9c5e4 100644 --- a/client/app/pages/home/home.html +++ b/client/app/pages/home/home.html @@ -15,7 +15,7 @@

Recent Dashboards

@@ -24,7 +24,7 @@

Recent Queries

{{query.name}} Unpublished + ng-repeat="query in $ctrl.recentQueries">{{query.name}} Unpublished
diff --git a/client/app/pages/queries-list/queries-list.html b/client/app/pages/queries-list/queries-list.html index d91926d3..32674eda 100644 --- a/client/app/pages/queries-list/queries-list.html +++ b/client/app/pages/queries-list/queries-list.html @@ -16,7 +16,7 @@ - {{query.name}} Unpublished + {{query.name}} Unpublished {{query.user.name}} {{query.created_at | dateTime}} {{query.runtime | durationHumanize}} diff --git a/client/app/pages/queries/queries-search-results-page.html b/client/app/pages/queries/queries-search-results-page.html index a463fde6..4f8c2aaf 100644 --- a/client/app/pages/queries/queries-search-results-page.html +++ b/client/app/pages/queries/queries-search-results-page.html @@ -21,7 +21,7 @@ - {{query.name}} Unpublished + {{query.name}} Unpublished {{query.user.name}} {{query.created_at | dateTime}} {{query.schedule | scheduleHumanize}} diff --git a/client/app/pages/queries/query.html b/client/app/pages/queries/query.html index 5b14105b..156a35b0 100644 --- a/client/app/pages/queries/query.html +++ b/client/app/pages/queries/query.html @@ -21,7 +21,8 @@

- Unpublished + Unpublished + Archived

@@ -75,9 +76,6 @@

-
- This query is archived and can't be used in dashboards, and won't appear in search results. -
From 2ffda6f5c556b6bcf92051e9e131cb38f273aa32 Mon Sep 17 00:00:00 2001 From: rmakulov Date: Tue, 28 Feb 2017 19:03:17 +0300 Subject: [PATCH 031/112] code revised --- redash/query_runner/axibase_tsd.py | 24 +++++++++++++++++------- redash/settings.py | 2 +- requirements.txt | 1 - requirements_all_ds.txt | 1 + 4 files changed, 19 insertions(+), 9 deletions(-) diff --git a/redash/query_runner/axibase_tsd.py b/redash/query_runner/axibase_tsd.py index 6f5e71d5..9737b6bc 100644 --- a/redash/query_runner/axibase_tsd.py +++ b/redash/query_runner/axibase_tsd.py @@ -3,17 +3,21 @@ import json import logging import sys import uuid - -import pandas as pd -import atsd_client -from atsd_client.exceptions import SQLException -from atsd_client.services import SQLService, MetricsService +import csv from redash.query_runner import * from redash.utils import JSONEncoder logger = logging.getLogger(__name__) +try: + import atsd_client + from atsd_client.exceptions import SQLException + from atsd_client.services import SQLService, MetricsService + enabled = True +except ImportError: + enabled = False + types_map = { 'long': TYPE_INTEGER, @@ -58,19 +62,25 @@ def generate_rows_and_columns(csv_response): meta_json = json.loads(meta_decoded) meta_columns = meta_json['tableSchema']['columns'] - df = pd.read_csv(StringIO(data), sep=',') + reader = csv.reader(data.splitlines()) + next(reader) + columns = [{'friendly_name': i['titles'], 'type': resolve_redash_type(i['datatype']), 'name': i['name']} for i in meta_columns] column_names = [c['name'] for c in columns] - rows = [dict(zip(column_names, row)) for row in df.values] + rows = [dict(zip(column_names, row)) for row in reader] return columns, rows class AxibaseTSD(BaseQueryRunner): noop_query = "SELECT 1" + @classmethod + def enabled(cls): + return enabled + @classmethod def name(cls): return "Axibase Time Series Database" diff --git a/redash/settings.py b/redash/settings.py index 99accf07..8ef9d725 100644 --- a/redash/settings.py +++ b/redash/settings.py @@ -242,7 +242,7 @@ COMMON_CLIENT_CONFIG = { 'showPermissionsControl': FEATURE_SHOW_PERMISSIONS_CONTROL, 'allowCustomJSVisualizations': FEATURE_ALLOW_CUSTOM_JS_VISUALIZATIONS, 'dateFormat': DATE_FORMAT, - 'dateTimeFormat': "{0} HH:mm:ss".format(DATE_FORMAT), + 'dateTimeFormat': "{0} HH:mm".format(DATE_FORMAT), 'allowAllToEditQueries': FEATURE_ALLOW_ALL_TO_EDIT_QUERIES, 'mailSettingsMissing': MAIL_DEFAULT_SENDER is None, 'logoUrl': LOGO_URL diff --git a/requirements.txt b/requirements.txt index b20df79c..b703b559 100644 --- a/requirements.txt +++ b/requirements.txt @@ -28,7 +28,6 @@ SQLAlchemy==1.1.4 sqlparse==0.1.8 wsgiref==0.1.2 honcho==0.5.0 -atsd_client==2.0.9 statsd==2.1.2 gunicorn==19.4.5 celery==3.1.23 diff --git a/requirements_all_ds.txt b/requirements_all_ds.txt index 0f823331..10843349 100644 --- a/requirements_all_ds.txt +++ b/requirements_all_ds.txt @@ -18,5 +18,6 @@ thrift>=0.8.0 thrift_sasl>=0.1.0 cassandra-driver==3.1.1 snowflake_connector_python==1.3.7 +atsd_client==2.0.11 # certifi is needed to support MongoDB and SSL: certifi From c72a09780817753416e36fe26a9eedf5dd8dcfdd Mon Sep 17 00:00:00 2001 From: Matt Snider Date: Tue, 28 Feb 2017 21:44:38 -0600 Subject: [PATCH 032/112] Added Salesforce SOQL query runner --- redash/query_runner/salesforce.py | 177 ++++++++++++++++++++++++++++++ redash/settings.py | 3 +- requirements_all_ds.txt | 1 + 3 files changed, 180 insertions(+), 1 deletion(-) create mode 100644 redash/query_runner/salesforce.py diff --git a/redash/query_runner/salesforce.py b/redash/query_runner/salesforce.py new file mode 100644 index 00000000..2c10c7db --- /dev/null +++ b/redash/query_runner/salesforce.py @@ -0,0 +1,177 @@ +# -*- coding: utf-8 -*- + +import re +import logging +from collections import OrderedDict +logger = logging.getLogger(__name__) + +try: + from simple_salesforce import Salesforce as SimpleSalesforce + from simple_salesforce.api import (SalesforceError) + enabled = True +except ImportError as e: + logger.info(str(e)) + enabled = False + +from redash.query_runner import BaseQueryRunner, register +from redash.query_runner import TYPE_STRING, TYPE_DATE, TYPE_DATETIME, TYPE_INTEGER, TYPE_FLOAT, TYPE_BOOLEAN +from redash.utils import json_dumps + +# See https://developer.salesforce.com/docs/atlas.en-us.api.meta/api/field_types.htm +TYPES_MAP = dict( + id=TYPE_STRING, + string=TYPE_STRING, + currency=TYPE_FLOAT, + reference=TYPE_STRING, + double=TYPE_FLOAT, + picklist=TYPE_STRING, + date=TYPE_DATE, + url=TYPE_STRING, + phone=TYPE_STRING, + textarea=TYPE_STRING, + int=TYPE_INTEGER, + datetime=TYPE_DATETIME, + boolean=TYPE_BOOLEAN, + percent=TYPE_FLOAT, + multipicklist=TYPE_STRING, + masterrecord=TYPE_STRING, + location=TYPE_STRING, + JunctionIdList=TYPE_STRING, + encryptedstring=TYPE_STRING, + email=TYPE_STRING, + DataCategoryGroupReference=TYPE_STRING, + combobox=TYPE_STRING, + calculated=TYPE_STRING, + anyType=TYPE_STRING, + address=TYPE_STRING +) + +# Query Runner for Salesforce SOQL Queries +# For example queries, see: +# https://developer.salesforce.com/docs/atlas.en-us.soql_sosl.meta/soql_sosl/sforce_api_calls_soql_select_examples.htm +class Salesforce(BaseQueryRunner): + + @classmethod + def enabled(cls): + return enabled + + @classmethod + def configuration_schema(cls): + return { + "type": "object", + "properties": { + "username": { + "type": "string" + }, + "password": { + "type": "string" + }, + "token": { + "type": "string", + "title": "Security Token" + }, + "sandbox": { + "type": "boolean" + } + }, + "required": ["username", "password", "token", "sandbox"], + "secret": ["password", "token"] + } + + def test_connection(self): + response = self._get_sf().describe() + if response is None: + raise Exception("Failed describing objects.") + pass + + def _get_sf(self): + sf = SimpleSalesforce(username=self.configuration['username'], + password=self.configuration['password'], + security_token=self.configuration['token'], + sandbox=self.configuration['sandbox'], + client_id='Redash') + return sf + + def _clean_value(self, value): + if type(value) == OrderedDict and 'records' in value: + value = value['records'] + for row in value: + row.pop('attributes', None) + return value + + def _get_value(self, dct, dots): + for key in dots.split('.'): + dct = dct.get(key) + return dct + + def _get_column_name(self, key, parents = []): + return '.'.join(parents + [key]) + + def _build_columns(self, sf, child, parents = []): + child_type = child['attributes']['type'] + child_desc = sf.__getattr__(child_type).describe() + child_type_map = dict((f['name'], f['type'])for f in child_desc['fields']) + columns = [] + for key in child.keys(): + if key != 'attributes': + if type(child[key]) == OrderedDict and 'attributes' in child[key]: + columns.extend(self._build_columns(sf, child[key], parents + [key])) + else: + column_name = self._get_column_name(key, parents) + key_type = child_type_map.get(key, 'string') + column_type = TYPES_MAP.get(key_type, TYPE_STRING) + columns.append((column_name, column_type)) + return columns + + def _build_rows(self, columns, records): + rows = [] + for record in records: + record.pop('attributes', None) + row = dict() + for column in columns: + key = column[0] + value = self._get_value(record, key) + row[key] = self._clean_value(value) + rows.append(row) + return rows + + def run_query(self, query, user): + logger.debug("Salesforce is about to execute query: %s", query) + query = re.sub(r"/\*(.|\n)*?\*/", "", query).strip() + try: + columns = [] + rows = [] + sf = self._get_sf() + response = sf.query_all(query) + records = response['records'] + if response['totalSize'] > 0 and len(records) == 0: + columns = self.fetch_columns([('Count', TYPE_INTEGER)]) + rows = [{ 'Count': response['totalSize'] }] + elif len(records) > 0: + cols = self._build_columns(sf, records[0]) + rows = self._build_rows(cols, records) + columns = self.fetch_columns(cols) + error = None + data = {'columns': columns, 'rows': rows} + json_data = json_dumps(data) + except SalesforceError as err: + error = err.message + json_data = None + return json_data, error + + def get_schema(self, get_stats=False): + sf = self._get_sf() + response = sf.describe() + if response is None: + raise Exception("Failed describing objects.") + + schema = {} + for sobject in response['sobjects']: + table_name = sobject['name'] + if sobject['queryable'] is True and table_name not in schema: + desc = sf.__getattr__(sobject['name']).describe() + fields = desc['fields'] + schema[table_name] = {'name': table_name, 'columns': [f['name'] for f in fields]} + return schema.values() + +register(Salesforce) \ No newline at end of file diff --git a/redash/settings.py b/redash/settings.py index f26f4e65..c99bdfc0 100644 --- a/redash/settings.py +++ b/redash/settings.py @@ -185,7 +185,8 @@ default_query_runners = [ 'redash.query_runner.mssql', 'redash.query_runner.jql', 'redash.query_runner.google_analytics', - 'redash.query_runner.snowflake' + 'redash.query_runner.snowflake', + 'redash.query_runner.salesforce' ] enabled_query_runners = array_from_string(os.environ.get("REDASH_ENABLED_QUERY_RUNNERS", ",".join(default_query_runners))) diff --git a/requirements_all_ds.txt b/requirements_all_ds.txt index 0f823331..ac2c64ee 100644 --- a/requirements_all_ds.txt +++ b/requirements_all_ds.txt @@ -18,5 +18,6 @@ thrift>=0.8.0 thrift_sasl>=0.1.0 cassandra-driver==3.1.1 snowflake_connector_python==1.3.7 +simple_salesforce==0.72.2 # certifi is needed to support MongoDB and SSL: certifi From 8eefd0e9c44759fb0837e514160c808129d17bcc Mon Sep 17 00:00:00 2001 From: Matt Snider Date: Tue, 28 Feb 2017 21:54:32 -0600 Subject: [PATCH 033/112] Format to PEP8 --- redash/query_runner/salesforce.py | 26 ++++++++++++++------------ 1 file changed, 14 insertions(+), 12 deletions(-) diff --git a/redash/query_runner/salesforce.py b/redash/query_runner/salesforce.py index 2c10c7db..6be2849e 100644 --- a/redash/query_runner/salesforce.py +++ b/redash/query_runner/salesforce.py @@ -49,6 +49,8 @@ TYPES_MAP = dict( # Query Runner for Salesforce SOQL Queries # For example queries, see: # https://developer.salesforce.com/docs/atlas.en-us.soql_sosl.meta/soql_sosl/sforce_api_calls_soql_select_examples.htm + + class Salesforce(BaseQueryRunner): @classmethod @@ -85,15 +87,15 @@ class Salesforce(BaseQueryRunner): pass def _get_sf(self): - sf = SimpleSalesforce(username=self.configuration['username'], - password=self.configuration['password'], - security_token=self.configuration['token'], - sandbox=self.configuration['sandbox'], - client_id='Redash') + sf = SimpleSalesforce(username=self.configuration['username'], + password=self.configuration['password'], + security_token=self.configuration['token'], + sandbox=self.configuration['sandbox'], + client_id='Redash') return sf def _clean_value(self, value): - if type(value) == OrderedDict and 'records' in value: + if isinstance(value, OrderedDict) and 'records' in value: value = value['records'] for row in value: row.pop('attributes', None) @@ -104,21 +106,21 @@ class Salesforce(BaseQueryRunner): dct = dct.get(key) return dct - def _get_column_name(self, key, parents = []): + def _get_column_name(self, key, parents=[]): return '.'.join(parents + [key]) - def _build_columns(self, sf, child, parents = []): + def _build_columns(self, sf, child, parents=[]): child_type = child['attributes']['type'] child_desc = sf.__getattr__(child_type).describe() child_type_map = dict((f['name'], f['type'])for f in child_desc['fields']) columns = [] for key in child.keys(): if key != 'attributes': - if type(child[key]) == OrderedDict and 'attributes' in child[key]: + if isinstance(child[key], OrderedDict) and 'attributes' in child[key]: columns.extend(self._build_columns(sf, child[key], parents + [key])) else: column_name = self._get_column_name(key, parents) - key_type = child_type_map.get(key, 'string') + key_type = child_type_map.get(key, 'string') column_type = TYPES_MAP.get(key_type, TYPE_STRING) columns.append((column_name, column_type)) return columns @@ -146,7 +148,7 @@ class Salesforce(BaseQueryRunner): records = response['records'] if response['totalSize'] > 0 and len(records) == 0: columns = self.fetch_columns([('Count', TYPE_INTEGER)]) - rows = [{ 'Count': response['totalSize'] }] + rows = [{'Count': response['totalSize']}] elif len(records) > 0: cols = self._build_columns(sf, records[0]) rows = self._build_rows(cols, records) @@ -174,4 +176,4 @@ class Salesforce(BaseQueryRunner): schema[table_name] = {'name': table_name, 'columns': [f['name'] for f in fields]} return schema.values() -register(Salesforce) \ No newline at end of file +register(Salesforce) From 3650e214584055fb58b0a93119668c3b2e31d0e9 Mon Sep 17 00:00:00 2001 From: Matt Snider Date: Tue, 28 Feb 2017 22:06:34 -0600 Subject: [PATCH 034/112] Move import to top of file --- redash/query_runner/salesforce.py | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/redash/query_runner/salesforce.py b/redash/query_runner/salesforce.py index 6be2849e..ca214cda 100644 --- a/redash/query_runner/salesforce.py +++ b/redash/query_runner/salesforce.py @@ -3,6 +3,9 @@ import re import logging from collections import OrderedDict +from redash.query_runner import BaseQueryRunner, register +from redash.query_runner import TYPE_STRING, TYPE_DATE, TYPE_DATETIME, TYPE_INTEGER, TYPE_FLOAT, TYPE_BOOLEAN +from redash.utils import json_dumps logger = logging.getLogger(__name__) try: @@ -13,10 +16,6 @@ except ImportError as e: logger.info(str(e)) enabled = False -from redash.query_runner import BaseQueryRunner, register -from redash.query_runner import TYPE_STRING, TYPE_DATE, TYPE_DATETIME, TYPE_INTEGER, TYPE_FLOAT, TYPE_BOOLEAN -from redash.utils import json_dumps - # See https://developer.salesforce.com/docs/atlas.en-us.api.meta/api/field_types.htm TYPES_MAP = dict( id=TYPE_STRING, From 9bb87e711acdc8a715debaa7f3816111d6b8c89b Mon Sep 17 00:00:00 2001 From: Arik Fraimovich Date: Thu, 2 Mar 2017 15:56:40 +0200 Subject: [PATCH 035/112] Fix: datetime parameters were not using a date picker. --- client/app/components/parameters.html | 8 ++--- client/app/pages/dashboards/dashboard.js | 2 +- client/app/services/query.js | 37 +++++++++++++++++++++++- 3 files changed, 41 insertions(+), 6 deletions(-) diff --git a/client/app/components/parameters.html b/client/app/components/parameters.html index 4a06e270..9e01be1f 100644 --- a/client/app/components/parameters.html +++ b/client/app/components/parameters.html @@ -3,10 +3,10 @@ - - - - + + + +
diff --git a/client/app/pages/dashboards/dashboard.js b/client/app/pages/dashboards/dashboard.js index 271312d8..b4fd83dc 100644 --- a/client/app/pages/dashboards/dashboard.js +++ b/client/app/pages/dashboards/dashboard.js @@ -34,7 +34,7 @@ function DashboardCtrl($rootScope, $routeParams, $location, $timeout, $q, $uibMo if (widget.getQuery()) { widget.getQuery().getParametersDefs().filter(p => p.global).forEach((param) => { const defaults = {}; - defaults[param.name] = _.clone(param); + defaults[param.name] = _.create(Object.getPrototypeOf(param), param); defaults[param.name].locals = []; globalParams = _.defaults(globalParams, defaults); globalParams[param.name].locals.push(param); diff --git a/client/app/services/query.js b/client/app/services/query.js index 2e98abb3..170b938a 100644 --- a/client/app/services/query.js +++ b/client/app/services/query.js @@ -43,6 +43,40 @@ class QueryResultError { } +class Parameter { + constructor(parameter) { + this.title = parameter.title; + this.name = parameter.name; + this.type = parameter.type; + this.value = parameter.value; + this.global = parameter.global; + } + + get ngModel() { + if (this.type === 'date' || this.type === 'datetime-local' || this.type === 'datetime-with-seconds') { + this.$$value = this.$$value || moment(this.value).toDate(); + return this.$$value; + } else if (this.type === 'number') { + this.$$value = this.$$value || parseInt(this.value, 10); + return this.$$value; + } + + return this.value; + } + + set ngModel(value) { + if (this.type === 'date') { + this.value = moment(value).format('YYYY-MM-DD'); + this.$$value = moment(this.value).toDate(); + } else if (this.type === 'datetime-local' || this.type === 'datetime-with-seconds') { + this.value = moment(value).toISOString(); + this.$$value = moment(this.value).toDate(); + } else { + this.value = this.$$value = value; + } + } +} + class Parameters { constructor(query, queryString) { this.query = query; @@ -84,7 +118,8 @@ class Parameters { }); const parameterExists = p => contains(parameterNames, p.name); - this.query.options.parameters = this.query.options.parameters.filter(parameterExists); + this.query.options.parameters = + this.query.options.parameters.filter(parameterExists).map(p => new Parameter(p)); } initFromQueryString(queryString) { From f77da51a7db96015ee9883d8f634820e90f09391 Mon Sep 17 00:00:00 2001 From: rmakulov Date: Thu, 2 Mar 2017 17:14:19 +0300 Subject: [PATCH 036/112] order on client side --- client/app/components/dynamic-form.html | 21 +++++++++++---------- client/app/components/dynamic-form.js | 21 ++++++++++++++++++++- redash/query_runner/__init__.py | 7 +------ redash/query_runner/pg.py | 1 + 4 files changed, 33 insertions(+), 17 deletions(-) diff --git a/client/app/components/dynamic-form.html b/client/app/components/dynamic-form.html index ce917aec..babaad47 100644 --- a/client/app/components/dynamic-form.html +++ b/client/app/components/dynamic-form.html @@ -7,21 +7,22 @@
-
- - +
+ + -
+ +
+
+ + + + {{$select.selected}} + + + + + +
+
diff --git a/client/app/visualizations/chart/index.js b/client/app/visualizations/chart/index.js index e82218c3..2d131335 100644 --- a/client/app/visualizations/chart/index.js +++ b/client/app/visualizations/chart/index.js @@ -1,4 +1,4 @@ -import { extend, has, partial, intersection, without, contains, isUndefined, sortBy, each, pluck, keys, difference } from 'underscore'; +import { some, extend, has, partial, intersection, without, contains, isUndefined, sortBy, each, pluck, keys, difference } from 'underscore'; import plotly from './plotly'; import template from './chart.html'; import editorTemplate from './chart-editor.html'; @@ -68,6 +68,7 @@ function ChartEditor(ColorPalette, clientConfig) { area: { name: 'Area', icon: 'area-chart' }, pie: { name: 'Pie', icon: 'pie-chart' }, scatter: { name: 'Scatter', icon: 'circle-o' }, + bubble: { name: 'Bubble', icon: 'circle-o' }, }; if (clientConfig.allowCustomJSVisualizations) { @@ -83,6 +84,8 @@ function ChartEditor(ColorPalette, clientConfig) { }); }; + scope.showSizeColumnPicker = () => some(scope.options.seriesOptions, options => options.type === 'bubble'); + scope.options.customCode = `// Available variables are x, ys, element, and Plotly // Type console.log(x, ys); for more info about x and ys // To plot your graph call Plotly.plot(element, ...) @@ -191,6 +194,15 @@ function ChartEditor(ColorPalette, clientConfig) { } }); + scope.$watch('form.sizeColumn', (value, old) => { + if (old !== undefined) { + unsetColumn(old); + } + if (value !== undefined) { + setColumnRole('size', value); + } + }); + scope.$watch('form.groupby', (value, old) => { if (old !== undefined) { @@ -222,6 +234,8 @@ function ChartEditor(ColorPalette, clientConfig) { scope.form.groupby = key; } else if (value === 'yError') { scope.form.errorColumn = key; + } else if (value === 'size') { + scope.form.sizeColumn = key; } }); } diff --git a/client/app/visualizations/chart/plotly.js b/client/app/visualizations/chart/plotly.js index d6e44b65..5d1cdf11 100644 --- a/client/app/visualizations/chart/plotly.js +++ b/client/app/visualizations/chart/plotly.js @@ -211,6 +211,8 @@ const PlotlyChart = () => { } else if (type === 'scatter') { series.type = 'scatter'; series.mode = 'markers'; + } else if (type === 'bubble') { + series.mode = 'markers'; } } @@ -333,6 +335,12 @@ const PlotlyChart = () => { if (!plotlySeries.error_y.length) { delete plotlySeries.error_y.length; } + + if (seriesOptions.type === 'bubble') { + plotlySeries.marker = { + size: pluck(data, 'size'), + }; + } scope.data.push(plotlySeries); }); From e8908d04bb1a4b3e3997fc389d66baacf75ff820 Mon Sep 17 00:00:00 2001 From: Vladislav Denisov Date: Wed, 22 Mar 2017 09:44:21 +0300 Subject: [PATCH 060/112] issues/1616: fixed clickhouse types --- redash/query_runner/clickhouse.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/redash/query_runner/clickhouse.py b/redash/query_runner/clickhouse.py index c22f9dd5..5c14f874 100644 --- a/redash/query_runner/clickhouse.py +++ b/redash/query_runner/clickhouse.py @@ -74,13 +74,13 @@ class ClickHouse(BaseSQLQueryRunner): @staticmethod def _define_column_type(column): c = column.lower() - if 'int' in c: + if c.startswith('int') or c.startswith('uint'): return TYPE_INTEGER - elif 'float' in c: + elif c.startswith('float'): return TYPE_FLOAT - elif 'datetime' == c: + elif c.startswith('datetime'): return TYPE_DATETIME - elif 'date' == c: + elif c.startswith('date'): return TYPE_DATE else: return TYPE_STRING From 9c8755c9ae3d1a1bbba0fa39a8961d38524e66ff Mon Sep 17 00:00:00 2001 From: Vladislav Denisov Date: Wed, 22 Mar 2017 10:28:44 +0300 Subject: [PATCH 061/112] clickhouse: added support for nullable columns --- redash/query_runner/clickhouse.py | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/redash/query_runner/clickhouse.py b/redash/query_runner/clickhouse.py index 5c14f874..7de1b396 100644 --- a/redash/query_runner/clickhouse.py +++ b/redash/query_runner/clickhouse.py @@ -3,6 +3,7 @@ import logging from redash.query_runner import * from redash.utils import JSONEncoder import requests +import re logger = logging.getLogger(__name__) @@ -74,13 +75,16 @@ class ClickHouse(BaseSQLQueryRunner): @staticmethod def _define_column_type(column): c = column.lower() + f = re.search(r'^nullable\((.*)\)$', c) + if f is not None: + c = f.group(1) if c.startswith('int') or c.startswith('uint'): return TYPE_INTEGER elif c.startswith('float'): return TYPE_FLOAT - elif c.startswith('datetime'): + elif c == 'datetime': return TYPE_DATETIME - elif c.startswith('date'): + elif c == 'date': return TYPE_DATE else: return TYPE_STRING From 10fe3c5373d325449839527946ae5cef63ebff86 Mon Sep 17 00:00:00 2001 From: deecay Date: Thu, 23 Mar 2017 21:07:56 +0900 Subject: [PATCH 062/112] Revert "Pivottable shows filtered and formatted data" This reverts commit f011d3060a6b5ef0882a86937463b9bd704bfd04. --- client/app/visualizations/pivot/index.js | 19 +++---------------- client/app/visualizations/table/index.js | 2 +- 2 files changed, 4 insertions(+), 17 deletions(-) diff --git a/client/app/visualizations/pivot/index.js b/client/app/visualizations/pivot/index.js index d909e2de..ad6aae01 100644 --- a/client/app/visualizations/pivot/index.js +++ b/client/app/visualizations/pivot/index.js @@ -1,10 +1,9 @@ +import angular from 'angular'; import $ from 'jquery'; import 'pivottable'; import 'pivottable/dist/pivot.css'; -import { formatValue } from '../table'; -import { getColumnCleanName } from '../../services/query-result'; -function pivotTableRenderer(clientConfig, $filter) { +function pivotTableRenderer() { return { restrict: 'E', scope: { @@ -22,19 +21,7 @@ function pivotTableRenderer(clientConfig, $filter) { if ($scope.queryResult.getData() !== null) { // We need to give the pivot table its own copy of the data, because it changes // it which interferes with other visualizations. - data = []; - const columns = $scope.queryResult.getColumns(); - const rows = $scope.queryResult.getData(); - rows.forEach((row) => { - const rowObj = {}; - columns.forEach((col) => { - const colName = getColumnCleanName(col.name); - const value = formatValue($filter, clientConfig, row[col.name], col.type); - rowObj[colName] = value; - }); - data.push(rowObj); - }); - + data = angular.copy($scope.queryResult.getRawData()); const options = { renderers: $.pivotUtilities.renderers, onRefresh(config) { diff --git a/client/app/visualizations/table/index.js b/client/app/visualizations/table/index.js index 1617577a..eb625ff7 100644 --- a/client/app/visualizations/table/index.js +++ b/client/app/visualizations/table/index.js @@ -3,7 +3,7 @@ import { _, partial, isString } from 'underscore'; import { getColumnCleanName } from '../../services/query-result'; import template from './table.html'; -export function formatValue($filter, clientConfig, value, type) { +function formatValue($filter, clientConfig, value, type) { let formattedValue = value; switch (type) { case 'integer': From 3f047348e2cc3ea55856b9dbd9d62bb15d1c4f5f Mon Sep 17 00:00:00 2001 From: deecay Date: Thu, 23 Mar 2017 21:08:57 +0900 Subject: [PATCH 063/112] Pivottable shows filtered data --- client/app/visualizations/pivot/index.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/app/visualizations/pivot/index.js b/client/app/visualizations/pivot/index.js index ad6aae01..9c209f94 100644 --- a/client/app/visualizations/pivot/index.js +++ b/client/app/visualizations/pivot/index.js @@ -21,7 +21,7 @@ function pivotTableRenderer() { if ($scope.queryResult.getData() !== null) { // We need to give the pivot table its own copy of the data, because it changes // it which interferes with other visualizations. - data = angular.copy($scope.queryResult.getRawData()); + data = angular.copy($scope.queryResult.getData()); const options = { renderers: $.pivotUtilities.renderers, onRefresh(config) { From f73cbf3b5123d561c34861a562fd8fc6f4bb9d96 Mon Sep 17 00:00:00 2001 From: Matt Snider Date: Sat, 25 Mar 2017 12:19:53 -0500 Subject: [PATCH 064/112] Sandbox cannot be required or it will force it to be True. Also, dont annotate SOQL queries as they dont allow comments --- redash/query_runner/salesforce.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/redash/query_runner/salesforce.py b/redash/query_runner/salesforce.py index 63a7343f..6d9678b0 100644 --- a/redash/query_runner/salesforce.py +++ b/redash/query_runner/salesforce.py @@ -55,6 +55,10 @@ class Salesforce(BaseQueryRunner): def enabled(cls): return enabled + @classmethod + def annotate_query(cls): + return False + @classmethod def configuration_schema(cls): return { @@ -74,7 +78,7 @@ class Salesforce(BaseQueryRunner): "type": "boolean" } }, - "required": ["username", "password", "token", "sandbox"], + "required": ["username", "password", "token"], "secret": ["password", "token"] } From 7fbb1b92292c153b3af658dcbac86a325d5218d1 Mon Sep 17 00:00:00 2001 From: Akira Yumiyama Date: Sun, 26 Mar 2017 12:24:07 +0900 Subject: [PATCH 065/112] [Refactoring] make_{csv,excel}_content move to models from handlers I want to be able to use like: `python manage.py queries export ` --- redash/handlers/query_results.py | 33 ++---------------------------- redash/models.py | 35 ++++++++++++++++++++++++++++++++ 2 files changed, 37 insertions(+), 31 deletions(-) diff --git a/redash/handlers/query_results.py b/redash/handlers/query_results.py index 81510ae3..8193d57c 100644 --- a/redash/handlers/query_results.py +++ b/redash/handlers/query_results.py @@ -1,13 +1,10 @@ -import csv import json -import cStringIO import time import pystache from flask import make_response, request from flask_login import current_user from flask_restful import abort -import xlsxwriter from redash import models, settings, utils from redash.tasks import QueryTask, record_event from redash.permissions import require_permission, not_view_only, has_access, require_access, view_only @@ -189,39 +186,13 @@ class QueryResultResource(BaseResource): @staticmethod def make_csv_response(query_result): - s = cStringIO.StringIO() - - query_data = json.loads(query_result.data) - writer = csv.DictWriter(s, fieldnames=[col['name'] for col in query_data['columns']]) - writer.writer = utils.UnicodeWriter(s) - writer.writeheader() - for row in query_data['rows']: - writer.writerow(row) - headers = {'Content-Type': "text/csv; charset=UTF-8"} - return make_response(s.getvalue(), 200, headers) + return make_response(query_result.make_csv_content(), 200, headers) @staticmethod def make_excel_response(query_result): - s = cStringIO.StringIO() - - query_data = json.loads(query_result.data) - book = xlsxwriter.Workbook(s) - sheet = book.add_worksheet("result") - - column_names = [] - for (c, col) in enumerate(query_data['columns']): - sheet.write(0, c, col['name']) - column_names.append(col['name']) - - for (r, row) in enumerate(query_data['rows']): - for (c, name) in enumerate(column_names): - sheet.write(r + 1, c, row.get(name)) - - book.close() - headers = {'Content-Type': "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"} - return make_response(s.getvalue(), 200, headers) + return make_response(query_result.make_excel_content(), 200, headers) class JobResource(BaseResource): diff --git a/redash/models.py b/redash/models.py index e0200b52..bdc1eb71 100644 --- a/redash/models.py +++ b/redash/models.py @@ -4,6 +4,9 @@ import hashlib import itertools import json import logging +import cStringIO +import csv +import xlsxwriter from funcy import project from flask_sqlalchemy import SQLAlchemy @@ -646,6 +649,38 @@ class QueryResult(db.Model, BelongsToOrgMixin): def groups(self): return self.data_source.groups + def make_csv_content(self): + s = cStringIO.StringIO() + + query_data = json.loads(self.data) + writer = csv.DictWriter(s, fieldnames=[col['name'] for col in query_data['columns']]) + writer.writer = utils.UnicodeWriter(s) + writer.writeheader() + for row in query_data['rows']: + writer.writerow(row) + + return s.getvalue() + + def make_excel_content(self): + s = cStringIO.StringIO() + + query_data = json.loads(self.data) + book = xlsxwriter.Workbook(s) + sheet = book.add_worksheet("result") + + column_names = [] + for (c, col) in enumerate(query_data['columns']): + sheet.write(0, c, col['name']) + column_names.append(col['name']) + + for (r, row) in enumerate(query_data['rows']): + for (c, name) in enumerate(column_names): + sheet.write(r + 1, c, row.get(name)) + + book.close() + + return s.getvalue() + def should_schedule_next(previous_iteration, now, schedule, failures): if schedule.isdigit(): From aaf0da4b70c5f7f2fcf51e8f64c6e6378f0af976 Mon Sep 17 00:00:00 2001 From: Arik Fraimovich Date: Sun, 26 Mar 2017 11:45:06 +0300 Subject: [PATCH 066/112] Fix: user can't edit their own alert --- client/app/pages/alert/index.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/app/pages/alert/index.js b/client/app/pages/alert/index.js index 05ba8973..2da80466 100644 --- a/client/app/pages/alert/index.js +++ b/client/app/pages/alert/index.js @@ -27,8 +27,8 @@ function AlertCtrl($routeParams, $location, $sce, toastr, currentUser, Query, Ev } else { this.alert = Alert.get({ id: this.alertId }, (alert) => { this.onQuerySelected(new Query(alert.query)); + this.canEdit = currentUser.canEdit(this.alert); }); - this.canEdit = currentUser.canEdit(this.alert); } this.ops = ['greater than', 'less than', 'equals']; From de77ebd961892b0544427d7a5c13fd4fc2cb1bd5 Mon Sep 17 00:00:00 2001 From: deecay Date: Mon, 27 Mar 2017 15:14:35 +0900 Subject: [PATCH 067/112] Bump Plotly version --- npm-shrinkwrap.json | 184 +++++++++++++++++++++++++++++++------------- package.json | 2 +- 2 files changed, 133 insertions(+), 53 deletions(-) diff --git a/npm-shrinkwrap.json b/npm-shrinkwrap.json index f0e5e899..8fbbadc5 100644 --- a/npm-shrinkwrap.json +++ b/npm-shrinkwrap.json @@ -8,15 +8,20 @@ "resolved": "https://registry.npmjs.org/3d-view/-/3d-view-2.0.0.tgz" }, "3d-view-controls": { - "version": "2.1.1", - "from": "3d-view-controls@>=2.0.0 <3.0.0", - "resolved": "https://registry.npmjs.org/3d-view-controls/-/3d-view-controls-2.1.1.tgz" + "version": "2.2.0", + "from": "3d-view-controls@>=2.2.0 <3.0.0", + "resolved": "https://registry.npmjs.org/3d-view-controls/-/3d-view-controls-2.2.0.tgz" }, "a-big-triangle": { "version": "1.0.3", "from": "a-big-triangle@>=1.0.0 <2.0.0", "resolved": "https://registry.npmjs.org/a-big-triangle/-/a-big-triangle-1.0.3.tgz" }, + "acorn": { + "version": "4.0.4", + "from": "acorn@4.0.4", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-4.0.4.tgz" + }, "add-line-numbers": { "version": "1.0.1", "from": "add-line-numbers@>=1.0.1 <2.0.0", @@ -32,6 +37,11 @@ "from": "align-text@>=0.1.3 <0.2.0", "resolved": "https://registry.npmjs.org/align-text/-/align-text-0.1.4.tgz" }, + "almost-equal": { + "version": "1.1.0", + "from": "almost-equal@>=1.1.0 <2.0.0", + "resolved": "https://registry.npmjs.org/almost-equal/-/almost-equal-1.1.0.tgz" + }, "alpha-complex": { "version": "1.0.0", "from": "alpha-complex@>=1.0.0 <2.0.0", @@ -179,9 +189,9 @@ "optional": true }, "big-rat": { - "version": "1.0.2", - "from": "big-rat@>=1.0.1 <2.0.0", - "resolved": "https://registry.npmjs.org/big-rat/-/big-rat-1.0.2.tgz" + "version": "1.0.3", + "from": "big-rat@>=1.0.3 <2.0.0", + "resolved": "https://registry.npmjs.org/big-rat/-/big-rat-1.0.3.tgz" }, "big.js": { "version": "3.1.3", @@ -204,9 +214,9 @@ "resolved": "https://registry.npmjs.org/bl/-/bl-1.2.0.tgz" }, "bn.js": { - "version": "2.2.0", - "from": "bn.js@>=2.0.5 <3.0.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-2.2.0.tgz" + "version": "4.11.6", + "from": "bn.js@>=4.11.6 <5.0.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.6.tgz" }, "boom": { "version": "2.10.1", @@ -343,10 +353,15 @@ "from": "circumradius@>=1.0.0 <2.0.0", "resolved": "https://registry.npmjs.org/circumradius/-/circumradius-1.0.0.tgz" }, + "clamp": { + "version": "1.0.1", + "from": "clamp@>=1.0.1 <2.0.0", + "resolved": "https://registry.npmjs.org/clamp/-/clamp-1.0.1.tgz" + }, "clean-pslg": { - "version": "1.1.0", + "version": "1.1.2", "from": "clean-pslg@>=1.1.0 <2.0.0", - "resolved": "https://registry.npmjs.org/clean-pslg/-/clean-pslg-1.1.0.tgz" + "resolved": "https://registry.npmjs.org/clean-pslg/-/clean-pslg-1.1.2.tgz" }, "cliui": { "version": "2.1.0", @@ -365,6 +380,31 @@ "from": "clone@>=1.0.2 <2.0.0", "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.2.tgz" }, + "color-id": { + "version": "1.0.3", + "from": "color-id@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/color-id/-/color-id-1.0.3.tgz" + }, + "color-name": { + "version": "1.1.2", + "from": "color-name@>=1.1.1 <2.0.0", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.2.tgz" + }, + "color-parse": { + "version": "1.3.2", + "from": "color-parse@>=1.2.0 <2.0.0", + "resolved": "https://registry.npmjs.org/color-parse/-/color-parse-1.3.2.tgz" + }, + "color-rgba": { + "version": "1.1.0", + "from": "color-rgba@>=1.0.4 <2.0.0", + "resolved": "https://registry.npmjs.org/color-rgba/-/color-rgba-1.1.0.tgz" + }, + "color-space": { + "version": "1.14.7", + "from": "color-space@>=1.14.6 <2.0.0", + "resolved": "https://registry.npmjs.org/color-space/-/color-space-1.14.7.tgz" + }, "colormap": { "version": "2.2.0", "from": "colormap@>=2.1.0 <3.0.0", @@ -443,9 +483,9 @@ "resolved": "git+https://github.com/restorando/cornelius.git#24d935811186c165c8ba63244ff363da71f32dcf" }, "country-regex": { - "version": "1.0.3", - "from": "country-regex@>=1.0.0 <2.0.0", - "resolved": "https://registry.npmjs.org/country-regex/-/country-regex-1.0.3.tgz" + "version": "1.1.0", + "from": "country-regex@>=1.1.0 <2.0.0", + "resolved": "https://registry.npmjs.org/country-regex/-/country-regex-1.1.0.tgz" }, "cryptiles": { "version": "2.0.5", @@ -463,9 +503,9 @@ "resolved": "https://registry.npmjs.org/cubic-hermite/-/cubic-hermite-1.0.0.tgz" }, "cwise": { - "version": "1.0.9", + "version": "1.0.10", "from": "cwise@>=1.0.3 <2.0.0", - "resolved": "https://registry.npmjs.org/cwise/-/cwise-1.0.9.tgz" + "resolved": "https://registry.npmjs.org/cwise/-/cwise-1.0.10.tgz" }, "cwise-compiler": { "version": "1.1.2", @@ -600,9 +640,9 @@ "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz" }, "es-abstract": { - "version": "1.6.1", + "version": "1.7.0", "from": "es-abstract@>=1.5.0 <2.0.0", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.6.1.tgz" + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.7.0.tgz" }, "es-to-primitive": { "version": "1.1.1", @@ -648,9 +688,9 @@ "resolved": "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz" }, "espurify": { - "version": "1.6.0", + "version": "1.7.0", "from": "espurify@>=1.3.0 <2.0.0", - "resolved": "https://registry.npmjs.org/espurify/-/espurify-1.6.0.tgz" + "resolved": "https://registry.npmjs.org/espurify/-/espurify-1.7.0.tgz" }, "estraverse": { "version": "1.5.1", @@ -736,6 +776,11 @@ } } }, + "font-atlas-sdf": { + "version": "1.1.3", + "from": "font-atlas-sdf@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/font-atlas-sdf/-/font-atlas-sdf-1.1.3.tgz" + }, "font-awesome": { "version": "4.7.0", "from": "font-awesome@latest", @@ -1174,9 +1219,9 @@ } }, "gl-plot3d": { - "version": "1.5.1", - "from": "gl-plot3d@>=1.5.0 <2.0.0", - "resolved": "https://registry.npmjs.org/gl-plot3d/-/gl-plot3d-1.5.1.tgz", + "version": "1.5.3", + "from": "gl-plot3d@>=1.5.2 <2.0.0", + "resolved": "https://registry.npmjs.org/gl-plot3d/-/gl-plot3d-1.5.3.tgz", "dependencies": { "bl": { "version": "0.9.5", @@ -1304,11 +1349,16 @@ } } }, - "gl-scatter2d-fancy": { - "version": "1.2.1", - "from": "gl-scatter2d-fancy@>=1.2.1 <2.0.0", - "resolved": "https://registry.npmjs.org/gl-scatter2d-fancy/-/gl-scatter2d-fancy-1.2.1.tgz", + "gl-scatter2d-sdf": { + "version": "1.3.4", + "from": "gl-scatter2d-sdf@>=1.3.3 <2.0.0", + "resolved": "https://registry.npmjs.org/gl-scatter2d-sdf/-/gl-scatter2d-sdf-1.3.4.tgz", "dependencies": { + "binary-search-bounds": { + "version": "2.0.3", + "from": "binary-search-bounds@>=2.0.3 <3.0.0", + "resolved": "https://registry.npmjs.org/binary-search-bounds/-/binary-search-bounds-2.0.3.tgz" + }, "bl": { "version": "0.9.5", "from": "bl@>=0.9.4 <0.10.0", @@ -1343,6 +1393,11 @@ "version": "1.0.34", "from": "readable-stream@~1.0.26", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz" + }, + "snap-points-2d": { + "version": "3.1.0", + "from": "snap-points-2d@>=3.1.0 <4.0.0", + "resolved": "https://registry.npmjs.org/snap-points-2d/-/snap-points-2d-3.1.0.tgz" } } }, @@ -1708,6 +1763,11 @@ "from": "http-signature@>=1.1.0 <1.2.0", "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.1.1.tgz" }, + "husl": { + "version": "5.0.3", + "from": "husl@>=5.0.0 <6.0.0", + "resolved": "https://registry.npmjs.org/husl/-/husl-5.0.3.tgz" + }, "ieee754": { "version": "1.1.8", "from": "ieee754@>=1.1.4 <2.0.0", @@ -1763,20 +1823,30 @@ "from": "is-function@>=1.0.0 <1.1.0", "resolved": "https://registry.npmjs.org/is-function/-/is-function-1.0.1.tgz" }, + "is-mobile": { + "version": "0.2.2", + "from": "is-mobile@>=0.2.2 <0.3.0", + "resolved": "https://registry.npmjs.org/is-mobile/-/is-mobile-0.2.2.tgz" + }, "is-my-json-valid": { "version": "2.15.0", "from": "is-my-json-valid@>=2.10.0 <3.0.0", "resolved": "https://registry.npmjs.org/is-my-json-valid/-/is-my-json-valid-2.15.0.tgz" }, + "is-plain-obj": { + "version": "1.1.0", + "from": "is-plain-obj@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz" + }, "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" }, "is-regex": { - "version": "1.0.3", + "version": "1.0.4", "from": "is-regex@>=1.0.3 <2.0.0", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.3.tgz" + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.4.tgz" }, "is-symbol": { "version": "1.0.1", @@ -2047,6 +2117,11 @@ "from": "mouse-event@>=1.0.0 <2.0.0", "resolved": "https://registry.npmjs.org/mouse-event/-/mouse-event-1.0.5.tgz" }, + "mouse-event-offset": { + "version": "3.0.2", + "from": "mouse-event-offset@>=3.0.2 <4.0.0", + "resolved": "https://registry.npmjs.org/mouse-event-offset/-/mouse-event-offset-3.0.2.tgz" + }, "mouse-wheel": { "version": "1.2.0", "from": "mouse-wheel@>=1.0.2 <2.0.0", @@ -2081,6 +2156,11 @@ } } }, + "mumath": { + "version": "3.3.4", + "from": "mumath@>=3.0.0 <4.0.0", + "resolved": "https://registry.npmjs.org/mumath/-/mumath-3.3.4.tgz" + }, "murmurhash-js": { "version": "1.0.0", "from": "murmurhash-js@>=1.0.0 <2.0.0", @@ -2102,9 +2182,9 @@ "resolved": "https://registry.npmjs.org/ndarray-extract-contour/-/ndarray-extract-contour-1.0.1.tgz" }, "ndarray-fill": { - "version": "1.0.1", - "from": "ndarray-fill@>=1.0.1 <2.0.0", - "resolved": "https://registry.npmjs.org/ndarray-fill/-/ndarray-fill-1.0.1.tgz" + "version": "1.0.2", + "from": "ndarray-fill@>=1.0.2 <2.0.0", + "resolved": "https://registry.npmjs.org/ndarray-fill/-/ndarray-fill-1.0.2.tgz" }, "ndarray-gradient": { "version": "1.0.0", @@ -2226,9 +2306,9 @@ "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.0.tgz" }, "object-inspect": { - "version": "1.2.1", + "version": "1.2.2", "from": "object-inspect@>=1.2.1 <1.3.0", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.2.1.tgz" + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.2.2.tgz" }, "object-keys": { "version": "1.0.11", @@ -2333,9 +2413,9 @@ "resolved": "https://registry.npmjs.org/planar-graph-to-polyline/-/planar-graph-to-polyline-1.0.5.tgz" }, "plotly.js": { - "version": "1.21.2", - "from": "plotly.js@1.21.2", - "resolved": "https://registry.npmjs.org/plotly.js/-/plotly.js-1.21.2.tgz" + "version": "1.25.0", + "from": "plotly.js@1.25.0", + "resolved": "https://registry.npmjs.org/plotly.js/-/plotly.js-1.25.0.tgz" }, "pngjs": { "version": "2.3.1", @@ -2420,9 +2500,9 @@ } }, "rat-vec": { - "version": "1.1.0", - "from": "rat-vec@>=1.1.0 <2.0.0", - "resolved": "https://registry.npmjs.org/rat-vec/-/rat-vec-1.1.0.tgz" + "version": "1.1.1", + "from": "rat-vec@>=1.1.1 <2.0.0", + "resolved": "https://registry.npmjs.org/rat-vec/-/rat-vec-1.1.1.tgz" }, "readable-stream": { "version": "2.1.5", @@ -2434,6 +2514,11 @@ "from": "reduce-simplicial-complex@>=1.0.0 <2.0.0", "resolved": "https://registry.npmjs.org/reduce-simplicial-complex/-/reduce-simplicial-complex-1.0.0.tgz" }, + "regl": { + "version": "1.3.0", + "from": "regl@>=1.3.0 <2.0.0", + "resolved": "https://registry.npmjs.org/regl/-/regl-1.3.0.tgz" + }, "repeat-string": { "version": "1.6.1", "from": "repeat-string@>=1.5.2 <2.0.0", @@ -2765,9 +2850,9 @@ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz" }, "supercluster": { - "version": "2.2.0", + "version": "2.3.0", "from": "supercluster@>=2.0.1 <3.0.0", - "resolved": "https://registry.npmjs.org/supercluster/-/supercluster-2.2.0.tgz" + "resolved": "https://registry.npmjs.org/supercluster/-/supercluster-2.3.0.tgz" }, "superscript-text": { "version": "1.0.0", @@ -2818,6 +2903,11 @@ } } }, + "tiny-sdf": { + "version": "1.0.2", + "from": "tiny-sdf@>=1.0.2 <2.0.0", + "resolved": "https://registry.npmjs.org/tiny-sdf/-/tiny-sdf-1.0.2.tgz" + }, "tinycolor2": { "version": "1.4.1", "from": "tinycolor2@>=1.3.0 <2.0.0", @@ -2926,11 +3016,6 @@ "from": "unassert@>=1.3.1 <2.0.0", "resolved": "https://registry.npmjs.org/unassert/-/unassert-1.5.1.tgz", "dependencies": { - "acorn": { - "version": "4.0.4", - "from": "acorn@>=4.0.0 <5.0.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-4.0.4.tgz" - }, "estraverse": { "version": "4.2.0", "from": "estraverse@>=4.1.0 <5.0.0", @@ -2943,11 +3028,6 @@ "from": "unassertify@>=2.0.0 <3.0.0", "resolved": "https://registry.npmjs.org/unassertify/-/unassertify-2.0.4.tgz", "dependencies": { - "acorn": { - "version": "4.0.4", - "from": "acorn@>=4.0.0 <5.0.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-4.0.4.tgz" - }, "escodegen": { "version": "1.8.1", "from": "escodegen@>=1.6.1 <2.0.0", diff --git a/package.json b/package.json index 3ea22efb..8f5d5957 100644 --- a/package.json +++ b/package.json @@ -51,7 +51,7 @@ "ng-annotate-loader": "^0.2.0", "pace-progress": "git+https://github.com/getredash/pace.git", "pivottable": "^2.3.0", - "plotly.js": "1.21.2", + "plotly.js": "1.25.0", "ui-select": "^0.19.6", "underscore": "^1.8.3", "underscore.string": "^3.3.4" From 1bb4d6d5348060af05d021171a90f7553c010c9b Mon Sep 17 00:00:00 2001 From: Arik Fraimovich Date: Mon, 27 Mar 2017 13:12:50 +0300 Subject: [PATCH 068/112] Fix condition to only have effect when there is a value in query string. --- client/app/pages/dashboards/dashboard.js | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/client/app/pages/dashboards/dashboard.js b/client/app/pages/dashboards/dashboard.js index 3efc1efc..0bedda67 100644 --- a/client/app/pages/dashboards/dashboard.js +++ b/client/app/pages/dashboards/dashboard.js @@ -84,8 +84,7 @@ function DashboardCtrl($rootScope, $routeParams, $location, $timeout, $q, $uibMo return; } - if ((hasQueryStringValue || dashboard.dashboard_filters_enabled)) { - // Sets query filters to match dashboard fiters when present + if (hasQueryStringValue) { queryFilter.current = $location.search()[queryFilter.name]; } From 04cd798c48b278f7724ad31a301a4de1008956a9 Mon Sep 17 00:00:00 2001 From: Arik Fraimovich Date: Mon, 27 Mar 2017 15:06:50 +0300 Subject: [PATCH 069/112] Update changelog --- CHANGELOG.md | 37 +++++++++++++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index f95d306e..15fa63c0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,42 @@ # Change Log +## [Unreleased] - 2017-02-22 + +### Added + +- Add: bubble charts support. +- Add "Refresh Schema" button to the datasource @44px +- [Data Sources] Add: ATSD query runner @rmakulov +- [Data Sources] Add: SalesForce query runner @msnider +- Add: scheduled query backoff in case of errors @washort +- Add: use results row count as the value for the counter visualization. @deecay + +### Changed + +- Moved CSV/Excel query results generation code to models. @akiray03 +- Add support for filtered data in Pivot table visualization @deecay +- Friendlier labels for archived state of dashboard/query + +### Fixed + +- Fix: set query filter to match value from URL query string. @benmargo +- [Clickhouse] Fix: detection of various data types. @denisov-vlad +- Fix: user can't edit their own alert. +- Fix: angular minification issue in textbox editor and schema browser. +- Fixes to better support IE11 (add polyfill for Object.assign and show vertical scrollbar). @deecay +- Fix: datetime parameters were not using a date picker. +- Fix: Impala schema wasn't loading. +- Fix: query embed dialog close button wasn't working @r0fls +- Fix: make errors from Presto runner JSON-serializable @washort +- Fix: race condition in query task status reporting @washort +- Fix: remove $$hashKey from Pivot table +- Fix: map visualization had severe performance issue. +- Fix: pemrission dialog wasn't rendering. +- Fix: word cloud visualization didn't show column names. +- Fix: wrong timestamps in admin tasks page. +- Fix: page header wasn't updating on dashboards page @MichaelJAndy +- Fix: keyboard shortcuts didn't work in parameter inputs + ## v1.0.0-rc.2 - 2017-02-22 From 3414ff733135a8fe8008f3223103137f7302ab5a Mon Sep 17 00:00:00 2001 From: Arik Fraimovich Date: Mon, 27 Mar 2017 15:07:11 +0300 Subject: [PATCH 070/112] Update CHANGELOG.md --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 15fa63c0..8e646892 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,6 @@ # Change Log -## [Unreleased] - 2017-02-22 +## [Unreleased] ### Added From 3fcd07bc1c7320962d687d8b80964b91a0f35616 Mon Sep 17 00:00:00 2001 From: Davor Spasovski Date: Wed, 29 Mar 2017 15:07:37 -0400 Subject: [PATCH 071/112] fix percent stacking math (issue 41) --- client/app/visualizations/chart/plotly.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/app/visualizations/chart/plotly.js b/client/app/visualizations/chart/plotly.js index 5d1cdf11..0cf80da2 100644 --- a/client/app/visualizations/chart/plotly.js +++ b/client/app/visualizations/chart/plotly.js @@ -140,7 +140,7 @@ function percentBarStacking(seriesList) { sum += seriesList[j].y[i]; } for (let j = 0; j < seriesList.length; j += 1) { - const value = seriesList[j].y[i] / (sum * 100); + const value = seriesList[j].y[i] / sum * 100; seriesList[j].text.push(`Value: ${seriesList[j].y[i]}
Relative: ${value.toFixed(2)}%`); seriesList[j].y[i] = value; } From 0cf4db11378e5ffa8e23653081e4bf19a2b29827 Mon Sep 17 00:00:00 2001 From: Arik Fraimovich Date: Thu, 30 Mar 2017 15:19:57 +0300 Subject: [PATCH 072/112] Update atsd_client version. --- requirements_all_ds.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements_all_ds.txt b/requirements_all_ds.txt index 5dad813f..42e5ecac 100644 --- a/requirements_all_ds.txt +++ b/requirements_all_ds.txt @@ -18,7 +18,7 @@ thrift>=0.8.0 thrift_sasl>=0.1.0 cassandra-driver==3.1.1 snowflake_connector_python==1.3.7 -atsd_client==2.0.11 +atsd_client==2.0.12 simple_salesforce==0.72.2 # certifi is needed to support MongoDB and SSL: certifi From 0dc98e87a6bc1e1a1624d542ece7bf52b7af14ad Mon Sep 17 00:00:00 2001 From: Akira Yumiyama Date: Sat, 1 Apr 2017 20:23:04 +0900 Subject: [PATCH 073/112] rename local variable `next` to `next_path`. because shadow built-in methods. --- redash/authentication/google_oauth.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/redash/authentication/google_oauth.py b/redash/authentication/google_oauth.py index 4653f7bc..aaca8f9f 100644 --- a/redash/authentication/google_oauth.py +++ b/redash/authentication/google_oauth.py @@ -85,10 +85,10 @@ def org_login(org_slug): @blueprint.route('/oauth/google', endpoint="authorize") def login(): callback = url_for('.callback', _external=True) - next = request.args.get('next', url_for("redash.index", org_slug=session.get('org_slug'))) + next_path = request.args.get('next', url_for("redash.index", org_slug=session.get('org_slug'))) logger.debug("Callback url: %s", callback) - logger.debug("Next is: %s", next) - return google_remote_app().authorize(callback=callback, state=next) + logger.debug("Next is: %s", next_path) + return google_remote_app().authorize(callback=callback, state=next_path) @blueprint.route('/oauth/google_callback', endpoint="callback") @@ -118,6 +118,6 @@ def authorized(): create_and_login_user(org, profile['name'], profile['email']) - next = request.args.get('state') or url_for("redash.index", org_slug=org.slug) + next_path = request.args.get('state') or url_for("redash.index", org_slug=org.slug) - return redirect(next) + return redirect(next_path) From 83ed9fdc515660b5435dfee4fe9a531693562055 Mon Sep 17 00:00:00 2001 From: deecay Date: Mon, 27 Mar 2017 15:37:17 +0900 Subject: [PATCH 074/112] Fix: Dashboard tag for unicode dashboard names --- client/app/pages/dashboards/dashboard-list.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/app/pages/dashboards/dashboard-list.js b/client/app/pages/dashboards/dashboard-list.js index 0150c803..d5fb4ac5 100644 --- a/client/app/pages/dashboards/dashboard-list.js +++ b/client/app/pages/dashboards/dashboard-list.js @@ -6,7 +6,7 @@ import './dashboard-list.css'; function DashboardListCtrl(Dashboard, $location, clientConfig) { - const TAGS_REGEX = /(^[\w\s]+):|(#[\w-]+)/ig; + const TAGS_REGEX = /(^([\w\s]|[^\u0000-\u007F])+):|(#([\w-]|[^\u0000-\u007F])+)/ig; this.logoUrl = clientConfig.logoUrl; const page = parseInt($location.search().page || 1, 10); From 1142a441fc6391fbead241d504433d3076ef2de3 Mon Sep 17 00:00:00 2001 From: Arik Fraimovich Date: Sun, 2 Apr 2017 14:01:23 +0300 Subject: [PATCH 075/112] Fix: optimize queries to avoid N+1 cases --- redash/models.py | 25 +++++++++++-------------- 1 file changed, 11 insertions(+), 14 deletions(-) diff --git a/redash/models.py b/redash/models.py index bdc1eb71..35ff088e 100644 --- a/redash/models.py +++ b/redash/models.py @@ -16,7 +16,7 @@ from sqlalchemy.event import listens_for from sqlalchemy.inspection import inspect from sqlalchemy.types import TypeDecorator from sqlalchemy.ext.mutable import Mutable -from sqlalchemy.orm import object_session, backref +from sqlalchemy.orm import object_session, backref, joinedload, subqueryload # noinspection PyUnresolvedReferences from sqlalchemy.orm.exc import NoResultFound from sqlalchemy import or_ @@ -806,12 +806,12 @@ class Query(ChangeTrackingMixin, TimestampMixin, BelongsToOrgMixin, db.Model): @classmethod def all_queries(cls, group_ids, user_id=None, drafts=False): - q = (cls.query.join(User, Query.user_id == User.id) - .outerjoin(QueryResult) + q = (cls.query + .options(joinedload(Query.user), + joinedload(Query.latest_query_data).load_only('runtime', 'retrieved_at')) .join(DataSourceGroup, Query.data_source_id == DataSourceGroup.data_source_id) .filter(Query.is_archived == False) .filter(DataSourceGroup.group_id.in_(group_ids))\ - .group_by(Query.id, User.id, QueryResult.id, QueryResult.retrieved_at, QueryResult.runtime) .order_by(Query.created_at.desc())) if not drafts: @@ -826,8 +826,7 @@ class Query(ChangeTrackingMixin, TimestampMixin, BelongsToOrgMixin, db.Model): @classmethod def outdated_queries(cls): queries = (db.session.query(Query) - .join(QueryResult) - .join(DataSource) + .options(joinedload(Query.latest_query_data).load_only('retrieved_at')) .filter(Query.schedule != None) .order_by(Query.id)) @@ -836,7 +835,7 @@ class Query(ChangeTrackingMixin, TimestampMixin, BelongsToOrgMixin, db.Model): for query in queries: if should_schedule_next(query.latest_query_data.retrieved_at, now, query.schedule, query.schedule_failures): - key = "{}:{}".format(query.query_hash, query.data_source.id) + key = "{}:{}".format(query.query_hash, query.data_source_id) outdated_queries[key] = query return outdated_queries.values() @@ -862,12 +861,11 @@ class Query(ChangeTrackingMixin, TimestampMixin, BelongsToOrgMixin, db.Model): Query.data_source_id == DataSourceGroup.data_source_id) .filter(where)).distinct() - return Query.query.join(User, Query.user_id == User.id).filter( - Query.id.in_(query_ids)) + return Query.query.options(joinedload(Query.user)).filter(Query.id.in_(query_ids)) @classmethod def recent(cls, group_ids, user_id=None, limit=20): - query = (cls.query.join(User, Query.user_id == User.id) + query = (cls.query.options(subqueryload(Query.user)) .filter(Event.created_at > (db.func.current_date() - 7)) .join(Event, Query.id == Event.object_id.cast(db.Integer)) .join(DataSourceGroup, Query.data_source_id == DataSourceGroup.data_source_id) @@ -879,7 +877,7 @@ class Query(ChangeTrackingMixin, TimestampMixin, BelongsToOrgMixin, db.Model): DataSourceGroup.group_id.in_(group_ids), or_(Query.is_draft == False, Query.user_id == user_id), Query.is_archived == False) - .group_by(Event.object_id, Query.id, User.id) + .group_by(Event.object_id, Query.id) .order_by(db.desc(db.func.count(0)))) if user_id: @@ -1069,12 +1067,11 @@ class Alert(TimestampMixin, db.Model): @classmethod def all(cls, group_ids): - # TODO: there was a join with user here to prevent N+1 queries. need to revisit this. return db.session.query(Alert)\ + .options(joinedload(Alert.user), joinedload(Alert.query_rel))\ .join(Query)\ .join(DataSourceGroup, DataSourceGroup.data_source_id==Query.data_source_id)\ - .filter(DataSourceGroup.group_id.in_(group_ids))\ - .group_by(Alert) + .filter(DataSourceGroup.group_id.in_(group_ids)) @classmethod def get_by_id_and_org(cls, id, org): From 2707e24f30cbf0fe95369e67b23d2f886b93e9db Mon Sep 17 00:00:00 2001 From: Arik Fraimovich Date: Sun, 2 Apr 2017 14:43:02 +0300 Subject: [PATCH 076/112] Update CHANGELOG & version --- CHANGELOG.md | 4 +++- package.json | 2 +- redash/__init__.py | 2 +- 3 files changed, 5 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 8e646892..ec2f240d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,6 @@ # Change Log -## [Unreleased] +## v1.0.1 - 2017-04-02 ### Added @@ -19,6 +19,8 @@ ### Fixed +- Fix: optimize queries to avoid N+1 queries. +- Fix: percent stacking math was wrong. @spasovski - Fix: set query filter to match value from URL query string. @benmargo - [Clickhouse] Fix: detection of various data types. @denisov-vlad - Fix: user can't edit their own alert. diff --git a/package.json b/package.json index e6e0b196..d5e17fca 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "redash-client", - "version": "1.0.0", + "version": "1.0.1", "description": "The frontend part of Redash.", "main": "index.js", "scripts": { diff --git a/redash/__init__.py b/redash/__init__.py index 2d8c0bc9..6e2673d2 100644 --- a/redash/__init__.py +++ b/redash/__init__.py @@ -16,7 +16,7 @@ from redash.query_runner import import_query_runners from redash.destinations import import_destinations -__version__ = '1.0.0' +__version__ = '1.0.1' def setup_logging(): From 903463972b275f53104788f0f31f851f7ac8a928 Mon Sep 17 00:00:00 2001 From: Arik Fraimovich Date: Sun, 2 Apr 2017 15:20:45 +0300 Subject: [PATCH 077/112] Fix: handle the case when a scheduled query wasn't run before --- redash/models.py | 8 ++++++-- tests/test_models.py | 6 ++++++ 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/redash/models.py b/redash/models.py index 35ff088e..e8035061 100644 --- a/redash/models.py +++ b/redash/models.py @@ -833,8 +833,12 @@ class Query(ChangeTrackingMixin, TimestampMixin, BelongsToOrgMixin, db.Model): now = utils.utcnow() outdated_queries = {} for query in queries: - if should_schedule_next(query.latest_query_data.retrieved_at, now, - query.schedule, query.schedule_failures): + if query.latest_query_data: + retrieved_at = query.latest_query_data.retrieved_at + else: + retrieved_at = now + + if should_schedule_next(retrieved_at, now, query.schedule, query.schedule_failures): key = "{}:{}".format(query.query_hash, query.data_source_id) outdated_queries[key] = query diff --git a/tests/test_models.py b/tests/test_models.py index 3ae389a1..81597def 100644 --- a/tests/test_models.py +++ b/tests/test_models.py @@ -79,6 +79,12 @@ class QueryOutdatedQueriesTest(BaseTestCase): self.assertNotIn(query, queries) + def test_outdated_queries_skips_unscheduled_queries(self): + query = self.factory.create_query(schedule='60') + queries = models.Query.outdated_queries() + + self.assertNotIn(query, queries) + def test_outdated_queries_works_with_ttl_based_schedule(self): two_hours_ago = utcnow() - datetime.timedelta(hours=2) query = self.factory.create_query(schedule="3600") From d2370a94c7c963bd8090e5d791baf4c4d1d45421 Mon Sep 17 00:00:00 2001 From: Arik Fraimovich Date: Mon, 3 Apr 2017 10:30:06 +0300 Subject: [PATCH 078/112] New bootstrap script --- setup/ubuntu/bootstrap.sh | 245 +++++++++------------------- setup/ubuntu/files/env | 1 - setup/ubuntu/files/supervisord.conf | 24 +-- 3 files changed, 86 insertions(+), 184 deletions(-) diff --git a/setup/ubuntu/bootstrap.sh b/setup/ubuntu/bootstrap.sh index 1168b85e..643e656c 100644 --- a/setup/ubuntu/bootstrap.sh +++ b/setup/ubuntu/bootstrap.sh @@ -1,195 +1,110 @@ #!/bin/bash +# +# This script setups Redash along with supervisor, nginx, PostgreSQL and Redis. It was written to be used on +# Ubuntu 16.04. Technically it can work with other Ubuntu versions, but you might get non compatible versions +# of PostgreSQL, Redis and maybe some other dependencies. +# +# This script is not idempotent and if it stops in the middle, you can't just run it again. You should either +# understand what parts of it to exclude or just start over on a new VM (assuming you're using a VM). + set -eu REDASH_BASE_PATH=/opt/redash - -# Default branch/version to master if not specified in REDASH_BRANCH env var -REDASH_BRANCH="${REDASH_BRANCH:-master}" - -# Install latest version if not specified in REDASH_VERSION env var -REDASH_VERSION=${REDASH_VERSION-0.12.0.b2449} -LATEST_URL="https://github.com/getredash/redash/releases/download/v${REDASH_VERSION}/redash.${REDASH_VERSION}.tar.gz" +REDASH_BRANCH="${REDASH_BRANCH:-master}" # Default branch/version to master if not specified in REDASH_BRANCH env var +REDASH_VERSION=${REDASH_VERSION-1.0.1.b2833} # Install latest version if not specified in REDASH_VERSION env var +LATEST_URL="https://s3.amazonaws.com/redash-releases/redash.${REDASH_VERSION}.tar.gz" VERSION_DIR="/opt/redash/redash.${REDASH_VERSION}" REDASH_TARBALL=/tmp/redash.tar.gz +FILES_BASE_URL=https://raw.githubusercontent.com/getredash/redash/${REDASH_BRANCH}/setup/ubuntu/files -FILES_BASE_URL=https://raw.githubusercontent.com/getredash/redash/${REDASH_BRANCH}/setup/ubuntu/files/ - -# Verify running as root: -if [ "$(id -u)" != "0" ]; then - if [ $# -ne 0 ]; then - echo "Failed running with sudo. Exiting." 1>&2 - exit 1 +verify_root() { + # Verify running as root: + if [ "$(id -u)" != "0" ]; then + if [ $# -ne 0 ]; then + echo "Failed running with sudo. Exiting." 1>&2 + exit 1 + fi + echo "This script must be run as root. Trying to run with sudo." + sudo bash "$0" --with-sudo + exit 0 fi - echo "This script must be run as root. Trying to run with sudo." - sudo bash "$0" --with-sudo - exit 0 -fi - -# Base packages -apt-get -y update -DEBIAN_FRONTEND=noninteractive apt-get -y -o Dpkg::Options::="--force-confdef" -o Dpkg::Options::="--force-confold" dist-upgrade -apt-get install -y python-pip python-dev nginx curl build-essential pwgen -# BigQuery dependencies: -apt-get install -y libffi-dev libssl-dev -# MySQL dependencies: -apt-get install -y libmysqlclient-dev -# Microsoft SQL Server dependencies: -apt-get install -y freetds-dev -# Hive dependencies: -apt-get install -y libsasl2-dev -#Saml dependency -apt-get install -y xmlsec1 - -# Upgrade pip if host is Ubuntu 16.04 -if [[ $(lsb_release -d) = *Ubuntu* ]] && [[ $(lsb_release -rs) = *16.04* ]]; then - pip install --upgrade pip -fi -pip install -U setuptools==23.1.0 - -# redash user -# TODO: check user doesn't exist yet? -adduser --system --no-create-home --disabled-login --gecos "" redash - -# PostgreSQL -pg_available=0 -psql --version || pg_available=$? -if [ $pg_available -ne 0 ]; then - wget $FILES_BASE_URL"postgres_apt.sh" -O /tmp/postgres_apt.sh - bash /tmp/postgres_apt.sh - apt-get update - apt-get -y install postgresql-9.3 postgresql-server-dev-9.3 -fi - -add_service() { - service_name=$1 - service_command="/etc/init.d/$service_name" - - echo "Adding service: $service_name (/etc/init.d/$service_name)." - chmod +x "$service_command" - - if command -v chkconfig >/dev/null 2>&1; then - # we're chkconfig, so lets add to chkconfig and put in runlevel 345 - chkconfig --add "$service_name" && echo "Successfully added to chkconfig!" - chkconfig --level 345 "$service_name" on && echo "Successfully added to runlevels 345!" - elif command -v update-rc.d >/dev/null 2>&1; then - #if we're not a chkconfig box assume we're able to use update-rc.d - update-rc.d "$service_name" defaults && echo "Success!" - else - echo "No supported init tool found." - fi - - $service_command start } -# Redis -redis_available=0 -redis-cli --version || redis_available=$? -if [ $redis_available -ne 0 ]; then - wget http://download.redis.io/releases/redis-2.8.17.tar.gz - tar xzf redis-2.8.17.tar.gz - rm redis-2.8.17.tar.gz - (cd redis-2.8.17 - make - make install +create_redash_user() { + adduser --system --no-create-home --disabled-login --gecos "" redash +} - # Setup process init & configuration +install_system_packages() { + apt-get -y update + # Base packages + apt install -y python-pip python-dev nginx curl build-essential pwgen + # Data sources dependencies: + apt install -y libffi-dev libssl-dev libmysqlclient-dev libpq-dev freetds-dev libsasl2-dev + # SAML dependency + apt install -y xmlsec1 + # Storage servers + apt install postgresql redis-server + apt install supervisor +} - REDIS_PORT=6379 - REDIS_CONFIG_FILE="/etc/redis/$REDIS_PORT.conf" - REDIS_LOG_FILE="/var/log/redis_$REDIS_PORT.log" - REDIS_DATA_DIR="/var/lib/redis/$REDIS_PORT" +create_directories() { + mkdir /opt/redash + chown redash /opt/redash + + # Default config file + if [ ! -f "/opt/redash/.env" ]; then + sudo -u redash wget "$FILES_BASE_URL/env" -O /opt/redash/.env + fi - mkdir -p "$(dirname "$REDIS_CONFIG_FILE")" || die "Could not create redis config directory" - mkdir -p "$(dirname "$REDIS_LOG_FILE")" || die "Could not create redis log dir" - mkdir -p "$REDIS_DATA_DIR" || die "Could not create redis data directory" + COOKIE_SECRET=$(pwgen -1s 32) + echo "export REDASH_COOKIE_SECRET=$COOKIE_SECRET" > /opt/redash/.env +} - wget -O /etc/init.d/redis_6379 $FILES_BASE_URL"redis_init" - wget -O $REDIS_CONFIG_FILE $FILES_BASE_URL"redis.conf" - - add_service "redis_$REDIS_PORT" - ) - rm -rf redis-2.8.17 -fi - -# Directories -if [ ! -d "$REDASH_BASE_PATH" ]; then - sudo mkdir /opt/redash - sudo chown redash /opt/redash - sudo -u redash mkdir /opt/redash/logs -fi - -# Default config file -if [ ! -f "/opt/redash/.env" ]; then - sudo -u redash wget $FILES_BASE_URL"env" -O /opt/redash/.env - echo 'export REDASH_STATIC_ASSETS_PATH="../rd_ui/dist/"' >> /opt/redash/.env -fi - -if [ ! -d "$VERSION_DIR" ]; then +extract_redash_sources() { sudo -u redash wget "$LATEST_URL" -O "$REDASH_TARBALL" sudo -u redash mkdir "$VERSION_DIR" sudo -u redash tar -C "$VERSION_DIR" -xvf "$REDASH_TARBALL" ln -nfs "$VERSION_DIR" /opt/redash/current ln -nfs /opt/redash/.env /opt/redash/current/.env +} - cd /opt/redash/current - +install_python_packages() { + pip install --upgrade pip + # pip install -U setuptools==23.1.0 # TODO: venv? - pip install -r requirements.txt -fi + # setproctitle is used by Celery for "pretty" process titles + pip install setproctitle + pip install -r /opt/redash/current/requirements.txt + pip install -r /opt/redash/current/requirements_all_ds.txt +} -# Create database / tables -pg_user_exists=0 -sudo -u postgres psql postgres -tAc "SELECT 1 FROM pg_roles WHERE rolname='redash'" | grep -q 1 || pg_user_exists=$? -if [ $pg_user_exists -ne 0 ]; then - echo "Creating redash postgres user & database." +create_database() { + # Create user and database sudo -u postgres createuser redash --no-superuser --no-createdb --no-createrole sudo -u postgres createdb redash --owner=redash cd /opt/redash/current sudo -u redash bin/run ./manage.py database create_tables -fi +} -# Create default admin user -cd /opt/redash/current -# TODO: make sure user created only once -# TODO: generate temp password and print to screen -sudo -u redash bin/run ./manage.py users create --admin --password admin "Admin" "admin" +setup_supervisor() { + wget -O /etc/supervisor/conf.d/redash.conf "$FILES_BASE_URL/supervisord.conf" + service supervisor restart +} -# Create Redash read only pg user & setup data source -pg_user_exists=0 -sudo -u postgres psql postgres -tAc "SELECT 1 FROM pg_roles WHERE rolname='redash_reader'" | grep -q 1 || pg_user_exists=$? -if [ $pg_user_exists -ne 0 ]; then - echo "Creating redash reader postgres user." - REDASH_READER_PASSWORD=$(pwgen -1) - sudo -u postgres psql -c "CREATE ROLE redash_reader WITH PASSWORD '$REDASH_READER_PASSWORD' NOCREATEROLE NOCREATEDB NOSUPERUSER LOGIN" - sudo -u redash psql -c "grant select(id,name,type) ON data_sources to redash_reader;" redash - sudo -u redash psql -c "grant select(id,name) ON users to redash_reader;" redash - sudo -u redash psql -c "grant select on alerts, alert_subscriptions, groups, events, queries, dashboards, widgets, visualizations, query_results to redash_reader;" redash +setup_nginx() { + rm /etc/nginx/sites-enabled/default + wget -O /etc/nginx/sites-available/redash "$FILES_BASE_URL/nginx_redash_site" + ln -nfs /etc/nginx/sites-available/redash /etc/nginx/sites-enabled/redash + service nginx restart +} - cd /opt/redash/current - sudo -u redash bin/run ./manage.py ds new "Redash Metadata" --type "pg" --options "{\"user\": \"redash_reader\", \"password\": \"$REDASH_READER_PASSWORD\", \"host\": \"localhost\", \"dbname\": \"redash\"}" -fi - -# Pip requirements for all data source types -cd /opt/redash/current -pip install -r requirements_all_ds.txt - -# Setup supervisord + sysv init startup script -sudo -u redash mkdir -p /opt/redash/supervisord -pip install supervisor==3.1.2 # TODO: move to requirements.txt - -# Get supervisord startup script -sudo -u redash wget -O /opt/redash/supervisord/supervisord.conf $FILES_BASE_URL"supervisord.conf" - -wget -O /etc/init.d/redash_supervisord $FILES_BASE_URL"redash_supervisord_init" -add_service "redash_supervisord" - -# Nginx setup -rm /etc/nginx/sites-enabled/default -wget -O /etc/nginx/sites-available/redash $FILES_BASE_URL"nginx_redash_site" -ln -nfs /etc/nginx/sites-available/redash /etc/nginx/sites-enabled/redash -service nginx restart - -# Hotfix: missing query snippets table: -cd /opt/redash/current -sudo -u redash bin/run python -c "from redash import models; models.QuerySnippet.create_table()" +verify_root +install_system_packages +create_redash_user +create_directories +extract_redash_sources +install_python_packages +create_database +setup_supervisor +setup_nginx \ No newline at end of file diff --git a/setup/ubuntu/files/env b/setup/ubuntu/files/env index 7df78824..ff45a709 100644 --- a/setup/ubuntu/files/env +++ b/setup/ubuntu/files/env @@ -1,4 +1,3 @@ export REDASH_LOG_LEVEL="INFO" export REDASH_REDIS_URL=redis://localhost:6379/0 export REDASH_DATABASE_URL="postgresql://redash" -export REDASH_COOKIE_SECRET=veryverysecret diff --git a/setup/ubuntu/files/supervisord.conf b/setup/ubuntu/files/supervisord.conf index 5be2cad2..98bb227d 100644 --- a/setup/ubuntu/files/supervisord.conf +++ b/setup/ubuntu/files/supervisord.conf @@ -1,24 +1,14 @@ -[supervisord] -nodaemon=false -logfile=/opt/redash/logs/supervisord.log -pidfile=/opt/redash/supervisord/supervisord.pid -directory=/opt/redash/current - [inet_http_server] port = 127.0.0.1:9001 -[rpcinterface:supervisor] -supervisor.rpcinterface_factory = supervisor.rpcinterface:make_main_rpcinterface - [program:redash_server] command=/opt/redash/current/bin/run gunicorn -b 127.0.0.1:5000 --name redash -w 4 --max-requests 1000 redash.wsgi:app +directory=/opt/redash/current process_name=redash_server +user=redash numprocs=1 -priority=999 autostart=true autorestart=true -stdout_logfile=/opt/redash/logs/api.log -stderr_logfile=/opt/redash/logs/api_error.log # There are two queue types here: one for ad-hoc queries, and one for the refresh of scheduled queries # (note that "scheduled_queries" appears only in the queue list of "redash_celery_scheduled"). @@ -26,20 +16,18 @@ stderr_logfile=/opt/redash/logs/api_error.log [program:redash_celery] command=/opt/redash/current/bin/run celery worker --app=redash.worker --beat -c2 -Qqueries,celery --maxtasksperchild=10 -Ofair +directory=/opt/redash/current process_name=redash_celery +user=redash numprocs=1 -priority=999 autostart=true autorestart=true -stdout_logfile=/opt/redash/logs/celery.log -stderr_logfile=/opt/redash/logs/celery_error.log [program:redash_celery_scheduled] command=/opt/redash/current/bin/run celery worker --app=redash.worker -c2 -Qscheduled_queries --maxtasksperchild=10 -Ofair +directory=/opt/redash/current process_name=redash_celery_scheduled +user=redash numprocs=1 -priority=999 autostart=true autorestart=true -stdout_logfile=/opt/redash/logs/celery.log -stderr_logfile=/opt/redash/logs/celery_error.log From 079530cf63ad446b95c45e2683fe086576278593 Mon Sep 17 00:00:00 2001 From: Arik Fraimovich Date: Mon, 3 Apr 2017 12:54:05 +0300 Subject: [PATCH 079/112] Remove unused files --- setup/ubuntu/files/postgres_apt.sh | 162 ----- setup/ubuntu/files/redash_supervisord_init | 129 ---- setup/ubuntu/files/redis.conf | 785 --------------------- setup/ubuntu/files/redis_init | 66 -- 4 files changed, 1142 deletions(-) delete mode 100644 setup/ubuntu/files/postgres_apt.sh delete mode 100644 setup/ubuntu/files/redash_supervisord_init delete mode 100644 setup/ubuntu/files/redis.conf delete mode 100644 setup/ubuntu/files/redis_init diff --git a/setup/ubuntu/files/postgres_apt.sh b/setup/ubuntu/files/postgres_apt.sh deleted file mode 100644 index 35018d94..00000000 --- a/setup/ubuntu/files/postgres_apt.sh +++ /dev/null @@ -1,162 +0,0 @@ -#!/bin/sh - -# script to add apt.postgresql.org to sources.list - -# from command line -CODENAME="$1" -# lsb_release is the best interface, but not always available -if [ -z "$CODENAME" ]; then - CODENAME=$(lsb_release -cs 2>/dev/null) -fi -# parse os-release (unreliable, does not work on Ubuntu) -if [ -z "$CODENAME" -a -f /etc/os-release ]; then - . /etc/os-release - # Debian: VERSION="7.0 (wheezy)" - # Ubuntu: VERSION="13.04, Raring Ringtail" - CODENAME=$(echo $VERSION | sed -ne 's/.*(\(.*\)).*/\1/') -fi -# guess from sources.list -if [ -z "$CODENAME" ]; then - CODENAME=$(grep '^deb ' /etc/apt/sources.list | head -n1 | awk '{ print $3 }') -fi -# complain if no result yet -if [ -z "$CODENAME" ]; then - cat < /etc/apt/sources.list.d/pgdg.list < - -# Do NOT "set -e" - -# PATH should only include /usr/* if it runs after the mountnfs.sh script -PATH=/sbin:/usr/sbin:/usr/local/sbin:/bin:/usr/bin:/usr/local/bin -NAME=supervisord -DESC="process supervisor" -DAEMON=/usr/local/bin/$NAME -DAEMON_ARGS="--configuration /opt/redash/supervisord/supervisord.conf " -PIDFILE=/opt/redash/supervisord/supervisord.pid -SCRIPTNAME=/etc/init.d/redash_supervisord -USER=redash - -# Exit if the package is not installed -[ -x "$DAEMON" ] || exit 0 - -# Read configuration variable file if it is present -[ -r /etc/default/$NAME ] && . /etc/default/$NAME - -# Load the VERBOSE setting and other rcS variables -. /lib/init/vars.sh - -# Define LSB log_* functions. -# Depend on lsb-base (>= 3.2-14) to ensure that this file is present -# and status_of_proc is working. -. /lib/lsb/init-functions - -# -# Function that starts the daemon/service -# -do_start() -{ - # Return - # 0 if daemon has been started - # 1 if daemon was already running - # 2 if daemon could not be started - start-stop-daemon --start --quiet --pidfile $PIDFILE --user $USER --chuid $USER --exec $DAEMON --test > /dev/null \ - || return 1 - start-stop-daemon --start --quiet --pidfile $PIDFILE --user $USER --chuid $USER --exec $DAEMON -- \ - $DAEMON_ARGS \ - || return 2 - # Add code here, if necessary, that waits for the process to be ready - # to handle requests from services started subsequently which depend - # on this one. As a last resort, sleep for some time. -} - -# -# Function that stops the daemon/service -# -do_stop() -{ - # Return - # 0 if daemon has been stopped - # 1 if daemon was already stopped - # 2 if daemon could not be stopped - # other if a failure occurred - start-stop-daemon --stop --quiet --retry=TERM/30/KILL/5 --pidfile $PIDFILE --user $USER --chuid $USER --name $NAME - RETVAL="$?" - [ "$RETVAL" = 2 ] && return 2 - # Wait for children to finish too if this is a daemon that forks - # and if the daemon is only ever run from this initscript. - # If the above conditions are not satisfied then add some other code - # that waits for the process to drop all resources that could be - # needed by services started subsequently. A last resort is to - # sleep for some time. - start-stop-daemon --stop --quiet --oknodo --retry=0/30/KILL/5 --user $USER --chuid $USER --exec $DAEMON - [ "$?" = 2 ] && return 2 - # Many daemons don't delete their pidfiles when they exit. - rm -f $PIDFILE - return "$RETVAL" -} - -case "$1" in - start) - [ "$VERBOSE" != no ] && log_daemon_msg "Starting $DESC" "$NAME" - do_start - case "$?" in - 0|1) [ "$VERBOSE" != no ] && log_end_msg 0 ;; - 2) [ "$VERBOSE" != no ] && log_end_msg 1 ;; - esac - ;; - stop) - [ "$VERBOSE" != no ] && log_daemon_msg "Stopping $DESC" "$NAME" - do_stop - case "$?" in - 0|1) [ "$VERBOSE" != no ] && log_end_msg 0 ;; - 2) [ "$VERBOSE" != no ] && log_end_msg 1 ;; - esac - ;; - status) - status_of_proc "$DAEMON" "$NAME" && exit 0 || exit $? - ;; - restart) - log_daemon_msg "Restarting $DESC" "$NAME" - do_stop - case "$?" in - 0|1) - do_start - case "$?" in - 0) log_end_msg 0 ;; - 1) log_end_msg 1 ;; # Old process is still running - *) log_end_msg 1 ;; # Failed to start - esac - ;; - *) - # Failed to stop - log_end_msg 1 - ;; - esac - ;; - *) - echo "Usage: $SCRIPTNAME {start|stop|status|restart}" >&2 - exit 3 - ;; -esac - -: diff --git a/setup/ubuntu/files/redis.conf b/setup/ubuntu/files/redis.conf deleted file mode 100644 index efe1244f..00000000 --- a/setup/ubuntu/files/redis.conf +++ /dev/null @@ -1,785 +0,0 @@ -## Generated by install_server.sh ## -# Redis configuration file example - -# Note on units: when memory size is needed, it is possible to specify -# it in the usual form of 1k 5GB 4M and so forth: -# -# 1k => 1000 bytes -# 1kb => 1024 bytes -# 1m => 1000000 bytes -# 1mb => 1024*1024 bytes -# 1g => 1000000000 bytes -# 1gb => 1024*1024*1024 bytes -# -# units are case insensitive so 1GB 1Gb 1gB are all the same. - -################################## INCLUDES ################################### - -# Include one or more other config files here. This is useful if you -# have a standard template that goes to all Redis server but also need -# to customize a few per-server settings. Include files can include -# other files, so use this wisely. -# -# Notice option "include" won't be rewritten by command "CONFIG REWRITE" -# from admin or Redis Sentinel. Since Redis always uses the last processed -# line as value of a configuration directive, you'd better put includes -# at the beginning of this file to avoid overwriting config change at runtime. -# -# If instead you are interested in using includes to override configuration -# options, it is better to use include as the last line. -# -# include /path/to/local.conf -# include /path/to/other.conf - -################################ GENERAL ##################################### - -# By default Redis does not run as a daemon. Use 'yes' if you need it. -# Note that Redis will write a pid file in /var/run/redis.pid when daemonized. -daemonize yes - -# When running daemonized, Redis writes a pid file in /var/run/redis.pid by -# default. You can specify a custom pid file location here. -pidfile /var/run/redis_6379.pid - -# Accept connections on the specified port, default is 6379. -# If port 0 is specified Redis will not listen on a TCP socket. -port 6379 - -# TCP listen() backlog. -# -# In high requests-per-second environments you need an high backlog in order -# to avoid slow clients connections issues. Note that the Linux kernel -# will silently truncate it to the value of /proc/sys/net/core/somaxconn so -# make sure to raise both the value of somaxconn and tcp_max_syn_backlog -# in order to get the desired effect. -tcp-backlog 511 - -# By default Redis listens for connections from all the network interfaces -# available on the server. It is possible to listen to just one or multiple -# interfaces using the "bind" configuration directive, followed by one or -# more IP addresses. -# -# Examples: -# -# bind 192.168.1.100 10.0.0.1 -bind 127.0.0.1 - -# Specify the path for the Unix socket that will be used to listen for -# incoming connections. There is no default, so Redis will not listen -# on a unix socket when not specified. -# -# unixsocket /tmp/redis.sock -# unixsocketperm 700 - -# Close the connection after a client is idle for N seconds (0 to disable) -timeout 0 - -# TCP keepalive. -# -# If non-zero, use SO_KEEPALIVE to send TCP ACKs to clients in absence -# of communication. This is useful for two reasons: -# -# 1) Detect dead peers. -# 2) Take the connection alive from the point of view of network -# equipment in the middle. -# -# On Linux, the specified value (in seconds) is the period used to send ACKs. -# Note that to close the connection the double of the time is needed. -# On other kernels the period depends on the kernel configuration. -# -# A reasonable value for this option is 60 seconds. -tcp-keepalive 0 - -# Specify the server verbosity level. -# This can be one of: -# debug (a lot of information, useful for development/testing) -# verbose (many rarely useful info, but not a mess like the debug level) -# notice (moderately verbose, what you want in production probably) -# warning (only very important / critical messages are logged) -loglevel notice - -# Specify the log file name. Also the empty string can be used to force -# Redis to log on the standard output. Note that if you use standard -# output for logging but daemonize, logs will be sent to /dev/null -logfile /var/log/redis_6379.log - -# To enable logging to the system logger, just set 'syslog-enabled' to yes, -# and optionally update the other syslog parameters to suit your needs. -# syslog-enabled no - -# Specify the syslog identity. -# syslog-ident redis - -# Specify the syslog facility. Must be USER or between LOCAL0-LOCAL7. -# syslog-facility local0 - -# Set the number of databases. The default database is DB 0, you can select -# a different one on a per-connection basis using SELECT where -# dbid is a number between 0 and 'databases'-1 -databases 16 - -################################ SNAPSHOTTING ################################ -# -# Save the DB on disk: -# -# save -# -# Will save the DB if both the given number of seconds and the given -# number of write operations against the DB occurred. -# -# In the example below the behaviour will be to save: -# after 900 sec (15 min) if at least 1 key changed -# after 300 sec (5 min) if at least 10 keys changed -# after 60 sec if at least 10000 keys changed -# -# Note: you can disable saving at all commenting all the "save" lines. -# -# It is also possible to remove all the previously configured save -# points by adding a save directive with a single empty string argument -# like in the following example: -# -# save "" - -save 900 1 -save 300 10 -save 60 10000 - -# By default Redis will stop accepting writes if RDB snapshots are enabled -# (at least one save point) and the latest background save failed. -# This will make the user aware (in a hard way) that data is not persisting -# on disk properly, otherwise chances are that no one will notice and some -# disaster will happen. -# -# If the background saving process will start working again Redis will -# automatically allow writes again. -# -# However if you have setup your proper monitoring of the Redis server -# and persistence, you may want to disable this feature so that Redis will -# continue to work as usual even if there are problems with disk, -# permissions, and so forth. -stop-writes-on-bgsave-error yes - -# Compress string objects using LZF when dump .rdb databases? -# For default that's set to 'yes' as it's almost always a win. -# If you want to save some CPU in the saving child set it to 'no' but -# the dataset will likely be bigger if you have compressible values or keys. -rdbcompression yes - -# Since version 5 of RDB a CRC64 checksum is placed at the end of the file. -# This makes the format more resistant to corruption but there is a performance -# hit to pay (around 10%) when saving and loading RDB files, so you can disable it -# for maximum performances. -# -# RDB files created with checksum disabled have a checksum of zero that will -# tell the loading code to skip the check. -rdbchecksum yes - -# The filename where to dump the DB -dbfilename dump.rdb - -# The working directory. -# -# The DB will be written inside this directory, with the filename specified -# above using the 'dbfilename' configuration directive. -# -# The Append Only File will also be created inside this directory. -# -# Note that you must specify a directory here, not a file name. -dir /var/lib/redis/6379 - -################################# REPLICATION ################################# - -# Master-Slave replication. Use slaveof to make a Redis instance a copy of -# another Redis server. A few things to understand ASAP about Redis replication. -# -# 1) Redis replication is asynchronous, but you can configure a master to -# stop accepting writes if it appears to be not connected with at least -# a given number of slaves. -# 2) Redis slaves are able to perform a partial resynchronization with the -# master if the replication link is lost for a relatively small amount of -# time. You may want to configure the replication backlog size (see the next -# sections of this file) with a sensible value depending on your needs. -# 3) Replication is automatic and does not need user intervention. After a -# network partition slaves automatically try to reconnect to masters -# and resynchronize with them. -# -# slaveof - -# If the master is password protected (using the "requirepass" configuration -# directive below) it is possible to tell the slave to authenticate before -# starting the replication synchronization process, otherwise the master will -# refuse the slave request. -# -# masterauth - -# When a slave loses its connection with the master, or when the replication -# is still in progress, the slave can act in two different ways: -# -# 1) if slave-serve-stale-data is set to 'yes' (the default) the slave will -# still reply to client requests, possibly with out of date data, or the -# data set may just be empty if this is the first synchronization. -# -# 2) if slave-serve-stale-data is set to 'no' the slave will reply with -# an error "SYNC with master in progress" to all the kind of commands -# but to INFO and SLAVEOF. -# -slave-serve-stale-data yes - -# You can configure a slave instance to accept writes or not. Writing against -# a slave instance may be useful to store some ephemeral data (because data -# written on a slave will be easily deleted after resync with the master) but -# may also cause problems if clients are writing to it because of a -# misconfiguration. -# -# Since Redis 2.6 by default slaves are read-only. -# -# Note: read only slaves are not designed to be exposed to untrusted clients -# on the internet. It's just a protection layer against misuse of the instance. -# Still a read only slave exports by default all the administrative commands -# such as CONFIG, DEBUG, and so forth. To a limited extent you can improve -# security of read only slaves using 'rename-command' to shadow all the -# administrative / dangerous commands. -slave-read-only yes - -# Slaves send PINGs to server in a predefined interval. It's possible to change -# this interval with the repl_ping_slave_period option. The default value is 10 -# seconds. -# -# repl-ping-slave-period 10 - -# The following option sets the replication timeout for: -# -# 1) Bulk transfer I/O during SYNC, from the point of view of slave. -# 2) Master timeout from the point of view of slaves (data, pings). -# 3) Slave timeout from the point of view of masters (REPLCONF ACK pings). -# -# It is important to make sure that this value is greater than the value -# specified for repl-ping-slave-period otherwise a timeout will be detected -# every time there is low traffic between the master and the slave. -# -# repl-timeout 60 - -# Disable TCP_NODELAY on the slave socket after SYNC? -# -# If you select "yes" Redis will use a smaller number of TCP packets and -# less bandwidth to send data to slaves. But this can add a delay for -# the data to appear on the slave side, up to 40 milliseconds with -# Linux kernels using a default configuration. -# -# If you select "no" the delay for data to appear on the slave side will -# be reduced but more bandwidth will be used for replication. -# -# By default we optimize for low latency, but in very high traffic conditions -# or when the master and slaves are many hops away, turning this to "yes" may -# be a good idea. -repl-disable-tcp-nodelay no - -# Set the replication backlog size. The backlog is a buffer that accumulates -# slave data when slaves are disconnected for some time, so that when a slave -# wants to reconnect again, often a full resync is not needed, but a partial -# resync is enough, just passing the portion of data the slave missed while -# disconnected. -# -# The biggest the replication backlog, the longer the time the slave can be -# disconnected and later be able to perform a partial resynchronization. -# -# The backlog is only allocated once there is at least a slave connected. -# -# repl-backlog-size 1mb - -# After a master has no longer connected slaves for some time, the backlog -# will be freed. The following option configures the amount of seconds that -# need to elapse, starting from the time the last slave disconnected, for -# the backlog buffer to be freed. -# -# A value of 0 means to never release the backlog. -# -# repl-backlog-ttl 3600 - -# The slave priority is an integer number published by Redis in the INFO output. -# It is used by Redis Sentinel in order to select a slave to promote into a -# master if the master is no longer working correctly. -# -# A slave with a low priority number is considered better for promotion, so -# for instance if there are three slaves with priority 10, 100, 25 Sentinel will -# pick the one with priority 10, that is the lowest. -# -# However a special priority of 0 marks the slave as not able to perform the -# role of master, so a slave with priority of 0 will never be selected by -# Redis Sentinel for promotion. -# -# By default the priority is 100. -slave-priority 100 - -# It is possible for a master to stop accepting writes if there are less than -# N slaves connected, having a lag less or equal than M seconds. -# -# The N slaves need to be in "online" state. -# -# The lag in seconds, that must be <= the specified value, is calculated from -# the last ping received from the slave, that is usually sent every second. -# -# This option does not GUARANTEES that N replicas will accept the write, but -# will limit the window of exposure for lost writes in case not enough slaves -# are available, to the specified number of seconds. -# -# For example to require at least 3 slaves with a lag <= 10 seconds use: -# -# min-slaves-to-write 3 -# min-slaves-max-lag 10 -# -# Setting one or the other to 0 disables the feature. -# -# By default min-slaves-to-write is set to 0 (feature disabled) and -# min-slaves-max-lag is set to 10. - -################################## SECURITY ################################### - -# Require clients to issue AUTH before processing any other -# commands. This might be useful in environments in which you do not trust -# others with access to the host running redis-server. -# -# This should stay commented out for backward compatibility and because most -# people do not need auth (e.g. they run their own servers). -# -# Warning: since Redis is pretty fast an outside user can try up to -# 150k passwords per second against a good box. This means that you should -# use a very strong password otherwise it will be very easy to break. -# -# requirepass foobared - -# Command renaming. -# -# It is possible to change the name of dangerous commands in a shared -# environment. For instance the CONFIG command may be renamed into something -# hard to guess so that it will still be available for internal-use tools -# but not available for general clients. -# -# Example: -# -# rename-command CONFIG b840fc02d524045429941cc15f59e41cb7be6c52 -# -# It is also possible to completely kill a command by renaming it into -# an empty string: -# -# rename-command CONFIG "" -# -# Please note that changing the name of commands that are logged into the -# AOF file or transmitted to slaves may cause problems. - -################################### LIMITS #################################### - -# Set the max number of connected clients at the same time. By default -# this limit is set to 10000 clients, however if the Redis server is not -# able to configure the process file limit to allow for the specified limit -# the max number of allowed clients is set to the current file limit -# minus 32 (as Redis reserves a few file descriptors for internal uses). -# -# Once the limit is reached Redis will close all the new connections sending -# an error 'max number of clients reached'. -# -# maxclients 10000 - -# Don't use more memory than the specified amount of bytes. -# When the memory limit is reached Redis will try to remove keys -# according to the eviction policy selected (see maxmemory-policy). -# -# If Redis can't remove keys according to the policy, or if the policy is -# set to 'noeviction', Redis will start to reply with errors to commands -# that would use more memory, like SET, LPUSH, and so on, and will continue -# to reply to read-only commands like GET. -# -# This option is usually useful when using Redis as an LRU cache, or to set -# a hard memory limit for an instance (using the 'noeviction' policy). -# -# WARNING: If you have slaves attached to an instance with maxmemory on, -# the size of the output buffers needed to feed the slaves are subtracted -# from the used memory count, so that network problems / resyncs will -# not trigger a loop where keys are evicted, and in turn the output -# buffer of slaves is full with DELs of keys evicted triggering the deletion -# of more keys, and so forth until the database is completely emptied. -# -# In short... if you have slaves attached it is suggested that you set a lower -# limit for maxmemory so that there is some free RAM on the system for slave -# output buffers (but this is not needed if the policy is 'noeviction'). -# -# maxmemory - -# MAXMEMORY POLICY: how Redis will select what to remove when maxmemory -# is reached. You can select among five behaviors: -# -# volatile-lru -> remove the key with an expire set using an LRU algorithm -# allkeys-lru -> remove any key accordingly to the LRU algorithm -# volatile-random -> remove a random key with an expire set -# allkeys-random -> remove a random key, any key -# volatile-ttl -> remove the key with the nearest expire time (minor TTL) -# noeviction -> don't expire at all, just return an error on write operations -# -# Note: with any of the above policies, Redis will return an error on write -# operations, when there are not suitable keys for eviction. -# -# At the date of writing this commands are: set setnx setex append -# incr decr rpush lpush rpushx lpushx linsert lset rpoplpush sadd -# sinter sinterstore sunion sunionstore sdiff sdiffstore zadd zincrby -# zunionstore zinterstore hset hsetnx hmset hincrby incrby decrby -# getset mset msetnx exec sort -# -# The default is: -# -# maxmemory-policy volatile-lru - -# LRU and minimal TTL algorithms are not precise algorithms but approximated -# algorithms (in order to save memory), so you can select as well the sample -# size to check. For instance for default Redis will check three keys and -# pick the one that was used less recently, you can change the sample size -# using the following configuration directive. -# -# maxmemory-samples 3 - -############################## APPEND ONLY MODE ############################### - -# By default Redis asynchronously dumps the dataset on disk. This mode is -# good enough in many applications, but an issue with the Redis process or -# a power outage may result into a few minutes of writes lost (depending on -# the configured save points). -# -# The Append Only File is an alternative persistence mode that provides -# much better durability. For instance using the default data fsync policy -# (see later in the config file) Redis can lose just one second of writes in a -# dramatic event like a server power outage, or a single write if something -# wrong with the Redis process itself happens, but the operating system is -# still running correctly. -# -# AOF and RDB persistence can be enabled at the same time without problems. -# If the AOF is enabled on startup Redis will load the AOF, that is the file -# with the better durability guarantees. -# -# Please check http://redis.io/topics/persistence for more information. - -appendonly no - -# The name of the append only file (default: "appendonly.aof") - -appendfilename "appendonly.aof" - -# The fsync() call tells the Operating System to actually write data on disk -# instead to wait for more data in the output buffer. Some OS will really flush -# data on disk, some other OS will just try to do it ASAP. -# -# Redis supports three different modes: -# -# no: don't fsync, just let the OS flush the data when it wants. Faster. -# always: fsync after every write to the append only log . Slow, Safest. -# everysec: fsync only one time every second. Compromise. -# -# The default is "everysec", as that's usually the right compromise between -# speed and data safety. It's up to you to understand if you can relax this to -# "no" that will let the operating system flush the output buffer when -# it wants, for better performances (but if you can live with the idea of -# some data loss consider the default persistence mode that's snapshotting), -# or on the contrary, use "always" that's very slow but a bit safer than -# everysec. -# -# More details please check the following article: -# http://antirez.com/post/redis-persistence-demystified.html -# -# If unsure, use "everysec". - -# appendfsync always -appendfsync everysec -# appendfsync no - -# When the AOF fsync policy is set to always or everysec, and a background -# saving process (a background save or AOF log background rewriting) is -# performing a lot of I/O against the disk, in some Linux configurations -# Redis may block too long on the fsync() call. Note that there is no fix for -# this currently, as even performing fsync in a different thread will block -# our synchronous write(2) call. -# -# In order to mitigate this problem it's possible to use the following option -# that will prevent fsync() from being called in the main process while a -# BGSAVE or BGREWRITEAOF is in progress. -# -# This means that while another child is saving, the durability of Redis is -# the same as "appendfsync none". In practical terms, this means that it is -# possible to lose up to 30 seconds of log in the worst scenario (with the -# default Linux settings). -# -# If you have latency problems turn this to "yes". Otherwise leave it as -# "no" that is the safest pick from the point of view of durability. - -no-appendfsync-on-rewrite no - -# Automatic rewrite of the append only file. -# Redis is able to automatically rewrite the log file implicitly calling -# BGREWRITEAOF when the AOF log size grows by the specified percentage. -# -# This is how it works: Redis remembers the size of the AOF file after the -# latest rewrite (if no rewrite has happened since the restart, the size of -# the AOF at startup is used). -# -# This base size is compared to the current size. If the current size is -# bigger than the specified percentage, the rewrite is triggered. Also -# you need to specify a minimal size for the AOF file to be rewritten, this -# is useful to avoid rewriting the AOF file even if the percentage increase -# is reached but it is still pretty small. -# -# Specify a percentage of zero in order to disable the automatic AOF -# rewrite feature. - -auto-aof-rewrite-percentage 100 -auto-aof-rewrite-min-size 64mb - -# An AOF file may be found to be truncated at the end during the Redis -# startup process, when the AOF data gets loaded back into memory. -# This may happen when the system where Redis is running -# crashes, especially when an ext4 filesystem is mounted without the -# data=ordered option (however this can't happen when Redis itself -# crashes or aborts but the operating system still works correctly). -# -# Redis can either exit with an error when this happens, or load as much -# data as possible (the default now) and start if the AOF file is found -# to be truncated at the end. The following option controls this behavior. -# -# If aof-load-truncated is set to yes, a truncated AOF file is loaded and -# the Redis server starts emitting a log to inform the user of the event. -# Otherwise if the option is set to no, the server aborts with an error -# and refuses to start. When the option is set to no, the user requires -# to fix the AOF file using the "redis-check-aof" utility before to restart -# the server. -# -# Note that if the AOF file will be found to be corrupted in the middle -# the server will still exit with an error. This option only applies when -# Redis will try to read more data from the AOF file but not enough bytes -# will be found. -aof-load-truncated yes - -################################ LUA SCRIPTING ############################### - -# Max execution time of a Lua script in milliseconds. -# -# If the maximum execution time is reached Redis will log that a script is -# still in execution after the maximum allowed time and will start to -# reply to queries with an error. -# -# When a long running script exceed the maximum execution time only the -# SCRIPT KILL and SHUTDOWN NOSAVE commands are available. The first can be -# used to stop a script that did not yet called write commands. The second -# is the only way to shut down the server in the case a write commands was -# already issue by the script but the user don't want to wait for the natural -# termination of the script. -# -# Set it to 0 or a negative value for unlimited execution without warnings. -lua-time-limit 5000 - -################################## SLOW LOG ################################### - -# The Redis Slow Log is a system to log queries that exceeded a specified -# execution time. The execution time does not include the I/O operations -# like talking with the client, sending the reply and so forth, -# but just the time needed to actually execute the command (this is the only -# stage of command execution where the thread is blocked and can not serve -# other requests in the meantime). -# -# You can configure the slow log with two parameters: one tells Redis -# what is the execution time, in microseconds, to exceed in order for the -# command to get logged, and the other parameter is the length of the -# slow log. When a new command is logged the oldest one is removed from the -# queue of logged commands. - -# The following time is expressed in microseconds, so 1000000 is equivalent -# to one second. Note that a negative number disables the slow log, while -# a value of zero forces the logging of every command. -slowlog-log-slower-than 10000 - -# There is no limit to this length. Just be aware that it will consume memory. -# You can reclaim memory used by the slow log with SLOWLOG RESET. -slowlog-max-len 128 - -################################ LATENCY MONITOR ############################## - -# The Redis latency monitoring subsystem samples different operations -# at runtime in order to collect data related to possible sources of -# latency of a Redis instance. -# -# Via the LATENCY command this information is available to the user that can -# print graphs and obtain reports. -# -# The system only logs operations that were performed in a time equal or -# greater than the amount of milliseconds specified via the -# latency-monitor-threshold configuration directive. When its value is set -# to zero, the latency monitor is turned off. -# -# By default latency monitoring is disabled since it is mostly not needed -# if you don't have latency issues, and collecting data has a performance -# impact, that while very small, can be measured under big load. Latency -# monitoring can easily be enalbed at runtime using the command -# "CONFIG SET latency-monitor-threshold " if needed. -latency-monitor-threshold 0 - -############################# Event notification ############################## - -# Redis can notify Pub/Sub clients about events happening in the key space. -# This feature is documented at http://redis.io/topics/notifications -# -# For instance if keyspace events notification is enabled, and a client -# performs a DEL operation on key "foo" stored in the Database 0, two -# messages will be published via Pub/Sub: -# -# PUBLISH __keyspace@0__:foo del -# PUBLISH __keyevent@0__:del foo -# -# It is possible to select the events that Redis will notify among a set -# of classes. Every class is identified by a single character: -# -# K Keyspace events, published with __keyspace@__ prefix. -# E Keyevent events, published with __keyevent@__ prefix. -# g Generic commands (non-type specific) like DEL, EXPIRE, RENAME, ... -# $ String commands -# l List commands -# s Set commands -# h Hash commands -# z Sorted set commands -# x Expired events (events generated every time a key expires) -# e Evicted events (events generated when a key is evicted for maxmemory) -# A Alias for g$lshzxe, so that the "AKE" string means all the events. -# -# The "notify-keyspace-events" takes as argument a string that is composed -# by zero or multiple characters. The empty string means that notifications -# are disabled at all. -# -# Example: to enable list and generic events, from the point of view of the -# event name, use: -# -# notify-keyspace-events Elg -# -# Example 2: to get the stream of the expired keys subscribing to channel -# name __keyevent@0__:expired use: -# -# notify-keyspace-events Ex -# -# By default all notifications are disabled because most users don't need -# this feature and the feature has some overhead. Note that if you don't -# specify at least one of K or E, no events will be delivered. -notify-keyspace-events "" - -############################### ADVANCED CONFIG ############################### - -# Hashes are encoded using a memory efficient data structure when they have a -# small number of entries, and the biggest entry does not exceed a given -# threshold. These thresholds can be configured using the following directives. -hash-max-ziplist-entries 512 -hash-max-ziplist-value 64 - -# Similarly to hashes, small lists are also encoded in a special way in order -# to save a lot of space. The special representation is only used when -# you are under the following limits: -list-max-ziplist-entries 512 -list-max-ziplist-value 64 - -# Sets have a special encoding in just one case: when a set is composed -# of just strings that happens to be integers in radix 10 in the range -# of 64 bit signed integers. -# The following configuration setting sets the limit in the size of the -# set in order to use this special memory saving encoding. -set-max-intset-entries 512 - -# Similarly to hashes and lists, sorted sets are also specially encoded in -# order to save a lot of space. This encoding is only used when the length and -# elements of a sorted set are below the following limits: -zset-max-ziplist-entries 128 -zset-max-ziplist-value 64 - -# HyperLogLog sparse representation bytes limit. The limit includes the -# 16 bytes header. When an HyperLogLog using the sparse representation crosses -# this limit, it is converted into the dense representation. -# -# A value greater than 16000 is totally useless, since at that point the -# dense representation is more memory efficient. -# -# The suggested value is ~ 3000 in order to have the benefits of -# the space efficient encoding without slowing down too much PFADD, -# which is O(N) with the sparse encoding. The value can be raised to -# ~ 10000 when CPU is not a concern, but space is, and the data set is -# composed of many HyperLogLogs with cardinality in the 0 - 15000 range. -hll-sparse-max-bytes 3000 - -# Active rehashing uses 1 millisecond every 100 milliseconds of CPU time in -# order to help rehashing the main Redis hash table (the one mapping top-level -# keys to values). The hash table implementation Redis uses (see dict.c) -# performs a lazy rehashing: the more operation you run into a hash table -# that is rehashing, the more rehashing "steps" are performed, so if the -# server is idle the rehashing is never complete and some more memory is used -# by the hash table. -# -# The default is to use this millisecond 10 times every second in order to -# active rehashing the main dictionaries, freeing memory when possible. -# -# If unsure: -# use "activerehashing no" if you have hard latency requirements and it is -# not a good thing in your environment that Redis can reply form time to time -# to queries with 2 milliseconds delay. -# -# use "activerehashing yes" if you don't have such hard requirements but -# want to free memory asap when possible. -activerehashing yes - -# The client output buffer limits can be used to force disconnection of clients -# that are not reading data from the server fast enough for some reason (a -# common reason is that a Pub/Sub client can't consume messages as fast as the -# publisher can produce them). -# -# The limit can be set differently for the three different classes of clients: -# -# normal -> normal clients including MONITOR clients -# slave -> slave clients -# pubsub -> clients subscribed to at least one pubsub channel or pattern -# -# The syntax of every client-output-buffer-limit directive is the following: -# -# client-output-buffer-limit -# -# A client is immediately disconnected once the hard limit is reached, or if -# the soft limit is reached and remains reached for the specified number of -# seconds (continuously). -# So for instance if the hard limit is 32 megabytes and the soft limit is -# 16 megabytes / 10 seconds, the client will get disconnected immediately -# if the size of the output buffers reach 32 megabytes, but will also get -# disconnected if the client reaches 16 megabytes and continuously overcomes -# the limit for 10 seconds. -# -# By default normal clients are not limited because they don't receive data -# without asking (in a push way), but just after a request, so only -# asynchronous clients may create a scenario where data is requested faster -# than it can read. -# -# Instead there is a default limit for pubsub and slave clients, since -# subscribers and slaves receive data in a push fashion. -# -# Both the hard or the soft limit can be disabled by setting them to zero. -client-output-buffer-limit normal 0 0 0 -client-output-buffer-limit slave 256mb 64mb 60 -client-output-buffer-limit pubsub 32mb 8mb 60 - -# Redis calls an internal function to perform many background tasks, like -# closing connections of clients in timeout, purging expired keys that are -# never requested, and so forth. -# -# Not all tasks are performed with the same frequency, but Redis checks for -# tasks to perform accordingly to the specified "hz" value. -# -# By default "hz" is set to 10. Raising the value will use more CPU when -# Redis is idle, but at the same time will make Redis more responsive when -# there are many keys expiring at the same time, and timeouts may be -# handled with more precision. -# -# The range is between 1 and 500, however a value over 100 is usually not -# a good idea. Most users should use the default of 10 and raise this up to -# 100 only in environments where very low latency is required. -hz 10 - -# When a child rewrites the AOF file, if the following option is enabled -# the file will be fsync-ed every 32 MB of data generated. This is useful -# in order to commit the file to the disk more incrementally and avoid -# big latency spikes. -aof-rewrite-incremental-fsync yes diff --git a/setup/ubuntu/files/redis_init b/setup/ubuntu/files/redis_init deleted file mode 100644 index e20d856a..00000000 --- a/setup/ubuntu/files/redis_init +++ /dev/null @@ -1,66 +0,0 @@ -#!/bin/sh - -EXEC=/usr/local/bin/redis-server -CLIEXEC=/usr/local/bin/redis-cli -PIDFILE=/var/run/redis_6379.pid -CONF="/etc/redis/6379.conf" -REDISPORT="6379" -############### -# SysV Init Information -# chkconfig: - 58 74 -# description: redis_6379 is the redis daemon. -### BEGIN INIT INFO -# Provides: redis_6379 -# Required-Start: $network $local_fs $remote_fs -# Required-Stop: $network $local_fs $remote_fs -# Default-Start: 2 3 4 5 -# Default-Stop: 0 1 6 -# Should-Start: $syslog $named -# Should-Stop: $syslog $named -# Short-Description: start and stop redis_6379 -# Description: Redis daemon -### END INIT INFO - - -case "$1" in - start) - if [ -f $PIDFILE ] - then - echo "$PIDFILE exists, process is already running or crashed" - else - echo "Starting Redis server..." - $EXEC $CONF - fi - ;; - stop) - if [ ! -f $PIDFILE ] - then - echo "$PIDFILE does not exist, process is not running" - else - PID=$(cat $PIDFILE) - echo "Stopping ..." - $CLIEXEC -p $REDISPORT shutdown - while [ -x /proc/${PID} ] - do - echo "Waiting for Redis to shutdown ..." - sleep 1 - done - echo "Redis stopped" - fi - ;; - status) - if [ ! -f $PIDFILE ] - then - echo 'Redis is not running' - else - echo "Redis is running ($(<$PIDFILE))" - fi - ;; - restart) - $0 stop - $0 start - ;; - *) - echo "Please use start, stop, restart or status as first argument" - ;; -esac From 1db4157b29c2a109b308863cf76fbea7d9695c54 Mon Sep 17 00:00:00 2001 From: Arik Fraimovich Date: Mon, 3 Apr 2017 12:54:17 +0300 Subject: [PATCH 080/112] Fix bootstrap script to be headless --- setup/ubuntu/bootstrap.sh | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/setup/ubuntu/bootstrap.sh b/setup/ubuntu/bootstrap.sh index 643e656c..55d4d8cb 100644 --- a/setup/ubuntu/bootstrap.sh +++ b/setup/ubuntu/bootstrap.sh @@ -17,6 +17,8 @@ VERSION_DIR="/opt/redash/redash.${REDASH_VERSION}" REDASH_TARBALL=/tmp/redash.tar.gz FILES_BASE_URL=https://raw.githubusercontent.com/getredash/redash/${REDASH_BRANCH}/setup/ubuntu/files +cd /tmp/ + verify_root() { # Verify running as root: if [ "$(id -u)" != "0" ]; then @@ -43,8 +45,8 @@ install_system_packages() { # SAML dependency apt install -y xmlsec1 # Storage servers - apt install postgresql redis-server - apt install supervisor + apt install -y postgresql redis-server + apt install -y supervisor } create_directories() { @@ -57,7 +59,7 @@ create_directories() { fi COOKIE_SECRET=$(pwgen -1s 32) - echo "export REDASH_COOKIE_SECRET=$COOKIE_SECRET" > /opt/redash/.env + echo "export REDASH_COOKIE_SECRET=$COOKIE_SECRET" >> /opt/redash/.env } extract_redash_sources() { @@ -70,10 +72,8 @@ extract_redash_sources() { install_python_packages() { pip install --upgrade pip - # pip install -U setuptools==23.1.0 # TODO: venv? - # setproctitle is used by Celery for "pretty" process titles - pip install setproctitle + pip install setproctitle # setproctitle is used by Celery for "pretty" process titles pip install -r /opt/redash/current/requirements.txt pip install -r /opt/redash/current/requirements_all_ds.txt } From 15b228b754573bfaba837053044fafc2661e8e96 Mon Sep 17 00:00:00 2001 From: Arik Fraimovich Date: Mon, 3 Apr 2017 12:54:23 +0300 Subject: [PATCH 081/112] Update README --- setup/amazon_linux/README.md | 3 +++ setup/ubuntu/README.md | 2 +- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/setup/amazon_linux/README.md b/setup/amazon_linux/README.md index d30254ea..6d7f2cb7 100644 --- a/setup/amazon_linux/README.md +++ b/setup/amazon_linux/README.md @@ -1 +1,4 @@ +# DEPRECATED +(left for reference purposes only) + Bootstrap script for Amazon Linux AMI. *Not supported*, we recommend to use the Docker images instead. diff --git a/setup/ubuntu/README.md b/setup/ubuntu/README.md index 63b648e4..c3795b84 100644 --- a/setup/ubuntu/README.md +++ b/setup/ubuntu/README.md @@ -1 +1 @@ -Bootstrap scripts for Ubuntu (tested on Ubuntu 14.04, although should work with 12.04). +Bootstrap scripts for Ubuntu 16.04. From 842569858384cd1252388c276294b08481e40234 Mon Sep 17 00:00:00 2001 From: Arik Fraimovich Date: Mon, 3 Apr 2017 13:18:34 +0300 Subject: [PATCH 082/112] Update env --- setup/ubuntu/files/env | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup/ubuntu/files/env b/setup/ubuntu/files/env index ff45a709..e1c2e86d 100644 --- a/setup/ubuntu/files/env +++ b/setup/ubuntu/files/env @@ -1,3 +1,3 @@ export REDASH_LOG_LEVEL="INFO" export REDASH_REDIS_URL=redis://localhost:6379/0 -export REDASH_DATABASE_URL="postgresql://redash" +export REDASH_DATABASE_URL="postgresql:///redash" From f66fe5ff80ddc72c4af0adcfeda841786006b37e Mon Sep 17 00:00:00 2001 From: Arik Fraimovich Date: Mon, 3 Apr 2017 18:07:19 +0300 Subject: [PATCH 083/112] Update packer configuration to create GCE image --- setup/packer.json | 32 ++++++++++++++++++++++++++++---- 1 file changed, 28 insertions(+), 4 deletions(-) diff --git a/setup/packer.json b/setup/packer.json index 27693ff5..d145ed77 100644 --- a/setup/packer.json +++ b/setup/packer.json @@ -7,18 +7,32 @@ }, "builders": [ { - "name": "redash-eu-west-1", + "name": "redash-us-east-1", "type": "amazon-ebs", "access_key": "{{user `aws_access_key`}}", "secret_key": "{{user `aws_secret_key`}}", - "region": "eu-west-1", - "source_ami": "ami-6177f712", + "region": "us-east-1", + "source_ami": "ami-4dd2575b", "instance_type": "t2.micro", "ssh_username": "ubuntu", - "ami_name": "redash-{{user `image_version`}}-eu-west-1" + "ami_name": "redash-{{user `image_version`}}-us-east-1" + }, + { + "type": "googlecompute", + "account_file": "account.json", + "project_id": "redash-bird-123", + "source_image_family": "ubuntu-1604-lts", + "zone": "us-central1-a", + "ssh_username": "arik" } ], "provisioners": [ + { + "type": "shell", + "inline": [ + "sleep 30" + ] + }, { "type": "shell", "script": "ubuntu/bootstrap.sh", @@ -33,5 +47,15 @@ "type": "shell", "inline": "sudo rm /home/ubuntu/.ssh/authorized_keys || true" } + ], + "post-processors": [ + { + "type": "googlecompute-export", + "only": ["googlecompute"], + "paths": [ + "gs://redash-images/redash.{{user `redash_version`}}.tar.gz" + ], + "keep_input_artifact": true + } ] } From 81063731c942b2d81c4f93e77474a8fdd95c7730 Mon Sep 17 00:00:00 2001 From: Arik Fraimovich Date: Mon, 3 Apr 2017 18:28:46 +0300 Subject: [PATCH 084/112] Update docker-compose configuration: * Use newer versions of Redis & PostgreSQL * Use image for production docker-compose. --- docker-compose.production.yml | 8 ++++---- docker-compose.yml | 4 ++-- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/docker-compose.production.yml b/docker-compose.production.yml index fee1751f..665fa978 100644 --- a/docker-compose.production.yml +++ b/docker-compose.production.yml @@ -7,7 +7,7 @@ version: '2' services: server: - build: . + image: redash/redash:latest command: server depends_on: - postgres @@ -21,7 +21,7 @@ services: REDASH_DATABASE_URL: "postgresql://postgres@postgres/postgres" REDASH_COOKIE_SECRET: veryverysecret worker: - build: . + image: redash/redash:latest command: scheduler environment: PYTHONUNBUFFERED: 0 @@ -31,9 +31,9 @@ services: QUEUES: "queries,scheduled_queries,celery" WORKERS_COUNT: 2 redis: - image: redis:2.8 + image: redis:3.0-alpine postgres: - image: postgres:9.3 + image: postgres:9.5.6-alpine # volumes: # - /opt/postgres-data:/var/lib/postgresql/data nginx: diff --git a/docker-compose.yml b/docker-compose.yml index ccda9f59..4227bc92 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -32,9 +32,9 @@ services: QUEUES: "queries,scheduled_queries,celery" WORKERS_COUNT: 2 redis: - image: redis:2.8 + image: redis:3.0-alpine postgres: - image: postgres:9.3 + image: postgres:9.5.6-alpine # The following turns the DB into less durable, but gains significant performance improvements for the tests run (x3 # improvement on my personal machine). We should consider moving this into a dedicated Docker Compose configuration for # tests. From 91396f0c52a7fb4e55c3303f1bedb698e6d21d48 Mon Sep 17 00:00:00 2001 From: devneko Date: Wed, 5 Apr 2017 16:11:17 +0900 Subject: [PATCH 085/112] Add: maximumBillingTier for BigQuery --- redash/query_runner/big_query.py | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/redash/query_runner/big_query.py b/redash/query_runner/big_query.py index 0be4597b..e3d7793c 100644 --- a/redash/query_runner/big_query.py +++ b/redash/query_runner/big_query.py @@ -113,6 +113,10 @@ class BigQuery(BaseQueryRunner): 'loadSchema': { "type": "boolean", "title": "Load Schema" + }, + 'maximumBillingTier': { + "type": "number", + "title": "Maximum Billing Tier" } }, 'required': ['jsonKeyFile', 'projectId'], @@ -174,6 +178,9 @@ class BigQuery(BaseQueryRunner): job_data["configuration"]["query"]["userDefinedFunctionResources"] = map( lambda resource_uri: {"resourceUri": resource_uri}, resource_uris) + if "maximumBillingTier" in self.configuration: + job_data["configuration"]["query"]["maximumBillingTier"] = self.configuration["maximumBillingTier"] + insert_response = jobs.insert(projectId=project_id, body=job_data).execute() current_row = 0 query_reply = _get_query_results(jobs, project_id=project_id, From e1c186bbf8f6efabbcddc9bc0d07df2bd651aa68 Mon Sep 17 00:00:00 2001 From: Arik Fraimovich Date: Wed, 5 Apr 2017 12:38:21 +0300 Subject: [PATCH 086/112] Fix: embeds were not rendering in PhantomJS. Include polyfill for missing ArrayView functions. Closes #1708. --- client/app/assets/css/redash.css | 5 +++++ client/app/index.js | 3 +++ client/app/pages/queries/visualization-embed.html | 2 +- package.json | 1 + 4 files changed, 10 insertions(+), 1 deletion(-) diff --git a/client/app/assets/css/redash.css b/client/app/assets/css/redash.css index 2cc512b8..3ddd463a 100644 --- a/client/app/assets/css/redash.css +++ b/client/app/assets/css/redash.css @@ -4,12 +4,17 @@ body { body.headless { padding-top: 0px; + padding-bottom: 0px; } body.headless nav.app-header { display: none; } +body.headless div#footer { + display: none; +} + a[ng-click] { cursor: pointer; } diff --git a/client/app/index.js b/client/app/index.js index 30ecbdc4..52071912 100644 --- a/client/app/index.js +++ b/client/app/index.js @@ -1,3 +1,6 @@ +// This polyfill is needed to support PhantomJS which we use to generate PNGs from embeds. +import 'core-js/fn/typed/array-buffer'; + import 'material-design-iconic-font/dist/css/material-design-iconic-font.css'; import 'font-awesome/css/font-awesome.css'; import 'ui-select/dist/select.css'; diff --git a/client/app/pages/queries/visualization-embed.html b/client/app/pages/queries/visualization-embed.html index 59300baa..d7838ca5 100644 --- a/client/app/pages/queries/visualization-embed.html +++ b/client/app/pages/queries/visualization-embed.html @@ -2,7 +2,7 @@

- + {{$ctrl.query.name}}

diff --git a/package.json b/package.json index d5e17fca..69cf7167 100644 --- a/package.json +++ b/package.json @@ -33,6 +33,7 @@ "angular-ui-bootstrap": "^2.2.0", "angular-vs-repeat": "^1.1.7", "brace": "^0.9.0", + "core-js": "https://registry.npmjs.org/core-js/-/core-js-2.4.1.tgz", "cornelius": "git+https://github.com/restorando/cornelius.git", "d3": "^3.5.17", "d3-cloud": "^1.2.1", From 08505a2208de755e708f7f968b939a5624d81f9a Mon Sep 17 00:00:00 2001 From: Arik Fraimovich Date: Wed, 5 Apr 2017 12:40:56 +0300 Subject: [PATCH 087/112] Add changelog entry --- CHANGELOG.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index ec2f240d..befb9592 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,11 @@ # Change Log +## UNRELEASED + +### Fixed + +- Fix: chart embeds were not rendering in PhantomJS. + ## v1.0.1 - 2017-04-02 ### Added From ac557fd5b5188da86b8ddd2ee629163be63a8a0a Mon Sep 17 00:00:00 2001 From: deecay Date: Fri, 7 Apr 2017 15:17:59 +0900 Subject: [PATCH 088/112] Change: Box plot library from d3 to Plotly --- .../visualizations/chart/chart-editor.html | 14 +++++++++ client/app/visualizations/chart/index.js | 1 + client/app/visualizations/chart/plotly.js | 30 ++++++++++++++++++- 3 files changed, 44 insertions(+), 1 deletion(-) diff --git a/client/app/visualizations/chart/chart-editor.html b/client/app/visualizations/chart/chart-editor.html index 253b47cd..80b23a88 100644 --- a/client/app/visualizations/chart/chart-editor.html +++ b/client/app/visualizations/chart/chart-editor.html @@ -103,6 +103,13 @@

+
+ +
+
@@ -116,6 +123,13 @@
+ +
+ +
diff --git a/client/app/visualizations/chart/index.js b/client/app/visualizations/chart/index.js index 2d131335..b9f93b90 100644 --- a/client/app/visualizations/chart/index.js +++ b/client/app/visualizations/chart/index.js @@ -69,6 +69,7 @@ function ChartEditor(ColorPalette, clientConfig) { pie: { name: 'Pie', icon: 'pie-chart' }, scatter: { name: 'Scatter', icon: 'circle-o' }, bubble: { name: 'Bubble', icon: 'circle-o' }, + box: { name: 'Box', icon: 'square-o' }, }; if (clientConfig.allowCustomJSVisualizations) { diff --git a/client/app/visualizations/chart/plotly.js b/client/app/visualizations/chart/plotly.js index 5d1cdf11..6349d890 100644 --- a/client/app/visualizations/chart/plotly.js +++ b/client/app/visualizations/chart/plotly.js @@ -4,10 +4,11 @@ import Plotly from 'plotly.js/lib/core'; import bar from 'plotly.js/lib/bar'; import pie from 'plotly.js/lib/pie'; import histogram from 'plotly.js/lib/histogram'; +import box from 'plotly.js/lib/box'; import moment from 'moment'; -Plotly.register([bar, pie, histogram]); +Plotly.register([bar, pie, histogram, box]); Plotly.setPlotConfig({ modeBarButtonsToRemove: ['sendDataToCloud'], }); @@ -197,6 +198,9 @@ const PlotlyChart = () => { link(scope, element) { function calculateHeight() { const height = Math.max(scope.height, (scope.height - 50) + bottomMargin); + if (scope.options.globalSeriesType === 'box') { + return scope.options.height || height; + } return height; } @@ -213,6 +217,9 @@ const PlotlyChart = () => { series.mode = 'markers'; } else if (type === 'bubble') { series.mode = 'markers'; + } else if (type === 'box') { + series.type = 'box'; + series.mode = 'markers'; } } @@ -273,6 +280,11 @@ const PlotlyChart = () => { return; } + if (scope.options.globalSeriesType === 'box') { + scope.layout.boxmode = 'group'; + scope.layout.boxgroupgap = 0.50; + } + let hasY2 = false; const sortX = scope.options.sortX === true || scope.options.sortX === undefined; const useUnifiedXaxis = sortX && scope.options.xAxis.type === 'category'; @@ -341,6 +353,22 @@ const PlotlyChart = () => { size: pluck(data, 'size'), }; } + + if (seriesOptions.type === 'box') { + plotlySeries.boxpoints = 'outliers'; + plotlySeries.marker = { + size: 3, + }; + if (scope.options.showpoints) { + plotlySeries.boxpoints = 'all'; + plotlySeries.jitter = 0.3; + plotlySeries.pointpos = -1.8; + plotlySeries.marker = { + size: 3, + }; + } + } + scope.data.push(plotlySeries); }); From a087fe4bcd15c9a938c13f64594d8a2312c948e4 Mon Sep 17 00:00:00 2001 From: Arik Fraimovich Date: Tue, 11 Apr 2017 18:05:43 +0300 Subject: [PATCH 089/112] Fix: page freezes when rendering large result set. Closes #1711. --- client/app/components/dynamic-table/dynamic-table.html | 2 +- client/app/components/dynamic-table/index.js | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/client/app/components/dynamic-table/dynamic-table.html b/client/app/components/dynamic-table/dynamic-table.html index befe948d..6be3aeb6 100644 --- a/client/app/components/dynamic-table/dynamic-table.html +++ b/client/app/components/dynamic-table/dynamic-table.html @@ -9,7 +9,7 @@ - + diff --git a/client/app/components/dynamic-table/index.js b/client/app/components/dynamic-table/index.js index 762c66cf..c4c13428 100644 --- a/client/app/components/dynamic-table/index.js +++ b/client/app/components/dynamic-table/index.js @@ -15,7 +15,7 @@ function DynamicTable($sanitize) { const first = this.count * (this.page - 1); const last = this.count * (this.page); - this.rows = this.allRows.slice(first, last); + this.rowsToDisplay = this.rows.slice(first, last); }; this.$onChanges = (changes) => { @@ -24,10 +24,10 @@ function DynamicTable($sanitize) { } if (changes.rows) { - this.allRows = changes.rows.currentValue; + this.rows = changes.rows.currentValue; } - this.rowsCount = this.allRows.length; + this.rowsCount = this.rows.length; this.pageChanged(); }; From ccf9cbd2c8f325acb219252542a70056374fa494 Mon Sep 17 00:00:00 2001 From: Jos van Egmond Date: Fri, 14 Apr 2017 16:06:38 +0200 Subject: [PATCH 090/112] Raise JQL limit from default 50 to 1000 --- redash/query_runner/jql.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/redash/query_runner/jql.py b/redash/query_runner/jql.py index 2b37339c..599e6993 100644 --- a/redash/query_runner/jql.py +++ b/redash/query_runner/jql.py @@ -183,6 +183,8 @@ class JiraJQL(BaseQueryRunner): if query_type == 'count': query['maxResults'] = 1 query['fields'] = '' + else: + query['maxResults'] = 1000 response = requests.get(jql_url, params=query, auth=(self.configuration.get('username'), self.configuration.get('password'))) From 2e7fafc4d8f1d59b76ceabb2f86c204fdb53a9a2 Mon Sep 17 00:00:00 2001 From: Arik Fraimovich Date: Tue, 18 Apr 2017 14:59:44 +0300 Subject: [PATCH 091/112] CHANGELOG update. --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index befb9592..633b0f0d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,7 @@ ### Fixed +- Fix: page freezes when rendering large result set. - Fix: chart embeds were not rendering in PhantomJS. ## v1.0.1 - 2017-04-02 From 3c7c93fc9f09cfa17319aef14da3d23ec6e46641 Mon Sep 17 00:00:00 2001 From: Arik Fraimovich Date: Tue, 18 Apr 2017 15:19:57 +0300 Subject: [PATCH 092/112] Fix: favicon wasn't showing up. Closes #1719. --- client/app/index.html | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/client/app/index.html b/client/app/index.html index 36102dc8..424d101b 100644 --- a/client/app/index.html +++ b/client/app/index.html @@ -6,9 +6,9 @@ Redash - - - + + + From 742e38b08de0680fb8eae148be3fffcccdefc58f Mon Sep 17 00:00:00 2001 From: Arik Fraimovich Date: Tue, 18 Apr 2017 15:20:21 +0300 Subject: [PATCH 093/112] Update CHANGELOG and bump version --- CHANGELOG.md | 3 ++- package.json | 2 +- redash/__init__.py | 2 +- 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 633b0f0d..ca5e4e85 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,9 +1,10 @@ # Change Log -## UNRELEASED +## v1.0.2 - 2017-04-18 ### Fixed +- Fix: support for unicode in dashboard tags. @deecay - Fix: page freezes when rendering large result set. - Fix: chart embeds were not rendering in PhantomJS. diff --git a/package.json b/package.json index 69cf7167..06d580ee 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "redash-client", - "version": "1.0.1", + "version": "1.0.2", "description": "The frontend part of Redash.", "main": "index.js", "scripts": { diff --git a/redash/__init__.py b/redash/__init__.py index 6e2673d2..37ff067f 100644 --- a/redash/__init__.py +++ b/redash/__init__.py @@ -16,7 +16,7 @@ from redash.query_runner import import_query_runners from redash.destinations import import_destinations -__version__ = '1.0.1' +__version__ = '1.0.2' def setup_logging(): From 939aae086f98f381b8cb32a91963418f7ee02f30 Mon Sep 17 00:00:00 2001 From: Arik Fraimovich Date: Tue, 18 Apr 2017 15:22:05 +0300 Subject: [PATCH 094/112] ADd changelog entry for favicons fix --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index ca5e4e85..1d0cae18 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,7 @@ ### Fixed +- Fix: favicon wasn't showing up. - Fix: support for unicode in dashboard tags. @deecay - Fix: page freezes when rendering large result set. - Fix: chart embeds were not rendering in PhantomJS. From f0719f5ea47c6ec054ba78fcc5a062abf6b66b4e Mon Sep 17 00:00:00 2001 From: Arik Fraimovich Date: Tue, 18 Apr 2017 22:50:33 +0300 Subject: [PATCH 095/112] Fix: sort by header no longer working. Closes #1726. --- client/app/components/dynamic-table/index.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/client/app/components/dynamic-table/index.js b/client/app/components/dynamic-table/index.js index c4c13428..b5563f47 100644 --- a/client/app/components/dynamic-table/index.js +++ b/client/app/components/dynamic-table/index.js @@ -41,9 +41,9 @@ function DynamicTable($sanitize) { } if (this.orderByField) { - this.allRows = sortBy(this.allRows, this.orderByField.name); + this.rows = sortBy(this.rows, this.orderByField.name); if (this.orderByReverse) { - this.allRows = this.allRows.reverse(); + this.rows = this.rows.reverse(); } this.pageChanged(); } From f504b682f3eae99154a5157f6e616c96b7b0434d Mon Sep 17 00:00:00 2001 From: Arik Fraimovich Date: Tue, 18 Apr 2017 22:50:57 +0300 Subject: [PATCH 096/112] Bump version. --- CHANGELOG.md | 6 ++++++ package.json | 2 +- redash/__init__.py | 2 +- 3 files changed, 8 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 1d0cae18..c3437cf1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,11 @@ # Change Log +## v1.0.3 - 2017-04-18 + +### Fixed + +- Fix: sort by column no longer working. + ## v1.0.2 - 2017-04-18 ### Fixed diff --git a/package.json b/package.json index 06d580ee..c1982f8d 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "redash-client", - "version": "1.0.2", + "version": "1.0.3", "description": "The frontend part of Redash.", "main": "index.js", "scripts": { diff --git a/redash/__init__.py b/redash/__init__.py index 37ff067f..abaedcdd 100644 --- a/redash/__init__.py +++ b/redash/__init__.py @@ -16,7 +16,7 @@ from redash.query_runner import import_query_runners from redash.destinations import import_destinations -__version__ = '1.0.2' +__version__ = '1.0.3' def setup_logging(): From 519fb49f6ab6a8be07b7abd606d236a2e28f68d3 Mon Sep 17 00:00:00 2001 From: Maxime Fouilleul Date: Wed, 19 Apr 2017 16:39:43 +0200 Subject: [PATCH 097/112] Improve cassandra lib --- redash/query_runner/cass.py | 22 ++++++++++++++++++---- 1 file changed, 18 insertions(+), 4 deletions(-) diff --git a/redash/query_runner/cass.py b/redash/query_runner/cass.py index 7a577e6e..d69dca9d 100644 --- a/redash/query_runner/cass.py +++ b/redash/query_runner/cass.py @@ -1,5 +1,6 @@ import json import logging +import uuid from redash.query_runner import BaseQueryRunner, register from redash.utils import JSONEncoder @@ -13,6 +14,11 @@ try: except ImportError: enabled = False +class CassandraJSONEncoder(JSONEncoder): + def default(self, o): + if isinstance(o, uuid.UUID): + return str(o) + return super(CassandraJSONEncoder, self).default(o) class Cassandra(BaseQueryRunner): noop_query = "SELECT dateof(now()) FROM system.local" @@ -44,6 +50,15 @@ class Cassandra(BaseQueryRunner): 'password': { 'type': 'string', 'title': 'Password' + }, + 'protocol': { + 'type': 'number', + 'title': 'Protocol Version', + 'default': 3 + }, + 'cqlversion': { + 'type': 'string', + 'title': 'CQL Version' } }, 'required': ['keyspace', 'host'] @@ -77,10 +92,9 @@ class Cassandra(BaseQueryRunner): if self.configuration.get('username', '') and self.configuration.get('password', ''): auth_provider = PlainTextAuthProvider(username='{}'.format(self.configuration.get('username', '')), password='{}'.format(self.configuration.get('password', ''))) - connection = Cluster([self.configuration.get('host', '')], auth_provider=auth_provider, protocol_version=3) + connection = Cluster([self.configuration.get('host', '')], auth_provider=auth_provider, protocol_version=self.configuration.get('protocol', ''), cql_version=self.configuration.get('cqlversion', '')) else: - connection = Cluster([self.configuration.get('host', '')], protocol_version=3) - + connection = Cluster([self.configuration.get('host', '')], protocol_version=self.configuration.get('protocol', ''), cql_version=self.configuration.get('cqlversion', '')) session = connection.connect() session.set_keyspace(self.configuration['keyspace']) logger.debug("Cassandra running query: %s", query) @@ -93,7 +107,7 @@ class Cassandra(BaseQueryRunner): rows = [dict(zip(column_names, row)) for row in result] data = {'columns': columns, 'rows': rows} - json_data = json.dumps(data, cls=JSONEncoder) + json_data = json.dumps(data, cls=CassandraJSONEncoder) error = None except KeyboardInterrupt: From 5d7795ca47d7b8fbc2bf74c8b75a177b2b07d324 Mon Sep 17 00:00:00 2001 From: Maxime Fouilleul Date: Wed, 19 Apr 2017 22:14:27 +0200 Subject: [PATCH 098/112] Fix code style --- redash/query_runner/cass.py | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/redash/query_runner/cass.py b/redash/query_runner/cass.py index d69dca9d..fd68648b 100644 --- a/redash/query_runner/cass.py +++ b/redash/query_runner/cass.py @@ -14,12 +14,14 @@ try: except ImportError: enabled = False + class CassandraJSONEncoder(JSONEncoder): def default(self, o): if isinstance(o, uuid.UUID): return str(o) return super(CassandraJSONEncoder, self).default(o) + class Cassandra(BaseQueryRunner): noop_query = "SELECT dateof(now()) FROM system.local" @@ -92,9 +94,14 @@ class Cassandra(BaseQueryRunner): if self.configuration.get('username', '') and self.configuration.get('password', ''): auth_provider = PlainTextAuthProvider(username='{}'.format(self.configuration.get('username', '')), password='{}'.format(self.configuration.get('password', ''))) - connection = Cluster([self.configuration.get('host', '')], auth_provider=auth_provider, protocol_version=self.configuration.get('protocol', ''), cql_version=self.configuration.get('cqlversion', '')) + connection = Cluster([self.configuration.get('host', '')], + auth_provider=auth_provider, + protocol_version=self.configuration.get('protocol', ''), + cql_version=self.configuration.get('cqlversion', '')) else: - connection = Cluster([self.configuration.get('host', '')], protocol_version=self.configuration.get('protocol', ''), cql_version=self.configuration.get('cqlversion', '')) + connection = Cluster([self.configuration.get('host', '')], + protocol_version=self.configuration.get('protocol', ''), + cql_version=self.configuration.get('cqlversion', '')) session = connection.connect() session.set_keyspace(self.configuration['keyspace']) logger.debug("Cassandra running query: %s", query) From ac1b0a46f991dda403ae79a0b3fa1609e69a2e28 Mon Sep 17 00:00:00 2001 From: Maxime Fouilleul Date: Wed, 19 Apr 2017 23:00:39 +0200 Subject: [PATCH 099/112] Fix trailing spaces (style) --- redash/query_runner/cass.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/redash/query_runner/cass.py b/redash/query_runner/cass.py index fd68648b..26e41cf9 100644 --- a/redash/query_runner/cass.py +++ b/redash/query_runner/cass.py @@ -94,13 +94,13 @@ class Cassandra(BaseQueryRunner): if self.configuration.get('username', '') and self.configuration.get('password', ''): auth_provider = PlainTextAuthProvider(username='{}'.format(self.configuration.get('username', '')), password='{}'.format(self.configuration.get('password', ''))) - connection = Cluster([self.configuration.get('host', '')], - auth_provider=auth_provider, - protocol_version=self.configuration.get('protocol', ''), + connection = Cluster([self.configuration.get('host', '')], + auth_provider=auth_provider, + protocol_version=self.configuration.get('protocol', ''), cql_version=self.configuration.get('cqlversion', '')) else: - connection = Cluster([self.configuration.get('host', '')], - protocol_version=self.configuration.get('protocol', ''), + connection = Cluster([self.configuration.get('host', '')], + protocol_version=self.configuration.get('protocol', ''), cql_version=self.configuration.get('cqlversion', '')) session = connection.connect() session.set_keyspace(self.configuration['keyspace']) From 9b5939476858094170f12bcdbc3c724ce6f521ec Mon Sep 17 00:00:00 2001 From: Maxime Fouilleul Date: Thu, 20 Apr 2017 11:16:37 +0200 Subject: [PATCH 100/112] Fix default values for proto/cqlversion --- redash/query_runner/cass.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/redash/query_runner/cass.py b/redash/query_runner/cass.py index 26e41cf9..16617a50 100644 --- a/redash/query_runner/cass.py +++ b/redash/query_runner/cass.py @@ -96,12 +96,12 @@ class Cassandra(BaseQueryRunner): password='{}'.format(self.configuration.get('password', ''))) connection = Cluster([self.configuration.get('host', '')], auth_provider=auth_provider, - protocol_version=self.configuration.get('protocol', ''), - cql_version=self.configuration.get('cqlversion', '')) + protocol_version=self.configuration.get('protocol', 3), + cql_version=self.configuration.get('cqlversion', 'None')) else: connection = Cluster([self.configuration.get('host', '')], - protocol_version=self.configuration.get('protocol', ''), - cql_version=self.configuration.get('cqlversion', '')) + protocol_version=self.configuration.get('protocol', 3), + cql_version=self.configuration.get('cqlversion', 'None')) session = connection.connect() session.set_keyspace(self.configuration['keyspace']) logger.debug("Cassandra running query: %s", query) From 9f2180764718370a6ac7c5da75279ee85c258e4c Mon Sep 17 00:00:00 2001 From: Maxime Fouilleul Date: Thu, 20 Apr 2017 11:33:12 +0200 Subject: [PATCH 101/112] remove useless param --- redash/query_runner/cass.py | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/redash/query_runner/cass.py b/redash/query_runner/cass.py index 16617a50..b211cbe2 100644 --- a/redash/query_runner/cass.py +++ b/redash/query_runner/cass.py @@ -57,10 +57,6 @@ class Cassandra(BaseQueryRunner): 'type': 'number', 'title': 'Protocol Version', 'default': 3 - }, - 'cqlversion': { - 'type': 'string', - 'title': 'CQL Version' } }, 'required': ['keyspace', 'host'] @@ -96,12 +92,10 @@ class Cassandra(BaseQueryRunner): password='{}'.format(self.configuration.get('password', ''))) connection = Cluster([self.configuration.get('host', '')], auth_provider=auth_provider, - protocol_version=self.configuration.get('protocol', 3), - cql_version=self.configuration.get('cqlversion', 'None')) + protocol_version=self.configuration.get('protocol', 3)) else: connection = Cluster([self.configuration.get('host', '')], - protocol_version=self.configuration.get('protocol', 3), - cql_version=self.configuration.get('cqlversion', 'None')) + protocol_version=self.configuration.get('protocol', 3)) session = connection.connect() session.set_keyspace(self.configuration['keyspace']) logger.debug("Cassandra running query: %s", query) From 93df24de39ed995bfe528d3b9b00ad009ec13c4f Mon Sep 17 00:00:00 2001 From: Abdelrahman Mahmoud Date: Wed, 15 Mar 2017 12:55:24 -0400 Subject: [PATCH 102/112] Fix Google analytics, Google Spreadsheet and Big Query integration .. upgrade outh2client and google-api-python-client --- redash/query_runner/big_query.py | 10 +++++----- redash/query_runner/google_analytics.py | 4 ++-- redash/query_runner/google_spreadsheets.py | 4 ++-- requirements_all_ds.txt | 4 ++-- 4 files changed, 11 insertions(+), 11 deletions(-) diff --git a/redash/query_runner/big_query.py b/redash/query_runner/big_query.py index 0be4597b..875e1604 100644 --- a/redash/query_runner/big_query.py +++ b/redash/query_runner/big_query.py @@ -18,7 +18,7 @@ try: import apiclient.errors from apiclient.discovery import build from apiclient.errors import HttpError - from oauth2client.client import SignedJwtAssertionCredentials + from oauth2client.service_account import ServiceAccountCredentials from oauth2client import gce enabled = True @@ -134,7 +134,7 @@ class BigQuery(BaseQueryRunner): key = json.loads(b64decode(self.configuration['jsonKeyFile'])) - credentials = SignedJwtAssertionCredentials(key['client_email'], key['private_key'], scope=scope) + credentials = ServiceAccountCredentials.from_json_keyfile_dict(key, scope) http = httplib2.Http(timeout=settings.BIGQUERY_HTTP_TIMEOUT) http = credentials.authorize(http) @@ -148,10 +148,10 @@ class BigQuery(BaseQueryRunner): "query": query, "dryRun": True, } - + if self.configuration.get('useStandardSql', False): job_data['useLegacySql'] = False - + response = jobs.query(projectId=self._get_project_id(), body=job_data).execute() return int(response["totalBytesProcessed"]) @@ -164,7 +164,7 @@ class BigQuery(BaseQueryRunner): } } } - + if self.configuration.get('useStandardSql', False): job_data['configuration']['query']['useLegacySql'] = False diff --git a/redash/query_runner/google_analytics.py b/redash/query_runner/google_analytics.py index 26ecc861..d479520e 100644 --- a/redash/query_runner/google_analytics.py +++ b/redash/query_runner/google_analytics.py @@ -10,7 +10,7 @@ from datetime import datetime logger = logging.getLogger(__name__) try: - from oauth2client.client import SignedJwtAssertionCredentials + from oauth2client.service_account import ServiceAccountCredentials from apiclient.discovery import build import httplib2 enabled = True @@ -81,7 +81,7 @@ class GoogleAnalytics(BaseSQLQueryRunner): def _get_analytics_service(self): scope = ['https://www.googleapis.com/auth/analytics.readonly'] key = json.loads(b64decode(self.configuration['jsonKeyFile'])) - credentials = SignedJwtAssertionCredentials(key['client_email'], key["private_key"], scope=scope) + credentials = ServiceAccountCredentials.from_json_keyfile_dict(key, scope) return build('analytics', 'v3', http=credentials.authorize(httplib2.Http())) def run_query(self, query, user): diff --git a/redash/query_runner/google_spreadsheets.py b/redash/query_runner/google_spreadsheets.py index 2184da70..8d6126e1 100644 --- a/redash/query_runner/google_spreadsheets.py +++ b/redash/query_runner/google_spreadsheets.py @@ -9,7 +9,7 @@ logger = logging.getLogger(__name__) try: import gspread - from oauth2client.client import SignedJwtAssertionCredentials + from oauth2client.service_account import ServiceAccountCredentials enabled = True except ImportError: enabled = False @@ -164,7 +164,7 @@ class GoogleSpreadsheet(BaseQueryRunner): ] key = json.loads(b64decode(self.configuration['jsonKeyFile'])) - credentials = SignedJwtAssertionCredentials(key['client_email'], key["private_key"], scope=scope) + credentials = ServiceAccountCredentials.from_json_keyfile_dict(key, scope) spreadsheetservice = gspread.authorize(credentials) return spreadsheetservice diff --git a/requirements_all_ds.txt b/requirements_all_ds.txt index 5dad813f..ecc32512 100644 --- a/requirements_all_ds.txt +++ b/requirements_all_ds.txt @@ -1,9 +1,9 @@ -google-api-python-client==1.2 +google-api-python-client==1.5.1 gspread==0.2.5 impyla==0.10.0 influxdb==2.7.1 MySQL-python==1.2.5 -oauth2client==1.2 +oauth2client==3.0.0 pyhive==0.1.6 pymongo==3.2.1 pyOpenSSL==0.14 From 7324f1f4c7baf94708bf056b5115be255c8ed3b7 Mon Sep 17 00:00:00 2001 From: Abdelrahman Mahmoud Date: Wed, 15 Mar 2017 13:06:17 -0400 Subject: [PATCH 103/112] Fix code climate warnings --- redash/query_runner/big_query.py | 4 ++-- redash/query_runner/google_analytics.py | 4 ++-- redash/query_runner/google_spreadsheets.py | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/redash/query_runner/big_query.py b/redash/query_runner/big_query.py index 875e1604..936c993c 100644 --- a/redash/query_runner/big_query.py +++ b/redash/query_runner/big_query.py @@ -134,9 +134,9 @@ class BigQuery(BaseQueryRunner): key = json.loads(b64decode(self.configuration['jsonKeyFile'])) - credentials = ServiceAccountCredentials.from_json_keyfile_dict(key, scope) + creds = ServiceAccountCredentials.from_json_keyfile_dict(key, scope) http = httplib2.Http(timeout=settings.BIGQUERY_HTTP_TIMEOUT) - http = credentials.authorize(http) + http = creds.authorize(http) return build("bigquery", "v2", http=http) diff --git a/redash/query_runner/google_analytics.py b/redash/query_runner/google_analytics.py index d479520e..0993a1ea 100644 --- a/redash/query_runner/google_analytics.py +++ b/redash/query_runner/google_analytics.py @@ -81,8 +81,8 @@ class GoogleAnalytics(BaseSQLQueryRunner): def _get_analytics_service(self): scope = ['https://www.googleapis.com/auth/analytics.readonly'] key = json.loads(b64decode(self.configuration['jsonKeyFile'])) - credentials = ServiceAccountCredentials.from_json_keyfile_dict(key, scope) - return build('analytics', 'v3', http=credentials.authorize(httplib2.Http())) + creds = ServiceAccountCredentials.from_json_keyfile_dict(key, scope) + return build('analytics', 'v3', http=creds.authorize(httplib2.Http())) def run_query(self, query, user): logger.debug("Analytics is about to execute query: %s", query) diff --git a/redash/query_runner/google_spreadsheets.py b/redash/query_runner/google_spreadsheets.py index 8d6126e1..1b0509ed 100644 --- a/redash/query_runner/google_spreadsheets.py +++ b/redash/query_runner/google_spreadsheets.py @@ -164,8 +164,8 @@ class GoogleSpreadsheet(BaseQueryRunner): ] key = json.loads(b64decode(self.configuration['jsonKeyFile'])) - credentials = ServiceAccountCredentials.from_json_keyfile_dict(key, scope) - spreadsheetservice = gspread.authorize(credentials) + creds = ServiceAccountCredentials.from_json_keyfile_dict(key, scope) + spreadsheetservice = gspread.authorize(creds) return spreadsheetservice def test_connection(self): From 214a231371031051de54d9131096bdd672209553 Mon Sep 17 00:00:00 2001 From: Yohei Susa Date: Thu, 27 Apr 2017 18:45:49 +0900 Subject: [PATCH 104/112] Disable query annotations to Athena query runner --- redash/query_runner/athena.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/redash/query_runner/athena.py b/redash/query_runner/athena.py index 2642377c..eda3c5ef 100644 --- a/redash/query_runner/athena.py +++ b/redash/query_runner/athena.py @@ -40,6 +40,9 @@ class Athena(BaseQueryRunner): 'secret': ['aws_secret_key'] } + @classmethod + def annotate_query(cls): + return False def get_schema(self, get_stats=False): schema = {} From 7a47d6741dd9f711be41615f4bcaf1a6af91231a Mon Sep 17 00:00:00 2001 From: deecay Date: Sat, 29 Apr 2017 23:42:58 +0900 Subject: [PATCH 105/112] Change: Chosing box plot turns sortX off --- client/app/visualizations/box-plot/index.js | 2 +- client/app/visualizations/chart/plotly.js | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/client/app/visualizations/box-plot/index.js b/client/app/visualizations/box-plot/index.js index 7ce3973d..b20cc258 100644 --- a/client/app/visualizations/box-plot/index.js +++ b/client/app/visualizations/box-plot/index.js @@ -176,7 +176,7 @@ export default function (ngModule) { VisualizationProvider.registerVisualization({ type: 'BOXPLOT', - name: 'Boxplot', + name: 'Boxplot (Deprecated)', renderTemplate, editorTemplate: editTemplate, }); diff --git a/client/app/visualizations/chart/plotly.js b/client/app/visualizations/chart/plotly.js index 6349d890..40b57177 100644 --- a/client/app/visualizations/chart/plotly.js +++ b/client/app/visualizations/chart/plotly.js @@ -281,6 +281,7 @@ const PlotlyChart = () => { } if (scope.options.globalSeriesType === 'box') { + scope.options.sortX = false; scope.layout.boxmode = 'group'; scope.layout.boxgroupgap = 0.50; } From 1c955a570d8eed432aae6943350895ef88a3a5fa Mon Sep 17 00:00:00 2001 From: deecay Date: Sun, 30 Apr 2017 11:47:43 +0900 Subject: [PATCH 106/112] Bump Plotly version --- npm-shrinkwrap.json | 4085 ++++++++++++++++++++++++++++++++++++++++--- package.json | 2 +- 2 files changed, 3842 insertions(+), 245 deletions(-) diff --git a/npm-shrinkwrap.json b/npm-shrinkwrap.json index 8fbbadc5..e2c0c2d1 100644 --- a/npm-shrinkwrap.json +++ b/npm-shrinkwrap.json @@ -17,10 +17,36 @@ "from": "a-big-triangle@>=1.0.0 <2.0.0", "resolved": "https://registry.npmjs.org/a-big-triangle/-/a-big-triangle-1.0.3.tgz" }, + "abbrev": { + "version": "1.1.0", + "from": "abbrev@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.0.tgz", + "dev": true + }, + "accepts": { + "version": "1.3.3", + "from": "accepts@>=1.3.3 <1.4.0", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.3.tgz", + "dev": true + }, "acorn": { - "version": "4.0.4", - "from": "acorn@4.0.4", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-4.0.4.tgz" + "version": "1.2.2", + "from": "acorn@>=1.0.3 <2.0.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-1.2.2.tgz" + }, + "acorn-jsx": { + "version": "3.0.1", + "from": "acorn-jsx@>=3.0.0 <4.0.0", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-3.0.1.tgz", + "dev": true, + "dependencies": { + "acorn": { + "version": "3.3.0", + "from": "acorn@>=3.0.4 <4.0.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-3.3.0.tgz", + "dev": true + } + } }, "add-line-numbers": { "version": "1.0.1", @@ -32,6 +58,18 @@ "from": "affine-hull@>=1.0.0 <2.0.0", "resolved": "https://registry.npmjs.org/affine-hull/-/affine-hull-1.0.0.tgz" }, + "ajv": { + "version": "4.11.8", + "from": "ajv@>=4.7.0 <5.0.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-4.11.8.tgz", + "dev": true + }, + "ajv-keywords": { + "version": "1.5.1", + "from": "ajv-keywords@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-1.5.1.tgz", + "dev": true + }, "align-text": { "version": "0.1.4", "from": "align-text@>=0.1.3 <0.2.0", @@ -52,15 +90,21 @@ "from": "alpha-shape@>=1.0.0 <2.0.0", "resolved": "https://registry.npmjs.org/alpha-shape/-/alpha-shape-1.0.0.tgz" }, + "alphanum-sort": { + "version": "1.0.2", + "from": "alphanum-sort@>=1.0.1 <2.0.0", + "resolved": "https://registry.npmjs.org/alphanum-sort/-/alphanum-sort-1.0.2.tgz", + "dev": true + }, "alter": { "version": "0.2.0", "from": "alter@>=0.2.0 <0.3.0", "resolved": "https://registry.npmjs.org/alter/-/alter-0.2.0.tgz" }, "amdefine": { - "version": "1.0.0", + "version": "1.0.1", "from": "amdefine@>=0.0.4", - "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.0.tgz" + "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz" }, "angular": { "version": "1.5.8", @@ -127,6 +171,12 @@ "from": "angular-vs-repeat@latest", "resolved": "https://registry.npmjs.org/angular-vs-repeat/-/angular-vs-repeat-1.1.7.tgz" }, + "ansi-escapes": { + "version": "1.4.0", + "from": "ansi-escapes@>=1.1.0 <2.0.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-1.4.0.tgz", + "dev": true + }, "ansi-regex": { "version": "2.0.0", "from": "ansi-regex@>=2.0.0 <3.0.0", @@ -137,21 +187,137 @@ "from": "ansi-styles@>=2.2.1 <3.0.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz" }, + "ansicolors": { + "version": "0.2.1", + "from": "ansicolors@>=0.2.1 <0.3.0", + "resolved": "https://registry.npmjs.org/ansicolors/-/ansicolors-0.2.1.tgz", + "dev": true + }, + "anymatch": { + "version": "1.3.0", + "from": "anymatch@>=1.3.0 <2.0.0", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-1.3.0.tgz", + "dev": true + }, + "aproba": { + "version": "1.1.1", + "from": "aproba@>=1.0.3 <2.0.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.1.1.tgz", + "dev": true + }, + "are-we-there-yet": { + "version": "1.1.4", + "from": "are-we-there-yet@>=1.1.2 <1.2.0", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.4.tgz", + "dev": true, + "dependencies": { + "readable-stream": { + "version": "2.2.9", + "from": "readable-stream@>=2.0.6 <3.0.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.2.9.tgz", + "dev": true + }, + "string_decoder": { + "version": "1.0.0", + "from": "string_decoder@~1.0.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.0.tgz", + "dev": true + } + } + }, + "argparse": { + "version": "1.0.9", + "from": "argparse@>=1.0.7 <2.0.0", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.9.tgz", + "dev": true + }, + "arr-diff": { + "version": "2.0.0", + "from": "arr-diff@>=2.0.0 <3.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", + "dev": true + }, + "arr-flatten": { + "version": "1.0.3", + "from": "arr-flatten@>=1.0.1 <2.0.0", + "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.0.3.tgz", + "dev": true + }, + "array-find-index": { + "version": "1.0.2", + "from": "array-find-index@>=1.0.1 <2.0.0", + "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz", + "dev": true + }, + "array-flatten": { + "version": "1.1.1", + "from": "array-flatten@1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "dev": true + }, + "array-union": { + "version": "1.0.2", + "from": "array-union@>=1.0.1 <2.0.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", + "dev": true + }, + "array-uniq": { + "version": "1.0.3", + "from": "array-uniq@>=1.0.1 <2.0.0", + "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", + "dev": true + }, + "array-unique": { + "version": "0.2.1", + "from": "array-unique@>=0.2.1 <0.3.0", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", + "dev": true + }, "arraytools": { "version": "1.1.2", "from": "arraytools@>=1.0.0 <2.0.0", "resolved": "https://registry.npmjs.org/arraytools/-/arraytools-1.1.2.tgz" }, + "arrify": { + "version": "1.0.1", + "from": "arrify@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", + "dev": true + }, "asn1": { "version": "0.2.3", "from": "asn1@>=0.2.3 <0.3.0", "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.3.tgz" }, + "assert": { + "version": "1.4.1", + "from": "assert@>=1.1.1 <2.0.0", + "resolved": "https://registry.npmjs.org/assert/-/assert-1.4.1.tgz", + "dev": true + }, "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" }, + "async": { + "version": "1.5.2", + "from": "async@>=1.5.0 <2.0.0", + "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", + "dev": true + }, + "async-each": { + "version": "1.0.1", + "from": "async-each@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.1.tgz", + "dev": true + }, + "async-foreach": { + "version": "0.1.3", + "from": "async-foreach@>=0.1.3 <0.2.0", + "resolved": "https://registry.npmjs.org/async-foreach/-/async-foreach-0.1.3.tgz", + "dev": true + }, "asynckit": { "version": "0.4.0", "from": "asynckit@>=0.4.0 <0.5.0", @@ -162,6 +328,12 @@ "from": "atob-lite@>=1.0.0 <2.0.0", "resolved": "https://registry.npmjs.org/atob-lite/-/atob-lite-1.0.0.tgz" }, + "autoprefixer": { + "version": "6.7.7", + "from": "autoprefixer@>=6.3.1 <7.0.0", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-6.7.7.tgz", + "dev": true + }, "aws-sign2": { "version": "0.6.0", "from": "aws-sign2@>=0.6.0 <0.7.0", @@ -172,6 +344,416 @@ "from": "aws4@>=1.2.1 <2.0.0", "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.5.0.tgz" }, + "babel-code-frame": { + "version": "6.22.0", + "from": "babel-code-frame@>=6.22.0 <7.0.0", + "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.22.0.tgz", + "dev": true + }, + "babel-core": { + "version": "6.24.0", + "from": "babel-core@>=6.18.0 <7.0.0", + "resolved": "https://registry.npmjs.org/babel-core/-/babel-core-6.24.0.tgz", + "dev": true + }, + "babel-generator": { + "version": "6.24.1", + "from": "babel-generator@>=6.24.0 <7.0.0", + "resolved": "https://registry.npmjs.org/babel-generator/-/babel-generator-6.24.1.tgz", + "dev": true + }, + "babel-helper-bindify-decorators": { + "version": "6.24.1", + "from": "babel-helper-bindify-decorators@>=6.24.1 <7.0.0", + "resolved": "https://registry.npmjs.org/babel-helper-bindify-decorators/-/babel-helper-bindify-decorators-6.24.1.tgz", + "dev": true + }, + "babel-helper-builder-binary-assignment-operator-visitor": { + "version": "6.24.1", + "from": "babel-helper-builder-binary-assignment-operator-visitor@>=6.24.1 <7.0.0", + "resolved": "https://registry.npmjs.org/babel-helper-builder-binary-assignment-operator-visitor/-/babel-helper-builder-binary-assignment-operator-visitor-6.24.1.tgz", + "dev": true + }, + "babel-helper-call-delegate": { + "version": "6.24.1", + "from": "babel-helper-call-delegate@>=6.24.1 <7.0.0", + "resolved": "https://registry.npmjs.org/babel-helper-call-delegate/-/babel-helper-call-delegate-6.24.1.tgz", + "dev": true + }, + "babel-helper-define-map": { + "version": "6.24.1", + "from": "babel-helper-define-map@>=6.24.1 <7.0.0", + "resolved": "https://registry.npmjs.org/babel-helper-define-map/-/babel-helper-define-map-6.24.1.tgz", + "dev": true + }, + "babel-helper-explode-assignable-expression": { + "version": "6.24.1", + "from": "babel-helper-explode-assignable-expression@>=6.24.1 <7.0.0", + "resolved": "https://registry.npmjs.org/babel-helper-explode-assignable-expression/-/babel-helper-explode-assignable-expression-6.24.1.tgz", + "dev": true + }, + "babel-helper-explode-class": { + "version": "6.24.1", + "from": "babel-helper-explode-class@>=6.24.1 <7.0.0", + "resolved": "https://registry.npmjs.org/babel-helper-explode-class/-/babel-helper-explode-class-6.24.1.tgz", + "dev": true + }, + "babel-helper-function-name": { + "version": "6.24.1", + "from": "babel-helper-function-name@>=6.24.1 <7.0.0", + "resolved": "https://registry.npmjs.org/babel-helper-function-name/-/babel-helper-function-name-6.24.1.tgz", + "dev": true + }, + "babel-helper-get-function-arity": { + "version": "6.24.1", + "from": "babel-helper-get-function-arity@>=6.24.1 <7.0.0", + "resolved": "https://registry.npmjs.org/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.24.1.tgz", + "dev": true + }, + "babel-helper-hoist-variables": { + "version": "6.24.1", + "from": "babel-helper-hoist-variables@>=6.24.1 <7.0.0", + "resolved": "https://registry.npmjs.org/babel-helper-hoist-variables/-/babel-helper-hoist-variables-6.24.1.tgz", + "dev": true + }, + "babel-helper-optimise-call-expression": { + "version": "6.24.1", + "from": "babel-helper-optimise-call-expression@>=6.24.1 <7.0.0", + "resolved": "https://registry.npmjs.org/babel-helper-optimise-call-expression/-/babel-helper-optimise-call-expression-6.24.1.tgz", + "dev": true + }, + "babel-helper-regex": { + "version": "6.24.1", + "from": "babel-helper-regex@>=6.24.1 <7.0.0", + "resolved": "https://registry.npmjs.org/babel-helper-regex/-/babel-helper-regex-6.24.1.tgz", + "dev": true + }, + "babel-helper-remap-async-to-generator": { + "version": "6.24.1", + "from": "babel-helper-remap-async-to-generator@>=6.24.1 <7.0.0", + "resolved": "https://registry.npmjs.org/babel-helper-remap-async-to-generator/-/babel-helper-remap-async-to-generator-6.24.1.tgz", + "dev": true + }, + "babel-helper-replace-supers": { + "version": "6.24.1", + "from": "babel-helper-replace-supers@>=6.24.1 <7.0.0", + "resolved": "https://registry.npmjs.org/babel-helper-replace-supers/-/babel-helper-replace-supers-6.24.1.tgz", + "dev": true + }, + "babel-helpers": { + "version": "6.24.1", + "from": "babel-helpers@>=6.23.0 <7.0.0", + "resolved": "https://registry.npmjs.org/babel-helpers/-/babel-helpers-6.24.1.tgz", + "dev": true + }, + "babel-loader": { + "version": "6.4.1", + "from": "babel-loader@>=6.2.7 <7.0.0", + "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-6.4.1.tgz", + "dev": true + }, + "babel-messages": { + "version": "6.23.0", + "from": "babel-messages@>=6.23.0 <7.0.0", + "resolved": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.23.0.tgz", + "dev": true + }, + "babel-plugin-check-es2015-constants": { + "version": "6.22.0", + "from": "babel-plugin-check-es2015-constants@>=6.22.0 <7.0.0", + "resolved": "https://registry.npmjs.org/babel-plugin-check-es2015-constants/-/babel-plugin-check-es2015-constants-6.22.0.tgz", + "dev": true + }, + "babel-plugin-syntax-async-functions": { + "version": "6.13.0", + "from": "babel-plugin-syntax-async-functions@>=6.8.0 <7.0.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-async-functions/-/babel-plugin-syntax-async-functions-6.13.0.tgz", + "dev": true + }, + "babel-plugin-syntax-async-generators": { + "version": "6.13.0", + "from": "babel-plugin-syntax-async-generators@>=6.5.0 <7.0.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-async-generators/-/babel-plugin-syntax-async-generators-6.13.0.tgz", + "dev": true + }, + "babel-plugin-syntax-class-properties": { + "version": "6.13.0", + "from": "babel-plugin-syntax-class-properties@>=6.8.0 <7.0.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-class-properties/-/babel-plugin-syntax-class-properties-6.13.0.tgz", + "dev": true + }, + "babel-plugin-syntax-decorators": { + "version": "6.13.0", + "from": "babel-plugin-syntax-decorators@>=6.13.0 <7.0.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-decorators/-/babel-plugin-syntax-decorators-6.13.0.tgz", + "dev": true + }, + "babel-plugin-syntax-dynamic-import": { + "version": "6.18.0", + "from": "babel-plugin-syntax-dynamic-import@>=6.18.0 <7.0.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-dynamic-import/-/babel-plugin-syntax-dynamic-import-6.18.0.tgz", + "dev": true + }, + "babel-plugin-syntax-exponentiation-operator": { + "version": "6.13.0", + "from": "babel-plugin-syntax-exponentiation-operator@>=6.8.0 <7.0.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-exponentiation-operator/-/babel-plugin-syntax-exponentiation-operator-6.13.0.tgz", + "dev": true + }, + "babel-plugin-syntax-object-rest-spread": { + "version": "6.13.0", + "from": "babel-plugin-syntax-object-rest-spread@>=6.8.0 <7.0.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-object-rest-spread/-/babel-plugin-syntax-object-rest-spread-6.13.0.tgz", + "dev": true + }, + "babel-plugin-syntax-trailing-function-commas": { + "version": "6.22.0", + "from": "babel-plugin-syntax-trailing-function-commas@>=6.22.0 <7.0.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-trailing-function-commas/-/babel-plugin-syntax-trailing-function-commas-6.22.0.tgz", + "dev": true + }, + "babel-plugin-transform-async-generator-functions": { + "version": "6.24.1", + "from": "babel-plugin-transform-async-generator-functions@>=6.24.1 <7.0.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-async-generator-functions/-/babel-plugin-transform-async-generator-functions-6.24.1.tgz", + "dev": true + }, + "babel-plugin-transform-async-to-generator": { + "version": "6.24.1", + "from": "babel-plugin-transform-async-to-generator@>=6.24.1 <7.0.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-async-to-generator/-/babel-plugin-transform-async-to-generator-6.24.1.tgz", + "dev": true + }, + "babel-plugin-transform-class-properties": { + "version": "6.24.1", + "from": "babel-plugin-transform-class-properties@>=6.22.0 <7.0.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-class-properties/-/babel-plugin-transform-class-properties-6.24.1.tgz", + "dev": true + }, + "babel-plugin-transform-decorators": { + "version": "6.24.1", + "from": "babel-plugin-transform-decorators@>=6.22.0 <7.0.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-decorators/-/babel-plugin-transform-decorators-6.24.1.tgz", + "dev": true + }, + "babel-plugin-transform-es2015-arrow-functions": { + "version": "6.22.0", + "from": "babel-plugin-transform-es2015-arrow-functions@>=6.22.0 <7.0.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-arrow-functions/-/babel-plugin-transform-es2015-arrow-functions-6.22.0.tgz", + "dev": true + }, + "babel-plugin-transform-es2015-block-scoped-functions": { + "version": "6.22.0", + "from": "babel-plugin-transform-es2015-block-scoped-functions@>=6.22.0 <7.0.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-block-scoped-functions/-/babel-plugin-transform-es2015-block-scoped-functions-6.22.0.tgz", + "dev": true + }, + "babel-plugin-transform-es2015-block-scoping": { + "version": "6.24.1", + "from": "babel-plugin-transform-es2015-block-scoping@>=6.22.0 <7.0.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-block-scoping/-/babel-plugin-transform-es2015-block-scoping-6.24.1.tgz", + "dev": true + }, + "babel-plugin-transform-es2015-classes": { + "version": "6.24.1", + "from": "babel-plugin-transform-es2015-classes@>=6.22.0 <7.0.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-classes/-/babel-plugin-transform-es2015-classes-6.24.1.tgz", + "dev": true + }, + "babel-plugin-transform-es2015-computed-properties": { + "version": "6.24.1", + "from": "babel-plugin-transform-es2015-computed-properties@>=6.22.0 <7.0.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-computed-properties/-/babel-plugin-transform-es2015-computed-properties-6.24.1.tgz", + "dev": true + }, + "babel-plugin-transform-es2015-destructuring": { + "version": "6.23.0", + "from": "babel-plugin-transform-es2015-destructuring@>=6.22.0 <7.0.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-destructuring/-/babel-plugin-transform-es2015-destructuring-6.23.0.tgz", + "dev": true + }, + "babel-plugin-transform-es2015-duplicate-keys": { + "version": "6.24.1", + "from": "babel-plugin-transform-es2015-duplicate-keys@>=6.22.0 <7.0.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-duplicate-keys/-/babel-plugin-transform-es2015-duplicate-keys-6.24.1.tgz", + "dev": true + }, + "babel-plugin-transform-es2015-for-of": { + "version": "6.23.0", + "from": "babel-plugin-transform-es2015-for-of@>=6.22.0 <7.0.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-for-of/-/babel-plugin-transform-es2015-for-of-6.23.0.tgz", + "dev": true + }, + "babel-plugin-transform-es2015-function-name": { + "version": "6.24.1", + "from": "babel-plugin-transform-es2015-function-name@>=6.22.0 <7.0.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-function-name/-/babel-plugin-transform-es2015-function-name-6.24.1.tgz", + "dev": true + }, + "babel-plugin-transform-es2015-literals": { + "version": "6.22.0", + "from": "babel-plugin-transform-es2015-literals@>=6.22.0 <7.0.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-literals/-/babel-plugin-transform-es2015-literals-6.22.0.tgz", + "dev": true + }, + "babel-plugin-transform-es2015-modules-amd": { + "version": "6.24.1", + "from": "babel-plugin-transform-es2015-modules-amd@>=6.24.0 <7.0.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-amd/-/babel-plugin-transform-es2015-modules-amd-6.24.1.tgz", + "dev": true + }, + "babel-plugin-transform-es2015-modules-commonjs": { + "version": "6.24.1", + "from": "babel-plugin-transform-es2015-modules-commonjs@>=6.24.0 <7.0.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.24.1.tgz", + "dev": true + }, + "babel-plugin-transform-es2015-modules-systemjs": { + "version": "6.24.1", + "from": "babel-plugin-transform-es2015-modules-systemjs@>=6.22.0 <7.0.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-systemjs/-/babel-plugin-transform-es2015-modules-systemjs-6.24.1.tgz", + "dev": true + }, + "babel-plugin-transform-es2015-modules-umd": { + "version": "6.24.1", + "from": "babel-plugin-transform-es2015-modules-umd@>=6.24.0 <7.0.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-umd/-/babel-plugin-transform-es2015-modules-umd-6.24.1.tgz", + "dev": true + }, + "babel-plugin-transform-es2015-object-super": { + "version": "6.24.1", + "from": "babel-plugin-transform-es2015-object-super@>=6.22.0 <7.0.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-object-super/-/babel-plugin-transform-es2015-object-super-6.24.1.tgz", + "dev": true + }, + "babel-plugin-transform-es2015-parameters": { + "version": "6.24.1", + "from": "babel-plugin-transform-es2015-parameters@>=6.22.0 <7.0.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-parameters/-/babel-plugin-transform-es2015-parameters-6.24.1.tgz", + "dev": true + }, + "babel-plugin-transform-es2015-shorthand-properties": { + "version": "6.24.1", + "from": "babel-plugin-transform-es2015-shorthand-properties@>=6.22.0 <7.0.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-shorthand-properties/-/babel-plugin-transform-es2015-shorthand-properties-6.24.1.tgz", + "dev": true + }, + "babel-plugin-transform-es2015-spread": { + "version": "6.22.0", + "from": "babel-plugin-transform-es2015-spread@>=6.22.0 <7.0.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-spread/-/babel-plugin-transform-es2015-spread-6.22.0.tgz", + "dev": true + }, + "babel-plugin-transform-es2015-sticky-regex": { + "version": "6.24.1", + "from": "babel-plugin-transform-es2015-sticky-regex@>=6.22.0 <7.0.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-sticky-regex/-/babel-plugin-transform-es2015-sticky-regex-6.24.1.tgz", + "dev": true + }, + "babel-plugin-transform-es2015-template-literals": { + "version": "6.22.0", + "from": "babel-plugin-transform-es2015-template-literals@>=6.22.0 <7.0.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-template-literals/-/babel-plugin-transform-es2015-template-literals-6.22.0.tgz", + "dev": true + }, + "babel-plugin-transform-es2015-typeof-symbol": { + "version": "6.23.0", + "from": "babel-plugin-transform-es2015-typeof-symbol@>=6.22.0 <7.0.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-typeof-symbol/-/babel-plugin-transform-es2015-typeof-symbol-6.23.0.tgz", + "dev": true + }, + "babel-plugin-transform-es2015-unicode-regex": { + "version": "6.24.1", + "from": "babel-plugin-transform-es2015-unicode-regex@>=6.22.0 <7.0.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-unicode-regex/-/babel-plugin-transform-es2015-unicode-regex-6.24.1.tgz", + "dev": true + }, + "babel-plugin-transform-exponentiation-operator": { + "version": "6.24.1", + "from": "babel-plugin-transform-exponentiation-operator@>=6.24.1 <7.0.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-exponentiation-operator/-/babel-plugin-transform-exponentiation-operator-6.24.1.tgz", + "dev": true + }, + "babel-plugin-transform-object-rest-spread": { + "version": "6.23.0", + "from": "babel-plugin-transform-object-rest-spread@>=6.22.0 <7.0.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-object-rest-spread/-/babel-plugin-transform-object-rest-spread-6.23.0.tgz", + "dev": true + }, + "babel-plugin-transform-regenerator": { + "version": "6.24.1", + "from": "babel-plugin-transform-regenerator@>=6.22.0 <7.0.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-regenerator/-/babel-plugin-transform-regenerator-6.24.1.tgz", + "dev": true + }, + "babel-plugin-transform-strict-mode": { + "version": "6.24.1", + "from": "babel-plugin-transform-strict-mode@>=6.24.1 <7.0.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.24.1.tgz", + "dev": true + }, + "babel-preset-es2015": { + "version": "6.24.0", + "from": "babel-preset-es2015@>=6.18.0 <7.0.0", + "resolved": "https://registry.npmjs.org/babel-preset-es2015/-/babel-preset-es2015-6.24.0.tgz", + "dev": true + }, + "babel-preset-stage-2": { + "version": "6.22.0", + "from": "babel-preset-stage-2@>=6.18.0 <7.0.0", + "resolved": "https://registry.npmjs.org/babel-preset-stage-2/-/babel-preset-stage-2-6.22.0.tgz", + "dev": true + }, + "babel-preset-stage-3": { + "version": "6.24.1", + "from": "babel-preset-stage-3@>=6.22.0 <7.0.0", + "resolved": "https://registry.npmjs.org/babel-preset-stage-3/-/babel-preset-stage-3-6.24.1.tgz", + "dev": true + }, + "babel-register": { + "version": "6.24.1", + "from": "babel-register@>=6.24.0 <7.0.0", + "resolved": "https://registry.npmjs.org/babel-register/-/babel-register-6.24.1.tgz", + "dev": true, + "dependencies": { + "babel-core": { + "version": "6.24.1", + "from": "babel-core@>=6.24.1 <7.0.0", + "resolved": "https://registry.npmjs.org/babel-core/-/babel-core-6.24.1.tgz", + "dev": true + } + } + }, + "babel-runtime": { + "version": "6.23.0", + "from": "babel-runtime@>=6.22.0 <7.0.0", + "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.23.0.tgz", + "dev": true + }, + "babel-template": { + "version": "6.24.1", + "from": "babel-template@>=6.23.0 <7.0.0", + "resolved": "https://registry.npmjs.org/babel-template/-/babel-template-6.24.1.tgz", + "dev": true + }, + "babel-traverse": { + "version": "6.24.1", + "from": "babel-traverse@>=6.23.1 <7.0.0", + "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.24.1.tgz", + "dev": true + }, + "babel-types": { + "version": "6.24.1", + "from": "babel-types@>=6.23.0 <7.0.0", + "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.24.1.tgz", + "dev": true + }, + "babylon": { + "version": "6.17.0", + "from": "babylon@>=6.11.0 <7.0.0", + "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.17.0.tgz", + "dev": true + }, "balanced-match": { "version": "0.4.2", "from": "balanced-match@>=0.4.1 <0.5.0", @@ -182,6 +764,17 @@ "from": "barycentric@>=1.0.1 <2.0.0", "resolved": "https://registry.npmjs.org/barycentric/-/barycentric-1.0.1.tgz" }, + "base64-js": { + "version": "0.0.2", + "from": "base64-js@0.0.2", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-0.0.2.tgz" + }, + "batch": { + "version": "0.5.3", + "from": "batch@0.5.3", + "resolved": "https://registry.npmjs.org/batch/-/batch-0.5.3.tgz", + "dev": true + }, "bcrypt-pbkdf": { "version": "1.0.0", "from": "bcrypt-pbkdf@>=1.0.0 <2.0.0", @@ -189,15 +782,21 @@ "optional": true }, "big-rat": { - "version": "1.0.3", + "version": "1.0.4", "from": "big-rat@>=1.0.3 <2.0.0", - "resolved": "https://registry.npmjs.org/big-rat/-/big-rat-1.0.3.tgz" + "resolved": "https://registry.npmjs.org/big-rat/-/big-rat-1.0.4.tgz" }, "big.js": { "version": "3.1.3", "from": "big.js@>=3.1.3 <4.0.0", "resolved": "https://registry.npmjs.org/big.js/-/big.js-3.1.3.tgz" }, + "binary-extensions": { + "version": "1.8.0", + "from": "binary-extensions@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.8.0.tgz", + "dev": true + }, "binary-search-bounds": { "version": "1.0.0", "from": "binary-search-bounds@>=1.0.0 <2.0.0", @@ -211,13 +810,43 @@ "bl": { "version": "1.2.0", "from": "bl@>=1.0.0 <2.0.0", - "resolved": "https://registry.npmjs.org/bl/-/bl-1.2.0.tgz" + "resolved": "https://registry.npmjs.org/bl/-/bl-1.2.0.tgz", + "dependencies": { + "readable-stream": { + "version": "2.2.9", + "from": "readable-stream@>=2.0.5 <3.0.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.2.9.tgz" + }, + "string_decoder": { + "version": "1.0.0", + "from": "string_decoder@>=1.0.0 <1.1.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.0.tgz" + } + } + }, + "block-stream": { + "version": "0.0.9", + "from": "block-stream@*", + "resolved": "https://registry.npmjs.org/block-stream/-/block-stream-0.0.9.tgz", + "dev": true + }, + "bluebird": { + "version": "3.5.0", + "from": "bluebird@>=3.4.7 <4.0.0", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.0.tgz", + "dev": true }, "bn.js": { "version": "4.11.6", "from": "bn.js@>=4.11.6 <5.0.0", "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.6.tgz" }, + "boolbase": { + "version": "1.0.0", + "from": "boolbase@>=1.0.0 <1.1.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "dev": true + }, "boom": { "version": "2.10.1", "from": "boom@>=2.0.0 <3.0.0", @@ -226,14 +855,7 @@ "bops": { "version": "0.0.6", "from": "bops@0.0.6", - "resolved": "https://registry.npmjs.org/bops/-/bops-0.0.6.tgz", - "dependencies": { - "base64-js": { - "version": "0.0.2", - "from": "base64-js@0.0.2", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-0.0.2.tgz" - } - } + "resolved": "https://registry.npmjs.org/bops/-/bops-0.0.6.tgz" }, "boundary-cells": { "version": "2.0.1", @@ -255,6 +877,12 @@ "from": "brace-expansion@>=1.0.0 <2.0.0", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.6.tgz" }, + "braces": { + "version": "1.8.5", + "from": "braces@>=1.8.2 <2.0.0", + "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz", + "dev": true + }, "brfs": { "version": "1.4.3", "from": "brfs@>=1.4.0 <2.0.0", @@ -270,6 +898,16 @@ "from": "quote-stream@>=1.0.1 <2.0.0", "resolved": "https://registry.npmjs.org/quote-stream/-/quote-stream-1.0.2.tgz" }, + "readable-stream": { + "version": "2.2.9", + "from": "readable-stream@>=2.1.5 <3.0.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.2.9.tgz" + }, + "string_decoder": { + "version": "1.0.0", + "from": "string_decoder@~1.0.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.0.tgz" + }, "through2": { "version": "2.0.3", "from": "through2@>=2.0.0 <3.0.0", @@ -277,6 +915,38 @@ } } }, + "browserify-aes": { + "version": "0.4.0", + "from": "browserify-aes@0.4.0", + "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-0.4.0.tgz", + "dev": true + }, + "browserify-zlib": { + "version": "0.1.4", + "from": "browserify-zlib@>=0.1.4 <0.2.0", + "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.1.4.tgz", + "dev": true + }, + "browserslist": { + "version": "1.7.7", + "from": "browserslist@>=1.7.6 <2.0.0", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-1.7.7.tgz", + "dev": true + }, + "buffer": { + "version": "4.9.1", + "from": "buffer@>=4.9.0 <5.0.0", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.1.tgz", + "dev": true, + "dependencies": { + "base64-js": { + "version": "1.2.0", + "from": "base64-js@>=1.0.2 <2.0.0", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.2.0.tgz", + "dev": true + } + } + }, "buffer-equal": { "version": "0.0.1", "from": "buffer-equal@0.0.1", @@ -287,6 +957,24 @@ "from": "buffer-shims@>=1.0.0 <2.0.0", "resolved": "https://registry.npmjs.org/buffer-shims/-/buffer-shims-1.0.0.tgz" }, + "builtin-modules": { + "version": "1.1.1", + "from": "builtin-modules@>=1.1.1 <2.0.0", + "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", + "dev": true + }, + "builtin-status-codes": { + "version": "3.0.0", + "from": "builtin-status-codes@>=3.0.0 <4.0.0", + "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", + "dev": true + }, + "bytes": { + "version": "2.3.0", + "from": "bytes@2.3.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-2.3.0.tgz", + "dev": true + }, "call-matcher": { "version": "1.0.1", "from": "call-matcher@>=1.0.1 <2.0.0", @@ -299,11 +987,61 @@ } } }, + "caller-path": { + "version": "0.1.0", + "from": "caller-path@>=0.1.0 <0.2.0", + "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-0.1.0.tgz", + "dev": true + }, + "callsites": { + "version": "0.2.0", + "from": "callsites@>=0.2.0 <0.3.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-0.2.0.tgz", + "dev": true + }, + "camel-case": { + "version": "3.0.0", + "from": "camel-case@>=3.0.0 <3.1.0", + "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-3.0.0.tgz", + "dev": true + }, "camelcase": { "version": "1.2.1", "from": "camelcase@>=1.0.2 <2.0.0", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz" }, + "camelcase-keys": { + "version": "2.1.0", + "from": "camelcase-keys@>=2.0.0 <3.0.0", + "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz", + "dev": true, + "dependencies": { + "camelcase": { + "version": "2.1.1", + "from": "camelcase@>=2.0.0 <3.0.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz", + "dev": true + } + } + }, + "caniuse-api": { + "version": "1.6.1", + "from": "caniuse-api@>=1.5.2 <2.0.0", + "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-1.6.1.tgz", + "dev": true + }, + "caniuse-db": { + "version": "1.0.30000664", + "from": "caniuse-db@>=1.0.30000634 <2.0.0", + "resolved": "https://registry.npmjs.org/caniuse-db/-/caniuse-db-1.0.30000664.tgz", + "dev": true + }, + "cardinal": { + "version": "1.0.0", + "from": "cardinal@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/cardinal/-/cardinal-1.0.0.tgz", + "dev": true + }, "caseless": { "version": "0.11.0", "from": "caseless@>=0.11.0 <0.12.0", @@ -343,6 +1081,18 @@ } } }, + "chokidar": { + "version": "1.6.1", + "from": "chokidar@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-1.6.1.tgz", + "dev": true + }, + "circular-json": { + "version": "0.3.1", + "from": "circular-json@>=0.3.1 <0.4.0", + "resolved": "https://registry.npmjs.org/circular-json/-/circular-json-0.3.1.tgz", + "dev": true + }, "circumcenter": { "version": "1.0.0", "from": "circumcenter@>=1.0.0 <2.0.0", @@ -358,11 +1108,55 @@ "from": "clamp@>=1.0.1 <2.0.0", "resolved": "https://registry.npmjs.org/clamp/-/clamp-1.0.1.tgz" }, + "clap": { + "version": "1.1.3", + "from": "clap@>=1.0.9 <2.0.0", + "resolved": "https://registry.npmjs.org/clap/-/clap-1.1.3.tgz", + "dev": true + }, + "clean-css": { + "version": "4.0.12", + "from": "clean-css@>=4.0.0 <4.1.0", + "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-4.0.12.tgz", + "dev": true + }, "clean-pslg": { "version": "1.1.2", "from": "clean-pslg@>=1.1.0 <2.0.0", "resolved": "https://registry.npmjs.org/clean-pslg/-/clean-pslg-1.1.2.tgz" }, + "cli-cursor": { + "version": "1.0.2", + "from": "cli-cursor@>=1.0.1 <2.0.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-1.0.2.tgz", + "dev": true + }, + "cli-table": { + "version": "0.3.1", + "from": "cli-table@>=0.3.1 <0.4.0", + "resolved": "https://registry.npmjs.org/cli-table/-/cli-table-0.3.1.tgz", + "dev": true, + "dependencies": { + "colors": { + "version": "1.0.3", + "from": "colors@1.0.3", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.0.3.tgz", + "dev": true + } + } + }, + "cli-usage": { + "version": "0.1.4", + "from": "cli-usage@>=0.1.1 <0.2.0", + "resolved": "https://registry.npmjs.org/cli-usage/-/cli-usage-0.1.4.tgz", + "dev": true + }, + "cli-width": { + "version": "2.1.0", + "from": "cli-width@>=2.0.0 <3.0.0", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.1.0.tgz", + "dev": true + }, "cliui": { "version": "2.1.0", "from": "cliui@>=2.1.0 <3.0.0", @@ -380,6 +1174,36 @@ "from": "clone@>=1.0.2 <2.0.0", "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.2.tgz" }, + "co": { + "version": "4.6.0", + "from": "co@>=4.6.0 <5.0.0", + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "dev": true + }, + "coa": { + "version": "1.0.1", + "from": "coa@>=1.0.1 <1.1.0", + "resolved": "https://registry.npmjs.org/coa/-/coa-1.0.1.tgz", + "dev": true + }, + "code-point-at": { + "version": "1.1.0", + "from": "code-point-at@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", + "dev": true + }, + "color": { + "version": "0.11.4", + "from": "color@>=0.11.0 <0.12.0", + "resolved": "https://registry.npmjs.org/color/-/color-0.11.4.tgz", + "dev": true + }, + "color-convert": { + "version": "1.9.0", + "from": "color-convert@>=1.3.0 <2.0.0", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.0.tgz", + "dev": true + }, "color-id": { "version": "1.0.3", "from": "color-id@>=1.0.0 <2.0.0", @@ -405,11 +1229,28 @@ "from": "color-space@>=1.14.6 <2.0.0", "resolved": "https://registry.npmjs.org/color-space/-/color-space-1.14.7.tgz" }, + "color-string": { + "version": "0.3.0", + "from": "color-string@>=0.3.0 <0.4.0", + "resolved": "https://registry.npmjs.org/color-string/-/color-string-0.3.0.tgz", + "dev": true + }, "colormap": { "version": "2.2.0", "from": "colormap@>=2.1.0 <3.0.0", "resolved": "https://registry.npmjs.org/colormap/-/colormap-2.2.0.tgz" }, + "colormin": { + "version": "1.1.2", + "from": "colormin@>=1.0.5 <2.0.0", + "resolved": "https://registry.npmjs.org/colormin/-/colormin-1.1.2.tgz", + "dev": true + }, + "colors": { + "version": "0.6.2", + "from": "colors@>=0.6.0-1 <0.7.0", + "resolved": "https://registry.npmjs.org/colors/-/colors-0.6.2.tgz" + }, "combined-stream": { "version": "1.0.5", "from": "combined-stream@>=1.0.5 <1.1.0", @@ -420,6 +1261,12 @@ "from": "commander@>=2.9.0 <2.10.0", "resolved": "https://registry.npmjs.org/commander/-/commander-2.9.0.tgz" }, + "commondir": { + "version": "1.0.1", + "from": "commondir@>=1.0.1 <2.0.0", + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "dev": true + }, "compare-angle": { "version": "1.0.1", "from": "compare-angle@>=1.0.0 <2.0.0", @@ -435,6 +1282,26 @@ "from": "compare-oriented-cell@>=1.0.1 <2.0.0", "resolved": "https://registry.npmjs.org/compare-oriented-cell/-/compare-oriented-cell-1.0.1.tgz" }, + "compressible": { + "version": "2.0.10", + "from": "compressible@>=2.0.8 <2.1.0", + "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.10.tgz", + "dev": true, + "dependencies": { + "mime-db": { + "version": "1.27.0", + "from": "mime-db@>=1.27.0 <2.0.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.27.0.tgz", + "dev": true + } + } + }, + "compression": { + "version": "1.6.2", + "from": "compression@>=1.5.2 <2.0.0", + "resolved": "https://registry.npmjs.org/compression/-/compression-1.6.2.tgz", + "dev": true + }, "concat-map": { "version": "0.0.1", "from": "concat-map@0.0.1", @@ -457,6 +1324,48 @@ } } }, + "connect-history-api-fallback": { + "version": "1.3.0", + "from": "connect-history-api-fallback@>=1.3.0 <2.0.0", + "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-1.3.0.tgz", + "dev": true + }, + "console-browserify": { + "version": "1.1.0", + "from": "console-browserify@>=1.1.0 <2.0.0", + "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.1.0.tgz", + "dev": true + }, + "console-control-strings": { + "version": "1.1.0", + "from": "console-control-strings@>=1.1.0 <1.2.0", + "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", + "dev": true + }, + "constants-browserify": { + "version": "1.0.0", + "from": "constants-browserify@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", + "dev": true + }, + "contains-path": { + "version": "0.1.0", + "from": "contains-path@>=0.1.0 <0.2.0", + "resolved": "https://registry.npmjs.org/contains-path/-/contains-path-0.1.0.tgz", + "dev": true + }, + "content-disposition": { + "version": "0.5.2", + "from": "content-disposition@0.5.2", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz", + "dev": true + }, + "content-type": { + "version": "1.0.2", + "from": "content-type@>=1.0.2 <1.1.0", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.2.tgz", + "dev": true + }, "convert-source-map": { "version": "1.3.0", "from": "convert-source-map@>=1.1.0 <2.0.0", @@ -467,6 +1376,18 @@ "from": "convex-hull@>=1.0.3 <2.0.0", "resolved": "https://registry.npmjs.org/convex-hull/-/convex-hull-1.0.3.tgz" }, + "cookie": { + "version": "0.3.1", + "from": "cookie@0.3.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz", + "dev": true + }, + "cookie-signature": { + "version": "1.0.6", + "from": "cookie-signature@1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "dev": true + }, "core-js": { "version": "2.4.1", "from": "core-js@>=2.4.0 <3.0.0", @@ -487,21 +1408,95 @@ "from": "country-regex@>=1.1.0 <2.0.0", "resolved": "https://registry.npmjs.org/country-regex/-/country-regex-1.1.0.tgz" }, + "cross-spawn": { + "version": "3.0.1", + "from": "cross-spawn@>=3.0.0 <4.0.0", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-3.0.1.tgz", + "dev": true + }, "cryptiles": { "version": "2.0.5", "from": "cryptiles@>=2.0.0 <3.0.0", "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-2.0.5.tgz" }, + "crypto-browserify": { + "version": "3.3.0", + "from": "crypto-browserify@3.3.0", + "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.3.0.tgz", + "dev": true + }, + "css-color-names": { + "version": "0.0.4", + "from": "css-color-names@0.0.4", + "resolved": "https://registry.npmjs.org/css-color-names/-/css-color-names-0.0.4.tgz", + "dev": true + }, + "css-loader": { + "version": "0.25.0", + "from": "css-loader@>=0.25.0 <0.26.0", + "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-0.25.0.tgz", + "dev": true + }, + "css-select": { + "version": "1.2.0", + "from": "css-select@>=1.1.0 <2.0.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-1.2.0.tgz", + "dev": true + }, + "css-selector-tokenizer": { + "version": "0.6.0", + "from": "css-selector-tokenizer@>=0.6.0 <0.7.0", + "resolved": "https://registry.npmjs.org/css-selector-tokenizer/-/css-selector-tokenizer-0.6.0.tgz", + "dev": true, + "dependencies": { + "regexpu-core": { + "version": "1.0.0", + "from": "regexpu-core@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-1.0.0.tgz", + "dev": true + } + } + }, + "css-what": { + "version": "2.1.0", + "from": "css-what@>=2.1.0 <2.2.0", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-2.1.0.tgz", + "dev": true + }, "csscolorparser": { "version": "1.0.3", "from": "csscolorparser@>=1.0.2 <2.0.0", "resolved": "https://registry.npmjs.org/csscolorparser/-/csscolorparser-1.0.3.tgz" }, + "cssesc": { + "version": "0.1.0", + "from": "cssesc@>=0.1.0 <0.2.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-0.1.0.tgz", + "dev": true + }, + "cssnano": { + "version": "3.10.0", + "from": "cssnano@>=2.6.1 <4.0.0", + "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-3.10.0.tgz", + "dev": true + }, + "csso": { + "version": "2.3.2", + "from": "csso@>=2.3.1 <2.4.0", + "resolved": "https://registry.npmjs.org/csso/-/csso-2.3.2.tgz", + "dev": true + }, "cubic-hermite": { "version": "1.0.0", "from": "cubic-hermite@>=1.0.0 <2.0.0", "resolved": "https://registry.npmjs.org/cubic-hermite/-/cubic-hermite-1.0.0.tgz" }, + "currently-unhandled": { + "version": "0.4.1", + "from": "currently-unhandled@>=0.4.1 <0.5.0", + "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz", + "dev": true + }, "cwise": { "version": "1.0.10", "from": "cwise@>=1.0.3 <2.0.0", @@ -515,14 +1510,13 @@ "cwise-parser": { "version": "1.0.3", "from": "cwise-parser@>=1.0.0 <2.0.0", - "resolved": "https://registry.npmjs.org/cwise-parser/-/cwise-parser-1.0.3.tgz", - "dependencies": { - "esprima": { - "version": "1.2.5", - "from": "esprima@>=1.0.3 <2.0.0", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-1.2.5.tgz" - } - } + "resolved": "https://registry.npmjs.org/cwise-parser/-/cwise-parser-1.0.3.tgz" + }, + "d": { + "version": "1.0.0", + "from": "d@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/d/-/d-1.0.0.tgz", + "dev": true }, "d3": { "version": "3.5.17", @@ -551,6 +1545,12 @@ } } }, + "date-now": { + "version": "0.1.4", + "from": "date-now@>=0.1.4 <0.2.0", + "resolved": "https://registry.npmjs.org/date-now/-/date-now-0.1.4.tgz", + "dev": true + }, "debug": { "version": "2.2.0", "from": "debug@latest", @@ -581,6 +1581,12 @@ "from": "defined@>=1.0.0 <2.0.0", "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.0.tgz" }, + "del": { + "version": "2.2.2", + "from": "del@>=2.0.2 <3.0.0", + "resolved": "https://registry.npmjs.org/del/-/del-2.2.2.tgz", + "dev": true + }, "delaunay-triangulate": { "version": "1.1.6", "from": "delaunay-triangulate@>=1.1.6 <2.0.0", @@ -591,6 +1597,88 @@ "from": "delayed-stream@>=1.0.0 <1.1.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz" }, + "delegates": { + "version": "1.0.0", + "from": "delegates@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", + "dev": true + }, + "depd": { + "version": "1.1.0", + "from": "depd@>=1.1.0 <1.2.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.0.tgz", + "dev": true + }, + "destroy": { + "version": "1.0.4", + "from": "destroy@>=1.0.4 <1.1.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", + "dev": true + }, + "detect-indent": { + "version": "4.0.0", + "from": "detect-indent@>=4.0.0 <5.0.0", + "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-4.0.0.tgz", + "dev": true + }, + "doctrine": { + "version": "2.0.0", + "from": "doctrine@>=2.0.0 <3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.0.0.tgz", + "dev": true + }, + "dom-converter": { + "version": "0.1.4", + "from": "dom-converter@>=0.1.0 <0.2.0", + "resolved": "https://registry.npmjs.org/dom-converter/-/dom-converter-0.1.4.tgz", + "dev": true, + "dependencies": { + "utila": { + "version": "0.3.3", + "from": "utila@>=0.3.0 <0.4.0", + "resolved": "https://registry.npmjs.org/utila/-/utila-0.3.3.tgz", + "dev": true + } + } + }, + "dom-serializer": { + "version": "0.1.0", + "from": "dom-serializer@>=0.0.0 <1.0.0", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.1.0.tgz", + "dev": true, + "dependencies": { + "domelementtype": { + "version": "1.1.3", + "from": "domelementtype@>=1.1.1 <1.2.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.1.3.tgz", + "dev": true + } + } + }, + "domain-browser": { + "version": "1.1.7", + "from": "domain-browser@>=1.1.1 <2.0.0", + "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.1.7.tgz", + "dev": true + }, + "domelementtype": { + "version": "1.3.0", + "from": "domelementtype@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.0.tgz", + "dev": true + }, + "domhandler": { + "version": "2.1.0", + "from": "domhandler@>=2.1.0 <2.2.0", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.1.0.tgz", + "dev": true + }, + "domutils": { + "version": "1.5.1", + "from": "domutils@1.5.1", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.5.1.tgz", + "dev": true + }, "double-bits": { "version": "1.1.1", "from": "double-bits@>=1.1.1 <2.0.0", @@ -634,11 +1722,61 @@ "from": "edges-to-adjacency-list@>=1.0.0 <2.0.0", "resolved": "https://registry.npmjs.org/edges-to-adjacency-list/-/edges-to-adjacency-list-1.0.0.tgz" }, + "ee-first": { + "version": "1.1.1", + "from": "ee-first@1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "dev": true + }, + "electron-to-chromium": { + "version": "1.3.8", + "from": "electron-to-chromium@>=1.2.7 <2.0.0", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.8.tgz", + "dev": true + }, "emojis-list": { "version": "2.1.0", "from": "emojis-list@>=2.0.0 <3.0.0", "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz" }, + "encodeurl": { + "version": "1.0.1", + "from": "encodeurl@>=1.0.1 <1.1.0", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.1.tgz", + "dev": true + }, + "enhanced-resolve": { + "version": "0.9.1", + "from": "enhanced-resolve@>=0.9.0 <0.10.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-0.9.1.tgz", + "dev": true, + "dependencies": { + "memory-fs": { + "version": "0.2.0", + "from": "memory-fs@>=0.2.0 <0.3.0", + "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.2.0.tgz", + "dev": true + } + } + }, + "entities": { + "version": "1.1.1", + "from": "entities@>=1.1.1 <1.2.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.1.tgz", + "dev": true + }, + "errno": { + "version": "0.1.4", + "from": "errno@>=0.1.3 <0.2.0", + "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.4.tgz", + "dev": true + }, + "error-ex": { + "version": "1.3.1", + "from": "error-ex@>=1.2.0 <2.0.0", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.1.tgz", + "dev": true + }, "es-abstract": { "version": "1.7.0", "from": "es-abstract@>=1.5.0 <2.0.0", @@ -649,11 +1787,53 @@ "from": "es-to-primitive@>=1.1.1 <2.0.0", "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.1.1.tgz" }, + "es5-ext": { + "version": "0.10.15", + "from": "es5-ext@>=0.10.14 <0.11.0", + "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.15.tgz", + "dev": true + }, + "es6-iterator": { + "version": "2.0.1", + "from": "es6-iterator@>=2.0.1 <2.1.0", + "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.1.tgz", + "dev": true + }, + "es6-map": { + "version": "0.1.5", + "from": "es6-map@>=0.1.3 <0.2.0", + "resolved": "https://registry.npmjs.org/es6-map/-/es6-map-0.1.5.tgz", + "dev": true + }, "es6-promise": { "version": "3.3.1", "from": "es6-promise@>=3.0.2 <4.0.0", "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-3.3.1.tgz" }, + "es6-set": { + "version": "0.1.5", + "from": "es6-set@>=0.1.5 <0.2.0", + "resolved": "https://registry.npmjs.org/es6-set/-/es6-set-0.1.5.tgz", + "dev": true + }, + "es6-symbol": { + "version": "3.1.1", + "from": "es6-symbol@>=3.1.1 <3.2.0", + "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.1.tgz", + "dev": true + }, + "es6-weak-map": { + "version": "2.0.2", + "from": "es6-weak-map@>=2.0.1 <3.0.0", + "resolved": "https://registry.npmjs.org/es6-weak-map/-/es6-weak-map-2.0.2.tgz", + "dev": true + }, + "escape-html": { + "version": "1.0.3", + "from": "escape-html@>=1.0.3 <1.1.0", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "dev": true + }, "escape-string-regexp": { "version": "1.0.5", "from": "escape-string-regexp@>=1.0.2 <2.0.0", @@ -664,11 +1844,6 @@ "from": "escodegen@>=1.3.2 <1.4.0", "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.3.3.tgz", "dependencies": { - "esprima": { - "version": "1.1.1", - "from": "esprima@>=1.1.1 <1.2.0", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-1.1.1.tgz" - }, "esutils": { "version": "1.0.0", "from": "esutils@>=1.0.0 <1.1.0", @@ -682,16 +1857,144 @@ } } }, + "escope": { + "version": "3.6.0", + "from": "escope@>=3.6.0 <4.0.0", + "resolved": "https://registry.npmjs.org/escope/-/escope-3.6.0.tgz", + "dev": true, + "dependencies": { + "estraverse": { + "version": "4.2.0", + "from": "estraverse@>=4.1.1 <5.0.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz", + "dev": true + } + } + }, + "eslint": { + "version": "3.19.0", + "from": "eslint@>=3.9.0 <4.0.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-3.19.0.tgz", + "dev": true, + "dependencies": { + "concat-stream": { + "version": "1.6.0", + "from": "concat-stream@>=1.5.2 <2.0.0", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.0.tgz", + "dev": true + }, + "estraverse": { + "version": "4.2.0", + "from": "estraverse@>=4.2.0 <5.0.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz", + "dev": true + }, + "readable-stream": { + "version": "2.2.6", + "from": "readable-stream@>=2.2.2 <3.0.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.2.6.tgz", + "dev": true + } + } + }, + "eslint-config-airbnb-base": { + "version": "9.0.0", + "from": "eslint-config-airbnb-base@>=9.0.0 <10.0.0", + "resolved": "https://registry.npmjs.org/eslint-config-airbnb-base/-/eslint-config-airbnb-base-9.0.0.tgz", + "dev": true + }, + "eslint-import-resolver-node": { + "version": "0.2.3", + "from": "eslint-import-resolver-node@>=0.2.0 <0.3.0", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.2.3.tgz", + "dev": true + }, + "eslint-loader": { + "version": "1.7.1", + "from": "eslint-loader@>=1.6.0 <2.0.0", + "resolved": "https://registry.npmjs.org/eslint-loader/-/eslint-loader-1.7.1.tgz", + "dev": true, + "dependencies": { + "loader-utils": { + "version": "1.1.0", + "from": "loader-utils@>=1.0.2 <2.0.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.1.0.tgz", + "dev": true + } + } + }, + "eslint-module-utils": { + "version": "2.0.0", + "from": "eslint-module-utils@>=2.0.0 <3.0.0", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.0.0.tgz", + "dev": true + }, + "eslint-plugin-import": { + "version": "2.2.0", + "from": "eslint-plugin-import@>=2.0.1 <3.0.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.2.0.tgz", + "dev": true, + "dependencies": { + "doctrine": { + "version": "1.5.0", + "from": "doctrine@1.5.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-1.5.0.tgz", + "dev": true + } + } + }, + "espree": { + "version": "3.4.2", + "from": "espree@>=3.4.0 <4.0.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-3.4.2.tgz", + "dev": true, + "dependencies": { + "acorn": { + "version": "5.0.3", + "from": "acorn@>=5.0.1 <6.0.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.0.3.tgz", + "dev": true + } + } + }, "esprima": { - "version": "2.7.3", - "from": "esprima@>=2.6.0 <3.0.0", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz" + "version": "1.1.1", + "from": "esprima@>=1.1.1 <1.2.0", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-1.1.1.tgz" }, "espurify": { "version": "1.7.0", "from": "espurify@>=1.3.0 <2.0.0", "resolved": "https://registry.npmjs.org/espurify/-/espurify-1.7.0.tgz" }, + "esquery": { + "version": "1.0.0", + "from": "esquery@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.0.0.tgz", + "dev": true, + "dependencies": { + "estraverse": { + "version": "4.2.0", + "from": "estraverse@>=4.0.0 <5.0.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz", + "dev": true + } + } + }, + "esrecurse": { + "version": "4.1.0", + "from": "esrecurse@>=4.1.0 <5.0.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.1.0.tgz", + "dev": true, + "dependencies": { + "estraverse": { + "version": "4.1.1", + "from": "estraverse@>=4.1.0 <4.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.1.1.tgz", + "dev": true + } + } + }, "estraverse": { "version": "1.5.1", "from": "estraverse@>=1.5.0 <1.6.0", @@ -702,21 +2005,95 @@ "from": "esutils@>=2.0.2 <3.0.0", "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz" }, + "etag": { + "version": "1.8.0", + "from": "etag@>=1.8.0 <1.9.0", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.0.tgz", + "dev": true + }, + "event-emitter": { + "version": "0.3.5", + "from": "event-emitter@>=0.3.5 <0.4.0", + "resolved": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.5.tgz", + "dev": true + }, + "eventemitter3": { + "version": "1.2.0", + "from": "eventemitter3@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-1.2.0.tgz", + "dev": true + }, "events": { "version": "1.1.1", "from": "events@>=1.0.0 <2.0.0", "resolved": "https://registry.npmjs.org/events/-/events-1.1.1.tgz" }, + "eventsource": { + "version": "0.1.6", + "from": "eventsource@0.1.6", + "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-0.1.6.tgz", + "dev": true + }, + "exit-hook": { + "version": "1.1.1", + "from": "exit-hook@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/exit-hook/-/exit-hook-1.1.1.tgz", + "dev": true + }, + "expand-brackets": { + "version": "0.1.5", + "from": "expand-brackets@>=0.1.4 <0.2.0", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", + "dev": true + }, + "expand-range": { + "version": "1.8.2", + "from": "expand-range@>=1.8.1 <2.0.0", + "resolved": "https://registry.npmjs.org/expand-range/-/expand-range-1.8.2.tgz", + "dev": true + }, + "express": { + "version": "4.15.2", + "from": "express@>=4.13.3 <5.0.0", + "resolved": "https://registry.npmjs.org/express/-/express-4.15.2.tgz", + "dev": true, + "dependencies": { + "debug": { + "version": "2.6.1", + "from": "debug@2.6.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.1.tgz", + "dev": true + }, + "ms": { + "version": "0.7.2", + "from": "ms@0.7.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.2.tgz", + "dev": true + } + } + }, "extend": { "version": "3.0.0", "from": "extend@>=3.0.0 <3.1.0", "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.0.tgz" }, + "extglob": { + "version": "0.3.2", + "from": "extglob@>=0.3.1 <0.4.0", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", + "dev": true + }, "extract-frustum-planes": { "version": "1.0.0", "from": "extract-frustum-planes@>=1.0.0 <2.0.0", "resolved": "https://registry.npmjs.org/extract-frustum-planes/-/extract-frustum-planes-1.0.0.tgz" }, + "extract-text-webpack-plugin": { + "version": "1.0.1", + "from": "extract-text-webpack-plugin@>=1.0.1 <2.0.0", + "resolved": "https://registry.npmjs.org/extract-text-webpack-plugin/-/extract-text-webpack-plugin-1.0.1.tgz", + "dev": true + }, "extsprintf": { "version": "1.0.2", "from": "extsprintf@1.0.2", @@ -727,11 +2104,6 @@ "from": "falafel@>=1.0.0 <2.0.0", "resolved": "https://registry.npmjs.org/falafel/-/falafel-1.2.0.tgz", "dependencies": { - "acorn": { - "version": "1.2.2", - "from": "acorn@>=1.0.3 <2.0.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-1.2.2.tgz" - }, "isarray": { "version": "0.0.1", "from": "isarray@0.0.1", @@ -749,26 +2121,95 @@ "from": "fast-levenshtein@>=2.0.4 <2.1.0", "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz" }, + "fastparse": { + "version": "1.1.1", + "from": "fastparse@>=1.1.1 <2.0.0", + "resolved": "https://registry.npmjs.org/fastparse/-/fastparse-1.1.1.tgz", + "dev": true + }, + "faye-websocket": { + "version": "0.10.0", + "from": "faye-websocket@>=0.10.0 <0.11.0", + "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.10.0.tgz", + "dev": true + }, "feature-filter": { "version": "2.2.0", "from": "feature-filter@>=2.2.0 <3.0.0", "resolved": "https://registry.npmjs.org/feature-filter/-/feature-filter-2.2.0.tgz" }, + "figures": { + "version": "1.7.0", + "from": "figures@>=1.3.5 <2.0.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-1.7.0.tgz", + "dev": true + }, + "file-entry-cache": { + "version": "2.0.0", + "from": "file-entry-cache@>=2.0.0 <3.0.0", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-2.0.0.tgz", + "dev": true + }, + "file-loader": { + "version": "0.9.0", + "from": "file-loader@>=0.9.0 <0.10.0", + "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-0.9.0.tgz", + "dev": true + }, + "filename-regex": { + "version": "2.0.1", + "from": "filename-regex@>=2.0.0 <3.0.0", + "resolved": "https://registry.npmjs.org/filename-regex/-/filename-regex-2.0.1.tgz", + "dev": true + }, + "fill-range": { + "version": "2.2.3", + "from": "fill-range@>=2.1.0 <3.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.3.tgz", + "dev": true + }, "filtered-vector": { "version": "1.2.4", "from": "filtered-vector@>=1.2.1 <2.0.0", "resolved": "https://registry.npmjs.org/filtered-vector/-/filtered-vector-1.2.4.tgz" }, + "finalhandler": { + "version": "1.0.2", + "from": "finalhandler@>=1.0.0 <1.1.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.0.2.tgz", + "dev": true, + "dependencies": { + "debug": { + "version": "2.6.4", + "from": "debug@2.6.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.4.tgz", + "dev": true + }, + "ms": { + "version": "0.7.3", + "from": "ms@0.7.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.3.tgz", + "dev": true + } + } + }, + "find-cache-dir": { + "version": "0.1.1", + "from": "find-cache-dir@>=0.1.1 <0.2.0", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-0.1.1.tgz", + "dev": true + }, + "find-up": { + "version": "1.1.2", + "from": "find-up@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", + "dev": true + }, "findup": { "version": "0.1.5", "from": "findup@>=0.1.5 <0.2.0", "resolved": "https://registry.npmjs.org/findup/-/findup-0.1.5.tgz", "dependencies": { - "colors": { - "version": "0.6.2", - "from": "colors@>=0.6.0-1 <0.7.0", - "resolved": "https://registry.npmjs.org/colors/-/colors-0.6.2.tgz" - }, "commander": { "version": "2.1.0", "from": "commander@>=2.1.0 <2.2.0", @@ -776,10 +2217,22 @@ } } }, + "flat-cache": { + "version": "1.2.2", + "from": "flat-cache@>=1.2.1 <2.0.0", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-1.2.2.tgz", + "dev": true + }, + "flatten": { + "version": "1.0.2", + "from": "flatten@>=1.0.2 <2.0.0", + "resolved": "https://registry.npmjs.org/flatten/-/flatten-1.0.2.tgz", + "dev": true + }, "font-atlas-sdf": { - "version": "1.1.3", + "version": "1.2.0", "from": "font-atlas-sdf@>=1.0.0 <2.0.0", - "resolved": "https://registry.npmjs.org/font-atlas-sdf/-/font-atlas-sdf-1.1.3.tgz" + "resolved": "https://registry.npmjs.org/font-atlas-sdf/-/font-atlas-sdf-1.2.0.tgz" }, "font-awesome": { "version": "4.7.0", @@ -791,6 +2244,18 @@ "from": "for-each@>=0.3.2 <0.4.0", "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.2.tgz" }, + "for-in": { + "version": "1.0.2", + "from": "for-in@>=1.0.1 <2.0.0", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", + "dev": true + }, + "for-own": { + "version": "0.1.5", + "from": "for-own@>=0.1.4 <0.2.0", + "resolved": "https://registry.npmjs.org/for-own/-/for-own-0.1.5.tgz", + "dev": true + }, "foreach": { "version": "2.0.5", "from": "foreach@>=2.0.5 <3.0.0", @@ -806,11 +2271,29 @@ "from": "form-data@>=2.1.1 <2.2.0", "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.1.2.tgz" }, + "forwarded": { + "version": "0.1.0", + "from": "forwarded@>=0.1.0 <0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.0.tgz", + "dev": true + }, + "fresh": { + "version": "0.5.0", + "from": "fresh@0.5.0", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.0.tgz", + "dev": true + }, "fs.realpath": { "version": "1.0.0", "from": "fs.realpath@>=1.0.0 <2.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz" }, + "fstream": { + "version": "1.0.11", + "from": "fstream@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.11.tgz", + "dev": true + }, "function-bind": { "version": "1.1.0", "from": "function-bind@>=1.0.2 <2.0.0", @@ -826,6 +2309,18 @@ "from": "gamma@>=0.1.0 <0.2.0", "resolved": "https://registry.npmjs.org/gamma/-/gamma-0.1.0.tgz" }, + "gauge": { + "version": "2.7.4", + "from": "gauge@>=2.7.1 <2.8.0", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", + "dev": true + }, + "gaze": { + "version": "1.1.2", + "from": "gaze@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/gaze/-/gaze-1.1.2.tgz", + "dev": true + }, "generate-function": { "version": "2.0.0", "from": "generate-function@>=2.0.0 <3.0.0", @@ -863,11 +2358,23 @@ "from": "geojson-vt@>=2.4.0 <3.0.0", "resolved": "https://registry.npmjs.org/geojson-vt/-/geojson-vt-2.4.0.tgz" }, + "get-caller-file": { + "version": "1.0.2", + "from": "get-caller-file@>=1.0.1 <2.0.0", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.2.tgz", + "dev": true + }, "get-canvas-context": { "version": "1.0.2", "from": "get-canvas-context@>=1.0.1 <2.0.0", "resolved": "https://registry.npmjs.org/get-canvas-context/-/get-canvas-context-1.0.2.tgz" }, + "get-stdin": { + "version": "4.0.1", + "from": "get-stdin@>=4.0.1 <5.0.0", + "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz", + "dev": true + }, "getpass": { "version": "0.1.6", "from": "getpass@>=0.1.1 <0.2.0", @@ -900,20 +2407,10 @@ "from": "glslify-bundle@>=2.0.4 <3.0.0", "resolved": "https://registry.npmjs.org/glslify-bundle/-/glslify-bundle-2.0.4.tgz" }, - "isarray": { - "version": "0.0.1", - "from": "isarray@0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz" - }, "minimist": { "version": "1.2.0", "from": "minimist@^1.1.0", "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz" - }, - "readable-stream": { - "version": "1.0.34", - "from": "readable-stream@~1.0.26", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz" } } }, @@ -959,20 +2456,10 @@ "from": "glslify-bundle@>=2.0.4 <3.0.0", "resolved": "https://registry.npmjs.org/glslify-bundle/-/glslify-bundle-2.0.4.tgz" }, - "isarray": { - "version": "0.0.1", - "from": "isarray@0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz" - }, "minimist": { "version": "1.2.0", "from": "minimist@^1.1.0", "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz" - }, - "readable-stream": { - "version": "1.0.34", - "from": "readable-stream@~1.0.26", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz" } } }, @@ -996,20 +2483,10 @@ "from": "glslify-bundle@>=2.0.4 <3.0.0", "resolved": "https://registry.npmjs.org/glslify-bundle/-/glslify-bundle-2.0.4.tgz" }, - "isarray": { - "version": "0.0.1", - "from": "isarray@0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz" - }, "minimist": { "version": "1.2.0", "from": "minimist@^1.1.0", "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz" - }, - "readable-stream": { - "version": "1.0.34", - "from": "readable-stream@~1.0.26", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz" } } }, @@ -1055,20 +2532,10 @@ "from": "glslify-bundle@>=2.0.4 <3.0.0", "resolved": "https://registry.npmjs.org/glslify-bundle/-/glslify-bundle-2.0.4.tgz" }, - "isarray": { - "version": "0.0.1", - "from": "isarray@0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz" - }, "minimist": { "version": "1.2.0", "from": "minimist@^1.1.0", "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz" - }, - "readable-stream": { - "version": "1.0.34", - "from": "readable-stream@~1.0.26", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz" } } }, @@ -1092,20 +2559,10 @@ "from": "glslify-bundle@>=2.0.4 <3.0.0", "resolved": "https://registry.npmjs.org/glslify-bundle/-/glslify-bundle-2.0.4.tgz" }, - "isarray": { - "version": "0.0.1", - "from": "isarray@0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz" - }, "minimist": { "version": "1.2.0", "from": "minimist@^1.1.0", "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz" - }, - "readable-stream": { - "version": "1.0.34", - "from": "readable-stream@~1.0.26", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz" } } }, @@ -1154,20 +2611,10 @@ "from": "glslify-bundle@>=2.0.4 <3.0.0", "resolved": "https://registry.npmjs.org/glslify-bundle/-/glslify-bundle-2.0.4.tgz" }, - "isarray": { - "version": "0.0.1", - "from": "isarray@0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz" - }, "minimist": { "version": "1.2.0", "from": "minimist@^1.1.0", "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz" - }, - "readable-stream": { - "version": "1.0.34", - "from": "readable-stream@~1.0.26", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz" } } }, @@ -1201,27 +2648,17 @@ "from": "glslify-bundle@>=2.0.4 <3.0.0", "resolved": "https://registry.npmjs.org/glslify-bundle/-/glslify-bundle-2.0.4.tgz" }, - "isarray": { - "version": "0.0.1", - "from": "isarray@0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz" - }, "minimist": { "version": "1.2.0", "from": "minimist@^1.1.0", "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz" - }, - "readable-stream": { - "version": "1.0.34", - "from": "readable-stream@~1.0.26", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz" } } }, "gl-plot3d": { - "version": "1.5.3", - "from": "gl-plot3d@>=1.5.2 <2.0.0", - "resolved": "https://registry.npmjs.org/gl-plot3d/-/gl-plot3d-1.5.3.tgz", + "version": "1.5.4", + "from": "gl-plot3d@>=1.5.4 <2.0.0", + "resolved": "https://registry.npmjs.org/gl-plot3d/-/gl-plot3d-1.5.4.tgz", "dependencies": { "bl": { "version": "0.9.5", @@ -1238,20 +2675,10 @@ "from": "glslify-bundle@>=2.0.4 <3.0.0", "resolved": "https://registry.npmjs.org/glslify-bundle/-/glslify-bundle-2.0.4.tgz" }, - "isarray": { - "version": "0.0.1", - "from": "isarray@0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz" - }, "minimist": { "version": "1.2.0", "from": "minimist@^1.1.0", "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz" - }, - "readable-stream": { - "version": "1.0.34", - "from": "readable-stream@~1.0.26", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz" } } }, @@ -1280,20 +2707,10 @@ "from": "glslify-bundle@>=2.0.4 <3.0.0", "resolved": "https://registry.npmjs.org/glslify-bundle/-/glslify-bundle-2.0.4.tgz" }, - "isarray": { - "version": "0.0.1", - "from": "isarray@0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz" - }, "minimist": { "version": "1.2.0", "from": "minimist@^1.1.0", "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz" - }, - "readable-stream": { - "version": "1.0.34", - "from": "readable-stream@~1.0.26", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz" } } }, @@ -1327,21 +2744,11 @@ "from": "glslify-bundle@>=2.0.4 <3.0.0", "resolved": "https://registry.npmjs.org/glslify-bundle/-/glslify-bundle-2.0.4.tgz" }, - "isarray": { - "version": "0.0.1", - "from": "isarray@0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz" - }, "minimist": { "version": "1.2.0", "from": "minimist@^1.1.0", "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz" }, - "readable-stream": { - "version": "1.0.34", - "from": "readable-stream@~1.0.26", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz" - }, "snap-points-2d": { "version": "3.1.0", "from": "snap-points-2d@>=3.0.0 <4.0.0", @@ -1351,7 +2758,7 @@ }, "gl-scatter2d-sdf": { "version": "1.3.4", - "from": "gl-scatter2d-sdf@>=1.3.3 <2.0.0", + "from": "gl-scatter2d-sdf@1.3.4", "resolved": "https://registry.npmjs.org/gl-scatter2d-sdf/-/gl-scatter2d-sdf-1.3.4.tgz", "dependencies": { "binary-search-bounds": { @@ -1379,21 +2786,11 @@ "from": "glslify-bundle@>=2.0.4 <3.0.0", "resolved": "https://registry.npmjs.org/glslify-bundle/-/glslify-bundle-2.0.4.tgz" }, - "isarray": { - "version": "0.0.1", - "from": "isarray@0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz" - }, "minimist": { "version": "1.2.0", "from": "minimist@^1.1.0", "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz" }, - "readable-stream": { - "version": "1.0.34", - "from": "readable-stream@~1.0.26", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz" - }, "snap-points-2d": { "version": "3.1.0", "from": "snap-points-2d@>=3.1.0 <4.0.0", @@ -1421,20 +2818,10 @@ "from": "glslify-bundle@>=2.0.4 <3.0.0", "resolved": "https://registry.npmjs.org/glslify-bundle/-/glslify-bundle-2.0.4.tgz" }, - "isarray": { - "version": "0.0.1", - "from": "isarray@0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz" - }, "minimist": { "version": "1.2.0", "from": "minimist@^1.1.0", "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz" - }, - "readable-stream": { - "version": "1.0.34", - "from": "readable-stream@~1.0.26", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz" } } }, @@ -1458,20 +2845,10 @@ "from": "glslify-bundle@>=2.0.4 <3.0.0", "resolved": "https://registry.npmjs.org/glslify-bundle/-/glslify-bundle-2.0.4.tgz" }, - "isarray": { - "version": "0.0.1", - "from": "isarray@0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz" - }, "minimist": { "version": "1.2.0", "from": "minimist@^1.1.0", "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz" - }, - "readable-stream": { - "version": "1.0.34", - "from": "readable-stream@~1.0.26", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz" } } }, @@ -1510,20 +2887,10 @@ "from": "glslify-bundle@>=2.0.4 <3.0.0", "resolved": "https://registry.npmjs.org/glslify-bundle/-/glslify-bundle-2.0.4.tgz" }, - "isarray": { - "version": "0.0.1", - "from": "isarray@0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz" - }, "minimist": { "version": "1.2.0", "from": "minimist@^1.1.0", "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz" - }, - "readable-stream": { - "version": "1.0.34", - "from": "readable-stream@~1.0.26", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz" } } }, @@ -1552,20 +2919,10 @@ "from": "glslify-bundle@>=2.0.4 <3.0.0", "resolved": "https://registry.npmjs.org/glslify-bundle/-/glslify-bundle-2.0.4.tgz" }, - "isarray": { - "version": "0.0.1", - "from": "isarray@0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz" - }, "minimist": { "version": "1.2.0", "from": "minimist@^1.1.0", "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz" - }, - "readable-stream": { - "version": "1.0.34", - "from": "readable-stream@~1.0.26", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz" } } }, @@ -1594,6 +2951,44 @@ "from": "glob@>=7.0.3 <8.0.0", "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.1.tgz" }, + "glob-base": { + "version": "0.3.0", + "from": "glob-base@>=0.3.0 <0.4.0", + "resolved": "https://registry.npmjs.org/glob-base/-/glob-base-0.3.0.tgz", + "dev": true + }, + "glob-parent": { + "version": "2.0.0", + "from": "glob-parent@>=2.0.0 <3.0.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz", + "dev": true + }, + "globals": { + "version": "9.17.0", + "from": "globals@>=9.0.0 <10.0.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-9.17.0.tgz", + "dev": true + }, + "globby": { + "version": "5.0.0", + "from": "globby@>=5.0.0 <6.0.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-5.0.0.tgz", + "dev": true + }, + "globule": { + "version": "1.1.0", + "from": "globule@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/globule/-/globule-1.1.0.tgz", + "dev": true, + "dependencies": { + "lodash": { + "version": "4.16.6", + "from": "lodash@>=4.16.4 <4.17.0", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.16.6.tgz", + "dev": true + } + } + }, "glsl-inject-defines": { "version": "1.0.3", "from": "glsl-inject-defines@>=1.0.1 <2.0.0", @@ -1714,9 +3109,9 @@ "resolved": "https://registry.npmjs.org/glslify-deps/-/glslify-deps-1.3.0.tgz" }, "graceful-fs": { - "version": "4.1.9", + "version": "4.1.11", "from": "graceful-fs@>=4.1.2 <5.0.0", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.9.tgz" + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz" }, "graceful-readlink": { "version": "1.0.1", @@ -1728,6 +3123,12 @@ "from": "grid-index@>=1.0.0 <2.0.0", "resolved": "https://registry.npmjs.org/grid-index/-/grid-index-1.0.0.tgz" }, + "growly": { + "version": "1.3.0", + "from": "growly@>=1.2.0 <2.0.0", + "resolved": "https://registry.npmjs.org/growly/-/growly-1.3.0.tgz", + "dev": true + }, "har-validator": { "version": "2.0.6", "from": "har-validator@>=2.0.6 <2.1.0", @@ -1748,36 +3149,186 @@ "from": "has-color@>=0.1.0 <0.2.0", "resolved": "https://registry.npmjs.org/has-color/-/has-color-0.1.7.tgz" }, + "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", + "dev": true + }, + "has-unicode": { + "version": "2.0.1", + "from": "has-unicode@>=2.0.0 <3.0.0", + "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", + "dev": true + }, "hawk": { "version": "3.1.3", "from": "hawk@>=3.1.3 <3.2.0", "resolved": "https://registry.npmjs.org/hawk/-/hawk-3.1.3.tgz" }, + "he": { + "version": "1.1.1", + "from": "he@>=1.1.0 <1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.1.1.tgz", + "dev": true + }, "hoek": { "version": "2.16.3", "from": "hoek@>=2.0.0 <3.0.0", "resolved": "https://registry.npmjs.org/hoek/-/hoek-2.16.3.tgz" }, + "home-or-tmp": { + "version": "2.0.0", + "from": "home-or-tmp@>=2.0.0 <3.0.0", + "resolved": "https://registry.npmjs.org/home-or-tmp/-/home-or-tmp-2.0.0.tgz", + "dev": true + }, + "hosted-git-info": { + "version": "2.4.2", + "from": "hosted-git-info@>=2.1.4 <3.0.0", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.4.2.tgz", + "dev": true + }, + "html-comment-regex": { + "version": "1.1.1", + "from": "html-comment-regex@>=1.1.0 <2.0.0", + "resolved": "https://registry.npmjs.org/html-comment-regex/-/html-comment-regex-1.1.1.tgz", + "dev": true + }, + "html-minifier": { + "version": "3.4.3", + "from": "html-minifier@>=3.2.3 <4.0.0", + "resolved": "https://registry.npmjs.org/html-minifier/-/html-minifier-3.4.3.tgz", + "dev": true, + "dependencies": { + "uglify-js": { + "version": "2.8.22", + "from": "uglify-js@>=2.8.22 <2.9.0", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.8.22.tgz", + "dev": true + } + } + }, + "html-webpack-plugin": { + "version": "2.28.0", + "from": "html-webpack-plugin@>=2.24.0 <3.0.0", + "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-2.28.0.tgz", + "dev": true + }, + "htmlparser2": { + "version": "3.3.0", + "from": "htmlparser2@>=3.3.0 <3.4.0", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.3.0.tgz", + "dev": true, + "dependencies": { + "domutils": { + "version": "1.1.6", + "from": "domutils@>=1.1.0 <1.2.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.1.6.tgz", + "dev": true + } + } + }, + "http-errors": { + "version": "1.6.1", + "from": "http-errors@>=1.6.1 <1.7.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.1.tgz", + "dev": true + }, + "http-proxy": { + "version": "1.16.2", + "from": "http-proxy@>=1.16.2 <2.0.0", + "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.16.2.tgz", + "dev": true + }, + "http-proxy-middleware": { + "version": "0.17.4", + "from": "http-proxy-middleware@>=0.17.1 <0.18.0", + "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-0.17.4.tgz", + "dev": true, + "dependencies": { + "is-extglob": { + "version": "2.1.1", + "from": "is-extglob@>=2.1.0 <3.0.0", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "dev": true + }, + "is-glob": { + "version": "3.1.0", + "from": "is-glob@>=3.1.0 <4.0.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "dev": true + } + } + }, "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" }, + "https-browserify": { + "version": "0.0.1", + "from": "https-browserify@0.0.1", + "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-0.0.1.tgz", + "dev": true + }, "husl": { "version": "5.0.3", "from": "husl@>=5.0.0 <6.0.0", "resolved": "https://registry.npmjs.org/husl/-/husl-5.0.3.tgz" }, + "icss-replace-symbols": { + "version": "1.0.2", + "from": "icss-replace-symbols@>=1.0.2 <2.0.0", + "resolved": "https://registry.npmjs.org/icss-replace-symbols/-/icss-replace-symbols-1.0.2.tgz", + "dev": true + }, "ieee754": { "version": "1.1.8", "from": "ieee754@>=1.1.4 <2.0.0", "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.8.tgz" }, + "ignore": { + "version": "3.2.7", + "from": "ignore@>=3.2.0 <4.0.0", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.2.7.tgz", + "dev": true + }, + "imurmurhash": { + "version": "0.1.4", + "from": "imurmurhash@>=0.1.4 <0.2.0", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "dev": true + }, + "in-publish": { + "version": "2.0.0", + "from": "in-publish@>=2.0.0 <3.0.0", + "resolved": "https://registry.npmjs.org/in-publish/-/in-publish-2.0.0.tgz", + "dev": true + }, "incremental-convex-hull": { "version": "1.0.1", "from": "incremental-convex-hull@>=1.0.1 <2.0.0", "resolved": "https://registry.npmjs.org/incremental-convex-hull/-/incremental-convex-hull-1.0.1.tgz" }, + "indent-string": { + "version": "2.1.0", + "from": "indent-string@>=2.1.0 <3.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz", + "dev": true + }, + "indexes-of": { + "version": "1.0.1", + "from": "indexes-of@>=1.0.1 <2.0.0", + "resolved": "https://registry.npmjs.org/indexes-of/-/indexes-of-1.0.1.tgz", + "dev": true + }, + "indexof": { + "version": "0.0.1", + "from": "indexof@0.0.1", + "resolved": "https://registry.npmjs.org/indexof/-/indexof-0.0.1.tgz", + "dev": true + }, "inflight": { "version": "1.0.6", "from": "inflight@>=1.0.4 <2.0.0", @@ -1788,11 +3339,35 @@ "from": "inherits@>=2.0.1 <2.1.0", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz" }, + "inquirer": { + "version": "0.12.0", + "from": "inquirer@>=0.12.0 <0.13.0", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-0.12.0.tgz", + "dev": true + }, + "interpret": { + "version": "1.0.3", + "from": "interpret@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.0.3.tgz", + "dev": true + }, "interval-tree-1d": { "version": "1.0.3", "from": "interval-tree-1d@>=1.0.1 <2.0.0", "resolved": "https://registry.npmjs.org/interval-tree-1d/-/interval-tree-1d-1.0.3.tgz" }, + "invariant": { + "version": "2.2.2", + "from": "invariant@>=2.2.0 <3.0.0", + "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.2.tgz", + "dev": true + }, + "invert-kv": { + "version": "1.0.0", + "from": "invert-kv@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", + "dev": true + }, "invert-permutation": { "version": "1.0.0", "from": "invert-permutation@>=1.0.0 <2.0.0", @@ -1803,11 +3378,41 @@ "from": "iota-array@>=1.0.0 <2.0.0", "resolved": "https://registry.npmjs.org/iota-array/-/iota-array-1.0.0.tgz" }, + "ipaddr.js": { + "version": "1.3.0", + "from": "ipaddr.js@1.3.0", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.3.0.tgz", + "dev": true + }, + "is-absolute-url": { + "version": "2.1.0", + "from": "is-absolute-url@>=2.0.0 <3.0.0", + "resolved": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-2.1.0.tgz", + "dev": true + }, + "is-arrayish": { + "version": "0.2.1", + "from": "is-arrayish@>=0.2.1 <0.3.0", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "dev": true + }, + "is-binary-path": { + "version": "1.0.1", + "from": "is-binary-path@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", + "dev": true + }, "is-buffer": { "version": "1.1.4", "from": "is-buffer@>=1.0.2 <2.0.0", "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.4.tgz" }, + "is-builtin-module": { + "version": "1.0.0", + "from": "is-builtin-module@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz", + "dev": true + }, "is-callable": { "version": "1.1.3", "from": "is-callable@>=1.1.3 <2.0.0", @@ -1818,11 +3423,53 @@ "from": "is-date-object@>=1.0.1 <2.0.0", "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.1.tgz" }, + "is-dotfile": { + "version": "1.0.2", + "from": "is-dotfile@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/is-dotfile/-/is-dotfile-1.0.2.tgz", + "dev": true + }, + "is-equal-shallow": { + "version": "0.1.3", + "from": "is-equal-shallow@>=0.1.3 <0.2.0", + "resolved": "https://registry.npmjs.org/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz", + "dev": true + }, + "is-extendable": { + "version": "0.1.1", + "from": "is-extendable@>=0.1.1 <0.2.0", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "dev": true + }, + "is-extglob": { + "version": "1.0.0", + "from": "is-extglob@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", + "dev": true + }, + "is-finite": { + "version": "1.0.2", + "from": "is-finite@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "from": "is-fullwidth-code-point@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "dev": true + }, "is-function": { "version": "1.0.1", "from": "is-function@>=1.0.0 <1.1.0", "resolved": "https://registry.npmjs.org/is-function/-/is-function-1.0.1.tgz" }, + "is-glob": { + "version": "2.0.1", + "from": "is-glob@>=2.0.0 <3.0.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", + "dev": true + }, "is-mobile": { "version": "0.2.2", "from": "is-mobile@>=0.2.2 <0.3.0", @@ -1833,11 +3480,47 @@ "from": "is-my-json-valid@>=2.10.0 <3.0.0", "resolved": "https://registry.npmjs.org/is-my-json-valid/-/is-my-json-valid-2.15.0.tgz" }, + "is-number": { + "version": "2.1.0", + "from": "is-number@>=2.1.0 <3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz", + "dev": true + }, + "is-path-cwd": { + "version": "1.0.0", + "from": "is-path-cwd@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-1.0.0.tgz", + "dev": true + }, + "is-path-in-cwd": { + "version": "1.0.0", + "from": "is-path-in-cwd@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-1.0.0.tgz", + "dev": true + }, + "is-path-inside": { + "version": "1.0.0", + "from": "is-path-inside@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.0.tgz", + "dev": true + }, "is-plain-obj": { "version": "1.1.0", "from": "is-plain-obj@>=1.0.0 <2.0.0", "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz" }, + "is-posix-bracket": { + "version": "0.1.1", + "from": "is-posix-bracket@>=0.1.0 <0.2.0", + "resolved": "https://registry.npmjs.org/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz", + "dev": true + }, + "is-primitive": { + "version": "2.0.0", + "from": "is-primitive@>=2.0.0 <3.0.0", + "resolved": "https://registry.npmjs.org/is-primitive/-/is-primitive-2.0.0.tgz", + "dev": true + }, "is-property": { "version": "1.0.2", "from": "is-property@>=1.0.0 <2.0.0", @@ -1848,6 +3531,18 @@ "from": "is-regex@>=1.0.3 <2.0.0", "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.4.tgz" }, + "is-resolvable": { + "version": "1.0.0", + "from": "is-resolvable@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/is-resolvable/-/is-resolvable-1.0.0.tgz", + "dev": true + }, + "is-svg": { + "version": "2.1.0", + "from": "is-svg@>=2.0.0 <3.0.0", + "resolved": "https://registry.npmjs.org/is-svg/-/is-svg-2.1.0.tgz", + "dev": true + }, "is-symbol": { "version": "1.0.1", "from": "is-symbol@>=1.0.1 <2.0.0", @@ -1858,11 +3553,29 @@ "from": "is-typedarray@>=1.0.0 <1.1.0", "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz" }, + "is-utf8": { + "version": "0.2.1", + "from": "is-utf8@>=0.2.0 <0.3.0", + "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", + "dev": true + }, "isarray": { "version": "1.0.0", "from": "isarray@>=1.0.0 <1.1.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz" }, + "isexe": { + "version": "2.0.0", + "from": "isexe@>=2.0.0 <3.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "dev": true + }, + "isobject": { + "version": "2.1.0", + "from": "isobject@>=2.0.0 <3.0.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "dev": true + }, "isstream": { "version": "0.1.2", "from": "isstream@>=0.1.2 <0.2.0", @@ -1884,27 +3597,77 @@ "from": "jquery-ui@latest", "resolved": "https://registry.npmjs.org/jquery-ui/-/jquery-ui-1.12.1.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", + "dev": true + }, + "js-tokens": { + "version": "3.0.1", + "from": "js-tokens@>=3.0.0 <4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.1.tgz", + "dev": true + }, + "js-yaml": { + "version": "3.7.0", + "from": "js-yaml@>=3.7.0 <3.8.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.7.0.tgz", + "dev": true, + "dependencies": { + "esprima": { + "version": "2.7.3", + "from": "esprima@>=2.6.0 <3.0.0", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz", + "dev": true + } + } + }, "jsbn": { "version": "0.1.0", "from": "jsbn@>=0.1.0 <0.2.0", "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.0.tgz", "optional": true }, + "jsesc": { + "version": "1.3.0", + "from": "jsesc@>=1.3.0 <2.0.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-1.3.0.tgz", + "dev": true + }, "json-schema": { "version": "0.2.3", "from": "json-schema@0.2.3", "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz" }, + "json-stable-stringify": { + "version": "1.0.1", + "from": "json-stable-stringify@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz", + "dev": true + }, "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" }, + "json3": { + "version": "3.3.2", + "from": "json3@>=3.3.2 <4.0.0", + "resolved": "https://registry.npmjs.org/json3/-/json3-3.3.2.tgz", + "dev": true + }, "json5": { "version": "0.5.0", "from": "json5@>=0.5.0 <0.6.0", "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.0.tgz" }, + "jsonify": { + "version": "0.0.0", + "from": "jsonify@>=0.0.0 <0.1.0", + "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz", + "dev": true + }, "jsonlint-lines-primitives": { "version": "1.6.0", "from": "jsonlint-lines-primitives@>=1.6.0 <1.7.0", @@ -1940,6 +3703,12 @@ "from": "lazy-cache@>=1.0.3 <2.0.0", "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz" }, + "lcid": { + "version": "1.0.0", + "from": "lcid@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", + "dev": true + }, "leaflet": { "version": "1.0.2", "from": "leaflet@latest", @@ -1955,11 +3724,73 @@ "from": "levn@>=0.3.0 <0.4.0", "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz" }, + "load-json-file": { + "version": "1.1.0", + "from": "load-json-file@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", + "dev": true, + "dependencies": { + "strip-bom": { + "version": "2.0.0", + "from": "strip-bom@>=2.0.0 <3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", + "dev": true + } + } + }, + "loader-fs-cache": { + "version": "1.0.1", + "from": "loader-fs-cache@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/loader-fs-cache/-/loader-fs-cache-1.0.1.tgz", + "dev": true + }, "loader-utils": { "version": "0.2.16", "from": "loader-utils@>=0.2.11 <0.3.0", "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-0.2.16.tgz" }, + "lodash": { + "version": "4.17.4", + "from": "lodash@>=4.2.0 <5.0.0", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.4.tgz", + "dev": true + }, + "lodash._arraycopy": { + "version": "3.0.0", + "from": "lodash._arraycopy@>=3.0.0 <4.0.0", + "resolved": "https://registry.npmjs.org/lodash._arraycopy/-/lodash._arraycopy-3.0.0.tgz", + "dev": true + }, + "lodash._arrayeach": { + "version": "3.0.0", + "from": "lodash._arrayeach@>=3.0.0 <4.0.0", + "resolved": "https://registry.npmjs.org/lodash._arrayeach/-/lodash._arrayeach-3.0.0.tgz", + "dev": true + }, + "lodash._baseassign": { + "version": "3.2.0", + "from": "lodash._baseassign@>=3.0.0 <4.0.0", + "resolved": "https://registry.npmjs.org/lodash._baseassign/-/lodash._baseassign-3.2.0.tgz", + "dev": true + }, + "lodash._baseclone": { + "version": "3.3.0", + "from": "lodash._baseclone@>=3.0.0 <4.0.0", + "resolved": "https://registry.npmjs.org/lodash._baseclone/-/lodash._baseclone-3.3.0.tgz", + "dev": true + }, + "lodash._basecopy": { + "version": "3.0.1", + "from": "lodash._basecopy@>=3.0.0 <4.0.0", + "resolved": "https://registry.npmjs.org/lodash._basecopy/-/lodash._basecopy-3.0.1.tgz", + "dev": true + }, + "lodash._basefor": { + "version": "3.0.3", + "from": "lodash._basefor@>=3.0.0 <4.0.0", + "resolved": "https://registry.npmjs.org/lodash._basefor/-/lodash._basefor-3.0.3.tgz", + "dev": true + }, "lodash._baseisequal": { "version": "3.0.7", "from": "lodash._baseisequal@>=3.0.0 <4.0.0", @@ -1970,11 +3801,53 @@ "from": "lodash._bindcallback@>=3.0.0 <4.0.0", "resolved": "https://registry.npmjs.org/lodash._bindcallback/-/lodash._bindcallback-3.0.1.tgz" }, + "lodash._createcompounder": { + "version": "3.0.0", + "from": "lodash._createcompounder@>=3.0.0 <4.0.0", + "resolved": "https://registry.npmjs.org/lodash._createcompounder/-/lodash._createcompounder-3.0.0.tgz", + "dev": true + }, "lodash._getnative": { "version": "3.9.1", "from": "lodash._getnative@>=3.0.0 <4.0.0", "resolved": "https://registry.npmjs.org/lodash._getnative/-/lodash._getnative-3.9.1.tgz" }, + "lodash._root": { + "version": "3.0.1", + "from": "lodash._root@>=3.0.0 <4.0.0", + "resolved": "https://registry.npmjs.org/lodash._root/-/lodash._root-3.0.1.tgz", + "dev": true + }, + "lodash.assign": { + "version": "4.2.0", + "from": "lodash.assign@>=4.2.0 <5.0.0", + "resolved": "https://registry.npmjs.org/lodash.assign/-/lodash.assign-4.2.0.tgz", + "dev": true + }, + "lodash.camelcase": { + "version": "3.0.1", + "from": "lodash.camelcase@>=3.0.1 <4.0.0", + "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-3.0.1.tgz", + "dev": true + }, + "lodash.clonedeep": { + "version": "4.5.0", + "from": "lodash.clonedeep@>=4.3.2 <5.0.0", + "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", + "dev": true + }, + "lodash.cond": { + "version": "4.5.2", + "from": "lodash.cond@>=4.3.0 <5.0.0", + "resolved": "https://registry.npmjs.org/lodash.cond/-/lodash.cond-4.5.2.tgz", + "dev": true + }, + "lodash.deburr": { + "version": "3.2.0", + "from": "lodash.deburr@>=3.0.0 <4.0.0", + "resolved": "https://registry.npmjs.org/lodash.deburr/-/lodash.deburr-3.2.0.tgz", + "dev": true + }, "lodash.isarguments": { "version": "3.1.0", "from": "lodash.isarguments@>=3.0.0 <4.0.0", @@ -2000,11 +3873,65 @@ "from": "lodash.keys@>=3.0.0 <4.0.0", "resolved": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-3.1.2.tgz" }, + "lodash.memoize": { + "version": "4.1.2", + "from": "lodash.memoize@>=4.1.2 <5.0.0", + "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", + "dev": true + }, + "lodash.mergewith": { + "version": "4.6.0", + "from": "lodash.mergewith@>=4.6.0 <5.0.0", + "resolved": "https://registry.npmjs.org/lodash.mergewith/-/lodash.mergewith-4.6.0.tgz", + "dev": true + }, + "lodash.uniq": { + "version": "4.5.0", + "from": "lodash.uniq@>=4.5.0 <5.0.0", + "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", + "dev": true + }, + "lodash.words": { + "version": "3.2.0", + "from": "lodash.words@>=3.0.0 <4.0.0", + "resolved": "https://registry.npmjs.org/lodash.words/-/lodash.words-3.2.0.tgz", + "dev": true + }, "longest": { "version": "1.0.1", "from": "longest@>=1.0.1 <2.0.0", "resolved": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz" }, + "loose-envify": { + "version": "1.3.1", + "from": "loose-envify@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz", + "dev": true + }, + "loud-rejection": { + "version": "1.6.0", + "from": "loud-rejection@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz", + "dev": true + }, + "lower-case": { + "version": "1.1.4", + "from": "lower-case@>=1.1.1 <2.0.0", + "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-1.1.4.tgz", + "dev": true + }, + "lru-cache": { + "version": "4.0.2", + "from": "lru-cache@>=4.0.1 <5.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.0.2.tgz", + "dev": true + }, + "macaddress": { + "version": "0.2.8", + "from": "macaddress@>=0.2.8 <0.3.0", + "resolved": "https://registry.npmjs.org/macaddress/-/macaddress-0.2.8.tgz", + "dev": true + }, "map-limit": { "version": "0.0.1", "from": "map-limit@0.0.1", @@ -2017,6 +3944,12 @@ } } }, + "map-obj": { + "version": "1.0.1", + "from": "map-obj@>=1.0.1 <2.0.0", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", + "dev": true + }, "mapbox-gl": { "version": "0.22.1", "from": "mapbox-gl@>=0.22.0 <0.23.0", @@ -2030,12 +3963,12 @@ "mapbox-gl-shaders": { "version": "1.0.0", "from": "mapbox/mapbox-gl-shaders#de2ab007455aa2587c552694c68583f94c9f2747", - "resolved": "https://github.com/mapbox/mapbox-gl-shaders.git#de2ab007455aa2587c552694c68583f94c9f2747" + "resolved": "git+https://github.com/mapbox/mapbox-gl-shaders.git#de2ab007455aa2587c552694c68583f94c9f2747" }, "mapbox-gl-style-spec": { "version": "8.8.0", "from": "mapbox/mapbox-gl-style-spec#83b1a3e5837d785af582efd5ed1a212f2df6a4ae", - "resolved": "https://github.com/mapbox/mapbox-gl-style-spec.git#83b1a3e5837d785af582efd5ed1a212f2df6a4ae" + "resolved": "git+https://github.com/mapbox/mapbox-gl-style-spec.git#83b1a3e5837d785af582efd5ed1a212f2df6a4ae" }, "mapbox-gl-supported": { "version": "1.2.0", @@ -2052,6 +3985,12 @@ "from": "marked@latest", "resolved": "https://registry.npmjs.org/marked/-/marked-0.3.6.tgz" }, + "marked-terminal": { + "version": "1.7.0", + "from": "marked-terminal@>=1.6.2 <2.0.0", + "resolved": "https://registry.npmjs.org/marked-terminal/-/marked-terminal-1.7.0.tgz", + "dev": true + }, "mat4-decompose": { "version": "1.0.4", "from": "mat4-decompose@>=1.0.3 <2.0.0", @@ -2072,10 +4011,80 @@ "from": "material-design-iconic-font@latest", "resolved": "https://registry.npmjs.org/material-design-iconic-font/-/material-design-iconic-font-2.2.0.tgz" }, + "math-expression-evaluator": { + "version": "1.2.17", + "from": "math-expression-evaluator@>=1.2.14 <2.0.0", + "resolved": "https://registry.npmjs.org/math-expression-evaluator/-/math-expression-evaluator-1.2.17.tgz", + "dev": true + }, "matrix-camera-controller": { - "version": "2.1.1", - "from": "matrix-camera-controller@>=2.1.1 <3.0.0", - "resolved": "https://registry.npmjs.org/matrix-camera-controller/-/matrix-camera-controller-2.1.1.tgz" + "version": "2.1.3", + "from": "matrix-camera-controller@>=2.1.3 <3.0.0", + "resolved": "https://registry.npmjs.org/matrix-camera-controller/-/matrix-camera-controller-2.1.3.tgz" + }, + "media-typer": { + "version": "0.3.0", + "from": "media-typer@0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "dev": true + }, + "memory-fs": { + "version": "0.3.0", + "from": "memory-fs@>=0.3.0 <0.4.0", + "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.3.0.tgz", + "dev": true, + "dependencies": { + "readable-stream": { + "version": "2.2.9", + "from": "readable-stream@>=2.0.1 <3.0.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.2.9.tgz", + "dev": true + }, + "string_decoder": { + "version": "1.0.0", + "from": "string_decoder@~1.0.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.0.tgz", + "dev": true + } + } + }, + "meow": { + "version": "3.7.0", + "from": "meow@>=3.7.0 <4.0.0", + "resolved": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz", + "dev": true, + "dependencies": { + "minimist": { + "version": "1.2.0", + "from": "minimist@^1.1.3", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "dev": true + } + } + }, + "merge-descriptors": { + "version": "1.0.1", + "from": "merge-descriptors@1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "dev": true + }, + "methods": { + "version": "1.1.2", + "from": "methods@>=1.1.2 <1.2.0", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "dev": true + }, + "micromatch": { + "version": "2.3.11", + "from": "micromatch@>=2.1.5 <3.0.0", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", + "dev": true + }, + "mime": { + "version": "1.3.4", + "from": "mime@>=1.3.0 <1.4.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.3.4.tgz", + "dev": true }, "mime-db": { "version": "1.24.0", @@ -2097,6 +4106,12 @@ "from": "minimist@0.0.8", "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz" }, + "mkdirp": { + "version": "0.5.1", + "from": "mkdirp@>=0.5.1 <0.6.0", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "dev": true + }, "moment": { "version": "2.15.2", "from": "moment@latest", @@ -2171,6 +4186,30 @@ "from": "mustache@latest", "resolved": "https://registry.npmjs.org/mustache/-/mustache-2.2.1.tgz" }, + "mute-stream": { + "version": "0.0.5", + "from": "mute-stream@0.0.5", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.5.tgz", + "dev": true + }, + "nan": { + "version": "2.6.2", + "from": "nan@>=2.3.2 <3.0.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.6.2.tgz", + "dev": true + }, + "natural-compare": { + "version": "1.4.0", + "from": "natural-compare@>=1.4.0 <2.0.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "dev": true + }, + "ncname": { + "version": "1.0.0", + "from": "ncname@>=1.0.0 <1.1.0", + "resolved": "https://registry.npmjs.org/ncname/-/ncname-1.0.0.tgz", + "dev": true + }, "ndarray": { "version": "1.0.18", "from": "ndarray@>=1.0.16 <2.0.0", @@ -2226,6 +4265,12 @@ "from": "ndarray-warp@>=1.0.0 <2.0.0", "resolved": "https://registry.npmjs.org/ndarray-warp/-/ndarray-warp-1.0.1.tgz" }, + "negotiator": { + "version": "0.6.1", + "from": "negotiator@0.6.1", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.1.tgz", + "dev": true + }, "nextafter": { "version": "1.0.0", "from": "nextafter@>=1.0.0 <2.0.0", @@ -2253,6 +4298,72 @@ "from": "ng-annotate-loader@latest", "resolved": "https://registry.npmjs.org/ng-annotate-loader/-/ng-annotate-loader-0.2.0.tgz" }, + "no-case": { + "version": "2.3.1", + "from": "no-case@>=2.2.0 <3.0.0", + "resolved": "https://registry.npmjs.org/no-case/-/no-case-2.3.1.tgz", + "dev": true + }, + "node-emoji": { + "version": "1.5.1", + "from": "node-emoji@>=1.4.1 <2.0.0", + "resolved": "https://registry.npmjs.org/node-emoji/-/node-emoji-1.5.1.tgz", + "dev": true + }, + "node-gyp": { + "version": "3.6.0", + "from": "node-gyp@>=3.3.1 <4.0.0", + "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-3.6.0.tgz", + "dev": true + }, + "node-libs-browser": { + "version": "0.7.0", + "from": "node-libs-browser@>=0.7.0 <0.8.0", + "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-0.7.0.tgz", + "dev": true, + "dependencies": { + "readable-stream": { + "version": "2.2.9", + "from": "readable-stream@>=2.0.5 <3.0.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.2.9.tgz", + "dev": true, + "dependencies": { + "string_decoder": { + "version": "1.0.0", + "from": "string_decoder@~1.0.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.0.tgz", + "dev": true + } + } + } + } + }, + "node-notifier": { + "version": "4.6.1", + "from": "node-notifier@>=4.1.0 <5.0.0", + "resolved": "https://registry.npmjs.org/node-notifier/-/node-notifier-4.6.1.tgz", + "dev": true, + "dependencies": { + "lodash.clonedeep": { + "version": "3.0.2", + "from": "lodash.clonedeep@>=3.0.0 <4.0.0", + "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-3.0.2.tgz", + "dev": true + }, + "minimist": { + "version": "1.2.0", + "from": "minimist@^1.1.1", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "dev": true + } + } + }, + "node-sass": { + "version": "4.5.2", + "from": "node-sass@>=4.3.0 <5.0.0", + "resolved": "https://registry.npmjs.org/node-sass/-/node-sass-4.5.2.tgz", + "dev": true + }, "nomnom": { "version": "1.8.1", "from": "nomnom@>=1.5.0", @@ -2280,16 +4391,64 @@ } } }, + "nopt": { + "version": "3.0.6", + "from": "nopt@>=2.0.0 <3.0.0||>=3.0.0 <4.0.0", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz", + "dev": true + }, + "normalize-package-data": { + "version": "2.3.8", + "from": "normalize-package-data@>=2.3.4 <3.0.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.3.8.tgz", + "dev": true + }, "normalize-path": { "version": "2.0.1", "from": "normalize-path@>=2.0.1 <3.0.0", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.0.1.tgz" }, + "normalize-range": { + "version": "0.1.2", + "from": "normalize-range@>=0.1.2 <0.2.0", + "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", + "dev": true + }, + "normalize-url": { + "version": "1.9.1", + "from": "normalize-url@>=1.4.0 <2.0.0", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-1.9.1.tgz", + "dev": true + }, "normals": { "version": "1.1.0", "from": "normals@>=1.0.1 <2.0.0", "resolved": "https://registry.npmjs.org/normals/-/normals-1.1.0.tgz" }, + "npmlog": { + "version": "4.0.2", + "from": "npmlog@>=4.0.0 <5.0.0", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.0.2.tgz", + "dev": true + }, + "nth-check": { + "version": "1.0.1", + "from": "nth-check@>=1.0.1 <1.1.0", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.1.tgz", + "dev": true + }, + "num2fraction": { + "version": "1.2.2", + "from": "num2fraction@>=1.2.2 <2.0.0", + "resolved": "https://registry.npmjs.org/num2fraction/-/num2fraction-1.2.2.tgz", + "dev": true + }, + "number-is-nan": { + "version": "1.0.1", + "from": "number-is-nan@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", + "dev": true + }, "numeric": { "version": "1.2.6", "from": "numeric@>=1.2.6 <2.0.0", @@ -2305,6 +4464,12 @@ "from": "object-assign@>=4.0.1 <5.0.0", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.0.tgz" }, + "object-hash": { + "version": "1.1.8", + "from": "object-hash@>=1.1.4 <2.0.0", + "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-1.1.8.tgz", + "dev": true + }, "object-inspect": { "version": "1.2.2", "from": "object-inspect@>=1.2.1 <1.3.0", @@ -2315,11 +4480,41 @@ "from": "object-keys@>=1.0.8 <2.0.0", "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.0.11.tgz" }, + "object.omit": { + "version": "2.0.1", + "from": "object.omit@>=2.0.0 <3.0.0", + "resolved": "https://registry.npmjs.org/object.omit/-/object.omit-2.0.1.tgz", + "dev": true + }, + "on-finished": { + "version": "2.3.0", + "from": "on-finished@>=2.3.0 <2.4.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "dev": true + }, + "on-headers": { + "version": "1.0.1", + "from": "on-headers@>=1.0.1 <1.1.0", + "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.1.tgz", + "dev": true + }, "once": { "version": "1.4.0", "from": "once@>=1.3.0 <2.0.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz" }, + "onetime": { + "version": "1.1.0", + "from": "onetime@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-1.1.0.tgz", + "dev": true + }, + "open": { + "version": "0.0.5", + "from": "open@0.0.5", + "resolved": "https://registry.npmjs.org/open/-/open-0.0.5.tgz", + "dev": true + }, "optimist": { "version": "0.6.1", "from": "optimist@>=0.6.0 <0.7.0", @@ -2352,6 +4547,50 @@ "from": "ordered-esprima-props@>=1.1.0 <1.2.0", "resolved": "https://registry.npmjs.org/ordered-esprima-props/-/ordered-esprima-props-1.1.0.tgz" }, + "original": { + "version": "1.0.0", + "from": "original@>=0.0.5", + "resolved": "https://registry.npmjs.org/original/-/original-1.0.0.tgz", + "dev": true, + "dependencies": { + "url-parse": { + "version": "1.0.5", + "from": "url-parse@>=1.0.0 <1.1.0", + "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.0.5.tgz", + "dev": true + } + } + }, + "os-browserify": { + "version": "0.2.1", + "from": "os-browserify@>=0.2.0 <0.3.0", + "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.2.1.tgz", + "dev": true + }, + "os-homedir": { + "version": "1.0.2", + "from": "os-homedir@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", + "dev": true + }, + "os-locale": { + "version": "1.4.0", + "from": "os-locale@>=1.4.0 <2.0.0", + "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", + "dev": true + }, + "os-tmpdir": { + "version": "1.0.2", + "from": "os-tmpdir@>=1.0.1 <2.0.0", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "dev": true + }, + "osenv": { + "version": "0.1.4", + "from": "osenv@>=0.0.0 <1.0.0", + "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.4.tgz", + "dev": true + }, "pace-progress": { "version": "1.0.2", "from": "git+https://github.com/getredash/pace.git", @@ -2362,21 +4601,87 @@ "from": "pad-left@>=1.0.2 <2.0.0", "resolved": "https://registry.npmjs.org/pad-left/-/pad-left-1.0.2.tgz" }, + "pako": { + "version": "0.2.9", + "from": "pako@>=0.2.0 <0.3.0", + "resolved": "https://registry.npmjs.org/pako/-/pako-0.2.9.tgz", + "dev": true + }, + "param-case": { + "version": "2.1.1", + "from": "param-case@>=2.1.0 <2.2.0", + "resolved": "https://registry.npmjs.org/param-case/-/param-case-2.1.1.tgz", + "dev": true + }, + "parse-glob": { + "version": "3.0.4", + "from": "parse-glob@>=3.0.4 <4.0.0", + "resolved": "https://registry.npmjs.org/parse-glob/-/parse-glob-3.0.4.tgz", + "dev": true + }, + "parse-json": { + "version": "2.2.0", + "from": "parse-json@>=2.2.0 <3.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", + "dev": true + }, "parse-unit": { "version": "1.0.1", "from": "parse-unit@>=1.0.1 <2.0.0", "resolved": "https://registry.npmjs.org/parse-unit/-/parse-unit-1.0.1.tgz" }, + "parseurl": { + "version": "1.3.1", + "from": "parseurl@>=1.3.1 <1.4.0", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.1.tgz", + "dev": true + }, + "path-browserify": { + "version": "0.0.0", + "from": "path-browserify@0.0.0", + "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.0.tgz", + "dev": true + }, + "path-exists": { + "version": "2.1.0", + "from": "path-exists@>=2.0.0 <3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", + "dev": true + }, "path-is-absolute": { "version": "1.0.1", "from": "path-is-absolute@>=1.0.0 <2.0.0", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz" }, + "path-is-inside": { + "version": "1.0.2", + "from": "path-is-inside@>=1.0.1 <2.0.0", + "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", + "dev": true + }, + "path-to-regexp": { + "version": "0.1.7", + "from": "path-to-regexp@0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "dev": true + }, + "path-type": { + "version": "1.1.0", + "from": "path-type@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", + "dev": true + }, "pbf": { "version": "1.3.7", "from": "pbf@>=1.3.2 <2.0.0", "resolved": "https://registry.npmjs.org/pbf/-/pbf-1.3.7.tgz" }, + "pbkdf2-compat": { + "version": "2.0.1", + "from": "pbkdf2-compat@2.0.1", + "resolved": "https://registry.npmjs.org/pbkdf2-compat/-/pbkdf2-compat-2.0.1.tgz", + "dev": true + }, "permutation-parity": { "version": "1.0.0", "from": "permutation-parity@>=1.0.0 <2.0.0", @@ -2387,6 +4692,12 @@ "from": "permutation-rank@>=1.0.0 <2.0.0", "resolved": "https://registry.npmjs.org/permutation-rank/-/permutation-rank-1.0.0.tgz" }, + "pify": { + "version": "2.3.0", + "from": "pify@>=2.0.0 <3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "dev": true + }, "pinkie": { "version": "2.0.4", "from": "pinkie@>=2.0.0 <3.0.0", @@ -2402,6 +4713,18 @@ "from": "pivottable@latest", "resolved": "https://registry.npmjs.org/pivottable/-/pivottable-2.3.0.tgz" }, + "pkg-dir": { + "version": "1.0.0", + "from": "pkg-dir@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-1.0.0.tgz", + "dev": true + }, + "pkg-up": { + "version": "1.0.0", + "from": "pkg-up@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-1.0.0.tgz", + "dev": true + }, "planar-dual": { "version": "1.0.2", "from": "planar-dual@>=1.0.0 <2.0.0", @@ -2413,9 +4736,15 @@ "resolved": "https://registry.npmjs.org/planar-graph-to-polyline/-/planar-graph-to-polyline-1.0.5.tgz" }, "plotly.js": { - "version": "1.25.0", - "from": "plotly.js@1.25.0", - "resolved": "https://registry.npmjs.org/plotly.js/-/plotly.js-1.25.0.tgz" + "version": "1.26.1", + "from": "plotly.js@1.26.1", + "resolved": "https://registry.npmjs.org/plotly.js/-/plotly.js-1.26.1.tgz" + }, + "pluralize": { + "version": "1.2.1", + "from": "pluralize@>=1.2.1 <2.0.0", + "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-1.2.1.tgz", + "dev": true }, "pngjs": { "version": "2.3.1", @@ -2437,31 +4766,319 @@ "from": "polytope-closest-point@>=1.0.0 <2.0.0", "resolved": "https://registry.npmjs.org/polytope-closest-point/-/polytope-closest-point-1.0.0.tgz" }, + "postcss": { + "version": "5.2.17", + "from": "postcss@>=5.0.6 <6.0.0", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.17.tgz", + "dev": true + }, + "postcss-calc": { + "version": "5.3.1", + "from": "postcss-calc@>=5.2.0 <6.0.0", + "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-5.3.1.tgz", + "dev": true + }, + "postcss-colormin": { + "version": "2.2.2", + "from": "postcss-colormin@>=2.1.8 <3.0.0", + "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-2.2.2.tgz", + "dev": true + }, + "postcss-convert-values": { + "version": "2.6.1", + "from": "postcss-convert-values@>=2.3.4 <3.0.0", + "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-2.6.1.tgz", + "dev": true + }, + "postcss-discard-comments": { + "version": "2.0.4", + "from": "postcss-discard-comments@>=2.0.4 <3.0.0", + "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-2.0.4.tgz", + "dev": true + }, + "postcss-discard-duplicates": { + "version": "2.1.0", + "from": "postcss-discard-duplicates@>=2.0.1 <3.0.0", + "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-2.1.0.tgz", + "dev": true + }, + "postcss-discard-empty": { + "version": "2.1.0", + "from": "postcss-discard-empty@>=2.0.1 <3.0.0", + "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-2.1.0.tgz", + "dev": true + }, + "postcss-discard-overridden": { + "version": "0.1.1", + "from": "postcss-discard-overridden@>=0.1.1 <0.2.0", + "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-0.1.1.tgz", + "dev": true + }, + "postcss-discard-unused": { + "version": "2.2.3", + "from": "postcss-discard-unused@>=2.2.1 <3.0.0", + "resolved": "https://registry.npmjs.org/postcss-discard-unused/-/postcss-discard-unused-2.2.3.tgz", + "dev": true + }, + "postcss-filter-plugins": { + "version": "2.0.2", + "from": "postcss-filter-plugins@>=2.0.0 <3.0.0", + "resolved": "https://registry.npmjs.org/postcss-filter-plugins/-/postcss-filter-plugins-2.0.2.tgz", + "dev": true + }, + "postcss-merge-idents": { + "version": "2.1.7", + "from": "postcss-merge-idents@>=2.1.5 <3.0.0", + "resolved": "https://registry.npmjs.org/postcss-merge-idents/-/postcss-merge-idents-2.1.7.tgz", + "dev": true + }, + "postcss-merge-longhand": { + "version": "2.0.2", + "from": "postcss-merge-longhand@>=2.0.1 <3.0.0", + "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-2.0.2.tgz", + "dev": true + }, + "postcss-merge-rules": { + "version": "2.1.2", + "from": "postcss-merge-rules@>=2.0.3 <3.0.0", + "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-2.1.2.tgz", + "dev": true + }, + "postcss-message-helpers": { + "version": "2.0.0", + "from": "postcss-message-helpers@>=2.0.0 <3.0.0", + "resolved": "https://registry.npmjs.org/postcss-message-helpers/-/postcss-message-helpers-2.0.0.tgz", + "dev": true + }, + "postcss-minify-font-values": { + "version": "1.0.5", + "from": "postcss-minify-font-values@>=1.0.2 <2.0.0", + "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-1.0.5.tgz", + "dev": true + }, + "postcss-minify-gradients": { + "version": "1.0.5", + "from": "postcss-minify-gradients@>=1.0.1 <2.0.0", + "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-1.0.5.tgz", + "dev": true + }, + "postcss-minify-params": { + "version": "1.2.2", + "from": "postcss-minify-params@>=1.0.4 <2.0.0", + "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-1.2.2.tgz", + "dev": true + }, + "postcss-minify-selectors": { + "version": "2.1.1", + "from": "postcss-minify-selectors@>=2.0.4 <3.0.0", + "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-2.1.1.tgz", + "dev": true + }, + "postcss-modules-extract-imports": { + "version": "1.0.1", + "from": "postcss-modules-extract-imports@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-1.0.1.tgz", + "dev": true + }, + "postcss-modules-local-by-default": { + "version": "1.1.1", + "from": "postcss-modules-local-by-default@>=1.0.1 <2.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-1.1.1.tgz", + "dev": true + }, + "postcss-modules-scope": { + "version": "1.0.2", + "from": "postcss-modules-scope@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-1.0.2.tgz", + "dev": true + }, + "postcss-modules-values": { + "version": "1.2.2", + "from": "postcss-modules-values@>=1.1.0 <2.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-1.2.2.tgz", + "dev": true + }, + "postcss-normalize-charset": { + "version": "1.1.1", + "from": "postcss-normalize-charset@>=1.1.0 <2.0.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-1.1.1.tgz", + "dev": true + }, + "postcss-normalize-url": { + "version": "3.0.8", + "from": "postcss-normalize-url@>=3.0.7 <4.0.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-3.0.8.tgz", + "dev": true + }, + "postcss-ordered-values": { + "version": "2.2.3", + "from": "postcss-ordered-values@>=2.1.0 <3.0.0", + "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-2.2.3.tgz", + "dev": true + }, + "postcss-reduce-idents": { + "version": "2.4.0", + "from": "postcss-reduce-idents@>=2.2.2 <3.0.0", + "resolved": "https://registry.npmjs.org/postcss-reduce-idents/-/postcss-reduce-idents-2.4.0.tgz", + "dev": true + }, + "postcss-reduce-initial": { + "version": "1.0.1", + "from": "postcss-reduce-initial@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-1.0.1.tgz", + "dev": true + }, + "postcss-reduce-transforms": { + "version": "1.0.4", + "from": "postcss-reduce-transforms@>=1.0.3 <2.0.0", + "resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-1.0.4.tgz", + "dev": true + }, + "postcss-selector-parser": { + "version": "2.2.3", + "from": "postcss-selector-parser@>=2.2.2 <3.0.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-2.2.3.tgz", + "dev": true + }, + "postcss-svgo": { + "version": "2.1.6", + "from": "postcss-svgo@>=2.1.1 <3.0.0", + "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-2.1.6.tgz", + "dev": true + }, + "postcss-unique-selectors": { + "version": "2.0.2", + "from": "postcss-unique-selectors@>=2.0.2 <3.0.0", + "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-2.0.2.tgz", + "dev": true + }, + "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", + "dev": true + }, + "postcss-zindex": { + "version": "2.2.0", + "from": "postcss-zindex@>=2.0.1 <3.0.0", + "resolved": "https://registry.npmjs.org/postcss-zindex/-/postcss-zindex-2.2.0.tgz", + "dev": true + }, "prelude-ls": { "version": "1.1.2", "from": "prelude-ls@>=1.1.2 <1.2.0", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz" }, + "prepend-http": { + "version": "1.0.4", + "from": "prepend-http@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz", + "dev": true + }, + "preserve": { + "version": "0.2.0", + "from": "preserve@>=0.2.0 <0.3.0", + "resolved": "https://registry.npmjs.org/preserve/-/preserve-0.2.0.tgz", + "dev": true + }, + "pretty-error": { + "version": "2.1.0", + "from": "pretty-error@>=2.0.2 <3.0.0", + "resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-2.1.0.tgz", + "dev": true + }, + "private": { + "version": "0.1.7", + "from": "private@>=0.1.6 <0.2.0", + "resolved": "https://registry.npmjs.org/private/-/private-0.1.7.tgz", + "dev": true + }, + "process": { + "version": "0.11.10", + "from": "process@>=0.11.0 <0.12.0", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "dev": true + }, "process-nextick-args": { "version": "1.0.7", "from": "process-nextick-args@>=1.0.6 <1.1.0", "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz" }, + "progress": { + "version": "1.1.8", + "from": "progress@>=1.1.8 <2.0.0", + "resolved": "https://registry.npmjs.org/progress/-/progress-1.1.8.tgz", + "dev": true + }, "protocol-buffers-schema": { "version": "2.2.0", "from": "protocol-buffers-schema@>=2.0.2 <3.0.0", "resolved": "https://registry.npmjs.org/protocol-buffers-schema/-/protocol-buffers-schema-2.2.0.tgz" }, + "proxy-addr": { + "version": "1.1.4", + "from": "proxy-addr@>=1.1.3 <1.2.0", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-1.1.4.tgz", + "dev": true + }, + "prr": { + "version": "0.0.0", + "from": "prr@>=0.0.0 <0.1.0", + "resolved": "https://registry.npmjs.org/prr/-/prr-0.0.0.tgz", + "dev": true + }, + "pseudomap": { + "version": "1.0.2", + "from": "pseudomap@>=1.0.1 <2.0.0", + "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", + "dev": true + }, "punycode": { "version": "1.4.1", "from": "punycode@>=1.2.4 <2.0.0", "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz" }, + "q": { + "version": "1.5.0", + "from": "q@>=1.1.2 <2.0.0", + "resolved": "https://registry.npmjs.org/q/-/q-1.5.0.tgz", + "dev": true + }, + "qs": { + "version": "6.4.0", + "from": "qs@6.4.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.4.0.tgz", + "dev": true + }, "quat-slerp": { "version": "1.0.1", "from": "quat-slerp@>=1.0.0 <2.0.0", "resolved": "https://registry.npmjs.org/quat-slerp/-/quat-slerp-1.0.1.tgz" }, + "query-string": { + "version": "4.3.4", + "from": "query-string@>=4.1.0 <5.0.0", + "resolved": "https://registry.npmjs.org/query-string/-/query-string-4.3.4.tgz", + "dev": true + }, + "querystring": { + "version": "0.2.0", + "from": "querystring@0.2.0", + "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", + "dev": true + }, + "querystring-es3": { + "version": "0.2.1", + "from": "querystring-es3@>=0.2.0 <0.3.0", + "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz", + "dev": true + }, + "querystringify": { + "version": "0.0.4", + "from": "querystringify@>=0.0.0 <0.1.0", + "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-0.0.4.tgz", + "dev": true + }, "quickselect": { "version": "1.0.0", "from": "quickselect@>=1.0.0 <2.0.0", @@ -2472,21 +5089,11 @@ "from": "quote-stream@>=0.0.0 <0.1.0", "resolved": "https://registry.npmjs.org/quote-stream/-/quote-stream-0.0.0.tgz", "dependencies": { - "isarray": { - "version": "0.0.1", - "from": "isarray@0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz" - }, "object-keys": { "version": "0.4.0", "from": "object-keys@>=0.4.0 <0.5.0", "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-0.4.0.tgz" }, - "readable-stream": { - "version": "1.0.34", - "from": "readable-stream@~1.0.17", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz" - }, "through2": { "version": "0.4.2", "from": "through2@>=0.4.1 <0.5.0", @@ -2499,31 +5106,214 @@ } } }, + "randomatic": { + "version": "1.1.6", + "from": "randomatic@>=1.1.3 <2.0.0", + "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-1.1.6.tgz", + "dev": true + }, + "range-parser": { + "version": "1.2.0", + "from": "range-parser@>=1.2.0 <1.3.0", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz", + "dev": true + }, "rat-vec": { "version": "1.1.1", "from": "rat-vec@>=1.1.1 <2.0.0", "resolved": "https://registry.npmjs.org/rat-vec/-/rat-vec-1.1.1.tgz" }, + "raw-loader": { + "version": "0.5.1", + "from": "raw-loader@>=0.5.1 <0.6.0", + "resolved": "https://registry.npmjs.org/raw-loader/-/raw-loader-0.5.1.tgz", + "dev": true + }, + "read-pkg": { + "version": "1.1.0", + "from": "read-pkg@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", + "dev": true + }, + "read-pkg-up": { + "version": "1.0.1", + "from": "read-pkg-up@>=1.0.1 <2.0.0", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", + "dev": true + }, "readable-stream": { - "version": "2.1.5", - "from": "readable-stream@>=2.0.1 <3.0.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.1.5.tgz" + "version": "1.0.34", + "from": "readable-stream@>=1.0.33-1 <1.1.0-0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", + "dependencies": { + "isarray": { + "version": "0.0.1", + "from": "isarray@0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz" + } + } + }, + "readdirp": { + "version": "2.1.0", + "from": "readdirp@>=2.0.0 <3.0.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.1.0.tgz", + "dev": true, + "dependencies": { + "readable-stream": { + "version": "2.2.9", + "from": "readable-stream@>=2.0.2 <3.0.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.2.9.tgz", + "dev": true + }, + "string_decoder": { + "version": "1.0.0", + "from": "string_decoder@~1.0.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.0.tgz", + "dev": true + } + } + }, + "readline2": { + "version": "1.0.1", + "from": "readline2@>=1.0.1 <2.0.0", + "resolved": "https://registry.npmjs.org/readline2/-/readline2-1.0.1.tgz", + "dev": true + }, + "rechoir": { + "version": "0.6.2", + "from": "rechoir@>=0.6.2 <0.7.0", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", + "dev": true + }, + "redent": { + "version": "1.0.0", + "from": "redent@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz", + "dev": true + }, + "redeyed": { + "version": "1.0.1", + "from": "redeyed@>=1.0.0 <1.1.0", + "resolved": "https://registry.npmjs.org/redeyed/-/redeyed-1.0.1.tgz", + "dev": true, + "dependencies": { + "esprima": { + "version": "3.0.0", + "from": "esprima@>=3.0.0 <3.1.0", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-3.0.0.tgz", + "dev": true + } + } + }, + "reduce-css-calc": { + "version": "1.3.0", + "from": "reduce-css-calc@>=1.2.6 <2.0.0", + "resolved": "https://registry.npmjs.org/reduce-css-calc/-/reduce-css-calc-1.3.0.tgz", + "dev": true + }, + "reduce-function-call": { + "version": "1.0.2", + "from": "reduce-function-call@>=1.0.1 <2.0.0", + "resolved": "https://registry.npmjs.org/reduce-function-call/-/reduce-function-call-1.0.2.tgz", + "dev": true }, "reduce-simplicial-complex": { "version": "1.0.0", "from": "reduce-simplicial-complex@>=1.0.0 <2.0.0", "resolved": "https://registry.npmjs.org/reduce-simplicial-complex/-/reduce-simplicial-complex-1.0.0.tgz" }, + "regenerate": { + "version": "1.3.2", + "from": "regenerate@>=1.2.1 <2.0.0", + "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.3.2.tgz", + "dev": true + }, + "regenerator-runtime": { + "version": "0.10.5", + "from": "regenerator-runtime@>=0.10.0 <0.11.0", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.10.5.tgz", + "dev": true + }, + "regenerator-transform": { + "version": "0.9.11", + "from": "regenerator-transform@0.9.11", + "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.9.11.tgz", + "dev": true + }, + "regex-cache": { + "version": "0.4.3", + "from": "regex-cache@>=0.4.2 <0.5.0", + "resolved": "https://registry.npmjs.org/regex-cache/-/regex-cache-0.4.3.tgz", + "dev": true + }, + "regexpu-core": { + "version": "2.0.0", + "from": "regexpu-core@>=2.0.0 <3.0.0", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-2.0.0.tgz", + "dev": true + }, + "regjsgen": { + "version": "0.2.0", + "from": "regjsgen@>=0.2.0 <0.3.0", + "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.2.0.tgz", + "dev": true + }, + "regjsparser": { + "version": "0.1.5", + "from": "regjsparser@>=0.1.4 <0.2.0", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.1.5.tgz", + "dev": true, + "dependencies": { + "jsesc": { + "version": "0.5.0", + "from": "jsesc@>=0.5.0 <0.6.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", + "dev": true + } + } + }, "regl": { "version": "1.3.0", "from": "regl@>=1.3.0 <2.0.0", "resolved": "https://registry.npmjs.org/regl/-/regl-1.3.0.tgz" }, + "relateurl": { + "version": "0.2.7", + "from": "relateurl@>=0.2.0 <0.3.0", + "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz", + "dev": true + }, + "renderkid": { + "version": "2.0.1", + "from": "renderkid@>=2.0.1 <3.0.0", + "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-2.0.1.tgz", + "dev": true, + "dependencies": { + "utila": { + "version": "0.3.3", + "from": "utila@>=0.3.0 <0.4.0", + "resolved": "https://registry.npmjs.org/utila/-/utila-0.3.3.tgz", + "dev": true + } + } + }, + "repeat-element": { + "version": "1.1.2", + "from": "repeat-element@>=1.1.2 <2.0.0", + "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.2.tgz", + "dev": true + }, "repeat-string": { "version": "1.6.1", "from": "repeat-string@>=1.5.2 <2.0.0", "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz" }, + "repeating": { + "version": "2.0.1", + "from": "repeating@>=2.0.0 <3.0.0", + "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", + "dev": true + }, "request": { "version": "2.79.0", "from": "request@>=2.39.0 <3.0.0", @@ -2541,11 +5331,41 @@ } } }, + "require-directory": { + "version": "2.1.1", + "from": "require-directory@>=2.1.1 <3.0.0", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "dev": true + }, + "require-main-filename": { + "version": "1.0.1", + "from": "require-main-filename@>=1.0.1 <2.0.0", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", + "dev": true + }, + "require-uncached": { + "version": "1.0.3", + "from": "require-uncached@>=1.0.2 <2.0.0", + "resolved": "https://registry.npmjs.org/require-uncached/-/require-uncached-1.0.3.tgz", + "dev": true + }, + "requires-port": { + "version": "1.0.0", + "from": "requires-port@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "dev": true + }, "resolve": { "version": "1.1.7", "from": "resolve@>=1.1.6 <2.0.0", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz" }, + "resolve-from": { + "version": "1.0.1", + "from": "resolve-from@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-1.0.1.tgz", + "dev": true + }, "resolve-protobuf-schema": { "version": "2.0.0", "from": "resolve-protobuf-schema@>=2.0.0 <3.0.0", @@ -2556,6 +5376,12 @@ "from": "resolve-url@>=0.2.1 <0.3.0", "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz" }, + "restore-cursor": { + "version": "1.0.1", + "from": "restore-cursor@>=1.0.1 <2.0.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-1.0.1.tgz", + "dev": true + }, "resumer": { "version": "0.0.0", "from": "resumer@>=0.0.0 <0.1.0", @@ -2571,6 +5397,18 @@ "from": "right-now@>=1.0.0 <2.0.0", "resolved": "https://registry.npmjs.org/right-now/-/right-now-1.0.0.tgz" }, + "rimraf": { + "version": "2.6.1", + "from": "rimraf@>=2.2.8 <3.0.0", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.1.tgz", + "dev": true + }, + "ripemd160": { + "version": "0.2.0", + "from": "ripemd160@0.2.0", + "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-0.2.0.tgz", + "dev": true + }, "robust-compress": { "version": "1.0.0", "from": "robust-compress@>=1.0.0 <2.0.0", @@ -2626,16 +5464,170 @@ "from": "robust-sum@>=1.0.0 <2.0.0", "resolved": "https://registry.npmjs.org/robust-sum/-/robust-sum-1.0.0.tgz" }, + "run-async": { + "version": "0.1.0", + "from": "run-async@>=0.1.0 <0.2.0", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-0.1.0.tgz", + "dev": true + }, "rw": { "version": "0.1.4", "from": "rw@>=0.1.4 <0.2.0", "resolved": "https://registry.npmjs.org/rw/-/rw-0.1.4.tgz" }, + "rx-lite": { + "version": "3.1.2", + "from": "rx-lite@>=3.1.2 <4.0.0", + "resolved": "https://registry.npmjs.org/rx-lite/-/rx-lite-3.1.2.tgz", + "dev": true + }, "sane-topojson": { "version": "2.0.0", "from": "sane-topojson@>=2.0.0 <3.0.0", "resolved": "https://registry.npmjs.org/sane-topojson/-/sane-topojson-2.0.0.tgz" }, + "sass-graph": { + "version": "2.2.2", + "from": "sass-graph@>=2.1.1 <3.0.0", + "resolved": "https://registry.npmjs.org/sass-graph/-/sass-graph-2.2.2.tgz", + "dev": true, + "dependencies": { + "camelcase": { + "version": "3.0.0", + "from": "camelcase@>=3.0.0 <4.0.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", + "dev": true + }, + "cliui": { + "version": "3.2.0", + "from": "cliui@>=3.2.0 <4.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", + "dev": true + }, + "yargs": { + "version": "6.6.0", + "from": "yargs@>=6.6.0 <7.0.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-6.6.0.tgz", + "dev": true + } + } + }, + "sass-loader": { + "version": "4.1.1", + "from": "sass-loader@>=4.1.1 <5.0.0", + "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-4.1.1.tgz", + "dev": true, + "dependencies": { + "async": { + "version": "2.2.0", + "from": "async@>=2.0.1 <3.0.0", + "resolved": "https://registry.npmjs.org/async/-/async-2.2.0.tgz", + "dev": true + } + } + }, + "sax": { + "version": "1.2.2", + "from": "sax@>=1.2.1 <1.3.0", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.2.tgz", + "dev": true + }, + "scss-tokenizer": { + "version": "0.2.1", + "from": "scss-tokenizer@>=0.2.1 <0.3.0", + "resolved": "https://registry.npmjs.org/scss-tokenizer/-/scss-tokenizer-0.2.1.tgz", + "dev": true, + "dependencies": { + "source-map": { + "version": "0.4.4", + "from": "source-map@>=0.4.2 <0.5.0", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz", + "dev": true + } + } + }, + "semver": { + "version": "5.3.0", + "from": "semver@>=2.0.0 <3.0.0||>=3.0.0 <4.0.0||>=4.0.0 <5.0.0||>=5.0.0 <6.0.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.3.0.tgz", + "dev": true + }, + "send": { + "version": "0.15.1", + "from": "send@0.15.1", + "resolved": "https://registry.npmjs.org/send/-/send-0.15.1.tgz", + "dev": true, + "dependencies": { + "debug": { + "version": "2.6.1", + "from": "debug@2.6.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.1.tgz", + "dev": true + }, + "ms": { + "version": "0.7.2", + "from": "ms@0.7.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.2.tgz", + "dev": true + } + } + }, + "serve-index": { + "version": "1.8.0", + "from": "serve-index@>=1.7.2 <2.0.0", + "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.8.0.tgz", + "dev": true, + "dependencies": { + "http-errors": { + "version": "1.5.1", + "from": "http-errors@>=1.5.0 <1.6.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.5.1.tgz", + "dev": true + }, + "setprototypeof": { + "version": "1.0.2", + "from": "setprototypeof@1.0.2", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.0.2.tgz", + "dev": true + } + } + }, + "serve-static": { + "version": "1.12.1", + "from": "serve-static@1.12.1", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.12.1.tgz", + "dev": true + }, + "set-blocking": { + "version": "2.0.0", + "from": "set-blocking@>=2.0.0 <2.1.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "dev": true + }, + "set-immediate-shim": { + "version": "1.0.1", + "from": "set-immediate-shim@>=1.0.1 <2.0.0", + "resolved": "https://registry.npmjs.org/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz", + "dev": true + }, + "setimmediate": { + "version": "1.0.5", + "from": "setimmediate@>=1.0.4 <2.0.0", + "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", + "dev": true + }, + "setprototypeof": { + "version": "1.0.3", + "from": "setprototypeof@1.0.3", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.0.3.tgz", + "dev": true + }, + "sha.js": { + "version": "2.2.6", + "from": "sha.js@2.2.6", + "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.2.6.tgz", + "dev": true + }, "shallow-copy": { "version": "0.0.1", "from": "shallow-copy@0.0.1", @@ -2646,6 +5638,24 @@ "from": "shelf-pack@>=1.0.0 <2.0.0", "resolved": "https://registry.npmjs.org/shelf-pack/-/shelf-pack-1.1.0.tgz" }, + "shelljs": { + "version": "0.7.7", + "from": "shelljs@>=0.7.5 <0.8.0", + "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.7.7.tgz", + "dev": true + }, + "shellwords": { + "version": "0.1.0", + "from": "shellwords@>=0.1.0 <0.2.0", + "resolved": "https://registry.npmjs.org/shellwords/-/shellwords-0.1.0.tgz", + "dev": true + }, + "signal-exit": { + "version": "3.0.2", + "from": "signal-exit@>=3.0.0 <4.0.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", + "dev": true + }, "signum": { "version": "0.0.0", "from": "signum@>=0.0.0 <0.0.1", @@ -2703,6 +5713,18 @@ "from": "slab-decomposition@>=1.0.1 <2.0.0", "resolved": "https://registry.npmjs.org/slab-decomposition/-/slab-decomposition-1.0.2.tgz" }, + "slash": { + "version": "1.0.0", + "from": "slash@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", + "dev": true + }, + "slice-ansi": { + "version": "0.0.4", + "from": "slice-ansi@0.0.4", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-0.0.4.tgz", + "dev": true + }, "snap-points-2d": { "version": "1.0.1", "from": "snap-points-2d@>=1.0.1 <2.0.0", @@ -2713,6 +5735,26 @@ "from": "sntp@>=1.0.0 <2.0.0", "resolved": "https://registry.npmjs.org/sntp/-/sntp-1.0.9.tgz" }, + "sockjs": { + "version": "0.3.18", + "from": "sockjs@>=0.3.15 <0.4.0", + "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.18.tgz", + "dev": true + }, + "sockjs-client": { + "version": "1.1.2", + "from": "sockjs-client@>=1.0.3 <2.0.0", + "resolved": "https://registry.npmjs.org/sockjs-client/-/sockjs-client-1.1.2.tgz", + "dev": true, + "dependencies": { + "faye-websocket": { + "version": "0.11.1", + "from": "faye-websocket@>=0.11.0 <0.12.0", + "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.1.tgz", + "dev": true + } + } + }, "sort-asc": { "version": "0.1.0", "from": "sort-asc@>=0.1.0 <0.2.0", @@ -2723,16 +5765,52 @@ "from": "sort-desc@>=0.1.1 <0.2.0", "resolved": "https://registry.npmjs.org/sort-desc/-/sort-desc-0.1.1.tgz" }, + "sort-keys": { + "version": "1.1.2", + "from": "sort-keys@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-1.1.2.tgz", + "dev": true + }, "sort-object": { "version": "0.3.2", "from": "sort-object@>=0.3.2 <0.4.0", "resolved": "https://registry.npmjs.org/sort-object/-/sort-object-0.3.2.tgz" }, + "source-list-map": { + "version": "0.1.8", + "from": "source-list-map@>=0.1.4 <0.2.0", + "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-0.1.8.tgz", + "dev": true + }, "source-map": { "version": "0.5.6", "from": "source-map@>=0.5.1 <0.6.0", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz" }, + "source-map-support": { + "version": "0.4.15", + "from": "source-map-support@>=0.4.2 <0.5.0", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.4.15.tgz", + "dev": true + }, + "spdx-correct": { + "version": "1.0.2", + "from": "spdx-correct@>=1.0.0 <1.1.0", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-1.0.2.tgz", + "dev": true + }, + "spdx-expression-parse": { + "version": "1.0.4", + "from": "spdx-expression-parse@>=1.0.0 <1.1.0", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-1.0.4.tgz", + "dev": true + }, + "spdx-license-ids": { + "version": "1.2.2", + "from": "spdx-license-ids@>=1.0.2 <2.0.0", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-1.2.2.tgz", + "dev": true + }, "split-polygon": { "version": "1.0.0", "from": "split-polygon@>=1.0.0 <2.0.0", @@ -2787,11 +5865,6 @@ "from": "static-module@>=1.1.2 <2.0.0", "resolved": "https://registry.npmjs.org/static-module/-/static-module-1.3.1.tgz", "dependencies": { - "isarray": { - "version": "0.0.1", - "from": "isarray@0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz" - }, "object-inspect": { "version": "0.4.0", "from": "object-inspect@>=0.4.0 <0.5.0", @@ -2802,11 +5875,6 @@ "from": "object-keys@>=0.4.0 <0.5.0", "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-0.4.0.tgz" }, - "readable-stream": { - "version": "1.0.34", - "from": "readable-stream@~1.0.27-1", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz" - }, "through2": { "version": "0.4.2", "from": "through2@>=0.4.1 <0.5.0", @@ -2819,11 +5887,101 @@ } } }, + "statuses": { + "version": "1.3.1", + "from": "statuses@>=1.3.1 <1.4.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.3.1.tgz", + "dev": true + }, + "stdout-stream": { + "version": "1.4.0", + "from": "stdout-stream@>=1.4.0 <2.0.0", + "resolved": "https://registry.npmjs.org/stdout-stream/-/stdout-stream-1.4.0.tgz", + "dev": true, + "dependencies": { + "readable-stream": { + "version": "2.2.9", + "from": "readable-stream@>=2.0.1 <3.0.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.2.9.tgz", + "dev": true + }, + "string_decoder": { + "version": "1.0.0", + "from": "string_decoder@~1.0.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.0.tgz", + "dev": true + } + } + }, + "stream-browserify": { + "version": "2.0.1", + "from": "stream-browserify@>=2.0.1 <3.0.0", + "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.1.tgz", + "dev": true, + "dependencies": { + "readable-stream": { + "version": "2.2.9", + "from": "readable-stream@>=2.0.2 <3.0.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.2.9.tgz", + "dev": true + }, + "string_decoder": { + "version": "1.0.0", + "from": "string_decoder@~1.0.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.0.tgz", + "dev": true + } + } + }, + "stream-cache": { + "version": "0.0.2", + "from": "stream-cache@>=0.0.1 <0.1.0", + "resolved": "https://registry.npmjs.org/stream-cache/-/stream-cache-0.0.2.tgz", + "dev": true + }, + "stream-http": { + "version": "2.7.0", + "from": "stream-http@>=2.3.1 <3.0.0", + "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.7.0.tgz", + "dev": true, + "dependencies": { + "readable-stream": { + "version": "2.2.9", + "from": "readable-stream@>=2.2.6 <3.0.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.2.9.tgz", + "dev": true + }, + "string_decoder": { + "version": "1.0.0", + "from": "string_decoder@~1.0.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.0.tgz", + "dev": true + } + } + }, + "strict-uri-encode": { + "version": "1.1.0", + "from": "strict-uri-encode@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz", + "dev": true + }, "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" }, + "string-width": { + "version": "1.0.2", + "from": "string-width@>=1.0.1 <2.0.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "dev": true + }, + "string.prototype.codepointat": { + "version": "0.2.0", + "from": "string.prototype.codepointat@>=0.2.0 <0.3.0", + "resolved": "https://registry.npmjs.org/string.prototype.codepointat/-/string.prototype.codepointat-0.2.0.tgz", + "dev": true + }, "string.prototype.trim": { "version": "1.1.2", "from": "string.prototype.trim@>=1.1.2 <1.2.0", @@ -2849,6 +6007,24 @@ "from": "strip-ansi@>=3.0.0 <4.0.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz" }, + "strip-bom": { + "version": "3.0.0", + "from": "strip-bom@>=3.0.0 <4.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "dev": true + }, + "strip-indent": { + "version": "1.0.1", + "from": "strip-indent@>=1.0.1 <2.0.0", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz", + "dev": true + }, + "strip-json-comments": { + "version": "2.0.1", + "from": "strip-json-comments@>=2.0.1 <2.1.0", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "dev": true + }, "supercluster": { "version": "2.3.0", "from": "supercluster@>=2.0.1 <3.0.0", @@ -2859,11 +6035,57 @@ "from": "superscript-text@>=1.0.0 <2.0.0", "resolved": "https://registry.npmjs.org/superscript-text/-/superscript-text-1.0.0.tgz" }, + "supports-color": { + "version": "3.2.3", + "from": "supports-color@>=3.2.3 <4.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "dev": true + }, "surface-nets": { "version": "1.0.2", "from": "surface-nets@>=1.0.2 <2.0.0", "resolved": "https://registry.npmjs.org/surface-nets/-/surface-nets-1.0.2.tgz" }, + "svgo": { + "version": "0.7.2", + "from": "svgo@>=0.7.0 <0.8.0", + "resolved": "https://registry.npmjs.org/svgo/-/svgo-0.7.2.tgz", + "dev": true, + "dependencies": { + "colors": { + "version": "1.1.2", + "from": "colors@>=1.1.2 <1.2.0", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.1.2.tgz", + "dev": true + } + } + }, + "table": { + "version": "3.8.3", + "from": "table@>=3.7.8 <4.0.0", + "resolved": "https://registry.npmjs.org/table/-/table-3.8.3.tgz", + "dev": true, + "dependencies": { + "is-fullwidth-code-point": { + "version": "2.0.0", + "from": "is-fullwidth-code-point@>=2.0.0 <3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "dev": true + }, + "string-width": { + "version": "2.0.0", + "from": "string-width@>=2.0.0 <3.0.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.0.0.tgz", + "dev": true + } + } + }, + "tapable": { + "version": "0.1.10", + "from": "tapable@>=0.1.8 <0.2.0", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-0.1.10.tgz", + "dev": true + }, "tape": { "version": "4.6.3", "from": "tape@>=4.0.0 <5.0.0", @@ -2876,11 +6098,23 @@ } } }, + "tar": { + "version": "2.2.1", + "from": "tar@>=2.0.0 <3.0.0", + "resolved": "https://registry.npmjs.org/tar/-/tar-2.2.1.tgz", + "dev": true + }, "text-cache": { "version": "4.1.0", "from": "text-cache@>=4.1.0 <5.0.0", "resolved": "https://registry.npmjs.org/text-cache/-/text-cache-4.1.0.tgz" }, + "text-table": { + "version": "0.2.0", + "from": "text-table@>=0.2.0 <0.3.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "dev": true + }, "through": { "version": "2.3.8", "from": "through@>=2.3.6 <3.0.0", @@ -2889,19 +6123,13 @@ "through2": { "version": "0.6.5", "from": "through2@>=0.6.3 <0.7.0", - "resolved": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz", - "dependencies": { - "isarray": { - "version": "0.0.1", - "from": "isarray@0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz" - }, - "readable-stream": { - "version": "1.0.34", - "from": "readable-stream@>=1.0.33-1 <1.1.0-0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz" - } - } + "resolved": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz" + }, + "timers-browserify": { + "version": "2.0.2", + "from": "timers-browserify@>=2.0.2 <3.0.0", + "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.2.tgz", + "dev": true }, "tiny-sdf": { "version": "1.0.2", @@ -2913,6 +6141,18 @@ "from": "tinycolor2@>=1.3.0 <2.0.0", "resolved": "https://registry.npmjs.org/tinycolor2/-/tinycolor2-1.4.1.tgz" }, + "to-arraybuffer": { + "version": "1.0.1", + "from": "to-arraybuffer@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz", + "dev": true + }, + "to-fast-properties": { + "version": "1.0.3", + "from": "to-fast-properties@>=1.0.1 <2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz", + "dev": true + }, "to-px": { "version": "1.0.1", "from": "to-px@>=1.0.1 <2.0.0", @@ -2928,6 +6168,12 @@ "from": "topojson-client@>=2.1.0 <3.0.0", "resolved": "https://registry.npmjs.org/topojson-client/-/topojson-client-2.1.0.tgz" }, + "toposort": { + "version": "1.0.3", + "from": "toposort@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/toposort/-/toposort-1.0.3.tgz", + "dev": true + }, "tough-cookie": { "version": "2.3.2", "from": "tough-cookie@>=2.3.0 <2.4.0", @@ -2943,11 +6189,35 @@ "from": "triangulate-polyline@>=1.0.0 <2.0.0", "resolved": "https://registry.npmjs.org/triangulate-polyline/-/triangulate-polyline-1.0.3.tgz" }, + "trim-newlines": { + "version": "1.0.0", + "from": "trim-newlines@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz", + "dev": true + }, + "trim-right": { + "version": "1.0.1", + "from": "trim-right@>=1.0.1 <2.0.0", + "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz", + "dev": true + }, + "tryit": { + "version": "1.0.3", + "from": "tryit@>=1.0.1 <2.0.0", + "resolved": "https://registry.npmjs.org/tryit/-/tryit-1.0.3.tgz", + "dev": true + }, "tryor": { "version": "0.1.2", "from": "tryor@>=0.1.2 <0.2.0", "resolved": "https://registry.npmjs.org/tryor/-/tryor-0.1.2.tgz" }, + "tty-browserify": { + "version": "0.0.0", + "from": "tty-browserify@0.0.0", + "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz", + "dev": true + }, "tunnel-agent": { "version": "0.4.3", "from": "tunnel-agent@>=0.4.1 <0.5.0", @@ -2979,6 +6249,26 @@ "from": "type-check@>=0.3.2 <0.4.0", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz" }, + "type-is": { + "version": "1.6.15", + "from": "type-is@>=1.6.14 <1.7.0", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.15.tgz", + "dev": true, + "dependencies": { + "mime-db": { + "version": "1.27.0", + "from": "mime-db@~1.27.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.27.0.tgz", + "dev": true + }, + "mime-types": { + "version": "2.1.15", + "from": "mime-types@>=2.1.15 <2.2.0", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.15.tgz", + "dev": true + } + } + }, "typedarray": { "version": "0.0.6", "from": "typedarray@>=0.0.5 <0.1.0", @@ -3016,6 +6306,11 @@ "from": "unassert@>=1.3.1 <2.0.0", "resolved": "https://registry.npmjs.org/unassert/-/unassert-1.5.1.tgz", "dependencies": { + "acorn": { + "version": "4.0.11", + "from": "acorn@>=4.0.0 <5.0.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-4.0.11.tgz" + }, "estraverse": { "version": "4.2.0", "from": "estraverse@>=4.1.0 <5.0.0", @@ -3028,11 +6323,21 @@ "from": "unassertify@>=2.0.0 <3.0.0", "resolved": "https://registry.npmjs.org/unassertify/-/unassertify-2.0.4.tgz", "dependencies": { + "acorn": { + "version": "4.0.11", + "from": "acorn@>=4.0.0 <5.0.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-4.0.11.tgz" + }, "escodegen": { "version": "1.8.1", "from": "escodegen@>=1.6.1 <2.0.0", "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.8.1.tgz" }, + "esprima": { + "version": "2.7.3", + "from": "esprima@>=2.7.1 <3.0.0", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz" + }, "estraverse": { "version": "1.9.3", "from": "estraverse@>=1.9.1 <2.0.0", @@ -3066,16 +6371,124 @@ "from": "uniq@>=1.0.1 <2.0.0", "resolved": "https://registry.npmjs.org/uniq/-/uniq-1.0.1.tgz" }, + "uniqid": { + "version": "4.1.1", + "from": "uniqid@>=4.0.0 <5.0.0", + "resolved": "https://registry.npmjs.org/uniqid/-/uniqid-4.1.1.tgz", + "dev": true + }, + "uniqs": { + "version": "2.0.0", + "from": "uniqs@>=2.0.0 <3.0.0", + "resolved": "https://registry.npmjs.org/uniqs/-/uniqs-2.0.0.tgz", + "dev": true + }, "unitbezier": { "version": "0.0.0", "from": "unitbezier@>=0.0.0 <0.0.1", "resolved": "https://registry.npmjs.org/unitbezier/-/unitbezier-0.0.0.tgz" }, + "unpipe": { + "version": "1.0.0", + "from": "unpipe@>=1.0.0 <1.1.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "dev": true + }, + "upper-case": { + "version": "1.1.3", + "from": "upper-case@>=1.1.1 <2.0.0", + "resolved": "https://registry.npmjs.org/upper-case/-/upper-case-1.1.3.tgz", + "dev": true + }, + "url": { + "version": "0.11.0", + "from": "url@>=0.11.0 <0.12.0", + "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", + "dev": true, + "dependencies": { + "punycode": { + "version": "1.3.2", + "from": "punycode@1.3.2", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", + "dev": true + } + } + }, + "url-loader": { + "version": "0.5.8", + "from": "url-loader@>=0.5.7 <0.6.0", + "resolved": "https://registry.npmjs.org/url-loader/-/url-loader-0.5.8.tgz", + "dev": true, + "dependencies": { + "loader-utils": { + "version": "1.1.0", + "from": "loader-utils@^1.0.2", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.1.0.tgz", + "dev": true + } + } + }, + "url-parse": { + "version": "1.1.8", + "from": "url-parse@>=1.1.1 <2.0.0", + "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.1.8.tgz", + "dev": true + }, + "user-home": { + "version": "2.0.0", + "from": "user-home@>=2.0.0 <3.0.0", + "resolved": "https://registry.npmjs.org/user-home/-/user-home-2.0.0.tgz", + "dev": true + }, + "util": { + "version": "0.10.3", + "from": "util@>=0.10.3 <0.11.0", + "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", + "dev": true, + "dependencies": { + "inherits": { + "version": "2.0.1", + "from": "inherits@2.0.1", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", + "dev": true + } + } + }, "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" }, + "utila": { + "version": "0.4.0", + "from": "utila@>=0.4.0 <0.5.0", + "resolved": "https://registry.npmjs.org/utila/-/utila-0.4.0.tgz", + "dev": true + }, + "utils-merge": { + "version": "1.0.0", + "from": "utils-merge@1.0.0", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.0.tgz", + "dev": true + }, + "uuid": { + "version": "2.0.3", + "from": "uuid@>=2.0.2 <3.0.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-2.0.3.tgz", + "dev": true + }, + "validate-npm-package-license": { + "version": "3.0.1", + "from": "validate-npm-package-license@>=3.0.1 <4.0.0", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.1.tgz", + "dev": true + }, + "vary": { + "version": "1.1.1", + "from": "vary@>=1.1.0 <1.2.0", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.1.tgz", + "dev": true + }, "vector-tile": { "version": "1.3.0", "from": "vector-tile@>=1.3.0 <2.0.0", @@ -3086,11 +6499,23 @@ "from": "vectorize-text@>=3.0.1 <4.0.0", "resolved": "https://registry.npmjs.org/vectorize-text/-/vectorize-text-3.0.2.tgz" }, + "vendors": { + "version": "1.0.1", + "from": "vendors@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/vendors/-/vendors-1.0.1.tgz", + "dev": true + }, "verror": { "version": "1.3.6", "from": "verror@1.3.6", "resolved": "https://registry.npmjs.org/verror/-/verror-1.3.6.tgz" }, + "vm-browserify": { + "version": "0.0.4", + "from": "vm-browserify@0.0.4", + "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-0.0.4.tgz", + "dev": true + }, "vt-pbf": { "version": "2.1.2", "from": "vt-pbf@>=2.0.2 <3.0.0", @@ -3101,6 +6526,20 @@ "from": "w3c-blob@0.0.1", "resolved": "https://registry.npmjs.org/w3c-blob/-/w3c-blob-0.0.1.tgz" }, + "watchpack": { + "version": "0.2.9", + "from": "watchpack@>=0.2.1 <0.3.0", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-0.2.9.tgz", + "dev": true, + "dependencies": { + "async": { + "version": "0.9.2", + "from": "async@>=0.9.0 <0.10.0", + "resolved": "https://registry.npmjs.org/async/-/async-0.9.2.tgz", + "dev": true + } + } + }, "weak-map": { "version": "1.0.5", "from": "weak-map@>=1.0.5 <2.0.0", @@ -3116,6 +6555,96 @@ "from": "webgl-context@>=2.2.0 <3.0.0", "resolved": "https://registry.npmjs.org/webgl-context/-/webgl-context-2.2.0.tgz" }, + "webpack": { + "version": "1.14.0", + "from": "webpack@>=1.13.3 <2.0.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-1.14.0.tgz", + "dev": true, + "dependencies": { + "acorn": { + "version": "3.3.0", + "from": "acorn@>=3.0.0 <4.0.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-3.3.0.tgz", + "dev": true + }, + "interpret": { + "version": "0.6.6", + "from": "interpret@>=0.6.4 <0.7.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-0.6.6.tgz", + "dev": true + } + } + }, + "webpack-build-notifier": { + "version": "0.1.13", + "from": "webpack-build-notifier@>=0.1.13 <0.2.0", + "resolved": "https://registry.npmjs.org/webpack-build-notifier/-/webpack-build-notifier-0.1.13.tgz", + "dev": true + }, + "webpack-core": { + "version": "0.6.9", + "from": "webpack-core@>=0.6.9 <0.7.0", + "resolved": "https://registry.npmjs.org/webpack-core/-/webpack-core-0.6.9.tgz", + "dev": true, + "dependencies": { + "source-map": { + "version": "0.4.4", + "from": "source-map@>=0.4.1 <0.5.0", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz", + "dev": true + } + } + }, + "webpack-dev-middleware": { + "version": "1.10.2", + "from": "webpack-dev-middleware@>=1.4.0 <2.0.0", + "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-1.10.2.tgz", + "dev": true, + "dependencies": { + "memory-fs": { + "version": "0.4.1", + "from": "memory-fs@>=0.4.1 <0.5.0", + "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz", + "dev": true + }, + "readable-stream": { + "version": "2.2.9", + "from": "readable-stream@>=2.0.1 <3.0.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.2.9.tgz", + "dev": true + }, + "string_decoder": { + "version": "1.0.0", + "from": "string_decoder@~1.0.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.0.tgz", + "dev": true + } + } + }, + "webpack-dev-server": { + "version": "1.16.3", + "from": "webpack-dev-server@>=1.16.2 <2.0.0", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-1.16.3.tgz", + "dev": true + }, + "webpack-sources": { + "version": "0.1.5", + "from": "webpack-sources@>=0.1.0 <0.2.0", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-0.1.5.tgz", + "dev": true + }, + "websocket-driver": { + "version": "0.6.5", + "from": "websocket-driver@>=0.5.1", + "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.6.5.tgz", + "dev": true + }, + "websocket-extensions": { + "version": "0.1.1", + "from": "websocket-extensions@>=0.1.1", + "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.1.tgz", + "dev": true + }, "webworkify": { "version": "1.4.0", "from": "webworkify@>=1.3.0 <2.0.0", @@ -3126,11 +6655,35 @@ "from": "wgs84@0.0.0", "resolved": "https://registry.npmjs.org/wgs84/-/wgs84-0.0.0.tgz" }, + "whet.extend": { + "version": "0.9.9", + "from": "whet.extend@>=0.9.9 <0.10.0", + "resolved": "https://registry.npmjs.org/whet.extend/-/whet.extend-0.9.9.tgz", + "dev": true + }, + "which": { + "version": "1.2.14", + "from": "which@>=1.2.9 <2.0.0", + "resolved": "https://registry.npmjs.org/which/-/which-1.2.14.tgz", + "dev": true + }, + "which-module": { + "version": "1.0.0", + "from": "which-module@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-1.0.0.tgz", + "dev": true + }, "whoots-js": { "version": "2.1.0", "from": "whoots-js@>=2.0.0 <3.0.0", "resolved": "https://registry.npmjs.org/whoots-js/-/whoots-js-2.1.0.tgz" }, + "wide-align": { + "version": "1.1.0", + "from": "wide-align@>=1.1.0 <2.0.0", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.0.tgz", + "dev": true + }, "window-size": { "version": "0.1.0", "from": "window-size@0.1.0", @@ -3146,21 +6699,65 @@ "from": "world-calendars@>=1.0.3 <2.0.0", "resolved": "https://registry.npmjs.org/world-calendars/-/world-calendars-1.0.3.tgz" }, + "wrap-ansi": { + "version": "2.1.0", + "from": "wrap-ansi@>=2.0.0 <3.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", + "dev": true + }, "wrappy": { "version": "1.0.2", "from": "wrappy@>=1.0.0 <2.0.0", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz" }, + "write": { + "version": "0.2.1", + "from": "write@>=0.2.1 <0.3.0", + "resolved": "https://registry.npmjs.org/write/-/write-0.2.1.tgz", + "dev": true + }, + "xml-char-classes": { + "version": "1.0.0", + "from": "xml-char-classes@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/xml-char-classes/-/xml-char-classes-1.0.0.tgz", + "dev": true + }, "xtend": { "version": "4.0.1", "from": "xtend@>=4.0.0 <5.0.0", "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz" }, + "y18n": { + "version": "3.2.1", + "from": "y18n@>=3.2.1 <4.0.0", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz", + "dev": true + }, + "yallist": { + "version": "2.1.2", + "from": "yallist@>=2.0.0 <3.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", + "dev": true + }, "yargs": { "version": "3.10.0", "from": "yargs@>=3.10.0 <3.11.0", "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz" }, + "yargs-parser": { + "version": "4.2.1", + "from": "yargs-parser@>=4.2.0 <5.0.0", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-4.2.1.tgz", + "dev": true, + "dependencies": { + "camelcase": { + "version": "3.0.0", + "from": "camelcase@>=3.0.0 <4.0.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", + "dev": true + } + } + }, "zero-crossings": { "version": "1.0.1", "from": "zero-crossings@>=1.0.0 <2.0.0", diff --git a/package.json b/package.json index 8f5d5957..7754fc77 100644 --- a/package.json +++ b/package.json @@ -51,7 +51,7 @@ "ng-annotate-loader": "^0.2.0", "pace-progress": "git+https://github.com/getredash/pace.git", "pivottable": "^2.3.0", - "plotly.js": "1.25.0", + "plotly.js": "1.26.1", "ui-select": "^0.19.6", "underscore": "^1.8.3", "underscore.string": "^3.3.4" From 94a14f93a87dda028e25fd7a6c1cf3896f9bb710 Mon Sep 17 00:00:00 2001 From: Arik Fraimovich Date: Tue, 2 May 2017 22:00:09 +0300 Subject: [PATCH 107/112] Remove dev dependencies from npm-shrinkwrap.json. --- npm-shrinkwrap.json | 4083 +++---------------------------------------- 1 file changed, 244 insertions(+), 3839 deletions(-) diff --git a/npm-shrinkwrap.json b/npm-shrinkwrap.json index e2c0c2d1..298af0af 100644 --- a/npm-shrinkwrap.json +++ b/npm-shrinkwrap.json @@ -1,6 +1,6 @@ { "name": "redash-client", - "version": "1.0.0", + "version": "1.0.3", "dependencies": { "3d-view": { "version": "2.0.0", @@ -17,36 +17,10 @@ "from": "a-big-triangle@>=1.0.0 <2.0.0", "resolved": "https://registry.npmjs.org/a-big-triangle/-/a-big-triangle-1.0.3.tgz" }, - "abbrev": { - "version": "1.1.0", - "from": "abbrev@>=1.0.0 <2.0.0", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.0.tgz", - "dev": true - }, - "accepts": { - "version": "1.3.3", - "from": "accepts@>=1.3.3 <1.4.0", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.3.tgz", - "dev": true - }, "acorn": { - "version": "1.2.2", - "from": "acorn@>=1.0.3 <2.0.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-1.2.2.tgz" - }, - "acorn-jsx": { - "version": "3.0.1", - "from": "acorn-jsx@>=3.0.0 <4.0.0", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-3.0.1.tgz", - "dev": true, - "dependencies": { - "acorn": { - "version": "3.3.0", - "from": "acorn@>=3.0.4 <4.0.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-3.3.0.tgz", - "dev": true - } - } + "version": "4.0.4", + "from": "acorn@4.0.4", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-4.0.4.tgz" }, "add-line-numbers": { "version": "1.0.1", @@ -58,18 +32,6 @@ "from": "affine-hull@>=1.0.0 <2.0.0", "resolved": "https://registry.npmjs.org/affine-hull/-/affine-hull-1.0.0.tgz" }, - "ajv": { - "version": "4.11.8", - "from": "ajv@>=4.7.0 <5.0.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-4.11.8.tgz", - "dev": true - }, - "ajv-keywords": { - "version": "1.5.1", - "from": "ajv-keywords@>=1.0.0 <2.0.0", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-1.5.1.tgz", - "dev": true - }, "align-text": { "version": "0.1.4", "from": "align-text@>=0.1.3 <0.2.0", @@ -90,21 +52,15 @@ "from": "alpha-shape@>=1.0.0 <2.0.0", "resolved": "https://registry.npmjs.org/alpha-shape/-/alpha-shape-1.0.0.tgz" }, - "alphanum-sort": { - "version": "1.0.2", - "from": "alphanum-sort@>=1.0.1 <2.0.0", - "resolved": "https://registry.npmjs.org/alphanum-sort/-/alphanum-sort-1.0.2.tgz", - "dev": true - }, "alter": { "version": "0.2.0", "from": "alter@>=0.2.0 <0.3.0", "resolved": "https://registry.npmjs.org/alter/-/alter-0.2.0.tgz" }, "amdefine": { - "version": "1.0.1", + "version": "1.0.0", "from": "amdefine@>=0.0.4", - "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz" + "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.0.tgz" }, "angular": { "version": "1.5.8", @@ -171,12 +127,6 @@ "from": "angular-vs-repeat@latest", "resolved": "https://registry.npmjs.org/angular-vs-repeat/-/angular-vs-repeat-1.1.7.tgz" }, - "ansi-escapes": { - "version": "1.4.0", - "from": "ansi-escapes@>=1.1.0 <2.0.0", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-1.4.0.tgz", - "dev": true - }, "ansi-regex": { "version": "2.0.0", "from": "ansi-regex@>=2.0.0 <3.0.0", @@ -187,137 +137,21 @@ "from": "ansi-styles@>=2.2.1 <3.0.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz" }, - "ansicolors": { - "version": "0.2.1", - "from": "ansicolors@>=0.2.1 <0.3.0", - "resolved": "https://registry.npmjs.org/ansicolors/-/ansicolors-0.2.1.tgz", - "dev": true - }, - "anymatch": { - "version": "1.3.0", - "from": "anymatch@>=1.3.0 <2.0.0", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-1.3.0.tgz", - "dev": true - }, - "aproba": { - "version": "1.1.1", - "from": "aproba@>=1.0.3 <2.0.0", - "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.1.1.tgz", - "dev": true - }, - "are-we-there-yet": { - "version": "1.1.4", - "from": "are-we-there-yet@>=1.1.2 <1.2.0", - "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.4.tgz", - "dev": true, - "dependencies": { - "readable-stream": { - "version": "2.2.9", - "from": "readable-stream@>=2.0.6 <3.0.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.2.9.tgz", - "dev": true - }, - "string_decoder": { - "version": "1.0.0", - "from": "string_decoder@~1.0.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.0.tgz", - "dev": true - } - } - }, - "argparse": { - "version": "1.0.9", - "from": "argparse@>=1.0.7 <2.0.0", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.9.tgz", - "dev": true - }, - "arr-diff": { - "version": "2.0.0", - "from": "arr-diff@>=2.0.0 <3.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", - "dev": true - }, - "arr-flatten": { - "version": "1.0.3", - "from": "arr-flatten@>=1.0.1 <2.0.0", - "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.0.3.tgz", - "dev": true - }, - "array-find-index": { - "version": "1.0.2", - "from": "array-find-index@>=1.0.1 <2.0.0", - "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz", - "dev": true - }, - "array-flatten": { - "version": "1.1.1", - "from": "array-flatten@1.1.1", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", - "dev": true - }, - "array-union": { - "version": "1.0.2", - "from": "array-union@>=1.0.1 <2.0.0", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", - "dev": true - }, - "array-uniq": { - "version": "1.0.3", - "from": "array-uniq@>=1.0.1 <2.0.0", - "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", - "dev": true - }, - "array-unique": { - "version": "0.2.1", - "from": "array-unique@>=0.2.1 <0.3.0", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", - "dev": true - }, "arraytools": { "version": "1.1.2", "from": "arraytools@>=1.0.0 <2.0.0", "resolved": "https://registry.npmjs.org/arraytools/-/arraytools-1.1.2.tgz" }, - "arrify": { - "version": "1.0.1", - "from": "arrify@>=1.0.0 <2.0.0", - "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", - "dev": true - }, "asn1": { "version": "0.2.3", "from": "asn1@>=0.2.3 <0.3.0", "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.3.tgz" }, - "assert": { - "version": "1.4.1", - "from": "assert@>=1.1.1 <2.0.0", - "resolved": "https://registry.npmjs.org/assert/-/assert-1.4.1.tgz", - "dev": true - }, "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" }, - "async": { - "version": "1.5.2", - "from": "async@>=1.5.0 <2.0.0", - "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", - "dev": true - }, - "async-each": { - "version": "1.0.1", - "from": "async-each@>=1.0.0 <2.0.0", - "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.1.tgz", - "dev": true - }, - "async-foreach": { - "version": "0.1.3", - "from": "async-foreach@>=0.1.3 <0.2.0", - "resolved": "https://registry.npmjs.org/async-foreach/-/async-foreach-0.1.3.tgz", - "dev": true - }, "asynckit": { "version": "0.4.0", "from": "asynckit@>=0.4.0 <0.5.0", @@ -328,12 +162,6 @@ "from": "atob-lite@>=1.0.0 <2.0.0", "resolved": "https://registry.npmjs.org/atob-lite/-/atob-lite-1.0.0.tgz" }, - "autoprefixer": { - "version": "6.7.7", - "from": "autoprefixer@>=6.3.1 <7.0.0", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-6.7.7.tgz", - "dev": true - }, "aws-sign2": { "version": "0.6.0", "from": "aws-sign2@>=0.6.0 <0.7.0", @@ -344,416 +172,6 @@ "from": "aws4@>=1.2.1 <2.0.0", "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.5.0.tgz" }, - "babel-code-frame": { - "version": "6.22.0", - "from": "babel-code-frame@>=6.22.0 <7.0.0", - "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.22.0.tgz", - "dev": true - }, - "babel-core": { - "version": "6.24.0", - "from": "babel-core@>=6.18.0 <7.0.0", - "resolved": "https://registry.npmjs.org/babel-core/-/babel-core-6.24.0.tgz", - "dev": true - }, - "babel-generator": { - "version": "6.24.1", - "from": "babel-generator@>=6.24.0 <7.0.0", - "resolved": "https://registry.npmjs.org/babel-generator/-/babel-generator-6.24.1.tgz", - "dev": true - }, - "babel-helper-bindify-decorators": { - "version": "6.24.1", - "from": "babel-helper-bindify-decorators@>=6.24.1 <7.0.0", - "resolved": "https://registry.npmjs.org/babel-helper-bindify-decorators/-/babel-helper-bindify-decorators-6.24.1.tgz", - "dev": true - }, - "babel-helper-builder-binary-assignment-operator-visitor": { - "version": "6.24.1", - "from": "babel-helper-builder-binary-assignment-operator-visitor@>=6.24.1 <7.0.0", - "resolved": "https://registry.npmjs.org/babel-helper-builder-binary-assignment-operator-visitor/-/babel-helper-builder-binary-assignment-operator-visitor-6.24.1.tgz", - "dev": true - }, - "babel-helper-call-delegate": { - "version": "6.24.1", - "from": "babel-helper-call-delegate@>=6.24.1 <7.0.0", - "resolved": "https://registry.npmjs.org/babel-helper-call-delegate/-/babel-helper-call-delegate-6.24.1.tgz", - "dev": true - }, - "babel-helper-define-map": { - "version": "6.24.1", - "from": "babel-helper-define-map@>=6.24.1 <7.0.0", - "resolved": "https://registry.npmjs.org/babel-helper-define-map/-/babel-helper-define-map-6.24.1.tgz", - "dev": true - }, - "babel-helper-explode-assignable-expression": { - "version": "6.24.1", - "from": "babel-helper-explode-assignable-expression@>=6.24.1 <7.0.0", - "resolved": "https://registry.npmjs.org/babel-helper-explode-assignable-expression/-/babel-helper-explode-assignable-expression-6.24.1.tgz", - "dev": true - }, - "babel-helper-explode-class": { - "version": "6.24.1", - "from": "babel-helper-explode-class@>=6.24.1 <7.0.0", - "resolved": "https://registry.npmjs.org/babel-helper-explode-class/-/babel-helper-explode-class-6.24.1.tgz", - "dev": true - }, - "babel-helper-function-name": { - "version": "6.24.1", - "from": "babel-helper-function-name@>=6.24.1 <7.0.0", - "resolved": "https://registry.npmjs.org/babel-helper-function-name/-/babel-helper-function-name-6.24.1.tgz", - "dev": true - }, - "babel-helper-get-function-arity": { - "version": "6.24.1", - "from": "babel-helper-get-function-arity@>=6.24.1 <7.0.0", - "resolved": "https://registry.npmjs.org/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.24.1.tgz", - "dev": true - }, - "babel-helper-hoist-variables": { - "version": "6.24.1", - "from": "babel-helper-hoist-variables@>=6.24.1 <7.0.0", - "resolved": "https://registry.npmjs.org/babel-helper-hoist-variables/-/babel-helper-hoist-variables-6.24.1.tgz", - "dev": true - }, - "babel-helper-optimise-call-expression": { - "version": "6.24.1", - "from": "babel-helper-optimise-call-expression@>=6.24.1 <7.0.0", - "resolved": "https://registry.npmjs.org/babel-helper-optimise-call-expression/-/babel-helper-optimise-call-expression-6.24.1.tgz", - "dev": true - }, - "babel-helper-regex": { - "version": "6.24.1", - "from": "babel-helper-regex@>=6.24.1 <7.0.0", - "resolved": "https://registry.npmjs.org/babel-helper-regex/-/babel-helper-regex-6.24.1.tgz", - "dev": true - }, - "babel-helper-remap-async-to-generator": { - "version": "6.24.1", - "from": "babel-helper-remap-async-to-generator@>=6.24.1 <7.0.0", - "resolved": "https://registry.npmjs.org/babel-helper-remap-async-to-generator/-/babel-helper-remap-async-to-generator-6.24.1.tgz", - "dev": true - }, - "babel-helper-replace-supers": { - "version": "6.24.1", - "from": "babel-helper-replace-supers@>=6.24.1 <7.0.0", - "resolved": "https://registry.npmjs.org/babel-helper-replace-supers/-/babel-helper-replace-supers-6.24.1.tgz", - "dev": true - }, - "babel-helpers": { - "version": "6.24.1", - "from": "babel-helpers@>=6.23.0 <7.0.0", - "resolved": "https://registry.npmjs.org/babel-helpers/-/babel-helpers-6.24.1.tgz", - "dev": true - }, - "babel-loader": { - "version": "6.4.1", - "from": "babel-loader@>=6.2.7 <7.0.0", - "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-6.4.1.tgz", - "dev": true - }, - "babel-messages": { - "version": "6.23.0", - "from": "babel-messages@>=6.23.0 <7.0.0", - "resolved": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.23.0.tgz", - "dev": true - }, - "babel-plugin-check-es2015-constants": { - "version": "6.22.0", - "from": "babel-plugin-check-es2015-constants@>=6.22.0 <7.0.0", - "resolved": "https://registry.npmjs.org/babel-plugin-check-es2015-constants/-/babel-plugin-check-es2015-constants-6.22.0.tgz", - "dev": true - }, - "babel-plugin-syntax-async-functions": { - "version": "6.13.0", - "from": "babel-plugin-syntax-async-functions@>=6.8.0 <7.0.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-async-functions/-/babel-plugin-syntax-async-functions-6.13.0.tgz", - "dev": true - }, - "babel-plugin-syntax-async-generators": { - "version": "6.13.0", - "from": "babel-plugin-syntax-async-generators@>=6.5.0 <7.0.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-async-generators/-/babel-plugin-syntax-async-generators-6.13.0.tgz", - "dev": true - }, - "babel-plugin-syntax-class-properties": { - "version": "6.13.0", - "from": "babel-plugin-syntax-class-properties@>=6.8.0 <7.0.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-class-properties/-/babel-plugin-syntax-class-properties-6.13.0.tgz", - "dev": true - }, - "babel-plugin-syntax-decorators": { - "version": "6.13.0", - "from": "babel-plugin-syntax-decorators@>=6.13.0 <7.0.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-decorators/-/babel-plugin-syntax-decorators-6.13.0.tgz", - "dev": true - }, - "babel-plugin-syntax-dynamic-import": { - "version": "6.18.0", - "from": "babel-plugin-syntax-dynamic-import@>=6.18.0 <7.0.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-dynamic-import/-/babel-plugin-syntax-dynamic-import-6.18.0.tgz", - "dev": true - }, - "babel-plugin-syntax-exponentiation-operator": { - "version": "6.13.0", - "from": "babel-plugin-syntax-exponentiation-operator@>=6.8.0 <7.0.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-exponentiation-operator/-/babel-plugin-syntax-exponentiation-operator-6.13.0.tgz", - "dev": true - }, - "babel-plugin-syntax-object-rest-spread": { - "version": "6.13.0", - "from": "babel-plugin-syntax-object-rest-spread@>=6.8.0 <7.0.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-object-rest-spread/-/babel-plugin-syntax-object-rest-spread-6.13.0.tgz", - "dev": true - }, - "babel-plugin-syntax-trailing-function-commas": { - "version": "6.22.0", - "from": "babel-plugin-syntax-trailing-function-commas@>=6.22.0 <7.0.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-trailing-function-commas/-/babel-plugin-syntax-trailing-function-commas-6.22.0.tgz", - "dev": true - }, - "babel-plugin-transform-async-generator-functions": { - "version": "6.24.1", - "from": "babel-plugin-transform-async-generator-functions@>=6.24.1 <7.0.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-async-generator-functions/-/babel-plugin-transform-async-generator-functions-6.24.1.tgz", - "dev": true - }, - "babel-plugin-transform-async-to-generator": { - "version": "6.24.1", - "from": "babel-plugin-transform-async-to-generator@>=6.24.1 <7.0.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-async-to-generator/-/babel-plugin-transform-async-to-generator-6.24.1.tgz", - "dev": true - }, - "babel-plugin-transform-class-properties": { - "version": "6.24.1", - "from": "babel-plugin-transform-class-properties@>=6.22.0 <7.0.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-class-properties/-/babel-plugin-transform-class-properties-6.24.1.tgz", - "dev": true - }, - "babel-plugin-transform-decorators": { - "version": "6.24.1", - "from": "babel-plugin-transform-decorators@>=6.22.0 <7.0.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-decorators/-/babel-plugin-transform-decorators-6.24.1.tgz", - "dev": true - }, - "babel-plugin-transform-es2015-arrow-functions": { - "version": "6.22.0", - "from": "babel-plugin-transform-es2015-arrow-functions@>=6.22.0 <7.0.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-arrow-functions/-/babel-plugin-transform-es2015-arrow-functions-6.22.0.tgz", - "dev": true - }, - "babel-plugin-transform-es2015-block-scoped-functions": { - "version": "6.22.0", - "from": "babel-plugin-transform-es2015-block-scoped-functions@>=6.22.0 <7.0.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-block-scoped-functions/-/babel-plugin-transform-es2015-block-scoped-functions-6.22.0.tgz", - "dev": true - }, - "babel-plugin-transform-es2015-block-scoping": { - "version": "6.24.1", - "from": "babel-plugin-transform-es2015-block-scoping@>=6.22.0 <7.0.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-block-scoping/-/babel-plugin-transform-es2015-block-scoping-6.24.1.tgz", - "dev": true - }, - "babel-plugin-transform-es2015-classes": { - "version": "6.24.1", - "from": "babel-plugin-transform-es2015-classes@>=6.22.0 <7.0.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-classes/-/babel-plugin-transform-es2015-classes-6.24.1.tgz", - "dev": true - }, - "babel-plugin-transform-es2015-computed-properties": { - "version": "6.24.1", - "from": "babel-plugin-transform-es2015-computed-properties@>=6.22.0 <7.0.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-computed-properties/-/babel-plugin-transform-es2015-computed-properties-6.24.1.tgz", - "dev": true - }, - "babel-plugin-transform-es2015-destructuring": { - "version": "6.23.0", - "from": "babel-plugin-transform-es2015-destructuring@>=6.22.0 <7.0.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-destructuring/-/babel-plugin-transform-es2015-destructuring-6.23.0.tgz", - "dev": true - }, - "babel-plugin-transform-es2015-duplicate-keys": { - "version": "6.24.1", - "from": "babel-plugin-transform-es2015-duplicate-keys@>=6.22.0 <7.0.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-duplicate-keys/-/babel-plugin-transform-es2015-duplicate-keys-6.24.1.tgz", - "dev": true - }, - "babel-plugin-transform-es2015-for-of": { - "version": "6.23.0", - "from": "babel-plugin-transform-es2015-for-of@>=6.22.0 <7.0.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-for-of/-/babel-plugin-transform-es2015-for-of-6.23.0.tgz", - "dev": true - }, - "babel-plugin-transform-es2015-function-name": { - "version": "6.24.1", - "from": "babel-plugin-transform-es2015-function-name@>=6.22.0 <7.0.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-function-name/-/babel-plugin-transform-es2015-function-name-6.24.1.tgz", - "dev": true - }, - "babel-plugin-transform-es2015-literals": { - "version": "6.22.0", - "from": "babel-plugin-transform-es2015-literals@>=6.22.0 <7.0.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-literals/-/babel-plugin-transform-es2015-literals-6.22.0.tgz", - "dev": true - }, - "babel-plugin-transform-es2015-modules-amd": { - "version": "6.24.1", - "from": "babel-plugin-transform-es2015-modules-amd@>=6.24.0 <7.0.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-amd/-/babel-plugin-transform-es2015-modules-amd-6.24.1.tgz", - "dev": true - }, - "babel-plugin-transform-es2015-modules-commonjs": { - "version": "6.24.1", - "from": "babel-plugin-transform-es2015-modules-commonjs@>=6.24.0 <7.0.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.24.1.tgz", - "dev": true - }, - "babel-plugin-transform-es2015-modules-systemjs": { - "version": "6.24.1", - "from": "babel-plugin-transform-es2015-modules-systemjs@>=6.22.0 <7.0.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-systemjs/-/babel-plugin-transform-es2015-modules-systemjs-6.24.1.tgz", - "dev": true - }, - "babel-plugin-transform-es2015-modules-umd": { - "version": "6.24.1", - "from": "babel-plugin-transform-es2015-modules-umd@>=6.24.0 <7.0.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-umd/-/babel-plugin-transform-es2015-modules-umd-6.24.1.tgz", - "dev": true - }, - "babel-plugin-transform-es2015-object-super": { - "version": "6.24.1", - "from": "babel-plugin-transform-es2015-object-super@>=6.22.0 <7.0.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-object-super/-/babel-plugin-transform-es2015-object-super-6.24.1.tgz", - "dev": true - }, - "babel-plugin-transform-es2015-parameters": { - "version": "6.24.1", - "from": "babel-plugin-transform-es2015-parameters@>=6.22.0 <7.0.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-parameters/-/babel-plugin-transform-es2015-parameters-6.24.1.tgz", - "dev": true - }, - "babel-plugin-transform-es2015-shorthand-properties": { - "version": "6.24.1", - "from": "babel-plugin-transform-es2015-shorthand-properties@>=6.22.0 <7.0.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-shorthand-properties/-/babel-plugin-transform-es2015-shorthand-properties-6.24.1.tgz", - "dev": true - }, - "babel-plugin-transform-es2015-spread": { - "version": "6.22.0", - "from": "babel-plugin-transform-es2015-spread@>=6.22.0 <7.0.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-spread/-/babel-plugin-transform-es2015-spread-6.22.0.tgz", - "dev": true - }, - "babel-plugin-transform-es2015-sticky-regex": { - "version": "6.24.1", - "from": "babel-plugin-transform-es2015-sticky-regex@>=6.22.0 <7.0.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-sticky-regex/-/babel-plugin-transform-es2015-sticky-regex-6.24.1.tgz", - "dev": true - }, - "babel-plugin-transform-es2015-template-literals": { - "version": "6.22.0", - "from": "babel-plugin-transform-es2015-template-literals@>=6.22.0 <7.0.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-template-literals/-/babel-plugin-transform-es2015-template-literals-6.22.0.tgz", - "dev": true - }, - "babel-plugin-transform-es2015-typeof-symbol": { - "version": "6.23.0", - "from": "babel-plugin-transform-es2015-typeof-symbol@>=6.22.0 <7.0.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-typeof-symbol/-/babel-plugin-transform-es2015-typeof-symbol-6.23.0.tgz", - "dev": true - }, - "babel-plugin-transform-es2015-unicode-regex": { - "version": "6.24.1", - "from": "babel-plugin-transform-es2015-unicode-regex@>=6.22.0 <7.0.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-unicode-regex/-/babel-plugin-transform-es2015-unicode-regex-6.24.1.tgz", - "dev": true - }, - "babel-plugin-transform-exponentiation-operator": { - "version": "6.24.1", - "from": "babel-plugin-transform-exponentiation-operator@>=6.24.1 <7.0.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-exponentiation-operator/-/babel-plugin-transform-exponentiation-operator-6.24.1.tgz", - "dev": true - }, - "babel-plugin-transform-object-rest-spread": { - "version": "6.23.0", - "from": "babel-plugin-transform-object-rest-spread@>=6.22.0 <7.0.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-object-rest-spread/-/babel-plugin-transform-object-rest-spread-6.23.0.tgz", - "dev": true - }, - "babel-plugin-transform-regenerator": { - "version": "6.24.1", - "from": "babel-plugin-transform-regenerator@>=6.22.0 <7.0.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-regenerator/-/babel-plugin-transform-regenerator-6.24.1.tgz", - "dev": true - }, - "babel-plugin-transform-strict-mode": { - "version": "6.24.1", - "from": "babel-plugin-transform-strict-mode@>=6.24.1 <7.0.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.24.1.tgz", - "dev": true - }, - "babel-preset-es2015": { - "version": "6.24.0", - "from": "babel-preset-es2015@>=6.18.0 <7.0.0", - "resolved": "https://registry.npmjs.org/babel-preset-es2015/-/babel-preset-es2015-6.24.0.tgz", - "dev": true - }, - "babel-preset-stage-2": { - "version": "6.22.0", - "from": "babel-preset-stage-2@>=6.18.0 <7.0.0", - "resolved": "https://registry.npmjs.org/babel-preset-stage-2/-/babel-preset-stage-2-6.22.0.tgz", - "dev": true - }, - "babel-preset-stage-3": { - "version": "6.24.1", - "from": "babel-preset-stage-3@>=6.22.0 <7.0.0", - "resolved": "https://registry.npmjs.org/babel-preset-stage-3/-/babel-preset-stage-3-6.24.1.tgz", - "dev": true - }, - "babel-register": { - "version": "6.24.1", - "from": "babel-register@>=6.24.0 <7.0.0", - "resolved": "https://registry.npmjs.org/babel-register/-/babel-register-6.24.1.tgz", - "dev": true, - "dependencies": { - "babel-core": { - "version": "6.24.1", - "from": "babel-core@>=6.24.1 <7.0.0", - "resolved": "https://registry.npmjs.org/babel-core/-/babel-core-6.24.1.tgz", - "dev": true - } - } - }, - "babel-runtime": { - "version": "6.23.0", - "from": "babel-runtime@>=6.22.0 <7.0.0", - "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.23.0.tgz", - "dev": true - }, - "babel-template": { - "version": "6.24.1", - "from": "babel-template@>=6.23.0 <7.0.0", - "resolved": "https://registry.npmjs.org/babel-template/-/babel-template-6.24.1.tgz", - "dev": true - }, - "babel-traverse": { - "version": "6.24.1", - "from": "babel-traverse@>=6.23.1 <7.0.0", - "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.24.1.tgz", - "dev": true - }, - "babel-types": { - "version": "6.24.1", - "from": "babel-types@>=6.23.0 <7.0.0", - "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.24.1.tgz", - "dev": true - }, - "babylon": { - "version": "6.17.0", - "from": "babylon@>=6.11.0 <7.0.0", - "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.17.0.tgz", - "dev": true - }, "balanced-match": { "version": "0.4.2", "from": "balanced-match@>=0.4.1 <0.5.0", @@ -764,17 +182,6 @@ "from": "barycentric@>=1.0.1 <2.0.0", "resolved": "https://registry.npmjs.org/barycentric/-/barycentric-1.0.1.tgz" }, - "base64-js": { - "version": "0.0.2", - "from": "base64-js@0.0.2", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-0.0.2.tgz" - }, - "batch": { - "version": "0.5.3", - "from": "batch@0.5.3", - "resolved": "https://registry.npmjs.org/batch/-/batch-0.5.3.tgz", - "dev": true - }, "bcrypt-pbkdf": { "version": "1.0.0", "from": "bcrypt-pbkdf@>=1.0.0 <2.0.0", @@ -791,12 +198,6 @@ "from": "big.js@>=3.1.3 <4.0.0", "resolved": "https://registry.npmjs.org/big.js/-/big.js-3.1.3.tgz" }, - "binary-extensions": { - "version": "1.8.0", - "from": "binary-extensions@>=1.0.0 <2.0.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.8.0.tgz", - "dev": true - }, "binary-search-bounds": { "version": "1.0.0", "from": "binary-search-bounds@>=1.0.0 <2.0.0", @@ -808,45 +209,15 @@ "resolved": "https://registry.npmjs.org/bit-twiddle/-/bit-twiddle-1.0.2.tgz" }, "bl": { - "version": "1.2.0", + "version": "1.2.1", "from": "bl@>=1.0.0 <2.0.0", - "resolved": "https://registry.npmjs.org/bl/-/bl-1.2.0.tgz", - "dependencies": { - "readable-stream": { - "version": "2.2.9", - "from": "readable-stream@>=2.0.5 <3.0.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.2.9.tgz" - }, - "string_decoder": { - "version": "1.0.0", - "from": "string_decoder@>=1.0.0 <1.1.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.0.tgz" - } - } - }, - "block-stream": { - "version": "0.0.9", - "from": "block-stream@*", - "resolved": "https://registry.npmjs.org/block-stream/-/block-stream-0.0.9.tgz", - "dev": true - }, - "bluebird": { - "version": "3.5.0", - "from": "bluebird@>=3.4.7 <4.0.0", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.0.tgz", - "dev": true + "resolved": "https://registry.npmjs.org/bl/-/bl-1.2.1.tgz" }, "bn.js": { "version": "4.11.6", "from": "bn.js@>=4.11.6 <5.0.0", "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.6.tgz" }, - "boolbase": { - "version": "1.0.0", - "from": "boolbase@>=1.0.0 <1.1.0", - "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", - "dev": true - }, "boom": { "version": "2.10.1", "from": "boom@>=2.0.0 <3.0.0", @@ -855,7 +226,14 @@ "bops": { "version": "0.0.6", "from": "bops@0.0.6", - "resolved": "https://registry.npmjs.org/bops/-/bops-0.0.6.tgz" + "resolved": "https://registry.npmjs.org/bops/-/bops-0.0.6.tgz", + "dependencies": { + "base64-js": { + "version": "0.0.2", + "from": "base64-js@0.0.2", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-0.0.2.tgz" + } + } }, "boundary-cells": { "version": "2.0.1", @@ -877,12 +255,6 @@ "from": "brace-expansion@>=1.0.0 <2.0.0", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.6.tgz" }, - "braces": { - "version": "1.8.5", - "from": "braces@>=1.8.2 <2.0.0", - "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz", - "dev": true - }, "brfs": { "version": "1.4.3", "from": "brfs@>=1.4.0 <2.0.0", @@ -898,16 +270,6 @@ "from": "quote-stream@>=1.0.1 <2.0.0", "resolved": "https://registry.npmjs.org/quote-stream/-/quote-stream-1.0.2.tgz" }, - "readable-stream": { - "version": "2.2.9", - "from": "readable-stream@>=2.1.5 <3.0.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.2.9.tgz" - }, - "string_decoder": { - "version": "1.0.0", - "from": "string_decoder@~1.0.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.0.tgz" - }, "through2": { "version": "2.0.3", "from": "through2@>=2.0.0 <3.0.0", @@ -915,38 +277,6 @@ } } }, - "browserify-aes": { - "version": "0.4.0", - "from": "browserify-aes@0.4.0", - "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-0.4.0.tgz", - "dev": true - }, - "browserify-zlib": { - "version": "0.1.4", - "from": "browserify-zlib@>=0.1.4 <0.2.0", - "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.1.4.tgz", - "dev": true - }, - "browserslist": { - "version": "1.7.7", - "from": "browserslist@>=1.7.6 <2.0.0", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-1.7.7.tgz", - "dev": true - }, - "buffer": { - "version": "4.9.1", - "from": "buffer@>=4.9.0 <5.0.0", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.1.tgz", - "dev": true, - "dependencies": { - "base64-js": { - "version": "1.2.0", - "from": "base64-js@>=1.0.2 <2.0.0", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.2.0.tgz", - "dev": true - } - } - }, "buffer-equal": { "version": "0.0.1", "from": "buffer-equal@0.0.1", @@ -957,24 +287,6 @@ "from": "buffer-shims@>=1.0.0 <2.0.0", "resolved": "https://registry.npmjs.org/buffer-shims/-/buffer-shims-1.0.0.tgz" }, - "builtin-modules": { - "version": "1.1.1", - "from": "builtin-modules@>=1.1.1 <2.0.0", - "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", - "dev": true - }, - "builtin-status-codes": { - "version": "3.0.0", - "from": "builtin-status-codes@>=3.0.0 <4.0.0", - "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", - "dev": true - }, - "bytes": { - "version": "2.3.0", - "from": "bytes@2.3.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-2.3.0.tgz", - "dev": true - }, "call-matcher": { "version": "1.0.1", "from": "call-matcher@>=1.0.1 <2.0.0", @@ -987,61 +299,11 @@ } } }, - "caller-path": { - "version": "0.1.0", - "from": "caller-path@>=0.1.0 <0.2.0", - "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-0.1.0.tgz", - "dev": true - }, - "callsites": { - "version": "0.2.0", - "from": "callsites@>=0.2.0 <0.3.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-0.2.0.tgz", - "dev": true - }, - "camel-case": { - "version": "3.0.0", - "from": "camel-case@>=3.0.0 <3.1.0", - "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-3.0.0.tgz", - "dev": true - }, "camelcase": { "version": "1.2.1", "from": "camelcase@>=1.0.2 <2.0.0", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz" }, - "camelcase-keys": { - "version": "2.1.0", - "from": "camelcase-keys@>=2.0.0 <3.0.0", - "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz", - "dev": true, - "dependencies": { - "camelcase": { - "version": "2.1.1", - "from": "camelcase@>=2.0.0 <3.0.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz", - "dev": true - } - } - }, - "caniuse-api": { - "version": "1.6.1", - "from": "caniuse-api@>=1.5.2 <2.0.0", - "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-1.6.1.tgz", - "dev": true - }, - "caniuse-db": { - "version": "1.0.30000664", - "from": "caniuse-db@>=1.0.30000634 <2.0.0", - "resolved": "https://registry.npmjs.org/caniuse-db/-/caniuse-db-1.0.30000664.tgz", - "dev": true - }, - "cardinal": { - "version": "1.0.0", - "from": "cardinal@>=1.0.0 <2.0.0", - "resolved": "https://registry.npmjs.org/cardinal/-/cardinal-1.0.0.tgz", - "dev": true - }, "caseless": { "version": "0.11.0", "from": "caseless@>=0.11.0 <0.12.0", @@ -1081,18 +343,6 @@ } } }, - "chokidar": { - "version": "1.6.1", - "from": "chokidar@>=1.0.0 <2.0.0", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-1.6.1.tgz", - "dev": true - }, - "circular-json": { - "version": "0.3.1", - "from": "circular-json@>=0.3.1 <0.4.0", - "resolved": "https://registry.npmjs.org/circular-json/-/circular-json-0.3.1.tgz", - "dev": true - }, "circumcenter": { "version": "1.0.0", "from": "circumcenter@>=1.0.0 <2.0.0", @@ -1108,55 +358,11 @@ "from": "clamp@>=1.0.1 <2.0.0", "resolved": "https://registry.npmjs.org/clamp/-/clamp-1.0.1.tgz" }, - "clap": { - "version": "1.1.3", - "from": "clap@>=1.0.9 <2.0.0", - "resolved": "https://registry.npmjs.org/clap/-/clap-1.1.3.tgz", - "dev": true - }, - "clean-css": { - "version": "4.0.12", - "from": "clean-css@>=4.0.0 <4.1.0", - "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-4.0.12.tgz", - "dev": true - }, "clean-pslg": { "version": "1.1.2", "from": "clean-pslg@>=1.1.0 <2.0.0", "resolved": "https://registry.npmjs.org/clean-pslg/-/clean-pslg-1.1.2.tgz" }, - "cli-cursor": { - "version": "1.0.2", - "from": "cli-cursor@>=1.0.1 <2.0.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-1.0.2.tgz", - "dev": true - }, - "cli-table": { - "version": "0.3.1", - "from": "cli-table@>=0.3.1 <0.4.0", - "resolved": "https://registry.npmjs.org/cli-table/-/cli-table-0.3.1.tgz", - "dev": true, - "dependencies": { - "colors": { - "version": "1.0.3", - "from": "colors@1.0.3", - "resolved": "https://registry.npmjs.org/colors/-/colors-1.0.3.tgz", - "dev": true - } - } - }, - "cli-usage": { - "version": "0.1.4", - "from": "cli-usage@>=0.1.1 <0.2.0", - "resolved": "https://registry.npmjs.org/cli-usage/-/cli-usage-0.1.4.tgz", - "dev": true - }, - "cli-width": { - "version": "2.1.0", - "from": "cli-width@>=2.0.0 <3.0.0", - "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.1.0.tgz", - "dev": true - }, "cliui": { "version": "2.1.0", "from": "cliui@>=2.1.0 <3.0.0", @@ -1174,36 +380,6 @@ "from": "clone@>=1.0.2 <2.0.0", "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.2.tgz" }, - "co": { - "version": "4.6.0", - "from": "co@>=4.6.0 <5.0.0", - "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", - "dev": true - }, - "coa": { - "version": "1.0.1", - "from": "coa@>=1.0.1 <1.1.0", - "resolved": "https://registry.npmjs.org/coa/-/coa-1.0.1.tgz", - "dev": true - }, - "code-point-at": { - "version": "1.1.0", - "from": "code-point-at@>=1.0.0 <2.0.0", - "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", - "dev": true - }, - "color": { - "version": "0.11.4", - "from": "color@>=0.11.0 <0.12.0", - "resolved": "https://registry.npmjs.org/color/-/color-0.11.4.tgz", - "dev": true - }, - "color-convert": { - "version": "1.9.0", - "from": "color-convert@>=1.3.0 <2.0.0", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.0.tgz", - "dev": true - }, "color-id": { "version": "1.0.3", "from": "color-id@>=1.0.0 <2.0.0", @@ -1229,28 +405,11 @@ "from": "color-space@>=1.14.6 <2.0.0", "resolved": "https://registry.npmjs.org/color-space/-/color-space-1.14.7.tgz" }, - "color-string": { - "version": "0.3.0", - "from": "color-string@>=0.3.0 <0.4.0", - "resolved": "https://registry.npmjs.org/color-string/-/color-string-0.3.0.tgz", - "dev": true - }, "colormap": { "version": "2.2.0", "from": "colormap@>=2.1.0 <3.0.0", "resolved": "https://registry.npmjs.org/colormap/-/colormap-2.2.0.tgz" }, - "colormin": { - "version": "1.1.2", - "from": "colormin@>=1.0.5 <2.0.0", - "resolved": "https://registry.npmjs.org/colormin/-/colormin-1.1.2.tgz", - "dev": true - }, - "colors": { - "version": "0.6.2", - "from": "colors@>=0.6.0-1 <0.7.0", - "resolved": "https://registry.npmjs.org/colors/-/colors-0.6.2.tgz" - }, "combined-stream": { "version": "1.0.5", "from": "combined-stream@>=1.0.5 <1.1.0", @@ -1261,12 +420,6 @@ "from": "commander@>=2.9.0 <2.10.0", "resolved": "https://registry.npmjs.org/commander/-/commander-2.9.0.tgz" }, - "commondir": { - "version": "1.0.1", - "from": "commondir@>=1.0.1 <2.0.0", - "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", - "dev": true - }, "compare-angle": { "version": "1.0.1", "from": "compare-angle@>=1.0.0 <2.0.0", @@ -1282,26 +435,6 @@ "from": "compare-oriented-cell@>=1.0.1 <2.0.0", "resolved": "https://registry.npmjs.org/compare-oriented-cell/-/compare-oriented-cell-1.0.1.tgz" }, - "compressible": { - "version": "2.0.10", - "from": "compressible@>=2.0.8 <2.1.0", - "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.10.tgz", - "dev": true, - "dependencies": { - "mime-db": { - "version": "1.27.0", - "from": "mime-db@>=1.27.0 <2.0.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.27.0.tgz", - "dev": true - } - } - }, - "compression": { - "version": "1.6.2", - "from": "compression@>=1.5.2 <2.0.0", - "resolved": "https://registry.npmjs.org/compression/-/compression-1.6.2.tgz", - "dev": true - }, "concat-map": { "version": "0.0.1", "from": "concat-map@0.0.1", @@ -1324,48 +457,6 @@ } } }, - "connect-history-api-fallback": { - "version": "1.3.0", - "from": "connect-history-api-fallback@>=1.3.0 <2.0.0", - "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-1.3.0.tgz", - "dev": true - }, - "console-browserify": { - "version": "1.1.0", - "from": "console-browserify@>=1.1.0 <2.0.0", - "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.1.0.tgz", - "dev": true - }, - "console-control-strings": { - "version": "1.1.0", - "from": "console-control-strings@>=1.1.0 <1.2.0", - "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", - "dev": true - }, - "constants-browserify": { - "version": "1.0.0", - "from": "constants-browserify@>=1.0.0 <2.0.0", - "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", - "dev": true - }, - "contains-path": { - "version": "0.1.0", - "from": "contains-path@>=0.1.0 <0.2.0", - "resolved": "https://registry.npmjs.org/contains-path/-/contains-path-0.1.0.tgz", - "dev": true - }, - "content-disposition": { - "version": "0.5.2", - "from": "content-disposition@0.5.2", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz", - "dev": true - }, - "content-type": { - "version": "1.0.2", - "from": "content-type@>=1.0.2 <1.1.0", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.2.tgz", - "dev": true - }, "convert-source-map": { "version": "1.3.0", "from": "convert-source-map@>=1.1.0 <2.0.0", @@ -1376,21 +467,9 @@ "from": "convex-hull@>=1.0.3 <2.0.0", "resolved": "https://registry.npmjs.org/convex-hull/-/convex-hull-1.0.3.tgz" }, - "cookie": { - "version": "0.3.1", - "from": "cookie@0.3.1", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz", - "dev": true - }, - "cookie-signature": { - "version": "1.0.6", - "from": "cookie-signature@1.0.6", - "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", - "dev": true - }, "core-js": { "version": "2.4.1", - "from": "core-js@>=2.4.0 <3.0.0", + "from": "https://registry.npmjs.org/core-js/-/core-js-2.4.1.tgz", "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.4.1.tgz" }, "core-util-is": { @@ -1408,95 +487,21 @@ "from": "country-regex@>=1.1.0 <2.0.0", "resolved": "https://registry.npmjs.org/country-regex/-/country-regex-1.1.0.tgz" }, - "cross-spawn": { - "version": "3.0.1", - "from": "cross-spawn@>=3.0.0 <4.0.0", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-3.0.1.tgz", - "dev": true - }, "cryptiles": { "version": "2.0.5", "from": "cryptiles@>=2.0.0 <3.0.0", "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-2.0.5.tgz" }, - "crypto-browserify": { - "version": "3.3.0", - "from": "crypto-browserify@3.3.0", - "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.3.0.tgz", - "dev": true - }, - "css-color-names": { - "version": "0.0.4", - "from": "css-color-names@0.0.4", - "resolved": "https://registry.npmjs.org/css-color-names/-/css-color-names-0.0.4.tgz", - "dev": true - }, - "css-loader": { - "version": "0.25.0", - "from": "css-loader@>=0.25.0 <0.26.0", - "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-0.25.0.tgz", - "dev": true - }, - "css-select": { - "version": "1.2.0", - "from": "css-select@>=1.1.0 <2.0.0", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-1.2.0.tgz", - "dev": true - }, - "css-selector-tokenizer": { - "version": "0.6.0", - "from": "css-selector-tokenizer@>=0.6.0 <0.7.0", - "resolved": "https://registry.npmjs.org/css-selector-tokenizer/-/css-selector-tokenizer-0.6.0.tgz", - "dev": true, - "dependencies": { - "regexpu-core": { - "version": "1.0.0", - "from": "regexpu-core@>=1.0.0 <2.0.0", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-1.0.0.tgz", - "dev": true - } - } - }, - "css-what": { - "version": "2.1.0", - "from": "css-what@>=2.1.0 <2.2.0", - "resolved": "https://registry.npmjs.org/css-what/-/css-what-2.1.0.tgz", - "dev": true - }, "csscolorparser": { "version": "1.0.3", "from": "csscolorparser@>=1.0.2 <2.0.0", "resolved": "https://registry.npmjs.org/csscolorparser/-/csscolorparser-1.0.3.tgz" }, - "cssesc": { - "version": "0.1.0", - "from": "cssesc@>=0.1.0 <0.2.0", - "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-0.1.0.tgz", - "dev": true - }, - "cssnano": { - "version": "3.10.0", - "from": "cssnano@>=2.6.1 <4.0.0", - "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-3.10.0.tgz", - "dev": true - }, - "csso": { - "version": "2.3.2", - "from": "csso@>=2.3.1 <2.4.0", - "resolved": "https://registry.npmjs.org/csso/-/csso-2.3.2.tgz", - "dev": true - }, "cubic-hermite": { "version": "1.0.0", "from": "cubic-hermite@>=1.0.0 <2.0.0", "resolved": "https://registry.npmjs.org/cubic-hermite/-/cubic-hermite-1.0.0.tgz" }, - "currently-unhandled": { - "version": "0.4.1", - "from": "currently-unhandled@>=0.4.1 <0.5.0", - "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz", - "dev": true - }, "cwise": { "version": "1.0.10", "from": "cwise@>=1.0.3 <2.0.0", @@ -1510,13 +515,14 @@ "cwise-parser": { "version": "1.0.3", "from": "cwise-parser@>=1.0.0 <2.0.0", - "resolved": "https://registry.npmjs.org/cwise-parser/-/cwise-parser-1.0.3.tgz" - }, - "d": { - "version": "1.0.0", - "from": "d@>=1.0.0 <2.0.0", - "resolved": "https://registry.npmjs.org/d/-/d-1.0.0.tgz", - "dev": true + "resolved": "https://registry.npmjs.org/cwise-parser/-/cwise-parser-1.0.3.tgz", + "dependencies": { + "esprima": { + "version": "1.2.5", + "from": "esprima@>=1.0.3 <2.0.0", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-1.2.5.tgz" + } + } }, "d3": { "version": "3.5.17", @@ -1545,12 +551,6 @@ } } }, - "date-now": { - "version": "0.1.4", - "from": "date-now@>=0.1.4 <0.2.0", - "resolved": "https://registry.npmjs.org/date-now/-/date-now-0.1.4.tgz", - "dev": true - }, "debug": { "version": "2.2.0", "from": "debug@latest", @@ -1581,12 +581,6 @@ "from": "defined@>=1.0.0 <2.0.0", "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.0.tgz" }, - "del": { - "version": "2.2.2", - "from": "del@>=2.0.2 <3.0.0", - "resolved": "https://registry.npmjs.org/del/-/del-2.2.2.tgz", - "dev": true - }, "delaunay-triangulate": { "version": "1.1.6", "from": "delaunay-triangulate@>=1.1.6 <2.0.0", @@ -1597,88 +591,6 @@ "from": "delayed-stream@>=1.0.0 <1.1.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz" }, - "delegates": { - "version": "1.0.0", - "from": "delegates@>=1.0.0 <2.0.0", - "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", - "dev": true - }, - "depd": { - "version": "1.1.0", - "from": "depd@>=1.1.0 <1.2.0", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.0.tgz", - "dev": true - }, - "destroy": { - "version": "1.0.4", - "from": "destroy@>=1.0.4 <1.1.0", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", - "dev": true - }, - "detect-indent": { - "version": "4.0.0", - "from": "detect-indent@>=4.0.0 <5.0.0", - "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-4.0.0.tgz", - "dev": true - }, - "doctrine": { - "version": "2.0.0", - "from": "doctrine@>=2.0.0 <3.0.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.0.0.tgz", - "dev": true - }, - "dom-converter": { - "version": "0.1.4", - "from": "dom-converter@>=0.1.0 <0.2.0", - "resolved": "https://registry.npmjs.org/dom-converter/-/dom-converter-0.1.4.tgz", - "dev": true, - "dependencies": { - "utila": { - "version": "0.3.3", - "from": "utila@>=0.3.0 <0.4.0", - "resolved": "https://registry.npmjs.org/utila/-/utila-0.3.3.tgz", - "dev": true - } - } - }, - "dom-serializer": { - "version": "0.1.0", - "from": "dom-serializer@>=0.0.0 <1.0.0", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.1.0.tgz", - "dev": true, - "dependencies": { - "domelementtype": { - "version": "1.1.3", - "from": "domelementtype@>=1.1.1 <1.2.0", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.1.3.tgz", - "dev": true - } - } - }, - "domain-browser": { - "version": "1.1.7", - "from": "domain-browser@>=1.1.1 <2.0.0", - "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.1.7.tgz", - "dev": true - }, - "domelementtype": { - "version": "1.3.0", - "from": "domelementtype@>=1.0.0 <2.0.0", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.0.tgz", - "dev": true - }, - "domhandler": { - "version": "2.1.0", - "from": "domhandler@>=2.1.0 <2.2.0", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.1.0.tgz", - "dev": true - }, - "domutils": { - "version": "1.5.1", - "from": "domutils@1.5.1", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.5.1.tgz", - "dev": true - }, "double-bits": { "version": "1.1.1", "from": "double-bits@>=1.1.1 <2.0.0", @@ -1722,61 +634,11 @@ "from": "edges-to-adjacency-list@>=1.0.0 <2.0.0", "resolved": "https://registry.npmjs.org/edges-to-adjacency-list/-/edges-to-adjacency-list-1.0.0.tgz" }, - "ee-first": { - "version": "1.1.1", - "from": "ee-first@1.1.1", - "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "dev": true - }, - "electron-to-chromium": { - "version": "1.3.8", - "from": "electron-to-chromium@>=1.2.7 <2.0.0", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.8.tgz", - "dev": true - }, "emojis-list": { "version": "2.1.0", "from": "emojis-list@>=2.0.0 <3.0.0", "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz" }, - "encodeurl": { - "version": "1.0.1", - "from": "encodeurl@>=1.0.1 <1.1.0", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.1.tgz", - "dev": true - }, - "enhanced-resolve": { - "version": "0.9.1", - "from": "enhanced-resolve@>=0.9.0 <0.10.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-0.9.1.tgz", - "dev": true, - "dependencies": { - "memory-fs": { - "version": "0.2.0", - "from": "memory-fs@>=0.2.0 <0.3.0", - "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.2.0.tgz", - "dev": true - } - } - }, - "entities": { - "version": "1.1.1", - "from": "entities@>=1.1.1 <1.2.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.1.tgz", - "dev": true - }, - "errno": { - "version": "0.1.4", - "from": "errno@>=0.1.3 <0.2.0", - "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.4.tgz", - "dev": true - }, - "error-ex": { - "version": "1.3.1", - "from": "error-ex@>=1.2.0 <2.0.0", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.1.tgz", - "dev": true - }, "es-abstract": { "version": "1.7.0", "from": "es-abstract@>=1.5.0 <2.0.0", @@ -1787,53 +649,11 @@ "from": "es-to-primitive@>=1.1.1 <2.0.0", "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.1.1.tgz" }, - "es5-ext": { - "version": "0.10.15", - "from": "es5-ext@>=0.10.14 <0.11.0", - "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.15.tgz", - "dev": true - }, - "es6-iterator": { - "version": "2.0.1", - "from": "es6-iterator@>=2.0.1 <2.1.0", - "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.1.tgz", - "dev": true - }, - "es6-map": { - "version": "0.1.5", - "from": "es6-map@>=0.1.3 <0.2.0", - "resolved": "https://registry.npmjs.org/es6-map/-/es6-map-0.1.5.tgz", - "dev": true - }, "es6-promise": { "version": "3.3.1", "from": "es6-promise@>=3.0.2 <4.0.0", "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-3.3.1.tgz" }, - "es6-set": { - "version": "0.1.5", - "from": "es6-set@>=0.1.5 <0.2.0", - "resolved": "https://registry.npmjs.org/es6-set/-/es6-set-0.1.5.tgz", - "dev": true - }, - "es6-symbol": { - "version": "3.1.1", - "from": "es6-symbol@>=3.1.1 <3.2.0", - "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.1.tgz", - "dev": true - }, - "es6-weak-map": { - "version": "2.0.2", - "from": "es6-weak-map@>=2.0.1 <3.0.0", - "resolved": "https://registry.npmjs.org/es6-weak-map/-/es6-weak-map-2.0.2.tgz", - "dev": true - }, - "escape-html": { - "version": "1.0.3", - "from": "escape-html@>=1.0.3 <1.1.0", - "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "dev": true - }, "escape-string-regexp": { "version": "1.0.5", "from": "escape-string-regexp@>=1.0.2 <2.0.0", @@ -1844,6 +664,11 @@ "from": "escodegen@>=1.3.2 <1.4.0", "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.3.3.tgz", "dependencies": { + "esprima": { + "version": "1.1.1", + "from": "esprima@>=1.1.1 <1.2.0", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-1.1.1.tgz" + }, "esutils": { "version": "1.0.0", "from": "esutils@>=1.0.0 <1.1.0", @@ -1857,144 +682,16 @@ } } }, - "escope": { - "version": "3.6.0", - "from": "escope@>=3.6.0 <4.0.0", - "resolved": "https://registry.npmjs.org/escope/-/escope-3.6.0.tgz", - "dev": true, - "dependencies": { - "estraverse": { - "version": "4.2.0", - "from": "estraverse@>=4.1.1 <5.0.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz", - "dev": true - } - } - }, - "eslint": { - "version": "3.19.0", - "from": "eslint@>=3.9.0 <4.0.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-3.19.0.tgz", - "dev": true, - "dependencies": { - "concat-stream": { - "version": "1.6.0", - "from": "concat-stream@>=1.5.2 <2.0.0", - "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.0.tgz", - "dev": true - }, - "estraverse": { - "version": "4.2.0", - "from": "estraverse@>=4.2.0 <5.0.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz", - "dev": true - }, - "readable-stream": { - "version": "2.2.6", - "from": "readable-stream@>=2.2.2 <3.0.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.2.6.tgz", - "dev": true - } - } - }, - "eslint-config-airbnb-base": { - "version": "9.0.0", - "from": "eslint-config-airbnb-base@>=9.0.0 <10.0.0", - "resolved": "https://registry.npmjs.org/eslint-config-airbnb-base/-/eslint-config-airbnb-base-9.0.0.tgz", - "dev": true - }, - "eslint-import-resolver-node": { - "version": "0.2.3", - "from": "eslint-import-resolver-node@>=0.2.0 <0.3.0", - "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.2.3.tgz", - "dev": true - }, - "eslint-loader": { - "version": "1.7.1", - "from": "eslint-loader@>=1.6.0 <2.0.0", - "resolved": "https://registry.npmjs.org/eslint-loader/-/eslint-loader-1.7.1.tgz", - "dev": true, - "dependencies": { - "loader-utils": { - "version": "1.1.0", - "from": "loader-utils@>=1.0.2 <2.0.0", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.1.0.tgz", - "dev": true - } - } - }, - "eslint-module-utils": { - "version": "2.0.0", - "from": "eslint-module-utils@>=2.0.0 <3.0.0", - "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.0.0.tgz", - "dev": true - }, - "eslint-plugin-import": { - "version": "2.2.0", - "from": "eslint-plugin-import@>=2.0.1 <3.0.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.2.0.tgz", - "dev": true, - "dependencies": { - "doctrine": { - "version": "1.5.0", - "from": "doctrine@1.5.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-1.5.0.tgz", - "dev": true - } - } - }, - "espree": { - "version": "3.4.2", - "from": "espree@>=3.4.0 <4.0.0", - "resolved": "https://registry.npmjs.org/espree/-/espree-3.4.2.tgz", - "dev": true, - "dependencies": { - "acorn": { - "version": "5.0.3", - "from": "acorn@>=5.0.1 <6.0.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.0.3.tgz", - "dev": true - } - } - }, "esprima": { - "version": "1.1.1", - "from": "esprima@>=1.1.1 <1.2.0", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-1.1.1.tgz" + "version": "2.7.3", + "from": "esprima@>=2.6.0 <3.0.0", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz" }, "espurify": { "version": "1.7.0", "from": "espurify@>=1.3.0 <2.0.0", "resolved": "https://registry.npmjs.org/espurify/-/espurify-1.7.0.tgz" }, - "esquery": { - "version": "1.0.0", - "from": "esquery@>=1.0.0 <2.0.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.0.0.tgz", - "dev": true, - "dependencies": { - "estraverse": { - "version": "4.2.0", - "from": "estraverse@>=4.0.0 <5.0.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz", - "dev": true - } - } - }, - "esrecurse": { - "version": "4.1.0", - "from": "esrecurse@>=4.1.0 <5.0.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.1.0.tgz", - "dev": true, - "dependencies": { - "estraverse": { - "version": "4.1.1", - "from": "estraverse@>=4.1.0 <4.2.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.1.1.tgz", - "dev": true - } - } - }, "estraverse": { "version": "1.5.1", "from": "estraverse@>=1.5.0 <1.6.0", @@ -2005,95 +702,21 @@ "from": "esutils@>=2.0.2 <3.0.0", "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz" }, - "etag": { - "version": "1.8.0", - "from": "etag@>=1.8.0 <1.9.0", - "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.0.tgz", - "dev": true - }, - "event-emitter": { - "version": "0.3.5", - "from": "event-emitter@>=0.3.5 <0.4.0", - "resolved": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.5.tgz", - "dev": true - }, - "eventemitter3": { - "version": "1.2.0", - "from": "eventemitter3@>=1.0.0 <2.0.0", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-1.2.0.tgz", - "dev": true - }, "events": { "version": "1.1.1", "from": "events@>=1.0.0 <2.0.0", "resolved": "https://registry.npmjs.org/events/-/events-1.1.1.tgz" }, - "eventsource": { - "version": "0.1.6", - "from": "eventsource@0.1.6", - "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-0.1.6.tgz", - "dev": true - }, - "exit-hook": { - "version": "1.1.1", - "from": "exit-hook@>=1.0.0 <2.0.0", - "resolved": "https://registry.npmjs.org/exit-hook/-/exit-hook-1.1.1.tgz", - "dev": true - }, - "expand-brackets": { - "version": "0.1.5", - "from": "expand-brackets@>=0.1.4 <0.2.0", - "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", - "dev": true - }, - "expand-range": { - "version": "1.8.2", - "from": "expand-range@>=1.8.1 <2.0.0", - "resolved": "https://registry.npmjs.org/expand-range/-/expand-range-1.8.2.tgz", - "dev": true - }, - "express": { - "version": "4.15.2", - "from": "express@>=4.13.3 <5.0.0", - "resolved": "https://registry.npmjs.org/express/-/express-4.15.2.tgz", - "dev": true, - "dependencies": { - "debug": { - "version": "2.6.1", - "from": "debug@2.6.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.1.tgz", - "dev": true - }, - "ms": { - "version": "0.7.2", - "from": "ms@0.7.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.2.tgz", - "dev": true - } - } - }, "extend": { "version": "3.0.0", "from": "extend@>=3.0.0 <3.1.0", "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.0.tgz" }, - "extglob": { - "version": "0.3.2", - "from": "extglob@>=0.3.1 <0.4.0", - "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", - "dev": true - }, "extract-frustum-planes": { "version": "1.0.0", "from": "extract-frustum-planes@>=1.0.0 <2.0.0", "resolved": "https://registry.npmjs.org/extract-frustum-planes/-/extract-frustum-planes-1.0.0.tgz" }, - "extract-text-webpack-plugin": { - "version": "1.0.1", - "from": "extract-text-webpack-plugin@>=1.0.1 <2.0.0", - "resolved": "https://registry.npmjs.org/extract-text-webpack-plugin/-/extract-text-webpack-plugin-1.0.1.tgz", - "dev": true - }, "extsprintf": { "version": "1.0.2", "from": "extsprintf@1.0.2", @@ -2104,6 +727,11 @@ "from": "falafel@>=1.0.0 <2.0.0", "resolved": "https://registry.npmjs.org/falafel/-/falafel-1.2.0.tgz", "dependencies": { + "acorn": { + "version": "1.2.2", + "from": "acorn@>=1.0.3 <2.0.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-1.2.2.tgz" + }, "isarray": { "version": "0.0.1", "from": "isarray@0.0.1", @@ -2121,95 +749,26 @@ "from": "fast-levenshtein@>=2.0.4 <2.1.0", "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz" }, - "fastparse": { - "version": "1.1.1", - "from": "fastparse@>=1.1.1 <2.0.0", - "resolved": "https://registry.npmjs.org/fastparse/-/fastparse-1.1.1.tgz", - "dev": true - }, - "faye-websocket": { - "version": "0.10.0", - "from": "faye-websocket@>=0.10.0 <0.11.0", - "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.10.0.tgz", - "dev": true - }, "feature-filter": { "version": "2.2.0", "from": "feature-filter@>=2.2.0 <3.0.0", "resolved": "https://registry.npmjs.org/feature-filter/-/feature-filter-2.2.0.tgz" }, - "figures": { - "version": "1.7.0", - "from": "figures@>=1.3.5 <2.0.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-1.7.0.tgz", - "dev": true - }, - "file-entry-cache": { - "version": "2.0.0", - "from": "file-entry-cache@>=2.0.0 <3.0.0", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-2.0.0.tgz", - "dev": true - }, - "file-loader": { - "version": "0.9.0", - "from": "file-loader@>=0.9.0 <0.10.0", - "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-0.9.0.tgz", - "dev": true - }, - "filename-regex": { - "version": "2.0.1", - "from": "filename-regex@>=2.0.0 <3.0.0", - "resolved": "https://registry.npmjs.org/filename-regex/-/filename-regex-2.0.1.tgz", - "dev": true - }, - "fill-range": { - "version": "2.2.3", - "from": "fill-range@>=2.1.0 <3.0.0", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.3.tgz", - "dev": true - }, "filtered-vector": { "version": "1.2.4", "from": "filtered-vector@>=1.2.1 <2.0.0", "resolved": "https://registry.npmjs.org/filtered-vector/-/filtered-vector-1.2.4.tgz" }, - "finalhandler": { - "version": "1.0.2", - "from": "finalhandler@>=1.0.0 <1.1.0", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.0.2.tgz", - "dev": true, - "dependencies": { - "debug": { - "version": "2.6.4", - "from": "debug@2.6.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.4.tgz", - "dev": true - }, - "ms": { - "version": "0.7.3", - "from": "ms@0.7.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.3.tgz", - "dev": true - } - } - }, - "find-cache-dir": { - "version": "0.1.1", - "from": "find-cache-dir@>=0.1.1 <0.2.0", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-0.1.1.tgz", - "dev": true - }, - "find-up": { - "version": "1.1.2", - "from": "find-up@>=1.0.0 <2.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", - "dev": true - }, "findup": { "version": "0.1.5", "from": "findup@>=0.1.5 <0.2.0", "resolved": "https://registry.npmjs.org/findup/-/findup-0.1.5.tgz", "dependencies": { + "colors": { + "version": "0.6.2", + "from": "colors@>=0.6.0-1 <0.7.0", + "resolved": "https://registry.npmjs.org/colors/-/colors-0.6.2.tgz" + }, "commander": { "version": "2.1.0", "from": "commander@>=2.1.0 <2.2.0", @@ -2217,18 +776,6 @@ } } }, - "flat-cache": { - "version": "1.2.2", - "from": "flat-cache@>=1.2.1 <2.0.0", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-1.2.2.tgz", - "dev": true - }, - "flatten": { - "version": "1.0.2", - "from": "flatten@>=1.0.2 <2.0.0", - "resolved": "https://registry.npmjs.org/flatten/-/flatten-1.0.2.tgz", - "dev": true - }, "font-atlas-sdf": { "version": "1.2.0", "from": "font-atlas-sdf@>=1.0.0 <2.0.0", @@ -2244,18 +791,6 @@ "from": "for-each@>=0.3.2 <0.4.0", "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.2.tgz" }, - "for-in": { - "version": "1.0.2", - "from": "for-in@>=1.0.1 <2.0.0", - "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", - "dev": true - }, - "for-own": { - "version": "0.1.5", - "from": "for-own@>=0.1.4 <0.2.0", - "resolved": "https://registry.npmjs.org/for-own/-/for-own-0.1.5.tgz", - "dev": true - }, "foreach": { "version": "2.0.5", "from": "foreach@>=2.0.5 <3.0.0", @@ -2271,29 +806,11 @@ "from": "form-data@>=2.1.1 <2.2.0", "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.1.2.tgz" }, - "forwarded": { - "version": "0.1.0", - "from": "forwarded@>=0.1.0 <0.2.0", - "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.0.tgz", - "dev": true - }, - "fresh": { - "version": "0.5.0", - "from": "fresh@0.5.0", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.0.tgz", - "dev": true - }, "fs.realpath": { "version": "1.0.0", "from": "fs.realpath@>=1.0.0 <2.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz" }, - "fstream": { - "version": "1.0.11", - "from": "fstream@>=1.0.0 <2.0.0", - "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.11.tgz", - "dev": true - }, "function-bind": { "version": "1.1.0", "from": "function-bind@>=1.0.2 <2.0.0", @@ -2309,18 +826,6 @@ "from": "gamma@>=0.1.0 <0.2.0", "resolved": "https://registry.npmjs.org/gamma/-/gamma-0.1.0.tgz" }, - "gauge": { - "version": "2.7.4", - "from": "gauge@>=2.7.1 <2.8.0", - "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", - "dev": true - }, - "gaze": { - "version": "1.1.2", - "from": "gaze@>=1.0.0 <2.0.0", - "resolved": "https://registry.npmjs.org/gaze/-/gaze-1.1.2.tgz", - "dev": true - }, "generate-function": { "version": "2.0.0", "from": "generate-function@>=2.0.0 <3.0.0", @@ -2358,23 +863,11 @@ "from": "geojson-vt@>=2.4.0 <3.0.0", "resolved": "https://registry.npmjs.org/geojson-vt/-/geojson-vt-2.4.0.tgz" }, - "get-caller-file": { - "version": "1.0.2", - "from": "get-caller-file@>=1.0.1 <2.0.0", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.2.tgz", - "dev": true - }, "get-canvas-context": { "version": "1.0.2", "from": "get-canvas-context@>=1.0.1 <2.0.0", "resolved": "https://registry.npmjs.org/get-canvas-context/-/get-canvas-context-1.0.2.tgz" }, - "get-stdin": { - "version": "4.0.1", - "from": "get-stdin@>=4.0.1 <5.0.0", - "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz", - "dev": true - }, "getpass": { "version": "0.1.6", "from": "getpass@>=0.1.1 <0.2.0", @@ -2407,10 +900,20 @@ "from": "glslify-bundle@>=2.0.4 <3.0.0", "resolved": "https://registry.npmjs.org/glslify-bundle/-/glslify-bundle-2.0.4.tgz" }, + "isarray": { + "version": "0.0.1", + "from": "isarray@0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz" + }, "minimist": { "version": "1.2.0", "from": "minimist@^1.1.0", "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz" + }, + "readable-stream": { + "version": "1.0.34", + "from": "readable-stream@~1.0.26", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz" } } }, @@ -2456,10 +959,20 @@ "from": "glslify-bundle@>=2.0.4 <3.0.0", "resolved": "https://registry.npmjs.org/glslify-bundle/-/glslify-bundle-2.0.4.tgz" }, + "isarray": { + "version": "0.0.1", + "from": "isarray@0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz" + }, "minimist": { "version": "1.2.0", "from": "minimist@^1.1.0", "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz" + }, + "readable-stream": { + "version": "1.0.34", + "from": "readable-stream@~1.0.26", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz" } } }, @@ -2483,10 +996,20 @@ "from": "glslify-bundle@>=2.0.4 <3.0.0", "resolved": "https://registry.npmjs.org/glslify-bundle/-/glslify-bundle-2.0.4.tgz" }, + "isarray": { + "version": "0.0.1", + "from": "isarray@0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz" + }, "minimist": { "version": "1.2.0", "from": "minimist@^1.1.0", "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz" + }, + "readable-stream": { + "version": "1.0.34", + "from": "readable-stream@~1.0.26", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz" } } }, @@ -2532,10 +1055,20 @@ "from": "glslify-bundle@>=2.0.4 <3.0.0", "resolved": "https://registry.npmjs.org/glslify-bundle/-/glslify-bundle-2.0.4.tgz" }, + "isarray": { + "version": "0.0.1", + "from": "isarray@0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz" + }, "minimist": { "version": "1.2.0", "from": "minimist@^1.1.0", "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz" + }, + "readable-stream": { + "version": "1.0.34", + "from": "readable-stream@~1.0.26", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz" } } }, @@ -2559,10 +1092,20 @@ "from": "glslify-bundle@>=2.0.4 <3.0.0", "resolved": "https://registry.npmjs.org/glslify-bundle/-/glslify-bundle-2.0.4.tgz" }, + "isarray": { + "version": "0.0.1", + "from": "isarray@0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz" + }, "minimist": { "version": "1.2.0", "from": "minimist@^1.1.0", "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz" + }, + "readable-stream": { + "version": "1.0.34", + "from": "readable-stream@~1.0.26", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz" } } }, @@ -2611,10 +1154,20 @@ "from": "glslify-bundle@>=2.0.4 <3.0.0", "resolved": "https://registry.npmjs.org/glslify-bundle/-/glslify-bundle-2.0.4.tgz" }, + "isarray": { + "version": "0.0.1", + "from": "isarray@0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz" + }, "minimist": { "version": "1.2.0", "from": "minimist@^1.1.0", "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz" + }, + "readable-stream": { + "version": "1.0.34", + "from": "readable-stream@~1.0.26", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz" } } }, @@ -2648,10 +1201,20 @@ "from": "glslify-bundle@>=2.0.4 <3.0.0", "resolved": "https://registry.npmjs.org/glslify-bundle/-/glslify-bundle-2.0.4.tgz" }, + "isarray": { + "version": "0.0.1", + "from": "isarray@0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz" + }, "minimist": { "version": "1.2.0", "from": "minimist@^1.1.0", "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz" + }, + "readable-stream": { + "version": "1.0.34", + "from": "readable-stream@~1.0.26", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz" } } }, @@ -2675,10 +1238,20 @@ "from": "glslify-bundle@>=2.0.4 <3.0.0", "resolved": "https://registry.npmjs.org/glslify-bundle/-/glslify-bundle-2.0.4.tgz" }, + "isarray": { + "version": "0.0.1", + "from": "isarray@0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz" + }, "minimist": { "version": "1.2.0", "from": "minimist@^1.1.0", "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz" + }, + "readable-stream": { + "version": "1.0.34", + "from": "readable-stream@~1.0.26", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz" } } }, @@ -2707,10 +1280,20 @@ "from": "glslify-bundle@>=2.0.4 <3.0.0", "resolved": "https://registry.npmjs.org/glslify-bundle/-/glslify-bundle-2.0.4.tgz" }, + "isarray": { + "version": "0.0.1", + "from": "isarray@0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz" + }, "minimist": { "version": "1.2.0", "from": "minimist@^1.1.0", "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz" + }, + "readable-stream": { + "version": "1.0.34", + "from": "readable-stream@~1.0.26", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz" } } }, @@ -2744,11 +1327,21 @@ "from": "glslify-bundle@>=2.0.4 <3.0.0", "resolved": "https://registry.npmjs.org/glslify-bundle/-/glslify-bundle-2.0.4.tgz" }, + "isarray": { + "version": "0.0.1", + "from": "isarray@0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz" + }, "minimist": { "version": "1.2.0", "from": "minimist@^1.1.0", "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz" }, + "readable-stream": { + "version": "1.0.34", + "from": "readable-stream@~1.0.26", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz" + }, "snap-points-2d": { "version": "3.1.0", "from": "snap-points-2d@>=3.0.0 <4.0.0", @@ -2786,11 +1379,21 @@ "from": "glslify-bundle@>=2.0.4 <3.0.0", "resolved": "https://registry.npmjs.org/glslify-bundle/-/glslify-bundle-2.0.4.tgz" }, + "isarray": { + "version": "0.0.1", + "from": "isarray@0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz" + }, "minimist": { "version": "1.2.0", "from": "minimist@^1.1.0", "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz" }, + "readable-stream": { + "version": "1.0.34", + "from": "readable-stream@~1.0.26", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz" + }, "snap-points-2d": { "version": "3.1.0", "from": "snap-points-2d@>=3.1.0 <4.0.0", @@ -2818,10 +1421,20 @@ "from": "glslify-bundle@>=2.0.4 <3.0.0", "resolved": "https://registry.npmjs.org/glslify-bundle/-/glslify-bundle-2.0.4.tgz" }, + "isarray": { + "version": "0.0.1", + "from": "isarray@0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz" + }, "minimist": { "version": "1.2.0", "from": "minimist@^1.1.0", "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz" + }, + "readable-stream": { + "version": "1.0.34", + "from": "readable-stream@~1.0.26", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz" } } }, @@ -2845,10 +1458,20 @@ "from": "glslify-bundle@>=2.0.4 <3.0.0", "resolved": "https://registry.npmjs.org/glslify-bundle/-/glslify-bundle-2.0.4.tgz" }, + "isarray": { + "version": "0.0.1", + "from": "isarray@0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz" + }, "minimist": { "version": "1.2.0", "from": "minimist@^1.1.0", "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz" + }, + "readable-stream": { + "version": "1.0.34", + "from": "readable-stream@~1.0.26", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz" } } }, @@ -2887,10 +1510,20 @@ "from": "glslify-bundle@>=2.0.4 <3.0.0", "resolved": "https://registry.npmjs.org/glslify-bundle/-/glslify-bundle-2.0.4.tgz" }, + "isarray": { + "version": "0.0.1", + "from": "isarray@0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz" + }, "minimist": { "version": "1.2.0", "from": "minimist@^1.1.0", "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz" + }, + "readable-stream": { + "version": "1.0.34", + "from": "readable-stream@~1.0.26", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz" } } }, @@ -2919,10 +1552,20 @@ "from": "glslify-bundle@>=2.0.4 <3.0.0", "resolved": "https://registry.npmjs.org/glslify-bundle/-/glslify-bundle-2.0.4.tgz" }, + "isarray": { + "version": "0.0.1", + "from": "isarray@0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz" + }, "minimist": { "version": "1.2.0", "from": "minimist@^1.1.0", "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz" + }, + "readable-stream": { + "version": "1.0.34", + "from": "readable-stream@~1.0.26", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz" } } }, @@ -2951,44 +1594,6 @@ "from": "glob@>=7.0.3 <8.0.0", "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.1.tgz" }, - "glob-base": { - "version": "0.3.0", - "from": "glob-base@>=0.3.0 <0.4.0", - "resolved": "https://registry.npmjs.org/glob-base/-/glob-base-0.3.0.tgz", - "dev": true - }, - "glob-parent": { - "version": "2.0.0", - "from": "glob-parent@>=2.0.0 <3.0.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz", - "dev": true - }, - "globals": { - "version": "9.17.0", - "from": "globals@>=9.0.0 <10.0.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-9.17.0.tgz", - "dev": true - }, - "globby": { - "version": "5.0.0", - "from": "globby@>=5.0.0 <6.0.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-5.0.0.tgz", - "dev": true - }, - "globule": { - "version": "1.1.0", - "from": "globule@>=1.0.0 <2.0.0", - "resolved": "https://registry.npmjs.org/globule/-/globule-1.1.0.tgz", - "dev": true, - "dependencies": { - "lodash": { - "version": "4.16.6", - "from": "lodash@>=4.16.4 <4.17.0", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.16.6.tgz", - "dev": true - } - } - }, "glsl-inject-defines": { "version": "1.0.3", "from": "glsl-inject-defines@>=1.0.1 <2.0.0", @@ -3109,9 +1714,9 @@ "resolved": "https://registry.npmjs.org/glslify-deps/-/glslify-deps-1.3.0.tgz" }, "graceful-fs": { - "version": "4.1.11", + "version": "4.1.9", "from": "graceful-fs@>=4.1.2 <5.0.0", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz" + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.9.tgz" }, "graceful-readlink": { "version": "1.0.1", @@ -3123,12 +1728,6 @@ "from": "grid-index@>=1.0.0 <2.0.0", "resolved": "https://registry.npmjs.org/grid-index/-/grid-index-1.0.0.tgz" }, - "growly": { - "version": "1.3.0", - "from": "growly@>=1.2.0 <2.0.0", - "resolved": "https://registry.npmjs.org/growly/-/growly-1.3.0.tgz", - "dev": true - }, "har-validator": { "version": "2.0.6", "from": "har-validator@>=2.0.6 <2.1.0", @@ -3149,186 +1748,36 @@ "from": "has-color@>=0.1.0 <0.2.0", "resolved": "https://registry.npmjs.org/has-color/-/has-color-0.1.7.tgz" }, - "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", - "dev": true - }, - "has-unicode": { - "version": "2.0.1", - "from": "has-unicode@>=2.0.0 <3.0.0", - "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", - "dev": true - }, "hawk": { "version": "3.1.3", "from": "hawk@>=3.1.3 <3.2.0", "resolved": "https://registry.npmjs.org/hawk/-/hawk-3.1.3.tgz" }, - "he": { - "version": "1.1.1", - "from": "he@>=1.1.0 <1.2.0", - "resolved": "https://registry.npmjs.org/he/-/he-1.1.1.tgz", - "dev": true - }, "hoek": { "version": "2.16.3", "from": "hoek@>=2.0.0 <3.0.0", "resolved": "https://registry.npmjs.org/hoek/-/hoek-2.16.3.tgz" }, - "home-or-tmp": { - "version": "2.0.0", - "from": "home-or-tmp@>=2.0.0 <3.0.0", - "resolved": "https://registry.npmjs.org/home-or-tmp/-/home-or-tmp-2.0.0.tgz", - "dev": true - }, - "hosted-git-info": { - "version": "2.4.2", - "from": "hosted-git-info@>=2.1.4 <3.0.0", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.4.2.tgz", - "dev": true - }, - "html-comment-regex": { - "version": "1.1.1", - "from": "html-comment-regex@>=1.1.0 <2.0.0", - "resolved": "https://registry.npmjs.org/html-comment-regex/-/html-comment-regex-1.1.1.tgz", - "dev": true - }, - "html-minifier": { - "version": "3.4.3", - "from": "html-minifier@>=3.2.3 <4.0.0", - "resolved": "https://registry.npmjs.org/html-minifier/-/html-minifier-3.4.3.tgz", - "dev": true, - "dependencies": { - "uglify-js": { - "version": "2.8.22", - "from": "uglify-js@>=2.8.22 <2.9.0", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.8.22.tgz", - "dev": true - } - } - }, - "html-webpack-plugin": { - "version": "2.28.0", - "from": "html-webpack-plugin@>=2.24.0 <3.0.0", - "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-2.28.0.tgz", - "dev": true - }, - "htmlparser2": { - "version": "3.3.0", - "from": "htmlparser2@>=3.3.0 <3.4.0", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.3.0.tgz", - "dev": true, - "dependencies": { - "domutils": { - "version": "1.1.6", - "from": "domutils@>=1.1.0 <1.2.0", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.1.6.tgz", - "dev": true - } - } - }, - "http-errors": { - "version": "1.6.1", - "from": "http-errors@>=1.6.1 <1.7.0", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.1.tgz", - "dev": true - }, - "http-proxy": { - "version": "1.16.2", - "from": "http-proxy@>=1.16.2 <2.0.0", - "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.16.2.tgz", - "dev": true - }, - "http-proxy-middleware": { - "version": "0.17.4", - "from": "http-proxy-middleware@>=0.17.1 <0.18.0", - "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-0.17.4.tgz", - "dev": true, - "dependencies": { - "is-extglob": { - "version": "2.1.1", - "from": "is-extglob@>=2.1.0 <3.0.0", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "dev": true - }, - "is-glob": { - "version": "3.1.0", - "from": "is-glob@>=3.1.0 <4.0.0", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", - "dev": true - } - } - }, "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" }, - "https-browserify": { - "version": "0.0.1", - "from": "https-browserify@0.0.1", - "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-0.0.1.tgz", - "dev": true - }, "husl": { "version": "5.0.3", "from": "husl@>=5.0.0 <6.0.0", "resolved": "https://registry.npmjs.org/husl/-/husl-5.0.3.tgz" }, - "icss-replace-symbols": { - "version": "1.0.2", - "from": "icss-replace-symbols@>=1.0.2 <2.0.0", - "resolved": "https://registry.npmjs.org/icss-replace-symbols/-/icss-replace-symbols-1.0.2.tgz", - "dev": true - }, "ieee754": { "version": "1.1.8", "from": "ieee754@>=1.1.4 <2.0.0", "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.8.tgz" }, - "ignore": { - "version": "3.2.7", - "from": "ignore@>=3.2.0 <4.0.0", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.2.7.tgz", - "dev": true - }, - "imurmurhash": { - "version": "0.1.4", - "from": "imurmurhash@>=0.1.4 <0.2.0", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "dev": true - }, - "in-publish": { - "version": "2.0.0", - "from": "in-publish@>=2.0.0 <3.0.0", - "resolved": "https://registry.npmjs.org/in-publish/-/in-publish-2.0.0.tgz", - "dev": true - }, "incremental-convex-hull": { "version": "1.0.1", "from": "incremental-convex-hull@>=1.0.1 <2.0.0", "resolved": "https://registry.npmjs.org/incremental-convex-hull/-/incremental-convex-hull-1.0.1.tgz" }, - "indent-string": { - "version": "2.1.0", - "from": "indent-string@>=2.1.0 <3.0.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz", - "dev": true - }, - "indexes-of": { - "version": "1.0.1", - "from": "indexes-of@>=1.0.1 <2.0.0", - "resolved": "https://registry.npmjs.org/indexes-of/-/indexes-of-1.0.1.tgz", - "dev": true - }, - "indexof": { - "version": "0.0.1", - "from": "indexof@0.0.1", - "resolved": "https://registry.npmjs.org/indexof/-/indexof-0.0.1.tgz", - "dev": true - }, "inflight": { "version": "1.0.6", "from": "inflight@>=1.0.4 <2.0.0", @@ -3339,35 +1788,11 @@ "from": "inherits@>=2.0.1 <2.1.0", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz" }, - "inquirer": { - "version": "0.12.0", - "from": "inquirer@>=0.12.0 <0.13.0", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-0.12.0.tgz", - "dev": true - }, - "interpret": { - "version": "1.0.3", - "from": "interpret@>=1.0.0 <2.0.0", - "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.0.3.tgz", - "dev": true - }, "interval-tree-1d": { "version": "1.0.3", "from": "interval-tree-1d@>=1.0.1 <2.0.0", "resolved": "https://registry.npmjs.org/interval-tree-1d/-/interval-tree-1d-1.0.3.tgz" }, - "invariant": { - "version": "2.2.2", - "from": "invariant@>=2.2.0 <3.0.0", - "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.2.tgz", - "dev": true - }, - "invert-kv": { - "version": "1.0.0", - "from": "invert-kv@>=1.0.0 <2.0.0", - "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", - "dev": true - }, "invert-permutation": { "version": "1.0.0", "from": "invert-permutation@>=1.0.0 <2.0.0", @@ -3378,41 +1803,11 @@ "from": "iota-array@>=1.0.0 <2.0.0", "resolved": "https://registry.npmjs.org/iota-array/-/iota-array-1.0.0.tgz" }, - "ipaddr.js": { - "version": "1.3.0", - "from": "ipaddr.js@1.3.0", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.3.0.tgz", - "dev": true - }, - "is-absolute-url": { - "version": "2.1.0", - "from": "is-absolute-url@>=2.0.0 <3.0.0", - "resolved": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-2.1.0.tgz", - "dev": true - }, - "is-arrayish": { - "version": "0.2.1", - "from": "is-arrayish@>=0.2.1 <0.3.0", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "dev": true - }, - "is-binary-path": { - "version": "1.0.1", - "from": "is-binary-path@>=1.0.0 <2.0.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", - "dev": true - }, "is-buffer": { "version": "1.1.4", "from": "is-buffer@>=1.0.2 <2.0.0", "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.4.tgz" }, - "is-builtin-module": { - "version": "1.0.0", - "from": "is-builtin-module@>=1.0.0 <2.0.0", - "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz", - "dev": true - }, "is-callable": { "version": "1.1.3", "from": "is-callable@>=1.1.3 <2.0.0", @@ -3423,53 +1818,11 @@ "from": "is-date-object@>=1.0.1 <2.0.0", "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.1.tgz" }, - "is-dotfile": { - "version": "1.0.2", - "from": "is-dotfile@>=1.0.0 <2.0.0", - "resolved": "https://registry.npmjs.org/is-dotfile/-/is-dotfile-1.0.2.tgz", - "dev": true - }, - "is-equal-shallow": { - "version": "0.1.3", - "from": "is-equal-shallow@>=0.1.3 <0.2.0", - "resolved": "https://registry.npmjs.org/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz", - "dev": true - }, - "is-extendable": { - "version": "0.1.1", - "from": "is-extendable@>=0.1.1 <0.2.0", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "dev": true - }, - "is-extglob": { - "version": "1.0.0", - "from": "is-extglob@>=1.0.0 <2.0.0", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", - "dev": true - }, - "is-finite": { - "version": "1.0.2", - "from": "is-finite@>=1.0.0 <2.0.0", - "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "1.0.0", - "from": "is-fullwidth-code-point@>=1.0.0 <2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "dev": true - }, "is-function": { "version": "1.0.1", "from": "is-function@>=1.0.0 <1.1.0", "resolved": "https://registry.npmjs.org/is-function/-/is-function-1.0.1.tgz" }, - "is-glob": { - "version": "2.0.1", - "from": "is-glob@>=2.0.0 <3.0.0", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", - "dev": true - }, "is-mobile": { "version": "0.2.2", "from": "is-mobile@>=0.2.2 <0.3.0", @@ -3480,47 +1833,11 @@ "from": "is-my-json-valid@>=2.10.0 <3.0.0", "resolved": "https://registry.npmjs.org/is-my-json-valid/-/is-my-json-valid-2.15.0.tgz" }, - "is-number": { - "version": "2.1.0", - "from": "is-number@>=2.1.0 <3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz", - "dev": true - }, - "is-path-cwd": { - "version": "1.0.0", - "from": "is-path-cwd@>=1.0.0 <2.0.0", - "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-1.0.0.tgz", - "dev": true - }, - "is-path-in-cwd": { - "version": "1.0.0", - "from": "is-path-in-cwd@>=1.0.0 <2.0.0", - "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-1.0.0.tgz", - "dev": true - }, - "is-path-inside": { - "version": "1.0.0", - "from": "is-path-inside@>=1.0.0 <2.0.0", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.0.tgz", - "dev": true - }, "is-plain-obj": { "version": "1.1.0", "from": "is-plain-obj@>=1.0.0 <2.0.0", "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz" }, - "is-posix-bracket": { - "version": "0.1.1", - "from": "is-posix-bracket@>=0.1.0 <0.2.0", - "resolved": "https://registry.npmjs.org/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz", - "dev": true - }, - "is-primitive": { - "version": "2.0.0", - "from": "is-primitive@>=2.0.0 <3.0.0", - "resolved": "https://registry.npmjs.org/is-primitive/-/is-primitive-2.0.0.tgz", - "dev": true - }, "is-property": { "version": "1.0.2", "from": "is-property@>=1.0.0 <2.0.0", @@ -3531,18 +1848,6 @@ "from": "is-regex@>=1.0.3 <2.0.0", "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.4.tgz" }, - "is-resolvable": { - "version": "1.0.0", - "from": "is-resolvable@>=1.0.0 <2.0.0", - "resolved": "https://registry.npmjs.org/is-resolvable/-/is-resolvable-1.0.0.tgz", - "dev": true - }, - "is-svg": { - "version": "2.1.0", - "from": "is-svg@>=2.0.0 <3.0.0", - "resolved": "https://registry.npmjs.org/is-svg/-/is-svg-2.1.0.tgz", - "dev": true - }, "is-symbol": { "version": "1.0.1", "from": "is-symbol@>=1.0.1 <2.0.0", @@ -3553,29 +1858,11 @@ "from": "is-typedarray@>=1.0.0 <1.1.0", "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz" }, - "is-utf8": { - "version": "0.2.1", - "from": "is-utf8@>=0.2.0 <0.3.0", - "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", - "dev": true - }, "isarray": { "version": "1.0.0", "from": "isarray@>=1.0.0 <1.1.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz" }, - "isexe": { - "version": "2.0.0", - "from": "isexe@>=2.0.0 <3.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "dev": true - }, - "isobject": { - "version": "2.1.0", - "from": "isobject@>=2.0.0 <3.0.0", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", - "dev": true - }, "isstream": { "version": "0.1.2", "from": "isstream@>=0.1.2 <0.2.0", @@ -3597,77 +1884,27 @@ "from": "jquery-ui@latest", "resolved": "https://registry.npmjs.org/jquery-ui/-/jquery-ui-1.12.1.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", - "dev": true - }, - "js-tokens": { - "version": "3.0.1", - "from": "js-tokens@>=3.0.0 <4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.1.tgz", - "dev": true - }, - "js-yaml": { - "version": "3.7.0", - "from": "js-yaml@>=3.7.0 <3.8.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.7.0.tgz", - "dev": true, - "dependencies": { - "esprima": { - "version": "2.7.3", - "from": "esprima@>=2.6.0 <3.0.0", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz", - "dev": true - } - } - }, "jsbn": { "version": "0.1.0", "from": "jsbn@>=0.1.0 <0.2.0", "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.0.tgz", "optional": true }, - "jsesc": { - "version": "1.3.0", - "from": "jsesc@>=1.3.0 <2.0.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-1.3.0.tgz", - "dev": true - }, "json-schema": { "version": "0.2.3", "from": "json-schema@0.2.3", "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz" }, - "json-stable-stringify": { - "version": "1.0.1", - "from": "json-stable-stringify@>=1.0.0 <2.0.0", - "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz", - "dev": true - }, "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" }, - "json3": { - "version": "3.3.2", - "from": "json3@>=3.3.2 <4.0.0", - "resolved": "https://registry.npmjs.org/json3/-/json3-3.3.2.tgz", - "dev": true - }, "json5": { "version": "0.5.0", "from": "json5@>=0.5.0 <0.6.0", "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.0.tgz" }, - "jsonify": { - "version": "0.0.0", - "from": "jsonify@>=0.0.0 <0.1.0", - "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz", - "dev": true - }, "jsonlint-lines-primitives": { "version": "1.6.0", "from": "jsonlint-lines-primitives@>=1.6.0 <1.7.0", @@ -3703,12 +1940,6 @@ "from": "lazy-cache@>=1.0.3 <2.0.0", "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz" }, - "lcid": { - "version": "1.0.0", - "from": "lcid@>=1.0.0 <2.0.0", - "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", - "dev": true - }, "leaflet": { "version": "1.0.2", "from": "leaflet@latest", @@ -3724,73 +1955,11 @@ "from": "levn@>=0.3.0 <0.4.0", "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz" }, - "load-json-file": { - "version": "1.1.0", - "from": "load-json-file@>=1.0.0 <2.0.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", - "dev": true, - "dependencies": { - "strip-bom": { - "version": "2.0.0", - "from": "strip-bom@>=2.0.0 <3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", - "dev": true - } - } - }, - "loader-fs-cache": { - "version": "1.0.1", - "from": "loader-fs-cache@>=1.0.0 <2.0.0", - "resolved": "https://registry.npmjs.org/loader-fs-cache/-/loader-fs-cache-1.0.1.tgz", - "dev": true - }, "loader-utils": { "version": "0.2.16", "from": "loader-utils@>=0.2.11 <0.3.0", "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-0.2.16.tgz" }, - "lodash": { - "version": "4.17.4", - "from": "lodash@>=4.2.0 <5.0.0", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.4.tgz", - "dev": true - }, - "lodash._arraycopy": { - "version": "3.0.0", - "from": "lodash._arraycopy@>=3.0.0 <4.0.0", - "resolved": "https://registry.npmjs.org/lodash._arraycopy/-/lodash._arraycopy-3.0.0.tgz", - "dev": true - }, - "lodash._arrayeach": { - "version": "3.0.0", - "from": "lodash._arrayeach@>=3.0.0 <4.0.0", - "resolved": "https://registry.npmjs.org/lodash._arrayeach/-/lodash._arrayeach-3.0.0.tgz", - "dev": true - }, - "lodash._baseassign": { - "version": "3.2.0", - "from": "lodash._baseassign@>=3.0.0 <4.0.0", - "resolved": "https://registry.npmjs.org/lodash._baseassign/-/lodash._baseassign-3.2.0.tgz", - "dev": true - }, - "lodash._baseclone": { - "version": "3.3.0", - "from": "lodash._baseclone@>=3.0.0 <4.0.0", - "resolved": "https://registry.npmjs.org/lodash._baseclone/-/lodash._baseclone-3.3.0.tgz", - "dev": true - }, - "lodash._basecopy": { - "version": "3.0.1", - "from": "lodash._basecopy@>=3.0.0 <4.0.0", - "resolved": "https://registry.npmjs.org/lodash._basecopy/-/lodash._basecopy-3.0.1.tgz", - "dev": true - }, - "lodash._basefor": { - "version": "3.0.3", - "from": "lodash._basefor@>=3.0.0 <4.0.0", - "resolved": "https://registry.npmjs.org/lodash._basefor/-/lodash._basefor-3.0.3.tgz", - "dev": true - }, "lodash._baseisequal": { "version": "3.0.7", "from": "lodash._baseisequal@>=3.0.0 <4.0.0", @@ -3801,53 +1970,11 @@ "from": "lodash._bindcallback@>=3.0.0 <4.0.0", "resolved": "https://registry.npmjs.org/lodash._bindcallback/-/lodash._bindcallback-3.0.1.tgz" }, - "lodash._createcompounder": { - "version": "3.0.0", - "from": "lodash._createcompounder@>=3.0.0 <4.0.0", - "resolved": "https://registry.npmjs.org/lodash._createcompounder/-/lodash._createcompounder-3.0.0.tgz", - "dev": true - }, "lodash._getnative": { "version": "3.9.1", "from": "lodash._getnative@>=3.0.0 <4.0.0", "resolved": "https://registry.npmjs.org/lodash._getnative/-/lodash._getnative-3.9.1.tgz" }, - "lodash._root": { - "version": "3.0.1", - "from": "lodash._root@>=3.0.0 <4.0.0", - "resolved": "https://registry.npmjs.org/lodash._root/-/lodash._root-3.0.1.tgz", - "dev": true - }, - "lodash.assign": { - "version": "4.2.0", - "from": "lodash.assign@>=4.2.0 <5.0.0", - "resolved": "https://registry.npmjs.org/lodash.assign/-/lodash.assign-4.2.0.tgz", - "dev": true - }, - "lodash.camelcase": { - "version": "3.0.1", - "from": "lodash.camelcase@>=3.0.1 <4.0.0", - "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-3.0.1.tgz", - "dev": true - }, - "lodash.clonedeep": { - "version": "4.5.0", - "from": "lodash.clonedeep@>=4.3.2 <5.0.0", - "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", - "dev": true - }, - "lodash.cond": { - "version": "4.5.2", - "from": "lodash.cond@>=4.3.0 <5.0.0", - "resolved": "https://registry.npmjs.org/lodash.cond/-/lodash.cond-4.5.2.tgz", - "dev": true - }, - "lodash.deburr": { - "version": "3.2.0", - "from": "lodash.deburr@>=3.0.0 <4.0.0", - "resolved": "https://registry.npmjs.org/lodash.deburr/-/lodash.deburr-3.2.0.tgz", - "dev": true - }, "lodash.isarguments": { "version": "3.1.0", "from": "lodash.isarguments@>=3.0.0 <4.0.0", @@ -3873,65 +2000,11 @@ "from": "lodash.keys@>=3.0.0 <4.0.0", "resolved": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-3.1.2.tgz" }, - "lodash.memoize": { - "version": "4.1.2", - "from": "lodash.memoize@>=4.1.2 <5.0.0", - "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", - "dev": true - }, - "lodash.mergewith": { - "version": "4.6.0", - "from": "lodash.mergewith@>=4.6.0 <5.0.0", - "resolved": "https://registry.npmjs.org/lodash.mergewith/-/lodash.mergewith-4.6.0.tgz", - "dev": true - }, - "lodash.uniq": { - "version": "4.5.0", - "from": "lodash.uniq@>=4.5.0 <5.0.0", - "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", - "dev": true - }, - "lodash.words": { - "version": "3.2.0", - "from": "lodash.words@>=3.0.0 <4.0.0", - "resolved": "https://registry.npmjs.org/lodash.words/-/lodash.words-3.2.0.tgz", - "dev": true - }, "longest": { "version": "1.0.1", "from": "longest@>=1.0.1 <2.0.0", "resolved": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz" }, - "loose-envify": { - "version": "1.3.1", - "from": "loose-envify@>=1.0.0 <2.0.0", - "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz", - "dev": true - }, - "loud-rejection": { - "version": "1.6.0", - "from": "loud-rejection@>=1.0.0 <2.0.0", - "resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz", - "dev": true - }, - "lower-case": { - "version": "1.1.4", - "from": "lower-case@>=1.1.1 <2.0.0", - "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-1.1.4.tgz", - "dev": true - }, - "lru-cache": { - "version": "4.0.2", - "from": "lru-cache@>=4.0.1 <5.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.0.2.tgz", - "dev": true - }, - "macaddress": { - "version": "0.2.8", - "from": "macaddress@>=0.2.8 <0.3.0", - "resolved": "https://registry.npmjs.org/macaddress/-/macaddress-0.2.8.tgz", - "dev": true - }, "map-limit": { "version": "0.0.1", "from": "map-limit@0.0.1", @@ -3944,32 +2017,28 @@ } } }, - "map-obj": { - "version": "1.0.1", - "from": "map-obj@>=1.0.1 <2.0.0", - "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", - "dev": true - }, "mapbox-gl": { "version": "0.22.1", "from": "mapbox-gl@>=0.22.0 <0.23.0", - "resolved": "https://registry.npmjs.org/mapbox-gl/-/mapbox-gl-0.22.1.tgz" + "resolved": "https://registry.npmjs.org/mapbox-gl/-/mapbox-gl-0.22.1.tgz", + "dependencies": { + "mapbox-gl-shaders": { + "version": "1.0.0", + "from": "mapbox/mapbox-gl-shaders#de2ab007455aa2587c552694c68583f94c9f2747", + "resolved": "git://github.com/mapbox/mapbox-gl-shaders.git#de2ab007455aa2587c552694c68583f94c9f2747" + }, + "mapbox-gl-style-spec": { + "version": "8.8.0", + "from": "mapbox/mapbox-gl-style-spec#83b1a3e5837d785af582efd5ed1a212f2df6a4ae", + "resolved": "git://github.com/mapbox/mapbox-gl-style-spec.git#83b1a3e5837d785af582efd5ed1a212f2df6a4ae" + } + } }, "mapbox-gl-function": { "version": "1.3.0", "from": "mapbox-gl-function@>=1.2.1 <2.0.0", "resolved": "https://registry.npmjs.org/mapbox-gl-function/-/mapbox-gl-function-1.3.0.tgz" }, - "mapbox-gl-shaders": { - "version": "1.0.0", - "from": "mapbox/mapbox-gl-shaders#de2ab007455aa2587c552694c68583f94c9f2747", - "resolved": "git+https://github.com/mapbox/mapbox-gl-shaders.git#de2ab007455aa2587c552694c68583f94c9f2747" - }, - "mapbox-gl-style-spec": { - "version": "8.8.0", - "from": "mapbox/mapbox-gl-style-spec#83b1a3e5837d785af582efd5ed1a212f2df6a4ae", - "resolved": "git+https://github.com/mapbox/mapbox-gl-style-spec.git#83b1a3e5837d785af582efd5ed1a212f2df6a4ae" - }, "mapbox-gl-supported": { "version": "1.2.0", "from": "mapbox-gl-supported@>=1.2.0 <2.0.0", @@ -3985,12 +2054,6 @@ "from": "marked@latest", "resolved": "https://registry.npmjs.org/marked/-/marked-0.3.6.tgz" }, - "marked-terminal": { - "version": "1.7.0", - "from": "marked-terminal@>=1.6.2 <2.0.0", - "resolved": "https://registry.npmjs.org/marked-terminal/-/marked-terminal-1.7.0.tgz", - "dev": true - }, "mat4-decompose": { "version": "1.0.4", "from": "mat4-decompose@>=1.0.3 <2.0.0", @@ -4011,81 +2074,11 @@ "from": "material-design-iconic-font@latest", "resolved": "https://registry.npmjs.org/material-design-iconic-font/-/material-design-iconic-font-2.2.0.tgz" }, - "math-expression-evaluator": { - "version": "1.2.17", - "from": "math-expression-evaluator@>=1.2.14 <2.0.0", - "resolved": "https://registry.npmjs.org/math-expression-evaluator/-/math-expression-evaluator-1.2.17.tgz", - "dev": true - }, "matrix-camera-controller": { "version": "2.1.3", "from": "matrix-camera-controller@>=2.1.3 <3.0.0", "resolved": "https://registry.npmjs.org/matrix-camera-controller/-/matrix-camera-controller-2.1.3.tgz" }, - "media-typer": { - "version": "0.3.0", - "from": "media-typer@0.3.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", - "dev": true - }, - "memory-fs": { - "version": "0.3.0", - "from": "memory-fs@>=0.3.0 <0.4.0", - "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.3.0.tgz", - "dev": true, - "dependencies": { - "readable-stream": { - "version": "2.2.9", - "from": "readable-stream@>=2.0.1 <3.0.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.2.9.tgz", - "dev": true - }, - "string_decoder": { - "version": "1.0.0", - "from": "string_decoder@~1.0.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.0.tgz", - "dev": true - } - } - }, - "meow": { - "version": "3.7.0", - "from": "meow@>=3.7.0 <4.0.0", - "resolved": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz", - "dev": true, - "dependencies": { - "minimist": { - "version": "1.2.0", - "from": "minimist@^1.1.3", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "dev": true - } - } - }, - "merge-descriptors": { - "version": "1.0.1", - "from": "merge-descriptors@1.0.1", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", - "dev": true - }, - "methods": { - "version": "1.1.2", - "from": "methods@>=1.1.2 <1.2.0", - "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", - "dev": true - }, - "micromatch": { - "version": "2.3.11", - "from": "micromatch@>=2.1.5 <3.0.0", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", - "dev": true - }, - "mime": { - "version": "1.3.4", - "from": "mime@>=1.3.0 <1.4.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.3.4.tgz", - "dev": true - }, "mime-db": { "version": "1.24.0", "from": "mime-db@>=1.24.0 <1.25.0", @@ -4106,12 +2099,6 @@ "from": "minimist@0.0.8", "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz" }, - "mkdirp": { - "version": "0.5.1", - "from": "mkdirp@>=0.5.1 <0.6.0", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", - "dev": true - }, "moment": { "version": "2.15.2", "from": "moment@latest", @@ -4186,30 +2173,6 @@ "from": "mustache@latest", "resolved": "https://registry.npmjs.org/mustache/-/mustache-2.2.1.tgz" }, - "mute-stream": { - "version": "0.0.5", - "from": "mute-stream@0.0.5", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.5.tgz", - "dev": true - }, - "nan": { - "version": "2.6.2", - "from": "nan@>=2.3.2 <3.0.0", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.6.2.tgz", - "dev": true - }, - "natural-compare": { - "version": "1.4.0", - "from": "natural-compare@>=1.4.0 <2.0.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "dev": true - }, - "ncname": { - "version": "1.0.0", - "from": "ncname@>=1.0.0 <1.1.0", - "resolved": "https://registry.npmjs.org/ncname/-/ncname-1.0.0.tgz", - "dev": true - }, "ndarray": { "version": "1.0.18", "from": "ndarray@>=1.0.16 <2.0.0", @@ -4265,12 +2228,6 @@ "from": "ndarray-warp@>=1.0.0 <2.0.0", "resolved": "https://registry.npmjs.org/ndarray-warp/-/ndarray-warp-1.0.1.tgz" }, - "negotiator": { - "version": "0.6.1", - "from": "negotiator@0.6.1", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.1.tgz", - "dev": true - }, "nextafter": { "version": "1.0.0", "from": "nextafter@>=1.0.0 <2.0.0", @@ -4298,72 +2255,6 @@ "from": "ng-annotate-loader@latest", "resolved": "https://registry.npmjs.org/ng-annotate-loader/-/ng-annotate-loader-0.2.0.tgz" }, - "no-case": { - "version": "2.3.1", - "from": "no-case@>=2.2.0 <3.0.0", - "resolved": "https://registry.npmjs.org/no-case/-/no-case-2.3.1.tgz", - "dev": true - }, - "node-emoji": { - "version": "1.5.1", - "from": "node-emoji@>=1.4.1 <2.0.0", - "resolved": "https://registry.npmjs.org/node-emoji/-/node-emoji-1.5.1.tgz", - "dev": true - }, - "node-gyp": { - "version": "3.6.0", - "from": "node-gyp@>=3.3.1 <4.0.0", - "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-3.6.0.tgz", - "dev": true - }, - "node-libs-browser": { - "version": "0.7.0", - "from": "node-libs-browser@>=0.7.0 <0.8.0", - "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-0.7.0.tgz", - "dev": true, - "dependencies": { - "readable-stream": { - "version": "2.2.9", - "from": "readable-stream@>=2.0.5 <3.0.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.2.9.tgz", - "dev": true, - "dependencies": { - "string_decoder": { - "version": "1.0.0", - "from": "string_decoder@~1.0.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.0.tgz", - "dev": true - } - } - } - } - }, - "node-notifier": { - "version": "4.6.1", - "from": "node-notifier@>=4.1.0 <5.0.0", - "resolved": "https://registry.npmjs.org/node-notifier/-/node-notifier-4.6.1.tgz", - "dev": true, - "dependencies": { - "lodash.clonedeep": { - "version": "3.0.2", - "from": "lodash.clonedeep@>=3.0.0 <4.0.0", - "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-3.0.2.tgz", - "dev": true - }, - "minimist": { - "version": "1.2.0", - "from": "minimist@^1.1.1", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "dev": true - } - } - }, - "node-sass": { - "version": "4.5.2", - "from": "node-sass@>=4.3.0 <5.0.0", - "resolved": "https://registry.npmjs.org/node-sass/-/node-sass-4.5.2.tgz", - "dev": true - }, "nomnom": { "version": "1.8.1", "from": "nomnom@>=1.5.0", @@ -4391,64 +2282,16 @@ } } }, - "nopt": { - "version": "3.0.6", - "from": "nopt@>=2.0.0 <3.0.0||>=3.0.0 <4.0.0", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz", - "dev": true - }, - "normalize-package-data": { - "version": "2.3.8", - "from": "normalize-package-data@>=2.3.4 <3.0.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.3.8.tgz", - "dev": true - }, "normalize-path": { "version": "2.0.1", "from": "normalize-path@>=2.0.1 <3.0.0", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.0.1.tgz" }, - "normalize-range": { - "version": "0.1.2", - "from": "normalize-range@>=0.1.2 <0.2.0", - "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", - "dev": true - }, - "normalize-url": { - "version": "1.9.1", - "from": "normalize-url@>=1.4.0 <2.0.0", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-1.9.1.tgz", - "dev": true - }, "normals": { "version": "1.1.0", "from": "normals@>=1.0.1 <2.0.0", "resolved": "https://registry.npmjs.org/normals/-/normals-1.1.0.tgz" }, - "npmlog": { - "version": "4.0.2", - "from": "npmlog@>=4.0.0 <5.0.0", - "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.0.2.tgz", - "dev": true - }, - "nth-check": { - "version": "1.0.1", - "from": "nth-check@>=1.0.1 <1.1.0", - "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.1.tgz", - "dev": true - }, - "num2fraction": { - "version": "1.2.2", - "from": "num2fraction@>=1.2.2 <2.0.0", - "resolved": "https://registry.npmjs.org/num2fraction/-/num2fraction-1.2.2.tgz", - "dev": true - }, - "number-is-nan": { - "version": "1.0.1", - "from": "number-is-nan@>=1.0.0 <2.0.0", - "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", - "dev": true - }, "numeric": { "version": "1.2.6", "from": "numeric@>=1.2.6 <2.0.0", @@ -4464,12 +2307,6 @@ "from": "object-assign@>=4.0.1 <5.0.0", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.0.tgz" }, - "object-hash": { - "version": "1.1.8", - "from": "object-hash@>=1.1.4 <2.0.0", - "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-1.1.8.tgz", - "dev": true - }, "object-inspect": { "version": "1.2.2", "from": "object-inspect@>=1.2.1 <1.3.0", @@ -4480,41 +2317,11 @@ "from": "object-keys@>=1.0.8 <2.0.0", "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.0.11.tgz" }, - "object.omit": { - "version": "2.0.1", - "from": "object.omit@>=2.0.0 <3.0.0", - "resolved": "https://registry.npmjs.org/object.omit/-/object.omit-2.0.1.tgz", - "dev": true - }, - "on-finished": { - "version": "2.3.0", - "from": "on-finished@>=2.3.0 <2.4.0", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", - "dev": true - }, - "on-headers": { - "version": "1.0.1", - "from": "on-headers@>=1.0.1 <1.1.0", - "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.1.tgz", - "dev": true - }, "once": { "version": "1.4.0", "from": "once@>=1.3.0 <2.0.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz" }, - "onetime": { - "version": "1.1.0", - "from": "onetime@>=1.0.0 <2.0.0", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-1.1.0.tgz", - "dev": true - }, - "open": { - "version": "0.0.5", - "from": "open@0.0.5", - "resolved": "https://registry.npmjs.org/open/-/open-0.0.5.tgz", - "dev": true - }, "optimist": { "version": "0.6.1", "from": "optimist@>=0.6.0 <0.7.0", @@ -4547,50 +2354,6 @@ "from": "ordered-esprima-props@>=1.1.0 <1.2.0", "resolved": "https://registry.npmjs.org/ordered-esprima-props/-/ordered-esprima-props-1.1.0.tgz" }, - "original": { - "version": "1.0.0", - "from": "original@>=0.0.5", - "resolved": "https://registry.npmjs.org/original/-/original-1.0.0.tgz", - "dev": true, - "dependencies": { - "url-parse": { - "version": "1.0.5", - "from": "url-parse@>=1.0.0 <1.1.0", - "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.0.5.tgz", - "dev": true - } - } - }, - "os-browserify": { - "version": "0.2.1", - "from": "os-browserify@>=0.2.0 <0.3.0", - "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.2.1.tgz", - "dev": true - }, - "os-homedir": { - "version": "1.0.2", - "from": "os-homedir@>=1.0.0 <2.0.0", - "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", - "dev": true - }, - "os-locale": { - "version": "1.4.0", - "from": "os-locale@>=1.4.0 <2.0.0", - "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", - "dev": true - }, - "os-tmpdir": { - "version": "1.0.2", - "from": "os-tmpdir@>=1.0.1 <2.0.0", - "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", - "dev": true - }, - "osenv": { - "version": "0.1.4", - "from": "osenv@>=0.0.0 <1.0.0", - "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.4.tgz", - "dev": true - }, "pace-progress": { "version": "1.0.2", "from": "git+https://github.com/getredash/pace.git", @@ -4601,87 +2364,21 @@ "from": "pad-left@>=1.0.2 <2.0.0", "resolved": "https://registry.npmjs.org/pad-left/-/pad-left-1.0.2.tgz" }, - "pako": { - "version": "0.2.9", - "from": "pako@>=0.2.0 <0.3.0", - "resolved": "https://registry.npmjs.org/pako/-/pako-0.2.9.tgz", - "dev": true - }, - "param-case": { - "version": "2.1.1", - "from": "param-case@>=2.1.0 <2.2.0", - "resolved": "https://registry.npmjs.org/param-case/-/param-case-2.1.1.tgz", - "dev": true - }, - "parse-glob": { - "version": "3.0.4", - "from": "parse-glob@>=3.0.4 <4.0.0", - "resolved": "https://registry.npmjs.org/parse-glob/-/parse-glob-3.0.4.tgz", - "dev": true - }, - "parse-json": { - "version": "2.2.0", - "from": "parse-json@>=2.2.0 <3.0.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", - "dev": true - }, "parse-unit": { "version": "1.0.1", "from": "parse-unit@>=1.0.1 <2.0.0", "resolved": "https://registry.npmjs.org/parse-unit/-/parse-unit-1.0.1.tgz" }, - "parseurl": { - "version": "1.3.1", - "from": "parseurl@>=1.3.1 <1.4.0", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.1.tgz", - "dev": true - }, - "path-browserify": { - "version": "0.0.0", - "from": "path-browserify@0.0.0", - "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.0.tgz", - "dev": true - }, - "path-exists": { - "version": "2.1.0", - "from": "path-exists@>=2.0.0 <3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", - "dev": true - }, "path-is-absolute": { "version": "1.0.1", "from": "path-is-absolute@>=1.0.0 <2.0.0", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz" }, - "path-is-inside": { - "version": "1.0.2", - "from": "path-is-inside@>=1.0.1 <2.0.0", - "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", - "dev": true - }, - "path-to-regexp": { - "version": "0.1.7", - "from": "path-to-regexp@0.1.7", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", - "dev": true - }, - "path-type": { - "version": "1.1.0", - "from": "path-type@>=1.0.0 <2.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", - "dev": true - }, "pbf": { "version": "1.3.7", "from": "pbf@>=1.3.2 <2.0.0", "resolved": "https://registry.npmjs.org/pbf/-/pbf-1.3.7.tgz" }, - "pbkdf2-compat": { - "version": "2.0.1", - "from": "pbkdf2-compat@2.0.1", - "resolved": "https://registry.npmjs.org/pbkdf2-compat/-/pbkdf2-compat-2.0.1.tgz", - "dev": true - }, "permutation-parity": { "version": "1.0.0", "from": "permutation-parity@>=1.0.0 <2.0.0", @@ -4692,12 +2389,6 @@ "from": "permutation-rank@>=1.0.0 <2.0.0", "resolved": "https://registry.npmjs.org/permutation-rank/-/permutation-rank-1.0.0.tgz" }, - "pify": { - "version": "2.3.0", - "from": "pify@>=2.0.0 <3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "dev": true - }, "pinkie": { "version": "2.0.4", "from": "pinkie@>=2.0.0 <3.0.0", @@ -4713,18 +2404,6 @@ "from": "pivottable@latest", "resolved": "https://registry.npmjs.org/pivottable/-/pivottable-2.3.0.tgz" }, - "pkg-dir": { - "version": "1.0.0", - "from": "pkg-dir@>=1.0.0 <2.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-1.0.0.tgz", - "dev": true - }, - "pkg-up": { - "version": "1.0.0", - "from": "pkg-up@>=1.0.0 <2.0.0", - "resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-1.0.0.tgz", - "dev": true - }, "planar-dual": { "version": "1.0.2", "from": "planar-dual@>=1.0.0 <2.0.0", @@ -4740,12 +2419,6 @@ "from": "plotly.js@1.26.1", "resolved": "https://registry.npmjs.org/plotly.js/-/plotly.js-1.26.1.tgz" }, - "pluralize": { - "version": "1.2.1", - "from": "pluralize@>=1.2.1 <2.0.0", - "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-1.2.1.tgz", - "dev": true - }, "pngjs": { "version": "2.3.1", "from": "pngjs@>=2.2.0 <3.0.0", @@ -4766,319 +2439,31 @@ "from": "polytope-closest-point@>=1.0.0 <2.0.0", "resolved": "https://registry.npmjs.org/polytope-closest-point/-/polytope-closest-point-1.0.0.tgz" }, - "postcss": { - "version": "5.2.17", - "from": "postcss@>=5.0.6 <6.0.0", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.17.tgz", - "dev": true - }, - "postcss-calc": { - "version": "5.3.1", - "from": "postcss-calc@>=5.2.0 <6.0.0", - "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-5.3.1.tgz", - "dev": true - }, - "postcss-colormin": { - "version": "2.2.2", - "from": "postcss-colormin@>=2.1.8 <3.0.0", - "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-2.2.2.tgz", - "dev": true - }, - "postcss-convert-values": { - "version": "2.6.1", - "from": "postcss-convert-values@>=2.3.4 <3.0.0", - "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-2.6.1.tgz", - "dev": true - }, - "postcss-discard-comments": { - "version": "2.0.4", - "from": "postcss-discard-comments@>=2.0.4 <3.0.0", - "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-2.0.4.tgz", - "dev": true - }, - "postcss-discard-duplicates": { - "version": "2.1.0", - "from": "postcss-discard-duplicates@>=2.0.1 <3.0.0", - "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-2.1.0.tgz", - "dev": true - }, - "postcss-discard-empty": { - "version": "2.1.0", - "from": "postcss-discard-empty@>=2.0.1 <3.0.0", - "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-2.1.0.tgz", - "dev": true - }, - "postcss-discard-overridden": { - "version": "0.1.1", - "from": "postcss-discard-overridden@>=0.1.1 <0.2.0", - "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-0.1.1.tgz", - "dev": true - }, - "postcss-discard-unused": { - "version": "2.2.3", - "from": "postcss-discard-unused@>=2.2.1 <3.0.0", - "resolved": "https://registry.npmjs.org/postcss-discard-unused/-/postcss-discard-unused-2.2.3.tgz", - "dev": true - }, - "postcss-filter-plugins": { - "version": "2.0.2", - "from": "postcss-filter-plugins@>=2.0.0 <3.0.0", - "resolved": "https://registry.npmjs.org/postcss-filter-plugins/-/postcss-filter-plugins-2.0.2.tgz", - "dev": true - }, - "postcss-merge-idents": { - "version": "2.1.7", - "from": "postcss-merge-idents@>=2.1.5 <3.0.0", - "resolved": "https://registry.npmjs.org/postcss-merge-idents/-/postcss-merge-idents-2.1.7.tgz", - "dev": true - }, - "postcss-merge-longhand": { - "version": "2.0.2", - "from": "postcss-merge-longhand@>=2.0.1 <3.0.0", - "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-2.0.2.tgz", - "dev": true - }, - "postcss-merge-rules": { - "version": "2.1.2", - "from": "postcss-merge-rules@>=2.0.3 <3.0.0", - "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-2.1.2.tgz", - "dev": true - }, - "postcss-message-helpers": { - "version": "2.0.0", - "from": "postcss-message-helpers@>=2.0.0 <3.0.0", - "resolved": "https://registry.npmjs.org/postcss-message-helpers/-/postcss-message-helpers-2.0.0.tgz", - "dev": true - }, - "postcss-minify-font-values": { - "version": "1.0.5", - "from": "postcss-minify-font-values@>=1.0.2 <2.0.0", - "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-1.0.5.tgz", - "dev": true - }, - "postcss-minify-gradients": { - "version": "1.0.5", - "from": "postcss-minify-gradients@>=1.0.1 <2.0.0", - "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-1.0.5.tgz", - "dev": true - }, - "postcss-minify-params": { - "version": "1.2.2", - "from": "postcss-minify-params@>=1.0.4 <2.0.0", - "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-1.2.2.tgz", - "dev": true - }, - "postcss-minify-selectors": { - "version": "2.1.1", - "from": "postcss-minify-selectors@>=2.0.4 <3.0.0", - "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-2.1.1.tgz", - "dev": true - }, - "postcss-modules-extract-imports": { - "version": "1.0.1", - "from": "postcss-modules-extract-imports@>=1.0.0 <2.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-1.0.1.tgz", - "dev": true - }, - "postcss-modules-local-by-default": { - "version": "1.1.1", - "from": "postcss-modules-local-by-default@>=1.0.1 <2.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-1.1.1.tgz", - "dev": true - }, - "postcss-modules-scope": { - "version": "1.0.2", - "from": "postcss-modules-scope@>=1.0.0 <2.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-1.0.2.tgz", - "dev": true - }, - "postcss-modules-values": { - "version": "1.2.2", - "from": "postcss-modules-values@>=1.1.0 <2.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-1.2.2.tgz", - "dev": true - }, - "postcss-normalize-charset": { - "version": "1.1.1", - "from": "postcss-normalize-charset@>=1.1.0 <2.0.0", - "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-1.1.1.tgz", - "dev": true - }, - "postcss-normalize-url": { - "version": "3.0.8", - "from": "postcss-normalize-url@>=3.0.7 <4.0.0", - "resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-3.0.8.tgz", - "dev": true - }, - "postcss-ordered-values": { - "version": "2.2.3", - "from": "postcss-ordered-values@>=2.1.0 <3.0.0", - "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-2.2.3.tgz", - "dev": true - }, - "postcss-reduce-idents": { - "version": "2.4.0", - "from": "postcss-reduce-idents@>=2.2.2 <3.0.0", - "resolved": "https://registry.npmjs.org/postcss-reduce-idents/-/postcss-reduce-idents-2.4.0.tgz", - "dev": true - }, - "postcss-reduce-initial": { - "version": "1.0.1", - "from": "postcss-reduce-initial@>=1.0.0 <2.0.0", - "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-1.0.1.tgz", - "dev": true - }, - "postcss-reduce-transforms": { - "version": "1.0.4", - "from": "postcss-reduce-transforms@>=1.0.3 <2.0.0", - "resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-1.0.4.tgz", - "dev": true - }, - "postcss-selector-parser": { - "version": "2.2.3", - "from": "postcss-selector-parser@>=2.2.2 <3.0.0", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-2.2.3.tgz", - "dev": true - }, - "postcss-svgo": { - "version": "2.1.6", - "from": "postcss-svgo@>=2.1.1 <3.0.0", - "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-2.1.6.tgz", - "dev": true - }, - "postcss-unique-selectors": { - "version": "2.0.2", - "from": "postcss-unique-selectors@>=2.0.2 <3.0.0", - "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-2.0.2.tgz", - "dev": true - }, - "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", - "dev": true - }, - "postcss-zindex": { - "version": "2.2.0", - "from": "postcss-zindex@>=2.0.1 <3.0.0", - "resolved": "https://registry.npmjs.org/postcss-zindex/-/postcss-zindex-2.2.0.tgz", - "dev": true - }, "prelude-ls": { "version": "1.1.2", "from": "prelude-ls@>=1.1.2 <1.2.0", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz" }, - "prepend-http": { - "version": "1.0.4", - "from": "prepend-http@>=1.0.0 <2.0.0", - "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz", - "dev": true - }, - "preserve": { - "version": "0.2.0", - "from": "preserve@>=0.2.0 <0.3.0", - "resolved": "https://registry.npmjs.org/preserve/-/preserve-0.2.0.tgz", - "dev": true - }, - "pretty-error": { - "version": "2.1.0", - "from": "pretty-error@>=2.0.2 <3.0.0", - "resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-2.1.0.tgz", - "dev": true - }, - "private": { - "version": "0.1.7", - "from": "private@>=0.1.6 <0.2.0", - "resolved": "https://registry.npmjs.org/private/-/private-0.1.7.tgz", - "dev": true - }, - "process": { - "version": "0.11.10", - "from": "process@>=0.11.0 <0.12.0", - "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", - "dev": true - }, "process-nextick-args": { "version": "1.0.7", "from": "process-nextick-args@>=1.0.6 <1.1.0", "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz" }, - "progress": { - "version": "1.1.8", - "from": "progress@>=1.1.8 <2.0.0", - "resolved": "https://registry.npmjs.org/progress/-/progress-1.1.8.tgz", - "dev": true - }, "protocol-buffers-schema": { "version": "2.2.0", "from": "protocol-buffers-schema@>=2.0.2 <3.0.0", "resolved": "https://registry.npmjs.org/protocol-buffers-schema/-/protocol-buffers-schema-2.2.0.tgz" }, - "proxy-addr": { - "version": "1.1.4", - "from": "proxy-addr@>=1.1.3 <1.2.0", - "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-1.1.4.tgz", - "dev": true - }, - "prr": { - "version": "0.0.0", - "from": "prr@>=0.0.0 <0.1.0", - "resolved": "https://registry.npmjs.org/prr/-/prr-0.0.0.tgz", - "dev": true - }, - "pseudomap": { - "version": "1.0.2", - "from": "pseudomap@>=1.0.1 <2.0.0", - "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", - "dev": true - }, "punycode": { "version": "1.4.1", "from": "punycode@>=1.2.4 <2.0.0", "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz" }, - "q": { - "version": "1.5.0", - "from": "q@>=1.1.2 <2.0.0", - "resolved": "https://registry.npmjs.org/q/-/q-1.5.0.tgz", - "dev": true - }, - "qs": { - "version": "6.4.0", - "from": "qs@6.4.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.4.0.tgz", - "dev": true - }, "quat-slerp": { "version": "1.0.1", "from": "quat-slerp@>=1.0.0 <2.0.0", "resolved": "https://registry.npmjs.org/quat-slerp/-/quat-slerp-1.0.1.tgz" }, - "query-string": { - "version": "4.3.4", - "from": "query-string@>=4.1.0 <5.0.0", - "resolved": "https://registry.npmjs.org/query-string/-/query-string-4.3.4.tgz", - "dev": true - }, - "querystring": { - "version": "0.2.0", - "from": "querystring@0.2.0", - "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", - "dev": true - }, - "querystring-es3": { - "version": "0.2.1", - "from": "querystring-es3@>=0.2.0 <0.3.0", - "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz", - "dev": true - }, - "querystringify": { - "version": "0.0.4", - "from": "querystringify@>=0.0.0 <0.1.0", - "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-0.0.4.tgz", - "dev": true - }, "quickselect": { "version": "1.0.0", "from": "quickselect@>=1.0.0 <2.0.0", @@ -5089,11 +2474,21 @@ "from": "quote-stream@>=0.0.0 <0.1.0", "resolved": "https://registry.npmjs.org/quote-stream/-/quote-stream-0.0.0.tgz", "dependencies": { + "isarray": { + "version": "0.0.1", + "from": "isarray@0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz" + }, "object-keys": { "version": "0.4.0", "from": "object-keys@>=0.4.0 <0.5.0", "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-0.4.0.tgz" }, + "readable-stream": { + "version": "1.0.34", + "from": "readable-stream@~1.0.17", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz" + }, "through2": { "version": "0.4.2", "from": "through2@>=0.4.1 <0.5.0", @@ -5106,214 +2501,31 @@ } } }, - "randomatic": { - "version": "1.1.6", - "from": "randomatic@>=1.1.3 <2.0.0", - "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-1.1.6.tgz", - "dev": true - }, - "range-parser": { - "version": "1.2.0", - "from": "range-parser@>=1.2.0 <1.3.0", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz", - "dev": true - }, "rat-vec": { "version": "1.1.1", "from": "rat-vec@>=1.1.1 <2.0.0", "resolved": "https://registry.npmjs.org/rat-vec/-/rat-vec-1.1.1.tgz" }, - "raw-loader": { - "version": "0.5.1", - "from": "raw-loader@>=0.5.1 <0.6.0", - "resolved": "https://registry.npmjs.org/raw-loader/-/raw-loader-0.5.1.tgz", - "dev": true - }, - "read-pkg": { - "version": "1.1.0", - "from": "read-pkg@>=1.0.0 <2.0.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", - "dev": true - }, - "read-pkg-up": { - "version": "1.0.1", - "from": "read-pkg-up@>=1.0.1 <2.0.0", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", - "dev": true - }, "readable-stream": { - "version": "1.0.34", - "from": "readable-stream@>=1.0.33-1 <1.1.0-0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", - "dependencies": { - "isarray": { - "version": "0.0.1", - "from": "isarray@0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz" - } - } - }, - "readdirp": { - "version": "2.1.0", - "from": "readdirp@>=2.0.0 <3.0.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.1.0.tgz", - "dev": true, - "dependencies": { - "readable-stream": { - "version": "2.2.9", - "from": "readable-stream@>=2.0.2 <3.0.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.2.9.tgz", - "dev": true - }, - "string_decoder": { - "version": "1.0.0", - "from": "string_decoder@~1.0.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.0.tgz", - "dev": true - } - } - }, - "readline2": { - "version": "1.0.1", - "from": "readline2@>=1.0.1 <2.0.0", - "resolved": "https://registry.npmjs.org/readline2/-/readline2-1.0.1.tgz", - "dev": true - }, - "rechoir": { - "version": "0.6.2", - "from": "rechoir@>=0.6.2 <0.7.0", - "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", - "dev": true - }, - "redent": { - "version": "1.0.0", - "from": "redent@>=1.0.0 <2.0.0", - "resolved": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz", - "dev": true - }, - "redeyed": { - "version": "1.0.1", - "from": "redeyed@>=1.0.0 <1.1.0", - "resolved": "https://registry.npmjs.org/redeyed/-/redeyed-1.0.1.tgz", - "dev": true, - "dependencies": { - "esprima": { - "version": "3.0.0", - "from": "esprima@>=3.0.0 <3.1.0", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-3.0.0.tgz", - "dev": true - } - } - }, - "reduce-css-calc": { - "version": "1.3.0", - "from": "reduce-css-calc@>=1.2.6 <2.0.0", - "resolved": "https://registry.npmjs.org/reduce-css-calc/-/reduce-css-calc-1.3.0.tgz", - "dev": true - }, - "reduce-function-call": { - "version": "1.0.2", - "from": "reduce-function-call@>=1.0.1 <2.0.0", - "resolved": "https://registry.npmjs.org/reduce-function-call/-/reduce-function-call-1.0.2.tgz", - "dev": true + "version": "2.1.5", + "from": "readable-stream@>=2.0.1 <3.0.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.1.5.tgz" }, "reduce-simplicial-complex": { "version": "1.0.0", "from": "reduce-simplicial-complex@>=1.0.0 <2.0.0", "resolved": "https://registry.npmjs.org/reduce-simplicial-complex/-/reduce-simplicial-complex-1.0.0.tgz" }, - "regenerate": { - "version": "1.3.2", - "from": "regenerate@>=1.2.1 <2.0.0", - "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.3.2.tgz", - "dev": true - }, - "regenerator-runtime": { - "version": "0.10.5", - "from": "regenerator-runtime@>=0.10.0 <0.11.0", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.10.5.tgz", - "dev": true - }, - "regenerator-transform": { - "version": "0.9.11", - "from": "regenerator-transform@0.9.11", - "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.9.11.tgz", - "dev": true - }, - "regex-cache": { - "version": "0.4.3", - "from": "regex-cache@>=0.4.2 <0.5.0", - "resolved": "https://registry.npmjs.org/regex-cache/-/regex-cache-0.4.3.tgz", - "dev": true - }, - "regexpu-core": { - "version": "2.0.0", - "from": "regexpu-core@>=2.0.0 <3.0.0", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-2.0.0.tgz", - "dev": true - }, - "regjsgen": { - "version": "0.2.0", - "from": "regjsgen@>=0.2.0 <0.3.0", - "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.2.0.tgz", - "dev": true - }, - "regjsparser": { - "version": "0.1.5", - "from": "regjsparser@>=0.1.4 <0.2.0", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.1.5.tgz", - "dev": true, - "dependencies": { - "jsesc": { - "version": "0.5.0", - "from": "jsesc@>=0.5.0 <0.6.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", - "dev": true - } - } - }, "regl": { "version": "1.3.0", "from": "regl@>=1.3.0 <2.0.0", "resolved": "https://registry.npmjs.org/regl/-/regl-1.3.0.tgz" }, - "relateurl": { - "version": "0.2.7", - "from": "relateurl@>=0.2.0 <0.3.0", - "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz", - "dev": true - }, - "renderkid": { - "version": "2.0.1", - "from": "renderkid@>=2.0.1 <3.0.0", - "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-2.0.1.tgz", - "dev": true, - "dependencies": { - "utila": { - "version": "0.3.3", - "from": "utila@>=0.3.0 <0.4.0", - "resolved": "https://registry.npmjs.org/utila/-/utila-0.3.3.tgz", - "dev": true - } - } - }, - "repeat-element": { - "version": "1.1.2", - "from": "repeat-element@>=1.1.2 <2.0.0", - "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.2.tgz", - "dev": true - }, "repeat-string": { "version": "1.6.1", "from": "repeat-string@>=1.5.2 <2.0.0", "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz" }, - "repeating": { - "version": "2.0.1", - "from": "repeating@>=2.0.0 <3.0.0", - "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", - "dev": true - }, "request": { "version": "2.79.0", "from": "request@>=2.39.0 <3.0.0", @@ -5331,41 +2543,11 @@ } } }, - "require-directory": { - "version": "2.1.1", - "from": "require-directory@>=2.1.1 <3.0.0", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "dev": true - }, - "require-main-filename": { - "version": "1.0.1", - "from": "require-main-filename@>=1.0.1 <2.0.0", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", - "dev": true - }, - "require-uncached": { - "version": "1.0.3", - "from": "require-uncached@>=1.0.2 <2.0.0", - "resolved": "https://registry.npmjs.org/require-uncached/-/require-uncached-1.0.3.tgz", - "dev": true - }, - "requires-port": { - "version": "1.0.0", - "from": "requires-port@>=1.0.0 <2.0.0", - "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", - "dev": true - }, "resolve": { "version": "1.1.7", "from": "resolve@>=1.1.6 <2.0.0", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz" }, - "resolve-from": { - "version": "1.0.1", - "from": "resolve-from@>=1.0.0 <2.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-1.0.1.tgz", - "dev": true - }, "resolve-protobuf-schema": { "version": "2.0.0", "from": "resolve-protobuf-schema@>=2.0.0 <3.0.0", @@ -5376,12 +2558,6 @@ "from": "resolve-url@>=0.2.1 <0.3.0", "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz" }, - "restore-cursor": { - "version": "1.0.1", - "from": "restore-cursor@>=1.0.1 <2.0.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-1.0.1.tgz", - "dev": true - }, "resumer": { "version": "0.0.0", "from": "resumer@>=0.0.0 <0.1.0", @@ -5397,18 +2573,6 @@ "from": "right-now@>=1.0.0 <2.0.0", "resolved": "https://registry.npmjs.org/right-now/-/right-now-1.0.0.tgz" }, - "rimraf": { - "version": "2.6.1", - "from": "rimraf@>=2.2.8 <3.0.0", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.1.tgz", - "dev": true - }, - "ripemd160": { - "version": "0.2.0", - "from": "ripemd160@0.2.0", - "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-0.2.0.tgz", - "dev": true - }, "robust-compress": { "version": "1.0.0", "from": "robust-compress@>=1.0.0 <2.0.0", @@ -5464,170 +2628,16 @@ "from": "robust-sum@>=1.0.0 <2.0.0", "resolved": "https://registry.npmjs.org/robust-sum/-/robust-sum-1.0.0.tgz" }, - "run-async": { - "version": "0.1.0", - "from": "run-async@>=0.1.0 <0.2.0", - "resolved": "https://registry.npmjs.org/run-async/-/run-async-0.1.0.tgz", - "dev": true - }, "rw": { "version": "0.1.4", "from": "rw@>=0.1.4 <0.2.0", "resolved": "https://registry.npmjs.org/rw/-/rw-0.1.4.tgz" }, - "rx-lite": { - "version": "3.1.2", - "from": "rx-lite@>=3.1.2 <4.0.0", - "resolved": "https://registry.npmjs.org/rx-lite/-/rx-lite-3.1.2.tgz", - "dev": true - }, "sane-topojson": { "version": "2.0.0", "from": "sane-topojson@>=2.0.0 <3.0.0", "resolved": "https://registry.npmjs.org/sane-topojson/-/sane-topojson-2.0.0.tgz" }, - "sass-graph": { - "version": "2.2.2", - "from": "sass-graph@>=2.1.1 <3.0.0", - "resolved": "https://registry.npmjs.org/sass-graph/-/sass-graph-2.2.2.tgz", - "dev": true, - "dependencies": { - "camelcase": { - "version": "3.0.0", - "from": "camelcase@>=3.0.0 <4.0.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", - "dev": true - }, - "cliui": { - "version": "3.2.0", - "from": "cliui@>=3.2.0 <4.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", - "dev": true - }, - "yargs": { - "version": "6.6.0", - "from": "yargs@>=6.6.0 <7.0.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-6.6.0.tgz", - "dev": true - } - } - }, - "sass-loader": { - "version": "4.1.1", - "from": "sass-loader@>=4.1.1 <5.0.0", - "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-4.1.1.tgz", - "dev": true, - "dependencies": { - "async": { - "version": "2.2.0", - "from": "async@>=2.0.1 <3.0.0", - "resolved": "https://registry.npmjs.org/async/-/async-2.2.0.tgz", - "dev": true - } - } - }, - "sax": { - "version": "1.2.2", - "from": "sax@>=1.2.1 <1.3.0", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.2.tgz", - "dev": true - }, - "scss-tokenizer": { - "version": "0.2.1", - "from": "scss-tokenizer@>=0.2.1 <0.3.0", - "resolved": "https://registry.npmjs.org/scss-tokenizer/-/scss-tokenizer-0.2.1.tgz", - "dev": true, - "dependencies": { - "source-map": { - "version": "0.4.4", - "from": "source-map@>=0.4.2 <0.5.0", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz", - "dev": true - } - } - }, - "semver": { - "version": "5.3.0", - "from": "semver@>=2.0.0 <3.0.0||>=3.0.0 <4.0.0||>=4.0.0 <5.0.0||>=5.0.0 <6.0.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.3.0.tgz", - "dev": true - }, - "send": { - "version": "0.15.1", - "from": "send@0.15.1", - "resolved": "https://registry.npmjs.org/send/-/send-0.15.1.tgz", - "dev": true, - "dependencies": { - "debug": { - "version": "2.6.1", - "from": "debug@2.6.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.1.tgz", - "dev": true - }, - "ms": { - "version": "0.7.2", - "from": "ms@0.7.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.2.tgz", - "dev": true - } - } - }, - "serve-index": { - "version": "1.8.0", - "from": "serve-index@>=1.7.2 <2.0.0", - "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.8.0.tgz", - "dev": true, - "dependencies": { - "http-errors": { - "version": "1.5.1", - "from": "http-errors@>=1.5.0 <1.6.0", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.5.1.tgz", - "dev": true - }, - "setprototypeof": { - "version": "1.0.2", - "from": "setprototypeof@1.0.2", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.0.2.tgz", - "dev": true - } - } - }, - "serve-static": { - "version": "1.12.1", - "from": "serve-static@1.12.1", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.12.1.tgz", - "dev": true - }, - "set-blocking": { - "version": "2.0.0", - "from": "set-blocking@>=2.0.0 <2.1.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "dev": true - }, - "set-immediate-shim": { - "version": "1.0.1", - "from": "set-immediate-shim@>=1.0.1 <2.0.0", - "resolved": "https://registry.npmjs.org/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz", - "dev": true - }, - "setimmediate": { - "version": "1.0.5", - "from": "setimmediate@>=1.0.4 <2.0.0", - "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", - "dev": true - }, - "setprototypeof": { - "version": "1.0.3", - "from": "setprototypeof@1.0.3", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.0.3.tgz", - "dev": true - }, - "sha.js": { - "version": "2.2.6", - "from": "sha.js@2.2.6", - "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.2.6.tgz", - "dev": true - }, "shallow-copy": { "version": "0.0.1", "from": "shallow-copy@0.0.1", @@ -5638,24 +2648,6 @@ "from": "shelf-pack@>=1.0.0 <2.0.0", "resolved": "https://registry.npmjs.org/shelf-pack/-/shelf-pack-1.1.0.tgz" }, - "shelljs": { - "version": "0.7.7", - "from": "shelljs@>=0.7.5 <0.8.0", - "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.7.7.tgz", - "dev": true - }, - "shellwords": { - "version": "0.1.0", - "from": "shellwords@>=0.1.0 <0.2.0", - "resolved": "https://registry.npmjs.org/shellwords/-/shellwords-0.1.0.tgz", - "dev": true - }, - "signal-exit": { - "version": "3.0.2", - "from": "signal-exit@>=3.0.0 <4.0.0", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", - "dev": true - }, "signum": { "version": "0.0.0", "from": "signum@>=0.0.0 <0.0.1", @@ -5713,18 +2705,6 @@ "from": "slab-decomposition@>=1.0.1 <2.0.0", "resolved": "https://registry.npmjs.org/slab-decomposition/-/slab-decomposition-1.0.2.tgz" }, - "slash": { - "version": "1.0.0", - "from": "slash@>=1.0.0 <2.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", - "dev": true - }, - "slice-ansi": { - "version": "0.0.4", - "from": "slice-ansi@0.0.4", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-0.0.4.tgz", - "dev": true - }, "snap-points-2d": { "version": "1.0.1", "from": "snap-points-2d@>=1.0.1 <2.0.0", @@ -5735,26 +2715,6 @@ "from": "sntp@>=1.0.0 <2.0.0", "resolved": "https://registry.npmjs.org/sntp/-/sntp-1.0.9.tgz" }, - "sockjs": { - "version": "0.3.18", - "from": "sockjs@>=0.3.15 <0.4.0", - "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.18.tgz", - "dev": true - }, - "sockjs-client": { - "version": "1.1.2", - "from": "sockjs-client@>=1.0.3 <2.0.0", - "resolved": "https://registry.npmjs.org/sockjs-client/-/sockjs-client-1.1.2.tgz", - "dev": true, - "dependencies": { - "faye-websocket": { - "version": "0.11.1", - "from": "faye-websocket@>=0.11.0 <0.12.0", - "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.1.tgz", - "dev": true - } - } - }, "sort-asc": { "version": "0.1.0", "from": "sort-asc@>=0.1.0 <0.2.0", @@ -5765,52 +2725,16 @@ "from": "sort-desc@>=0.1.1 <0.2.0", "resolved": "https://registry.npmjs.org/sort-desc/-/sort-desc-0.1.1.tgz" }, - "sort-keys": { - "version": "1.1.2", - "from": "sort-keys@>=1.0.0 <2.0.0", - "resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-1.1.2.tgz", - "dev": true - }, "sort-object": { "version": "0.3.2", "from": "sort-object@>=0.3.2 <0.4.0", "resolved": "https://registry.npmjs.org/sort-object/-/sort-object-0.3.2.tgz" }, - "source-list-map": { - "version": "0.1.8", - "from": "source-list-map@>=0.1.4 <0.2.0", - "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-0.1.8.tgz", - "dev": true - }, "source-map": { "version": "0.5.6", "from": "source-map@>=0.5.1 <0.6.0", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz" }, - "source-map-support": { - "version": "0.4.15", - "from": "source-map-support@>=0.4.2 <0.5.0", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.4.15.tgz", - "dev": true - }, - "spdx-correct": { - "version": "1.0.2", - "from": "spdx-correct@>=1.0.0 <1.1.0", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-1.0.2.tgz", - "dev": true - }, - "spdx-expression-parse": { - "version": "1.0.4", - "from": "spdx-expression-parse@>=1.0.0 <1.1.0", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-1.0.4.tgz", - "dev": true - }, - "spdx-license-ids": { - "version": "1.2.2", - "from": "spdx-license-ids@>=1.0.2 <2.0.0", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-1.2.2.tgz", - "dev": true - }, "split-polygon": { "version": "1.0.0", "from": "split-polygon@>=1.0.0 <2.0.0", @@ -5865,6 +2789,11 @@ "from": "static-module@>=1.1.2 <2.0.0", "resolved": "https://registry.npmjs.org/static-module/-/static-module-1.3.1.tgz", "dependencies": { + "isarray": { + "version": "0.0.1", + "from": "isarray@0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz" + }, "object-inspect": { "version": "0.4.0", "from": "object-inspect@>=0.4.0 <0.5.0", @@ -5875,6 +2804,11 @@ "from": "object-keys@>=0.4.0 <0.5.0", "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-0.4.0.tgz" }, + "readable-stream": { + "version": "1.0.34", + "from": "readable-stream@~1.0.27-1", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz" + }, "through2": { "version": "0.4.2", "from": "through2@>=0.4.1 <0.5.0", @@ -5887,101 +2821,11 @@ } } }, - "statuses": { - "version": "1.3.1", - "from": "statuses@>=1.3.1 <1.4.0", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.3.1.tgz", - "dev": true - }, - "stdout-stream": { - "version": "1.4.0", - "from": "stdout-stream@>=1.4.0 <2.0.0", - "resolved": "https://registry.npmjs.org/stdout-stream/-/stdout-stream-1.4.0.tgz", - "dev": true, - "dependencies": { - "readable-stream": { - "version": "2.2.9", - "from": "readable-stream@>=2.0.1 <3.0.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.2.9.tgz", - "dev": true - }, - "string_decoder": { - "version": "1.0.0", - "from": "string_decoder@~1.0.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.0.tgz", - "dev": true - } - } - }, - "stream-browserify": { - "version": "2.0.1", - "from": "stream-browserify@>=2.0.1 <3.0.0", - "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.1.tgz", - "dev": true, - "dependencies": { - "readable-stream": { - "version": "2.2.9", - "from": "readable-stream@>=2.0.2 <3.0.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.2.9.tgz", - "dev": true - }, - "string_decoder": { - "version": "1.0.0", - "from": "string_decoder@~1.0.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.0.tgz", - "dev": true - } - } - }, - "stream-cache": { - "version": "0.0.2", - "from": "stream-cache@>=0.0.1 <0.1.0", - "resolved": "https://registry.npmjs.org/stream-cache/-/stream-cache-0.0.2.tgz", - "dev": true - }, - "stream-http": { - "version": "2.7.0", - "from": "stream-http@>=2.3.1 <3.0.0", - "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.7.0.tgz", - "dev": true, - "dependencies": { - "readable-stream": { - "version": "2.2.9", - "from": "readable-stream@>=2.2.6 <3.0.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.2.9.tgz", - "dev": true - }, - "string_decoder": { - "version": "1.0.0", - "from": "string_decoder@~1.0.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.0.tgz", - "dev": true - } - } - }, - "strict-uri-encode": { - "version": "1.1.0", - "from": "strict-uri-encode@>=1.0.0 <2.0.0", - "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz", - "dev": true - }, "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" }, - "string-width": { - "version": "1.0.2", - "from": "string-width@>=1.0.1 <2.0.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "dev": true - }, - "string.prototype.codepointat": { - "version": "0.2.0", - "from": "string.prototype.codepointat@>=0.2.0 <0.3.0", - "resolved": "https://registry.npmjs.org/string.prototype.codepointat/-/string.prototype.codepointat-0.2.0.tgz", - "dev": true - }, "string.prototype.trim": { "version": "1.1.2", "from": "string.prototype.trim@>=1.1.2 <1.2.0", @@ -6007,24 +2851,6 @@ "from": "strip-ansi@>=3.0.0 <4.0.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz" }, - "strip-bom": { - "version": "3.0.0", - "from": "strip-bom@>=3.0.0 <4.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "dev": true - }, - "strip-indent": { - "version": "1.0.1", - "from": "strip-indent@>=1.0.1 <2.0.0", - "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz", - "dev": true - }, - "strip-json-comments": { - "version": "2.0.1", - "from": "strip-json-comments@>=2.0.1 <2.1.0", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "dev": true - }, "supercluster": { "version": "2.3.0", "from": "supercluster@>=2.0.1 <3.0.0", @@ -6035,57 +2861,11 @@ "from": "superscript-text@>=1.0.0 <2.0.0", "resolved": "https://registry.npmjs.org/superscript-text/-/superscript-text-1.0.0.tgz" }, - "supports-color": { - "version": "3.2.3", - "from": "supports-color@>=3.2.3 <4.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", - "dev": true - }, "surface-nets": { "version": "1.0.2", "from": "surface-nets@>=1.0.2 <2.0.0", "resolved": "https://registry.npmjs.org/surface-nets/-/surface-nets-1.0.2.tgz" }, - "svgo": { - "version": "0.7.2", - "from": "svgo@>=0.7.0 <0.8.0", - "resolved": "https://registry.npmjs.org/svgo/-/svgo-0.7.2.tgz", - "dev": true, - "dependencies": { - "colors": { - "version": "1.1.2", - "from": "colors@>=1.1.2 <1.2.0", - "resolved": "https://registry.npmjs.org/colors/-/colors-1.1.2.tgz", - "dev": true - } - } - }, - "table": { - "version": "3.8.3", - "from": "table@>=3.7.8 <4.0.0", - "resolved": "https://registry.npmjs.org/table/-/table-3.8.3.tgz", - "dev": true, - "dependencies": { - "is-fullwidth-code-point": { - "version": "2.0.0", - "from": "is-fullwidth-code-point@>=2.0.0 <3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "dev": true - }, - "string-width": { - "version": "2.0.0", - "from": "string-width@>=2.0.0 <3.0.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.0.0.tgz", - "dev": true - } - } - }, - "tapable": { - "version": "0.1.10", - "from": "tapable@>=0.1.8 <0.2.0", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-0.1.10.tgz", - "dev": true - }, "tape": { "version": "4.6.3", "from": "tape@>=4.0.0 <5.0.0", @@ -6098,23 +2878,11 @@ } } }, - "tar": { - "version": "2.2.1", - "from": "tar@>=2.0.0 <3.0.0", - "resolved": "https://registry.npmjs.org/tar/-/tar-2.2.1.tgz", - "dev": true - }, "text-cache": { "version": "4.1.0", "from": "text-cache@>=4.1.0 <5.0.0", "resolved": "https://registry.npmjs.org/text-cache/-/text-cache-4.1.0.tgz" }, - "text-table": { - "version": "0.2.0", - "from": "text-table@>=0.2.0 <0.3.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "dev": true - }, "through": { "version": "2.3.8", "from": "through@>=2.3.6 <3.0.0", @@ -6123,13 +2891,19 @@ "through2": { "version": "0.6.5", "from": "through2@>=0.6.3 <0.7.0", - "resolved": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz" - }, - "timers-browserify": { - "version": "2.0.2", - "from": "timers-browserify@>=2.0.2 <3.0.0", - "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.2.tgz", - "dev": true + "resolved": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz", + "dependencies": { + "isarray": { + "version": "0.0.1", + "from": "isarray@0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz" + }, + "readable-stream": { + "version": "1.0.34", + "from": "readable-stream@>=1.0.33-1 <1.1.0-0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz" + } + } }, "tiny-sdf": { "version": "1.0.2", @@ -6141,18 +2915,6 @@ "from": "tinycolor2@>=1.3.0 <2.0.0", "resolved": "https://registry.npmjs.org/tinycolor2/-/tinycolor2-1.4.1.tgz" }, - "to-arraybuffer": { - "version": "1.0.1", - "from": "to-arraybuffer@>=1.0.0 <2.0.0", - "resolved": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz", - "dev": true - }, - "to-fast-properties": { - "version": "1.0.3", - "from": "to-fast-properties@>=1.0.1 <2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz", - "dev": true - }, "to-px": { "version": "1.0.1", "from": "to-px@>=1.0.1 <2.0.0", @@ -6168,12 +2930,6 @@ "from": "topojson-client@>=2.1.0 <3.0.0", "resolved": "https://registry.npmjs.org/topojson-client/-/topojson-client-2.1.0.tgz" }, - "toposort": { - "version": "1.0.3", - "from": "toposort@>=1.0.0 <2.0.0", - "resolved": "https://registry.npmjs.org/toposort/-/toposort-1.0.3.tgz", - "dev": true - }, "tough-cookie": { "version": "2.3.2", "from": "tough-cookie@>=2.3.0 <2.4.0", @@ -6189,35 +2945,11 @@ "from": "triangulate-polyline@>=1.0.0 <2.0.0", "resolved": "https://registry.npmjs.org/triangulate-polyline/-/triangulate-polyline-1.0.3.tgz" }, - "trim-newlines": { - "version": "1.0.0", - "from": "trim-newlines@>=1.0.0 <2.0.0", - "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz", - "dev": true - }, - "trim-right": { - "version": "1.0.1", - "from": "trim-right@>=1.0.1 <2.0.0", - "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz", - "dev": true - }, - "tryit": { - "version": "1.0.3", - "from": "tryit@>=1.0.1 <2.0.0", - "resolved": "https://registry.npmjs.org/tryit/-/tryit-1.0.3.tgz", - "dev": true - }, "tryor": { "version": "0.1.2", "from": "tryor@>=0.1.2 <0.2.0", "resolved": "https://registry.npmjs.org/tryor/-/tryor-0.1.2.tgz" }, - "tty-browserify": { - "version": "0.0.0", - "from": "tty-browserify@0.0.0", - "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz", - "dev": true - }, "tunnel-agent": { "version": "0.4.3", "from": "tunnel-agent@>=0.4.1 <0.5.0", @@ -6249,26 +2981,6 @@ "from": "type-check@>=0.3.2 <0.4.0", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz" }, - "type-is": { - "version": "1.6.15", - "from": "type-is@>=1.6.14 <1.7.0", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.15.tgz", - "dev": true, - "dependencies": { - "mime-db": { - "version": "1.27.0", - "from": "mime-db@~1.27.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.27.0.tgz", - "dev": true - }, - "mime-types": { - "version": "2.1.15", - "from": "mime-types@>=2.1.15 <2.2.0", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.15.tgz", - "dev": true - } - } - }, "typedarray": { "version": "0.0.6", "from": "typedarray@>=0.0.5 <0.1.0", @@ -6306,11 +3018,6 @@ "from": "unassert@>=1.3.1 <2.0.0", "resolved": "https://registry.npmjs.org/unassert/-/unassert-1.5.1.tgz", "dependencies": { - "acorn": { - "version": "4.0.11", - "from": "acorn@>=4.0.0 <5.0.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-4.0.11.tgz" - }, "estraverse": { "version": "4.2.0", "from": "estraverse@>=4.1.0 <5.0.0", @@ -6323,21 +3030,11 @@ "from": "unassertify@>=2.0.0 <3.0.0", "resolved": "https://registry.npmjs.org/unassertify/-/unassertify-2.0.4.tgz", "dependencies": { - "acorn": { - "version": "4.0.11", - "from": "acorn@>=4.0.0 <5.0.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-4.0.11.tgz" - }, "escodegen": { "version": "1.8.1", "from": "escodegen@>=1.6.1 <2.0.0", "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.8.1.tgz" }, - "esprima": { - "version": "2.7.3", - "from": "esprima@>=2.7.1 <3.0.0", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz" - }, "estraverse": { "version": "1.9.3", "from": "estraverse@>=1.9.1 <2.0.0", @@ -6371,124 +3068,16 @@ "from": "uniq@>=1.0.1 <2.0.0", "resolved": "https://registry.npmjs.org/uniq/-/uniq-1.0.1.tgz" }, - "uniqid": { - "version": "4.1.1", - "from": "uniqid@>=4.0.0 <5.0.0", - "resolved": "https://registry.npmjs.org/uniqid/-/uniqid-4.1.1.tgz", - "dev": true - }, - "uniqs": { - "version": "2.0.0", - "from": "uniqs@>=2.0.0 <3.0.0", - "resolved": "https://registry.npmjs.org/uniqs/-/uniqs-2.0.0.tgz", - "dev": true - }, "unitbezier": { "version": "0.0.0", "from": "unitbezier@>=0.0.0 <0.0.1", "resolved": "https://registry.npmjs.org/unitbezier/-/unitbezier-0.0.0.tgz" }, - "unpipe": { - "version": "1.0.0", - "from": "unpipe@>=1.0.0 <1.1.0", - "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "dev": true - }, - "upper-case": { - "version": "1.1.3", - "from": "upper-case@>=1.1.1 <2.0.0", - "resolved": "https://registry.npmjs.org/upper-case/-/upper-case-1.1.3.tgz", - "dev": true - }, - "url": { - "version": "0.11.0", - "from": "url@>=0.11.0 <0.12.0", - "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", - "dev": true, - "dependencies": { - "punycode": { - "version": "1.3.2", - "from": "punycode@1.3.2", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", - "dev": true - } - } - }, - "url-loader": { - "version": "0.5.8", - "from": "url-loader@>=0.5.7 <0.6.0", - "resolved": "https://registry.npmjs.org/url-loader/-/url-loader-0.5.8.tgz", - "dev": true, - "dependencies": { - "loader-utils": { - "version": "1.1.0", - "from": "loader-utils@^1.0.2", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.1.0.tgz", - "dev": true - } - } - }, - "url-parse": { - "version": "1.1.8", - "from": "url-parse@>=1.1.1 <2.0.0", - "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.1.8.tgz", - "dev": true - }, - "user-home": { - "version": "2.0.0", - "from": "user-home@>=2.0.0 <3.0.0", - "resolved": "https://registry.npmjs.org/user-home/-/user-home-2.0.0.tgz", - "dev": true - }, - "util": { - "version": "0.10.3", - "from": "util@>=0.10.3 <0.11.0", - "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", - "dev": true, - "dependencies": { - "inherits": { - "version": "2.0.1", - "from": "inherits@2.0.1", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", - "dev": true - } - } - }, "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" }, - "utila": { - "version": "0.4.0", - "from": "utila@>=0.4.0 <0.5.0", - "resolved": "https://registry.npmjs.org/utila/-/utila-0.4.0.tgz", - "dev": true - }, - "utils-merge": { - "version": "1.0.0", - "from": "utils-merge@1.0.0", - "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.0.tgz", - "dev": true - }, - "uuid": { - "version": "2.0.3", - "from": "uuid@>=2.0.2 <3.0.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-2.0.3.tgz", - "dev": true - }, - "validate-npm-package-license": { - "version": "3.0.1", - "from": "validate-npm-package-license@>=3.0.1 <4.0.0", - "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.1.tgz", - "dev": true - }, - "vary": { - "version": "1.1.1", - "from": "vary@>=1.1.0 <1.2.0", - "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.1.tgz", - "dev": true - }, "vector-tile": { "version": "1.3.0", "from": "vector-tile@>=1.3.0 <2.0.0", @@ -6499,23 +3088,11 @@ "from": "vectorize-text@>=3.0.1 <4.0.0", "resolved": "https://registry.npmjs.org/vectorize-text/-/vectorize-text-3.0.2.tgz" }, - "vendors": { - "version": "1.0.1", - "from": "vendors@>=1.0.0 <2.0.0", - "resolved": "https://registry.npmjs.org/vendors/-/vendors-1.0.1.tgz", - "dev": true - }, "verror": { "version": "1.3.6", "from": "verror@1.3.6", "resolved": "https://registry.npmjs.org/verror/-/verror-1.3.6.tgz" }, - "vm-browserify": { - "version": "0.0.4", - "from": "vm-browserify@0.0.4", - "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-0.0.4.tgz", - "dev": true - }, "vt-pbf": { "version": "2.1.2", "from": "vt-pbf@>=2.0.2 <3.0.0", @@ -6526,20 +3103,6 @@ "from": "w3c-blob@0.0.1", "resolved": "https://registry.npmjs.org/w3c-blob/-/w3c-blob-0.0.1.tgz" }, - "watchpack": { - "version": "0.2.9", - "from": "watchpack@>=0.2.1 <0.3.0", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-0.2.9.tgz", - "dev": true, - "dependencies": { - "async": { - "version": "0.9.2", - "from": "async@>=0.9.0 <0.10.0", - "resolved": "https://registry.npmjs.org/async/-/async-0.9.2.tgz", - "dev": true - } - } - }, "weak-map": { "version": "1.0.5", "from": "weak-map@>=1.0.5 <2.0.0", @@ -6555,96 +3118,6 @@ "from": "webgl-context@>=2.2.0 <3.0.0", "resolved": "https://registry.npmjs.org/webgl-context/-/webgl-context-2.2.0.tgz" }, - "webpack": { - "version": "1.14.0", - "from": "webpack@>=1.13.3 <2.0.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-1.14.0.tgz", - "dev": true, - "dependencies": { - "acorn": { - "version": "3.3.0", - "from": "acorn@>=3.0.0 <4.0.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-3.3.0.tgz", - "dev": true - }, - "interpret": { - "version": "0.6.6", - "from": "interpret@>=0.6.4 <0.7.0", - "resolved": "https://registry.npmjs.org/interpret/-/interpret-0.6.6.tgz", - "dev": true - } - } - }, - "webpack-build-notifier": { - "version": "0.1.13", - "from": "webpack-build-notifier@>=0.1.13 <0.2.0", - "resolved": "https://registry.npmjs.org/webpack-build-notifier/-/webpack-build-notifier-0.1.13.tgz", - "dev": true - }, - "webpack-core": { - "version": "0.6.9", - "from": "webpack-core@>=0.6.9 <0.7.0", - "resolved": "https://registry.npmjs.org/webpack-core/-/webpack-core-0.6.9.tgz", - "dev": true, - "dependencies": { - "source-map": { - "version": "0.4.4", - "from": "source-map@>=0.4.1 <0.5.0", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz", - "dev": true - } - } - }, - "webpack-dev-middleware": { - "version": "1.10.2", - "from": "webpack-dev-middleware@>=1.4.0 <2.0.0", - "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-1.10.2.tgz", - "dev": true, - "dependencies": { - "memory-fs": { - "version": "0.4.1", - "from": "memory-fs@>=0.4.1 <0.5.0", - "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz", - "dev": true - }, - "readable-stream": { - "version": "2.2.9", - "from": "readable-stream@>=2.0.1 <3.0.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.2.9.tgz", - "dev": true - }, - "string_decoder": { - "version": "1.0.0", - "from": "string_decoder@~1.0.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.0.tgz", - "dev": true - } - } - }, - "webpack-dev-server": { - "version": "1.16.3", - "from": "webpack-dev-server@>=1.16.2 <2.0.0", - "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-1.16.3.tgz", - "dev": true - }, - "webpack-sources": { - "version": "0.1.5", - "from": "webpack-sources@>=0.1.0 <0.2.0", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-0.1.5.tgz", - "dev": true - }, - "websocket-driver": { - "version": "0.6.5", - "from": "websocket-driver@>=0.5.1", - "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.6.5.tgz", - "dev": true - }, - "websocket-extensions": { - "version": "0.1.1", - "from": "websocket-extensions@>=0.1.1", - "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.1.tgz", - "dev": true - }, "webworkify": { "version": "1.4.0", "from": "webworkify@>=1.3.0 <2.0.0", @@ -6655,35 +3128,11 @@ "from": "wgs84@0.0.0", "resolved": "https://registry.npmjs.org/wgs84/-/wgs84-0.0.0.tgz" }, - "whet.extend": { - "version": "0.9.9", - "from": "whet.extend@>=0.9.9 <0.10.0", - "resolved": "https://registry.npmjs.org/whet.extend/-/whet.extend-0.9.9.tgz", - "dev": true - }, - "which": { - "version": "1.2.14", - "from": "which@>=1.2.9 <2.0.0", - "resolved": "https://registry.npmjs.org/which/-/which-1.2.14.tgz", - "dev": true - }, - "which-module": { - "version": "1.0.0", - "from": "which-module@>=1.0.0 <2.0.0", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-1.0.0.tgz", - "dev": true - }, "whoots-js": { "version": "2.1.0", "from": "whoots-js@>=2.0.0 <3.0.0", "resolved": "https://registry.npmjs.org/whoots-js/-/whoots-js-2.1.0.tgz" }, - "wide-align": { - "version": "1.1.0", - "from": "wide-align@>=1.1.0 <2.0.0", - "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.0.tgz", - "dev": true - }, "window-size": { "version": "0.1.0", "from": "window-size@0.1.0", @@ -6699,65 +3148,21 @@ "from": "world-calendars@>=1.0.3 <2.0.0", "resolved": "https://registry.npmjs.org/world-calendars/-/world-calendars-1.0.3.tgz" }, - "wrap-ansi": { - "version": "2.1.0", - "from": "wrap-ansi@>=2.0.0 <3.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", - "dev": true - }, "wrappy": { "version": "1.0.2", "from": "wrappy@>=1.0.0 <2.0.0", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz" }, - "write": { - "version": "0.2.1", - "from": "write@>=0.2.1 <0.3.0", - "resolved": "https://registry.npmjs.org/write/-/write-0.2.1.tgz", - "dev": true - }, - "xml-char-classes": { - "version": "1.0.0", - "from": "xml-char-classes@>=1.0.0 <2.0.0", - "resolved": "https://registry.npmjs.org/xml-char-classes/-/xml-char-classes-1.0.0.tgz", - "dev": true - }, "xtend": { "version": "4.0.1", "from": "xtend@>=4.0.0 <5.0.0", "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz" }, - "y18n": { - "version": "3.2.1", - "from": "y18n@>=3.2.1 <4.0.0", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz", - "dev": true - }, - "yallist": { - "version": "2.1.2", - "from": "yallist@>=2.0.0 <3.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", - "dev": true - }, "yargs": { "version": "3.10.0", "from": "yargs@>=3.10.0 <3.11.0", "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz" }, - "yargs-parser": { - "version": "4.2.1", - "from": "yargs-parser@>=4.2.0 <5.0.0", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-4.2.1.tgz", - "dev": true, - "dependencies": { - "camelcase": { - "version": "3.0.0", - "from": "camelcase@>=3.0.0 <4.0.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", - "dev": true - } - } - }, "zero-crossings": { "version": "1.0.1", "from": "zero-crossings@>=1.0.0 <2.0.0", From 48322856d9fa1982429744be8c3e3b658f3e2ce8 Mon Sep 17 00:00:00 2001 From: Vladislav Denisov Date: Wed, 3 May 2017 08:52:51 +0300 Subject: [PATCH 108/112] jql: maxResults fix --- redash/query_runner/jql.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/redash/query_runner/jql.py b/redash/query_runner/jql.py index 599e6993..c20710e5 100644 --- a/redash/query_runner/jql.py +++ b/redash/query_runner/jql.py @@ -54,7 +54,7 @@ def parse_issue(issue, field_mapping): if 'watchCount' in v: result[output_name] = v['watchCount'] - + elif isinstance(v, list): if len(member_names) > 0: # if field mapping with dict member mappings defined get value of each member @@ -104,7 +104,7 @@ class FieldMapping: for k, v in query_field_mapping.iteritems(): field_name = k member_name = None - + # check for member name contained in field name member_parser = re.search('(\w+)\.(\w+)', k) if (member_parser): @@ -181,10 +181,10 @@ class JiraJQL(BaseQueryRunner): field_mapping = FieldMapping(query.pop('fieldMapping', {})) if query_type == 'count': - query['maxResults'] = 1 + query['maxResults'] = query.get('maxResults', 1) query['fields'] = '' else: - query['maxResults'] = 1000 + query['maxResults'] = query.get('maxResults', 1000) response = requests.get(jql_url, params=query, auth=(self.configuration.get('username'), self.configuration.get('password'))) From a1a0d766fe1d56d2388f483cf79a9c970782793f Mon Sep 17 00:00:00 2001 From: Yohei Susa Date: Wed, 3 May 2017 22:17:59 +0900 Subject: [PATCH 109/112] Add environment variable for switching query annotations of Athena to disable --- redash/query_runner/athena.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/redash/query_runner/athena.py b/redash/query_runner/athena.py index eda3c5ef..23339446 100644 --- a/redash/query_runner/athena.py +++ b/redash/query_runner/athena.py @@ -4,8 +4,10 @@ import os import requests from redash.query_runner import BaseQueryRunner, register +from redash.settings import parse_boolean PROXY_URL = os.environ.get('ATHENA_PROXY_URL') +ANNOTATE_QUERY = parse_boolean(os.environ.get('ATHENA_ANNOTATE_QUERY', 'true')) class Athena(BaseQueryRunner): noop_query = 'SELECT 1' @@ -42,7 +44,7 @@ class Athena(BaseQueryRunner): @classmethod def annotate_query(cls): - return False + return ANNOTATE_QUERY def get_schema(self, get_stats=False): schema = {} From 75ebbe148b66e94d7893efa4515d488946822f71 Mon Sep 17 00:00:00 2001 From: Frank Bertsch Date: Wed, 2 Nov 2016 14:42:28 -0500 Subject: [PATCH 110/112] Add presto query cancellation --- redash/query_runner/presto.py | 6 +++++- requirements_all_ds.txt | 2 +- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/redash/query_runner/presto.py b/redash/query_runner/presto.py index 715fe6e4..7e68ed12 100644 --- a/redash/query_runner/presto.py +++ b/redash/query_runner/presto.py @@ -118,7 +118,11 @@ class Presto(BaseQueryRunner): default_message = 'Unspecified DatabaseError: {0}'.format(db.message) message = db.message.get('failureInfo', {'message', None}).get('message') error = default_message if message is None else message - except Exception, ex: + except (KeyboardInterrupt, InterruptException) as e: + cursor.cancel() + error = "Query cancelled by user." + json_data = None + except Exception as ex: json_data = None error = ex.message if not isinstance(error, basestring): diff --git a/requirements_all_ds.txt b/requirements_all_ds.txt index f572273b..03f22068 100644 --- a/requirements_all_ds.txt +++ b/requirements_all_ds.txt @@ -4,7 +4,7 @@ impyla==0.10.0 influxdb==2.7.1 MySQL-python==1.2.5 oauth2client==3.0.0 -pyhive==0.1.6 +pyhive==0.3.0 pymongo==3.2.1 pyOpenSSL==0.14 vertica-python==0.5.1 From ea7c6c2be3aaa4ba02fa6e11496ed56e1eb2bdb5 Mon Sep 17 00:00:00 2001 From: Vladislav Denisov Date: Fri, 5 May 2017 09:26:09 +0300 Subject: [PATCH 111/112] jql: fixed maxResults in count query --- redash/query_runner/jql.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/redash/query_runner/jql.py b/redash/query_runner/jql.py index c20710e5..37b1f345 100644 --- a/redash/query_runner/jql.py +++ b/redash/query_runner/jql.py @@ -181,7 +181,7 @@ class JiraJQL(BaseQueryRunner): field_mapping = FieldMapping(query.pop('fieldMapping', {})) if query_type == 'count': - query['maxResults'] = query.get('maxResults', 1) + query['maxResults'] = 1 query['fields'] = '' else: query['maxResults'] = query.get('maxResults', 1000) From 914977f279dec85fb90cc32b9cad4bc7b9a3fee9 Mon Sep 17 00:00:00 2001 From: Arik Fraimovich Date: Sun, 7 May 2017 12:35:23 +0300 Subject: [PATCH 112/112] Fix: properties of data source were not reset when changing type. Fixes #1748. --- client/app/components/dynamic-form.js | 57 ++++++++++++++++----------- 1 file changed, 34 insertions(+), 23 deletions(-) diff --git a/client/app/components/dynamic-form.js b/client/app/components/dynamic-form.js index dc0122d5..3d87f630 100644 --- a/client/app/components/dynamic-form.js +++ b/client/app/components/dynamic-form.js @@ -35,9 +35,13 @@ function DynamicForm($http, toastr, $q) { const type = find(types, t => t.type === $scope.target.type); const configurationSchema = type.configuration_schema; - $scope.type = type; - $scope.fields = orderedInputs(configurationSchema.properties, - configurationSchema.order || []); + + $scope.fields = orderedInputs( + configurationSchema.properties, + configurationSchema.order || [] + ); + + return type; } $scope.inProgressActions = {}; @@ -99,30 +103,37 @@ function DynamicForm($http, toastr, $q) { prop.required = contains(type.configuration_schema.required, name); }); }); + + $scope.$watch('target.type', (current, prev) => { + if (prev !== current) { + if (prev !== undefined) { + $scope.target.options = {}; + } + + const type = setType($scope.types); + + if (Object.keys($scope.target.options).length === 0) { + const properties = type.configuration_schema.properties; + Object.keys(properties).forEach((property) => { + $scope.target.options[property] = + properties[property].default || ''; + }); + } + } + }); }); - $scope.$watch('target.type', (current, prev) => { - if (prev !== current) { - if (prev !== undefined) { - $scope.target.options = {}; - } - if (Object.keys($scope.target.options).length === 0) { - const properties = $scope.type.configuration_schema.properties; - Object.keys(properties).forEach((property) => { - $scope.target.options[property] = properties[property].default || ''; - }); - } - setType($scope.types); - } - }); $scope.saveChanges = () => { - $scope.target.$save(() => { - toastr.success('Saved.'); - $scope.dataSourceForm.$setPristine(); - }, () => { - toastr.error('Failed saving.'); - }); + $scope.target.$save( + () => { + toastr.success('Saved.'); + $scope.dataSourceForm.$setPristine(); + }, + () => { + toastr.error('Failed saving.'); + } + ); }; }, };