diff --git a/CHANGELOG.md b/CHANGELOG.md index 3b599889e7..c0ee5f7b03 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,7 @@ # Change Log +## v5.0.0-Beta - UNRELEASED + ## v4.0.1 - 2018-05-02 ### Added diff --git a/client/.babelrc b/client/.babelrc index a6ae74fe1d..78a71f6368 100644 --- a/client/.babelrc +++ b/client/.babelrc @@ -5,6 +5,10 @@ "transform-object-assign", ["babel-plugin-transform-builtin-extend", { "globals": ["Error"] + }], + ["import", { + "libraryName": "antd", + "style": true }] ] } diff --git a/client/app/components/DateInput.jsx b/client/app/components/DateInput.jsx new file mode 100644 index 0000000000..24a5537490 --- /dev/null +++ b/client/app/components/DateInput.jsx @@ -0,0 +1,37 @@ +import moment from 'moment'; +import React from 'react'; +import PropTypes from 'prop-types'; +import { react2angular } from 'react2angular'; +import { DatePicker } from 'antd'; + +function DateInput({ + value, + onSelect, + clientConfig, +}) { + const format = clientConfig.dateFormat || 'YYYY-MM-DD'; + const defaultValue = moment(value, format); + return ( + + ); +} + +DateInput.propTypes = { + value: PropTypes.instanceOf(Date), + onSelect: PropTypes.func, +}; + +DateInput.defaultProps = { + value: Date.now(), + onSelect: () => {}, +}; + +export default function init(ngModule) { + ngModule.component('dateInput', react2angular(DateInput, null, ['clientConfig'])); +} + diff --git a/client/app/components/DateTimeInput.jsx b/client/app/components/DateTimeInput.jsx new file mode 100644 index 0000000000..029fa84e94 --- /dev/null +++ b/client/app/components/DateTimeInput.jsx @@ -0,0 +1,42 @@ +import moment from 'moment'; +import React from 'react'; +import PropTypes from 'prop-types'; +import { react2angular } from 'react2angular'; +import { DatePicker } from 'antd'; + +function DateTimeInput({ + value, + withSeconds, + onSelect, + clientConfig, +}) { + const format = (clientConfig.dateFormat || 'YYYY-MM-DD') + + (withSeconds ? ' HH:mm:ss' : ' HH:mm'); + const defaultValue = moment(value, format); + return ( + + ); +} + +DateTimeInput.propTypes = { + value: PropTypes.instanceOf(Date), + withSeconds: PropTypes.bool, + onSelect: PropTypes.func, +}; + +DateTimeInput.defaultProps = { + value: Date.now(), + withSeconds: false, + onSelect: () => {}, +}; + +export default function init(ngModule) { + ngModule.component('dateTimeInput', react2angular(DateTimeInput, null, ['clientConfig'])); +} + diff --git a/client/app/components/parameters.html b/client/app/components/parameters.html index d628d9ec09..05b442d81c 100644 --- a/client/app/components/parameters.html +++ b/client/app/components/parameters.html @@ -11,9 +11,12 @@ - - - + + + {{option}} diff --git a/client/app/components/queries/query-editor.js b/client/app/components/queries/query-editor.js index 670badc8df..951a90bc97 100644 --- a/client/app/components/queries/query-editor.js +++ b/client/app/components/queries/query-editor.js @@ -3,6 +3,7 @@ import 'brace/mode/python'; import 'brace/mode/sql'; import 'brace/mode/json'; import 'brace/ext/language_tools'; +import 'brace/ext/searchbox'; import { map } from 'lodash'; // By default Ace will try to load snippet files for the different modes and fail. diff --git a/client/app/pages/admin/status/status.html b/client/app/pages/admin/status/status.html index 18951f30a9..99435059d2 100644 --- a/client/app/pages/admin/status/status.html +++ b/client/app/pages/admin/status/status.html @@ -4,9 +4,15 @@ - System Status - Queries Queue - Outdated Queries + + System Status + + + Queries Queue + + + Outdated Queries + @@ -39,12 +45,14 @@ Queues {{value.size}} - {{name}} + {{name}} + + + - - + Redash Database @@ -54,4 +62,4 @@ - + \ No newline at end of file diff --git a/client/app/pages/queries/query.html b/client/app/pages/queries/query.html index 86aa3030b9..40ca162978 100644 --- a/client/app/pages/queries/query.html +++ b/client/app/pages/queries/query.html @@ -216,14 +216,18 @@ Cancel + + Loading results… + + Query in queue… Cancel - Error running query: - {{queryResult.getError()}} + + Error running query: {{queryResult.getError()}} @@ -318,4 +322,4 @@ - \ No newline at end of file + diff --git a/client/app/services/query-result.js b/client/app/services/query-result.js index a89cc6537a..485e72359c 100644 --- a/client/app/services/query-result.js +++ b/client/app/services/query-result.js @@ -73,6 +73,9 @@ function QueryResultService($resource, $timeout, $q) { this.updatedAt = moment(); + // exteded status flags + this.isLoadingResult = false; + if (props) { this.update(props); } @@ -148,6 +151,9 @@ function QueryResultService($resource, $timeout, $q) { } getStatus() { + if (this.isLoadingResult) { + return 'loading-result'; + } return this.status || statuses[this.job.status]; } @@ -335,7 +341,6 @@ function QueryResultService($resource, $timeout, $q) { return this.columnNames; } - getColumnCleanNames() { return this.getColumnNames().map(col => getColumnCleanName(col)); } @@ -414,18 +419,32 @@ function QueryResultService($resource, $timeout, $q) { static getById(id) { const queryResult = new QueryResult(); + queryResult.isLoadingResult = true; QueryResultResource.get({ id }, (response) => { + // Success handler + queryResult.isLoadingResult = false; queryResult.update(response); + }, (response) => { + // Error handler + queryResult.isLoadingResult = false; + queryResult.update({ + job: { + error: response.data.message, + status: 4, + }, + }); }); return queryResult; } loadResult(tryCount) { + this.isLoadingResult = true; QueryResultResource.get( { id: this.job.query_result_id }, (response) => { this.update(response); + this.isLoadingResult = false; }, (error) => { if (tryCount === undefined) { @@ -440,6 +459,7 @@ function QueryResultService($resource, $timeout, $q) { status: 4, }, }); + this.isLoadingResult = false; } else { $timeout(() => { this.loadResult(tryCount + 1); @@ -508,7 +528,6 @@ function QueryResultService($resource, $timeout, $q) { } } - return QueryResult; } diff --git a/client/app/services/query.js b/client/app/services/query.js index 09e9d7ec5b..865ee278af 100644 --- a/client/app/services/query.js +++ b/client/app/services/query.js @@ -1,17 +1,7 @@ import moment from 'moment'; import debug from 'debug'; import Mustache from 'mustache'; -import { - each, - zipObject, - isEmpty, - map, - filter, - includes, - union, - uniq, - has, -} from 'lodash'; +import { each, zipObject, isEmpty, map, filter, includes, union, uniq, has } from 'lodash'; const logger = debug('redash:services:query'); @@ -38,14 +28,16 @@ class Parameter { this.global = parameter.global; this.enumOptions = parameter.enumOptions; this.queryId = parameter.queryId; + + // method to update parameter value from date/time picker component + // (react does not support two-way binding with `ngModel`) + this.updateValue = (value) => { + this.ngModel = value; + }; } get ngModel() { - if ( - this.type === 'date' || - this.type === 'datetime-local' || - this.type === 'datetime-with-seconds' - ) { + 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') { @@ -120,9 +112,7 @@ class Parameters { }); const parameterExists = p => includes(parameterNames, p.name); - this.query.options.parameters = this.query.options.parameters - .filter(parameterExists) - .map(p => new Parameter(p)); + this.query.options.parameters = this.query.options.parameters.filter(parameterExists).map(p => new Parameter(p)); } initFromQueryString(queryString) { @@ -140,10 +130,7 @@ class Parameters { } getMissing() { - return map( - filter(this.get(), p => p.value === null || p.value === ''), - i => i.title, - ); + return map(filter(this.get(), p => p.value === null || p.value === ''), i => i.title); } isRequired() { @@ -156,14 +143,7 @@ class Parameters { } } -function QueryResource( - $resource, - $http, - $q, - $location, - currentUser, - QueryResult, -) { +function QueryResource($resource, $http, $q, $location, currentUser, QueryResult) { class QueryResultError { constructor(errorMessage) { this.errorMessage = errorMessage; @@ -239,6 +219,12 @@ function QueryResource( url: 'api/queries/:id/favorite', transformRequest: [() => ''], // body not needed }, + // This can be removed once #2686 is merged: + search: { + method: 'get', + isArray: true, + url: 'api/queries/search', + }, }, ); @@ -261,9 +247,7 @@ function QueryResource( return $q.reject(String(err)); } } else if (syntax === 'sql') { - return $http - .post('api/queries/format', { query }) - .then(response => response.data.query); + return $http.post('api/queries/format', { query }).then(response => response.data.query); } else { return $q.reject('Query formatting is not supported for your data source syntax.'); } @@ -343,12 +327,7 @@ function QueryResource( this.queryResult = QueryResult.getById(this.latest_query_data_id); } } else if (this.data_source_id) { - this.queryResult = QueryResult.get( - this.data_source_id, - queryText, - maxAge, - this.id, - ); + this.queryResult = QueryResult.get(this.data_source_id, queryText, maxAge, this.id); } else { return new QueryResultError('Please select data source to run this query.'); } diff --git a/package-lock.json b/package-lock.json index 315b7874c4..c8fd8fc639 100644 --- a/package-lock.json +++ b/package-lock.json @@ -82,6 +82,41 @@ "@babel/types": "7.0.0-beta.44" } }, + "@babel/helper-module-imports": { + "version": "7.0.0-beta.54", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.0.0-beta.54.tgz", + "integrity": "sha1-wtjhT/A0Ilv0MTVtt370Z7jTWqw=", + "dev": true, + "requires": { + "@babel/types": "7.0.0-beta.54", + "lodash": "^4.17.5" + }, + "dependencies": { + "@babel/types": { + "version": "7.0.0-beta.54", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.0.0-beta.54.tgz", + "integrity": "sha1-AlrWhJL+1ULBPxTFeaRMhI5TEGM=", + "dev": true, + "requires": { + "esutils": "^2.0.2", + "lodash": "^4.17.5", + "to-fast-properties": "^2.0.0" + } + }, + "esutils": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", + "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=", + "dev": true + }, + "to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", + "dev": true + } + } + }, "@babel/helper-split-export-declaration": { "version": "7.0.0-beta.44", "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.0.0-beta.44.tgz", @@ -346,6 +381,14 @@ } } }, + "add-dom-event-listener": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/add-dom-event-listener/-/add-dom-event-listener-1.0.2.tgz", + "integrity": "sha1-j67SxBAIchzxEdodMNmVuFvkK+0=", + "requires": { + "object-assign": "4.x" + } + }, "add-line-numbers": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/add-line-numbers/-/add-line-numbers-1.0.1.tgz", @@ -515,6 +558,61 @@ "integrity": "sha1-vgiVmQl7dKXJxKhKDNvNtivYeu8=", "dev": true }, + "antd": { + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/antd/-/antd-3.7.1.tgz", + "integrity": "sha512-lQDOtrEo6KJsx44s/cOdJEcYnNqjRQtTYb7ch0ajPzM6tFMOMydDaxASekQrUmKdKVTOlYfM0XGBqCr9n7r1yQ==", + "requires": { + "array-tree-filter": "^2.0.0", + "babel-runtime": "6.x", + "classnames": "~2.2.0", + "create-react-class": "^15.6.0", + "create-react-context": "^0.2.2", + "css-animation": "^1.2.5", + "dom-closest": "^0.2.0", + "enquire.js": "^2.1.1", + "intersperse": "^1.0.0", + "lodash": "^4.17.5", + "moment": "^2.19.3", + "omit.js": "^1.0.0", + "prop-types": "^15.5.7", + "raf": "^3.4.0", + "rc-animate": "^2.4.1", + "rc-calendar": "~9.6.0", + "rc-cascader": "~0.14.0", + "rc-checkbox": "~2.1.5", + "rc-collapse": "~1.9.0", + "rc-dialog": "~7.1.0", + "rc-drawer": "~1.5.9", + "rc-dropdown": "~2.2.0", + "rc-editor-mention": "^1.0.2", + "rc-form": "^2.1.0", + "rc-input-number": "~4.0.0", + "rc-menu": "~7.0.2", + "rc-notification": "~3.1.1", + "rc-pagination": "~1.16.1", + "rc-progress": "~2.2.2", + "rc-rate": "~2.4.0", + "rc-select": "~8.0.7", + "rc-slider": "~8.6.0", + "rc-steps": "~3.1.0", + "rc-switch": "~1.6.0", + "rc-table": "~6.2.2", + "rc-tabs": "~9.2.0", + "rc-time-picker": "~3.3.0", + "rc-tooltip": "~3.7.0", + "rc-tree": "~1.12.0", + "rc-tree-select": "~2.0.5", + "rc-trigger": "^2.5.4", + "rc-upload": "~2.5.0", + "rc-util": "^4.0.4", + "react-lazy-load": "^3.0.12", + "react-lifecycles-compat": "^3.0.2", + "react-slick": "~0.23.1", + "shallowequal": "^1.0.1", + "warning": "~4.0.1" + } + }, "anymatch": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-1.3.2.tgz", @@ -622,6 +720,11 @@ "array-bounds": "^1.0.0" } }, + "array-tree-filter": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-tree-filter/-/array-tree-filter-2.1.0.tgz", + "integrity": "sha512-4ROwICNlNw/Hqa9v+rk5h22KjmzB1JGTMVKP2AKJBOCgb0yL0ASf0+YvCcLNNwquOHNX48jkeZIJ3a+oOQqKcw==" + }, "array-union": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", @@ -711,6 +814,14 @@ "integrity": "sha512-jp/uFnooOiO+L211eZOoSyzpOITMXx1rBITauYykG3BRYPu8h0UcxsPNB04RR5vo4Tyz3+ay17tR6JVf9qzYWg==", "dev": true }, + "async-validator": { + "version": "1.8.4", + "resolved": "https://registry.npmjs.org/async-validator/-/async-validator-1.8.4.tgz", + "integrity": "sha512-9M6Q6Q3iqFKSdyhliLG8gUH9E73p/TQU1XNH/qiybX5eFIgwB++IIZ/wcPM1f+x9WeqemxGkm0CCx69Mkx3EEg==", + "requires": { + "babel-runtime": "6.x" + } + }, "asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", @@ -1108,6 +1219,15 @@ "babel-runtime": "^6.22.0" } }, + "babel-plugin-import": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/babel-plugin-import/-/babel-plugin-import-1.8.0.tgz", + "integrity": "sha512-5Aw8aZnJPuhJdumK6mS2ZRlfmGaBIKm/h6dw5uS0bkRMTqwHespRG3NeN9x9TB4W38I16ZXGGlHHz+8Gt5/shQ==", + "dev": true, + "requires": { + "@babel/helper-module-imports": "^7.0.0-beta.34" + } + }, "babel-plugin-syntax-async-functions": { "version": "6.13.0", "resolved": "https://registry.npmjs.org/babel-plugin-syntax-async-functions/-/babel-plugin-syntax-async-functions-6.13.0.tgz", @@ -2512,6 +2632,11 @@ } } }, + "classnames": { + "version": "2.2.6", + "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.2.6.tgz", + "integrity": "sha512-JR/iSQOSt+LQIWwrwEzJ9uk0xfN3mTVYMwt1Ir5mUcSN6pU+V4zQFFaJsclJbPuAUQH+yfWef6tm7l1quW3C8Q==" + }, "clean-css": { "version": "4.1.9", "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-4.1.9.tgz", @@ -2767,6 +2892,19 @@ "compare-cell": "^1.0.0" } }, + "component-classes": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/component-classes/-/component-classes-1.2.6.tgz", + "integrity": "sha1-xkI5TDYYpNiwuJGe/Mu9kw5c1pE=", + "requires": { + "component-indexof": "0.0.3" + } + }, + "component-indexof": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/component-indexof/-/component-indexof-0.0.3.tgz", + "integrity": "sha1-EdCRMSI5648yyPJa6csAL/6NPCQ=" + }, "compressible": { "version": "2.0.11", "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.11.tgz", @@ -3047,6 +3185,25 @@ "sha.js": "^2.4.8" } }, + "create-react-class": { + "version": "15.6.3", + "resolved": "https://registry.npmjs.org/create-react-class/-/create-react-class-15.6.3.tgz", + "integrity": "sha512-M+/3Q6E6DLO6Yx3OwrWjwHBnvfXXYA7W+dFjt/ZDBemHO1DDZhsalX/NUtnTYclN6GfnBDRh4qRHjcDHmlJBJg==", + "requires": { + "fbjs": "^0.8.9", + "loose-envify": "^1.3.1", + "object-assign": "^4.1.1" + } + }, + "create-react-context": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/create-react-context/-/create-react-context-0.2.2.tgz", + "integrity": "sha512-KkpaLARMhsTsgp0d2NA/R94F/eDLbhXERdIq3LvX2biCAXcDvHYoOqHfWCHf1+OLj+HKBotLG3KqaOOf+C1C+A==", + "requires": { + "fbjs": "^0.8.0", + "gud": "^1.0.0" + } + }, "cross-spawn": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", @@ -3094,6 +3251,15 @@ "randombytes": "^2.0.0" } }, + "css-animation": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/css-animation/-/css-animation-1.4.1.tgz", + "integrity": "sha1-W4gTEl3g+7uwu+G0cq6EIhRpt6g=", + "requires": { + "babel-runtime": "6.x", + "component-classes": "^1.2.5" + } + }, "css-color-names": { "version": "0.0.4", "resolved": "https://registry.npmjs.org/css-color-names/-/css-color-names-0.0.4.tgz", @@ -3560,6 +3726,19 @@ } } }, + "dom-align": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/dom-align/-/dom-align-1.8.0.tgz", + "integrity": "sha512-B85D4ef2Gj5lw0rK0KM2+D5/pH7yqNxg2mB+E8uzFaolpm7RQmsxEfjyEuNiF8UBBkffumYDeKRzTzc3LePP+w==" + }, + "dom-closest": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/dom-closest/-/dom-closest-0.2.0.tgz", + "integrity": "sha1-69n5HRvyLo1vR3h2u80+yQIWwM8=", + "requires": { + "dom-matches": ">=1.0.1" + } + }, "dom-converter": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/dom-converter/-/dom-converter-0.1.4.tgz", @@ -3577,6 +3756,16 @@ } } }, + "dom-matches": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/dom-matches/-/dom-matches-2.0.0.tgz", + "integrity": "sha1-0nKLQWqHUzmA6wibhI0lPPI6dYw=" + }, + "dom-scroll-into-view": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/dom-scroll-into-view/-/dom-scroll-into-view-1.2.1.tgz", + "integrity": "sha1-6PNnMt0ImwIBqI14Fdw/iObWbH4=" + }, "dom-serializer": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.1.0.tgz", @@ -3631,6 +3820,16 @@ "resolved": "https://registry.npmjs.org/double-bits/-/double-bits-1.1.1.tgz", "integrity": "sha1-WKu6RUlNpND6Nrc60RoobJGEscY=" }, + "draft-js": { + "version": "0.10.5", + "resolved": "https://registry.npmjs.org/draft-js/-/draft-js-0.10.5.tgz", + "integrity": "sha512-LE6jSCV9nkPhfVX2ggcRLA4FKs6zWq9ceuO/88BpXdNCS7mjRTgs0NsV6piUCJX9YxMsB9An33wnkMmU2sD2Zg==", + "requires": { + "fbjs": "^0.8.15", + "immutable": "~3.7.4", + "object-assign": "^4.1.0" + } + }, "dup": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/dup/-/dup-1.0.0.tgz", @@ -3804,6 +4003,11 @@ "tapable": "^0.2.7" } }, + "enquire.js": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/enquire.js/-/enquire.js-2.1.6.tgz", + "integrity": "sha1-PoeAybi4NQhMP2DhZtvDwqPImBQ=" + }, "entities": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.1.tgz", @@ -4557,6 +4761,11 @@ "integrity": "sha1-HIaZHYFq0eUEdQ5zh0Ik7PO+xQg=", "dev": true }, + "eventlistener": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/eventlistener/-/eventlistener-0.0.1.tgz", + "integrity": "sha1-7Suqu4UiJ68rz4iRUscsY8pTLrg=" + }, "events": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/events/-/events-1.1.1.tgz", @@ -5119,292 +5328,111 @@ "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" }, "fsevents": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.1.3.tgz", - "integrity": "sha512-WIr7iDkdmdbxu/Gh6eKEZJL6KPE74/5MEsf2whTOFNxbIoIixogroLdKYqB6FDav4Wavh/lZdzzd3b2KxIXC5Q==", - "dev": true, + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.4.tgz", + "integrity": "sha512-z8H8/diyk76B7q5wg+Ud0+CqzcAF3mBBI/bA5ne5zrRUUIvNkJY//D3BqyH571KuAC4Nr7Rw7CjWX4r0y9DvNg==", "optional": true, "requires": { - "nan": "^2.3.0", - "node-pre-gyp": "^0.6.39" + "nan": "^2.9.2", + "node-pre-gyp": "^0.10.0" }, "dependencies": { "abbrev": { - "version": "1.1.0", + "version": "1.1.1", "bundled": true, - "dev": true, "optional": true }, - "ajv": { - "version": "4.11.8", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "co": "^4.6.0", - "json-stable-stringify": "^1.0.1" - } - }, "ansi-regex": { "version": "2.1.1", - "bundled": true, - "dev": true + "bundled": true }, "aproba": { - "version": "1.1.1", + "version": "1.2.0", "bundled": true, - "dev": true, "optional": true }, "are-we-there-yet": { "version": "1.1.4", "bundled": true, - "dev": true, "optional": true, "requires": { "delegates": "^1.0.0", "readable-stream": "^2.0.6" } }, - "asn1": { - "version": "0.2.3", - "bundled": true, - "dev": true, - "optional": true - }, - "assert-plus": { - "version": "0.2.0", - "bundled": true, - "dev": true, - "optional": true - }, - "asynckit": { - "version": "0.4.0", - "bundled": true, - "dev": true, - "optional": true - }, - "aws-sign2": { - "version": "0.6.0", - "bundled": true, - "dev": true, - "optional": true - }, - "aws4": { - "version": "1.6.0", - "bundled": true, - "dev": true, - "optional": true - }, "balanced-match": { - "version": "0.4.2", - "bundled": true, - "dev": true - }, - "bcrypt-pbkdf": { - "version": "1.0.1", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "tweetnacl": "^0.14.3" - } - }, - "block-stream": { - "version": "0.0.9", - "bundled": true, - "dev": true, - "requires": { - "inherits": "~2.0.0" - } - }, - "boom": { - "version": "2.10.1", - "bundled": true, - "dev": true, - "requires": { - "hoek": "2.x.x" - } + "version": "1.0.0", + "bundled": true }, "brace-expansion": { - "version": "1.1.7", + "version": "1.1.11", "bundled": true, - "dev": true, "requires": { - "balanced-match": "^0.4.1", + "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, - "buffer-shims": { - "version": "1.0.0", - "bundled": true, - "dev": true - }, - "caseless": { - "version": "0.12.0", - "bundled": true, - "dev": true, - "optional": true - }, - "co": { - "version": "4.6.0", + "chownr": { + "version": "1.0.1", "bundled": true, - "dev": true, "optional": true }, "code-point-at": { "version": "1.1.0", - "bundled": true, - "dev": true - }, - "combined-stream": { - "version": "1.0.5", - "bundled": true, - "dev": true, - "requires": { - "delayed-stream": "~1.0.0" - } + "bundled": true }, "concat-map": { "version": "0.0.1", - "bundled": true, - "dev": true + "bundled": true }, "console-control-strings": { "version": "1.1.0", - "bundled": true, - "dev": true + "bundled": true }, "core-util-is": { "version": "1.0.2", "bundled": true, - "dev": true - }, - "cryptiles": { - "version": "2.0.5", - "bundled": true, - "dev": true, - "requires": { - "boom": "2.x.x" - } - }, - "dashdash": { - "version": "1.14.1", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "assert-plus": "^1.0.0" - }, - "dependencies": { - "assert-plus": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "optional": true - } - } + "optional": true }, "debug": { - "version": "2.6.8", + "version": "2.6.9", "bundled": true, - "dev": true, "optional": true, "requires": { "ms": "2.0.0" } }, "deep-extend": { - "version": "0.4.2", + "version": "0.5.1", "bundled": true, - "dev": true, "optional": true }, - "delayed-stream": { - "version": "1.0.0", - "bundled": true, - "dev": true - }, "delegates": { "version": "1.0.0", "bundled": true, - "dev": true, "optional": true }, "detect-libc": { - "version": "1.0.2", - "bundled": true, - "dev": true, - "optional": true - }, - "ecc-jsbn": { - "version": "0.1.1", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "jsbn": "~0.1.0" - } - }, - "extend": { - "version": "3.0.1", - "bundled": true, - "dev": true, - "optional": true - }, - "extsprintf": { - "version": "1.0.2", - "bundled": true, - "dev": true - }, - "forever-agent": { - "version": "0.6.1", + "version": "1.0.3", "bundled": true, - "dev": true, "optional": true }, - "form-data": { - "version": "2.1.4", + "fs-minipass": { + "version": "1.2.5", "bundled": true, - "dev": true, "optional": true, "requires": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.5", - "mime-types": "^2.1.12" + "minipass": "^2.2.1" } }, "fs.realpath": { "version": "1.0.0", "bundled": true, - "dev": true - }, - "fstream": { - "version": "1.0.11", - "bundled": true, - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "inherits": "~2.0.0", - "mkdirp": ">=0.5 0", - "rimraf": "2" - } - }, - "fstream-ignore": { - "version": "1.0.5", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "fstream": "^1.0.0", - "inherits": "2", - "minimatch": "^3.0.0" - } + "optional": true }, "gauge": { "version": "2.7.4", "bundled": true, - "dev": true, "optional": true, "requires": { "aproba": "^1.0.3", @@ -5417,27 +5445,10 @@ "wide-align": "^1.1.0" } }, - "getpass": { - "version": "0.1.7", + "glob": { + "version": "7.1.2", "bundled": true, - "dev": true, "optional": true, - "requires": { - "assert-plus": "^1.0.0" - }, - "dependencies": { - "assert-plus": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "optional": true - } - } - }, - "glob": { - "version": "7.1.2", - "bundled": true, - "dev": true, "requires": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -5447,64 +5458,31 @@ "path-is-absolute": "^1.0.0" } }, - "graceful-fs": { - "version": "4.1.11", - "bundled": true, - "dev": true - }, - "har-schema": { - "version": "1.0.5", - "bundled": true, - "dev": true, - "optional": true - }, - "har-validator": { - "version": "4.2.1", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "ajv": "^4.9.1", - "har-schema": "^1.0.5" - } - }, "has-unicode": { "version": "2.0.1", "bundled": true, - "dev": true, "optional": true }, - "hawk": { - "version": "3.1.3", + "iconv-lite": { + "version": "0.4.21", "bundled": true, - "dev": true, + "optional": true, "requires": { - "boom": "2.x.x", - "cryptiles": "2.x.x", - "hoek": "2.x.x", - "sntp": "1.x.x" + "safer-buffer": "^2.1.0" } }, - "hoek": { - "version": "2.16.3", - "bundled": true, - "dev": true - }, - "http-signature": { - "version": "1.1.1", + "ignore-walk": { + "version": "3.0.1", "bundled": true, - "dev": true, "optional": true, "requires": { - "assert-plus": "^0.2.0", - "jsprim": "^1.2.2", - "sshpk": "^1.7.0" + "minimatch": "^3.0.4" } }, "inflight": { "version": "1.0.6", "bundled": true, - "dev": true, + "optional": true, "requires": { "once": "^1.3.0", "wrappy": "1" @@ -5512,132 +5490,55 @@ }, "inherits": { "version": "2.0.3", - "bundled": true, - "dev": true + "bundled": true }, "ini": { - "version": "1.3.4", + "version": "1.3.5", "bundled": true, - "dev": true, "optional": true }, "is-fullwidth-code-point": { "version": "1.0.0", "bundled": true, - "dev": true, "requires": { "number-is-nan": "^1.0.0" } }, - "is-typedarray": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "optional": true - }, "isarray": { "version": "1.0.0", "bundled": true, - "dev": true - }, - "isstream": { - "version": "0.1.2", - "bundled": true, - "dev": true, "optional": true }, - "jodid25519": { - "version": "1.0.2", + "minimatch": { + "version": "3.0.4", "bundled": true, - "dev": true, - "optional": true, "requires": { - "jsbn": "~0.1.0" + "brace-expansion": "^1.1.7" } }, - "jsbn": { - "version": "0.1.1", - "bundled": true, - "dev": true, - "optional": true - }, - "json-schema": { - "version": "0.2.3", - "bundled": true, - "dev": true, - "optional": true + "minimist": { + "version": "0.0.8", + "bundled": true }, - "json-stable-stringify": { - "version": "1.0.1", + "minipass": { + "version": "2.2.4", "bundled": true, - "dev": true, - "optional": true, "requires": { - "jsonify": "~0.0.0" + "safe-buffer": "^5.1.1", + "yallist": "^3.0.0" } }, - "json-stringify-safe": { - "version": "5.0.1", - "bundled": true, - "dev": true, - "optional": true - }, - "jsonify": { - "version": "0.0.0", - "bundled": true, - "dev": true, - "optional": true - }, - "jsprim": { - "version": "1.4.0", + "minizlib": { + "version": "1.1.0", "bundled": true, - "dev": true, "optional": true, "requires": { - "assert-plus": "1.0.0", - "extsprintf": "1.0.2", - "json-schema": "0.2.3", - "verror": "1.3.6" - }, - "dependencies": { - "assert-plus": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "optional": true - } + "minipass": "^2.2.1" } }, - "mime-db": { - "version": "1.27.0", - "bundled": true, - "dev": true - }, - "mime-types": { - "version": "2.1.15", - "bundled": true, - "dev": true, - "requires": { - "mime-db": "~1.27.0" - } - }, - "minimatch": { - "version": "3.0.4", - "bundled": true, - "dev": true, - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "minimist": { - "version": "0.0.8", - "bundled": true, - "dev": true - }, "mkdirp": { "version": "0.5.1", "bundled": true, - "dev": true, "requires": { "minimist": "0.0.8" } @@ -5645,42 +5546,61 @@ "ms": { "version": "2.0.0", "bundled": true, - "dev": true, "optional": true }, + "needle": { + "version": "2.2.0", + "bundled": true, + "optional": true, + "requires": { + "debug": "^2.1.2", + "iconv-lite": "^0.4.4", + "sax": "^1.2.4" + } + }, "node-pre-gyp": { - "version": "0.6.39", + "version": "0.10.0", "bundled": true, - "dev": true, "optional": true, "requires": { "detect-libc": "^1.0.2", - "hawk": "3.1.3", "mkdirp": "^0.5.1", + "needle": "^2.2.0", "nopt": "^4.0.1", + "npm-packlist": "^1.1.6", "npmlog": "^4.0.2", "rc": "^1.1.7", - "request": "2.81.0", "rimraf": "^2.6.1", "semver": "^5.3.0", - "tar": "^2.2.1", - "tar-pack": "^3.4.0" + "tar": "^4" } }, "nopt": { "version": "4.0.1", "bundled": true, - "dev": true, "optional": true, "requires": { "abbrev": "1", "osenv": "^0.1.4" } }, + "npm-bundled": { + "version": "1.0.3", + "bundled": true, + "optional": true + }, + "npm-packlist": { + "version": "1.1.10", + "bundled": true, + "optional": true, + "requires": { + "ignore-walk": "^3.0.1", + "npm-bundled": "^1.0.1" + } + }, "npmlog": { - "version": "4.1.0", + "version": "4.1.2", "bundled": true, - "dev": true, "optional": true, "requires": { "are-we-there-yet": "~1.1.2", @@ -5691,25 +5611,16 @@ }, "number-is-nan": { "version": "1.0.1", - "bundled": true, - "dev": true - }, - "oauth-sign": { - "version": "0.8.2", - "bundled": true, - "dev": true, - "optional": true + "bundled": true }, "object-assign": { "version": "4.1.1", "bundled": true, - "dev": true, "optional": true }, "once": { "version": "1.4.0", "bundled": true, - "dev": true, "requires": { "wrappy": "1" } @@ -5717,19 +5628,16 @@ "os-homedir": { "version": "1.0.2", "bundled": true, - "dev": true, "optional": true }, "os-tmpdir": { "version": "1.0.2", "bundled": true, - "dev": true, "optional": true }, "osenv": { - "version": "0.1.4", + "version": "0.1.5", "bundled": true, - "dev": true, "optional": true, "requires": { "os-homedir": "^1.0.0", @@ -5739,38 +5647,19 @@ "path-is-absolute": { "version": "1.0.1", "bundled": true, - "dev": true - }, - "performance-now": { - "version": "0.2.0", - "bundled": true, - "dev": true, "optional": true }, "process-nextick-args": { - "version": "1.0.7", - "bundled": true, - "dev": true - }, - "punycode": { - "version": "1.4.1", - "bundled": true, - "dev": true, - "optional": true - }, - "qs": { - "version": "6.4.0", + "version": "2.0.0", "bundled": true, - "dev": true, "optional": true }, "rc": { - "version": "1.2.1", + "version": "1.2.7", "bundled": true, - "dev": true, "optional": true, "requires": { - "deep-extend": "~0.4.0", + "deep-extend": "^0.5.1", "ini": "~1.3.0", "minimist": "^1.2.0", "strip-json-comments": "~2.0.1" @@ -5779,237 +5668,112 @@ "minimist": { "version": "1.2.0", "bundled": true, - "dev": true, "optional": true } } }, "readable-stream": { - "version": "2.2.9", + "version": "2.3.6", "bundled": true, - "dev": true, + "optional": true, "requires": { - "buffer-shims": "~1.0.0", "core-util-is": "~1.0.0", - "inherits": "~2.0.1", + "inherits": "~2.0.3", "isarray": "~1.0.0", - "process-nextick-args": "~1.0.6", - "string_decoder": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", "util-deprecate": "~1.0.1" } }, - "request": { - "version": "2.81.0", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "aws-sign2": "~0.6.0", - "aws4": "^1.2.1", - "caseless": "~0.12.0", - "combined-stream": "~1.0.5", - "extend": "~3.0.0", - "forever-agent": "~0.6.1", - "form-data": "~2.1.1", - "har-validator": "~4.2.1", - "hawk": "~3.1.3", - "http-signature": "~1.1.0", - "is-typedarray": "~1.0.0", - "isstream": "~0.1.2", - "json-stringify-safe": "~5.0.1", - "mime-types": "~2.1.7", - "oauth-sign": "~0.8.1", - "performance-now": "^0.2.0", - "qs": "~6.4.0", - "safe-buffer": "^5.0.1", - "stringstream": "~0.0.4", - "tough-cookie": "~2.3.0", - "tunnel-agent": "^0.6.0", - "uuid": "^3.0.0" - } - }, "rimraf": { - "version": "2.6.1", + "version": "2.6.2", "bundled": true, - "dev": true, + "optional": true, "requires": { "glob": "^7.0.5" } }, "safe-buffer": { - "version": "5.0.1", - "bundled": true, - "dev": true - }, - "semver": { - "version": "5.3.0", - "bundled": true, - "dev": true, - "optional": true + "version": "5.1.1", + "bundled": true }, - "set-blocking": { - "version": "2.0.0", + "safer-buffer": { + "version": "2.1.2", "bundled": true, - "dev": true, "optional": true }, - "signal-exit": { - "version": "3.0.2", + "sax": { + "version": "1.2.4", "bundled": true, - "dev": true, "optional": true }, - "sntp": { - "version": "1.0.9", - "bundled": true, - "dev": true, - "requires": { - "hoek": "2.x.x" - } - }, - "sshpk": { - "version": "1.13.0", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "asn1": "~0.2.3", - "assert-plus": "^1.0.0", - "bcrypt-pbkdf": "^1.0.0", - "dashdash": "^1.12.0", - "ecc-jsbn": "~0.1.1", - "getpass": "^0.1.1", - "jodid25519": "^1.0.0", - "jsbn": "~0.1.0", - "tweetnacl": "~0.14.0" - }, - "dependencies": { - "assert-plus": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "optional": true - } - } - }, - "string-width": { - "version": "1.0.2", - "bundled": true, - "dev": true, - "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" - } - }, - "string_decoder": { - "version": "1.0.1", - "bundled": true, - "dev": true, - "requires": { - "safe-buffer": "^5.0.1" - } - }, - "stringstream": { - "version": "0.0.5", + "semver": { + "version": "5.5.0", "bundled": true, - "dev": true, "optional": true }, - "strip-ansi": { - "version": "3.0.1", - "bundled": true, - "dev": true, - "requires": { - "ansi-regex": "^2.0.0" - } - }, - "strip-json-comments": { - "version": "2.0.1", + "set-blocking": { + "version": "2.0.0", "bundled": true, - "dev": true, "optional": true }, - "tar": { - "version": "2.2.1", + "signal-exit": { + "version": "3.0.2", "bundled": true, - "dev": true, - "requires": { - "block-stream": "*", - "fstream": "^1.0.2", - "inherits": "2" - } + "optional": true }, - "tar-pack": { - "version": "3.4.0", + "string-width": { + "version": "1.0.2", "bundled": true, - "dev": true, - "optional": true, "requires": { - "debug": "^2.2.0", - "fstream": "^1.0.10", - "fstream-ignore": "^1.0.5", - "once": "^1.3.3", - "readable-stream": "^2.1.4", - "rimraf": "^2.5.1", - "tar": "^2.2.1", - "uid-number": "^0.0.6" + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" } }, - "tough-cookie": { - "version": "2.3.2", + "string_decoder": { + "version": "1.1.1", "bundled": true, - "dev": true, "optional": true, "requires": { - "punycode": "^1.4.1" + "safe-buffer": "~5.1.0" } }, - "tunnel-agent": { - "version": "0.6.0", + "strip-ansi": { + "version": "3.0.1", "bundled": true, - "dev": true, - "optional": true, "requires": { - "safe-buffer": "^5.0.1" + "ansi-regex": "^2.0.0" } }, - "tweetnacl": { - "version": "0.14.5", + "strip-json-comments": { + "version": "2.0.1", "bundled": true, - "dev": true, "optional": true }, - "uid-number": { - "version": "0.0.6", + "tar": { + "version": "4.4.1", "bundled": true, - "dev": true, - "optional": true + "optional": true, + "requires": { + "chownr": "^1.0.1", + "fs-minipass": "^1.2.5", + "minipass": "^2.2.4", + "minizlib": "^1.1.0", + "mkdirp": "^0.5.0", + "safe-buffer": "^5.1.1", + "yallist": "^3.0.2" + } }, "util-deprecate": { "version": "1.0.2", "bundled": true, - "dev": true - }, - "uuid": { - "version": "3.0.1", - "bundled": true, - "dev": true, "optional": true }, - "verror": { - "version": "1.3.6", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "extsprintf": "1.0.2" - } - }, "wide-align": { "version": "1.1.2", "bundled": true, - "dev": true, "optional": true, "requires": { "string-width": "^1.0.2" @@ -6017,8 +5781,11 @@ }, "wrappy": { "version": "1.0.2", - "bundled": true, - "dev": true + "bundled": true + }, + "yallist": { + "version": "3.0.2", + "bundled": true } } }, @@ -7493,6 +7260,11 @@ "integrity": "sha1-8QdIy+dq+WS3yWyTxrzCivEgwIE=", "dev": true }, + "gud": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/gud/-/gud-1.0.0.tgz", + "integrity": "sha512-zGEOVKFM5sVPPrYs7J5/hYEw2Pof8KCyOwyhG8sAF26mCAeUFAcYPu1mwB7hhpIP29zOIBaDqwuHdLp0jvZXjw==" + }, "gzip-size": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-4.1.0.tgz", @@ -7511,6 +7283,11 @@ } } }, + "hammerjs": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/hammerjs/-/hammerjs-2.0.8.tgz", + "integrity": "sha1-BO93hiz/K7edMPdpIJWTAiK/YPE=" + }, "handle-thing": { "version": "1.2.5", "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-1.2.5.tgz", @@ -7619,6 +7396,11 @@ "resolved": "https://registry.npmjs.org/hoek/-/hoek-4.2.0.tgz", "integrity": "sha512-v0XCLxICi9nPfYrS9RL8HbYnXi9obYAeLbSP00BmnZwCK9+Ih9WOjoZ8YoHCoav2csqn4FOz4Orldsy2dmDwmQ==" }, + "hoist-non-react-statics": { + "version": "2.5.5", + "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-2.5.5.tgz", + "integrity": "sha512-rqcy4pJo55FTTLWt+bU8ukscqHeE/e9KWvsOW2b/a3afxQZhwkQdT1rPPCJ0rYXdj4vNcasY8zHTH+jF/qStxw==" + }, "home-or-tmp": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/home-or-tmp/-/home-or-tmp-2.0.0.tgz", @@ -7972,6 +7754,11 @@ "dev": true, "optional": true }, + "immutable": { + "version": "3.7.6", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-3.7.6.tgz", + "integrity": "sha1-E7TTyxK++hVIKib+Gy665kAHHks=" + }, "imurmurhash": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", @@ -8111,6 +7898,11 @@ "integrity": "sha1-ggzdWIuGj/sZGoCVBtbJyPISsbA=", "dev": true }, + "intersperse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/intersperse/-/intersperse-1.0.0.tgz", + "integrity": "sha1-8lYfsc/vn1J3zDNHoiiGtDUaUYE=" + }, "interval-tree-1d": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/interval-tree-1d/-/interval-tree-1d-1.0.3.tgz", @@ -8277,6 +8069,11 @@ "resolved": "https://registry.npmjs.org/is-mobile/-/is-mobile-0.2.2.tgz", "integrity": "sha1-Di4AbZntLCFVt2HfgPKjYZrirZ8=" }, + "is-negative-zero": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.0.tgz", + "integrity": "sha1-lVOxIbD6wohp2p7UWeIMdUN4hGE=" + }, "is-number": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz", @@ -8518,6 +8315,14 @@ "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=" }, + "json2mq": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/json2mq/-/json2mq-0.2.0.tgz", + "integrity": "sha1-tje9O6nqvhIsg+lyBIOusQ0skEo=", + "requires": { + "string-convert": "^0.2.0" + } + }, "json3": { "version": "3.3.2", "resolved": "https://registry.npmjs.org/json3/-/json3-3.3.2.tgz", @@ -9048,6 +8853,11 @@ "integrity": "sha1-9HGh2khr5g9quVXRcRVSPdHSVdU=", "dev": true }, + "lodash.debounce": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", + "integrity": "sha1-gteb/zCmfEAF/9XiUVMArZyk168=" + }, "lodash.frompairs": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/lodash.frompairs/-/lodash.frompairs-4.0.1.tgz", @@ -9103,6 +8913,11 @@ "integrity": "sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4=", "dev": true }, + "lodash.throttle": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lodash.throttle/-/lodash.throttle-4.1.1.tgz", + "integrity": "sha1-wj6RtxAkKscMN/HhzaknTMOb8vQ=" + }, "lodash.toarray": { "version": "4.4.0", "resolved": "https://registry.npmjs.org/lodash.toarray/-/lodash.toarray-4.4.0.tgz", @@ -9623,6 +9438,16 @@ "integrity": "sha1-5md4PZLonb00KBi1IwudYqZyrRg=", "dev": true }, + "mini-store": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/mini-store/-/mini-store-1.1.0.tgz", + "integrity": "sha512-/Ou2jdD7/CDyJBjHnpRuc8aehh2WHxBpUpVvVHn0XhvLHk35YOiUlOYhX55NX00/e4phr1F3aNnhWKkGMqLUfQ==", + "requires": { + "hoist-non-react-statics": "^2.3.1", + "prop-types": "^15.6.0", + "shallowequal": "^1.0.2" + } + }, "minimalistic-assert": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.0.tgz", @@ -9849,7 +9674,6 @@ "version": "2.10.0", "resolved": "https://registry.npmjs.org/nan/-/nan-2.10.0.tgz", "integrity": "sha512-bAdJv7fBLhWC+/Bls0Oza+mvTaNQtP+1RyhhhvD95pgUJz6XM5IzgmxOkItJ9tkoCiplvAnXI1tNmmUD/eScyA==", - "dev": true, "optional": true }, "natural-compare": { @@ -10270,6 +10094,14 @@ "integrity": "sha1-EEEktsYCxnlogaBCVB0220OlJk4=", "dev": true }, + "omit.js": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/omit.js/-/omit.js-1.0.0.tgz", + "integrity": "sha512-O1rwbvEfAdhtonTv+v6IQeMOKTi/wlHcXpI3hehyPDlujkjSBQC6Vtzg0mdy+v2KVDmuPf7hAbHlTBM6q1bUHQ==", + "requires": { + "babel-runtime": "^6.23.0" + } + }, "on-finished": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", @@ -11696,6 +11528,14 @@ } } }, + "raf": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/raf/-/raf-3.4.0.tgz", + "integrity": "sha512-pDP/NMRAXoTfrhCfyfSEwJAKLaxBU9eApMeBPB1TkDouZmvPerIClV8lTAd+uF8ZiTaVl69e1FCxQrAd/VTjGw==", + "requires": { + "performance-now": "^2.1.0" + } + }, "randomatic": { "version": "1.1.7", "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-1.1.7.tgz", @@ -11778,6 +11618,520 @@ "integrity": "sha1-DD0L6u2KAclm2Xh793goElKpeao=", "dev": true }, + "rc-align": { + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/rc-align/-/rc-align-2.4.3.tgz", + "integrity": "sha512-h5KgyB5IXYR7iKpYFcMr54cuQ2eozPCZ11kbXPG5+6CWvmyJ+c0R/yjndVndiNk2G3MKcTMbJNdDv5DIckLAxQ==", + "requires": { + "babel-runtime": "^6.26.0", + "dom-align": "^1.7.0", + "prop-types": "^15.5.8", + "rc-util": "^4.0.4" + } + }, + "rc-animate": { + "version": "2.4.4", + "resolved": "https://registry.npmjs.org/rc-animate/-/rc-animate-2.4.4.tgz", + "integrity": "sha512-DjJLTUQj7XKKcuS8cczN0uOLfuSmgrVXFGieP1SZc87xUUTFGh8B/KjNmEtlfvxkSrSuVfb2rrEPER4SqKUtEA==", + "requires": { + "babel-runtime": "6.x", + "css-animation": "^1.3.2", + "prop-types": "15.x" + } + }, + "rc-calendar": { + "version": "9.6.2", + "resolved": "https://registry.npmjs.org/rc-calendar/-/rc-calendar-9.6.2.tgz", + "integrity": "sha512-RtWav1aeYEFiFWxc0toYga06orrw3229qwDSsQu4RcaS7+swja14+nxOpWCMic7K2AakBZh4OfJ/ZEdCMvHewQ==", + "requires": { + "babel-runtime": "6.x", + "classnames": "2.x", + "create-react-class": "^15.5.2", + "moment": "2.x", + "prop-types": "^15.5.8", + "rc-trigger": "^2.2.0", + "rc-util": "^4.1.1" + } + }, + "rc-cascader": { + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/rc-cascader/-/rc-cascader-0.14.0.tgz", + "integrity": "sha512-+wSriiSOC4B/9oTld3zaZ5aLFsYreGM4jdvFa6X1zZ9j3K9PfkvIO6OGv8slJQEXSv1E3HInbk/j6bGtYoesmg==", + "requires": { + "array-tree-filter": "^1.0.0", + "prop-types": "^15.5.8", + "rc-trigger": "^2.2.0", + "rc-util": "^4.0.4", + "shallow-equal": "^1.0.0", + "warning": "^4.0.1" + }, + "dependencies": { + "array-tree-filter": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/array-tree-filter/-/array-tree-filter-1.0.1.tgz", + "integrity": "sha1-CorR7v04zoiFhjL5zAQj12NOTV0=" + } + } + }, + "rc-checkbox": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/rc-checkbox/-/rc-checkbox-2.1.5.tgz", + "integrity": "sha512-WXKnZV6ipS3Jsmd7mVenVUQf+ictgWZW0RqiH+7MeYdzGj/SL4g/S6MZgRdgzaBS2tGBCp4bvhGcyZLns6uQxw==", + "requires": { + "babel-runtime": "^6.23.0", + "classnames": "2.x", + "prop-types": "15.x", + "rc-util": "^4.0.4" + } + }, + "rc-collapse": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/rc-collapse/-/rc-collapse-1.9.3.tgz", + "integrity": "sha512-8cG+FzudmgFCC9zRGKXJZA36zoI9Dmyjp6UDi8N80sXUch0JOpsZDxgcFzw4HPpPpK/dARtTilEe9zyuspnW0w==", + "requires": { + "classnames": "2.x", + "css-animation": "1.x", + "prop-types": "^15.5.6", + "rc-animate": "2.x" + } + }, + "rc-dialog": { + "version": "7.1.8", + "resolved": "https://registry.npmjs.org/rc-dialog/-/rc-dialog-7.1.8.tgz", + "integrity": "sha512-iWbV+r0cZpV5TFPtXQDRf+lBW322uSVXK20ULvXEEBWbnsSmg3c9D/RlOcDNV6WJvOLOwIof0CKZPFyhl8Szww==", + "requires": { + "babel-runtime": "6.x", + "rc-animate": "2.x", + "rc-util": "^4.4.0" + } + }, + "rc-drawer": { + "version": "1.5.9", + "resolved": "https://registry.npmjs.org/rc-drawer/-/rc-drawer-1.5.9.tgz", + "integrity": "sha512-Uw4QA+TyutJVM2irfiOondyjUqAW8PHJep8CGRCmnu/mxAJSeKOTfRMUBSr/KiP3OKNm8obMJSMuvcu+YR8TPw==", + "requires": { + "babel-runtime": "6.x", + "classnames": "^2.2.5", + "prop-types": "^15.5.0", + "rc-util": "^4.5.1" + } + }, + "rc-dropdown": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/rc-dropdown/-/rc-dropdown-2.2.0.tgz", + "integrity": "sha512-gVqR8eC4iGuDeIIXm3vcfoo4Ui9FvjE2Gh1FSbztWE7Lr68zI/8Zb4Pc/Z1ZGJflpo6PGMCwy5zWyuIFH28G7Q==", + "requires": { + "babel-runtime": "^6.26.0", + "prop-types": "^15.5.8", + "rc-trigger": "^2.5.1", + "react-lifecycles-compat": "^3.0.2" + } + }, + "rc-editor-core": { + "version": "0.8.6", + "resolved": "https://registry.npmjs.org/rc-editor-core/-/rc-editor-core-0.8.6.tgz", + "integrity": "sha512-6M4C0qLTf/UvQA0XNb8BWlb5+tZ5LCZKc9Hs0oH6Fn+18XMRILYiUKBCdLObaj0LVeq5vhq+zra9sjfqBEguHQ==", + "requires": { + "babel-runtime": "^6.26.0", + "classnames": "^2.2.5", + "draft-js": "^0.10.0", + "immutable": "^3.7.4", + "lodash": "^4.16.5", + "prop-types": "^15.5.8", + "setimmediate": "^1.0.5" + } + }, + "rc-editor-mention": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/rc-editor-mention/-/rc-editor-mention-1.1.7.tgz", + "integrity": "sha512-5z9OX8gxh76oD8kx0Hi2fTZEyrmrfDo35ouFgpFrhB3H1L+WY4yvi1yUUZJG1uAxq/3Hlhnet4AFy1SnepinyQ==", + "requires": { + "babel-runtime": "^6.23.0", + "classnames": "^2.2.5", + "dom-scroll-into-view": "^1.2.0", + "draft-js": "~0.10.0", + "prop-types": "^15.5.8", + "rc-animate": "^2.3.0", + "rc-editor-core": "~0.8.3" + } + }, + "rc-form": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/rc-form/-/rc-form-2.2.1.tgz", + "integrity": "sha512-Hwzq2IL4gdbEgbG3wXtkUA37QXQxfXFp93PGmwlnHzbH7A8TiLQiiI8quS3b2FMtSVjBw3922E6yl6PmPGbfWw==", + "requires": { + "async-validator": "1.x", + "babel-runtime": "6.x", + "create-react-class": "^15.5.3", + "dom-scroll-into-view": "1.x", + "hoist-non-react-statics": "^2.3.1", + "lodash": "^4.17.4", + "warning": "^3.0.0" + }, + "dependencies": { + "warning": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/warning/-/warning-3.0.0.tgz", + "integrity": "sha1-MuU3fLVy3kqwR1O9+IIcAe1gW3w=", + "requires": { + "loose-envify": "^1.0.0" + } + } + } + }, + "rc-hammerjs": { + "version": "0.6.9", + "resolved": "https://registry.npmjs.org/rc-hammerjs/-/rc-hammerjs-0.6.9.tgz", + "integrity": "sha512-4llgWO3RgLyVbEqUdGsDfzUDqklRlQW5VEhE3x35IvhV+w//VPRG34SBavK3D2mD/UaLKaohgU41V4agiftC8g==", + "requires": { + "babel-runtime": "6.x", + "hammerjs": "^2.0.8", + "prop-types": "^15.5.9" + } + }, + "rc-input-number": { + "version": "4.0.12", + "resolved": "https://registry.npmjs.org/rc-input-number/-/rc-input-number-4.0.12.tgz", + "integrity": "sha512-lVop5/bJPqNF57kT8Y9gr1bhKF0twEv44z4OYswN4YTWLJtCLoeT+6Hv4IJABOfGQbyK5owXki7zKEVcOehNMQ==", + "requires": { + "babel-runtime": "6.x", + "classnames": "^2.2.0", + "is-negative-zero": "^2.0.0", + "prop-types": "^15.5.7", + "rc-util": "^4.5.1", + "rmc-feedback": "^2.0.0" + } + }, + "rc-menu": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/rc-menu/-/rc-menu-7.0.5.tgz", + "integrity": "sha512-VG8Ncjb4UuklxZvk/u3gN4vU8xuJF5WJfdLQIVWB3fu01lnMZF8adN1YWWvpftM0t9zGEppDkNGumZFKmx0WGA==", + "requires": { + "babel-runtime": "6.x", + "classnames": "2.x", + "dom-scroll-into-view": "1.x", + "mini-store": "^1.1.0", + "prop-types": "^15.5.6", + "rc-animate": "2.x", + "rc-trigger": "^2.3.0", + "rc-util": "^4.1.0" + } + }, + "rc-notification": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/rc-notification/-/rc-notification-3.1.1.tgz", + "integrity": "sha512-70a/qR3SRnYr728H0viEyv8QtLjWzUb3kTZV96yqU/Ro5jWSF/Q3qK7dRGEuyfqjWyGVEuTCyiKNu/qAp26m9g==", + "requires": { + "babel-runtime": "6.x", + "classnames": "2.x", + "prop-types": "^15.5.8", + "rc-animate": "2.x", + "rc-util": "^4.0.4" + } + }, + "rc-pagination": { + "version": "1.16.5", + "resolved": "https://registry.npmjs.org/rc-pagination/-/rc-pagination-1.16.5.tgz", + "integrity": "sha512-h8xUK5JeFMBH23wVOZ2HuqUPM+jss37yemxDlDCjhKeur5Ne2z6Q8L8gz+pKoE5Qz7kqLi7Vp7U2aogrwK9WtA==", + "requires": { + "babel-runtime": "6.x", + "prop-types": "^15.5.7" + } + }, + "rc-progress": { + "version": "2.2.5", + "resolved": "https://registry.npmjs.org/rc-progress/-/rc-progress-2.2.5.tgz", + "integrity": "sha1-5h0FRL+dQgjlujL8UJYhWef5UqM=", + "requires": { + "babel-runtime": "6.x", + "prop-types": "^15.5.8" + } + }, + "rc-rate": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/rc-rate/-/rc-rate-2.4.0.tgz", + "integrity": "sha512-gYHxaXqObiIw1ekRS8tq2YUKpTGL/Q9LxMdSCXZS++d5bVsmmTCZUvJFKEt0IfLb19sZtxCaQvwanzNpqaxY7Q==", + "requires": { + "babel-runtime": "^6.26.0", + "classnames": "^2.2.5", + "prop-types": "^15.5.8", + "rc-util": "^4.3.0" + } + }, + "rc-select": { + "version": "8.0.14", + "resolved": "https://registry.npmjs.org/rc-select/-/rc-select-8.0.14.tgz", + "integrity": "sha512-eOZeN3q+dBkDZGnzbT5AsRAw86zS6d85GlN5onk3L4vbCS3iaItKp1PRby+oady+3nuNarKaQ+YqS21wW7wjuw==", + "requires": { + "babel-runtime": "^6.23.0", + "classnames": "2.x", + "component-classes": "1.x", + "dom-scroll-into-view": "1.x", + "prop-types": "^15.5.8", + "rc-animate": "2.x", + "rc-menu": "^7.0.2", + "rc-trigger": "^2.2.0", + "rc-util": "^4.0.4", + "react-lifecycles-compat": "^3.0.2", + "warning": "^3.0.0" + }, + "dependencies": { + "warning": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/warning/-/warning-3.0.0.tgz", + "integrity": "sha1-MuU3fLVy3kqwR1O9+IIcAe1gW3w=", + "requires": { + "loose-envify": "^1.0.0" + } + } + } + }, + "rc-slider": { + "version": "8.6.1", + "resolved": "https://registry.npmjs.org/rc-slider/-/rc-slider-8.6.1.tgz", + "integrity": "sha512-6DoLW5pWR8K/7Z55E5wKZGGa22HFY6LB4Z0PegzSXrQ/RqUHm9hFHRA3FYCuPOsg/Zsi+SgGPvzC2P/I/YZ6Lg==", + "requires": { + "babel-runtime": "6.x", + "classnames": "^2.2.5", + "prop-types": "^15.5.4", + "rc-tooltip": "^3.7.0", + "rc-util": "^4.0.4", + "shallowequal": "^1.0.1", + "warning": "^3.0.0" + }, + "dependencies": { + "warning": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/warning/-/warning-3.0.0.tgz", + "integrity": "sha1-MuU3fLVy3kqwR1O9+IIcAe1gW3w=", + "requires": { + "loose-envify": "^1.0.0" + } + } + } + }, + "rc-steps": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/rc-steps/-/rc-steps-3.1.1.tgz", + "integrity": "sha512-oon2VdAHWrZmkB07MUMhq7k2IazFmtOi+6CCPn1ao3ZJ/89/aArP9/3pDQBm88FBQBcDh1E04kSHufbdY1kxfw==", + "requires": { + "babel-runtime": "^6.23.0", + "classnames": "^2.2.3", + "lodash": "^4.17.5", + "prop-types": "^15.5.7" + } + }, + "rc-switch": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/rc-switch/-/rc-switch-1.6.0.tgz", + "integrity": "sha512-tlnYj92N/PxFLWJObATgSPYWESCFTUtdFjDRbCJFvSd4j2a8IFLz20X/5d3OTnFtf7DcxLTa/aGIPmsI3mFn3g==", + "requires": { + "babel-runtime": "^6.23.0", + "classnames": "^2.2.1", + "prop-types": "^15.5.6" + } + }, + "rc-table": { + "version": "6.2.7", + "resolved": "https://registry.npmjs.org/rc-table/-/rc-table-6.2.7.tgz", + "integrity": "sha512-PTKSWiF7/hBPvHZ1TQvyFcwegn3ce7yeAOWNNZwdJwNLUqCM4TQ1TSN8b6YNe9gBon4a2JsA/YT3rjpiNDX67Q==", + "requires": { + "babel-runtime": "6.x", + "classnames": "^2.2.5", + "component-classes": "^1.2.6", + "lodash": "^4.17.5", + "mini-store": "^1.0.2", + "prop-types": "^15.5.8", + "rc-util": "^4.0.4", + "react-lifecycles-compat": "^3.0.2", + "shallowequal": "^1.0.2", + "warning": "^3.0.0" + }, + "dependencies": { + "warning": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/warning/-/warning-3.0.0.tgz", + "integrity": "sha1-MuU3fLVy3kqwR1O9+IIcAe1gW3w=", + "requires": { + "loose-envify": "^1.0.0" + } + } + } + }, + "rc-tabs": { + "version": "9.2.6", + "resolved": "https://registry.npmjs.org/rc-tabs/-/rc-tabs-9.2.6.tgz", + "integrity": "sha512-J4HsAPinn/utapHjCg36HdEI/WsL0Ma61t0mTkkEf6Z/LQQWS16LhgLbycF3lTNUIgcZu3dhQFjRDg4kpaFbAQ==", + "requires": { + "babel-runtime": "6.x", + "classnames": "2.x", + "create-react-class": "15.x", + "lodash": "^4.17.5", + "prop-types": "15.x", + "rc-hammerjs": "~0.6.0", + "rc-util": "^4.0.4", + "warning": "^3.0.0" + }, + "dependencies": { + "warning": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/warning/-/warning-3.0.0.tgz", + "integrity": "sha1-MuU3fLVy3kqwR1O9+IIcAe1gW3w=", + "requires": { + "loose-envify": "^1.0.0" + } + } + } + }, + "rc-time-picker": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/rc-time-picker/-/rc-time-picker-3.3.1.tgz", + "integrity": "sha512-iCo6Fs6Bp/HjjSvdA+nv/yJEWSe+vDyunV57uVzZkW+4QDQ+BOvZGGwJcfL407u/eP1QKmeljZN8Iu3KjdKIGg==", + "requires": { + "babel-runtime": "6.x", + "classnames": "2.x", + "moment": "2.x", + "prop-types": "^15.5.8", + "rc-trigger": "^2.2.0" + } + }, + "rc-tooltip": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/rc-tooltip/-/rc-tooltip-3.7.2.tgz", + "integrity": "sha512-vsF29ohlfgr7lEP12aJ5j4U/4hzqSBYjWQo8I09re+q95v1o4nDjH1q/B3qFkf9aml2FbgdkJw9KYz/zXUgApA==", + "requires": { + "babel-runtime": "6.x", + "prop-types": "^15.5.8", + "rc-trigger": "^2.2.2" + } + }, + "rc-tree": { + "version": "1.12.6", + "resolved": "https://registry.npmjs.org/rc-tree/-/rc-tree-1.12.6.tgz", + "integrity": "sha512-/XusoOv1yxULlu0rdbcUZKCGyutkmr3Regr6c/0lxs3IkTuK6Q8Wq6WuZ4FBv/MpagPYuAtqbqh2ZDmgv2FLjA==", + "requires": { + "babel-runtime": "^6.23.0", + "classnames": "2.x", + "prop-types": "^15.5.8", + "rc-animate": "2.x", + "rc-util": "^4.0.4", + "warning": "^3.0.0" + }, + "dependencies": { + "warning": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/warning/-/warning-3.0.0.tgz", + "integrity": "sha1-MuU3fLVy3kqwR1O9+IIcAe1gW3w=", + "requires": { + "loose-envify": "^1.0.0" + } + } + } + }, + "rc-tree-select": { + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/rc-tree-select/-/rc-tree-select-2.0.11.tgz", + "integrity": "sha512-bvuMk1+xwoSPv2525YHqakKeoLNanD38Qg8Rnb0XE9fX1qPR4DpYZZQSwGEH/eHi6mWu5LEJqu8isUmupR4h0g==", + "requires": { + "babel-runtime": "^6.23.0", + "classnames": "^2.2.1", + "prop-types": "^15.5.8", + "raf": "^3.4.0", + "rc-animate": "^3.0.0-rc.1", + "rc-tree": "~1.12.2", + "rc-trigger": "^3.0.0-rc.2", + "rc-util": "^4.5.0", + "react-lifecycles-compat": "^3.0.4", + "shallowequal": "^1.0.2", + "warning": "^4.0.1" + }, + "dependencies": { + "rc-animate": { + "version": "3.0.0-rc.1", + "resolved": "https://registry.npmjs.org/rc-animate/-/rc-animate-3.0.0-rc.1.tgz", + "integrity": "sha512-wlFdca44Y0PE/0FdK6FWs1BXVMiYsp0ighUCw97oaELTpxxZ5wA9fkfCzVhYc3xiCQHP20fSjYp77ZcalO6h/A==", + "requires": { + "babel-runtime": "6.x", + "classnames": "^2.2.5", + "component-classes": "^1.2.6", + "fbjs": "^0.8.16", + "prop-types": "15.x", + "raf": "^3.4.0", + "rc-util": "^4.5.0", + "react-lifecycles-compat": "^3.0.4" + } + }, + "rc-trigger": { + "version": "3.0.0-rc.3", + "resolved": "https://registry.npmjs.org/rc-trigger/-/rc-trigger-3.0.0-rc.3.tgz", + "integrity": "sha512-4vB6cpxcUdm2qO5VtB9q1TZz0MoWm9BzFLvGknulphGrl1qI6uxUsPDCvqnmujdpDdAKGGfjxntFpA7RtAwkFQ==", + "requires": { + "babel-runtime": "6.x", + "classnames": "^2.2.6", + "prop-types": "15.x", + "raf": "^3.4.0", + "rc-align": "^2.4.1", + "rc-animate": "^3.0.0-rc.1", + "rc-util": "^4.4.0" + } + } + } + }, + "rc-trigger": { + "version": "2.5.4", + "resolved": "https://registry.npmjs.org/rc-trigger/-/rc-trigger-2.5.4.tgz", + "integrity": "sha512-clgXOdazDW2qg4vTZSAExpvOuojPNuMoamG+SxAm5Ih+rpVcrtEiDlDZWY4yUHyfEWJZBzgbrr4np/z2FK6RfA==", + "requires": { + "babel-runtime": "6.x", + "classnames": "^2.2.6", + "prop-types": "15.x", + "rc-align": "^2.4.0", + "rc-animate": "2.x", + "rc-util": "^4.4.0" + } + }, + "rc-upload": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/rc-upload/-/rc-upload-2.5.1.tgz", + "integrity": "sha512-tFZTEfWlIqlKrvl9UHLGkSXj8oOrOsXcILVjMwTZCf61gJNZXMfyigifClsPqz+EEXkQvpovu/9zgLqBpbJlLA==", + "requires": { + "babel-runtime": "6.x", + "classnames": "^2.2.5", + "prop-types": "^15.5.7", + "warning": "2.x" + }, + "dependencies": { + "warning": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/warning/-/warning-2.1.0.tgz", + "integrity": "sha1-ISINnGOvx3qMkhEeARr3Bc4MaQE=", + "requires": { + "loose-envify": "^1.0.0" + } + } + } + }, + "rc-util": { + "version": "4.5.1", + "resolved": "https://registry.npmjs.org/rc-util/-/rc-util-4.5.1.tgz", + "integrity": "sha512-PdCmHyBBodZdw6Oaikt0l+/R79IcRXpYkTrqD/Rbl4ZdoOi61t5TtEe40Q+A7rkWG5U1xjcN+h8j9H6GdtnICw==", + "requires": { + "add-dom-event-listener": "1.x", + "babel-runtime": "6.x", + "prop-types": "^15.5.10", + "shallowequal": "^0.2.2" + }, + "dependencies": { + "shallowequal": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/shallowequal/-/shallowequal-0.2.2.tgz", + "integrity": "sha1-HjL9W8q2rWiKSBLLDMBO/HXHAU4=", + "requires": { + "lodash.keys": "^3.1.2" + } + } + } + }, "react": { "version": "16.4.0", "resolved": "https://registry.npmjs.org/react/-/react-16.4.0.tgz", @@ -11800,6 +12154,34 @@ "prop-types": "^15.6.0" } }, + "react-lazy-load": { + "version": "3.0.13", + "resolved": "https://registry.npmjs.org/react-lazy-load/-/react-lazy-load-3.0.13.tgz", + "integrity": "sha1-OwqS0zbUPT8Nc8vm81sXBQsIuCQ=", + "requires": { + "eventlistener": "0.0.1", + "lodash.debounce": "^4.0.0", + "lodash.throttle": "^4.0.0", + "prop-types": "^15.5.8" + } + }, + "react-lifecycles-compat": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz", + "integrity": "sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA==" + }, + "react-slick": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/react-slick/-/react-slick-0.23.1.tgz", + "integrity": "sha512-vn4E+JeTUrjRgXDEV0QEiWo3fNdB6Lg/e8eMYSh3OjuadqYBsgn0OfbqNxVJs7cv1VmSKm14razHEbpRFP/mvw==", + "requires": { + "classnames": "^2.2.5", + "enquire.js": "^2.1.6", + "json2mq": "^0.2.0", + "lodash.debounce": "^4.0.8", + "resize-observer-polyfill": "^1.5.0" + } + }, "react2angular": { "version": "3.2.1", "resolved": "https://registry.npmjs.org/react2angular/-/react2angular-3.2.1.tgz", @@ -12156,6 +12538,11 @@ "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=", "dev": true }, + "resize-observer-polyfill": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/resize-observer-polyfill/-/resize-observer-polyfill-1.5.0.tgz", + "integrity": "sha512-M2AelyJDVR/oLnToJLtuDJRBBWUGUvvGigj1411hXhAdyFWqMaqHp7TixW3FpiLuVaikIcR1QL+zqoJoZlOgpg==" + }, "resolve": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.4.0.tgz", @@ -12233,6 +12620,15 @@ "inherits": "^2.0.1" } }, + "rmc-feedback": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/rmc-feedback/-/rmc-feedback-2.0.0.tgz", + "integrity": "sha512-5PWOGOW7VXks/l3JzlOU9NIxRpuaSS8d9zA3UULUCuTKnpwBHNvv1jSJzxgbbCQeYzROWUpgKI4za3X4C/mKmQ==", + "requires": { + "babel-runtime": "6.x", + "classnames": "^2.2.5" + } + }, "robust-compress": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/robust-compress/-/robust-compress-1.0.0.tgz", @@ -12528,6 +12924,16 @@ "resolved": "https://registry.npmjs.org/shallow-copy/-/shallow-copy-0.0.1.tgz", "integrity": "sha1-QV9CcC1z2BAzApLMXuhurhoRoXA=" }, + "shallow-equal": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shallow-equal/-/shallow-equal-1.0.0.tgz", + "integrity": "sha1-UI0YOLPeWQq4dXsBGyXkMJAJRfc=" + }, + "shallowequal": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/shallowequal/-/shallowequal-1.1.0.tgz", + "integrity": "sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ==" + }, "shebang-command": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", @@ -13118,6 +13524,11 @@ "integrity": "sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM=", "dev": true }, + "string-convert": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/string-convert/-/string-convert-0.2.1.tgz", + "integrity": "sha1-aYLMMEn7tM2F+LJFaLnZvznu/5c=" + }, "string-width": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", @@ -13917,6 +14328,14 @@ "resolved": "https://registry.npmjs.org/w3c-blob/-/w3c-blob-0.0.1.tgz", "integrity": "sha1-sM01KhpQ9RVWNCD/1YYflQ8dhbg=" }, + "warning": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/warning/-/warning-4.0.1.tgz", + "integrity": "sha512-rAVtTNZw+cQPjvGp1ox0XC5Q2IBFyqoqh+QII4J/oguyu83Bax1apbo2eqB8bHRS+fqYUBagys6lqUoVwKSmXQ==", + "requires": { + "loose-envify": "^1.0.0" + } + }, "watchpack": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.4.0.tgz", diff --git a/package.json b/package.json index ee69d2e41b..e8111343ba 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "redash-client", - "version": "4.0.1", + "version": "5.0.0-beta", "description": "The frontend part of Redash.", "main": "index.js", "scripts": { @@ -41,6 +41,7 @@ "angular-ui-ace": "^0.2.3", "angular-ui-bootstrap": "^2.5.0", "angular-vs-repeat": "^1.1.7", + "antd": "^3.7.1", "babel-preset-react": "^6.24.1", "bootstrap": "^3.3.7", "brace": "^0.10.0", @@ -55,8 +56,8 @@ "jquery": "^3.2.1", "jquery-ui": "^1.12.1", "leaflet": "^1.2.0", - "leaflet.markercluster": "^1.1.0", "leaflet-fullscreen": "^1.0.2", + "leaflet.markercluster": "^1.1.0", "lodash": "^4.17.10", "markdown": "0.5.0", "material-design-iconic-font": "^2.2.0", @@ -79,6 +80,7 @@ "babel-eslint": "^8.2.3", "babel-loader": "^7.1.2", "babel-plugin-angularjs-annotate": "^0.8.2", + "babel-plugin-import": "^1.8.0", "babel-plugin-transform-builtin-extend": "^1.1.2", "babel-plugin-transform-class-properties": "^6.24.1", "babel-plugin-transform-object-assign": "^6.22.0", @@ -110,5 +112,8 @@ "webpack-bundle-analyzer": "^2.11.1", "webpack-dev-server": "^2.9.1", "webpack-manifest-plugin": "^1.3.2" + }, + "optionalDependencies": { + "fsevents": "^1.2.4" } } diff --git a/redash/__init__.py b/redash/__init__.py index bd1793b65c..bd9a8e5859 100644 --- a/redash/__init__.py +++ b/redash/__init__.py @@ -19,7 +19,7 @@ from redash.destinations import import_destinations -__version__ = '4.0.1' +__version__ = '5.0.0-beta' def setup_logging(): diff --git a/redash/handlers/queries.py b/redash/handlers/queries.py index 612f36dc74..6453edef6b 100644 --- a/redash/handlers/queries.py +++ b/redash/handlers/queries.py @@ -66,13 +66,13 @@ class QueryRecentResource(BaseResource): @require_permission('view_query') def get(self): """ - Retrieve up to 10 queries modified in the last 7 days. + Retrieve up to 10 queries recently modified by the user. Responds with a list of :ref:`query ` objects. """ results = models.Query.by_user(self.current_user).order_by(models.Query.updated_at.desc()).limit(10) - return QuerySerializer(results, with_last_modified_by=False, with_user=False) + return QuerySerializer(results, with_last_modified_by=False, with_user=False).serialize() class QueryListResource(BaseResource): diff --git a/redash/handlers/users.py b/redash/handlers/users.py index 636ca8e544..3d42100d1a 100644 --- a/redash/handlers/users.py +++ b/redash/handlers/users.py @@ -4,6 +4,7 @@ from flask_login import current_user from funcy import project from sqlalchemy.exc import IntegrityError +from disposable_email_domains import blacklist from redash import models from redash.permissions import require_permission, require_admin_or_owner, is_admin_or_owner, \ @@ -34,6 +35,11 @@ def post(self): req = request.get_json(force=True) require_fields(req, ('name', 'email')) + name, domain = req['email'].split('@', 1) + + if domain.lower() in blacklist or domain.lower() == 'qq.com': + abort(400, message='Bad email address.') + user = models.User(org=self.current_org, name=req['name'], email=req['email'], diff --git a/redash/models.py b/redash/models.py index 2e89e89af4..fcbe465ee5 100644 --- a/redash/models.py +++ b/redash/models.py @@ -631,7 +631,7 @@ def all(cls, org, group_ids=None): data_sources = data_sources.join(DataSourceGroup).filter( DataSourceGroup.group_id.in_(group_ids)) - return data_sources + return data_sources.distinct() @classmethod def get_by_id(cls, _id): diff --git a/redash/query_runner/big_query.py b/redash/query_runner/big_query.py index f765978585..d22830f0ba 100644 --- a/redash/query_runner/big_query.py +++ b/redash/query_runner/big_query.py @@ -204,12 +204,29 @@ def _get_query_result(self, jobs, query): data = { "columns": columns, - "rows": rows, + "rows": rows, 'metadata': {'data_scanned': int(query_reply['totalBytesProcessed'])} } return data + def _get_columns_schema(self, table_data): + columns = [] + for column in table_data['schema']['fields']: + columns.extend(self._get_columns_schema_column(column)) + + return {'name': table_data['id'], 'columns': columns} + + def _get_columns_schema_column(self, column): + columns = [] + if column['type'] == 'RECORD': + for field in column['fields']: + columns.append(u"{}.{}".format(column['name'], field['name'])) + else: + columns.append(column['name']) + + return columns + def get_schema(self, get_stats=False): if not self.configuration.get('loadSchema', False): return [] @@ -221,17 +238,21 @@ def get_schema(self, get_stats=False): for dataset in datasets.get('datasets', []): dataset_id = dataset['datasetReference']['datasetId'] tables = service.tables().list(projectId=project_id, datasetId=dataset_id).execute() - for table in tables.get('tables', []): - table_data = service.tables().get(projectId=project_id, datasetId=dataset_id, tableId=table['tableReference']['tableId']).execute() - - columns = [] - for column in table_data['schema']['fields']: - if column['type'] == 'RECORD': - for field in column['fields']: - columns.append(u"{}.{}".format(column['name'], field['name'])) - else: - columns.append(column['name']) - schema.append({'name': table_data['id'], 'columns': columns}) + while True: + for table in tables.get('tables', []): + table_data = service.tables().get(projectId=project_id, + datasetId=dataset_id, + tableId=table['tableReference']['tableId']).execute() + table_schema = self._get_columns_schema(table_data) + schema.append(table_schema) + + next_token = tables.get('nextPageToken', None) + if next_token is None: + break + + tables = service.tables().list(projectId=project_id, + datasetId=dataset_id, + pageToken=next_token).execute() return schema diff --git a/redash/query_runner/google_spreadsheets.py b/redash/query_runner/google_spreadsheets.py index 1b821ee643..3cea1aa755 100644 --- a/redash/query_runner/google_spreadsheets.py +++ b/redash/query_runner/google_spreadsheets.py @@ -4,6 +4,7 @@ from dateutil import parser from requests import Session +from xlsxwriter.utility import xl_col_to_name from redash.query_runner import * from redash.utils import json_dumps @@ -25,6 +26,29 @@ def _load_key(filename): return json.loads(f.read()) +def _get_columns_and_column_names(row): + column_names = [] + columns = [] + duplicate_counter = 1 + + for i, column_name in enumerate(row): + if not column_name: + column_name = 'column_{}'.format(xl_col_to_name(i)) + + if column_name in column_names: + column_name = u"{}{}".format(column_name, duplicate_counter) + duplicate_counter += 1 + + column_names.append(column_name) + columns.append({ + 'name': column_name, + 'friendly_name': column_name, + 'type': TYPE_STRING + }) + + return columns, column_names + + def _guess_type(value): if value == '': return TYPE_STRING @@ -53,7 +77,9 @@ def _value_eval_list(row_values, col_types): raw_values = zip(col_types, row_values) for typ, rval in raw_values: try: - if typ == TYPE_BOOLEAN: + if rval is None or rval == '': + val = None + elif typ == TYPE_BOOLEAN: val = True if unicode(rval).lower() == 'true' else False elif typ == TYPE_DATETIME: val = parser.parse(rval) @@ -91,21 +117,7 @@ def parse_worksheet(worksheet): if not worksheet: return {'columns': [], 'rows': []} - column_names = [] - columns = [] - duplicate_counter = 1 - - for j, column_name in enumerate(worksheet[HEADER_INDEX]): - if column_name in column_names: - column_name = u"{}{}".format(column_name, duplicate_counter) - duplicate_counter += 1 - - column_names.append(column_name) - columns.append({ - 'name': column_name, - 'friendly_name': column_name, - 'type': TYPE_STRING - }) + columns, column_names = _get_columns_and_column_names(worksheet[HEADER_INDEX]) if len(worksheet) > 1: for j, value in enumerate(worksheet[HEADER_INDEX + 1]): diff --git a/redash/query_runner/hive_ds.py b/redash/query_runner/hive_ds.py index 73be16021b..728ca3fbe5 100644 --- a/redash/query_runner/hive_ds.py +++ b/redash/query_runner/hive_ds.py @@ -17,20 +17,20 @@ COLUMN_TYPE = 1 types_map = { - 'BIGINT': TYPE_INTEGER, - 'TINYINT': TYPE_INTEGER, - 'SMALLINT': TYPE_INTEGER, - 'INT': TYPE_INTEGER, - 'DOUBLE': TYPE_FLOAT, - 'DECIMAL': TYPE_FLOAT, - 'FLOAT': TYPE_FLOAT, - 'REAL': TYPE_FLOAT, - 'BOOLEAN': TYPE_BOOLEAN, - 'TIMESTAMP': TYPE_DATETIME, - 'DATE': TYPE_DATETIME, - 'CHAR': TYPE_STRING, - 'STRING': TYPE_STRING, - 'VARCHAR': TYPE_STRING + 'BIGINT_TYPE': TYPE_INTEGER, + 'TINYINT_TYPE': TYPE_INTEGER, + 'SMALLINT_TYPE': TYPE_INTEGER, + 'INT_TYPE': TYPE_INTEGER, + 'DOUBLE_TYPE': TYPE_FLOAT, + 'DECIMAL_TYPE': TYPE_FLOAT, + 'FLOAT_TYPE': TYPE_FLOAT, + 'REAL_TYPE': TYPE_FLOAT, + 'BOOLEAN_TYPE': TYPE_BOOLEAN, + 'TIMESTAMP_TYPE': TYPE_DATETIME, + 'DATE_TYPE': TYPE_DATETIME, + 'CHAR_TYPE': TYPE_STRING, + 'STRING_TYPE': TYPE_STRING, + 'VARCHAR_TYPE': TYPE_STRING } diff --git a/redash/query_runner/yandex_metrika.py b/redash/query_runner/yandex_metrika.py index a93161b418..1c5051f994 100644 --- a/redash/query_runner/yandex_metrika.py +++ b/redash/query_runner/yandex_metrika.py @@ -125,7 +125,7 @@ def run_query(self, query, user): error = "Query is empty" return data, error try: - params = yaml.load(query) + params = yaml.safe_load(query) except ValueError as e: logging.exception(e) error = unicode(e) diff --git a/requirements.txt b/requirements.txt index 13a3a6f219..02db925f07 100644 --- a/requirements.txt +++ b/requirements.txt @@ -50,6 +50,7 @@ ua-parser==0.7.3 user-agents==1.1.0 python-geoip-geolite2==2015.303 chromelogger==0.4.3 +disposable-email-domains # Uncomment the requirement for ldap3 if using ldap. # It is not included by default because of the GPL license conflict. # ldap3==2.2.4 diff --git a/tests/handlers/test_users.py b/tests/handlers/test_users.py index 39430b8d2f..d3de638a01 100644 --- a/tests/handlers/test_users.py +++ b/tests/handlers/test_users.py @@ -16,6 +16,18 @@ def test_returns_400_when_missing_fields(self): rv = self.make_request('post', '/api/users', data={'name': 'User'}, user=admin) self.assertEqual(rv.status_code, 400) + + def test_returns_400_when_using_temporary_email(self): + admin = self.factory.create_admin() + + test_user = {'name': 'User', 'email': 'user@mailinator.com', 'password': 'test'} + rv = self.make_request('post', '/api/users', data=test_user, user=admin) + self.assertEqual(rv.status_code, 400) + + test_user['email'] = 'arik@qq.com' + rv = self.make_request('post', '/api/users', data=test_user, user=admin) + self.assertEqual(rv.status_code, 400) + def test_creates_user(self): admin = self.factory.create_admin() diff --git a/tests/query_runner/test_google_spreadsheets.py b/tests/query_runner/test_google_spreadsheets.py index 29cb878fe7..b9b6031ad3 100644 --- a/tests/query_runner/test_google_spreadsheets.py +++ b/tests/query_runner/test_google_spreadsheets.py @@ -5,7 +5,7 @@ from mock import MagicMock from redash.query_runner import TYPE_DATETIME, TYPE_FLOAT, TYPE_INTEGER -from redash.query_runner.google_spreadsheets import TYPE_BOOLEAN, TYPE_STRING, _guess_type, _value_eval_list, parse_query +from redash.query_runner.google_spreadsheets import TYPE_BOOLEAN, TYPE_STRING, _get_columns_and_column_names, _guess_type, _value_eval_list, parse_query from redash.query_runner.google_spreadsheets import WorksheetNotFoundError, parse_spreadsheet, parse_worksheet @@ -48,17 +48,17 @@ def test_handles_boolean(self): def test_handles_empty_values(self): values = ['', None] converted_values = [None, None] - self.assertEqual(converted_values, _value_eval_list(values)) + self.assertEqual(converted_values, _value_eval_list(values, [TYPE_STRING, TYPE_STRING])) def test_handles_float(self): values = ['3.14', '-273.15'] converted_values = [3.14, -273.15] - self.assertEqual(converted_values, _value_eval_list(values)) + self.assertEqual(converted_values, _value_eval_list(values, [TYPE_FLOAT, TYPE_FLOAT])) def test_handles_datetime(self): values = ['2018-06-28', '2020-2-29'] converted_values = [datetime.datetime(2018, 6, 28, 0, 0), datetime.datetime(2020, 2, 29, 0, 0)] - self.assertEqual(converted_values, _value_eval_list(values)) + self.assertEqual(converted_values, _value_eval_list(values, [TYPE_DATETIME, TYPE_DATETIME])) class TestParseSpreadsheet(TestCase): @@ -106,3 +106,23 @@ class TestParseQuery(TestCase): def test_parse_query(self): parsed = parse_query('key|0') self.assertEqual(('key', 0), parsed) + + +class TestGetColumnsAndColumnNames(TestCase): + def test_get_columns(self): + _columns = ['foo', 'bar', 'baz'] + columns, column_names = _get_columns_and_column_names(_columns) + + self.assertEqual(_columns, column_names) + + def test_get_columns_with_duplicated(self): + _columns = ['foo', 'bar', 'baz', 'foo', 'baz'] + columns, column_names = _get_columns_and_column_names(_columns) + + self.assertEqual(['foo', 'bar', 'baz', 'foo1', 'baz2'], column_names) + + def test_get_columns_with_blank(self): + _columns = ['foo', '', 'baz', ''] + columns, column_names = _get_columns_and_column_names(_columns) + + self.assertEqual(['foo', 'column_B', 'baz', 'column_D'], column_names)