From b2df9de397e4166f7f9e349576b887dead987b38 Mon Sep 17 00:00:00 2001 From: michellethomas Date: Thu, 16 Aug 2018 11:17:22 -0700 Subject: [PATCH 01/13] Upgrading vx responsive to fix ResizeObserver issue (#5647) (cherry picked from commit 2e0418034f2176108a3f72de3f9cc32e6f809851) --- superset/assets/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/superset/assets/package.json b/superset/assets/package.json index 5c8863da2a364..cbb55c3f5f798 100644 --- a/superset/assets/package.json +++ b/superset/assets/package.json @@ -46,7 +46,7 @@ "@data-ui/event-flow": "^0.0.54", "@data-ui/sparkline": "^0.0.54", "@data-ui/xy-chart": "^0.0.61", - "@vx/responsive": "0.0.153", + "@vx/responsive": "0.0.172", "babel-register": "^6.24.1", "bootstrap": "^3.3.6", "bootstrap-slider": "^10.0.0", From 0a3aceef16df66194392c2b95287af892dc05e82 Mon Sep 17 00:00:00 2001 From: Beto Dealmeida Date: Tue, 28 Aug 2018 18:42:48 -0700 Subject: [PATCH 02/13] resolve merge conflicts --- superset/assets/package-lock.json | 21 ---- superset/assets/package.json | 2 +- superset/assets/spec/.eslintrc | 5 + .../javascripts/visualizations/table_spec.jsx | 105 ++++++++++++++++++ superset/assets/src/visualizations/table.js | 7 +- superset/assets/yarn.lock | 2 +- 6 files changed, 117 insertions(+), 25 deletions(-) delete mode 100644 superset/assets/package-lock.json create mode 100644 superset/assets/spec/.eslintrc create mode 100644 superset/assets/spec/javascripts/visualizations/table_spec.jsx diff --git a/superset/assets/package-lock.json b/superset/assets/package-lock.json deleted file mode 100644 index 707bc5caed678..0000000000000 --- a/superset/assets/package-lock.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "name": "superset", - "version": "0.23.0dev", - "lockfileVersion": 1, - "requires": true, - "dependencies": { - "node": { - "version": "9.11.0", - "resolved": "https://registry.npmjs.org/node/-/node-9.11.0.tgz", - "integrity": "sha512-a4HV43+rHSgYaoGVr5PfnpTmiDeL4AmFsXKzRhBbkDLeRjBoQYENHs7mNCHlQRb9VFKRqXD5FDmadQFPznkUuQ==", - "requires": { - "node-bin-setup": "1.0.6" - } - }, - "node-bin-setup": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/node-bin-setup/-/node-bin-setup-1.0.6.tgz", - "integrity": "sha512-uPIxXNis1CRbv1DwqAxkgBk5NFV3s7cMN/Gf556jSw6jBvV7ca4F9lRL/8cALcZecRibeqU+5dFYqFFmzv5a0Q==" - } - } -} diff --git a/superset/assets/package.json b/superset/assets/package.json index cbb55c3f5f798..d235c5e371382 100644 --- a/superset/assets/package.json +++ b/superset/assets/package.json @@ -154,7 +154,7 @@ "less": "^2.6.1", "less-loader": "^4.1.0", "mini-css-extract-plugin": "^0.4.0", - "mocha": "^3.2.0", + "mocha": "^3.5.3", "npm-check-updates": "^2.14.0", "po2json": "^0.4.5", "prettier": "^1.12.1", diff --git a/superset/assets/spec/.eslintrc b/superset/assets/spec/.eslintrc new file mode 100644 index 0000000000000..d9889afc0053a --- /dev/null +++ b/superset/assets/spec/.eslintrc @@ -0,0 +1,5 @@ +{ + "rules": { + "import/no-extraneous-dependencies": ["error", {"devDependencies": true}] + } +} diff --git a/superset/assets/spec/javascripts/visualizations/table_spec.jsx b/superset/assets/spec/javascripts/visualizations/table_spec.jsx new file mode 100644 index 0000000000000..e34472b84b898 --- /dev/null +++ b/superset/assets/spec/javascripts/visualizations/table_spec.jsx @@ -0,0 +1,105 @@ +import { describe, it } from 'mocha'; +import { expect } from 'chai'; +import $ from 'jquery'; + +import '../../helpers/browser'; +import { d3format } from '../../../src/modules/utils'; + +import tableVis from '../../../src/visualizations/table'; + +describe('table viz', () => { + const div = '
'; + const baseSlice = { + selector: '#slice-container', + formData: { + metrics: ['count'], + timeseries_limit_metric: null, + }, + datasource: { + verbose_map: {}, + }, + getFilters: () => {}, + d3format, + removeFilter: null, + addFilter: null, + height: () => 0, + }; + const basePayload = { + data: { + records: [ + { gender: 'boy', count: 39245 }, + { gender: 'girl', count: 36446 }, + ], + columns: ['gender', 'count'], + }, + }; + + it('renders into a container', () => { + $('body').html(div); + const container = $(baseSlice.selector); + expect(container.length).to.equal(1); + }); + + it('renders header and body datatables in container', () => { + $('body').html(div); + const container = $(baseSlice.selector); + + expect(container.find('.dataTable').length).to.equal(0); + tableVis(baseSlice, basePayload); + expect(container.find('.dataTable').length).to.equal(2); + + const tableHeader = container.find('.dataTable')[0]; + expect($(tableHeader).find('thead tr').length).to.equal(1); + expect($(tableHeader).find('th').length).to.equal(2); + + const tableBody = container.find('.dataTable')[1]; + expect($(tableBody).find('tbody tr').length).to.equal(2); + expect($(tableBody).find('th').length).to.equal(2); + }); + + it('hides the sort by column', () => { + $('body').html(div); + const slice = { ...baseSlice }; + slice.formData = { ...baseSlice.formData, + timeseries_limit_metric: { + label: 'SUM(sum_boys)', + }, + }; + const payload = { + data: { + records: [ + { gender: 'boy', count: 39245, 'SUM(sum_boys)': 48133355 }, + { gender: 'girl', count: 36446, 'SUM(sum_boys)': 0 }, + ], + columns: ['gender', 'count', 'SUM(sum_boys)'], + }, + }; + tableVis(slice, payload); + + const container = $(slice.selector); + const tableHeader = container.find('.dataTable')[0]; + expect($(tableHeader).find('th').length).to.equal(2); + }); + + it('works with empty list for sort by', () => { + $('body').html(div); + const slice = { ...baseSlice }; + slice.formData = { ...baseSlice.formData, + timeseries_limit_metric: [], + }; + const payload = { + data: { + records: [ + { gender: 'boy', count: 39245, 'SUM(sum_boys)': 48133355 }, + { gender: 'girl', count: 36446, 'SUM(sum_boys)': 0 }, + ], + columns: ['gender', 'count', 'SUM(sum_boys)'], + }, + }; + tableVis(slice, payload); + + const container = $(slice.selector); + const tableBody = container.find('.dataTable')[1]; + expect($(tableBody).find('th').length).to.equal(3); + }); +}); diff --git a/superset/assets/src/visualizations/table.js b/superset/assets/src/visualizations/table.js index a715d19acbf6d..d1490ecc43166 100644 --- a/superset/assets/src/visualizations/table.js +++ b/superset/assets/src/visualizations/table.js @@ -185,9 +185,12 @@ function tableVis(slice, payload) { container.find('.dataTables_wrapper'), height); // Sorting table by main column let sortBy; - if (fd.timeseries_limit_metric) { + const limitMetric = Array.isArray(fd.timeseries_limit_metric) + ? fd.timeseries_limit_metric[0] + : fd.timeseries_limit_metric; + if (limitMetric) { // Sort by as specified - sortBy = fd.timeseries_limit_metric.label || fd.timeseries_limit_metric; + sortBy = limitMetric.label || limitMetric; } else if (metrics.length > 0) { // If not specified, use the first metric from the list sortBy = metrics[0]; diff --git a/superset/assets/yarn.lock b/superset/assets/yarn.lock index b893cc19a5ddc..3a35b06d90832 100644 --- a/superset/assets/yarn.lock +++ b/superset/assets/yarn.lock @@ -7102,7 +7102,7 @@ mkdirp@0.5.1, mkdirp@0.5.x, "mkdirp@>=0.5 0", mkdirp@^0.5, mkdirp@^0.5.0, mkdirp dependencies: minimist "0.0.8" -mocha@^3.2.0: +mocha@^3.5.3: version "3.5.3" resolved "https://registry.yarnpkg.com/mocha/-/mocha-3.5.3.tgz#1e0480fe36d2da5858d1eb6acc38418b26eaa20d" dependencies: From 7110ec7999cf16a721816b9f7f8934ab60c72928 Mon Sep 17 00:00:00 2001 From: "Hugh A. Miles II" Date: Thu, 30 Aug 2018 23:32:01 -0700 Subject: [PATCH 03/13] update thumbnail (#5782) (cherry picked from commit e12f4fb66d5c17eb41931e48dbf7b5eb752da38a) --- .../images/viz_thumbnails/big_number.png | Bin 10101 -> 103045 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/superset/assets/images/viz_thumbnails/big_number.png b/superset/assets/images/viz_thumbnails/big_number.png index 01d6da45ba992678834bb427502074549d7d50b3..90ac5a5b120aba6d3fbd5dd7e6bba8fac239dba1 100644 GIT binary patch literal 103045 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 XP4UQ$wW1&YUqVw=SLLe`BIN%7X6AQ> From 8b17f09b3a484b8a5e5ada91ee394a70d4e58748 Mon Sep 17 00:00:00 2001 From: Krist Wongsuphasawat Date: Fri, 31 Aug 2018 15:42:44 -0700 Subject: [PATCH 04/13] [SIP-5] Refactor table (#5707) * update indent * extract formData and data. * take filter * remove dependencies * remove removeFilter * add comment * remove columnFormats and verboseMap from props. clarify a few more props * fix linting issue * minor syntax * syntax fix * Move check to adaptor * update unit test * remove code related to .widget * rename variables for clarity * move Option fix to browser.js (cherry picked from commit 8a4b1b7c25a8234ac1641add38645a08fb338dd1) --- superset/assets/spec/helpers/browser.js | 4 + .../javascripts/visualizations/table_spec.jsx | 10 +- superset/assets/src/chart/Chart.jsx | 8 - superset/assets/src/visualizations/table.css | 28 +- superset/assets/src/visualizations/table.js | 260 ++++++++++++------ 5 files changed, 184 insertions(+), 126 deletions(-) diff --git a/superset/assets/spec/helpers/browser.js b/superset/assets/spec/helpers/browser.js index 80ce31539feae..3f824b9fc3a65 100644 --- a/superset/assets/spec/helpers/browser.js +++ b/superset/assets/spec/helpers/browser.js @@ -30,6 +30,10 @@ global.navigator = { appName: 'Netscape', }; +// Fix `Option is not defined` +// https://stackoverflow.com/questions/39501589/jsdom-option-is-not-defined-when-running-my-mocha-test +global.Option = window.Option; + // Configuration copied from https://github.com/sinonjs/sinon/issues/657 // allowing for sinon.fakeServer to work diff --git a/superset/assets/spec/javascripts/visualizations/table_spec.jsx b/superset/assets/spec/javascripts/visualizations/table_spec.jsx index e34472b84b898..f87aae6634924 100644 --- a/superset/assets/spec/javascripts/visualizations/table_spec.jsx +++ b/superset/assets/spec/javascripts/visualizations/table_spec.jsx @@ -1,10 +1,7 @@ import { describe, it } from 'mocha'; import { expect } from 'chai'; import $ from 'jquery'; - import '../../helpers/browser'; -import { d3format } from '../../../src/modules/utils'; - import tableVis from '../../../src/visualizations/table'; describe('table viz', () => { @@ -18,10 +15,9 @@ describe('table viz', () => { datasource: { verbose_map: {}, }, - getFilters: () => {}, - d3format, - removeFilter: null, - addFilter: null, + getFilters: () => ({}), + removeFilter() {}, + addFilter() {}, height: () => 0, }; const basePayload = { diff --git a/superset/assets/src/chart/Chart.jsx b/superset/assets/src/chart/Chart.jsx index ed49eea6849f2..bbb664a435998 100644 --- a/superset/assets/src/chart/Chart.jsx +++ b/superset/assets/src/chart/Chart.jsx @@ -3,7 +3,6 @@ import React from 'react'; import PropTypes from 'prop-types'; import { Tooltip } from 'react-bootstrap'; -import { d3format } from '../modules/utils'; import ChartBody from './ChartBody'; import Loading from '../components/Loading'; import { Logger, LOG_ACTIONS_RENDER_CHART } from '../logger'; @@ -167,13 +166,6 @@ class Chart extends React.PureComponent { ); } - d3format(col, number) { - const { datasource } = this.props; - const format = (datasource.column_formats && datasource.column_formats[col]) || '0.3s'; - - return d3format(format, number); - } - error(e) { this.props.actions.chartRenderingFailed(e, this.props.chartId); } diff --git a/superset/assets/src/visualizations/table.css b/superset/assets/src/visualizations/table.css index 9af0c0e5f5f65..5d1e29a2ac13f 100644 --- a/superset/assets/src/visualizations/table.css +++ b/superset/assets/src/visualizations/table.css @@ -1,39 +1,13 @@ -.slice-grid .widget.table .slice_container { - overflow: auto !important; -} - .slice_container.table table.table { margin: 0px !important; background: transparent; background-color: white; } -.widget.table td.filtered { - background-color: #005a63; - color: white; -} - -.widget.table tr>th { - padding: 1px 5px !important; - font-size: small !important; -} - -.widget.table tr>td { - padding: 1px 5px !important; - font-size: small !important; -} table.table thead th.sorting:after, table.table thead th.sorting_asc:after, table.table thead th.sorting_desc:after { - top: 0px; + top: 0px; } .like-pre { white-space: pre-wrap; } - -.widget.table { - width: auto; - max-width: unset; -} -.widget.table thead tr { - height: 25px; -} diff --git a/superset/assets/src/visualizations/table.js b/superset/assets/src/visualizations/table.js index d1490ecc43166..1e09b834022b3 100644 --- a/superset/assets/src/visualizations/table.js +++ b/superset/assets/src/visualizations/table.js @@ -1,39 +1,94 @@ import d3 from 'd3'; +import $ from 'jquery'; +import PropTypes from 'prop-types'; import dt from 'datatables.net-bs'; import 'datatables.net-bs/css/dataTables.bootstrap.css'; import dompurify from 'dompurify'; - import { fixDataTableBodyHeight, d3TimeFormatPreset } from '../modules/utils'; import './table.css'; -const $ = require('jquery'); - dt(window, $); -function tableVis(slice, payload) { - const container = $(slice.selector); - const fC = d3.format('0,000'); +const propTypes = { + // Each object is { field1: value1, field2: value2 } + data: PropTypes.arrayOf(PropTypes.object), + height: PropTypes.number, + alignPositiveNegative: PropTypes.bool, + colorPositiveNegative: PropTypes.bool, + columns: PropTypes.arrayOf(PropTypes.shape({ + key: PropTypes.string, + label: PropTypes.string, + format: PropTypes.string, + })), + filters: PropTypes.object, + includeSearch: PropTypes.bool, + metrics: PropTypes.arrayOf(PropTypes.oneOfType([ + PropTypes.string, + PropTypes.object, + ])), + onAddFilter: PropTypes.func, + onRemoveFilter: PropTypes.func, + orderDesc: PropTypes.bool, + pageLength: PropTypes.oneOfType([ + PropTypes.number, + PropTypes.string, + ]), + percentMetrics: PropTypes.arrayOf(PropTypes.oneOfType([ + PropTypes.string, + PropTypes.object, + ])), + tableFilter: PropTypes.bool, + tableTimestampFormat: PropTypes.string, + timeseriesLimitMetric: PropTypes.oneOfType([ + PropTypes.string, + PropTypes.object, + ]), +}; + +const formatValue = d3.format('0,000'); +function NOOP() {} - const data = payload.data; - const fd = slice.formData; +function TableVis(element, props) { + PropTypes.checkPropTypes(propTypes, props, 'prop', 'TableVis'); + + const { + data, + height, + alignPositiveNegative = false, + colorPositiveNegative = false, + columns, + filters = {}, + includeSearch = false, + metrics: rawMetrics, + onAddFilter = NOOP, + onRemoveFilter = NOOP, + orderDesc, + pageLength, + percentMetrics, + tableFilter, + tableTimestampFormat, + timeseriesLimitMetric, + } = props; - let metrics = (fd.metrics || []).map(m => m.label || m); - // Add percent metrics - metrics = metrics.concat((fd.percent_metrics || []).map(m => '%' + m)); - // Removing metrics (aggregates) that are strings - metrics = metrics.filter(m => !isNaN(data.records[0][m])); + const $container = $(element); + + const metrics = (rawMetrics || []).map(m => m.label || m) + // Add percent metrics + .concat((percentMetrics || []).map(m => '%' + m)) + // Removing metrics (aggregates) that are strings + .filter(m => !Number.isNaN(data[0][m])); function col(c) { const arr = []; - for (let i = 0; i < data.records.length; i += 1) { - arr.push(data.records[i][c]); + for (let i = 0; i < data.length; i += 1) { + arr.push(data[i][c]); } return arr; } const maxes = {}; const mins = {}; for (let i = 0; i < metrics.length; i += 1) { - if (fd.align_pn) { + if (alignPositiveNegative) { maxes[metrics[i]] = d3.max(col(metrics[i]).map(Math.abs)); } else { maxes[metrics[i]] = d3.max(col(metrics[i])); @@ -41,9 +96,9 @@ function tableVis(slice, payload) { } } - const tsFormatter = d3TimeFormatPreset(fd.table_timestamp_format); + const tsFormatter = d3TimeFormatPreset(tableTimestampFormat); - const div = d3.select(slice.selector); + const div = d3.select(element); div.html(''); const table = div.append('table') .classed( @@ -51,53 +106,36 @@ function tableVis(slice, payload) { 'table-condensed table-hover dataTable no-footer', true) .attr('width', '100%'); - const verboseMap = slice.datasource.verbose_map; - const cols = data.columns.map((c) => { - if (verboseMap[c]) { - return verboseMap[c]; - } - // Handle verbose names for percents - if (c[0] === '%') { - const cName = c.substring(1); - return '% ' + (verboseMap[cName] || cName); - } - return c; - }); - table.append('thead').append('tr') .selectAll('th') - .data(cols) + .data(columns.map(c => c.label)) .enter() .append('th') - .text(function (d) { - return d; - }); + .text(d => d); - const filters = slice.getFilters(); table.append('tbody') .selectAll('tr') - .data(data.records) + .data(data) .enter() .append('tr') .selectAll('td') - .data(row => data.columns.map((c) => { - const val = row[c]; + .data(row => columns.map(({ key, format }) => { + const val = row[key]; let html; - const isMetric = metrics.indexOf(c) >= 0; - if (c === '__timestamp') { + const isMetric = metrics.indexOf(key) >= 0; + if (key === '__timestamp') { html = tsFormatter(val); } if (typeof (val) === 'string') { html = ``; } if (isMetric) { - html = slice.d3format(c, val); - } - if (c[0] === '%') { + html = d3.format(format || '0.3s')(val); + } else if (key[0] === '%') { html = d3.format('.3p')(val); } return { - col: c, + col: key, val, html, isMetric, @@ -107,8 +145,8 @@ function tableVis(slice, payload) { .append('td') .style('background-image', function (d) { if (d.isMetric) { - const r = (fd.color_pn && d.val < 0) ? 150 : 0; - if (fd.align_pn) { + const r = (colorPositiveNegative && d.val < 0) ? 150 : 0; + if (alignPositiveNegative) { const perc = Math.abs(Math.round((d.val / maxes[d.col]) * 100)); // The 0.01 to 0.001 is a workaround for what appears to be a // CSS rendering bug on flat, transparent colors @@ -133,15 +171,8 @@ function tableVis(slice, payload) { return null; }) .classed('text-right', d => d.isMetric) - .attr('title', (d) => { - if (!isNaN(d.val)) { - return fC(d.val); - } - return null; - }) - .attr('data-sort', function (d) { - return (d.isMetric) ? d.val : null; - }) + .attr('title', d => (!Number.isNaN(d.val) ? formatValue(d.val) : null)) + .attr('data-sort', d => (d.isMetric) ? d.val : null) // Check if the dashboard currently has a filter for each row .classed('filtered', d => filters && @@ -149,45 +180,39 @@ function tableVis(slice, payload) { filters[d.col].indexOf(d.val) >= 0, ) .on('click', function (d) { - if (!d.isMetric && fd.table_filter) { + if (!d.isMetric && tableFilter) { const td = d3.select(this); if (td.classed('filtered')) { - slice.removeFilter(d.col, [d.val]); + onRemoveFilter(d.col, [d.val]); d3.select(this).classed('filtered', false); } else { d3.select(this).classed('filtered', true); - slice.addFilter(d.col, [d.val]); + onAddFilter(d.col, [d.val]); } } }) - .style('cursor', function (d) { - return (!d.isMetric) ? 'pointer' : ''; - }) + .style('cursor', d => (!d.isMetric) ? 'pointer' : '') .html(d => d.html ? d.html : d.val); - const height = slice.height(); - let paging = false; - let pageLength; - if (fd.page_length && fd.page_length > 0) { - paging = true; - pageLength = parseInt(fd.page_length, 10); - } - const datatable = container.find('.dataTable').DataTable({ + + const paging = pageLength && pageLength > 0; + + const datatable = $container.find('.dataTable').DataTable({ paging, pageLength, aaSorting: [], - searching: fd.include_search, + searching: includeSearch, bInfo: false, - scrollY: height + 'px', + scrollY: `${height}px`, scrollCollapse: true, scrollX: true, }); - fixDataTableBodyHeight( - container.find('.dataTables_wrapper'), height); + + fixDataTableBodyHeight($container.find('.dataTables_wrapper'), height); // Sorting table by main column let sortBy; - const limitMetric = Array.isArray(fd.timeseries_limit_metric) - ? fd.timeseries_limit_metric[0] - : fd.timeseries_limit_metric; + const limitMetric = Array.isArray(timeseriesLimitMetric) + ? timeseriesLimitMetric[0] + : timeseriesLimitMetric; if (limitMetric) { // Sort by as specified sortBy = limitMetric.label || limitMetric; @@ -196,14 +221,81 @@ function tableVis(slice, payload) { sortBy = metrics[0]; } if (sortBy) { - datatable.column(data.columns.indexOf(sortBy)).order(fd.order_desc ? 'desc' : 'asc'); - } - if (sortBy && metrics.indexOf(sortBy) < 0) { - // Hiding the sortBy column if not in the metrics list - datatable.column(data.columns.indexOf(sortBy)).visible(false); + const keys = columns.map(c => c.key); + const index = keys.indexOf(sortBy); + datatable.column(index).order(orderDesc ? 'desc' : 'asc'); + if (metrics.indexOf(sortBy) < 0) { + // Hiding the sortBy column if not in the metrics list + datatable.column(index).visible(false); + } } datatable.draw(); - container.parents('.widget').find('.tooltip').remove(); } -module.exports = tableVis; +TableVis.propTypes = propTypes; + +function adaptor(slice, payload) { + const { selector, formData, datasource } = slice; + const { + align_pn: alignPositiveNegative, + color_pn: colorPositiveNegative, + include_search: includeSearch, + metrics, + order_desc: orderDesc, + page_length: pageLength, + percent_metrics: percentMetrics, + table_filter: tableFilter, + table_timestamp_format: tableTimestampFormat, + timeseries_limit_metric: timeseriesLimitMetric, + } = formData; + const { + verbose_map: verboseMap, + column_formats: columnFormats, + } = datasource; + + const { records, columns } = payload.data; + + const processedColumns = columns.map((key) => { + let label = verboseMap[key]; + // Handle verbose names for percents + if (!label) { + if (key[0] === '%') { + const cleanedKey = key.substring(1); + label = '% ' + (verboseMap[cleanedKey] || cleanedKey); + } else { + label = key; + } + } + return { + key, + label, + format: columnFormats && columnFormats[key], + }; + }); + + const element = document.querySelector(selector); + + return TableVis(element, { + data: records, + height: slice.height(), + alignPositiveNegative, + colorPositiveNegative, + columns: processedColumns, + filters: slice.getFilters(), + includeSearch, + metrics, + onAddFilter(...args) { slice.addFilter(...args); }, + orderDesc, + pageLength: pageLength && parseInt(pageLength, 10), + percentMetrics, + // Aug 22, 2018 + // Perhaps this `tableFilter` field can be removed as there is + // no code left in repo to set tableFilter to true. + // which make `onAddFilter` will never be called as well. + tableFilter, + tableTimestampFormat, + timeseriesLimitMetric, + }); +} + +export default adaptor; From 69024e3bd6d8a0d9da2555044ed65da612512997 Mon Sep 17 00:00:00 2001 From: Krist Wongsuphasawat Date: Tue, 4 Sep 2018 10:39:05 -0700 Subject: [PATCH 05/13] resolve merge conflicts --- CONTRIBUTING.md | 41 +- superset/assets/package.json | 3 + superset/assets/webpack.config.js | 106 +++- superset/assets/yarn.lock | 810 +++++++++++++++++++++++++++++- 4 files changed, 908 insertions(+), 52 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 7463bc1a5771e..e9d39bce548c9 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -258,23 +258,52 @@ To parse and generate bundled files for superset, run either of the following commands. The `dev` flag will keep the npm script running and re-run it upon any changes within the assets directory. -``` +```bash # Copies a conf file from the frontend to the backend npm run sync-backend # Compiles the production / optimized js & css npm run prod -# Start a web server that manages and updates your assets as you modify them +# Start a watcher that rebundle your assets as you modify them npm run dev + +# Start a web server that manages and updates your assets as you modify them +npm run dev-server ``` -For every development session you will have to start a flask dev server -as well as an npm watcher +For every development session you will have to -``` +1. Start a flask dev server + +```bash +superset runserver -d +# or specify port superset runserver -d -p 8081 -npm run dev +``` + +2. Start webpack dev server + +```bash +npm run dev-server +``` + +This will start `webpack-dev-server` at port 9000 and you can access Superset at localhost:9000. +By default, `webpack-dev-server` is configured for flask running at port 8088. + +If you start flask server at another port (e.g. 8081), you have to pass an extra argument +`supersetPort` to `webpack-dev-server` + +```bash +npm run dev-server -- --supersetPort=8081 +``` + +You can also specify port for `webpack-dev-server` + +```bash +npm run dev-server -- --port=9001 +# or with both dev-server port and superset port +npm run dev-server -- --port=9001 --supersetPort=8081 ``` #### Upgrading npm packages diff --git a/superset/assets/package.json b/superset/assets/package.json index d235c5e371382..3c80d5173bf7d 100644 --- a/superset/assets/package.json +++ b/superset/assets/package.json @@ -12,6 +12,7 @@ "test:one": "mocha --require ignore-styles --compilers js:babel-core/register --require spec/helpers/browser.js", "cover": "babel-node node_modules/.bin/babel-istanbul cover _mocha -- --compilers babel-core/register --require spec/helpers/browser.js --require ignore-styles 'spec/**/*_spec.*'", "dev": "webpack --mode=development --colors --progress --debug --watch", + "dev-server": "webpack-dev-server --mode=development --progress", "prod": "node --max_old_space_size=4096 webpack --mode=production --colors --progress", "build": "webpack --mode=production --colors --progress", "lint": "eslint --ignore-path=.eslintignore --ext .js,.jsx .", @@ -154,6 +155,7 @@ "less": "^2.6.1", "less-loader": "^4.1.0", "mini-css-extract-plugin": "^0.4.0", + "minimist": "^1.2.0", "mocha": "^3.5.3", "npm-check-updates": "^2.14.0", "po2json": "^0.4.5", @@ -169,6 +171,7 @@ "webpack": "^4.6.0", "webpack-assets-manifest": "^3.0.1", "webpack-cli": "^2.0.10", + "webpack-dev-server": "^3.1.7", "webpack-sources": "^1.1.0" } } diff --git a/superset/assets/webpack.config.js b/superset/assets/webpack.config.js index 0291f1d84436f..908ede06f9318 100644 --- a/superset/assets/webpack.config.js +++ b/superset/assets/webpack.config.js @@ -1,15 +1,68 @@ const path = require('path'); +const webpack = require('webpack'); const CleanWebpackPlugin = require('clean-webpack-plugin'); const MiniCssExtractPlugin = require('mini-css-extract-plugin'); const WebpackAssetsManifest = require('webpack-assets-manifest'); +// Parse command-line arguments +const parsedArgs = require('minimist')(process.argv.slice(2)); // input dir const APP_DIR = path.resolve(__dirname, './'); - // output dir const BUILD_DIR = path.resolve(__dirname, './dist'); -const isDevMode = process.env.NODE_ENV !== 'production'; +const { + mode = 'development', + devserverPort = 9000, + supersetPort = 8088, +} = parsedArgs; + +const isDevMode = mode !== 'production'; + +const plugins = [ + // creates a manifest.json mapping of name to hashed output used in template files + new WebpackAssetsManifest({ + publicPath: true, + // This enables us to include all relevant files for an entry + entrypoints: true, + // Also write to disk when using devServer + // instead of only keeping manifest.json in memory + // This is required to make devServer work with flask. + writeToDisk: isDevMode, + }), + + // create fresh dist/ upon build + new CleanWebpackPlugin(['dist']), +]; + +if (isDevMode) { + // Enable hot module replacement + plugins.push(new webpack.HotModuleReplacementPlugin()); + // text loading (webpack 4+) + plugins.push(new MiniCssExtractPlugin({ + filename: '[name].[hash:8].entry.css', + chunkFilename: '[name].[hash:8].chunk.css', + })); +} else { + // text loading (webpack 4+) + plugins.push(new MiniCssExtractPlugin({ + filename: '[name].[chunkhash].entry.css', + chunkFilename: '[name].[chunkhash].chunk.css', + })); +} + +const output = { + path: BUILD_DIR, + publicPath: '/static/assets/dist/', // necessary for lazy-loaded chunks +}; + +if (isDevMode) { + output.filename = '[name].[hash:8].entry.js'; + output.chunkFilename = '[name].[hash:8].chunk.js'; +} else { + output.filename = '[name].[chunkhash].entry.js'; + output.chunkFilename = '[name].[chunkhash].chunk.js'; +} const config = { node: { @@ -25,12 +78,7 @@ const config = { welcome: ['babel-polyfill', APP_DIR + '/src/welcome/index.jsx'], profile: ['babel-polyfill', APP_DIR + '/src/profile/index.jsx'], }, - output: { - path: BUILD_DIR, - publicPath: '/static/assets/dist/', // necessary for lazy-loaded chunks - filename: '[name].[chunkhash].entry.js', - chunkFilename: '[name].[chunkhash].chunk.js', - }, + output, optimization: { splitChunks: { chunks: 'all', @@ -57,13 +105,16 @@ const config = { { test: /\.css$/, include: APP_DIR, - use: [isDevMode ? MiniCssExtractPlugin.loader : 'style-loader', 'css-loader'], + use: [ + MiniCssExtractPlugin.loader, + 'css-loader', + ], }, { test: /\.less$/, include: APP_DIR, use: [ - isDevMode ? MiniCssExtractPlugin.loader : 'style-loader', + MiniCssExtractPlugin.loader, 'css-loader', 'less-loader', ], @@ -97,22 +148,25 @@ const config = { 'react/lib/ExecutionEnvironment': true, 'react/lib/ReactContext': true, }, - plugins: [ - // creates a manifest.json mapping of name to hashed output used in template files - new WebpackAssetsManifest({ - publicPath: true, - entrypoints: true, // this enables us to include all relevant files for an entry - }), - - // create fresh dist/ upon build - new CleanWebpackPlugin(['dist']), - - // text loading (webpack 4+) - new MiniCssExtractPlugin({ - filename: '[name].[chunkhash].entry.css', - chunkFilename: '[name].[chunkhash].chunk.css', - }), - ], + plugins, + devtool: isDevMode ? 'cheap-module-eval-source-map' : false, + devServer: { + historyApiFallback: true, + hot: true, + index: '', // This line is needed to enable root proxying + inline: true, + stats: { colors: true }, + overlay: true, + port: devserverPort, + // Only serves bundled files from webpack-dev-server + // and proxy everything else to Superset backend + proxy: { + context: () => true, + '/': `http://localhost:${supersetPort}`, + target: `http://localhost:${supersetPort}`, + }, + contentBase: path.join(process.cwd(), '../static/assets/dist'), + }, }; module.exports = config; diff --git a/superset/assets/yarn.lock b/superset/assets/yarn.lock index 3a35b06d90832..cfaff12d6438d 100644 --- a/superset/assets/yarn.lock +++ b/superset/assets/yarn.lock @@ -529,11 +529,12 @@ dependencies: lodash "^4.0.8" -"@vx/responsive@0.0.153": - version "0.0.153" - resolved "https://registry.yarnpkg.com/@vx/responsive/-/responsive-0.0.153.tgz#2ce7e819341d2e59ff4151b40e5792aea460e202" +"@vx/responsive@0.0.172": + version "0.0.172" + resolved "https://registry.yarnpkg.com/@vx/responsive/-/responsive-0.0.172.tgz#26db0b946bcb0b1db2025c097c0b365f21ba033d" dependencies: - lodash "^4.0.8" + lodash "^4.17.10" + prop-types "^15.6.1" resize-observer-polyfill "1.5.0" "@vx/responsive@^0.0.165": @@ -816,6 +817,13 @@ abbrev@1.0.x, abbrev@~1.0.9: version "1.0.9" resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.0.9.tgz#91b4792588a7738c25f35dd6f63752a2f8776135" +accepts@~1.3.4, accepts@~1.3.5: + version "1.3.5" + resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.5.tgz#eb777df6011723a3b14e8a72c0805c8e86746bd2" + dependencies: + mime-types "~2.1.18" + negotiator "0.6.1" + acorn-dynamic-import@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/acorn-dynamic-import/-/acorn-dynamic-import-3.0.0.tgz#901ceee4c7faaef7e07ad2a47e890675da50a278" @@ -911,6 +919,10 @@ ansi-align@^2.0.0: dependencies: string-width "^2.0.0" +ansi-colors@^3.0.0: + version "3.0.5" + resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-3.0.5.tgz#cb9dc64993b64fd6945485f797fc3853137d9a7b" + ansi-escapes@^1.0.0: version "1.4.0" resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-1.4.0.tgz#d3a8a83b319aa67793662b13e761c7911422306e" @@ -919,6 +931,10 @@ ansi-escapes@^3.0.0: version "3.1.0" resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-3.1.0.tgz#f73207bb81207d75fd6c83f125af26eea378ca30" +ansi-html@0.0.7: + version "0.0.7" + resolved "https://registry.yarnpkg.com/ansi-html/-/ansi-html-0.0.7.tgz#813584021962a9e9e6fd039f940d12f56ca7859e" + ansi-regex@^2.0.0: version "2.1.1" resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" @@ -1054,6 +1070,14 @@ array-equal@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/array-equal/-/array-equal-1.0.0.tgz#8c2a5ef2472fd9ea742b04c77a75093ba2757c93" +array-find-index@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/array-find-index/-/array-find-index-1.0.2.tgz#df010aa1287e164bbda6f9723b0a96a1ec4187a1" + +array-flatten@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" + array-flatten@^2.1.0: version "2.1.1" resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-2.1.1.tgz#426bb9da84090c1838d812c8150af20a8331e296" @@ -1169,7 +1193,7 @@ async-each@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.1.tgz#19d386a1d9edc6e7c1c85d388aedbcc56d33602d" -async@1.x, async@^1.4.0, async@^1.5.0: +async@1.x, async@^1.4.0, async@^1.5.0, async@^1.5.2: version "1.5.2" resolved "https://registry.yarnpkg.com/async/-/async-1.5.2.tgz#ec6a61ae56480c0c3cb241c95618e20892f9672a" @@ -2075,6 +2099,10 @@ base@^0.11.1: mixin-deep "^1.2.0" pascalcase "^0.1.1" +batch@0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/batch/-/batch-0.6.1.tgz#dc34314f4e679318093fc760272525f94bf25c16" + bcrypt-pbkdf@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz#a4301d389b6a43f9b67ff3ca11a3f6637e360e9e" @@ -2131,6 +2159,32 @@ bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.1.1, bn.js@^4.4.0: version "4.11.8" resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.11.8.tgz#2cde09eb5ee341f484746bb0309b3253b1b1442f" +body-parser@1.18.2: + version "1.18.2" + resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.18.2.tgz#87678a19d84b47d859b83199bd59bce222b10454" + dependencies: + bytes "3.0.0" + content-type "~1.0.4" + debug "2.6.9" + depd "~1.1.1" + http-errors "~1.6.2" + iconv-lite "0.4.19" + on-finished "~2.3.0" + qs "6.5.1" + raw-body "2.3.2" + type-is "~1.6.15" + +bonjour@^3.5.0: + version "3.5.0" + resolved "https://registry.yarnpkg.com/bonjour/-/bonjour-3.5.0.tgz#8e890a183d8ee9a2393b3844c691a42bcf7bc9f5" + dependencies: + array-flatten "^2.1.0" + deep-equal "^1.0.1" + dns-equal "^1.0.0" + dns-txt "^2.0.2" + multicast-dns "^6.0.1" + multicast-dns-service-types "^1.1.0" + boolbase@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/boolbase/-/boolbase-1.0.0.tgz#68dff5fbe60c51eb37725ea9e3ed310dcc1e776e" @@ -2346,6 +2400,10 @@ buffer-from@^1.0.0: version "1.1.1" resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.1.tgz#32713bc028f75c02fdb710d7c7bcec1f2c6070ef" +buffer-indexof@^1.0.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/buffer-indexof/-/buffer-indexof-1.1.1.tgz#52fabcc6a606d1a00302802648ef68f639da268c" + buffer-shims@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/buffer-shims/-/buffer-shims-1.0.0.tgz#9978ce317388c649ad8793028c3477ef044a8b51" @@ -2378,6 +2436,10 @@ builtins@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/builtins/-/builtins-1.0.3.tgz#cb94faeb61c8696451db36534e1422f94f0aee88" +bytes@3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.0.0.tgz#d32815404d689699f85a4ea4fa8755dd13a96048" + cacache@^10.0.4: version "10.0.4" resolved "https://registry.yarnpkg.com/cacache/-/cacache-10.0.4.tgz#6452367999eff9d4188aefd9a14e9d7c6a263460" @@ -2601,7 +2663,7 @@ chokidar@^1.6.1: optionalDependencies: fsevents "^1.0.0" -chokidar@^2.0.2: +chokidar@^2.0.0, chokidar@^2.0.2: version "2.0.4" resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-2.0.4.tgz#356ff4e2b0e8e43e322d18a372460bbcf3accd26" dependencies: @@ -2894,6 +2956,24 @@ component-emitter@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.2.1.tgz#137918d6d78283f7df7a6b7c5a63e140e69425e6" +compressible@~2.0.14: + version "2.0.14" + resolved "https://registry.yarnpkg.com/compressible/-/compressible-2.0.14.tgz#326c5f507fbb055f54116782b969a81b67a29da7" + dependencies: + mime-db ">= 1.34.0 < 2" + +compression@^1.5.2: + version "1.7.3" + resolved "https://registry.yarnpkg.com/compression/-/compression-1.7.3.tgz#27e0e176aaf260f7f2c2813c3e440adb9f1993db" + dependencies: + accepts "~1.3.5" + bytes "3.0.0" + compressible "~2.0.14" + debug "2.6.9" + on-headers "~1.0.1" + safe-buffer "5.1.2" + vary "~1.1.2" + concat-map@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" @@ -2931,6 +3011,10 @@ configstore@^3.0.0: write-file-atomic "^2.0.0" xdg-basedir "^3.0.0" +connect-history-api-fallback@^1.3.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/connect-history-api-fallback/-/connect-history-api-fallback-1.5.0.tgz#b06873934bc5e344fef611a196a6faae0aee015a" + console-browserify@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/console-browserify/-/console-browserify-1.1.0.tgz#f0241c45730a9fc6323b206dbf38edc741d0bb10" @@ -2949,10 +3033,18 @@ contains-path@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/contains-path/-/contains-path-0.1.0.tgz#fe8cf184ff6670b6baef01a9d4861a5cbec4120a" +content-disposition@0.5.2: + version "0.5.2" + resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.2.tgz#0cf68bb9ddf5f2be7961c3a85178cb85dba78cb4" + content-type-parser@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/content-type-parser/-/content-type-parser-1.0.2.tgz#caabe80623e63638b2502fd4c7f12ff4ce2352e7" +content-type@~1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.4.tgz#e138cc75e040c727b1966fe5e5f8c9aee256fe3b" + convert-source-map@^1.1.1, convert-source-map@^1.5.0, convert-source-map@^1.5.1: version "1.5.1" resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.5.1.tgz#b8278097b9bc229365de5c62cf5fcaed8b5599e5" @@ -2961,6 +3053,14 @@ cookie-jar@~0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/cookie-jar/-/cookie-jar-0.3.0.tgz#bc9a27d4e2b97e186cd57c9e2063cb99fa68cccc" +cookie-signature@1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c" + +cookie@0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.3.1.tgz#e7e0a1f9ef43b4c8ba925c5c5a96e806d16873bb" + copy-concurrently@^1.0.0: version "1.0.5" resolved "https://registry.yarnpkg.com/copy-concurrently/-/copy-concurrently-1.0.5.tgz#92297398cae34937fcafd6ec8139c18051f0b5e0" @@ -3046,7 +3146,7 @@ cross-spawn@^5.0.1, cross-spawn@^5.1.0: shebang-command "^1.2.0" which "^1.2.9" -cross-spawn@^6.0.5: +cross-spawn@^6.0.0, cross-spawn@^6.0.5: version "6.0.5" resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4" dependencies: @@ -3230,6 +3330,12 @@ ctype@0.5.3: version "0.5.3" resolved "https://registry.yarnpkg.com/ctype/-/ctype-0.5.3.tgz#82c18c2461f74114ef16c135224ad0b9144ca12f" +currently-unhandled@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/currently-unhandled/-/currently-unhandled-0.4.1.tgz#988df33feab191ef799a61369dd76c17adf957ea" + dependencies: + array-find-index "^1.0.1" + cyclist@~0.2.2: version "0.2.2" resolved "https://registry.yarnpkg.com/cyclist/-/cyclist-0.2.2.tgz#1b33792e11e914a2fd6d6ed6447464444e5fa640" @@ -3456,7 +3562,7 @@ debug@2.6.8: dependencies: ms "2.0.0" -debug@^2.1.2, debug@^2.2.0, debug@^2.3.3, debug@^2.6.8, debug@^2.6.9: +debug@2.6.9, debug@^2.1.2, debug@^2.2.0, debug@^2.3.3, debug@^2.6.6, debug@^2.6.8, debug@^2.6.9: version "2.6.9" resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" dependencies: @@ -3476,6 +3582,12 @@ decamelize@^1.0.0, decamelize@^1.1.1, decamelize@^1.1.2: version "1.2.0" resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" +decamelize@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-2.0.0.tgz#656d7bbc8094c4c788ea53c5840908c9c7d063c7" + dependencies: + xregexp "4.0.0" + decimal.js@9.0.1: version "9.0.1" resolved "https://registry.yarnpkg.com/decimal.js/-/decimal.js-9.0.1.tgz#1cc8b228177da7ab6498c1cc06eb130a290e6e1e" @@ -3504,7 +3616,7 @@ deep-eql@^3.0.0: dependencies: type-detect "^4.0.0" -deep-equal@^1.0.0: +deep-equal@^1.0.0, deep-equal@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-1.0.1.tgz#f5d260292b660e084eff4cdbc9f08ad3247448b5" @@ -3520,6 +3632,13 @@ deepmerge@^1.3.2: version "1.5.2" resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-1.5.2.tgz#10499d868844cdad4fee0842df8c7f6f0c95a753" +default-gateway@^2.6.0: + version "2.7.2" + resolved "https://registry.yarnpkg.com/default-gateway/-/default-gateway-2.7.2.tgz#b7ef339e5e024b045467af403d50348db4642d0f" + dependencies: + execa "^0.10.0" + ip-regex "^2.1.0" + default-require-extensions@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/default-require-extensions/-/default-require-extensions-2.0.0.tgz#f5f8fbb18a7d6d50b21f641f649ebb522cfe24f7" @@ -3574,6 +3693,17 @@ del@^2.0.2: pinkie-promise "^2.0.0" rimraf "^2.2.8" +del@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/del/-/del-3.0.0.tgz#53ecf699ffcbcb39637691ab13baf160819766e5" + dependencies: + globby "^6.1.0" + is-path-cwd "^1.0.0" + is-path-in-cwd "^1.0.0" + p-map "^1.1.1" + pify "^3.0.0" + rimraf "^2.2.8" + delayed-stream@0.0.5: version "0.0.5" resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-0.0.5.tgz#d4b1f43a93e8296dfe02694f4680bc37a313c73f" @@ -3586,6 +3716,14 @@ delegates@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" +depd@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.1.tgz#5783b4e1c459f06fa5ca27f991f3d06e7a310359" + +depd@~1.1.1, depd@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" + des.js@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/des.js/-/des.js-1.0.0.tgz#c074d2e2aa6a8a9a07dbd61f9a15c2cd83ec8ecc" @@ -3593,6 +3731,10 @@ des.js@^1.0.0: inherits "^2.0.1" minimalistic-assert "^1.0.0" +destroy@~1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80" + detect-conflict@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/detect-conflict/-/detect-conflict-1.0.1.tgz#088657a66a961c05019db7c4230883b1c6b4176e" @@ -3607,6 +3749,10 @@ detect-libc@^1.0.2: version "1.0.3" resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-1.0.3.tgz#fa137c4bd698edf55cd5cd02ac559f91a4c4ba9b" +detect-node@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/detect-node/-/detect-node-2.0.3.tgz#a2033c09cc8e158d37748fbde7507832bd6ce127" + dezalgo@^1.0.0, dezalgo@^1.0.1, dezalgo@~1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/dezalgo/-/dezalgo-1.0.3.tgz#7f742de066fc748bc8db820569dddce49bf0d456" @@ -3656,6 +3802,23 @@ dnd-core@^2.6.0: lodash "^4.2.0" redux "^3.7.1" +dns-equal@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/dns-equal/-/dns-equal-1.0.0.tgz#b39e7f1da6eb0a75ba9c17324b34753c47e0654d" + +dns-packet@^1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/dns-packet/-/dns-packet-1.3.1.tgz#12aa426981075be500b910eedcd0b47dd7deda5a" + dependencies: + ip "^1.1.0" + safe-buffer "^5.0.1" + +dns-txt@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/dns-txt/-/dns-txt-2.0.2.tgz#b91d806f5d27188e4ab3e7d107d881a1cc4642b6" + dependencies: + buffer-indexof "^1.0.0" + doctrine@1.5.0: version "1.5.0" resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-1.5.0.tgz#379dce730f6166f76cefa4e6707a159b02c5a6fa" @@ -3770,6 +3933,10 @@ editor@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/editor/-/editor-1.0.0.tgz#60c7f87bd62bcc6a894fa8ccd6afb7823a24f742" +ee-first@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" + ejs@^2.5.9: version "2.6.1" resolved "https://registry.yarnpkg.com/ejs/-/ejs-2.6.1.tgz#498ec0d495655abc6f23cd61868d926464071aa0" @@ -3802,6 +3969,10 @@ emojis-list@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-2.1.0.tgz#4daa4d9db00f9819880c79fa457ae5b09a1fd389" +encodeurl@~1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" + encoding@^0.1.11: version "0.1.12" resolved "https://registry.yarnpkg.com/encoding/-/encoding-0.1.12.tgz#538b66f3ee62cd1ab51ec323829d1f9480c74beb" @@ -3909,6 +4080,10 @@ es6-symbol@^3.0.2, es6-symbol@^3.1.1, es6-symbol@~3.1.1: d "1" es5-ext "~0.10.14" +escape-html@~1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" + escape-latex@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/escape-latex/-/escape-latex-1.1.0.tgz#c0a94a51eb8c73c3a67a95cc90fbb626cef54539" @@ -4150,10 +4325,24 @@ esutils@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.2.tgz#0abf4f1caa5bcb1f7a9d8acc6dea4faaa04bac9b" +etag@~1.8.1: + version "1.8.1" + resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" + +eventemitter3@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-3.1.0.tgz#090b4d6cdbd645ed10bf750d4b5407942d7ba163" + events@^1.0.0: version "1.1.1" resolved "https://registry.yarnpkg.com/events/-/events-1.1.1.tgz#9ebdb7635ad099c70dcc4c2a1f5004288e8bd924" +eventsource@0.1.6: + version "0.1.6" + resolved "https://registry.yarnpkg.com/eventsource/-/eventsource-0.1.6.tgz#0acede849ed7dd1ccc32c811bb11b944d4f29232" + dependencies: + original ">=0.0.5" + evp_bytestokey@^1.0.0, evp_bytestokey@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz#7fcbdb198dc71959432efe13842684e0525acb02" @@ -4161,6 +4350,18 @@ evp_bytestokey@^1.0.0, evp_bytestokey@^1.0.3: md5.js "^1.3.4" safe-buffer "^5.1.1" +execa@^0.10.0: + version "0.10.0" + resolved "https://registry.yarnpkg.com/execa/-/execa-0.10.0.tgz#ff456a8f53f90f8eccc71a96d11bdfc7f082cb50" + dependencies: + cross-spawn "^6.0.0" + get-stream "^3.0.0" + is-stream "^1.1.0" + npm-run-path "^2.0.0" + p-finally "^1.0.0" + signal-exit "^3.0.0" + strip-eof "^1.0.0" + execa@^0.7.0: version "0.7.0" resolved "https://registry.yarnpkg.com/execa/-/execa-0.7.0.tgz#944becd34cc41ee32a63a9faf27ad5a65fc59777" @@ -4226,6 +4427,41 @@ exports-loader@^0.7.0: loader-utils "^1.1.0" source-map "0.5.0" +express@^4.16.2: + version "4.16.3" + resolved "https://registry.yarnpkg.com/express/-/express-4.16.3.tgz#6af8a502350db3246ecc4becf6b5a34d22f7ed53" + dependencies: + accepts "~1.3.5" + array-flatten "1.1.1" + body-parser "1.18.2" + content-disposition "0.5.2" + content-type "~1.0.4" + cookie "0.3.1" + cookie-signature "1.0.6" + debug "2.6.9" + depd "~1.1.2" + encodeurl "~1.0.2" + escape-html "~1.0.3" + etag "~1.8.1" + finalhandler "1.1.1" + fresh "0.5.2" + merge-descriptors "1.0.1" + methods "~1.1.2" + on-finished "~2.3.0" + parseurl "~1.3.2" + path-to-regexp "0.1.7" + proxy-addr "~2.0.3" + qs "6.5.1" + range-parser "~1.2.0" + safe-buffer "5.1.1" + send "0.16.2" + serve-static "1.13.2" + setprototypeof "1.1.0" + statuses "~1.4.0" + type-is "~1.6.16" + utils-merge "1.0.1" + vary "~1.1.2" + extend-shallow@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f" @@ -4338,6 +4574,18 @@ fault@^1.0.2: dependencies: format "^0.2.2" +faye-websocket@^0.10.0: + version "0.10.0" + resolved "https://registry.yarnpkg.com/faye-websocket/-/faye-websocket-0.10.0.tgz#4e492f8d04dfb6f89003507f6edbf2d501e7c6f4" + dependencies: + websocket-driver ">=0.5.1" + +faye-websocket@~0.11.0: + version "0.11.1" + resolved "https://registry.yarnpkg.com/faye-websocket/-/faye-websocket-0.11.1.tgz#f0efe18c4f56e4f40afc7e06c719fd5ee6188f38" + dependencies: + websocket-driver ">=0.5.1" + fbjs@^0.8.1, fbjs@^0.8.4, fbjs@^0.8.9: version "0.8.17" resolved "https://registry.yarnpkg.com/fbjs/-/fbjs-0.8.17.tgz#c4d598ead6949112653d6588b01a5cdcd9f90fdd" @@ -4411,6 +4659,18 @@ fill-range@^4.0.0: repeat-string "^1.6.1" to-regex-range "^2.1.0" +finalhandler@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.1.1.tgz#eebf4ed840079c83f4249038c9d703008301b105" + dependencies: + debug "2.6.9" + encodeurl "~1.0.2" + escape-html "~1.0.3" + on-finished "~2.3.0" + parseurl "~1.3.2" + statuses "~1.4.0" + unpipe "~1.0.0" + find-cache-dir@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-1.0.0.tgz#9288e3e9e3cc3748717d39eade17cf71fc30ee6f" @@ -4432,6 +4692,12 @@ find-up@^2.0.0, find-up@^2.1.0: dependencies: locate-path "^2.0.0" +find-up@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-3.0.0.tgz#49169f1d7993430646da61ecc5ae355c21c97b73" + dependencies: + locate-path "^3.0.0" + first-chunk-stream@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/first-chunk-stream/-/first-chunk-stream-2.0.0.tgz#1bdecdb8e083c0664b91945581577a43a9f31d70" @@ -4473,6 +4739,12 @@ flush-write-stream@^1.0.0: inherits "^2.0.1" readable-stream "^2.0.4" +follow-redirects@^1.0.0: + version "1.5.7" + resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.5.7.tgz#a39e4804dacb90202bca76a9e2ac10433ca6a69a" + dependencies: + debug "^3.1.0" + for-each@^0.3.2: version "0.3.3" resolved "https://registry.yarnpkg.com/for-each/-/for-each-0.3.3.tgz#69b447e88a0a5d32c3e7084f3f1710034b21376e" @@ -4537,6 +4809,10 @@ format@^0.2.2: version "0.2.2" resolved "https://registry.yarnpkg.com/format/-/format-0.2.2.tgz#d6170107e9efdc4ed30c9dc39016df942b5cb58b" +forwarded@~0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.1.2.tgz#98c23dab1175657b8c0573e8ceccd91b0ff18c84" + fraction.js@4.0.4: version "4.0.4" resolved "https://registry.yarnpkg.com/fraction.js/-/fraction.js-4.0.4.tgz#04e567110718adf7b52974a10434ab4c67a5183e" @@ -4547,6 +4823,10 @@ fragment-cache@^0.2.1: dependencies: map-cache "^0.2.2" +fresh@0.5.2: + version "0.5.2" + resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" + from2@^2.1.0, from2@^2.1.1: version "2.3.0" resolved "https://registry.yarnpkg.com/from2/-/from2-2.3.0.tgz#8bfb5502bde4a4d36cfdeea007fcca21d7e382af" @@ -4959,6 +5239,16 @@ globby@^5.0.0: pify "^2.0.0" pinkie-promise "^2.0.0" +globby@^6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/globby/-/globby-6.1.0.tgz#f5a6d70e8395e21c858fb0489d64df02424d506c" + dependencies: + array-union "^1.0.1" + glob "^7.0.3" + object-assign "^4.0.1" + pify "^2.0.0" + pinkie-promise "^2.0.0" + globby@^7.1.1: version "7.1.1" resolved "https://registry.yarnpkg.com/globby/-/globby-7.1.1.tgz#fb2ccff9401f8600945dfada97440cca972b8680" @@ -5074,6 +5364,10 @@ hammerjs@^2.0.8: version "2.0.8" resolved "https://registry.yarnpkg.com/hammerjs/-/hammerjs-2.0.8.tgz#04ef77862cff2bb79d30f7692095930222bf60f1" +handle-thing@^1.2.5: + version "1.2.5" + resolved "https://registry.yarnpkg.com/handle-thing/-/handle-thing-1.2.5.tgz#fd7aad726bf1a5fd16dfc29b2f7a6601d27139c4" + handlebars@^4.0.1, handlebars@^4.0.3: version "4.0.11" resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.0.11.tgz#630a35dfe0294bc281edae6ffc5d329fc7982dcc" @@ -5273,6 +5567,15 @@ hosted-git-info@~2.1.5: version "2.1.5" resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.1.5.tgz#0ba81d90da2e25ab34a332e6ec77936e1598118b" +hpack.js@^2.1.6: + version "2.1.6" + resolved "https://registry.yarnpkg.com/hpack.js/-/hpack.js-2.1.6.tgz#87774c0949e513f42e84575b3c45681fade2a0b2" + dependencies: + inherits "^2.0.1" + obuf "^1.0.0" + readable-stream "^2.0.1" + wbuf "^1.1.0" + html-comment-regex@^1.1.0: version "1.1.1" resolved "https://registry.yarnpkg.com/html-comment-regex/-/html-comment-regex-1.1.1.tgz#668b93776eaae55ebde8f3ad464b307a4963625e" @@ -5283,6 +5586,10 @@ html-encoding-sniffer@^1.0.1: dependencies: whatwg-encoding "^1.0.1" +html-entities@^1.2.0: + version "1.2.1" + resolved "https://registry.yarnpkg.com/html-entities/-/html-entities-1.2.1.tgz#0df29351f0721163515dfb9e5543e5f6eed5162f" + htmlparser2@^3.9.1: version "3.9.2" resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-3.9.2.tgz#1bdf87acca0f3f9e53fa4fcceb0f4b4cbb00b338" @@ -5298,6 +5605,49 @@ http-cache-semantics@3.8.1: version "3.8.1" resolved "https://registry.yarnpkg.com/http-cache-semantics/-/http-cache-semantics-3.8.1.tgz#39b0e16add9b605bf0a9ef3d9daaf4843b4cacd2" +http-deceiver@^1.2.7: + version "1.2.7" + resolved "https://registry.yarnpkg.com/http-deceiver/-/http-deceiver-1.2.7.tgz#fa7168944ab9a519d337cb0bec7284dc3e723d87" + +http-errors@1.6.2: + version "1.6.2" + resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.6.2.tgz#0a002cc85707192a7e7946ceedc11155f60ec736" + dependencies: + depd "1.1.1" + inherits "2.0.3" + setprototypeof "1.0.3" + statuses ">= 1.3.1 < 2" + +http-errors@~1.6.2: + version "1.6.3" + resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.6.3.tgz#8b55680bb4be283a0b5bf4ea2e38580be1d9320d" + dependencies: + depd "~1.1.2" + inherits "2.0.3" + setprototypeof "1.1.0" + statuses ">= 1.4.0 < 2" + +http-parser-js@>=0.4.0: + version "0.4.13" + resolved "https://registry.yarnpkg.com/http-parser-js/-/http-parser-js-0.4.13.tgz#3bd6d6fde6e3172c9334c3b33b6c193d80fe1137" + +http-proxy-middleware@~0.18.0: + version "0.18.0" + resolved "http://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-0.18.0.tgz#0987e6bb5a5606e5a69168d8f967a87f15dd8aab" + dependencies: + http-proxy "^1.16.2" + is-glob "^4.0.0" + lodash "^4.17.5" + micromatch "^3.1.9" + +http-proxy@^1.16.2: + version "1.17.0" + resolved "https://registry.yarnpkg.com/http-proxy/-/http-proxy-1.17.0.tgz#7ad38494658f84605e2f6db4436df410f4e5be9a" + dependencies: + eventemitter3 "^3.0.0" + follow-redirects "^1.0.0" + requires-port "^1.0.0" + http-signature@~0.10.0: version "0.10.1" resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-0.10.1.tgz#4fbdac132559aa8323121e540779c0a012b27e66" @@ -5513,6 +5863,13 @@ inquirer@^5.2.0: strip-ansi "^4.0.0" through "^2.3.6" +internal-ip@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/internal-ip/-/internal-ip-3.0.1.tgz#df5c99876e1d2eb2ea2d74f520e3f669a00ece27" + dependencies: + default-gateway "^2.6.0" + ipaddr.js "^1.5.2" + interpret@^1.0.0, interpret@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.1.0.tgz#7ed1b1410c6a0e0f78cf95d3b8440c63f78b8614" @@ -5538,6 +5895,22 @@ ip-regex@^1.0.1: version "1.0.3" resolved "https://registry.yarnpkg.com/ip-regex/-/ip-regex-1.0.3.tgz#dc589076f659f419c222039a33316f1c7387effd" +ip-regex@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/ip-regex/-/ip-regex-2.1.0.tgz#fa78bf5d2e6913c911ce9f819ee5146bb6d844e9" + +ip@^1.1.0, ip@^1.1.5: + version "1.1.5" + resolved "https://registry.yarnpkg.com/ip/-/ip-1.1.5.tgz#bdded70114290828c0a039e72ef25f5aaec4354a" + +ipaddr.js@1.8.0: + version "1.8.0" + resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.8.0.tgz#eaa33d6ddd7ace8f7f6fe0c9ca0440e706738b1e" + +ipaddr.js@^1.5.2: + version "1.8.1" + resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.8.1.tgz#fa4b79fa47fd3def5e3b159825161c0a519c9427" + is-absolute-url@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/is-absolute-url/-/is-absolute-url-2.1.0.tgz#50530dfb84fcc9aa7dbe7852e83a37b93b9f2aa6" @@ -5872,6 +6245,10 @@ is-word-character@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/is-word-character/-/is-word-character-1.0.2.tgz#46a5dac3f2a1840898b91e576cd40d493f3ae553" +is-wsl@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-1.1.0.tgz#1f16e4aa22b04d1336b66188a66af3c600c3a66d" + is@~0.2.6: version "0.2.7" resolved "https://registry.yarnpkg.com/is/-/is-0.2.7.tgz#3b34a2c48f359972f35042849193ae7264b63562" @@ -6214,7 +6591,7 @@ json-stringify-safe@~5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" -json3@3.3.2: +json3@3.3.2, json3@^3.3.2: version "3.3.2" resolved "https://registry.yarnpkg.com/json3/-/json3-3.3.2.tgz#3c0434743df93e2f5c42aee7b19bcb483575f4e1" @@ -6284,6 +6661,10 @@ keyv@3.0.0: dependencies: json-buffer "3.0.0" +killable@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/killable/-/killable-1.0.0.tgz#da8b84bd47de5395878f95d64d02f2449fe05e6b" + kind-of@^3.0.2, kind-of@^3.0.3, kind-of@^3.2.0: version "3.2.2" resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64" @@ -6453,6 +6834,13 @@ locate-path@^2.0.0: p-locate "^2.0.0" path-exists "^3.0.0" +locate-path@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-3.0.0.tgz#dbec3b3ab759758071b58fe59fc41871af21400e" + dependencies: + p-locate "^3.0.0" + path-exists "^3.0.0" + lockfile@~1.0.2: version "1.0.4" resolved "https://registry.yarnpkg.com/lockfile/-/lockfile-1.0.4.tgz#07f819d25ae48f87e538e6578b6964a4981a5609" @@ -6652,6 +7040,10 @@ log-update@^1.0.2: ansi-escapes "^1.0.0" cli-cursor "^1.0.2" +loglevel@^1.4.1: + version "1.6.1" + resolved "https://registry.yarnpkg.com/loglevel/-/loglevel-1.6.1.tgz#e0fc95133b6ef276cdc8887cdaf24aa6f156f8fa" + loglevelnext@^1.0.1: version "1.0.5" resolved "https://registry.yarnpkg.com/loglevelnext/-/loglevelnext-1.0.5.tgz#36fc4f5996d6640f539ff203ba819641680d75a2" @@ -6681,6 +7073,13 @@ loose-envify@^1.0.0, loose-envify@^1.1.0, loose-envify@^1.3.0, loose-envify@^1.3 dependencies: js-tokens "^3.0.0 || ^4.0.0" +loud-rejection@^1.6.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/loud-rejection/-/loud-rejection-1.6.0.tgz#5b46f80147edee578870f086d04821cf998e551f" + dependencies: + currently-unhandled "^0.4.1" + signal-exit "^3.0.0" + lowercase-keys@1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-1.0.0.tgz#4e3366b39e7f5457e35f1324bdf6f88d0bfc7306" @@ -6887,6 +7286,10 @@ mdast-add-list-metadata@^1.0.1: dependencies: unist-util-visit-parents "1.1.2" +media-typer@0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" + mem-fs-editor@^4.0.0: version "4.0.3" resolved "https://registry.yarnpkg.com/mem-fs-editor/-/mem-fs-editor-4.0.3.tgz#d282a0c4e0d796e9eff9d75661f25f68f389af53" @@ -6924,6 +7327,10 @@ memory-fs@^0.4.0, memory-fs@~0.4.1: errno "^0.1.3" readable-stream "^2.0.1" +merge-descriptors@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61" + merge-source-map@1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/merge-source-map/-/merge-source-map-1.0.4.tgz#a5de46538dae84d4114cc5ea02b4772a6346701f" @@ -6934,6 +7341,10 @@ merge2@^1.2.1: version "1.2.2" resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.2.2.tgz#03212e3da8d86c4d8523cebd6318193414f94e34" +methods@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" + micromatch@^2.1.5, micromatch@^2.3.7: version "2.3.11" resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-2.3.11.tgz#86677c97d1720b363431d04d0d15293bd38c1565" @@ -6952,7 +7363,7 @@ micromatch@^2.1.5, micromatch@^2.3.7: parse-glob "^3.0.4" regex-cache "^0.4.2" -micromatch@^3.1.10, micromatch@^3.1.4, micromatch@^3.1.8: +micromatch@^3.1.10, micromatch@^3.1.4, micromatch@^3.1.8, micromatch@^3.1.9: version "3.1.10" resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.10.tgz#70859bc95c9840952f359a068a3fc49f9ecfac23" dependencies: @@ -6977,6 +7388,10 @@ miller-rabin@^4.0.0: bn.js "^4.0.0" brorand "^1.0.1" +"mime-db@>= 1.34.0 < 2", mime-db@~1.36.0: + version "1.36.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.36.0.tgz#5020478db3c7fe93aad7bbcc4dcf869c43363397" + mime-db@~1.35.0: version "1.35.0" resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.35.0.tgz#0569d657466491283709663ad379a99b90d9ab47" @@ -6987,11 +7402,21 @@ mime-types@^2.1.11, mime-types@^2.1.12, mime-types@~2.1.17, mime-types@~2.1.7: dependencies: mime-db "~1.35.0" +mime-types@~2.1.18: + version "2.1.20" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.20.tgz#930cb719d571e903738520f8470911548ca2cc19" + dependencies: + mime-db "~1.36.0" + +mime@1.4.1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/mime/-/mime-1.4.1.tgz#121f9ebc49e3766f311a76e1fa1c8003c4b03aa6" + mime@^1.2.11, mime@^1.3.4: version "1.6.0" resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" -mime@^2.0.3: +mime@^2.0.3, mime@^2.3.1: version "2.3.1" resolved "https://registry.yarnpkg.com/mime/-/mime-2.3.1.tgz#b1621c54d63b97c47d3cfe7f7215f7d64517c369" @@ -7162,6 +7587,17 @@ multi-stage-sourcemap@^0.2.1: dependencies: source-map "^0.1.34" +multicast-dns-service-types@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/multicast-dns-service-types/-/multicast-dns-service-types-1.1.0.tgz#899f11d9686e5e05cb91b35d5f0e63b773cfc901" + +multicast-dns@^6.0.1: + version "6.2.3" + resolved "https://registry.yarnpkg.com/multicast-dns/-/multicast-dns-6.2.3.tgz#a0ec7bd9055c4282f790c3c82f4e28db3b31b229" + dependencies: + dns-packet "^1.3.1" + thunky "^1.0.2" + multimatch@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/multimatch/-/multimatch-2.1.0.tgz#9c7906a22fb4c02919e2f5f75161b4cdbd4b2a2b" @@ -7215,6 +7651,10 @@ needle@^2.2.1: iconv-lite "^0.4.4" sax "^1.2.4" +negotiator@0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.1.tgz#2b327184e8992101177b28563fb5e7102acd0ca9" + neo-async@^2.5.0: version "2.5.1" resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.5.1.tgz#acb909e327b1e87ec9ef15f41b8a269512ad41ee" @@ -7255,6 +7695,10 @@ node-fetch@^1.0.1: encoding "^0.1.11" is-stream "^1.0.1" +node-forge@0.7.5: + version "0.7.5" + resolved "https://registry.yarnpkg.com/node-forge/-/node-forge-0.7.5.tgz#6c152c345ce11c52f465c2abd957e8639cd674df" + node-gyp@~3.4.0: version "3.4.0" resolved "https://registry.yarnpkg.com/node-gyp/-/node-gyp-3.4.0.tgz#dda558393b3ecbbe24c9e6b8703c71194c63fa36" @@ -7647,7 +8091,7 @@ object-is@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/object-is/-/object-is-1.0.1.tgz#0aa60ec9989a0b3ed795cf4d06f62cf1ad6539b6" -object-keys@^1.0.11, object-keys@^1.0.12, object-keys@^1.0.6, object-keys@^1.0.8: +object-keys@^1.0.11, object-keys@^1.0.6, object-keys@^1.0.8, object-keys@^1.0.9: version "1.0.12" resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.0.12.tgz#09c53855377575310cca62f55bb334abff7b3ed2" @@ -7705,6 +8149,20 @@ object.values@^1.0.4: function-bind "^1.1.0" has "^1.0.1" +obuf@^1.0.0, obuf@^1.1.1: + version "1.1.2" + resolved "https://registry.yarnpkg.com/obuf/-/obuf-1.1.2.tgz#09bea3343d41859ebd446292d11c9d4db619084e" + +on-finished@~2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947" + dependencies: + ee-first "1.1.1" + +on-headers@~1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/on-headers/-/on-headers-1.0.1.tgz#928f5d0f470d49342651ea6794b0857c100693f7" + once@1.x, once@^1.3.0, once@^1.3.1, once@^1.3.3, once@^1.4.0, once@~1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" @@ -7725,6 +8183,12 @@ opener@~1.4.2: version "1.4.3" resolved "https://registry.yarnpkg.com/opener/-/opener-1.4.3.tgz#5c6da2c5d7e5831e8ffa3964950f8d6674ac90b8" +opn@^5.1.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/opn/-/opn-5.3.0.tgz#64871565c863875f052cfdf53d3e3cb5adb53b1c" + dependencies: + is-wsl "^1.1.0" + optimist@0.3: version "0.3.7" resolved "https://registry.yarnpkg.com/optimist/-/optimist-0.3.7.tgz#c90941ad59e4273328923074d2cf2e7cbc6ec0d9" @@ -7758,6 +8222,12 @@ ora@^0.2.3: cli-spinners "^0.1.2" object-assign "^4.0.1" +original@>=0.0.5: + version "1.0.2" + resolved "https://registry.yarnpkg.com/original/-/original-1.0.2.tgz#e442a61cffe1c5fd20a65f3261c26663b303f25f" + dependencies: + url-parse "^1.4.3" + os-browserify@^0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/os-browserify/-/os-browserify-0.3.0.tgz#854373c7f5c2315914fc9bfc6bd8238fdda1ec27" @@ -7825,12 +8295,24 @@ p-limit@^1.1.0: dependencies: p-try "^1.0.0" +p-limit@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.0.0.tgz#e624ed54ee8c460a778b3c9f3670496ff8a57aec" + dependencies: + p-try "^2.0.0" + p-locate@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-2.0.0.tgz#20a0103b222a70c8fd39cc2e580680f3dde5ec43" dependencies: p-limit "^1.1.0" +p-locate@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-3.0.0.tgz#322d69a05c0264b25997d9f40cd8a891ab0064a4" + dependencies: + p-limit "^2.0.0" + p-map@^1.1.1: version "1.2.0" resolved "https://registry.yarnpkg.com/p-map/-/p-map-1.2.0.tgz#e4e94f311eabbc8633a1e79908165fca26241b6b" @@ -7855,6 +8337,10 @@ p-try@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/p-try/-/p-try-1.0.0.tgz#cbc79cdbaf8fd4228e13f621f2b1a237c1b207b3" +p-try@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.0.0.tgz#85080bb87c64688fa47996fe8f7dfbe8211760b1" + package-json-versionify@^1.0.2: version "1.0.4" resolved "https://registry.yarnpkg.com/package-json-versionify/-/package-json-versionify-1.0.4.tgz#5860587a944873a6b7e6d26e8e51ffb22315bf17" @@ -7965,6 +8451,10 @@ parse5@^1.5.1: version "1.5.1" resolved "https://registry.yarnpkg.com/parse5/-/parse5-1.5.1.tgz#9b7f3b0de32be78dc2401b17573ccaf0f6f59d94" +parseurl@~1.3.2: + version "1.3.2" + resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.2.tgz#fc289d4ed8993119460c156253262cdc8de65bf3" + pascalcase@^0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/pascalcase/-/pascalcase-0.1.1.tgz#b363e55e8006ca6fe21784d2db22bd15d7917f14" @@ -7983,7 +8473,7 @@ path-dirname@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/path-dirname/-/path-dirname-1.0.2.tgz#cc33d24d525e099a5388c0336c6e32b9160609e0" -path-exists@^2.0.0: +path-exists@^2.0.0, path-exists@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-2.1.0.tgz#0feb6c64f0fc518d9a754dd5efb62c7022761f4b" dependencies: @@ -8009,6 +8499,10 @@ path-parse@^1.0.5: version "1.0.6" resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.6.tgz#d62dbb5679405d72c4737ec58600e9ddcf06d24c" +path-to-regexp@0.1.7: + version "0.1.7" + resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c" + path-to-regexp@^1.7.0: version "1.7.0" resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-1.7.0.tgz#59fde0f435badacba103a84e9d3bc64e96b9937d" @@ -8107,6 +8601,14 @@ po2json@^0.4.5: gettext-parser "1.1.0" nomnom "1.8.1" +portfinder@^1.0.9: + version "1.0.17" + resolved "https://registry.yarnpkg.com/portfinder/-/portfinder-1.0.17.tgz#a8a1691143e46c4735edefcf4fbcccedad26456a" + dependencies: + async "^1.5.2" + debug "^2.2.0" + mkdirp "0.5.x" + posix-character-classes@^0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab" @@ -8469,6 +8971,13 @@ protocol-buffers-schema@^3.3.1: version "3.3.2" resolved "https://registry.yarnpkg.com/protocol-buffers-schema/-/protocol-buffers-schema-3.3.2.tgz#00434f608b4e8df54c59e070efeefc37fb4bb859" +proxy-addr@~2.0.3: + version "2.0.4" + resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.4.tgz#ecfc733bf22ff8c6f407fa275327b9ab67e48b93" + dependencies: + forwarded "~0.1.2" + ipaddr.js "1.8.0" + prr@~1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/prr/-/prr-1.0.1.tgz#d3fc114ba06995a45ec6893f484ceb1d78f5f476" @@ -8522,6 +9031,10 @@ q@^1.1.2: version "1.5.1" resolved "https://registry.yarnpkg.com/q/-/q-1.5.1.tgz#7e32f75b41381291d04611f1bf14109ac00651d7" +qs@6.5.1: + version "6.5.1" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.1.tgz#349cdf6eef89ec45c12d7d5eb3fc0c870343a6d8" + qs@~0.6.0: version "0.6.6" resolved "https://registry.yarnpkg.com/qs/-/qs-0.6.6.tgz#6e015098ff51968b8a3c819001d5f2c89bc4b107" @@ -8561,6 +9074,10 @@ querystring@0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/querystring/-/querystring-0.2.0.tgz#b209849203bb25df820da756e747005878521620" +querystringify@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/querystringify/-/querystringify-2.0.0.tgz#fa3ed6e68eb15159457c89b37bc6472833195755" + quickselect@^1.0.0: version "1.1.1" resolved "https://registry.yarnpkg.com/quickselect/-/quickselect-1.1.1.tgz#852e412ce418f237ad5b660d70cffac647ae94c2" @@ -8600,6 +9117,19 @@ randomfill@^1.0.3: randombytes "^2.0.5" safe-buffer "^5.1.0" +range-parser@^1.0.3, range-parser@~1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.0.tgz#f49be6b487894ddc40dcc94a322f611092e00d5e" + +raw-body@2.3.2: + version "2.3.2" + resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.3.2.tgz#bcd60c77d3eb93cde0050295c3f379389bc88f89" + dependencies: + bytes "3.0.0" + http-errors "1.6.2" + iconv-lite "0.4.19" + unpipe "1.0.0" + rc-config-loader@^2.0.1: version "2.0.2" resolved "https://registry.yarnpkg.com/rc-config-loader/-/rc-config-loader-2.0.2.tgz#46eb2f98fb5b2aa7b1119d66c0554de5133f1bc1" @@ -9066,7 +9596,7 @@ read@1, read@~1.0.1, read@~1.0.5, read@~1.0.7: dependencies: mute-stream "~0.0.4" -"readable-stream@1 || 2", readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.0.4, readable-stream@^2.0.6, readable-stream@^2.1.5, readable-stream@^2.2.2, readable-stream@^2.3.3, readable-stream@^2.3.5, readable-stream@^2.3.6, readable-stream@~2.3.3: +"readable-stream@1 || 2", readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.0.4, readable-stream@^2.0.6, readable-stream@^2.1.5, readable-stream@^2.2.2, readable-stream@^2.2.9, readable-stream@^2.3.3, readable-stream@^2.3.5, readable-stream@^2.3.6, readable-stream@~2.3.3: version "2.3.6" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.6.tgz#b11c27d88b8ff1fbe070643cf94b0c79ae1b0aaf" dependencies: @@ -9446,7 +9976,7 @@ require-directory@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" -require-from-string@^2.0.2: +require-from-string@^2.0.1: version "2.0.2" resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-2.0.2.tgz#89a7fdd938261267318eafe14f9c32e598c36909" @@ -9465,6 +9995,10 @@ require-uncached@^1.0.3: caller-path "^0.1.0" resolve-from "^1.0.0" +requires-port@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff" + resize-observer-polyfill@1.5.0: version "1.5.0" resolved "https://registry.yarnpkg.com/resize-observer-polyfill/-/resize-observer-polyfill-1.5.0.tgz#660ff1d9712a2382baa2cad450a4716209f9ca69" @@ -9605,7 +10139,11 @@ rxjs@^6.1.0: dependencies: tslib "^1.9.0" -safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1: +safe-buffer@5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.1.tgz#893312af69b2123def71f57889001671eeb2c853" + +safe-buffer@5.1.2, safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1: version "5.1.2" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" @@ -9668,6 +10206,16 @@ seer@^0.2.4: version "0.2.4" resolved "https://registry.yarnpkg.com/seer/-/seer-0.2.4.tgz#6b8a81d09bfe6b3b3ad0268971a65e7f7405135c" +select-hose@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/select-hose/-/select-hose-2.0.0.tgz#625d8658f865af43ec962bfc376a37359a4994ca" + +selfsigned@^1.9.1: + version "1.10.3" + resolved "https://registry.yarnpkg.com/selfsigned/-/selfsigned-1.10.3.tgz#d628ecf9e3735f84e8bafba936b3cf85bea43823" + dependencies: + node-forge "0.7.5" + semver-diff@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/semver-diff/-/semver-diff-2.1.0.tgz#4bbb8437c8d37e4b0cf1a68fd726ec6d645d6d36" @@ -9694,10 +10242,49 @@ semver@~5.3.0: version "5.3.0" resolved "https://registry.yarnpkg.com/semver/-/semver-5.3.0.tgz#9b2ce5d3de02d17c6012ad326aa6b4d0cf54f94f" +send@0.16.2: + version "0.16.2" + resolved "https://registry.yarnpkg.com/send/-/send-0.16.2.tgz#6ecca1e0f8c156d141597559848df64730a6bbc1" + dependencies: + debug "2.6.9" + depd "~1.1.2" + destroy "~1.0.4" + encodeurl "~1.0.2" + escape-html "~1.0.3" + etag "~1.8.1" + fresh "0.5.2" + http-errors "~1.6.2" + mime "1.4.1" + ms "2.0.0" + on-finished "~2.3.0" + range-parser "~1.2.0" + statuses "~1.4.0" + serialize-javascript@^1.4.0: version "1.5.0" resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-1.5.0.tgz#1aa336162c88a890ddad5384baebc93a655161fe" +serve-index@^1.7.2: + version "1.9.1" + resolved "https://registry.yarnpkg.com/serve-index/-/serve-index-1.9.1.tgz#d3768d69b1e7d82e5ce050fff5b453bea12a9239" + dependencies: + accepts "~1.3.4" + batch "0.6.1" + debug "2.6.9" + escape-html "~1.0.3" + http-errors "~1.6.2" + mime-types "~2.1.17" + parseurl "~1.3.2" + +serve-static@1.13.2: + version "1.13.2" + resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.13.2.tgz#095e8472fd5b46237db50ce486a43f4b86c6cec1" + dependencies: + encodeurl "~1.0.2" + escape-html "~1.0.3" + parseurl "~1.3.2" + send "0.16.2" + set-blocking@^2.0.0, set-blocking@~2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" @@ -9728,6 +10315,14 @@ setimmediate@^1.0.4, setimmediate@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285" +setprototypeof@1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.0.3.tgz#66567e37043eeb4f04d91bd658c0cbefb55b8e04" + +setprototypeof@1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.0.tgz#d0bd85536887b6fe7c0d818cb962d9d91c54e656" + sha.js@^2.4.0, sha.js@^2.4.8: version "2.4.11" resolved "https://registry.yarnpkg.com/sha.js/-/sha.js-2.4.11.tgz#37a5cf0b81ecbc6943de109ba2960d1b26584ae7" @@ -9868,6 +10463,24 @@ sntp@1.x.x: dependencies: hoek "2.x.x" +sockjs-client@1.1.5: + version "1.1.5" + resolved "https://registry.yarnpkg.com/sockjs-client/-/sockjs-client-1.1.5.tgz#1bb7c0f7222c40f42adf14f4442cbd1269771a83" + dependencies: + debug "^2.6.6" + eventsource "0.1.6" + faye-websocket "~0.11.0" + inherits "^2.0.1" + json3 "^3.3.2" + url-parse "^1.1.8" + +sockjs@0.3.19: + version "0.3.19" + resolved "https://registry.yarnpkg.com/sockjs/-/sockjs-0.3.19.tgz#d976bbe800af7bd20ae08598d582393508993c0d" + dependencies: + faye-websocket "^0.10.0" + uuid "^3.0.1" + sort-asc@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/sort-asc/-/sort-asc-0.1.0.tgz#ab799df61fc73ea0956c79c4b531ed1e9e7727e9" @@ -9979,6 +10592,29 @@ spdx-license-ids@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.0.tgz#7a7cd28470cc6d3a1cfe6d66886f6bc430d3ac87" +spdy-transport@^2.0.18: + version "2.1.0" + resolved "https://registry.yarnpkg.com/spdy-transport/-/spdy-transport-2.1.0.tgz#4bbb15aaffed0beefdd56ad61dbdc8ba3e2cb7a1" + dependencies: + debug "^2.6.8" + detect-node "^2.0.3" + hpack.js "^2.1.6" + obuf "^1.1.1" + readable-stream "^2.2.9" + safe-buffer "^5.0.1" + wbuf "^1.7.2" + +spdy@^3.4.1: + version "3.4.7" + resolved "https://registry.yarnpkg.com/spdy/-/spdy-3.4.7.tgz#42ff41ece5cc0f99a3a6c28aabb73f5c3b03acbc" + dependencies: + debug "^2.6.8" + handle-thing "^1.2.5" + http-deceiver "^1.2.7" + safe-buffer "^5.0.1" + select-hose "^2.0.0" + spdy-transport "^2.0.18" + split-string@^3.0.1, split-string@^3.0.2: version "3.1.0" resolved "https://registry.yarnpkg.com/split-string/-/split-string-3.1.0.tgz#7cb09dda3a86585705c64b39a6466038682e8fe2" @@ -10060,6 +10696,14 @@ static-module@^2.2.0: static-eval "^2.0.0" through2 "~2.0.3" +"statuses@>= 1.3.1 < 2", "statuses@>= 1.4.0 < 2": + version "1.5.0" + resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" + +statuses@~1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.4.0.tgz#bb73d446da2796106efcc1b601a253d6c46bd087" + stream-browserify@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/stream-browserify/-/stream-browserify-2.0.1.tgz#66266ee5f9bdb9940a4e4514cafb43bb71e5c9db" @@ -10349,6 +10993,10 @@ through@2, through@^2.3.6, through@^2.3.7, through@^2.3.8, through@~2.3.4: version "2.3.8" resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" +thunky@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/thunky/-/thunky-1.0.2.tgz#a862e018e3fb1ea2ec3fce5d55605cf57f247371" + timed-out@^4.0.0, timed-out@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/timed-out/-/timed-out-4.0.1.tgz#f32eacac5a175bea25d7fab565ab3ed8741ef56f" @@ -10505,6 +11153,13 @@ type-detect@^4.0.0, type-detect@^4.0.5: version "4.0.8" resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.0.8.tgz#7646fb5f18871cfbb7749e69bd39a6388eb7450c" +type-is@~1.6.15, type-is@~1.6.16: + version "1.6.16" + resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.16.tgz#f89ce341541c672b25ee7ae3c73dee3b2be50194" + dependencies: + media-typer "0.3.0" + mime-types "~2.1.18" + typed-function@0.10.7: version "0.10.7" resolved "https://registry.yarnpkg.com/typed-function/-/typed-function-0.10.7.tgz#f702af7d77a64b61abf86799ff2d74266ebc4477" @@ -10693,7 +11348,7 @@ unist-util-visit@^1.1.0, unist-util-visit@^1.3.0: dependencies: unist-util-visit-parents "^2.0.0" -unpipe@~1.0.0: +unpipe@1.0.0, unpipe@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" @@ -10745,6 +11400,10 @@ urix@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/urix/-/urix-0.1.0.tgz#da937f7a62e21fec1fd18d49b35c2935067a6c72" +url-join@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/url-join/-/url-join-4.0.0.tgz#4d3340e807d3773bda9991f8305acdcc2a665d2a" + url-loader@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/url-loader/-/url-loader-1.0.1.tgz#61bc53f1f184d7343da2728a1289ef8722ea45ee" @@ -10765,6 +11424,13 @@ url-parse-lax@^3.0.0: dependencies: prepend-http "^2.0.0" +url-parse@^1.1.8, url-parse@^1.4.3: + version "1.4.3" + resolved "https://registry.yarnpkg.com/url-parse/-/url-parse-1.4.3.tgz#bfaee455c889023219d757e045fa6a684ec36c15" + dependencies: + querystringify "^2.0.0" + requires-port "^1.0.0" + url-regex@^3.0.0: version "3.2.0" resolved "https://registry.yarnpkg.com/url-regex/-/url-regex-3.2.0.tgz#dbad1e0c9e29e105dd0b1f09f6862f7fdb482724" @@ -10810,7 +11476,11 @@ util@^0.10.3: dependencies: inherits "2.0.3" -uuid@^3.0.0, uuid@^3.0.1, uuid@^3.1.0: +utils-merge@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" + +uuid@^3.0.0, uuid@^3.0.1, uuid@^3.1.0, uuid@^3.3.2: version "3.3.2" resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.3.2.tgz#1b4af4955eb3077c501c23872fc6513811587131" @@ -10843,6 +11513,10 @@ validate-npm-package-name@~2.2.2: dependencies: builtins "0.0.7" +vary@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" + vendors@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/vendors/-/vendors-1.0.2.tgz#7fcb5eef9f5623b156bcea89ec37d63676f21801" @@ -10942,6 +11616,12 @@ watchpack@^1.5.0: graceful-fs "^4.1.2" neo-async "^2.5.0" +wbuf@^1.1.0, wbuf@^1.7.2: + version "1.7.3" + resolved "https://registry.yarnpkg.com/wbuf/-/wbuf-1.7.3.tgz#c1d8d149316d3ea852848895cb6a0bfe887b87df" + dependencies: + minimalistic-assert "^1.0.0" + wcwidth@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/wcwidth/-/wcwidth-1.0.1.tgz#f0b0dcf915bc5ff1528afadb2c0e17b532da2fe8" @@ -11009,6 +11689,51 @@ webpack-cli@^2.0.10: yeoman-environment "^2.1.1" yeoman-generator "^2.0.5" +webpack-dev-middleware@3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/webpack-dev-middleware/-/webpack-dev-middleware-3.2.0.tgz#a20ceef194873710052da678f3c6ee0aeed92552" + dependencies: + loud-rejection "^1.6.0" + memory-fs "~0.4.1" + mime "^2.3.1" + path-is-absolute "^1.0.0" + range-parser "^1.0.3" + url-join "^4.0.0" + webpack-log "^2.0.0" + +webpack-dev-server@^3.1.7: + version "3.1.7" + resolved "https://registry.yarnpkg.com/webpack-dev-server/-/webpack-dev-server-3.1.7.tgz#cbf8071cc092d9493732aee4f062f0e065994854" + dependencies: + ansi-html "0.0.7" + bonjour "^3.5.0" + chokidar "^2.0.0" + compression "^1.5.2" + connect-history-api-fallback "^1.3.0" + debug "^3.1.0" + del "^3.0.0" + express "^4.16.2" + html-entities "^1.2.0" + http-proxy-middleware "~0.18.0" + import-local "^1.0.0" + internal-ip "^3.0.1" + ip "^1.1.5" + killable "^1.0.0" + loglevel "^1.4.1" + opn "^5.1.0" + portfinder "^1.0.9" + schema-utils "^1.0.0" + selfsigned "^1.9.1" + serve-index "^1.7.2" + sockjs "0.3.19" + sockjs-client "1.1.5" + spdy "^3.4.1" + strip-ansi "^3.0.0" + supports-color "^5.1.0" + webpack-dev-middleware "3.2.0" + webpack-log "^2.0.0" + yargs "12.0.1" + webpack-log@^1.1.2: version "1.2.0" resolved "https://registry.yarnpkg.com/webpack-log/-/webpack-log-1.2.0.tgz#a4b34cda6b22b518dbb0ab32e567962d5c72a43d" @@ -11018,6 +11743,13 @@ webpack-log@^1.1.2: loglevelnext "^1.0.1" uuid "^3.1.0" +webpack-log@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/webpack-log/-/webpack-log-2.0.0.tgz#5b7928e0637593f119d32f6227c1e0ac31e1b47f" + dependencies: + ansi-colors "^3.0.0" + uuid "^3.3.2" + webpack-sources@^1.0.0, webpack-sources@^1.0.1, webpack-sources@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-1.1.0.tgz#a101ebae59d6507354d71d8013950a3a8b7a5a54" @@ -11055,6 +11787,17 @@ webpack@^4.6.0: watchpack "^1.5.0" webpack-sources "^1.0.1" +websocket-driver@>=0.5.1: + version "0.7.0" + resolved "https://registry.yarnpkg.com/websocket-driver/-/websocket-driver-0.7.0.tgz#0caf9d2d755d93aee049d4bdd0d3fe2cca2a24eb" + dependencies: + http-parser-js ">=0.4.0" + websocket-extensions ">=0.1.1" + +websocket-extensions@>=0.1.1: + version "0.1.3" + resolved "https://registry.yarnpkg.com/websocket-extensions/-/websocket-extensions-0.1.3.tgz#5d2ff22977003ec687a4b87073dfbbac146ccf29" + webworkify@^1.5.0: version "1.5.0" resolved "https://registry.yarnpkg.com/webworkify/-/webworkify-1.5.0.tgz#734ad87a774de6ebdd546e1d3e027da5b8f4a42c" @@ -11219,6 +11962,10 @@ xmlbuilder@~9.0.1: version "9.0.7" resolved "https://registry.yarnpkg.com/xmlbuilder/-/xmlbuilder-9.0.7.tgz#132ee63d2ec5565c557e20f4c22df9aca686b10d" +xregexp@4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/xregexp/-/xregexp-4.0.0.tgz#e698189de49dd2a18cc5687b05e17c8e43943020" + "xtend@>=4.0.0 <4.1.0-0", xtend@^4.0.0, xtend@^4.0.1, xtend@~4.0.0, xtend@~4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.1.tgz#a5c6d532be656e23db820efb943a1f04998d63af" @@ -11234,7 +11981,7 @@ y18n@^3.2.1: version "3.2.1" resolved "https://registry.yarnpkg.com/y18n/-/y18n-3.2.1.tgz#6d15fba884c08679c0d77e88e7759e811e07fa41" -y18n@^4.0.0: +"y18n@^3.2.1 || ^4.0.0", y18n@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.0.tgz#95ef94f85ecc81d007c264e190a120f0a3c8566b" @@ -11246,12 +11993,35 @@ yallist@^3.0.0, yallist@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.0.2.tgz#8452b4bb7e83c7c188d8041c1a837c773d6d8bb9" +yargs-parser@^10.1.0: + version "10.1.0" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-10.1.0.tgz#7202265b89f7e9e9f2e5765e0fe735a905edbaa8" + dependencies: + camelcase "^4.1.0" + yargs-parser@^9.0.2: version "9.0.2" resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-9.0.2.tgz#9ccf6a43460fe4ed40a9bb68f48d43b8a68cc077" dependencies: camelcase "^4.1.0" +yargs@12.0.1: + version "12.0.1" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-12.0.1.tgz#6432e56123bb4e7c3562115401e98374060261c2" + dependencies: + cliui "^4.0.0" + decamelize "^2.0.0" + find-up "^3.0.0" + get-caller-file "^1.0.1" + os-locale "^2.0.0" + require-directory "^2.1.1" + require-main-filename "^1.0.1" + set-blocking "^2.0.0" + string-width "^2.0.0" + which-module "^2.0.0" + y18n "^3.2.1 || ^4.0.0" + yargs-parser "^10.1.0" + yargs@^11.1.0: version "11.1.0" resolved "https://registry.yarnpkg.com/yargs/-/yargs-11.1.0.tgz#90b869934ed6e871115ea2ff58b03f4724ed2d77" From 4477f3c284a00d6c56ce8664259a9d78a2248c8f Mon Sep 17 00:00:00 2001 From: Krist Wongsuphasawat Date: Wed, 5 Sep 2018 09:17:18 -0700 Subject: [PATCH 06/13] resolve merge conflicts --- superset/assets/package.json | 1 + superset/assets/webpack.config.js | 12 +- superset/assets/yarn.lock | 576 ++++++++++++++++++++++++- superset/templates/superset/base.html | 3 + superset/templates/superset/basic.html | 3 + 5 files changed, 573 insertions(+), 22 deletions(-) diff --git a/superset/assets/package.json b/superset/assets/package.json index 3c80d5173bf7d..d3bb7daba44ff 100644 --- a/superset/assets/package.json +++ b/superset/assets/package.json @@ -158,6 +158,7 @@ "minimist": "^1.2.0", "mocha": "^3.5.3", "npm-check-updates": "^2.14.0", + "optimize-css-assets-webpack-plugin": "^5.0.1", "po2json": "^0.4.5", "prettier": "^1.12.1", "react-addons-test-utils": "^15.6.2", diff --git a/superset/assets/webpack.config.js b/superset/assets/webpack.config.js index 908ede06f9318..334717137307c 100644 --- a/superset/assets/webpack.config.js +++ b/superset/assets/webpack.config.js @@ -2,7 +2,9 @@ const path = require('path'); const webpack = require('webpack'); const CleanWebpackPlugin = require('clean-webpack-plugin'); const MiniCssExtractPlugin = require('mini-css-extract-plugin'); +const OptimizeCSSAssetsPlugin = require('optimize-css-assets-webpack-plugin'); const WebpackAssetsManifest = require('webpack-assets-manifest'); + // Parse command-line arguments const parsedArgs = require('minimist')(process.argv.slice(2)); @@ -38,17 +40,13 @@ const plugins = [ if (isDevMode) { // Enable hot module replacement plugins.push(new webpack.HotModuleReplacementPlugin()); - // text loading (webpack 4+) - plugins.push(new MiniCssExtractPlugin({ - filename: '[name].[hash:8].entry.css', - chunkFilename: '[name].[hash:8].chunk.css', - })); } else { // text loading (webpack 4+) plugins.push(new MiniCssExtractPlugin({ filename: '[name].[chunkhash].entry.css', chunkFilename: '[name].[chunkhash].chunk.css', })); + plugins.push(new OptimizeCSSAssetsPlugin()); } const output = { @@ -106,7 +104,7 @@ const config = { test: /\.css$/, include: APP_DIR, use: [ - MiniCssExtractPlugin.loader, + isDevMode ? 'style-loader' : MiniCssExtractPlugin.loader, 'css-loader', ], }, @@ -114,7 +112,7 @@ const config = { test: /\.less$/, include: APP_DIR, use: [ - MiniCssExtractPlugin.loader, + isDevMode ? 'style-loader' : MiniCssExtractPlugin.loader, 'css-loader', 'less-loader', ], diff --git a/superset/assets/yarn.lock b/superset/assets/yarn.lock index cfaff12d6438d..b401118ab7e56 100644 --- a/superset/assets/yarn.lock +++ b/superset/assets/yarn.lock @@ -905,7 +905,7 @@ align-text@^0.1.1, align-text@^0.1.3: longest "^1.0.1" repeat-string "^1.5.2" -alphanum-sort@^1.0.1, alphanum-sort@^1.0.2: +alphanum-sort@^1.0.0, alphanum-sort@^1.0.1, alphanum-sort@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/alphanum-sort/-/alphanum-sort-1.0.2.tgz#97a1119649b211ad33691d9f9f486a8ec9fbe0a3" @@ -2185,7 +2185,7 @@ bonjour@^3.5.0: multicast-dns "^6.0.1" multicast-dns-service-types "^1.1.0" -boolbase@~1.0.0: +boolbase@^1.0.0, boolbase@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/boolbase/-/boolbase-1.0.0.tgz#68dff5fbe60c51eb37725ea9e3ed310dcc1e776e" @@ -2358,6 +2358,14 @@ browserslist@^3.2.6: caniuse-lite "^1.0.30000844" electron-to-chromium "^1.3.47" +browserslist@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.1.0.tgz#81cbb8e52dfa09918f93c6e051d779cb7360785d" + dependencies: + caniuse-lite "^1.0.30000878" + electron-to-chromium "^1.3.61" + node-releases "^1.0.0-alpha.11" + buble@^0.15.1: version "0.15.2" resolved "https://registry.yarnpkg.com/buble/-/buble-0.15.2.tgz#547fc47483f8e5e8176d82aa5ebccb183b02d613" @@ -2524,10 +2532,23 @@ caniuse-api@^1.5.2: lodash.memoize "^4.1.2" lodash.uniq "^4.5.0" +caniuse-api@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/caniuse-api/-/caniuse-api-3.0.0.tgz#5e4d90e2274961d46291997df599e3ed008ee4c0" + dependencies: + browserslist "^4.0.0" + caniuse-lite "^1.0.0" + lodash.memoize "^4.1.2" + lodash.uniq "^4.5.0" + caniuse-db@^1.0.30000529, caniuse-db@^1.0.30000634, caniuse-db@^1.0.30000639: version "1.0.30000875" resolved "https://registry.yarnpkg.com/caniuse-db/-/caniuse-db-1.0.30000875.tgz#6f904fc89120de4029a9ca0f21d7ac3db89a0dce" +caniuse-lite@^1.0.0, caniuse-lite@^1.0.30000878: + version "1.0.30000884" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30000884.tgz#eb82a959698745033b26a4dcd34d89dba7cc6eb3" + caniuse-lite@^1.0.30000844: version "1.0.30000874" resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30000874.tgz#a641b1f1c420d58d9b132920ef6ba87bbdcd2223" @@ -2840,6 +2861,12 @@ coa@~1.0.1: dependencies: q "^1.1.2" +coa@~2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/coa/-/coa-2.0.1.tgz#f3f8b0b15073e35d70263fb1042cb2c023db38af" + dependencies: + q "^1.1.2" + code-point-at@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77" @@ -2861,11 +2888,17 @@ color-convert@^1.3.0, color-convert@^1.9.0: dependencies: color-name "1.1.1" +color-convert@^1.9.1: + version "1.9.3" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" + dependencies: + color-name "1.1.3" + color-name@1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.1.tgz#4b1415304cf50028ea81643643bd82ea05803689" -color-name@^1.0.0: +color-name@1.1.3, color-name@^1.0.0: version "1.1.3" resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" @@ -2875,6 +2908,13 @@ color-string@^0.3.0: dependencies: color-name "^1.0.0" +color-string@^1.5.2: + version "1.5.3" + resolved "https://registry.yarnpkg.com/color-string/-/color-string-1.5.3.tgz#c9bbc5f01b58b5492f3d6857459cb6590ce204cc" + dependencies: + color-name "^1.0.0" + simple-swizzle "^0.2.2" + color@^0.11.0: version "0.11.4" resolved "https://registry.yarnpkg.com/color/-/color-0.11.4.tgz#6d7b5c74fb65e841cd48792ad1ed5e07b904d764" @@ -2883,6 +2923,13 @@ color@^0.11.0: color-convert "^1.3.0" color-string "^0.3.0" +color@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/color/-/color-3.0.0.tgz#d920b4328d534a3ac8295d68f7bd4ba6c427be9a" + dependencies: + color-convert "^1.9.1" + color-string "^1.5.2" + colormin@^1.0.5: version "1.1.2" resolved "https://registry.yarnpkg.com/colormin/-/colormin-1.1.2.tgz#ea2f7420a72b96881a38aae59ec124a6f7298133" @@ -3088,6 +3135,14 @@ core-util-is@1.0.2, core-util-is@~1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" +cosmiconfig@^5.0.0: + version "5.0.6" + resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-5.0.6.tgz#dca6cf680a0bd03589aff684700858c81abeeb39" + dependencies: + is-directory "^0.3.1" + js-yaml "^3.9.0" + parse-json "^4.0.0" + couleurs@^5.0.0: version "5.2.1" resolved "https://registry.yarnpkg.com/couleurs/-/couleurs-5.2.1.tgz#5399f9f7a159852ec14244f841bd858f04dc52a3" @@ -3192,10 +3247,17 @@ crypto-random-string@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/crypto-random-string/-/crypto-random-string-1.0.0.tgz#a230f64f568310e1498009940790ec99545bca7e" -css-color-names@0.0.4: +css-color-names@0.0.4, css-color-names@^0.0.4: version "0.0.4" resolved "https://registry.yarnpkg.com/css-color-names/-/css-color-names-0.0.4.tgz#808adc2e79cf84738069b646cb20ec27beb629e0" +css-declaration-sorter@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/css-declaration-sorter/-/css-declaration-sorter-3.0.1.tgz#d0e3056b0fd88dc1ea9dceff435adbe9c702a7f8" + dependencies: + postcss "^6.0.0" + timsort "^0.3.0" + css-in-js-utils@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/css-in-js-utils/-/css-in-js-utils-2.0.1.tgz#3b472b398787291b47cfe3e44fecfdd9e914ba99" @@ -3239,6 +3301,10 @@ css-modules-require-hook@^4.0.6: postcss-modules-values "^1.1.1" seekout "^1.0.1" +css-select-base-adapter@~0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/css-select-base-adapter/-/css-select-base-adapter-0.1.0.tgz#0102b3d14630df86c3eb9fa9f5456270106cf990" + css-select@~1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/css-select/-/css-select-1.2.0.tgz#2b3a110539c5355f1cd8d314623e870b121ec858" @@ -3248,6 +3314,15 @@ css-select@~1.2.0: domutils "1.5.1" nth-check "~1.0.1" +css-select@~1.3.0-rc0: + version "1.3.0-rc0" + resolved "https://registry.yarnpkg.com/css-select/-/css-select-1.3.0-rc0.tgz#6f93196aaae737666ea1036a8cb14a8fcb7a9231" + dependencies: + boolbase "^1.0.0" + css-what "2.1" + domutils "1.5.1" + nth-check "^1.0.1" + css-selector-tokenizer@^0.7.0: version "0.7.0" resolved "https://registry.yarnpkg.com/css-selector-tokenizer/-/css-selector-tokenizer-0.7.0.tgz#e6988474ae8c953477bf5e7efecfceccd9cf4c86" @@ -3256,6 +3331,28 @@ css-selector-tokenizer@^0.7.0: fastparse "^1.1.1" regexpu-core "^1.0.0" +css-tree@1.0.0-alpha.29: + version "1.0.0-alpha.29" + resolved "https://registry.yarnpkg.com/css-tree/-/css-tree-1.0.0-alpha.29.tgz#3fa9d4ef3142cbd1c301e7664c1f352bd82f5a39" + dependencies: + mdn-data "~1.1.0" + source-map "^0.5.3" + +css-tree@1.0.0-alpha25: + version "1.0.0-alpha25" + resolved "https://registry.yarnpkg.com/css-tree/-/css-tree-1.0.0-alpha25.tgz#1bbfabfbf6eeef4f01d9108ff2edd0be2fe35597" + dependencies: + mdn-data "^1.0.0" + source-map "^0.5.3" + +css-unit-converter@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/css-unit-converter/-/css-unit-converter-1.1.1.tgz#d9b9281adcfd8ced935bdbaba83786897f64e996" + +css-url-regex@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/css-url-regex/-/css-url-regex-1.1.0.tgz#83834230cc9f74c457de59eebd1543feeb83b7ec" + css-what@2.1: version "2.1.0" resolved "https://registry.yarnpkg.com/css-what/-/css-what-2.1.0.tgz#9467d032c38cfaefb9f2d79501253062f87fa1bd" @@ -3268,6 +3365,59 @@ cssesc@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-0.1.0.tgz#c814903e45623371a0477b40109aaafbeeaddbb4" +cssnano-preset-default@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/cssnano-preset-default/-/cssnano-preset-default-4.0.0.tgz#c334287b4f7d49fb2d170a92f9214655788e3b6b" + dependencies: + css-declaration-sorter "^3.0.0" + cssnano-util-raw-cache "^4.0.0" + postcss "^6.0.0" + postcss-calc "^6.0.0" + postcss-colormin "^4.0.0" + postcss-convert-values "^4.0.0" + postcss-discard-comments "^4.0.0" + postcss-discard-duplicates "^4.0.0" + postcss-discard-empty "^4.0.0" + postcss-discard-overridden "^4.0.0" + postcss-merge-longhand "^4.0.0" + postcss-merge-rules "^4.0.0" + postcss-minify-font-values "^4.0.0" + postcss-minify-gradients "^4.0.0" + postcss-minify-params "^4.0.0" + postcss-minify-selectors "^4.0.0" + postcss-normalize-charset "^4.0.0" + postcss-normalize-display-values "^4.0.0" + postcss-normalize-positions "^4.0.0" + postcss-normalize-repeat-style "^4.0.0" + postcss-normalize-string "^4.0.0" + postcss-normalize-timing-functions "^4.0.0" + postcss-normalize-unicode "^4.0.0" + postcss-normalize-url "^4.0.0" + postcss-normalize-whitespace "^4.0.0" + postcss-ordered-values "^4.0.0" + postcss-reduce-initial "^4.0.0" + postcss-reduce-transforms "^4.0.0" + postcss-svgo "^4.0.0" + postcss-unique-selectors "^4.0.0" + +cssnano-util-get-arguments@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/cssnano-util-get-arguments/-/cssnano-util-get-arguments-4.0.0.tgz#ed3a08299f21d75741b20f3b81f194ed49cc150f" + +cssnano-util-get-match@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/cssnano-util-get-match/-/cssnano-util-get-match-4.0.0.tgz#c0e4ca07f5386bb17ec5e52250b4f5961365156d" + +cssnano-util-raw-cache@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/cssnano-util-raw-cache/-/cssnano-util-raw-cache-4.0.0.tgz#be0a2856e25f185f5f7a2bcc0624e28b7f179a9f" + dependencies: + postcss "^6.0.0" + +cssnano-util-same-parent@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/cssnano-util-same-parent/-/cssnano-util-same-parent-4.0.0.tgz#d2a3de1039aa98bc4ec25001fa050330c2a16dac" + cssnano@^3.10.0: version "3.10.0" resolved "https://registry.yarnpkg.com/cssnano/-/cssnano-3.10.0.tgz#4f38f6cea2b9b17fa01490f23f1dc68ea65c1c38" @@ -3305,6 +3455,21 @@ cssnano@^3.10.0: postcss-value-parser "^3.2.3" postcss-zindex "^2.0.1" +cssnano@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/cssnano/-/cssnano-4.1.0.tgz#682c37b84b9b7df616450a5a8dc9269b9bd10734" + dependencies: + cosmiconfig "^5.0.0" + cssnano-preset-default "^4.0.0" + is-resolvable "^1.0.0" + postcss "^6.0.0" + +csso@^3.5.0: + version "3.5.1" + resolved "https://registry.yarnpkg.com/csso/-/csso-3.5.1.tgz#7b9eb8be61628973c1b261e169d2f024008e758b" + dependencies: + css-tree "1.0.0-alpha.29" + csso@~2.3.1: version "2.3.2" resolved "https://registry.yarnpkg.com/csso/-/csso-2.3.2.tgz#ddd52c587033f49e94b71fc55569f252e8ff5f85" @@ -3883,7 +4048,7 @@ domutils@^1.5.1: dom-serializer "0" domelementtype "1" -dot-prop@^4.1.0: +dot-prop@^4.1.0, dot-prop@^4.1.1: version "4.2.0" resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-4.2.0.tgz#1f19e0c2e1aa0e32797c49799f2837ac6af69c57" dependencies: @@ -3945,6 +4110,10 @@ electron-to-chromium@^1.2.7, electron-to-chromium@^1.3.47: version "1.3.56" resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.56.tgz#aad1420d23e9dd8cd2fc2bc53f4928adcf85f02f" +electron-to-chromium@^1.3.61: + version "1.3.62" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.62.tgz#2e8e2dc070c800ec8ce23ff9dfcceb585d6f9ed8" + elegant-spinner@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/elegant-spinner/-/elegant-spinner-1.0.1.tgz#db043521c95d7e303fd8f345bedc3349cfb0729e" @@ -4035,7 +4204,7 @@ error@^7.0.2: string-template "~0.2.1" xtend "~4.0.0" -es-abstract@^1.6.1, es-abstract@^1.7.0: +es-abstract@^1.5.1, es-abstract@^1.6.1, es-abstract@^1.7.0: version "1.12.0" resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.12.0.tgz#9dbbdd27c6856f0001421ca18782d786bf8a6165" dependencies: @@ -5472,7 +5641,7 @@ has-values@^1.0.0: is-number "^3.0.0" kind-of "^4.0.0" -has@^1.0.1, has@^1.0.3: +has@^1.0.0, has@^1.0.1, has@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" dependencies: @@ -5514,6 +5683,10 @@ he@1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/he/-/he-1.1.1.tgz#93410fd21b009735151f8868c2f271f3427e23fd" +hex-color-regex@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/hex-color-regex/-/hex-color-regex-1.1.0.tgz#4c06fccb4602fe2602b3c93df82d7e7dbf1a8a8e" + highlight.js@~9.12.0: version "9.12.0" resolved "https://registry.yarnpkg.com/highlight.js/-/highlight.js-9.12.0.tgz#e6d9dbe57cbefe60751f02af336195870c90c01e" @@ -5576,6 +5749,14 @@ hpack.js@^2.1.6: readable-stream "^2.0.1" wbuf "^1.1.0" +hsl-regex@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/hsl-regex/-/hsl-regex-1.0.0.tgz#d49330c789ed819e276a4c0d272dffa30b18fe6e" + +hsla-regex@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/hsla-regex/-/hsla-regex-1.0.0.tgz#c1ce7a3168c8c6614033a4b5f7877f3b225f9c38" + html-comment-regex@^1.1.0: version "1.1.1" resolved "https://registry.yarnpkg.com/html-comment-regex/-/html-comment-regex-1.1.1.tgz#668b93776eaae55ebde8f3ad464b307a4963625e" @@ -5942,6 +6123,10 @@ is-arrayish@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" +is-arrayish@^0.3.1: + version "0.3.2" + resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.3.2.tgz#4574a2ae56f7ab206896fb431eaeed066fdf8f03" + is-binary-path@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-1.0.1.tgz#75f16642b480f187a711c814161fd3a4a7655898" @@ -5968,6 +6153,17 @@ is-ci@^1.0.10: dependencies: ci-info "^1.0.0" +is-color-stop@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-color-stop/-/is-color-stop-1.1.0.tgz#cfff471aee4dd5c9e158598fbe12967b5cdad345" + dependencies: + css-color-names "^0.0.4" + hex-color-regex "^1.1.0" + hsl-regex "^1.0.0" + hsla-regex "^1.0.0" + rgb-regex "^1.0.1" + rgba-regex "^1.0.0" + is-data-descriptor@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz#0b5ee648388e2c860282e793f1856fec3f301b56" @@ -6004,6 +6200,10 @@ is-descriptor@^1.0.0, is-descriptor@^1.0.2: is-data-descriptor "^1.0.0" kind-of "^6.0.2" +is-directory@^0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/is-directory/-/is-directory-0.3.1.tgz#61339b6f2475fc772fd9c9d83f5c8575dc154ae1" + is-dotfile@^1.0.0: version "1.0.3" resolved "https://registry.yarnpkg.com/is-dotfile/-/is-dotfile-1.0.3.tgz#a6a2f32ffd2dfb04f5ca25ecd0f6b83cf798a1e1" @@ -6217,6 +6417,12 @@ is-svg@^2.0.0: dependencies: html-comment-regex "^1.1.0" +is-svg@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-svg/-/is-svg-3.0.0.tgz#9321dbd29c212e5ca99c4fa9794c714bcafa2f75" + dependencies: + html-comment-regex "^1.1.0" + is-symbol@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.1.tgz#3cc59f00025194b6ab2e38dbae6689256b660572" @@ -6449,13 +6655,20 @@ js-tokens@^3.0.0, js-tokens@^3.0.2: version "4.0.0" resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" -js-yaml@3.x, js-yaml@^3.10.0, js-yaml@^3.12.0, js-yaml@^3.7.0, js-yaml@^3.9.1: +js-yaml@3.x, js-yaml@^3.10.0, js-yaml@^3.12.0, js-yaml@^3.7.0, js-yaml@^3.9.0, js-yaml@^3.9.1: version "3.12.0" resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.12.0.tgz#eaed656ec8344f10f527c6bfa1b6e2244de167d1" dependencies: argparse "^1.0.7" esprima "^4.0.0" +js-yaml@~3.10.0: + version "3.10.0" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.10.0.tgz#2e78441646bd4682e963f22b6e92823c309c62dc" + dependencies: + argparse "^1.0.7" + esprima "^4.0.0" + js-yaml@~3.7.0: version "3.7.0" resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.7.0.tgz#5c967ddd837a9bfdca5f2de84253abe8a1c03b80" @@ -6685,6 +6898,13 @@ kind-of@^6.0.0, kind-of@^6.0.2: version "6.0.2" resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.2.tgz#01146b36a6218e64e58f3a8d66de5d7fc6f6d051" +last-call-webpack-plugin@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/last-call-webpack-plugin/-/last-call-webpack-plugin-3.0.0.tgz#9742df0e10e3cf46e5c0381c2de90d3a7a2d7555" + dependencies: + lodash "^4.17.5" + webpack-sources "^1.1.0" + latest-version@^3.0.0: version "3.1.0" resolved "https://registry.yarnpkg.com/latest-version/-/latest-version-3.1.0.tgz#a205383fea322b33b5ae3b18abee0dc2f356ee15" @@ -7286,6 +7506,14 @@ mdast-add-list-metadata@^1.0.1: dependencies: unist-util-visit-parents "1.1.2" +mdn-data@^1.0.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/mdn-data/-/mdn-data-1.2.0.tgz#eadd28b0f2d307cf27e71524609bfb749ebfc0b6" + +mdn-data@~1.1.0: + version "1.1.4" + resolved "https://registry.yarnpkg.com/mdn-data/-/mdn-data-1.1.4.tgz#50b5d4ffc4575276573c4eedb8780812a8419f01" + media-typer@0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" @@ -7761,6 +7989,12 @@ node-pre-gyp@^0.10.0: semver "^5.3.0" tar "^4" +node-releases@^1.0.0-alpha.11: + version "1.0.0-alpha.11" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.0.0-alpha.11.tgz#73c810acc2e5b741a17ddfbb39dfca9ab9359d8a" + dependencies: + semver "^5.3.0" + node-uuid@~1.4.0, node-uuid@~1.4.7: version "1.4.8" resolved "https://registry.yarnpkg.com/node-uuid/-/node-uuid-1.4.8.tgz#b040eb0923968afabf8d32fb1f17f1167fdab907" @@ -7841,6 +8075,10 @@ normalize-url@^1.4.0: query-string "^4.1.0" sort-keys "^1.0.0" +normalize-url@^3.0.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-3.3.0.tgz#b2e1c4dc4f7c6d57743df733a4f5978d18650559" + npm-bundled@^1.0.1: version "1.0.3" resolved "https://registry.yarnpkg.com/npm-bundled/-/npm-bundled-1.0.3.tgz#7e71703d973af3370a9591bafe3a63aca0be2308" @@ -8037,7 +8275,7 @@ npmlog@~4.0.0: gauge "~2.7.1" set-blocking "~2.0.0" -nth-check@~1.0.1: +nth-check@^1.0.1, nth-check@~1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/nth-check/-/nth-check-1.0.1.tgz#9929acdf628fc2c41098deab82ac580cf149aae4" dependencies: @@ -8091,7 +8329,7 @@ object-is@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/object-is/-/object-is-1.0.1.tgz#0aa60ec9989a0b3ed795cf4d06f62cf1ad6539b6" -object-keys@^1.0.11, object-keys@^1.0.6, object-keys@^1.0.8, object-keys@^1.0.9: +object-keys@^1.0.11, object-keys@^1.0.12, object-keys@^1.0.6, object-keys@^1.0.8: version "1.0.12" resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.0.12.tgz#09c53855377575310cca62f55bb334abff7b3ed2" @@ -8127,6 +8365,13 @@ object.entries@^1.0.4: function-bind "^1.1.0" has "^1.0.1" +object.getownpropertydescriptors@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.0.3.tgz#8758c846f5b407adab0f236e0986f14b051caa16" + dependencies: + define-properties "^1.1.2" + es-abstract "^1.5.1" + object.omit@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/object.omit/-/object.omit-2.0.1.tgz#1a9c744829f39dbb858c76ca3579ae2a54ebd1fa" @@ -8202,6 +8447,13 @@ optimist@^0.6.1: minimist "~0.0.1" wordwrap "~0.0.2" +optimize-css-assets-webpack-plugin@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/optimize-css-assets-webpack-plugin/-/optimize-css-assets-webpack-plugin-5.0.1.tgz#9eb500711d35165b45e7fd60ba2df40cb3eb9159" + dependencies: + cssnano "^4.1.0" + last-call-webpack-plugin "^3.0.0" + optionator@^0.8.1, optionator@^0.8.2: version "0.8.2" resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.2.tgz#364c5e409d3f4d6301d6c0b4c05bba50180aeb64" @@ -8473,7 +8725,7 @@ path-dirname@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/path-dirname/-/path-dirname-1.0.2.tgz#cc33d24d525e099a5388c0336c6e32b9160609e0" -path-exists@^2.0.0, path-exists@^2.1.0: +path-exists@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-2.1.0.tgz#0feb6c64f0fc518d9a754dd5efb62c7022761f4b" dependencies: @@ -8621,6 +8873,15 @@ postcss-calc@^5.2.0: postcss-message-helpers "^2.0.0" reduce-css-calc "^1.2.6" +postcss-calc@^6.0.0: + version "6.0.1" + resolved "https://registry.yarnpkg.com/postcss-calc/-/postcss-calc-6.0.1.tgz#3d24171bbf6e7629d422a436ebfe6dd9511f4330" + dependencies: + css-unit-converter "^1.1.1" + postcss "^6.0.0" + postcss-selector-parser "^2.2.2" + reduce-css-calc "^2.0.0" + postcss-colormin@^2.1.8: version "2.2.2" resolved "https://registry.yarnpkg.com/postcss-colormin/-/postcss-colormin-2.2.2.tgz#6631417d5f0e909a3d7ec26b24c8a8d1e4f96e4b" @@ -8629,6 +8890,16 @@ postcss-colormin@^2.1.8: postcss "^5.0.13" postcss-value-parser "^3.2.3" +postcss-colormin@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/postcss-colormin/-/postcss-colormin-4.0.1.tgz#6f1c18a0155bc69613f2ff13843e2e4ae8ff0bbe" + dependencies: + browserslist "^4.0.0" + color "^3.0.0" + has "^1.0.0" + postcss "^6.0.0" + postcss-value-parser "^3.0.0" + postcss-convert-values@^2.3.4: version "2.6.1" resolved "https://registry.yarnpkg.com/postcss-convert-values/-/postcss-convert-values-2.6.1.tgz#bbd8593c5c1fd2e3d1c322bb925dcae8dae4d62d" @@ -8636,30 +8907,61 @@ postcss-convert-values@^2.3.4: postcss "^5.0.11" postcss-value-parser "^3.1.2" +postcss-convert-values@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/postcss-convert-values/-/postcss-convert-values-4.0.0.tgz#77d77d9aed1dc4e6956e651cc349d53305876f62" + dependencies: + postcss "^6.0.0" + postcss-value-parser "^3.0.0" + postcss-discard-comments@^2.0.4: version "2.0.4" resolved "https://registry.yarnpkg.com/postcss-discard-comments/-/postcss-discard-comments-2.0.4.tgz#befe89fafd5b3dace5ccce51b76b81514be00e3d" dependencies: postcss "^5.0.14" +postcss-discard-comments@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/postcss-discard-comments/-/postcss-discard-comments-4.0.0.tgz#9684a299e76b3e93263ef8fd2adbf1a1c08fd88d" + dependencies: + postcss "^6.0.0" + postcss-discard-duplicates@^2.0.1: version "2.1.0" resolved "https://registry.yarnpkg.com/postcss-discard-duplicates/-/postcss-discard-duplicates-2.1.0.tgz#b9abf27b88ac188158a5eb12abcae20263b91932" dependencies: postcss "^5.0.4" +postcss-discard-duplicates@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/postcss-discard-duplicates/-/postcss-discard-duplicates-4.0.0.tgz#42f3c267f85fa909e042c35767ecfd65cb2bd72c" + dependencies: + postcss "^6.0.0" + postcss-discard-empty@^2.0.1: version "2.1.0" resolved "https://registry.yarnpkg.com/postcss-discard-empty/-/postcss-discard-empty-2.1.0.tgz#d2b4bd9d5ced5ebd8dcade7640c7d7cd7f4f92b5" dependencies: postcss "^5.0.14" +postcss-discard-empty@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/postcss-discard-empty/-/postcss-discard-empty-4.0.0.tgz#55e18a59c74128e38c7d2804bcfa4056611fb97f" + dependencies: + postcss "^6.0.0" + postcss-discard-overridden@^0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/postcss-discard-overridden/-/postcss-discard-overridden-0.1.1.tgz#8b1eaf554f686fb288cd874c55667b0aa3668d58" dependencies: postcss "^5.0.16" +postcss-discard-overridden@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/postcss-discard-overridden/-/postcss-discard-overridden-4.0.0.tgz#4a0bf85978784cf1f81ed2c1c1fd9d964a1da1fa" + dependencies: + postcss "^6.0.0" + postcss-discard-unused@^2.2.1: version "2.2.3" resolved "https://registry.yarnpkg.com/postcss-discard-unused/-/postcss-discard-unused-2.2.3.tgz#bce30b2cc591ffc634322b5fb3464b6d934f4433" @@ -8687,6 +8989,15 @@ postcss-merge-longhand@^2.0.1: dependencies: postcss "^5.0.4" +postcss-merge-longhand@^4.0.0: + version "4.0.5" + resolved "https://registry.yarnpkg.com/postcss-merge-longhand/-/postcss-merge-longhand-4.0.5.tgz#00898d72347fc7e40bb564b11bdc08119c599b59" + dependencies: + css-color-names "0.0.4" + postcss "^6.0.0" + postcss-value-parser "^3.0.0" + stylehacks "^4.0.0" + postcss-merge-rules@^2.0.3: version "2.1.2" resolved "https://registry.yarnpkg.com/postcss-merge-rules/-/postcss-merge-rules-2.1.2.tgz#d1df5dfaa7b1acc3be553f0e9e10e87c61b5f721" @@ -8697,6 +9008,17 @@ postcss-merge-rules@^2.0.3: postcss-selector-parser "^2.2.2" vendors "^1.0.0" +postcss-merge-rules@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/postcss-merge-rules/-/postcss-merge-rules-4.0.1.tgz#430fd59b3f2ed2e8afcd0b31278eda39854abb10" + dependencies: + browserslist "^4.0.0" + caniuse-api "^3.0.0" + cssnano-util-same-parent "^4.0.0" + postcss "^6.0.0" + postcss-selector-parser "^3.0.0" + vendors "^1.0.0" + postcss-message-helpers@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/postcss-message-helpers/-/postcss-message-helpers-2.0.0.tgz#a4f2f4fab6e4fe002f0aed000478cdf52f9ba60e" @@ -8709,6 +9031,13 @@ postcss-minify-font-values@^1.0.2: postcss "^5.0.4" postcss-value-parser "^3.0.2" +postcss-minify-font-values@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/postcss-minify-font-values/-/postcss-minify-font-values-4.0.0.tgz#4cc33d283d6a81759036e757ef981d92cbd85bed" + dependencies: + postcss "^6.0.0" + postcss-value-parser "^3.0.0" + postcss-minify-gradients@^1.0.1: version "1.0.5" resolved "https://registry.yarnpkg.com/postcss-minify-gradients/-/postcss-minify-gradients-1.0.5.tgz#5dbda11373703f83cfb4a3ea3881d8d75ff5e6e1" @@ -8716,6 +9045,15 @@ postcss-minify-gradients@^1.0.1: postcss "^5.0.12" postcss-value-parser "^3.3.0" +postcss-minify-gradients@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/postcss-minify-gradients/-/postcss-minify-gradients-4.0.0.tgz#3fc3916439d27a9bb8066db7cdad801650eb090e" + dependencies: + cssnano-util-get-arguments "^4.0.0" + is-color-stop "^1.0.0" + postcss "^6.0.0" + postcss-value-parser "^3.0.0" + postcss-minify-params@^1.0.4: version "1.2.2" resolved "https://registry.yarnpkg.com/postcss-minify-params/-/postcss-minify-params-1.2.2.tgz#ad2ce071373b943b3d930a3fa59a358c28d6f1f3" @@ -8725,6 +9063,16 @@ postcss-minify-params@^1.0.4: postcss-value-parser "^3.0.2" uniqs "^2.0.0" +postcss-minify-params@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/postcss-minify-params/-/postcss-minify-params-4.0.0.tgz#05e9166ee48c05af651989ce84d39c1b4d790674" + dependencies: + alphanum-sort "^1.0.0" + cssnano-util-get-arguments "^4.0.0" + postcss "^6.0.0" + postcss-value-parser "^3.0.0" + uniqs "^2.0.0" + postcss-minify-selectors@^2.0.4: version "2.1.1" resolved "https://registry.yarnpkg.com/postcss-minify-selectors/-/postcss-minify-selectors-2.1.1.tgz#b2c6a98c0072cf91b932d1a496508114311735bf" @@ -8734,6 +9082,15 @@ postcss-minify-selectors@^2.0.4: postcss "^5.0.14" postcss-selector-parser "^2.0.0" +postcss-minify-selectors@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/postcss-minify-selectors/-/postcss-minify-selectors-4.0.0.tgz#b1e9f6c463416d3fcdcb26e7b785d95f61578aad" + dependencies: + alphanum-sort "^1.0.0" + has "^1.0.0" + postcss "^6.0.0" + postcss-selector-parser "^3.0.0" + postcss-modules-extract-imports@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/postcss-modules-extract-imports/-/postcss-modules-extract-imports-1.1.0.tgz#b614c9720be6816eaee35fb3a5faa1dba6a05ddb" @@ -8781,6 +9138,61 @@ postcss-normalize-charset@^1.1.0: dependencies: postcss "^5.0.5" +postcss-normalize-charset@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/postcss-normalize-charset/-/postcss-normalize-charset-4.0.0.tgz#24527292702d5e8129eafa3d1de49ed51a6ab730" + dependencies: + postcss "^6.0.0" + +postcss-normalize-display-values@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/postcss-normalize-display-values/-/postcss-normalize-display-values-4.0.0.tgz#950e0c7be3445770a160fffd6b6644c3c0cd8f89" + dependencies: + cssnano-util-get-match "^4.0.0" + postcss "^6.0.0" + postcss-value-parser "^3.0.0" + +postcss-normalize-positions@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/postcss-normalize-positions/-/postcss-normalize-positions-4.0.0.tgz#ee9343ab981b822c63ab72615ecccd08564445a3" + dependencies: + cssnano-util-get-arguments "^4.0.0" + has "^1.0.0" + postcss "^6.0.0" + postcss-value-parser "^3.0.0" + +postcss-normalize-repeat-style@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-4.0.0.tgz#b711c592cf16faf9ff575e42fa100b6799083eff" + dependencies: + cssnano-util-get-arguments "^4.0.0" + cssnano-util-get-match "^4.0.0" + postcss "^6.0.0" + postcss-value-parser "^3.0.0" + +postcss-normalize-string@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/postcss-normalize-string/-/postcss-normalize-string-4.0.0.tgz#718cb6d30a6fac6ac6a830e32c06c07dbc66fe5d" + dependencies: + has "^1.0.0" + postcss "^6.0.0" + postcss-value-parser "^3.0.0" + +postcss-normalize-timing-functions@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-4.0.0.tgz#0351f29886aa981d43d91b2c2bd1aea6d0af6d23" + dependencies: + cssnano-util-get-match "^4.0.0" + postcss "^6.0.0" + postcss-value-parser "^3.0.0" + +postcss-normalize-unicode@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/postcss-normalize-unicode/-/postcss-normalize-unicode-4.0.0.tgz#5acd5d47baea5d17674b2ccc4ae5166fa88cdf97" + dependencies: + postcss "^6.0.0" + postcss-value-parser "^3.0.0" + postcss-normalize-url@^3.0.7: version "3.0.8" resolved "https://registry.yarnpkg.com/postcss-normalize-url/-/postcss-normalize-url-3.0.8.tgz#108f74b3f2fcdaf891a2ffa3ea4592279fc78222" @@ -8790,6 +9202,22 @@ postcss-normalize-url@^3.0.7: postcss "^5.0.14" postcss-value-parser "^3.2.3" +postcss-normalize-url@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/postcss-normalize-url/-/postcss-normalize-url-4.0.0.tgz#b7a9c8ad26cf26694c146eb2d68bd0cf49956f0d" + dependencies: + is-absolute-url "^2.0.0" + normalize-url "^3.0.0" + postcss "^6.0.0" + postcss-value-parser "^3.0.0" + +postcss-normalize-whitespace@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/postcss-normalize-whitespace/-/postcss-normalize-whitespace-4.0.0.tgz#1da7e76b10ae63c11827fa04fc3bb4a1efe99cc0" + dependencies: + postcss "^6.0.0" + postcss-value-parser "^3.0.0" + postcss-ordered-values@^2.1.0: version "2.2.3" resolved "https://registry.yarnpkg.com/postcss-ordered-values/-/postcss-ordered-values-2.2.3.tgz#eec6c2a67b6c412a8db2042e77fe8da43f95c11d" @@ -8797,6 +9225,14 @@ postcss-ordered-values@^2.1.0: postcss "^5.0.4" postcss-value-parser "^3.0.1" +postcss-ordered-values@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/postcss-ordered-values/-/postcss-ordered-values-4.1.0.tgz#2c769d5d44aa3c7c907b8be2e997ed19dfd8d50a" + dependencies: + cssnano-util-get-arguments "^4.0.0" + postcss "^6.0.0" + postcss-value-parser "^3.0.0" + postcss-reduce-idents@^2.2.2: version "2.4.0" resolved "https://registry.yarnpkg.com/postcss-reduce-idents/-/postcss-reduce-idents-2.4.0.tgz#c2c6d20cc958284f6abfbe63f7609bf409059ad3" @@ -8810,6 +9246,15 @@ postcss-reduce-initial@^1.0.0: dependencies: postcss "^5.0.4" +postcss-reduce-initial@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/postcss-reduce-initial/-/postcss-reduce-initial-4.0.1.tgz#f2d58f50cea2b0c5dc1278d6ea5ed0ff5829c293" + dependencies: + browserslist "^4.0.0" + caniuse-api "^3.0.0" + has "^1.0.0" + postcss "^6.0.0" + postcss-reduce-transforms@^1.0.3: version "1.0.4" resolved "https://registry.yarnpkg.com/postcss-reduce-transforms/-/postcss-reduce-transforms-1.0.4.tgz#ff76f4d8212437b31c298a42d2e1444025771ae1" @@ -8818,6 +9263,15 @@ postcss-reduce-transforms@^1.0.3: postcss "^5.0.8" postcss-value-parser "^3.0.1" +postcss-reduce-transforms@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/postcss-reduce-transforms/-/postcss-reduce-transforms-4.0.0.tgz#f645fc7440c35274f40de8104e14ad7163edf188" + dependencies: + cssnano-util-get-match "^4.0.0" + has "^1.0.0" + postcss "^6.0.0" + postcss-value-parser "^3.0.0" + postcss-selector-parser@^2.0.0, postcss-selector-parser@^2.2.2: version "2.2.3" resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-2.2.3.tgz#f9437788606c3c9acee16ffe8d8b16297f27bb90" @@ -8826,6 +9280,14 @@ postcss-selector-parser@^2.0.0, postcss-selector-parser@^2.2.2: indexes-of "^1.0.1" uniq "^1.0.1" +postcss-selector-parser@^3.0.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-3.1.1.tgz#4f875f4afb0c96573d5cf4d74011aee250a7e865" + dependencies: + dot-prop "^4.1.1" + indexes-of "^1.0.1" + uniq "^1.0.1" + postcss-svgo@^2.1.1: version "2.1.6" resolved "https://registry.yarnpkg.com/postcss-svgo/-/postcss-svgo-2.1.6.tgz#b6df18aa613b666e133f08adb5219c2684ac108d" @@ -8835,6 +9297,15 @@ postcss-svgo@^2.1.1: postcss-value-parser "^3.2.3" svgo "^0.7.0" +postcss-svgo@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/postcss-svgo/-/postcss-svgo-4.0.0.tgz#c0bbad02520fc636c9d78b0e8403e2e515c32285" + dependencies: + is-svg "^3.0.0" + postcss "^6.0.0" + postcss-value-parser "^3.0.0" + svgo "^1.0.0" + postcss-unique-selectors@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/postcss-unique-selectors/-/postcss-unique-selectors-2.0.2.tgz#981d57d29ddcb33e7b1dfe1fd43b8649f933ca1d" @@ -8843,7 +9314,15 @@ postcss-unique-selectors@^2.0.2: postcss "^5.0.4" uniqs "^2.0.0" -postcss-value-parser@^3.0.1, postcss-value-parser@^3.0.2, postcss-value-parser@^3.1.1, postcss-value-parser@^3.1.2, postcss-value-parser@^3.2.3, postcss-value-parser@^3.3.0: +postcss-unique-selectors@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/postcss-unique-selectors/-/postcss-unique-selectors-4.0.0.tgz#04c1e9764c75874261303402c41f0e9769fc5501" + dependencies: + alphanum-sort "^1.0.0" + postcss "^6.0.0" + uniqs "^2.0.0" + +postcss-value-parser@^3.0.0, postcss-value-parser@^3.0.1, postcss-value-parser@^3.0.2, postcss-value-parser@^3.1.1, postcss-value-parser@^3.1.2, postcss-value-parser@^3.2.3, postcss-value-parser@^3.3.0: version "3.3.0" resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-3.3.0.tgz#87f38f9f18f774a4ab4c8a232f5c5ce8872a9d15" @@ -8864,7 +9343,7 @@ postcss@^5.0.10, postcss@^5.0.11, postcss@^5.0.12, postcss@^5.0.13, postcss@^5.0 source-map "^0.5.6" supports-color "^3.2.3" -postcss@^6.0.1, postcss@^6.0.2: +postcss@^6.0.0, postcss@^6.0.1, postcss@^6.0.2: version "6.0.23" resolved "https://registry.yarnpkg.com/postcss/-/postcss-6.0.23.tgz#61c82cc328ac60e677645f979054eb98bc0e3324" dependencies: @@ -9722,6 +10201,13 @@ reduce-css-calc@^1.2.6, reduce-css-calc@^1.3.0: math-expression-evaluator "^1.2.14" reduce-function-call "^1.0.1" +reduce-css-calc@^2.0.0: + version "2.1.4" + resolved "https://registry.yarnpkg.com/reduce-css-calc/-/reduce-css-calc-2.1.4.tgz#c20e9cda8445ad73d4ff4bea960c6f8353791708" + dependencies: + css-unit-converter "^1.1.1" + postcss-value-parser "^3.3.0" + reduce-function-call@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/reduce-function-call/-/reduce-function-call-1.0.2.tgz#5a200bf92e0e37751752fe45b0ab330fd4b6be99" @@ -9976,7 +10462,7 @@ require-directory@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" -require-from-string@^2.0.1: +require-from-string@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-2.0.2.tgz#89a7fdd938261267318eafe14f9c32e598c36909" @@ -10068,6 +10554,14 @@ retry@^0.10.0, retry@~0.10.0: version "0.10.1" resolved "https://registry.yarnpkg.com/retry/-/retry-0.10.1.tgz#e76388d217992c252750241d3d3956fed98d8ff4" +rgb-regex@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/rgb-regex/-/rgb-regex-1.0.1.tgz#c0e0d6882df0e23be254a475e8edd41915feaeb1" + +rgba-regex@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/rgba-regex/-/rgba-regex-1.0.0.tgz#43374e2e2ca0968b0ef1523460b7d730ff22eeb3" + right-align@^0.1.1: version "0.1.3" resolved "https://registry.yarnpkg.com/right-align/-/right-align-0.1.3.tgz#61339b722fe6a3515689210d24e14c96148613ef" @@ -10161,7 +10655,7 @@ samsam@1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/samsam/-/samsam-1.3.0.tgz#8d1d9350e25622da30de3e44ba692b5221ab7c50" -sax@>=0.6.0, sax@^1.2.1, sax@^1.2.4, sax@~1.2.1: +sax@>=0.6.0, sax@^1.2.1, sax@^1.2.4, sax@~1.2.1, sax@~1.2.4: version "1.2.4" resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" @@ -10394,6 +10888,12 @@ signal-exit@^3.0.0, signal-exit@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d" +simple-swizzle@^0.2.2: + version "0.2.2" + resolved "https://registry.yarnpkg.com/simple-swizzle/-/simple-swizzle-0.2.2.tgz#a4da6b635ffcccca33f70d17cb92592de95e557a" + dependencies: + is-arrayish "^0.3.1" + sinon@^4.0.0: version "4.5.0" resolved "https://registry.yarnpkg.com/sinon/-/sinon-4.5.0.tgz#427ae312a337d3c516804ce2754e8c0d5028cb04" @@ -10660,6 +11160,10 @@ ssri@^5.2.4: dependencies: safe-buffer "^5.1.1" +stable@~0.1.6: + version "0.1.8" + resolved "https://registry.yarnpkg.com/stable/-/stable-0.1.8.tgz#836eb3c8382fe2936feaf544631017ce7d47a3cf" + state-toggle@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/state-toggle/-/state-toggle-1.0.1.tgz#c3cb0974f40a6a0f8e905b96789eb41afa1cde3a" @@ -10845,6 +11349,14 @@ style-loader@^0.18.2: loader-utils "^1.0.2" schema-utils "^0.3.0" +stylehacks@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/stylehacks/-/stylehacks-4.0.0.tgz#64b323951c4a24e5fc7b2ec06c137bf32d155e8a" + dependencies: + browserslist "^4.0.0" + postcss "^6.0.0" + postcss-selector-parser "^3.0.0" + supercluster@^2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/supercluster/-/supercluster-2.3.0.tgz#87ab56081bbea9a1d724df5351ee9e8c3af2f48b" @@ -10897,6 +11409,25 @@ svgo@^0.7.0: sax "~1.2.1" whet.extend "~0.9.9" +svgo@^1.0.0: + version "1.0.5" + resolved "https://registry.yarnpkg.com/svgo/-/svgo-1.0.5.tgz#7040364c062a0538abacff4401cea6a26a7a389a" + dependencies: + coa "~2.0.1" + colors "~1.1.2" + css-select "~1.3.0-rc0" + css-select-base-adapter "~0.1.0" + css-tree "1.0.0-alpha25" + css-url-regex "^1.1.0" + csso "^3.5.0" + js-yaml "~3.10.0" + mkdirp "~0.5.1" + object.values "^1.0.4" + sax "~1.2.4" + stable "~0.1.6" + unquote "~1.1.1" + util.promisify "~1.0.0" + symbol-observable@1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/symbol-observable/-/symbol-observable-1.0.1.tgz#8340fc4702c3122df5d22288f88283f513d3fdd4" @@ -11007,6 +11538,10 @@ timers-browserify@^2.0.4: dependencies: setimmediate "^1.0.4" +timsort@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/timsort/-/timsort-0.3.0.tgz#405411a8e7e6339fe64db9a234de11dc31e02bd4" + tiny-emitter@2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/tiny-emitter/-/tiny-emitter-2.0.2.tgz#82d27468aca5ade8e5fd1e6d22b57dd43ebdfb7c" @@ -11352,6 +11887,10 @@ unpipe@1.0.0, unpipe@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" +unquote@~1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/unquote/-/unquote-1.1.1.tgz#8fded7324ec6e88a0ff8b905e7c098cdc086d544" + unset-value@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/unset-value/-/unset-value-1.0.0.tgz#8376873f7d2335179ffb1e6fc3a8ed0dfc8ab559" @@ -11464,6 +12003,13 @@ util-extend@^1.0.1: version "1.0.3" resolved "https://registry.yarnpkg.com/util-extend/-/util-extend-1.0.3.tgz#a7c216d267545169637b3b6edc6ca9119e2ff93f" +util.promisify@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/util.promisify/-/util.promisify-1.0.0.tgz#440f7165a459c9a16dc145eb8e72f35687097030" + dependencies: + define-properties "^1.1.2" + object.getownpropertydescriptors "^2.0.3" + util@0.10.3: version "0.10.3" resolved "https://registry.yarnpkg.com/util/-/util-0.10.3.tgz#7afb1afe50805246489e3db7fe0ed379336ac0f9" diff --git a/superset/templates/superset/base.html b/superset/templates/superset/base.html index f6c6fa21e17fb..500ed0f87aeda 100644 --- a/superset/templates/superset/base.html +++ b/superset/templates/superset/base.html @@ -10,6 +10,9 @@ {% block tail_js %} {{super()}} + {% for entry in js_manifest('theme') %} + + {% endfor %} {% for entry in js_manifest('common') %} {% endfor %} diff --git a/superset/templates/superset/basic.html b/superset/templates/superset/basic.html index 660ed1023066f..802f14a4a9c36 100644 --- a/superset/templates/superset/basic.html +++ b/superset/templates/superset/basic.html @@ -29,6 +29,9 @@ {% endblock %} + {% for entry in js_manifest('theme') %} + + {% endfor %} {% for entry in js_manifest('common') %} {% endfor %} From e874f88492cf372d6e31400f362c564d0cab1399 Mon Sep 17 00:00:00 2001 From: Beto Dealmeida Date: Tue, 21 Aug 2018 21:31:03 -0700 Subject: [PATCH 07/13] Add categories and time slider to arc deck.gl viz (#5638) * Fix legend position * Add categories and play slider to arc viz * New functionality to arc viz (cherry picked from commit 6959b70c1c2801b0c828b332fa79f562495fcd2f) --- superset/assets/src/explore/visTypes.jsx | 13 +- superset/assets/src/visualizations/Legend.jsx | 1 + .../deckgl/CategoricalDeckGLContainer.jsx | 158 ++++++++++++++++ .../src/visualizations/deckgl/layers/arc.jsx | 38 ++-- .../visualizations/deckgl/layers/scatter.jsx | 171 +----------------- superset/viz.py | 10 + 6 files changed, 204 insertions(+), 187 deletions(-) create mode 100644 superset/assets/src/visualizations/deckgl/CategoricalDeckGLContainer.jsx diff --git a/superset/assets/src/explore/visTypes.jsx b/superset/assets/src/explore/visTypes.jsx index 1d34ae24357d1..0b50830c7551c 100644 --- a/superset/assets/src/explore/visTypes.jsx +++ b/superset/assets/src/explore/visTypes.jsx @@ -756,7 +756,8 @@ export const visTypes = { { label: t('Arc'), controlSetRows: [ - ['color_picker', null], + ['color_picker', 'legend_position'], + ['dimension', 'color_scheme'], ['stroke_width', null], ], }, @@ -770,6 +771,16 @@ export const visTypes = { ], }, ], + controlOverrides: { + dimension: { + label: t('Categorical Color'), + description: t('Pick a dimension from which categorical colors are defined'), + }, + size: { + validators: [], + }, + time_grain_sqla: timeGrainSqlaAnimationOverrides, + }, }, deck_scatter: { diff --git a/superset/assets/src/visualizations/Legend.jsx b/superset/assets/src/visualizations/Legend.jsx index 7de070eab0069..57bd430dc9d53 100644 --- a/superset/assets/src/visualizations/Legend.jsx +++ b/superset/assets/src/visualizations/Legend.jsx @@ -42,6 +42,7 @@ export default class Legend extends React.PureComponent { const vertical = this.props.position.charAt(0) === 't' ? 'top' : 'bottom'; const horizontal = this.props.position.charAt(1) === 'r' ? 'right' : 'left'; const style = { + position: 'absolute', [vertical]: '0px', [horizontal]: '10px', }; diff --git a/superset/assets/src/visualizations/deckgl/CategoricalDeckGLContainer.jsx b/superset/assets/src/visualizations/deckgl/CategoricalDeckGLContainer.jsx new file mode 100644 index 0000000000000..39a202519b2ca --- /dev/null +++ b/superset/assets/src/visualizations/deckgl/CategoricalDeckGLContainer.jsx @@ -0,0 +1,158 @@ +/* eslint no-underscore-dangle: ["error", { "allow": ["", "__timestamp"] }] */ + +import React from 'react'; +import PropTypes from 'prop-types'; + +import AnimatableDeckGLContainer from './AnimatableDeckGLContainer'; +import Legend from '../Legend'; + +import { getColorFromScheme, hexToRGB } from '../../modules/colors'; +import { getPlaySliderParams } from '../../modules/time'; +import sandboxedEval from '../../modules/sandbox'; + +function getCategories(fd, data) { + const c = fd.color_picker || { r: 0, g: 0, b: 0, a: 1 }; + const fixedColor = [c.r, c.g, c.b, 255 * c.a]; + const categories = {}; + data.forEach((d) => { + if (d.cat_color != null && !categories.hasOwnProperty(d.cat_color)) { + let color; + if (fd.dimension) { + color = hexToRGB(getColorFromScheme(d.cat_color, fd.color_scheme), c.a * 255); + } else { + color = fixedColor; + } + categories[d.cat_color] = { color, enabled: true }; + } + }); + return categories; +} + +const propTypes = { + slice: PropTypes.object.isRequired, + data: PropTypes.array.isRequired, + mapboxApiKey: PropTypes.string.isRequired, + setControlValue: PropTypes.func.isRequired, + viewport: PropTypes.object.isRequired, + getLayer: PropTypes.func.isRequired, +}; + +export default class CategoricalDeckGLContainer extends React.PureComponent { + /* + * A Deck.gl container that handles categories. + * + * The container will have an interactive legend, populated from the + * categories present in the data. + */ + + /* eslint-disable-next-line react/sort-comp */ + static getDerivedStateFromProps(nextProps) { + const fd = nextProps.slice.formData; + + const timeGrain = fd.time_grain_sqla || fd.granularity || 'PT1M'; + const timestamps = nextProps.data.map(f => f.__timestamp); + const { start, end, step, values, disabled } = getPlaySliderParams(timestamps, timeGrain); + const categories = getCategories(fd, nextProps.data); + + return { start, end, step, values, disabled, categories }; + } + constructor(props) { + super(props); + this.state = CategoricalDeckGLContainer.getDerivedStateFromProps(props); + + this.getLayers = this.getLayers.bind(this); + this.toggleCategory = this.toggleCategory.bind(this); + this.showSingleCategory = this.showSingleCategory.bind(this); + } + componentWillReceiveProps(nextProps) { + this.setState(CategoricalDeckGLContainer.getDerivedStateFromProps(nextProps, this.state)); + } + addColor(data, fd) { + const c = fd.color_picker || { r: 0, g: 0, b: 0, a: 1 }; + const fixedColor = [c.r, c.g, c.b, 255 * c.a]; + + return data.map((d) => { + let color; + if (fd.dimension) { + color = hexToRGB(getColorFromScheme(d.cat_color, fd.color_scheme), c.a * 255); + } else { + color = fixedColor; + } + return { ...d, color }; + }); + } + getLayers(values) { + const fd = this.props.slice.formData; + let data = [...this.props.data]; + + // Add colors from categories or fixed color + data = this.addColor(data, fd); + + // Apply user defined data mutator if defined + if (fd.js_data_mutator) { + const jsFnMutator = sandboxedEval(fd.js_data_mutator); + data = jsFnMutator(data); + } + + // Filter by time + if (values[0] === values[1] || values[1] === this.end) { + data = data.filter(d => d.__timestamp >= values[0] && d.__timestamp <= values[1]); + } else { + data = data.filter(d => d.__timestamp >= values[0] && d.__timestamp < values[1]); + } + + // Show only categories selected in the legend + if (fd.dimension) { + data = data.filter(d => this.state.categories[d.cat_color].enabled); + } + + return [this.props.getLayer(fd, data, this.props.slice)]; + } + toggleCategory(category) { + const categoryState = this.state.categories[category]; + categoryState.enabled = !categoryState.enabled; + const categories = { ...this.state.categories, [category]: categoryState }; + + // if all categories are disabled, enable all -- similar to nvd3 + if (Object.values(categories).every(v => !v.enabled)) { + /* eslint-disable no-param-reassign */ + Object.values(categories).forEach((v) => { v.enabled = true; }); + } + + this.setState({ categories }); + } + showSingleCategory(category) { + const categories = { ...this.state.categories }; + /* eslint-disable no-param-reassign */ + Object.values(categories).forEach((v) => { v.enabled = false; }); + categories[category].enabled = true; + this.setState({ categories }); + } + render() { + return ( +
+ + + +
+ ); + } +} + +CategoricalDeckGLContainer.propTypes = propTypes; diff --git a/superset/assets/src/visualizations/deckgl/layers/arc.jsx b/superset/assets/src/visualizations/deckgl/layers/arc.jsx index d34e7a13f60d3..b17e357326c80 100644 --- a/superset/assets/src/visualizations/deckgl/layers/arc.jsx +++ b/superset/assets/src/visualizations/deckgl/layers/arc.jsx @@ -1,12 +1,13 @@ +/* eslint no-underscore-dangle: ["error", { "allow": ["", "__timestamp"] }] */ + import React from 'react'; import ReactDOM from 'react-dom'; import { ArcLayer } from 'deck.gl'; -import DeckGLContainer from './../DeckGLContainer'; +import CategoricalDeckGLContainer from '../CategoricalDeckGLContainer'; import * as common from './common'; -import sandboxedEval from '../../../modules/sandbox'; function getPoints(data) { const points = []; @@ -17,20 +18,7 @@ function getPoints(data) { return points; } -function getLayer(formData, payload, slice) { - const fd = formData; - const fc = fd.color_picker; - let data = payload.data.arcs.map(d => ({ - ...d, - color: [fc.r, fc.g, fc.b, 255 * fc.a], - })); - - if (fd.js_data_mutator) { - // Applying user defined data mutator if defined - const jsFnMutator = sandboxedEval(fd.js_data_mutator); - data = jsFnMutator(data); - } - +function getLayer(fd, data, slice) { return new ArcLayer({ id: `path-layer-${fd.slice_id}`, data, @@ -40,23 +28,25 @@ function getLayer(formData, payload, slice) { } function deckArc(slice, payload, setControlValue) { - const layer = getLayer(slice.formData, payload, slice); + const fd = slice.formData; let viewport = { - ...slice.formData.viewport, + ...fd.viewport, width: slice.width(), height: slice.height(), }; - if (slice.formData.autozoom) { + if (fd.autozoom) { viewport = common.fitViewport(viewport, getPoints(payload.data.arcs)); } + ReactDOM.render( - , document.getElementById(slice.containerId), ); diff --git a/superset/assets/src/visualizations/deckgl/layers/scatter.jsx b/superset/assets/src/visualizations/deckgl/layers/scatter.jsx index 768978718e2e6..07590551ac860 100644 --- a/superset/assets/src/visualizations/deckgl/layers/scatter.jsx +++ b/superset/assets/src/visualizations/deckgl/layers/scatter.jsx @@ -2,82 +2,30 @@ import React from 'react'; import ReactDOM from 'react-dom'; -import PropTypes from 'prop-types'; import { ScatterplotLayer } from 'deck.gl'; -import AnimatableDeckGLContainer from '../AnimatableDeckGLContainer'; -import Legend from '../../Legend'; - +import CategoricalDeckGLContainer from '../CategoricalDeckGLContainer'; import * as common from './common'; -import { getColorFromScheme, hexToRGB } from '../../../modules/colors'; -import { getPlaySliderParams } from '../../../modules/time'; import { unitToRadius } from '../../../modules/geo'; -import sandboxedEval from '../../../modules/sandbox'; function getPoints(data) { return data.map(d => d.position); } -function getCategories(formData, payload) { - const fd = formData; - const c = fd.color_picker || { r: 0, g: 0, b: 0, a: 1 }; - const fixedColor = [c.r, c.g, c.b, 255 * c.a]; - const categories = {}; - - payload.data.features.forEach((d) => { - if (d.cat_color != null && !categories.hasOwnProperty(d.cat_color)) { - let color; - if (fd.dimension) { - color = hexToRGB(getColorFromScheme(d.cat_color, fd.color_scheme), c.a * 255); - } else { - color = fixedColor; - } - categories[d.cat_color] = { color, enabled: true }; - } - }); - return categories; -} - -function getLayer(formData, payload, slice, filters) { - const fd = formData; - const c = fd.color_picker || { r: 0, g: 0, b: 0, a: 1 }; - const fixedColor = [c.r, c.g, c.b, 255 * c.a]; - - let data = payload.data.features.map((d) => { +function getLayer(fd, data, slice) { + const dataWithRadius = data.map((d) => { let radius = unitToRadius(fd.point_unit, d.radius) || 10; if (fd.multiplier) { radius *= fd.multiplier; } - let color; - if (fd.dimension) { - color = hexToRGB(getColorFromScheme(d.cat_color, fd.color_scheme), c.a * 255); - } else { - color = fixedColor; - } - return { - ...d, - radius, - color, - }; + return { ...d, radius }; }); - if (fd.js_data_mutator) { - // Applying user defined data mutator if defined - const jsFnMutator = sandboxedEval(fd.js_data_mutator); - data = jsFnMutator(data); - } - - if (filters != null) { - filters.forEach((f) => { - data = data.filter(f); - }); - } - return new ScatterplotLayer({ id: `scatter-layer-${fd.slice_id}`, - data, + data: dataWithRadius, fp64: true, radiusMinPixels: fd.min_radius || null, radiusMaxPixels: fd.max_radius || null, @@ -86,109 +34,6 @@ function getLayer(formData, payload, slice, filters) { }); } -const propTypes = { - slice: PropTypes.object.isRequired, - payload: PropTypes.object.isRequired, - setControlValue: PropTypes.func.isRequired, - viewport: PropTypes.object.isRequired, -}; - -class DeckGLScatter extends React.PureComponent { - /* eslint-disable-next-line react/sort-comp */ - static getDerivedStateFromProps(nextProps) { - const fd = nextProps.slice.formData; - - const timeGrain = fd.time_grain_sqla || fd.granularity || 'PT1M'; - const timestamps = nextProps.payload.data.features.map(f => f.__timestamp); - const { start, end, step, values, disabled } = getPlaySliderParams(timestamps, timeGrain); - - const categories = getCategories(fd, nextProps.payload); - - return { start, end, step, values, disabled, categories }; - } - constructor(props) { - super(props); - this.state = DeckGLScatter.getDerivedStateFromProps(props); - - this.getLayers = this.getLayers.bind(this); - this.toggleCategory = this.toggleCategory.bind(this); - this.showSingleCategory = this.showSingleCategory.bind(this); - } - componentWillReceiveProps(nextProps) { - this.setState(DeckGLScatter.getDerivedStateFromProps(nextProps, this.state)); - } - getLayers(values) { - const filters = []; - - // time filter - if (values[0] === values[1] || values[1] === this.end) { - filters.push(d => d.__timestamp >= values[0] && d.__timestamp <= values[1]); - } else { - filters.push(d => d.__timestamp >= values[0] && d.__timestamp < values[1]); - } - - // legend filter - if (this.props.slice.formData.dimension) { - filters.push(d => this.state.categories[d.cat_color].enabled); - } - - const layer = getLayer( - this.props.slice.formData, - this.props.payload, - this.props.slice, - filters); - - return [layer]; - } - toggleCategory(category) { - const categoryState = this.state.categories[category]; - categoryState.enabled = !categoryState.enabled; - const categories = { ...this.state.categories, [category]: categoryState }; - - // if all categories are disabled, enable all -- similar to nvd3 - if (Object.values(categories).every(v => !v.enabled)) { - /* eslint-disable no-param-reassign */ - Object.values(categories).forEach((v) => { v.enabled = true; }); - } - - this.setState({ categories }); - } - showSingleCategory(category) { - const categories = { ...this.state.categories }; - /* eslint-disable no-param-reassign */ - Object.values(categories).forEach((v) => { v.enabled = false; }); - categories[category].enabled = true; - this.setState({ categories }); - } - render() { - return ( -
- - - -
- ); - } -} - -DeckGLScatter.propTypes = propTypes; - function deckScatter(slice, payload, setControlValue) { const fd = slice.formData; let viewport = { @@ -202,11 +47,13 @@ function deckScatter(slice, payload, setControlValue) { } ReactDOM.render( - , document.getElementById(slice.containerId), ); diff --git a/superset/viz.py b/superset/viz.py index 9dee6f35ab5f8..10112a38a41d6 100644 --- a/superset/viz.py +++ b/superset/viz.py @@ -2321,11 +2321,21 @@ class DeckArc(BaseDeckGLViz): viz_type = 'deck_arc' verbose_name = _('Deck.gl - Arc') spatial_control_keys = ['start_spatial', 'end_spatial'] + is_timeseries = True + + def query_obj(self): + fd = self.form_data + self.is_timeseries = bool( + fd.get('time_grain_sqla') or fd.get('granularity')) + return super(DeckArc, self).query_obj() def get_properties(self, d): + dim = self.form_data.get('dimension') return { 'sourcePosition': d.get('start_spatial'), 'targetPosition': d.get('end_spatial'), + 'cat_color': d.get(dim) if dim else None, + DTTM_ALIAS: d.get(DTTM_ALIAS), } def get_data(self, df): From 059e7fcfd6f378033106f0650d7fa6cd4bd7ed3f Mon Sep 17 00:00:00 2001 From: Krist Wongsuphasawat Date: Wed, 5 Sep 2018 12:11:37 -0700 Subject: [PATCH 08/13] resolve merge conflicts --- superset/assets/package.json | 4 + .../assets/src/visualizations/Histogram.jsx | 137 +++ .../assets/src/visualizations/WithLegend.css | 4 + .../assets/src/visualizations/WithLegend.jsx | 123 +++ .../deckgl/CategoricalDeckGLContainer.jsx | 25 +- .../assets/src/visualizations/histogram.css | 16 - .../assets/src/visualizations/histogram.js | 177 ---- superset/assets/src/visualizations/index.js | 2 +- .../assets/src/visualizations/sunburst.js | 1 - superset/assets/yarn.lock | 961 ++++++++++-------- 10 files changed, 795 insertions(+), 655 deletions(-) create mode 100644 superset/assets/src/visualizations/Histogram.jsx create mode 100644 superset/assets/src/visualizations/WithLegend.css create mode 100644 superset/assets/src/visualizations/WithLegend.jsx delete mode 100644 superset/assets/src/visualizations/histogram.css delete mode 100644 superset/assets/src/visualizations/histogram.js diff --git a/superset/assets/package.json b/superset/assets/package.json index d3bb7daba44ff..3927b2c500c31 100644 --- a/superset/assets/package.json +++ b/superset/assets/package.json @@ -45,9 +45,13 @@ "homepage": "http://superset.apache.org/", "dependencies": { "@data-ui/event-flow": "^0.0.54", + "@data-ui/histogram": "^0.0.64", "@data-ui/sparkline": "^0.0.54", + "@data-ui/theme": "^0.0.62", "@data-ui/xy-chart": "^0.0.61", + "@vx/legend": "^0.0.170", "@vx/responsive": "0.0.172", + "@vx/scale": "^0.0.165", "babel-register": "^6.24.1", "bootstrap": "^3.3.6", "bootstrap-slider": "^10.0.0", diff --git a/superset/assets/src/visualizations/Histogram.jsx b/superset/assets/src/visualizations/Histogram.jsx new file mode 100644 index 0000000000000..6de9829f169f5 --- /dev/null +++ b/superset/assets/src/visualizations/Histogram.jsx @@ -0,0 +1,137 @@ +import PropTypes from 'prop-types'; +import React from 'react'; +import ReactDOM from 'react-dom'; +import { Histogram, BarSeries, XAxis, YAxis } from '@data-ui/histogram'; +import { chartTheme } from '@data-ui/theme'; +import { LegendOrdinal } from '@vx/legend'; +import { scaleOrdinal } from '@vx/scale'; +import WithLegend from './WithLegend'; +import { getColorFromScheme } from '../modules/colors'; + +const propTypes = { + className: PropTypes.string, + data: PropTypes.arrayOf(PropTypes.shape({ + key: PropTypes.string, + values: PropTypes.arrayOf(PropTypes.number), + })).isRequired, + width: PropTypes.number.isRequired, + height: PropTypes.number.isRequired, + colorScheme: PropTypes.string, + normalized: PropTypes.bool, + binCount: PropTypes.number, + opacity: PropTypes.number, + xAxisLabel: PropTypes.string, + yAxisLabel: PropTypes.string, +}; +const defaultProps = { + className: '', + colorScheme: '', + normalized: false, + binCount: 15, + opacity: 1, + xAxisLabel: '', + yAxisLabel: '', +}; + +class CustomHistogram extends React.PureComponent { + render() { + const { + className, + data, + width, + height, + binCount, + colorScheme, + normalized, + opacity, + xAxisLabel, + yAxisLabel, + } = this.props; + + const keys = data.map(d => d.key); + const colorScale = scaleOrdinal({ + domain: keys, + range: keys.map(key => getColorFromScheme(key, colorScheme)), + }); + + return ( + ( + + )} + renderChart={parent => ( + ( +
+ {datum.bin0} to {datum.bin1} +
count {datum.count}
+
cumulative {datum.cumulative}
+
+ )} + valueAccessor={datum => datum} + theme={chartTheme} + > + {data.map(series => ( + + ))} + + +
+ )} + /> + ); + } +} + +CustomHistogram.propTypes = propTypes; +CustomHistogram.defaultProps = defaultProps; + +function adaptor(slice, payload) { + const { selector, formData } = slice; + const { + color_scheme: colorScheme, + link_length: binCount, + normalized, + global_opacity: opacity, + x_axis_label: xAxisLabel, + y_axis_label: yAxisLabel, + } = formData; + + ReactDOM.render( + , + document.querySelector(selector), + ); +} + +export default adaptor; diff --git a/superset/assets/src/visualizations/WithLegend.css b/superset/assets/src/visualizations/WithLegend.css new file mode 100644 index 0000000000000..34bc558fa058e --- /dev/null +++ b/superset/assets/src/visualizations/WithLegend.css @@ -0,0 +1,4 @@ +.with-legend .legend-container { + padding-top: 5px; + font-size: 0.9em; +} diff --git a/superset/assets/src/visualizations/WithLegend.jsx b/superset/assets/src/visualizations/WithLegend.jsx new file mode 100644 index 0000000000000..c6ef5cd65765b --- /dev/null +++ b/superset/assets/src/visualizations/WithLegend.jsx @@ -0,0 +1,123 @@ +import React from 'react'; +import PropTypes from 'prop-types'; +import { ParentSize } from '@vx/responsive'; +import './WithLegend.css'; + +const propTypes = { + className: PropTypes.string, + width: PropTypes.oneOfType([PropTypes.number, PropTypes.string]), + height: PropTypes.oneOfType([PropTypes.number, PropTypes.string]), + renderChart: PropTypes.func.isRequired, + renderLegend: PropTypes.func.isRequired, + position: PropTypes.oneOf(['top', 'left', 'bottom', 'right']), + legendJustifyContent: PropTypes.oneOf(['center', 'flex-start', 'flex-end']), +}; +const defaultProps = { + className: '', + width: 'auto', + height: 'auto', + position: 'top', + legendJustifyContent: undefined, +}; + +const LEGEND_STYLE_BASE = { + display: 'flex', + flexGrow: 0, + flexShrink: 0, + order: -1, +}; + +const CHART_STYLE_BASE = { + flexGrow: 1, + flexShrink: 1, + flexBasis: 'auto', + position: 'relative', +}; + +class WithLegend extends React.Component { + getContainerDirection() { + const { position } = this.props; + switch (position) { + case 'left': return 'row'; + case 'right': return 'row-reverse'; + case 'bottom': return 'column-reverse'; + default: + case 'top': return 'column'; + } + } + + getLegendJustifyContent() { + const { legendJustifyContent, position } = this.props; + if (legendJustifyContent) { + return legendJustifyContent; + } + switch (position) { + case 'left': return 'flex-start'; + case 'right': return 'flex-start'; + case 'bottom': return 'flex-end'; + default: + case 'top': return 'flex-end'; + } + } + + render() { + const { + className, + width, + height, + position, + renderChart, + renderLegend, + } = this.props; + + const isHorizontal = position === 'left' || position === 'right'; + + const style = { + display: 'flex', + flexDirection: this.getContainerDirection(), + }; + if (width) { + style.width = width; + } + if (height) { + style.height = height; + } + + const chartStyle = { ...CHART_STYLE_BASE }; + if (isHorizontal) { + chartStyle.width = 0; + } else { + chartStyle.height = 0; + } + + const legendDirection = isHorizontal ? 'column' : 'row'; + const legendStyle = { + ...LEGEND_STYLE_BASE, + flexDirection: legendDirection, + justifyContent: this.getLegendJustifyContent(), + }; + + return ( +
+
+ {renderLegend({ + // Pass flexDirection for @vx/legend to arrange legend items + direction: legendDirection, + })} +
+
+ {parent => (parent.width > 0 && parent.height > 0) + // Only render when necessary + ? renderChart(parent) + : null} + +
+
+ ); + } +} + +WithLegend.propTypes = propTypes; +WithLegend.defaultProps = defaultProps; + +export default WithLegend; diff --git a/superset/assets/src/visualizations/deckgl/CategoricalDeckGLContainer.jsx b/superset/assets/src/visualizations/deckgl/CategoricalDeckGLContainer.jsx index 39a202519b2ca..fcf4f593ee236 100644 --- a/superset/assets/src/visualizations/deckgl/CategoricalDeckGLContainer.jsx +++ b/superset/assets/src/visualizations/deckgl/CategoricalDeckGLContainer.jsx @@ -67,20 +67,6 @@ export default class CategoricalDeckGLContainer extends React.PureComponent { componentWillReceiveProps(nextProps) { this.setState(CategoricalDeckGLContainer.getDerivedStateFromProps(nextProps, this.state)); } - addColor(data, fd) { - const c = fd.color_picker || { r: 0, g: 0, b: 0, a: 1 }; - const fixedColor = [c.r, c.g, c.b, 255 * c.a]; - - return data.map((d) => { - let color; - if (fd.dimension) { - color = hexToRGB(getColorFromScheme(d.cat_color, fd.color_scheme), c.a * 255); - } else { - color = fixedColor; - } - return { ...d, color }; - }); - } getLayers(values) { const fd = this.props.slice.formData; let data = [...this.props.data]; @@ -108,6 +94,17 @@ export default class CategoricalDeckGLContainer extends React.PureComponent { return [this.props.getLayer(fd, data, this.props.slice)]; } + addColor(data, fd) { + const c = fd.color_picker || { r: 0, g: 0, b: 0, a: 1 }; + return data.map((d) => { + let color; + if (fd.dimension) { + color = hexToRGB(getColorFromScheme(d.cat_color, fd.color_scheme), c.a * 255); + return { ...d, color }; + } + return d; + }); + } toggleCategory(category) { const categoryState = this.state.categories[category]; categoryState.enabled = !categoryState.enabled; diff --git a/superset/assets/src/visualizations/histogram.css b/superset/assets/src/visualizations/histogram.css deleted file mode 100644 index 7a59c088ec87b..0000000000000 --- a/superset/assets/src/visualizations/histogram.css +++ /dev/null @@ -1,16 +0,0 @@ -.axis line { - fill: none; - stroke: black; - shape-rendering: crispEdges; -} - -.axis text { - font-family: "Roboto", "Helvetica Neue", Helvetica, Arial, sans-serif; - font-size: 11px; -} - -.axis path, .axis line { - fill: none; - stroke: #000; - shape-rendering: crispEdges; -} diff --git a/superset/assets/src/visualizations/histogram.js b/superset/assets/src/visualizations/histogram.js deleted file mode 100644 index f510f1c90f152..0000000000000 --- a/superset/assets/src/visualizations/histogram.js +++ /dev/null @@ -1,177 +0,0 @@ -import d3 from 'd3'; -import nv from 'nvd3'; -import { getColorFromScheme } from '../modules/colors'; - -require('./histogram.css'); - -function histogram(slice, payload) { - const data = payload.data; - const div = d3.select(slice.selector); - const numBins = Number(slice.formData.link_length) || 10; - const normalized = slice.formData.normalized; - const xAxisLabel = slice.formData.x_axis_label; - const yAxisLabel = slice.formData.y_axis_label; - const opacity = slice.formData.global_opacity; - - const draw = function () { - // Set Margins - const margin = { - top: 50, - right: 10, - bottom: 20, - left: yAxisLabel ? 70 : 50, - }; - const navBarHeight = 36; - const navBarBuffer = 10; - const width = slice.width() - margin.left - margin.right; - const height = slice.height() - margin.top - margin.bottom - navBarHeight - navBarBuffer; - - // set number of ticks - const maxTicks = 20; - const numTicks = d3.min([maxTicks, numBins]); - - // Set Histogram objects - const x = d3.scale.linear(); - const y = d3.scale.linear(); - const xAxis = d3.svg.axis() - .scale(x) - .orient('bottom') - .ticks(numTicks, 's'); - const yAxis = d3.svg.axis() - .scale(y) - .orient('left') - .ticks(numTicks, 's'); - - // Set the x-values - const max = d3.max(data, d => d3.max(d.values)); - const min = d3.min(data, d => d3.min(d.values)); - x.domain([min, max]) - .range([0, width], 0.1); - - // Calculate bins for the data - let bins = []; - data.forEach((d) => { - let b = d3.layout.histogram().bins(numBins)(d.values); - const color = getColorFromScheme(d.key, slice.formData.color_scheme); - const w = d3.max([(x(b[0].dx) - x(0)) - 1, 0]); - const key = d.key; - // normalize if necessary - if (normalized) { - const total = d.values.length; - b = b.map(v => ({ ...v, y: v.y / total })); - } - bins = bins.concat(b.map(v => ({ ...v, color, width: w, key, opacity }))); - }); - - // Set the y-values - y.domain([0, d3.max(bins, d => d.y)]) - .range([height, 0]); - - // Create the svg value with the bins - const svg = div.selectAll('svg') - .data([bins]) - .enter() - .append('svg'); - - // Make a rectangular background fill - svg.append('rect') - .attr('width', '100%') - .attr('height', '100%') - .attr('fill', '#f6f6f6'); - - // Transform the svg to make space for the margins - const gEnter = svg - .append('g') - .attr('transform', 'translate(' + margin.left + ',' + margin.top + ')'); - - // Add the bars and the x axis - gEnter.append('g').attr('class', 'bars'); - gEnter.append('g').attr('class', 'x axis'); - - // Add width and height to the svg - svg.attr('width', slice.width()) - .attr('height', slice.height()); - - // make legend - const legend = nv.models.legend() - .color(d => getColorFromScheme(d.key, slice.formData.color_scheme)) - .width(width); - const gLegend = gEnter.append('g').attr('class', 'nv-legendWrap') - .attr('transform', 'translate(0,' + (-margin.top) + ')') - .datum(data.map(d => ({ ...d, disabled: false }))); - - // function to draw bars and legends - function update(selectedBins) { - // Create the bars in the svg - const bar = svg.select('.bars') - .selectAll('rect') - .data(selectedBins, d => d.key + d.x); - // Set the Height and Width for each bar - bar.enter() - .append('rect') - .attr('width', d => d.width) - .attr('x', d => x(d.x)) - .style('fill', d => d.color) - .style('fill-opacity', d => d.opacity) - .attr('y', d => y(d.y)) - .attr('height', d => y.range()[0] - y(d.y)); - bar.exit() - .attr('y', y(0)) - .attr('height', 0) - .remove(); - // apply legend - gLegend.call(legend); - } - - update(bins); - - // Update the x-axis - svg.append('g') - .attr('class', 'axis') - .attr('transform', 'translate(' + margin.left + ',' + (height + margin.top) + ')') - .text('values') - .call(xAxis); - - // Update the Y Axis and add minor lines - svg.append('g') - .attr('class', 'axis') - .attr('transform', 'translate(' + margin.left + ',' + margin.top + ')') - .text('count') - .call(yAxis) - .selectAll('g') - .filter(function (d) { return d; }) - .classed('minor', true); - - // set callback on legend toggle - legend.dispatch.on('stateChange', function (newState) { - const activeKeys = data - .filter((d, i) => !newState.disabled[i]) - .map(d => d.key); - update(bins.filter(d => activeKeys.indexOf(d.key) >= 0)); - }); - - // add axis labels if passed - if (xAxisLabel) { - svg.append('text') - .attr('transform', - 'translate(' + ((width + margin.left) / 2) + ' ,' + - (height + margin.top + 50) + ')') - .style('text-anchor', 'middle') - .text(xAxisLabel); - } - if (yAxisLabel) { - svg.append('text') - .attr('transform', 'rotate(-90)') - .attr('y', '1em') - .attr('x', 0 - (height / 2)) - .attr('dy', '1em') - .style('text-anchor', 'middle') - .text(yAxisLabel); - } - }; - - div.selectAll('*').remove(); - draw(); -} - -module.exports = histogram; diff --git a/superset/assets/src/visualizations/index.js b/superset/assets/src/visualizations/index.js index bb878bd700e6c..99a70f26cb5c9 100644 --- a/superset/assets/src/visualizations/index.js +++ b/superset/assets/src/visualizations/index.js @@ -82,7 +82,7 @@ const vizMap = { loadVis(import(/* webpackChunkName: "filter_box" */ './filter_box.jsx')), [VIZ_TYPES.heatmap]: () => loadVis(import(/* webpackChunkName: "heatmap" */ './heatmap.js')), [VIZ_TYPES.histogram]: () => - loadVis(import(/* webpackChunkName: "histogram" */ './histogram.js')), + loadVis(import(/* webpackChunkName: "histogram" */ './Histogram.jsx')), [VIZ_TYPES.horizon]: () => loadVis(import(/* webpackChunkName: "horizon" */ './HorizonChart.jsx')), [VIZ_TYPES.iframe]: () => loadVis(import(/* webpackChunkName: "iframe" */ './iframe.js')), [VIZ_TYPES.line]: loadNvd3, diff --git a/superset/assets/src/visualizations/sunburst.js b/superset/assets/src/visualizations/sunburst.js index 8e8bf45a85337..28fe605ebab11 100644 --- a/superset/assets/src/visualizations/sunburst.js +++ b/superset/assets/src/visualizations/sunburst.js @@ -187,7 +187,6 @@ function Sunburst(element, props) { // If metrics match, assume we are coloring by category const metricsMatch = Math.abs(d.m1 - d.m2) < 0.00001; - console.log('metrics', metrics); gMiddleText.selectAll('*').remove(); diff --git a/superset/assets/yarn.lock b/superset/assets/yarn.lock index b401118ab7e56..0b112848213af 100644 --- a/superset/assets/yarn.lock +++ b/superset/assets/yarn.lock @@ -4,13 +4,19 @@ "@babel/code-frame@7.0.0-beta.44": version "7.0.0-beta.44" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.0.0-beta.44.tgz#2a02643368de80916162be70865c97774f3adbd9" + resolved "http://registry.npmjs.org/@babel/code-frame/-/code-frame-7.0.0-beta.44.tgz#2a02643368de80916162be70865c97774f3adbd9" dependencies: "@babel/highlight" "7.0.0-beta.44" +"@babel/code-frame@7.0.0-beta.51": + version "7.0.0-beta.51" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.0.0-beta.51.tgz#bd71d9b192af978df915829d39d4094456439a0c" + dependencies: + "@babel/highlight" "7.0.0-beta.51" + "@babel/generator@7.0.0-beta.44": version "7.0.0-beta.44" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.0.0-beta.44.tgz#c7e67b9b5284afcf69b309b50d7d37f3e5033d42" + resolved "http://registry.npmjs.org/@babel/generator/-/generator-7.0.0-beta.44.tgz#c7e67b9b5284afcf69b309b50d7d37f3e5033d42" dependencies: "@babel/types" "7.0.0-beta.44" jsesc "^2.5.1" @@ -18,53 +24,103 @@ source-map "^0.5.0" trim-right "^1.0.1" +"@babel/generator@7.0.0-beta.51": + version "7.0.0-beta.51" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.0.0-beta.51.tgz#6c7575ffde761d07485e04baedc0392c6d9e30f6" + dependencies: + "@babel/types" "7.0.0-beta.51" + jsesc "^2.5.1" + lodash "^4.17.5" + source-map "^0.5.0" + trim-right "^1.0.1" + "@babel/helper-function-name@7.0.0-beta.44": version "7.0.0-beta.44" - resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.0.0-beta.44.tgz#e18552aaae2231100a6e485e03854bc3532d44dd" + resolved "http://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.0.0-beta.44.tgz#e18552aaae2231100a6e485e03854bc3532d44dd" dependencies: "@babel/helper-get-function-arity" "7.0.0-beta.44" "@babel/template" "7.0.0-beta.44" "@babel/types" "7.0.0-beta.44" +"@babel/helper-function-name@7.0.0-beta.51": + version "7.0.0-beta.51" + resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.0.0-beta.51.tgz#21b4874a227cf99ecafcc30a90302da5a2640561" + dependencies: + "@babel/helper-get-function-arity" "7.0.0-beta.51" + "@babel/template" "7.0.0-beta.51" + "@babel/types" "7.0.0-beta.51" + "@babel/helper-get-function-arity@7.0.0-beta.44": version "7.0.0-beta.44" - resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0-beta.44.tgz#d03ca6dd2b9f7b0b1e6b32c56c72836140db3a15" + resolved "http://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0-beta.44.tgz#d03ca6dd2b9f7b0b1e6b32c56c72836140db3a15" dependencies: "@babel/types" "7.0.0-beta.44" +"@babel/helper-get-function-arity@7.0.0-beta.51": + version "7.0.0-beta.51" + resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0-beta.51.tgz#3281b2d045af95c172ce91b20825d85ea4676411" + dependencies: + "@babel/types" "7.0.0-beta.51" + "@babel/helper-module-imports@^7.0.0-beta.49": - version "7.0.0-rc.1" - resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.0.0-rc.1.tgz#c6269fa9dc451152895f185f0339d45f32c52e75" + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.0.0.tgz#96081b7111e486da4d2cd971ad1a4fe216cc2e3d" dependencies: - "@babel/types" "7.0.0-rc.1" - lodash "^4.17.10" + "@babel/types" "^7.0.0" "@babel/helper-split-export-declaration@7.0.0-beta.44": version "7.0.0-beta.44" - resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.0.0-beta.44.tgz#c0b351735e0fbcb3822c8ad8db4e583b05ebd9dc" + resolved "http://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.0.0-beta.44.tgz#c0b351735e0fbcb3822c8ad8db4e583b05ebd9dc" dependencies: "@babel/types" "7.0.0-beta.44" +"@babel/helper-split-export-declaration@7.0.0-beta.51": + version "7.0.0-beta.51" + resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.0.0-beta.51.tgz#8a6c3f66c4d265352fc077484f9f6e80a51ab978" + dependencies: + "@babel/types" "7.0.0-beta.51" + "@babel/highlight@7.0.0-beta.44": version "7.0.0-beta.44" - resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.0.0-beta.44.tgz#18c94ce543916a80553edcdcf681890b200747d5" + resolved "http://registry.npmjs.org/@babel/highlight/-/highlight-7.0.0-beta.44.tgz#18c94ce543916a80553edcdcf681890b200747d5" + dependencies: + chalk "^2.0.0" + esutils "^2.0.2" + js-tokens "^3.0.0" + +"@babel/highlight@7.0.0-beta.51": + version "7.0.0-beta.51" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.0.0-beta.51.tgz#e8844ae25a1595ccfd42b89623b4376ca06d225d" dependencies: chalk "^2.0.0" esutils "^2.0.2" js-tokens "^3.0.0" +"@babel/parser@7.0.0-beta.51": + version "7.0.0-beta.51" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.0.0-beta.51.tgz#27cec2df409df60af58270ed8f6aa55409ea86f6" + "@babel/template@7.0.0-beta.44": version "7.0.0-beta.44" - resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.0.0-beta.44.tgz#f8832f4fdcee5d59bf515e595fc5106c529b394f" + resolved "http://registry.npmjs.org/@babel/template/-/template-7.0.0-beta.44.tgz#f8832f4fdcee5d59bf515e595fc5106c529b394f" dependencies: "@babel/code-frame" "7.0.0-beta.44" "@babel/types" "7.0.0-beta.44" babylon "7.0.0-beta.44" lodash "^4.2.0" +"@babel/template@7.0.0-beta.51": + version "7.0.0-beta.51" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.0.0-beta.51.tgz#9602a40aebcf357ae9677e2532ef5fc810f5fbff" + dependencies: + "@babel/code-frame" "7.0.0-beta.51" + "@babel/parser" "7.0.0-beta.51" + "@babel/types" "7.0.0-beta.51" + lodash "^4.17.5" + "@babel/traverse@7.0.0-beta.44": version "7.0.0-beta.44" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.0.0-beta.44.tgz#a970a2c45477ad18017e2e465a0606feee0d2966" + resolved "http://registry.npmjs.org/@babel/traverse/-/traverse-7.0.0-beta.44.tgz#a970a2c45477ad18017e2e465a0606feee0d2966" dependencies: "@babel/code-frame" "7.0.0-beta.44" "@babel/generator" "7.0.0-beta.44" @@ -77,17 +133,40 @@ invariant "^2.2.0" lodash "^4.2.0" +"@babel/traverse@7.0.0-beta.51": + version "7.0.0-beta.51" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.0.0-beta.51.tgz#981daf2cec347a6231d3aa1d9e1803b03aaaa4a8" + dependencies: + "@babel/code-frame" "7.0.0-beta.51" + "@babel/generator" "7.0.0-beta.51" + "@babel/helper-function-name" "7.0.0-beta.51" + "@babel/helper-split-export-declaration" "7.0.0-beta.51" + "@babel/parser" "7.0.0-beta.51" + "@babel/types" "7.0.0-beta.51" + debug "^3.1.0" + globals "^11.1.0" + invariant "^2.2.0" + lodash "^4.17.5" + "@babel/types@7.0.0-beta.44": version "7.0.0-beta.44" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.0.0-beta.44.tgz#6b1b164591f77dec0a0342aca995f2d046b3a757" + resolved "http://registry.npmjs.org/@babel/types/-/types-7.0.0-beta.44.tgz#6b1b164591f77dec0a0342aca995f2d046b3a757" dependencies: esutils "^2.0.2" lodash "^4.2.0" to-fast-properties "^2.0.0" -"@babel/types@7.0.0-rc.1", "@babel/types@^7.0.0-beta.49": - version "7.0.0-rc.1" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.0.0-rc.1.tgz#6abf6d14ddd9fc022617e5b62e6b32f4fa6526ad" +"@babel/types@7.0.0-beta.51": + version "7.0.0-beta.51" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.0.0-beta.51.tgz#d802b7b543b5836c778aa691797abf00f3d97ea9" + dependencies: + esutils "^2.0.2" + lodash "^4.17.5" + to-fast-properties "^2.0.0" + +"@babel/types@^7.0.0", "@babel/types@^7.0.0-beta.49": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.0.0.tgz#6e191793d3c854d19c6749989e3bc55f0e962118" dependencies: esutils "^2.0.2" lodash "^4.17.10" @@ -133,6 +212,29 @@ prop-types "^15.5.10" react-select "^1.0.0-rc.5" +"@data-ui/histogram@^0.0.64": + version "0.0.64" + resolved "https://registry.yarnpkg.com/@data-ui/histogram/-/histogram-0.0.64.tgz#c04ca4acbac42b7d3d6394ce57e41b7d1b5bb00e" + dependencies: + "@data-ui/shared" "^0.0.63" + "@data-ui/theme" "^0.0.62" + "@vx/axis" "0.0.140" + "@vx/curve" "0.0.140" + "@vx/event" "0.0.140" + "@vx/glyph" "0.0.140" + "@vx/gradient" "0.0.140" + "@vx/group" "0.0.140" + "@vx/pattern" "0.0.140" + "@vx/responsive" "0.0.147" + "@vx/scale" "0.0.140" + "@vx/shape" "0.0.140" + "@vx/tooltip" "0.0.140" + babel-runtime "^6.26.0" + d3-array "^1.2.0" + d3-scale "^1.0.6" + prop-types "^15.5.10" + react-move "^2.1.0" + "@data-ui/radial-chart@0.0.54": version "0.0.54" resolved "https://registry.yarnpkg.com/@data-ui/radial-chart/-/radial-chart-0.0.54.tgz#0d28b07681d9b6027d9ac23b729241827d513001" @@ -171,6 +273,19 @@ d3-array "^1.2.1" prop-types "^15.5.10" +"@data-ui/shared@^0.0.63": + version "0.0.63" + resolved "https://registry.yarnpkg.com/@data-ui/shared/-/shared-0.0.63.tgz#870e84adaa0600b18679b291874cf01c5325829a" + dependencies: + "@data-ui/theme" "^0.0.62" + "@vx/event" "^0.0.165" + "@vx/group" "^0.0.165" + "@vx/shape" "^0.0.168" + "@vx/tooltip" "0.0.165" + babel-runtime "^6.26.0" + d3-array "^1.2.1" + prop-types "^15.5.10" + "@data-ui/sparkline@^0.0.54": version "0.0.54" resolved "https://registry.yarnpkg.com/@data-ui/sparkline/-/sparkline-0.0.54.tgz#ce3d166d9e0b239a0ba02f3894cb9e8c84171cef" @@ -205,6 +320,12 @@ dependencies: babel-runtime "^6.26.0" +"@data-ui/theme@^0.0.62": + version "0.0.62" + resolved "https://registry.yarnpkg.com/@data-ui/theme/-/theme-0.0.62.tgz#a7f50bb796fd6ea90171cb2c7f958f3bb24fe6d9" + dependencies: + babel-runtime "^6.26.0" + "@data-ui/xy-chart@^0.0.61": version "0.0.61" resolved "https://registry.yarnpkg.com/@data-ui/xy-chart/-/xy-chart-0.0.61.tgz#ee4e47913116a03a7bc4fc0ff1b0d815f80ee736" @@ -308,8 +429,8 @@ glob-to-regexp "^0.3.0" "@nodelib/fs.stat@^1.0.1": - version "1.1.0" - resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-1.1.0.tgz#50c1e2260ac0ed9439a181de3725a0168d59c48a" + version "1.1.2" + resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-1.1.2.tgz#54c5a964462be3d4d78af631363c18d6fa91ac26" "@samverschueren/stream-to-observable@^0.3.0": version "0.3.0" @@ -489,6 +610,12 @@ dependencies: classnames "^2.2.5" +"@vx/group@0.0.170": + version "0.0.170" + resolved "https://registry.yarnpkg.com/@vx/group/-/group-0.0.170.tgz#8b30b3ea07c348fe22253812fe7cb6d4200d725d" + dependencies: + classnames "^2.2.5" + "@vx/legend@0.0.140": version "0.0.140" resolved "https://registry.yarnpkg.com/@vx/legend/-/legend-0.0.140.tgz#4062c27d6bc9c4d607309d77eff12b844727ae99" @@ -497,6 +624,14 @@ classnames "^2.2.5" prop-types "^15.5.10" +"@vx/legend@^0.0.170": + version "0.0.170" + resolved "https://registry.yarnpkg.com/@vx/legend/-/legend-0.0.170.tgz#06bce2c4eff7b20bf1fff55737a831144c502f28" + dependencies: + "@vx/group" "0.0.170" + classnames "^2.2.5" + prop-types "^15.5.10" + "@vx/pattern@0.0.140": version "0.0.140" resolved "https://registry.yarnpkg.com/@vx/pattern/-/pattern-0.0.140.tgz#f49f57c6f13cb5b3baaa5bbec174c5d3aa782da7" @@ -529,6 +664,13 @@ dependencies: lodash "^4.0.8" +"@vx/responsive@0.0.147": + version "0.0.147" + resolved "https://registry.yarnpkg.com/@vx/responsive/-/responsive-0.0.147.tgz#c94adbb41ad1e21b5d1ebde241b00463903fc79c" + dependencies: + lodash "^4.0.8" + resize-observer-polyfill "1.4.2" + "@vx/responsive@0.0.172": version "0.0.172" resolved "https://registry.yarnpkg.com/@vx/responsive/-/responsive-0.0.172.tgz#26db0b946bcb0b1db2025c097c0b365f21ba033d" @@ -790,17 +932,6 @@ "@webassemblyjs/wast-parser" "1.5.13" long "^3.2.0" -"@webpack-contrib/schema-utils@^1.0.0-beta.0": - version "1.0.0-beta.0" - resolved "https://registry.yarnpkg.com/@webpack-contrib/schema-utils/-/schema-utils-1.0.0-beta.0.tgz#bf9638c9464d177b48209e84209e23bee2eb4f65" - dependencies: - ajv "^6.1.0" - ajv-keywords "^3.1.0" - chalk "^2.3.2" - strip-ansi "^4.0.0" - text-table "^0.2.0" - webpack-log "^1.1.2" - "JSV@>= 4.0.x": version "4.0.2" resolved "https://registry.yarnpkg.com/JSV/-/JSV-4.0.2.tgz#d077f6825571f82132f9dffaed587b4029feff57" @@ -856,7 +987,11 @@ acorn@^4.0.0, acorn@^4.0.4: version "4.0.13" resolved "https://registry.yarnpkg.com/acorn/-/acorn-4.0.13.tgz#105495ae5361d697bd195c825192e1ad7f253787" -acorn@^5.0.0, acorn@^5.1.0, acorn@^5.5.0, acorn@^5.6.2: +acorn@^5.0.0, acorn@^5.5.0, acorn@^5.6.2: + version "5.7.2" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.7.2.tgz#91fa871883485d06708800318404e72bfb26dcc5" + +acorn@^5.1.0: version "5.7.1" resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.7.1.tgz#f095829297706a7c9776958c0afc8930a9b9d9d8" @@ -879,7 +1014,7 @@ ajv@^4.9.1: co "^4.6.0" json-stable-stringify "^1.0.1" -ajv@^5.0.0, ajv@^5.1.0, ajv@^5.2.3, ajv@^5.3.0: +ajv@^5.0.0, ajv@^5.2.3, ajv@^5.3.0: version "5.5.2" resolved "https://registry.yarnpkg.com/ajv/-/ajv-5.5.2.tgz#73b5eeca3fab653e3d3f9422b341ad42205dc965" dependencies: @@ -889,21 +1024,13 @@ ajv@^5.0.0, ajv@^5.1.0, ajv@^5.2.3, ajv@^5.3.0: json-schema-traverse "^0.3.0" ajv@^6.1.0: - version "6.5.2" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.5.2.tgz#678495f9b82f7cca6be248dd92f59bff5e1f4360" + version "6.5.3" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.5.3.tgz#71a569d189ecf4f4f321224fecb166f071dd90f9" dependencies: fast-deep-equal "^2.0.1" fast-json-stable-stringify "^2.0.0" json-schema-traverse "^0.4.1" - uri-js "^4.2.1" - -align-text@^0.1.1, align-text@^0.1.3: - version "0.1.4" - resolved "https://registry.yarnpkg.com/align-text/-/align-text-0.1.4.tgz#0cd90a561093f35d0a99256c22b7069433fad117" - dependencies: - kind-of "^3.0.2" - longest "^1.0.1" - repeat-string "^1.5.2" + uri-js "^4.2.2" alphanum-sort@^1.0.0, alphanum-sort@^1.0.1, alphanum-sort@^1.0.2: version "1.0.2" @@ -1193,11 +1320,11 @@ async-each@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.1.tgz#19d386a1d9edc6e7c1c85d388aedbcc56d33602d" -async@1.x, async@^1.4.0, async@^1.5.0, async@^1.5.2: +async@1.x, async@^1.5.0, async@^1.5.2: version "1.5.2" resolved "https://registry.yarnpkg.com/async/-/async-1.5.2.tgz#ec6a61ae56480c0c3cb241c95618e20892f9672a" -async@^2.1.4, async@^2.6.0: +async@^2.1.4, async@^2.5.0, async@^2.6.0: version "2.6.1" resolved "https://registry.yarnpkg.com/async/-/async-2.6.1.tgz#b245a23ca71930044ec53fa46aa00a3e87c6a610" dependencies: @@ -1212,8 +1339,8 @@ asynckit@^0.4.0: resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" atob@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.1.tgz#ae2d5a729477f289d60dd7f96a6314a22dd6c22a" + version "2.1.2" + resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9" autoprefixer@^6.3.1: version "6.7.7" @@ -1238,7 +1365,7 @@ aws-sign@~0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/aws-sign/-/aws-sign-0.3.0.tgz#3d81ca69b474b1e16518728b51c24ff0bbedc6e9" -aws4@^1.2.1, aws4@^1.6.0: +aws4@^1.2.1, aws4@^1.8.0: version "1.8.0" resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.8.0.tgz#f0e003d9ca9e7f59c7a508945d7b2ef9a04a542f" @@ -1312,7 +1439,7 @@ babel-eslint@^8.2.2: eslint-scope "3.7.1" eslint-visitor-keys "^1.0.0" -babel-generator@^6.18.0, babel-generator@^6.26.0: +babel-generator@^6.26.0: version "6.26.1" resolved "https://registry.yarnpkg.com/babel-generator/-/babel-generator-6.26.1.tgz#1844408d3b8f0d35a404ea7ac180f087a601bd90" dependencies: @@ -1517,47 +1644,47 @@ babel-plugin-lodash@^3.3.2: babel-plugin-syntax-async-functions@^6.8.0: version "6.13.0" - resolved "https://registry.yarnpkg.com/babel-plugin-syntax-async-functions/-/babel-plugin-syntax-async-functions-6.13.0.tgz#cad9cad1191b5ad634bf30ae0872391e0647be95" + resolved "http://registry.npmjs.org/babel-plugin-syntax-async-functions/-/babel-plugin-syntax-async-functions-6.13.0.tgz#cad9cad1191b5ad634bf30ae0872391e0647be95" babel-plugin-syntax-async-generators@^6.5.0: version "6.13.0" - resolved "https://registry.yarnpkg.com/babel-plugin-syntax-async-generators/-/babel-plugin-syntax-async-generators-6.13.0.tgz#6bc963ebb16eccbae6b92b596eb7f35c342a8b9a" + resolved "http://registry.npmjs.org/babel-plugin-syntax-async-generators/-/babel-plugin-syntax-async-generators-6.13.0.tgz#6bc963ebb16eccbae6b92b596eb7f35c342a8b9a" babel-plugin-syntax-class-constructor-call@^6.18.0: version "6.18.0" - resolved "https://registry.yarnpkg.com/babel-plugin-syntax-class-constructor-call/-/babel-plugin-syntax-class-constructor-call-6.18.0.tgz#9cb9d39fe43c8600bec8146456ddcbd4e1a76416" + resolved "http://registry.npmjs.org/babel-plugin-syntax-class-constructor-call/-/babel-plugin-syntax-class-constructor-call-6.18.0.tgz#9cb9d39fe43c8600bec8146456ddcbd4e1a76416" babel-plugin-syntax-class-properties@^6.8.0: version "6.13.0" - resolved "https://registry.yarnpkg.com/babel-plugin-syntax-class-properties/-/babel-plugin-syntax-class-properties-6.13.0.tgz#d7eb23b79a317f8543962c505b827c7d6cac27de" + resolved "http://registry.npmjs.org/babel-plugin-syntax-class-properties/-/babel-plugin-syntax-class-properties-6.13.0.tgz#d7eb23b79a317f8543962c505b827c7d6cac27de" babel-plugin-syntax-decorators@^6.13.0: version "6.13.0" - resolved "https://registry.yarnpkg.com/babel-plugin-syntax-decorators/-/babel-plugin-syntax-decorators-6.13.0.tgz#312563b4dbde3cc806cee3e416cceeaddd11ac0b" + resolved "http://registry.npmjs.org/babel-plugin-syntax-decorators/-/babel-plugin-syntax-decorators-6.13.0.tgz#312563b4dbde3cc806cee3e416cceeaddd11ac0b" babel-plugin-syntax-dynamic-import@^6.18.0: version "6.18.0" - resolved "https://registry.yarnpkg.com/babel-plugin-syntax-dynamic-import/-/babel-plugin-syntax-dynamic-import-6.18.0.tgz#8d6a26229c83745a9982a441051572caa179b1da" + resolved "http://registry.npmjs.org/babel-plugin-syntax-dynamic-import/-/babel-plugin-syntax-dynamic-import-6.18.0.tgz#8d6a26229c83745a9982a441051572caa179b1da" babel-plugin-syntax-exponentiation-operator@^6.8.0: version "6.13.0" - resolved "https://registry.yarnpkg.com/babel-plugin-syntax-exponentiation-operator/-/babel-plugin-syntax-exponentiation-operator-6.13.0.tgz#9ee7e8337290da95288201a6a57f4170317830de" + resolved "http://registry.npmjs.org/babel-plugin-syntax-exponentiation-operator/-/babel-plugin-syntax-exponentiation-operator-6.13.0.tgz#9ee7e8337290da95288201a6a57f4170317830de" babel-plugin-syntax-export-extensions@^6.8.0: version "6.13.0" - resolved "https://registry.yarnpkg.com/babel-plugin-syntax-export-extensions/-/babel-plugin-syntax-export-extensions-6.13.0.tgz#70a1484f0f9089a4e84ad44bac353c95b9b12721" + resolved "http://registry.npmjs.org/babel-plugin-syntax-export-extensions/-/babel-plugin-syntax-export-extensions-6.13.0.tgz#70a1484f0f9089a4e84ad44bac353c95b9b12721" babel-plugin-syntax-flow@^6.18.0: version "6.18.0" - resolved "https://registry.yarnpkg.com/babel-plugin-syntax-flow/-/babel-plugin-syntax-flow-6.18.0.tgz#4c3ab20a2af26aa20cd25995c398c4eb70310c8d" + resolved "http://registry.npmjs.org/babel-plugin-syntax-flow/-/babel-plugin-syntax-flow-6.18.0.tgz#4c3ab20a2af26aa20cd25995c398c4eb70310c8d" babel-plugin-syntax-jsx@^6.3.13, babel-plugin-syntax-jsx@^6.8.0: version "6.18.0" - resolved "https://registry.yarnpkg.com/babel-plugin-syntax-jsx/-/babel-plugin-syntax-jsx-6.18.0.tgz#0af32a9a6e13ca7a3fd5069e62d7b0f58d0d8946" + resolved "http://registry.npmjs.org/babel-plugin-syntax-jsx/-/babel-plugin-syntax-jsx-6.18.0.tgz#0af32a9a6e13ca7a3fd5069e62d7b0f58d0d8946" babel-plugin-syntax-object-rest-spread@^6.8.0: version "6.13.0" - resolved "https://registry.yarnpkg.com/babel-plugin-syntax-object-rest-spread/-/babel-plugin-syntax-object-rest-spread-6.13.0.tgz#fd6536f2bce13836ffa3a5458c4903a597bb3bf5" + resolved "http://registry.npmjs.org/babel-plugin-syntax-object-rest-spread/-/babel-plugin-syntax-object-rest-spread-6.13.0.tgz#fd6536f2bce13836ffa3a5458c4903a597bb3bf5" babel-plugin-syntax-trailing-function-commas@^6.22.0: version "6.22.0" @@ -1856,6 +1983,10 @@ babel-plugin-transform-react-jsx@^6.24.1: babel-plugin-syntax-jsx "^6.8.0" babel-runtime "^6.22.0" +babel-plugin-transform-react-remove-prop-types@^0.4.15: + version "0.4.15" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-react-remove-prop-types/-/babel-plugin-transform-react-remove-prop-types-0.4.15.tgz#7ba830e77276a0e788cd58ea527b5f70396e12a7" + babel-plugin-transform-regenerator@^6.22.0, babel-plugin-transform-regenerator@^6.24.1: version "6.26.0" resolved "https://registry.yarnpkg.com/babel-plugin-transform-regenerator/-/babel-plugin-transform-regenerator-6.26.0.tgz#e0703696fbde27f0a3efcacf8b4dca2f7b3a8f2f" @@ -1878,8 +2009,8 @@ babel-polyfill@^6.23.0, babel-polyfill@^6.26.0: regenerator-runtime "^0.10.5" babel-preset-airbnb@^2.1.1: - version "2.5.3" - resolved "https://registry.yarnpkg.com/babel-preset-airbnb/-/babel-preset-airbnb-2.5.3.tgz#c334d4281d5a4e5890e2738d40b4b8bdeeebe69d" + version "2.6.0" + resolved "https://registry.yarnpkg.com/babel-preset-airbnb/-/babel-preset-airbnb-2.6.0.tgz#caf1641820f60095f3f9ba91344edc58fe260853" dependencies: babel-plugin-syntax-trailing-function-commas "^6.22.0" babel-plugin-transform-es2015-modules-commonjs "^6.26.2" @@ -1890,6 +2021,7 @@ babel-preset-airbnb@^2.1.1: babel-plugin-transform-exponentiation-operator "^6.24.1" babel-plugin-transform-jscript "^6.22.0" babel-plugin-transform-object-rest-spread "^6.26.0" + babel-plugin-transform-react-remove-prop-types "^0.4.15" babel-plugin-transform-strict-mode "^6.24.1" babel-preset-env "^1.7.0" babel-preset-react "^6.24.1" @@ -2022,7 +2154,7 @@ babel-runtime@^6.11.6, babel-runtime@^6.18.0, babel-runtime@^6.22.0, babel-runti core-js "^2.4.0" regenerator-runtime "^0.11.0" -babel-template@^6.16.0, babel-template@^6.24.1, babel-template@^6.26.0: +babel-template@^6.24.1, babel-template@^6.26.0: version "6.26.0" resolved "https://registry.yarnpkg.com/babel-template/-/babel-template-6.26.0.tgz#de03e2d16396b069f46dd9fff8521fb1a0e35e02" dependencies: @@ -2032,7 +2164,7 @@ babel-template@^6.16.0, babel-template@^6.24.1, babel-template@^6.26.0: babylon "^6.18.0" lodash "^4.17.4" -babel-traverse@^6.18.0, babel-traverse@^6.24.1, babel-traverse@^6.26.0: +babel-traverse@^6.24.1, babel-traverse@^6.26.0: version "6.26.0" resolved "https://registry.yarnpkg.com/babel-traverse/-/babel-traverse-6.26.0.tgz#46a9cbd7edcc62c8e5c064e2d2d8d0f4035766ee" dependencies: @@ -2046,7 +2178,7 @@ babel-traverse@^6.18.0, babel-traverse@^6.24.1, babel-traverse@^6.26.0: invariant "^2.2.2" lodash "^4.17.4" -babel-types@^6.18.0, babel-types@^6.19.0, babel-types@^6.24.1, babel-types@^6.26.0: +babel-types@^6.19.0, babel-types@^6.24.1, babel-types@^6.26.0: version "6.26.0" resolved "https://registry.yarnpkg.com/babel-types/-/babel-types-6.26.0.tgz#a3b073f94ab49eb6fa55cd65227a334380632497" dependencies: @@ -2057,7 +2189,7 @@ babel-types@^6.18.0, babel-types@^6.19.0, babel-types@^6.24.1, babel-types@^6.26 babylon@7.0.0-beta.44: version "7.0.0-beta.44" - resolved "https://registry.yarnpkg.com/babylon/-/babylon-7.0.0-beta.44.tgz#89159e15e6e30c5096e22d738d8c0af8a0e8ca1d" + resolved "http://registry.npmjs.org/babylon/-/babylon-7.0.0-beta.44.tgz#89159e15e6e30c5096e22d738d8c0af8a0e8ca1d" babylon@^6.15.0, babylon@^6.17.3, babylon@^6.18.0: version "6.18.0" @@ -2145,11 +2277,11 @@ block-stream@*: bluebird@1.0.3: version "1.0.3" - resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-1.0.3.tgz#c4b441184802e3b64a61eeed4578271b4c8bf6ac" + resolved "http://registry.npmjs.org/bluebird/-/bluebird-1.0.3.tgz#c4b441184802e3b64a61eeed4578271b4c8bf6ac" bluebird@^3.4.3, bluebird@^3.5.1: - version "3.5.1" - resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.5.1.tgz#d9551f9de98f1fcda1e683d17ee91a0602ee2eb9" + version "3.5.2" + resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.5.2.tgz#1be0908e054a751754549c270489c1505d4ab15a" bmp-js@0.0.3: version "0.0.3" @@ -2359,11 +2491,11 @@ browserslist@^3.2.6: electron-to-chromium "^1.3.47" browserslist@^4.0.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.1.0.tgz#81cbb8e52dfa09918f93c6e051d779cb7360785d" + version "4.1.1" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.1.1.tgz#328eb4ff1215b12df6589e9ab82f8adaa4fc8cd6" dependencies: - caniuse-lite "^1.0.30000878" - electron-to-chromium "^1.3.61" + caniuse-lite "^1.0.30000884" + electron-to-chromium "^1.3.62" node-releases "^1.0.0-alpha.11" buble@^0.15.1: @@ -2422,7 +2554,7 @@ buffer-xor@^1.0.3: buffer@^4.3.0: version "4.9.1" - resolved "https://registry.yarnpkg.com/buffer/-/buffer-4.9.1.tgz#6d1bb601b07a4efced97094132093027c95bc298" + resolved "http://registry.npmjs.org/buffer/-/buffer-4.9.1.tgz#6d1bb601b07a4efced97094132093027c95bc298" dependencies: base64-js "^1.0.2" ieee754 "^1.1.4" @@ -2515,10 +2647,6 @@ callsites@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/callsites/-/callsites-0.2.0.tgz#afab96262910a7f33c19a5775825c69f34e350ca" -camelcase@^1.0.2: - version "1.2.1" - resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-1.2.1.tgz#9bb5304d2e0b56698b2c758b08a3eaa9daa58a39" - camelcase@^4.0.0, camelcase@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-4.1.0.tgz#d545635be1e33c542649c69173e5de6acfae34dd" @@ -2542,20 +2670,16 @@ caniuse-api@^3.0.0: lodash.uniq "^4.5.0" caniuse-db@^1.0.30000529, caniuse-db@^1.0.30000634, caniuse-db@^1.0.30000639: - version "1.0.30000875" - resolved "https://registry.yarnpkg.com/caniuse-db/-/caniuse-db-1.0.30000875.tgz#6f904fc89120de4029a9ca0f21d7ac3db89a0dce" + version "1.0.30000884" + resolved "https://registry.yarnpkg.com/caniuse-db/-/caniuse-db-1.0.30000884.tgz#d02b25dc885ffdf80434cf68b0941ea3161a4c8b" -caniuse-lite@^1.0.0, caniuse-lite@^1.0.30000878: +caniuse-lite@^1.0.0, caniuse-lite@^1.0.30000844, caniuse-lite@^1.0.30000884: version "1.0.30000884" resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30000884.tgz#eb82a959698745033b26a4dcd34d89dba7cc6eb3" -caniuse-lite@^1.0.30000844: - version "1.0.30000874" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30000874.tgz#a641b1f1c420d58d9b132920ef6ba87bbdcd2223" - capture-stack-trace@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/capture-stack-trace/-/capture-stack-trace-1.0.0.tgz#4a6fa07399c26bba47f0b2496b4d0fb408c5550d" + version "1.0.1" + resolved "https://registry.yarnpkg.com/capture-stack-trace/-/capture-stack-trace-1.0.1.tgz#a6c0bbe1f38f3aa0b92238ecb6ff42c344d4135d" cardinal@~0.4.2: version "0.4.4" @@ -2572,13 +2696,6 @@ caseless@~0.12.0: version "0.12.0" resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" -center-align@^0.1.1: - version "0.1.3" - resolved "https://registry.yarnpkg.com/center-align/-/center-align-0.1.3.tgz#aa0d32629b6ee972200411cbd4461c907bc2b7ad" - dependencies: - align-text "^0.1.3" - lazy-cache "^1.0.3" - chai@^4.0.2: version "4.1.2" resolved "https://registry.yarnpkg.com/chai/-/chai-4.1.2.tgz#0f64584ba642f0f2ace2806279f4f06ca23ad73c" @@ -2596,7 +2713,7 @@ chain-function@^1.0.0: chalk@^1.0.0, chalk@^1.1.1, chalk@^1.1.3: version "1.1.3" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" + resolved "http://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" dependencies: ansi-styles "^2.2.1" escape-string-regexp "^1.0.2" @@ -2604,7 +2721,7 @@ chalk@^1.0.0, chalk@^1.1.1, chalk@^1.1.3: strip-ansi "^3.0.0" supports-color "^2.0.0" -chalk@^2.0, chalk@^2.0.0, chalk@^2.0.1, chalk@^2.1.0, chalk@^2.3.0, chalk@^2.3.2, chalk@^2.4.1: +chalk@^2.0, chalk@^2.0.0, chalk@^2.0.1, chalk@^2.1.0, chalk@^2.3.0, chalk@^2.4.1: version "2.4.1" resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.1.tgz#18c49ab16a037b6eb0152cc83e3471338215b66e" dependencies: @@ -2614,7 +2731,7 @@ chalk@^2.0, chalk@^2.0.0, chalk@^2.0.1, chalk@^2.1.0, chalk@^2.3.0, chalk@^2.3.2 chalk@~0.4.0: version "0.4.0" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-0.4.0.tgz#5199a3ddcd0c1efe23bc08c1b027b06176e0c64f" + resolved "http://registry.npmjs.org/chalk/-/chalk-0.4.0.tgz#5199a3ddcd0c1efe23bc08c1b027b06176e0c64f" dependencies: ansi-styles "~1.0.0" has-color "~0.1.0" @@ -2640,6 +2757,10 @@ chardet@^0.4.0: version "0.4.2" resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.4.2.tgz#b5473b33dc97c424e5d98dc87d55d4d8a29c8bf2" +chardet@^0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.7.0.tgz#90094849f0937f2eedc2425d0d28a9e5f0cbad9e" + charenc@~0.0.1: version "0.0.2" resolved "https://registry.yarnpkg.com/charenc/-/charenc-0.0.2.tgz#c0a1d2f3a7092e03774bfa83f14c0fc5790a8667" @@ -2713,9 +2834,9 @@ chrome-trace-event@^1.0.0: dependencies: tslib "^1.9.0" -ci-info@^1.0.0: - version "1.1.3" - resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-1.1.3.tgz#710193264bb05c77b8c90d02f5aaf22216a667b2" +ci-info@^1.3.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-1.4.0.tgz#4841d53cad49f11b827b648ebde27a6e189b412f" cint@^8.2.1: version "8.2.1" @@ -2773,10 +2894,6 @@ cli-cursor@^2.1.0: dependencies: restore-cursor "^2.0.0" -cli-spinners@^0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-0.1.2.tgz#bb764d88e185fb9e1e6a2a1f19772318f605e31c" - cli-table@^0.3.1: version "0.3.1" resolved "https://registry.yarnpkg.com/cli-table/-/cli-table-0.3.1.tgz#f53b05266a8b1a0b934b3d0821e6e2dc5914ae23" @@ -2794,14 +2911,6 @@ cli-width@^2.0.0: version "2.2.0" resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-2.2.0.tgz#ff19ede8a9a5e579324147b0c11f0fbcbabed639" -cliui@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/cliui/-/cliui-2.1.0.tgz#4b475760ff80264c762c3a1719032e91c7fea0d1" - dependencies: - center-align "^0.1.1" - right-align "^0.1.1" - wordwrap "0.0.2" - cliui@^4.0.0: version "4.1.0" resolved "https://registry.yarnpkg.com/cliui/-/cliui-4.1.0.tgz#348422dbe82d800b3022eef4f6ac10bf2e4d1b49" @@ -2882,22 +2991,12 @@ collection-visit@^1.0.0: map-visit "^1.0.0" object-visit "^1.0.0" -color-convert@^1.3.0, color-convert@^1.9.0: - version "1.9.2" - resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.2.tgz#49881b8fba67df12a96bdf3f56c0aab9e7913147" - dependencies: - color-name "1.1.1" - -color-convert@^1.9.1: +color-convert@^1.3.0, color-convert@^1.9.0, color-convert@^1.9.1: version "1.9.3" resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" dependencies: color-name "1.1.3" -color-name@1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.1.tgz#4b1415304cf50028ea81643643bd82ea05803689" - color-name@1.1.3, color-name@^1.0.0: version "1.1.3" resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" @@ -2947,8 +3046,8 @@ colors@1.0.3: resolved "https://registry.yarnpkg.com/colors/-/colors-1.0.3.tgz#0433f44d809680fdeb60ed260f1b0c262e82a40b" colors@^1.1.2: - version "1.3.1" - resolved "https://registry.yarnpkg.com/colors/-/colors-1.3.1.tgz#4accdb89cf2cabc7f982771925e9468784f32f3d" + version "1.3.2" + resolved "https://registry.yarnpkg.com/colors/-/colors-1.3.2.tgz#2df8ff573dfbf255af562f8ce7181d6b971a359b" colors@~1.1.2: version "1.1.2" @@ -2961,7 +3060,7 @@ columnify@~1.5.4: strip-ansi "^3.0.0" wcwidth "^1.0.0" -combined-stream@1.0.6, combined-stream@^1.0.5, combined-stream@~1.0.5: +combined-stream@1.0.6, combined-stream@^1.0.5, combined-stream@~1.0.5, combined-stream@~1.0.6: version "1.0.6" resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.6.tgz#723e7df6e801ac5613113a7e445a9b69cb632818" dependencies: @@ -2979,7 +3078,7 @@ commander@2.9.0: dependencies: graceful-readlink ">= 1.0.0" -commander@^2.11.0, commander@^2.9.0: +commander@^2.11.0, commander@^2.9.0, commander@~2.17.1: version "2.17.1" resolved "https://registry.yarnpkg.com/commander/-/commander-2.17.1.tgz#bd77ab7de6de94205ceacc72f1716d29f20a77bf" @@ -2992,8 +3091,8 @@ commondir@^1.0.1: resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b" compare-versions@^3.1.0: - version "3.3.0" - resolved "https://registry.yarnpkg.com/compare-versions/-/compare-versions-3.3.0.tgz#af93ea705a96943f622ab309578b9b90586f39c3" + version "3.4.0" + resolved "https://registry.yarnpkg.com/compare-versions/-/compare-versions-3.4.0.tgz#e0747df5c9cb7f054d6d3dc3e1dbc444f9e92b26" complex.js@2.0.4: version "2.0.4" @@ -3092,10 +3191,16 @@ content-type@~1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.4.tgz#e138cc75e040c727b1966fe5e5f8c9aee256fe3b" -convert-source-map@^1.1.1, convert-source-map@^1.5.0, convert-source-map@^1.5.1: +convert-source-map@^1.1.1: version "1.5.1" resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.5.1.tgz#b8278097b9bc229365de5c62cf5fcaed8b5599e5" +convert-source-map@^1.5.0, convert-source-map@^1.5.1: + version "1.6.0" + resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.6.0.tgz#51b537a8c43e0f04dec1993bffcdd504e758ac20" + dependencies: + safe-buffer "~5.1.1" + cookie-jar@~0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/cookie-jar/-/cookie-jar-0.3.0.tgz#bc9a27d4e2b97e186cd57c9e2063cb99fa68cccc" @@ -3506,8 +3611,8 @@ cyclist@~0.2.2: resolved "https://registry.yarnpkg.com/cyclist/-/cyclist-0.2.2.tgz#1b33792e11e914a2fd6d6ed6447464444e5fa640" d3-array@1, d3-array@^1.2.0, d3-array@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/d3-array/-/d3-array-1.2.1.tgz#d1ca33de2f6ac31efadb8e050a021d7e2396d5dc" + version "1.2.4" + resolved "https://registry.yarnpkg.com/d3-array/-/d3-array-1.2.4.tgz#635ce4d5eea759f6f605863dbcfc30edc737f71f" d3-cloud@^1.2.1: version "1.2.5" @@ -3516,31 +3621,31 @@ d3-cloud@^1.2.1: d3-dispatch "^1.0.3" d3-collection@1: - version "1.0.4" - resolved "https://registry.yarnpkg.com/d3-collection/-/d3-collection-1.0.4.tgz#342dfd12837c90974f33f1cc0a785aea570dcdc2" + version "1.0.7" + resolved "https://registry.yarnpkg.com/d3-collection/-/d3-collection-1.0.7.tgz#349bd2aa9977db071091c13144d5e4f16b5b310e" d3-color@1, d3-color@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/d3-color/-/d3-color-1.2.0.tgz#d1ea19db5859c86854586276ec892cf93148459a" + version "1.2.3" + resolved "https://registry.yarnpkg.com/d3-color/-/d3-color-1.2.3.tgz#6c67bb2af6df3cc8d79efcc4d3a3e83e28c8048f" d3-dispatch@1, d3-dispatch@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/d3-dispatch/-/d3-dispatch-1.0.3.tgz#46e1491eaa9b58c358fce5be4e8bed626e7871f8" + version "1.0.5" + resolved "https://registry.yarnpkg.com/d3-dispatch/-/d3-dispatch-1.0.5.tgz#e25c10a186517cd6c82dd19ea018f07e01e39015" d3-drag@1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/d3-drag/-/d3-drag-1.2.1.tgz#df8dd4c502fb490fc7462046a8ad98a5c479282d" + version "1.2.3" + resolved "https://registry.yarnpkg.com/d3-drag/-/d3-drag-1.2.3.tgz#46e206ad863ec465d88c588098a1df444cd33c64" dependencies: d3-dispatch "1" d3-selection "1" d3-ease@1: - version "1.0.3" - resolved "https://registry.yarnpkg.com/d3-ease/-/d3-ease-1.0.3.tgz#68bfbc349338a380c44d8acc4fbc3304aa2d8c0e" + version "1.0.5" + resolved "https://registry.yarnpkg.com/d3-ease/-/d3-ease-1.0.5.tgz#8ce59276d81241b1b72042d6af2d40e76d936ffb" d3-format@1, d3-format@^1.2.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/d3-format/-/d3-format-1.3.0.tgz#a3ac44269a2011cdb87c7b5693040c18cddfff11" + version "1.3.2" + resolved "https://registry.yarnpkg.com/d3-format/-/d3-format-1.3.2.tgz#6a96b5e31bcb98122a30863f7d92365c00603562" d3-geo-projection@0.2: version "0.2.16" @@ -3553,18 +3658,18 @@ d3-hexbin@^0.2.1: resolved "https://registry.yarnpkg.com/d3-hexbin/-/d3-hexbin-0.2.2.tgz#9c5837dacfd471ab05337a9e91ef10bfc4f98831" d3-hierarchy@^1.1.5: - version "1.1.6" - resolved "https://registry.yarnpkg.com/d3-hierarchy/-/d3-hierarchy-1.1.6.tgz#842c1372090f870b7ea013ebae5c0c8d9f56229c" + version "1.1.8" + resolved "https://registry.yarnpkg.com/d3-hierarchy/-/d3-hierarchy-1.1.8.tgz#7a6317bd3ed24e324641b6f1e76e978836b008cc" -d3-interpolate@1: - version "1.2.0" - resolved "https://registry.yarnpkg.com/d3-interpolate/-/d3-interpolate-1.2.0.tgz#40d81bd8e959ff021c5ea7545bc79b8d22331c41" +d3-interpolate@1, d3-interpolate@^1.2.0: + version "1.3.2" + resolved "https://registry.yarnpkg.com/d3-interpolate/-/d3-interpolate-1.3.2.tgz#417d3ebdeb4bc4efcc8fd4361c55e4040211fd68" dependencies: d3-color "1" d3-path@1, d3-path@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/d3-path/-/d3-path-1.0.5.tgz#241eb1849bd9e9e8021c0d0a799f8a0e8e441764" + version "1.0.7" + resolved "https://registry.yarnpkg.com/d3-path/-/d3-path-1.0.7.tgz#8de7cd693a75ac0b5480d3abaccd94793e58aae8" d3-queue@1: version "1.2.3" @@ -3582,7 +3687,7 @@ d3-sankey@^0.4.2: d3-collection "1" d3-interpolate "1" -d3-scale@^1.0.5: +d3-scale@^1.0.5, d3-scale@^1.0.6: version "1.0.7" resolved "https://registry.yarnpkg.com/d3-scale/-/d3-scale-1.0.7.tgz#fa90324b3ea8a776422bd0472afab0b252a0945d" dependencies: @@ -3595,8 +3700,8 @@ d3-scale@^1.0.5: d3-time-format "2" d3-scale@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/d3-scale/-/d3-scale-2.1.0.tgz#8d3fd3e2a7c9080782a523c08507c5248289eef8" + version "2.1.2" + resolved "https://registry.yarnpkg.com/d3-scale/-/d3-scale-2.1.2.tgz#4e932b7b60182aee9073ede8764c98423e5f9a94" dependencies: d3-array "^1.2.0" d3-collection "1" @@ -3606,12 +3711,12 @@ d3-scale@^2.0.0: d3-time-format "2" d3-selection@1, d3-selection@^1.1.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/d3-selection/-/d3-selection-1.3.0.tgz#d53772382d3dc4f7507bfb28bcd2d6aed2a0ad6d" + version "1.3.2" + resolved "https://registry.yarnpkg.com/d3-selection/-/d3-selection-1.3.2.tgz#6e70a9df60801c8af28ac24d10072d82cbfdf652" d3-shape@^1.0.6, d3-shape@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/d3-shape/-/d3-shape-1.2.0.tgz#45d01538f064bafd05ea3d6d2cb748fd8c41f777" + version "1.2.2" + resolved "https://registry.yarnpkg.com/d3-shape/-/d3-shape-1.2.2.tgz#f9dba3777a5825f9a8ce8bc928da08c17679e9a7" dependencies: d3-path "1" @@ -3620,18 +3725,18 @@ d3-svg-legend@^1.x: resolved "https://registry.yarnpkg.com/d3-svg-legend/-/d3-svg-legend-1.13.0.tgz#6217478c9add9d62cb333617e1961311a41a4db3" d3-time-format@2: - version "2.1.1" - resolved "https://registry.yarnpkg.com/d3-time-format/-/d3-time-format-2.1.1.tgz#85b7cdfbc9ffca187f14d3c456ffda268081bb31" + version "2.1.3" + resolved "https://registry.yarnpkg.com/d3-time-format/-/d3-time-format-2.1.3.tgz#ae06f8e0126a9d60d6364eac5b1533ae1bac826b" dependencies: d3-time "1" d3-time@1: - version "1.0.8" - resolved "https://registry.yarnpkg.com/d3-time/-/d3-time-1.0.8.tgz#dbd2d6007bf416fe67a76d17947b784bffea1e84" + version "1.0.10" + resolved "https://registry.yarnpkg.com/d3-time/-/d3-time-1.0.10.tgz#8259dd71288d72eeacfd8de281c4bf5c7393053c" -d3-timer@1: - version "1.0.7" - resolved "https://registry.yarnpkg.com/d3-timer/-/d3-timer-1.0.7.tgz#df9650ca587f6c96607ff4e60cc38229e8dd8531" +d3-timer@1, d3-timer@^1.0.4: + version "1.0.9" + resolved "https://registry.yarnpkg.com/d3-timer/-/d3-timer-1.0.9.tgz#f7bb8c0d597d792ff7131e1c24a36dd471a471ba" d3-tip@^0.6.7: version "0.6.8" @@ -3640,8 +3745,8 @@ d3-tip@^0.6.7: d3 "^3.5.5" d3-transition@1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/d3-transition/-/d3-transition-1.1.1.tgz#d8ef89c3b848735b060e54a39b32aaebaa421039" + version "1.1.3" + resolved "https://registry.yarnpkg.com/d3-transition/-/d3-transition-1.1.3.tgz#3a435b05ce9cef9524fe0d38121cfb6905331ca6" dependencies: d3-color "1" d3-dispatch "1" @@ -3651,12 +3756,12 @@ d3-transition@1: d3-timer "1" d3-voronoi@^1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/d3-voronoi/-/d3-voronoi-1.1.2.tgz#1687667e8f13a2d158c80c1480c5a29cb0d8973c" + version "1.1.4" + resolved "https://registry.yarnpkg.com/d3-voronoi/-/d3-voronoi-1.1.4.tgz#dd3c78d7653d2bb359284ae478645d95944c8297" d3-zoom@^1.3.0: - version "1.7.1" - resolved "https://registry.yarnpkg.com/d3-zoom/-/d3-zoom-1.7.1.tgz#02f43b3c3e2db54f364582d7e4a236ccc5506b63" + version "1.7.3" + resolved "https://registry.yarnpkg.com/d3-zoom/-/d3-zoom-1.7.3.tgz#f444effdc9055c38077c4299b4df999eb1d47ccb" dependencies: d3-dispatch "1" d3-drag "1" @@ -3743,7 +3848,7 @@ debuglog@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/debuglog/-/debuglog-1.0.1.tgz#aa24ffb9ac3df9a2351837cfb2d279360cd78492" -decamelize@^1.0.0, decamelize@^1.1.1, decamelize@^1.1.2: +decamelize@^1.1.1, decamelize@^1.1.2: version "1.2.0" resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" @@ -3817,11 +3922,10 @@ defaults@^1.0.3: clone "^1.0.2" define-properties@^1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.2.tgz#83a73f2fea569898fb737193c8f873caf6d45c94" + version "1.1.3" + resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.3.tgz#cf88da6cbee26fe6db7094f61d870cbd84cee9f1" dependencies: - foreach "^2.0.5" - object-keys "^1.0.8" + object-keys "^1.0.12" define-property@^0.2.5: version "0.2.5" @@ -3915,8 +4019,8 @@ detect-libc@^1.0.2: resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-1.0.3.tgz#fa137c4bd698edf55cd5cd02ac559f91a4c4ba9b" detect-node@^2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/detect-node/-/detect-node-2.0.3.tgz#a2033c09cc8e158d37748fbde7507832bd6ce127" + version "2.0.4" + resolved "https://registry.yarnpkg.com/detect-node/-/detect-node-2.0.4.tgz#014ee8f8f669c5c58023da64b8179c083a28c46c" dezalgo@^1.0.0, dezalgo@^1.0.1, dezalgo@~1.0.3: version "1.0.3" @@ -3929,7 +4033,7 @@ diff@3.2.0: version "3.2.0" resolved "https://registry.yarnpkg.com/diff/-/diff-3.2.0.tgz#c9ce393a4b7cbd0b058a725c93df299027868ff9" -diff@^3.1.0, diff@^3.3.1, diff@^3.5.0: +diff@^3.1.0, diff@^3.5.0: version "3.5.0" resolved "https://registry.yarnpkg.com/diff/-/diff-3.5.0.tgz#800c0dd1e0a8bfbc95835c202ad220fe317e5a12" @@ -4106,11 +4210,7 @@ ejs@^2.5.9: version "2.6.1" resolved "https://registry.yarnpkg.com/ejs/-/ejs-2.6.1.tgz#498ec0d495655abc6f23cd61868d926464071aa0" -electron-to-chromium@^1.2.7, electron-to-chromium@^1.3.47: - version "1.3.56" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.56.tgz#aad1420d23e9dd8cd2fc2bc53f4928adcf85f02f" - -electron-to-chromium@^1.3.61: +electron-to-chromium@^1.2.7, electron-to-chromium@^1.3.47, electron-to-chromium@^1.3.62: version "1.3.62" resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.62.tgz#2e8e2dc070c800ec8ce23ff9dfcceb585d6f9ed8" @@ -4223,8 +4323,8 @@ es-to-primitive@^1.1.1: is-symbol "^1.0.1" es5-ext@^0.10.35, es5-ext@^0.10.9, es5-ext@~0.10.14: - version "0.10.45" - resolved "https://registry.yarnpkg.com/es5-ext/-/es5-ext-0.10.45.tgz#0bfdf7b473da5919d5adf3bd25ceb754fccc3653" + version "0.10.46" + resolved "https://registry.yarnpkg.com/es5-ext/-/es5-ext-0.10.46.tgz#efd99f67c5a7ec789baa3daa7f79870388f7f572" dependencies: es6-iterator "~2.0.3" es6-symbol "~3.1.1" @@ -4254,8 +4354,8 @@ escape-html@~1.0.3: resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" escape-latex@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/escape-latex/-/escape-latex-1.1.0.tgz#c0a94a51eb8c73c3a67a95cc90fbb626cef54539" + version "1.1.1" + resolved "https://registry.yarnpkg.com/escape-latex/-/escape-latex-1.1.1.tgz#657d8632af8849a5db8766778d4a43da9dec3376" escape-string-regexp@1.0.5, escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5: version "1.0.5" @@ -4307,8 +4407,8 @@ eslint-config-airbnb@^15.0.1: eslint-config-airbnb-base "^11.3.0" eslint-config-prettier@^2.9.0: - version "2.9.0" - resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-2.9.0.tgz#5ecd65174d486c22dff389fe036febf502d468a3" + version "2.10.0" + resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-2.10.0.tgz#ec07bc1d01f87d09f61d3840d112dc8a9791e30b" dependencies: get-stdin "^5.0.1" @@ -4327,8 +4427,8 @@ eslint-module-utils@^2.2.0: pkg-dir "^1.0.0" eslint-plugin-import@^2.2.0: - version "2.13.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.13.0.tgz#df24f241175e312d91662dc91ca84064caec14ed" + version "2.14.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.14.0.tgz#6b17626d2e3e6ad52cfce8807a845d15e22111a8" dependencies: contains-path "^0.1.0" debug "^2.6.8" @@ -4361,9 +4461,10 @@ eslint-plugin-prettier@^2.6.0: jest-docblock "^21.0.0" eslint-plugin-react@^7.0.1: - version "7.10.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.10.0.tgz#af5c1fef31c4704db02098f9be18202993828b50" + version "7.11.1" + resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.11.1.tgz#c01a7af6f17519457d6116aa94fc6d2ccad5443c" dependencies: + array-includes "^3.0.3" doctrine "^2.1.0" has "^1.0.3" jsx-ast-utils "^2.0.1" @@ -4400,7 +4501,7 @@ eslint-visitor-keys@^1.0.0: eslint@^4.19.0: version "4.19.1" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-4.19.1.tgz#32d1d653e1d90408854bfb296f076ec7e186a300" + resolved "http://registry.npmjs.org/eslint/-/eslint-4.19.1.tgz#32d1d653e1d90408854bfb296f076ec7e186a300" dependencies: ajv "^5.3.0" babel-code-frame "^6.22.0" @@ -4644,7 +4745,7 @@ extend-shallow@^3.0.0, extend-shallow@^3.0.2: assign-symbols "^1.0.0" is-extendable "^1.0.1" -extend@^3.0.0, extend@~3.0.0, extend@~3.0.1: +extend@^3.0.0, extend@~3.0.0, extend@~3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" @@ -4654,12 +4755,20 @@ extent@0.2.0: external-editor@^2.0.4, external-editor@^2.1.0: version "2.2.0" - resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-2.2.0.tgz#045511cfd8d133f3846673d1047c154e214ad3d5" + resolved "http://registry.npmjs.org/external-editor/-/external-editor-2.2.0.tgz#045511cfd8d133f3846673d1047c154e214ad3d5" dependencies: chardet "^0.4.0" iconv-lite "^0.4.17" tmp "^0.0.33" +external-editor@^3.0.0: + version "3.0.3" + resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-3.0.3.tgz#5866db29a97826dbe4bf3afd24070ead9ea43a27" + dependencies: + chardet "^0.7.0" + iconv-lite "^0.4.24" + tmp "^0.0.33" + extglob@^0.3.1: version "0.3.2" resolved "https://registry.yarnpkg.com/extglob/-/extglob-0.3.2.tgz#2e18ff3d2f49ab2765cec9023f011daa8d8349a1" @@ -4891,8 +5000,8 @@ flatten@^1.0.2: resolved "https://registry.yarnpkg.com/flatten/-/flatten-1.0.2.tgz#dae46a9d78fbe25292258cc1e780a41d95c03782" flow-parser@^0.*: - version "0.78.0" - resolved "https://registry.yarnpkg.com/flow-parser/-/flow-parser-0.78.0.tgz#4ec829a97fa68cff6e97691dfff7b6ddebbc187c" + version "0.80.0" + resolved "https://registry.yarnpkg.com/flow-parser/-/flow-parser-0.80.0.tgz#90704d27eca33eb8c8454c61df76f08f498aaae6" flow-remove-types@^1.1.2: version "1.2.3" @@ -4966,7 +5075,7 @@ form-data@~2.1.1: combined-stream "^1.0.5" mime-types "^2.1.12" -form-data@~2.3.1: +form-data@~2.3.2: version "2.3.2" resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.3.2.tgz#4970498be604c20c005d4f5c23aecd21d6b49099" dependencies: @@ -5113,8 +5222,10 @@ gauge@~2.7.1, gauge@~2.7.3: wide-align "^1.1.0" generate-function@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/generate-function/-/generate-function-2.0.0.tgz#6858fe7c0969b7d4e9093337647ac79f60dfbe74" + version "2.3.1" + resolved "https://registry.yarnpkg.com/generate-function/-/generate-function-2.3.1.tgz#f069617690c10c868e73b8465746764f97c3479f" + dependencies: + is-property "^1.0.2" generate-object-property@^1.1.0: version "1.2.0" @@ -5265,8 +5376,8 @@ gl-mat4@^1.1.4: resolved "https://registry.yarnpkg.com/gl-mat4/-/gl-mat4-1.2.0.tgz#49d8a7636b70aa00819216635f4a3fd3f4669b26" gl-matrix@^2.6.1: - version "2.7.1" - resolved "https://registry.yarnpkg.com/gl-matrix/-/gl-matrix-2.7.1.tgz#0874a6f641bf4ad12e125b3f4ad8e5a70775fbea" + version "2.8.1" + resolved "https://registry.yarnpkg.com/gl-matrix/-/gl-matrix-2.8.1.tgz#1c7873448eac61d2cd25803a074e837bd42581a3" gl-quat@^1.0.0: version "1.0.0" @@ -5277,8 +5388,8 @@ gl-quat@^1.0.0: gl-vec4 "^1.0.0" gl-vec2@^1.0.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/gl-vec2/-/gl-vec2-1.2.0.tgz#b0af95d2a582e3ad818446a1800093fc60b8b212" + version "1.3.0" + resolved "https://registry.yarnpkg.com/gl-vec2/-/gl-vec2-1.3.0.tgz#83d472ed46034de8e09cbc857123fb6c81c51199" gl-vec3@^1.0.3: version "1.1.3" @@ -5341,8 +5452,8 @@ glob@7.1.1: path-is-absolute "^1.0.0" glob@^7.0.0, glob@^7.0.3, glob@^7.0.5, glob@^7.1.1, glob@^7.1.2, glob@~7.1.0: - version "7.1.2" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.2.tgz#c19c9df9a028702d678612384a6552404c636d15" + version "7.1.3" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.3.tgz#3960832d3f1574108342dafd3a67b332c0969df1" dependencies: fs.realpath "^1.0.0" inflight "^1.0.4" @@ -5443,7 +5554,7 @@ globby@^8.0.1: got@^6.7.1: version "6.7.1" - resolved "https://registry.yarnpkg.com/got/-/got-6.7.1.tgz#240cd05785a9a18e561dc1b44b41c763ef1e8db0" + resolved "http://registry.npmjs.org/got/-/got-6.7.1.tgz#240cd05785a9a18e561dc1b44b41c763ef1e8db0" dependencies: create-error-class "^3.0.0" duplexer3 "^0.1.4" @@ -5537,15 +5648,15 @@ handle-thing@^1.2.5: version "1.2.5" resolved "https://registry.yarnpkg.com/handle-thing/-/handle-thing-1.2.5.tgz#fd7aad726bf1a5fd16dfc29b2f7a6601d27139c4" -handlebars@^4.0.1, handlebars@^4.0.3: - version "4.0.11" - resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.0.11.tgz#630a35dfe0294bc281edae6ffc5d329fc7982dcc" +handlebars@^4.0.1, handlebars@^4.0.11: + version "4.0.12" + resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.0.12.tgz#2c15c8a96d46da5e266700518ba8cb8d919d5bc5" dependencies: - async "^1.4.0" + async "^2.5.0" optimist "^0.6.1" - source-map "^0.4.4" + source-map "^0.6.1" optionalDependencies: - uglify-js "^2.6" + uglify-js "^3.1.4" har-schema@^1.0.5: version "1.0.5" @@ -5571,11 +5682,11 @@ har-validator@~4.2.1: ajv "^4.9.1" har-schema "^1.0.5" -har-validator@~5.0.3: - version "5.0.3" - resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-5.0.3.tgz#ba402c266194f15956ef15e0fcf242993f6a7dfd" +har-validator@~5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-5.1.0.tgz#44657f5688a22cfd4b72486e81b3a3fb11742c29" dependencies: - ajv "^5.1.0" + ajv "^5.3.0" har-schema "^2.0.0" has-ansi@^2.0.0: @@ -5876,12 +5987,18 @@ iconv-lite@0.4.19: version "0.4.19" resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.19.tgz#f7468f60135f5e5dad3399c0a81be9a1603a082b" -iconv-lite@^0.4.17, iconv-lite@^0.4.4, iconv-lite@~0.4.13: +iconv-lite@0.4.23: version "0.4.23" resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.23.tgz#297871f63be507adcfbfca715d0cd0eed84e9a63" dependencies: safer-buffer ">= 2.1.2 < 3" +iconv-lite@^0.4.17, iconv-lite@^0.4.24, iconv-lite@^0.4.4, iconv-lite@~0.4.13: + version "0.4.24" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" + dependencies: + safer-buffer ">= 2.1.2 < 3" + icss-replace-symbols@^1.0.2, icss-replace-symbols@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/icss-replace-symbols/-/icss-replace-symbols-1.1.0.tgz#06ea6f83679a7749e386cfe1fe812ae5db223ded" @@ -5950,12 +6067,6 @@ imurmurhash@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" -indent-string@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-2.1.0.tgz#8e2d48348742121b4a8218b7a137e9a52049dc80" - dependencies: - repeating "^2.0.0" - indent-string@^3.0.0: version "3.2.0" resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-3.2.0.tgz#4a5fd6d27cc332f37e5419a504dbb837105c9289" @@ -6044,6 +6155,24 @@ inquirer@^5.2.0: strip-ansi "^4.0.0" through "^2.3.6" +inquirer@^6.0.0: + version "6.2.0" + resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-6.2.0.tgz#51adcd776f661369dc1e894859c2560a224abdd8" + dependencies: + ansi-escapes "^3.0.0" + chalk "^2.0.0" + cli-cursor "^2.1.0" + cli-width "^2.0.0" + external-editor "^3.0.0" + figures "^2.0.0" + lodash "^4.17.10" + mute-stream "0.0.7" + run-async "^2.2.0" + rxjs "^6.1.0" + string-width "^2.1.0" + strip-ansi "^4.0.0" + through "^2.3.6" + internal-ip@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/internal-ip/-/internal-ip-3.0.1.tgz#df5c99876e1d2eb2ea2d74f520e3f669a00ece27" @@ -6148,10 +6277,10 @@ is-callable@^1.1.1, is-callable@^1.1.3: resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.1.4.tgz#1e1adf219e1eeb684d691f9d6a05ff0d30a24d75" is-ci@^1.0.10: - version "1.1.0" - resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-1.1.0.tgz#247e4162e7860cebbdaf30b774d6b0ac7dcfe7a5" + version "1.2.0" + resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-1.2.0.tgz#3f4a08d6303a09882cef3f0fb97439c5f5ce2d53" dependencies: - ci-info "^1.0.0" + ci-info "^1.3.0" is-color-stop@^1.0.0: version "1.1.0" @@ -6286,8 +6415,8 @@ is-my-ip-valid@^1.0.0: resolved "https://registry.yarnpkg.com/is-my-ip-valid/-/is-my-ip-valid-1.0.0.tgz#7b351b8e8edd4d3995d4d066680e664d94696824" is-my-json-valid@^2.12.4: - version "2.18.0" - resolved "https://registry.yarnpkg.com/is-my-json-valid/-/is-my-json-valid-2.18.0.tgz#47001d4bad2e9195ee964c7ed42b5f12d3d5ad6b" + version "2.19.0" + resolved "https://registry.yarnpkg.com/is-my-json-valid/-/is-my-json-valid-2.19.0.tgz#8fd6e40363cd06b963fa877d444bfb5eddc62175" dependencies: generate-function "^2.0.0" generate-object-property "^1.1.0" @@ -6371,7 +6500,7 @@ is-promise@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-2.1.0.tgz#79a2a9ece7f096e80f36d2b2f3bc16c1ff4bf3fa" -is-property@^1.0.0: +is-property@^1.0.0, is-property@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/is-property/-/is-property-1.0.2.tgz#57fe1c4e48474edd65b09911f26b1cd4095dda84" @@ -6499,18 +6628,18 @@ isstream@~0.1.2: resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" istanbul-api@^1.0.0-alpha: - version "1.3.1" - resolved "https://registry.yarnpkg.com/istanbul-api/-/istanbul-api-1.3.1.tgz#4c3b05d18c0016d1022e079b98dc82c40f488954" + version "1.3.6" + resolved "https://registry.yarnpkg.com/istanbul-api/-/istanbul-api-1.3.6.tgz#0c695f17e533131de8c49e0657175dcfd8af8a8f" dependencies: async "^2.1.4" compare-versions "^3.1.0" fileset "^2.0.2" istanbul-lib-coverage "^1.2.0" istanbul-lib-hook "^1.2.0" - istanbul-lib-instrument "^1.10.1" + istanbul-lib-instrument "^2.1.0" istanbul-lib-report "^1.1.4" - istanbul-lib-source-maps "^1.2.4" - istanbul-reports "^1.3.0" + istanbul-lib-source-maps "^1.2.5" + istanbul-reports "^1.4.1" js-yaml "^3.7.0" mkdirp "^0.5.1" once "^1.4.0" @@ -6519,23 +6648,27 @@ istanbul-lib-coverage@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-1.2.0.tgz#f7d8f2e42b97e37fe796114cb0f9d68b5e3a4341" +istanbul-lib-coverage@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.1.tgz#2aee0e073ad8c5f6a0b00e0dfbf52b4667472eda" + istanbul-lib-hook@^1.2.0: version "1.2.1" resolved "https://registry.yarnpkg.com/istanbul-lib-hook/-/istanbul-lib-hook-1.2.1.tgz#f614ec45287b2a8fc4f07f5660af787575601805" dependencies: append-transform "^1.0.0" -istanbul-lib-instrument@^1.10.1: - version "1.10.1" - resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-1.10.1.tgz#724b4b6caceba8692d3f1f9d0727e279c401af7b" - dependencies: - babel-generator "^6.18.0" - babel-template "^6.16.0" - babel-traverse "^6.18.0" - babel-types "^6.18.0" - babylon "^6.18.0" - istanbul-lib-coverage "^1.2.0" - semver "^5.3.0" +istanbul-lib-instrument@^2.1.0: + version "2.3.2" + resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-2.3.2.tgz#b287cbae2b5f65f3567b05e2e29b275eaf92d25e" + dependencies: + "@babel/generator" "7.0.0-beta.51" + "@babel/parser" "7.0.0-beta.51" + "@babel/template" "7.0.0-beta.51" + "@babel/traverse" "7.0.0-beta.51" + "@babel/types" "7.0.0-beta.51" + istanbul-lib-coverage "^2.0.1" + semver "^5.5.0" istanbul-lib-report@^1.1.4: version "1.1.4" @@ -6546,7 +6679,7 @@ istanbul-lib-report@^1.1.4: path-parse "^1.0.5" supports-color "^3.1.2" -istanbul-lib-source-maps@^1.2.4: +istanbul-lib-source-maps@^1.2.5: version "1.2.5" resolved "https://registry.yarnpkg.com/istanbul-lib-source-maps/-/istanbul-lib-source-maps-1.2.5.tgz#ffe6be4e7ab86d3603e4290d54990b14506fc9b1" dependencies: @@ -6556,11 +6689,11 @@ istanbul-lib-source-maps@^1.2.4: rimraf "^2.6.1" source-map "^0.5.3" -istanbul-reports@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-1.3.0.tgz#2f322e81e1d9520767597dca3c20a0cce89a3554" +istanbul-reports@^1.4.1: + version "1.5.0" + resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-1.5.0.tgz#c6c2867fa65f59eb7dcedb7f845dfc76aaee70f9" dependencies: - handlebars "^4.0.3" + handlebars "^4.0.11" istanbul@^1.0.0-alpha: version "1.0.0-alpha.2" @@ -6640,8 +6773,8 @@ jquery@>=1.7: resolved "https://registry.yarnpkg.com/jquery/-/jquery-3.3.1.tgz#958ce29e81c9790f31be7792df5d4d95fc57fbca" js-base64@^2.1.9: - version "2.4.8" - resolved "https://registry.yarnpkg.com/js-base64/-/js-base64-2.4.8.tgz#57a9b130888f956834aa40c5b165ba59c758f033" + version "2.4.9" + resolved "https://registry.yarnpkg.com/js-base64/-/js-base64-2.4.9.tgz#748911fb04f48a60c4771b375cac45a80df11c03" js-search@^1.3.1: version "1.4.2" @@ -6852,9 +6985,9 @@ jsx-ast-utils@^2.0.1: dependencies: array-includes "^3.0.3" -just-extend@^1.1.27: - version "1.1.27" - resolved "https://registry.yarnpkg.com/just-extend/-/just-extend-1.1.27.tgz#ec6e79410ff914e472652abfa0e603c03d60e905" +just-extend@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/just-extend/-/just-extend-3.0.0.tgz#cee004031eaabf6406da03a7b84e4fe9d78ef288" kdbush@^1.0.0, kdbush@^1.0.1: version "1.0.1" @@ -6911,10 +7044,6 @@ latest-version@^3.0.0: dependencies: package-json "^4.0.0" -lazy-cache@^1.0.3: - version "1.0.4" - resolved "https://registry.yarnpkg.com/lazy-cache/-/lazy-cache-1.0.4.tgz#a1d78fc3a50474cb80845d3b3b6e1da49a446e8e" - lcid@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/lcid/-/lcid-1.0.0.tgz#308accafa0bc483a3867b4b6f2b9506251d1b835" @@ -6976,25 +7105,18 @@ listr-verbose-renderer@^0.4.0: figures "^1.7.0" listr@^0.14.1: - version "0.14.1" - resolved "https://registry.yarnpkg.com/listr/-/listr-0.14.1.tgz#8a7afa4a7135cee4c921d128e0b7dfc6e522d43d" + version "0.14.2" + resolved "https://registry.yarnpkg.com/listr/-/listr-0.14.2.tgz#cbe44b021100a15376addfc2d79349ee430bfe14" dependencies: "@samverschueren/stream-to-observable" "^0.3.0" - cli-truncate "^0.2.1" - figures "^1.7.0" - indent-string "^2.1.0" is-observable "^1.1.0" is-promise "^2.1.0" is-stream "^1.1.0" listr-silent-renderer "^1.1.1" listr-update-renderer "^0.4.0" listr-verbose-renderer "^0.4.0" - log-symbols "^1.0.2" - log-update "^1.0.2" - ora "^0.2.3" p-map "^1.1.1" rxjs "^6.1.0" - strip-ansi "^3.0.1" load-bmfont@^1.2.3: version "1.3.0" @@ -7231,11 +7353,11 @@ lodash.without@~4.4.0: lodash@2.4.1: version "2.4.1" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-2.4.1.tgz#5b7723034dda4d262e5a46fb2c58d7cc22f71420" + resolved "http://registry.npmjs.org/lodash/-/lodash-2.4.1.tgz#5b7723034dda4d262e5a46fb2c58d7cc22f71420" lodash@3.x: version "3.10.1" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-3.10.1.tgz#5bf45e8e49ba4189e17d482789dfd15bd140b7b6" + resolved "http://registry.npmjs.org/lodash/-/lodash-3.10.1.tgz#5bf45e8e49ba4189e17d482789dfd15bd140b7b6" lodash@^4.0.1, lodash@^4.0.8, lodash@^4.12.0, lodash@^4.13.1, lodash@^4.15.0, lodash@^4.17.10, lodash@^4.17.2, lodash@^4.17.4, lodash@^4.17.5, lodash@^4.2.0, lodash@^4.2.1, lodash@^4.3.0: version "4.17.10" @@ -7247,7 +7369,7 @@ log-symbols@^1.0.2: dependencies: chalk "^1.0.0" -log-symbols@^2.1.0, log-symbols@^2.2.0: +log-symbols@^2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-2.2.0.tgz#5740e1c5d6f0dfda4ad9323b5332107ef6b4c40a" dependencies: @@ -7264,16 +7386,9 @@ loglevel@^1.4.1: version "1.6.1" resolved "https://registry.yarnpkg.com/loglevel/-/loglevel-1.6.1.tgz#e0fc95133b6ef276cdc8887cdaf24aa6f156f8fa" -loglevelnext@^1.0.1: - version "1.0.5" - resolved "https://registry.yarnpkg.com/loglevelnext/-/loglevelnext-1.0.5.tgz#36fc4f5996d6640f539ff203ba819641680d75a2" - dependencies: - es6-symbol "^3.1.1" - object.assign "^4.1.0" - lolex@^2.2.0, lolex@^2.3.2: - version "2.7.1" - resolved "https://registry.yarnpkg.com/lolex/-/lolex-2.7.1.tgz#e40a8c4d1f14b536aa03e42a537c7adbaf0c20be" + version "2.7.3" + resolved "https://registry.yarnpkg.com/lolex/-/lolex-2.7.3.tgz#5d342280543993aca4be31df9e462963a178e45b" long@4.0.0: version "4.0.0" @@ -7283,10 +7398,6 @@ long@^3.2.0: version "3.2.0" resolved "https://registry.yarnpkg.com/long/-/long-3.2.0.tgz#d821b7138ca1cb581c172990ef14db200b5c474b" -longest@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/longest/-/longest-1.0.1.tgz#30a0b2da38f73770e8294a0d22e6625ed77d0097" - loose-envify@^1.0.0, loose-envify@^1.1.0, loose-envify@^1.3.0, loose-envify@^1.3.1: version "1.4.0" resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" @@ -7500,7 +7611,7 @@ md5@^2.1.0: crypt "~0.0.1" is-buffer "~1.1.1" -mdast-add-list-metadata@^1.0.1: +mdast-add-list-metadata@1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/mdast-add-list-metadata/-/mdast-add-list-metadata-1.0.1.tgz#95e73640ce2fc1fa2dcb7ec443d09e2bfe7db4cf" dependencies: @@ -7620,17 +7731,7 @@ miller-rabin@^4.0.0: version "1.36.0" resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.36.0.tgz#5020478db3c7fe93aad7bbcc4dcf869c43363397" -mime-db@~1.35.0: - version "1.35.0" - resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.35.0.tgz#0569d657466491283709663ad379a99b90d9ab47" - -mime-types@^2.1.11, mime-types@^2.1.12, mime-types@~2.1.17, mime-types@~2.1.7: - version "2.1.19" - resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.19.tgz#71e464537a7ef81c15f2db9d97e913fc0ff606f0" - dependencies: - mime-db "~1.35.0" - -mime-types@~2.1.18: +mime-types@^2.1.11, mime-types@^2.1.12, mime-types@~2.1.17, mime-types@~2.1.18, mime-types@~2.1.19, mime-types@~2.1.7: version "2.1.20" resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.20.tgz#930cb719d571e903738520f8470911548ca2cc19" dependencies: @@ -7667,11 +7768,11 @@ min-document@^2.19.0: dom-walk "^0.1.0" mini-css-extract-plugin@^0.4.0: - version "0.4.1" - resolved "https://registry.yarnpkg.com/mini-css-extract-plugin/-/mini-css-extract-plugin-0.4.1.tgz#d2bcf77bb2596b8e4bd9257e43d3f9164c2e86cb" + version "0.4.2" + resolved "https://registry.yarnpkg.com/mini-css-extract-plugin/-/mini-css-extract-plugin-0.4.2.tgz#b3ecc0d6b1bbe5ff14add42b946a7b200cf78651" dependencies: - "@webpack-contrib/schema-utils" "^1.0.0-beta.0" loader-utils "^1.1.0" + schema-utils "^1.0.0" webpack-sources "^1.1.0" minimalistic-assert@^1.0.0, minimalistic-assert@^1.0.1: @@ -7690,27 +7791,27 @@ minimalistic-crypto-utils@^1.0.0, minimalistic-crypto-utils@^1.0.1: minimist@0.0.5: version "0.0.5" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.5.tgz#d7aa327bcecf518f9106ac6b8f003fa3bcea8566" + resolved "http://registry.npmjs.org/minimist/-/minimist-0.0.5.tgz#d7aa327bcecf518f9106ac6b8f003fa3bcea8566" minimist@0.0.8: version "0.0.8" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" + resolved "http://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" minimist@1.2.0, minimist@^1.1.3, minimist@^1.2.0: version "1.2.0" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284" + resolved "http://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284" minimist@^0.1.0: version "0.1.0" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.1.0.tgz#99df657a52574c21c9057497df742790b2b4c0de" + resolved "http://registry.npmjs.org/minimist/-/minimist-0.1.0.tgz#99df657a52574c21c9057497df742790b2b4c0de" minimist@~0.0.1: version "0.0.10" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.10.tgz#de3f98543dbf96082be48ad1a0c7cda836301dcf" + resolved "http://registry.npmjs.org/minimist/-/minimist-0.0.10.tgz#de3f98543dbf96082be48ad1a0c7cda836301dcf" minipass@^2.2.1, minipass@^2.3.3: - version "2.3.3" - resolved "https://registry.yarnpkg.com/minipass/-/minipass-2.3.3.tgz#a7dcc8b7b833f5d368759cce544dccb55f50f233" + version "2.3.4" + resolved "https://registry.yarnpkg.com/minipass/-/minipass-2.3.4.tgz#4768d7605ed6194d6d576169b9e12ef71e9d9957" dependencies: safe-buffer "^5.1.2" yallist "^3.0.0" @@ -7751,7 +7852,7 @@ mjolnir.js@^1.0.0, mjolnir.js@^1.2.1: mkdirp@0.5.1, mkdirp@0.5.x, "mkdirp@>=0.5 0", mkdirp@^0.5, mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@~0.5.0, mkdirp@~0.5.1: version "0.5.1" - resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" + resolved "http://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" dependencies: minimist "0.0.8" @@ -7836,16 +7937,16 @@ multimatch@^2.0.0: minimatch "^3.0.0" mustache@^2.2.1: - version "2.3.1" - resolved "https://registry.yarnpkg.com/mustache/-/mustache-2.3.1.tgz#ef5db3c0d11f1640e9baa47f4e65ba0c3fcd82b9" + version "2.3.2" + resolved "https://registry.yarnpkg.com/mustache/-/mustache-2.3.2.tgz#a6d4d9c3f91d13359ab889a812954f9230a3d0c5" mute-stream@0.0.7, mute-stream@~0.0.4: version "0.0.7" resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.7.tgz#3075ce93bc21b8fab43e1bc4da7e8115ed1e7bab" nan@^2.9.2: - version "2.10.0" - resolved "https://registry.yarnpkg.com/nan/-/nan-2.10.0.tgz#96d0cd610ebd58d4b4de9cc0c6828cda99c7548f" + version "2.11.0" + resolved "https://registry.yarnpkg.com/nan/-/nan-2.11.0.tgz#574e360e4d954ab16966ec102c0c049fd961a099" nanoid@^1.0.7: version "1.1.1" @@ -7884,23 +7985,23 @@ negotiator@0.6.1: resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.1.tgz#2b327184e8992101177b28563fb5e7102acd0ca9" neo-async@^2.5.0: - version "2.5.1" - resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.5.1.tgz#acb909e327b1e87ec9ef15f41b8a269512ad41ee" + version "2.5.2" + resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.5.2.tgz#489105ce7bc54e709d736b195f82135048c50fcc" next-tick@1: version "1.0.0" resolved "https://registry.yarnpkg.com/next-tick/-/next-tick-1.0.0.tgz#ca86d1fe8828169b0120208e3dc8424b9db8342c" nice-try@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.4.tgz#d93962f6c52f2c1558c0fbda6d512819f1efe1c4" + version "1.0.5" + resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366" nise@^1.2.0: - version "1.4.2" - resolved "https://registry.yarnpkg.com/nise/-/nise-1.4.2.tgz#a9a3800e3994994af9e452333d549d60f72b8e8c" + version "1.4.4" + resolved "https://registry.yarnpkg.com/nise/-/nise-1.4.4.tgz#b8d9dd35334c99e514b75e46fcc38e358caecdd0" dependencies: "@sinonjs/formatio" "^2.0.0" - just-extend "^1.1.27" + just-extend "^3.0.0" lolex "^2.3.2" path-to-regexp "^1.7.0" text-encoding "^0.6.4" @@ -8080,8 +8181,8 @@ normalize-url@^3.0.0: resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-3.3.0.tgz#b2e1c4dc4f7c6d57743df733a4f5978d18650559" npm-bundled@^1.0.1: - version "1.0.3" - resolved "https://registry.yarnpkg.com/npm-bundled/-/npm-bundled-1.0.3.tgz#7e71703d973af3370a9591bafe3a63aca0be2308" + version "1.0.5" + resolved "https://registry.yarnpkg.com/npm-bundled/-/npm-bundled-1.0.5.tgz#3c1732b7ba936b3a10325aef616467c0ccbcc979" npm-cache-filename@~1.0.2: version "1.0.2" @@ -8167,7 +8268,7 @@ npm-user-validate@~0.1.5: npm@^3, npm@^3.10.6: version "3.10.10" - resolved "https://registry.yarnpkg.com/npm/-/npm-3.10.10.tgz#5b1d577e4c8869d6c8603bc89e9cd1637303e46e" + resolved "http://registry.npmjs.org/npm/-/npm-3.10.10.tgz#5b1d577e4c8869d6c8603bc89e9cd1637303e46e" dependencies: abbrev "~1.0.9" ansicolors "~0.3.2" @@ -8301,10 +8402,14 @@ oauth-sign@~0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.3.0.tgz#cb540f93bb2b22a7d5941691a288d60e8ea9386e" -oauth-sign@~0.8.1, oauth-sign@~0.8.2: +oauth-sign@~0.8.1: version "0.8.2" resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.8.2.tgz#46a6ab7f0aead8deae9ec0565780b7d4efeb9d43" +oauth-sign@~0.9.0: + version "0.9.0" + resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.9.0.tgz#47a7b016baa68b5fa0ecf3dee08a85c679ac6455" + object-assign@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-3.0.0.tgz#9bedd5ca0897949bca47e7ff408062d549f587f2" @@ -8329,7 +8434,7 @@ object-is@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/object-is/-/object-is-1.0.1.tgz#0aa60ec9989a0b3ed795cf4d06f62cf1ad6539b6" -object-keys@^1.0.11, object-keys@^1.0.12, object-keys@^1.0.6, object-keys@^1.0.8: +object-keys@^1.0.11, object-keys@^1.0.12, object-keys@^1.0.6: version "1.0.12" resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.0.12.tgz#09c53855377575310cca62f55bb334abff7b3ed2" @@ -8465,15 +8570,6 @@ optionator@^0.8.1, optionator@^0.8.2: type-check "~0.3.2" wordwrap "~1.0.0" -ora@^0.2.3: - version "0.2.3" - resolved "https://registry.yarnpkg.com/ora/-/ora-0.2.3.tgz#37527d220adcd53c39b73571d754156d5db657a4" - dependencies: - chalk "^1.1.1" - cli-cursor "^1.0.2" - cli-spinners "^0.1.2" - object-assign "^4.0.1" - original@>=0.0.5: version "1.0.2" resolved "https://registry.yarnpkg.com/original/-/original-1.0.2.tgz#e442a61cffe1c5fd20a65f3261c26663b303f25f" @@ -9526,7 +9622,7 @@ qs@~6.4.0: version "6.4.0" resolved "https://registry.yarnpkg.com/qs/-/qs-6.4.0.tgz#13e26d28ad6b0ffaa91312cd3bf708ed351e7233" -qs@~6.5.1: +qs@~6.5.2: version "6.5.2" resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.2.tgz#cb3ae806e8740444584ef154ce8ee98d403f3e36" @@ -9631,8 +9727,8 @@ rc@^1.0.1, rc@^1.1.6, rc@^1.2.7: strip-json-comments "~2.0.1" re-resizable@^4.3.1: - version "4.7.1" - resolved "https://registry.yarnpkg.com/re-resizable/-/re-resizable-4.7.1.tgz#3eca5bb94a6059d14311786cfd2d430bc9f7fba0" + version "4.8.1" + resolved "https://registry.yarnpkg.com/re-resizable/-/re-resizable-4.8.1.tgz#1edc294e7ba9effcd31c2a134d9f825d62c1ec6c" react-ace@^5.10.0: version "5.10.0" @@ -9782,10 +9878,10 @@ react-map-gl@^3.0.4: viewport-mercator-project "^5.1.0" react-markdown@^3.3.0: - version "3.4.1" - resolved "https://registry.yarnpkg.com/react-markdown/-/react-markdown-3.4.1.tgz#9fb726a94dfcb600d625fd06a5550629801303dc" + version "3.6.0" + resolved "https://registry.yarnpkg.com/react-markdown/-/react-markdown-3.6.0.tgz#29f6aaab5270c8ef0a5e234093a873ec3e01722b" dependencies: - mdast-add-list-metadata "^1.0.1" + mdast-add-list-metadata "1.0.1" prop-types "^15.6.1" remark-parse "^5.0.0" unified "^6.1.5" @@ -9801,6 +9897,13 @@ react-modal@^3.1.7: react-lifecycles-compat "^3.0.0" warning "^3.0.0" +react-move@^2.1.0: + version "2.8.0" + resolved "https://registry.yarnpkg.com/react-move/-/react-move-2.8.0.tgz#63deaf6a0e58ca6769357abfcd91dde44d83a596" + dependencies: + d3-interpolate "^1.2.0" + d3-timer "^1.0.4" + react-onclickoutside@^5.9.0: version "5.11.1" resolved "https://registry.yarnpkg.com/react-onclickoutside/-/react-onclickoutside-5.11.1.tgz#00314e52567cf55faba94cabbacd119619070623" @@ -9896,8 +9999,8 @@ react-sticky@^6.0.2: raf "^3.3.0" react-style-proptype@^3.0.0: - version "3.2.1" - resolved "https://registry.yarnpkg.com/react-style-proptype/-/react-style-proptype-3.2.1.tgz#7cfeb9b87ec7ab9dcbde9715170ed10c11fb86aa" + version "3.2.2" + resolved "https://registry.yarnpkg.com/react-style-proptype/-/react-style-proptype-3.2.2.tgz#d8e998e62ce79ec35b087252b90f19f1c33968a0" dependencies: prop-types "^15.5.4" @@ -10342,8 +10445,8 @@ remove-trailing-separator@^1.0.1: resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz#c24bce2a283adad5bc3f58e0d48249b92379d8ef" repeat-element@^1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.2.tgz#ef089a178d1483baae4d93eb98b4f9e4e11d990a" + version "1.1.3" + resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.3.tgz#782e0d825c0c5a3bb39731f84efee6b742e6b1ce" repeat-string@^1.5.2, repeat-string@^1.5.4, repeat-string@^1.6.1: version "1.6.1" @@ -10364,29 +10467,29 @@ replace-ext@1.0.0, replace-ext@^1.0.0: resolved "https://registry.yarnpkg.com/replace-ext/-/replace-ext-1.0.0.tgz#de63128373fcbf7c3ccfa4de5a480c45a67958eb" request@2, request@^2.65.0, request@^2.74.0, request@^2.79.0, request@^2.85.0: - version "2.87.0" - resolved "https://registry.yarnpkg.com/request/-/request-2.87.0.tgz#32f00235cd08d482b4d0d68db93a829c0ed5756e" + version "2.88.0" + resolved "https://registry.yarnpkg.com/request/-/request-2.88.0.tgz#9c2fca4f7d35b592efe57c7f0a55e81052124fef" dependencies: aws-sign2 "~0.7.0" - aws4 "^1.6.0" + aws4 "^1.8.0" caseless "~0.12.0" - combined-stream "~1.0.5" - extend "~3.0.1" + combined-stream "~1.0.6" + extend "~3.0.2" forever-agent "~0.6.1" - form-data "~2.3.1" - har-validator "~5.0.3" + form-data "~2.3.2" + har-validator "~5.1.0" http-signature "~1.2.0" is-typedarray "~1.0.0" isstream "~0.1.2" json-stringify-safe "~5.0.1" - mime-types "~2.1.17" - oauth-sign "~0.8.2" + mime-types "~2.1.19" + oauth-sign "~0.9.0" performance-now "^2.1.0" - qs "~6.5.1" - safe-buffer "^5.1.1" - tough-cookie "~2.3.3" + qs "~6.5.2" + safe-buffer "^5.1.2" + tough-cookie "~2.4.3" tunnel-agent "^0.6.0" - uuid "^3.1.0" + uuid "^3.3.2" request@2.81.0: version "2.81.0" @@ -10417,7 +10520,7 @@ request@2.81.0: request@~2.22.0: version "2.22.0" - resolved "https://registry.yarnpkg.com/request/-/request-2.22.0.tgz#b883a769cc4a909571eb5004b344c43cf7e51592" + resolved "http://registry.npmjs.org/request/-/request-2.22.0.tgz#b883a769cc4a909571eb5004b344c43cf7e51592" dependencies: aws-sign "~0.3.0" cookie-jar "~0.3.0" @@ -10434,7 +10537,7 @@ request@~2.22.0: request@~2.75.0: version "2.75.0" - resolved "https://registry.yarnpkg.com/request/-/request-2.75.0.tgz#d2b8268a286da13eaa5d01adf5d18cc90f657d93" + resolved "http://registry.npmjs.org/request/-/request-2.75.0.tgz#d2b8268a286da13eaa5d01adf5d18cc90f657d93" dependencies: aws-sign2 "~0.6.0" aws4 "^1.2.1" @@ -10485,6 +10588,10 @@ requires-port@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff" +resize-observer-polyfill@1.4.2: + version "1.4.2" + resolved "https://registry.yarnpkg.com/resize-observer-polyfill/-/resize-observer-polyfill-1.4.2.tgz#a37198e6209e888acb1532a9968e06d38b6788e5" + resize-observer-polyfill@1.5.0: version "1.5.0" resolved "https://registry.yarnpkg.com/resize-observer-polyfill/-/resize-observer-polyfill-1.5.0.tgz#660ff1d9712a2382baa2cad450a4716209f9ca69" @@ -10562,12 +10669,6 @@ rgba-regex@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/rgba-regex/-/rgba-regex-1.0.0.tgz#43374e2e2ca0968b0ef1523460b7d730ff22eeb3" -right-align@^0.1.1: - version "0.1.3" - resolved "https://registry.yarnpkg.com/right-align/-/right-align-0.1.3.tgz#61339b722fe6a3515689210d24e14c96148613ef" - dependencies: - align-text "^0.1.1" - rimraf@2, rimraf@^2.2.8, rimraf@^2.5.2, rimraf@^2.5.4, rimraf@^2.6.1, rimraf@^2.6.2: version "2.6.2" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.2.tgz#2ed8150d24a16ea8651e6d6ef0f47c4158ce7a36" @@ -10576,11 +10677,11 @@ rimraf@2, rimraf@^2.2.8, rimraf@^2.5.2, rimraf@^2.5.4, rimraf@^2.6.1, rimraf@^2. rimraf@~2.2.6: version "2.2.8" - resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.2.8.tgz#e439be2aaee327321952730f99a8929e4fc50582" + resolved "http://registry.npmjs.org/rimraf/-/rimraf-2.2.8.tgz#e439be2aaee327321952730f99a8929e4fc50582" rimraf@~2.5.4: version "2.5.4" - resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.5.4.tgz#96800093cbf1a0c86bd95b4625467535c29dfa04" + resolved "http://registry.npmjs.org/rimraf/-/rimraf-2.5.4.tgz#96800093cbf1a0c86bd95b4625467535c29dfa04" dependencies: glob "^7.0.5" @@ -10622,14 +10723,14 @@ rx-lite@*, rx-lite@^4.0.8: resolved "https://registry.yarnpkg.com/rx-lite/-/rx-lite-4.0.8.tgz#0b1e11af8bc44836f04a6407e92da42467b79444" rxjs@^5.5.2: - version "5.5.11" - resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-5.5.11.tgz#f733027ca43e3bec6b994473be4ab98ad43ced87" + version "5.5.12" + resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-5.5.12.tgz#6fa61b8a77c3d793dbaf270bee2f43f652d741cc" dependencies: symbol-observable "1.0.1" rxjs@^6.1.0: - version "6.2.2" - resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.2.2.tgz#eb75fa3c186ff5289907d06483a77884586e1cf9" + version "6.3.2" + resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.3.2.tgz#6a688b16c4e6e980e62ea805ec30648e1c60907f" dependencies: tslib "^1.9.0" @@ -10665,7 +10766,7 @@ schema-utils@^0.3.0: dependencies: ajv "^5.0.0" -schema-utils@^0.4.3, schema-utils@^0.4.4, schema-utils@^0.4.5: +schema-utils@^0.4.4, schema-utils@^0.4.5: version "0.4.7" resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-0.4.7.tgz#ba74f597d2be2ea880131746ee17d0a093c68187" dependencies: @@ -10689,8 +10790,8 @@ seed-random@2.2.0: resolved "https://registry.yarnpkg.com/seed-random/-/seed-random-2.2.0.tgz#2a9b19e250a817099231a5b99a4daf80b7fbed54" seedrandom@^2.4.2: - version "2.4.3" - resolved "https://registry.yarnpkg.com/seedrandom/-/seedrandom-2.4.3.tgz#2438504dad33917314bff18ac4d794f16d6aaecc" + version "2.4.4" + resolved "https://registry.yarnpkg.com/seedrandom/-/seedrandom-2.4.4.tgz#b25ea98632c73e45f58b77cfaa931678df01f9ba" seekout@^1.0.1: version "1.0.2" @@ -10721,8 +10822,8 @@ semver-utils@^1.1.1: resolved "https://registry.yarnpkg.com/semver-utils/-/semver-utils-1.1.2.tgz#197d758a0a28c3d3a009338cfbcc1211bccd76d4" "semver@2 >=2.2.1 || 3.x || 4 || 5", "semver@2 || 3 || 4 || 5", "semver@2.x || 3.x || 4 || 5", "semver@^2.3.0 || 3.x || 4 || 5", semver@^5.0.3, semver@^5.1.0, semver@^5.3.0, semver@^5.5.0: - version "5.5.0" - resolved "https://registry.yarnpkg.com/semver/-/semver-5.5.0.tgz#dc4bbc7a6ca9d916dee5d43516f0092b58f7b8ab" + version "5.5.1" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.5.1.tgz#7dfdd8814bdb7cabc7be0fb1d734cfb66c940477" semver@5.4.1: version "5.4.1" @@ -10873,8 +10974,8 @@ shelljs@^0.8.0: rechoir "^0.6.2" shortid@^2.2.6: - version "2.2.12" - resolved "https://registry.yarnpkg.com/shortid/-/shortid-2.2.12.tgz#8e9a95ffbc671fff8f09e985dbc7874102b0cfd2" + version "2.2.13" + resolved "https://registry.yarnpkg.com/shortid/-/shortid-2.2.13.tgz#b2441e71c664ace458a341d343959f677910ef5b" dependencies: nanoid "^1.0.7" @@ -10896,7 +10997,7 @@ simple-swizzle@^0.2.2: sinon@^4.0.0: version "4.5.0" - resolved "https://registry.yarnpkg.com/sinon/-/sinon-4.5.0.tgz#427ae312a337d3c516804ce2754e8c0d5028cb04" + resolved "http://registry.npmjs.org/sinon/-/sinon-4.5.0.tgz#427ae312a337d3c516804ce2754e8c0d5028cb04" dependencies: "@sinonjs/formatio" "^2.0.0" diff "^3.1.0" @@ -11036,7 +11137,7 @@ source-map-url@^0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.4.0.tgz#3e935d7ddd73631b97659956d55128e87b5084a3" -source-map@0.4.x, source-map@^0.4.4: +source-map@0.4.x: version "0.4.4" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.4.4.tgz#eba4f5da9c0dc999de68032d8b4f76173652036b" dependencies: @@ -11052,7 +11153,7 @@ source-map@^0.1.34: dependencies: amdefine ">=0.0.4" -source-map@^0.5.0, source-map@^0.5.3, source-map@^0.5.6, source-map@^0.5.7, source-map@~0.5.1: +source-map@^0.5.0, source-map@^0.5.3, source-map@^0.5.6, source-map@^0.5.7: version "0.5.7" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" @@ -11392,8 +11493,8 @@ supports-color@^3.1.2, supports-color@^3.2.3: has-flag "^1.0.0" supports-color@^5.1.0, supports-color@^5.3.0, supports-color@^5.4.0: - version "5.4.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.4.0.tgz#1c6b337402c2137605efe19f10fec390f6faab54" + version "5.5.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" dependencies: has-flag "^3.0.0" @@ -11609,14 +11710,14 @@ topojson@^1.6.19: rw "1" shapefile "0.3" -tough-cookie@^2.3.2: +tough-cookie@^2.3.2, tough-cookie@~2.4.3: version "2.4.3" resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.4.3.tgz#53f36da3f47783b0925afa06ff9f3b165280f781" dependencies: psl "^1.1.24" punycode "^1.4.1" -tough-cookie@~2.3.0, tough-cookie@~2.3.3: +tough-cookie@~2.3.0: version "2.3.4" resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.3.4.tgz#ec60cee38ac675063ffc97a5c18970578ee83655" dependencies: @@ -11718,22 +11819,16 @@ uglify-es@^3.3.4: commander "~2.13.0" source-map "~0.6.1" -uglify-js@^2.6: - version "2.8.29" - resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-2.8.29.tgz#29c5733148057bb4e1f75df35b7a9cb72e6a59dd" +uglify-js@^3.1.4: + version "3.4.9" + resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.4.9.tgz#af02f180c1207d76432e473ed24a28f4a782bae3" dependencies: - source-map "~0.5.1" - yargs "~3.10.0" - optionalDependencies: - uglify-to-browserify "~1.0.0" - -uglify-to-browserify@~1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz#6e0924d6bda6b5afe349e39a6d632850a0f882b7" + commander "~2.17.1" + source-map "~0.6.1" uglifyjs-webpack-plugin@^1.1.0, uglifyjs-webpack-plugin@^1.2.4: - version "1.2.7" - resolved "https://registry.yarnpkg.com/uglifyjs-webpack-plugin/-/uglifyjs-webpack-plugin-1.2.7.tgz#57638dd99c853a1ebfe9d97b42160a8a507f9d00" + version "1.3.0" + resolved "https://registry.yarnpkg.com/uglifyjs-webpack-plugin/-/uglifyjs-webpack-plugin-1.3.0.tgz#75f548160858163a08643e086d5fefe18a5d67de" dependencies: cacache "^10.0.4" find-cache-dir "^1.0.0" @@ -11898,7 +11993,7 @@ unset-value@^1.0.0: has-value "^0.3.1" isobject "^3.0.0" -untildify@^3.0.2: +untildify@^3.0.3: version "3.0.3" resolved "https://registry.yarnpkg.com/untildify/-/untildify-3.0.3.tgz#1e7b42b140bcfd922b22e70ca1265bfe3634c7c9" @@ -11925,7 +12020,7 @@ update-notifier@^2.2.0: semver-diff "^2.0.0" xdg-basedir "^3.0.0" -uri-js@^4.2.1: +uri-js@^4.2.2: version "4.2.2" resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.2.2.tgz#94c540e1ff772956e2299507c010aea6c8838eb0" dependencies: @@ -11944,12 +12039,12 @@ url-join@^4.0.0: resolved "https://registry.yarnpkg.com/url-join/-/url-join-4.0.0.tgz#4d3340e807d3773bda9991f8305acdcc2a665d2a" url-loader@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/url-loader/-/url-loader-1.0.1.tgz#61bc53f1f184d7343da2728a1289ef8722ea45ee" + version "1.1.1" + resolved "https://registry.yarnpkg.com/url-loader/-/url-loader-1.1.1.tgz#4d1f3b4f90dde89f02c008e662d604d7511167c1" dependencies: loader-utils "^1.1.0" mime "^2.0.3" - schema-utils "^0.4.3" + schema-utils "^1.0.0" url-parse-lax@^1.0.0: version "1.0.0" @@ -12026,7 +12121,7 @@ utils-merge@1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" -uuid@^3.0.0, uuid@^3.0.1, uuid@^3.1.0, uuid@^3.3.2: +uuid@^3.0.0, uuid@^3.0.1, uuid@^3.3.2: version "3.3.2" resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.3.2.tgz#1b4af4955eb3077c501c23872fc6513811587131" @@ -12280,15 +12375,6 @@ webpack-dev-server@^3.1.7: webpack-log "^2.0.0" yargs "12.0.1" -webpack-log@^1.1.2: - version "1.2.0" - resolved "https://registry.yarnpkg.com/webpack-log/-/webpack-log-1.2.0.tgz#a4b34cda6b22b518dbb0ab32e567962d5c72a43d" - dependencies: - chalk "^2.1.0" - log-symbols "^2.1.0" - loglevelnext "^1.0.1" - uuid "^3.1.0" - webpack-log@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/webpack-log/-/webpack-log-2.0.0.tgz#5b7928e0637593f119d32f6227c1e0ac31e1b47f" @@ -12296,9 +12382,9 @@ webpack-log@^2.0.0: ansi-colors "^3.0.0" uuid "^3.3.2" -webpack-sources@^1.0.0, webpack-sources@^1.0.1, webpack-sources@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-1.1.0.tgz#a101ebae59d6507354d71d8013950a3a8b7a5a54" +webpack-sources@^1.0.0, webpack-sources@^1.1.0, webpack-sources@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-1.2.0.tgz#18181e0d013fce096faf6f8e6d41eeffffdceac2" dependencies: source-list-map "^2.0.0" source-map "~0.6.1" @@ -12353,10 +12439,10 @@ wgs84@0.0.0: resolved "https://registry.yarnpkg.com/wgs84/-/wgs84-0.0.0.tgz#34fdc555917b6e57cf2a282ed043710c049cdc76" whatwg-encoding@^1.0.1: - version "1.0.3" - resolved "https://registry.yarnpkg.com/whatwg-encoding/-/whatwg-encoding-1.0.3.tgz#57c235bc8657e914d24e1a397d3c82daee0a6ba3" + version "1.0.4" + resolved "https://registry.yarnpkg.com/whatwg-encoding/-/whatwg-encoding-1.0.4.tgz#63fb016b7435b795d9025632c086a5209dbd2621" dependencies: - iconv-lite "0.4.19" + iconv-lite "0.4.23" whatwg-fetch@>=0.10.0: version "2.0.4" @@ -12401,18 +12487,10 @@ widest-line@^2.0.0: dependencies: string-width "^2.1.1" -window-size@0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/window-size/-/window-size-0.1.0.tgz#5438cd2ea93b202efa3a19fe8887aee7c94f9c9d" - window-size@^0.1.2: version "0.1.4" resolved "https://registry.yarnpkg.com/window-size/-/window-size-0.1.4.tgz#f8e1aa1ee5a53ec5bf151ffa09742a6ad7697876" -wordwrap@0.0.2: - version "0.0.2" - resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.2.tgz#b79669bb42ecb409f83d583cad52ca17eaa1643f" - wordwrap@1.0.x, wordwrap@^1.0.0, wordwrap@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb" @@ -12429,7 +12507,7 @@ worker-farm@^1.5.2: wrap-ansi@^2.0.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-2.1.0.tgz#d8fc3d284dd05794fe84973caecdd1cf824fdd85" + resolved "http://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz#d8fc3d284dd05794fe84973caecdd1cf824fdd85" dependencies: string-width "^1.0.1" strip-ansi "^3.0.1" @@ -12570,7 +12648,7 @@ yargs@12.0.1: yargs@^11.1.0: version "11.1.0" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-11.1.0.tgz#90b869934ed6e871115ea2ff58b03f4724ed2d77" + resolved "http://registry.npmjs.org/yargs/-/yargs-11.1.0.tgz#90b869934ed6e871115ea2ff58b03f4724ed2d77" dependencies: cliui "^4.0.0" decamelize "^1.1.1" @@ -12587,38 +12665,29 @@ yargs@^11.1.0: yargs@~1.2.6: version "1.2.6" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-1.2.6.tgz#9c7b4a82fd5d595b2bf17ab6dcc43135432fe34b" + resolved "http://registry.npmjs.org/yargs/-/yargs-1.2.6.tgz#9c7b4a82fd5d595b2bf17ab6dcc43135432fe34b" dependencies: minimist "^0.1.0" -yargs@~3.10.0: - version "3.10.0" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-3.10.0.tgz#f7ee7bd857dd7c1d2d38c0e74efbd681d1431fd1" - dependencies: - camelcase "^1.0.2" - cliui "^2.1.0" - decamelize "^1.0.0" - window-size "0.1.0" - yeoman-environment@^2.0.5, yeoman-environment@^2.1.1: - version "2.3.1" - resolved "https://registry.yarnpkg.com/yeoman-environment/-/yeoman-environment-2.3.1.tgz#1aa00cc474a8e48518ab2b0f64b43034215e9997" + version "2.3.3" + resolved "https://registry.yarnpkg.com/yeoman-environment/-/yeoman-environment-2.3.3.tgz#1bd9720714cc49036e901503a789d809df8f51bf" dependencies: - chalk "^2.1.0" + chalk "^2.4.1" cross-spawn "^6.0.5" debug "^3.1.0" - diff "^3.3.1" + diff "^3.5.0" escape-string-regexp "^1.0.2" globby "^8.0.1" grouped-queue "^0.3.3" - inquirer "^5.2.0" + inquirer "^6.0.0" is-scoped "^1.0.0" lodash "^4.17.10" - log-symbols "^2.1.0" + log-symbols "^2.2.0" mem-fs "^1.1.0" strip-ansi "^4.0.0" text-table "^0.2.0" - untildify "^3.0.2" + untildify "^3.0.3" yeoman-generator@^2.0.5: version "2.0.5" From 1e00b1dc30e88316d83e11fd9fcd424a2562cbf6 Mon Sep 17 00:00:00 2001 From: Krist Wongsuphasawat Date: Wed, 5 Sep 2018 12:59:23 -0700 Subject: [PATCH 09/13] [SIP-5] Refactor parallel coordinates (#5761) * Extract slice and formData * organize imports (cherry picked from commit dafe0b996105131e70680219532f8f9f9b025bdc) --- .../visualizations/parallel_coordinates.js | 161 +++++++++++------- 1 file changed, 101 insertions(+), 60 deletions(-) diff --git a/superset/assets/src/visualizations/parallel_coordinates.js b/superset/assets/src/visualizations/parallel_coordinates.js index 8e4ff5e6ccbd7..7d454e10e8568 100644 --- a/superset/assets/src/visualizations/parallel_coordinates.js +++ b/superset/assets/src/visualizations/parallel_coordinates.js @@ -1,89 +1,130 @@ import d3 from 'd3'; +import PropTypes from 'prop-types'; +import { colorScalerFactory } from '../modules/colors'; +import parcoords from '../../vendor/parallel_coordinates/d3.parcoords'; +import divgrid from '../../vendor/parallel_coordinates/divgrid'; import '../../vendor/parallel_coordinates/d3.parcoords.css'; import './parallel_coordinates.css'; -import { colorScalerFactory } from '../modules/colors'; -d3.parcoords = require('../../vendor/parallel_coordinates/d3.parcoords.js'); -d3.divgrid = require('../../vendor/parallel_coordinates/divgrid.js'); +const propTypes = { + // Standard tabular data [{ fieldName1: value1, fieldName2: value2 }] + data: PropTypes.arrayOf(PropTypes.object), + width: PropTypes.number, + height: PropTypes.number, + colorMetric: PropTypes.string, + includeSeries: PropTypes.bool, + linearColorScheme: PropTypes.string, + metrics: PropTypes.arrayOf(PropTypes.string), + series: PropTypes.string, + showDatatable: PropTypes.bool, +}; -const $ = require('jquery'); +function ParallelCoordinates(element, props) { + PropTypes.checkPropTypes(propTypes, props, 'prop', 'ParallelCoordinates'); -function parallelCoordVis(slice, payload) { - $('#code').attr('rows', '15'); - const fd = slice.formData; - const data = payload.data; + const { + data, + width, + height, + colorMetric, + includeSeries, + linearColorScheme, + metrics, + series, + showDatatable, + } = props; - const metrics = fd.metrics.map(m => m.label || m); - - let cols = metrics; - if (fd.include_series) { - cols = [fd.series].concat(metrics); - } + const cols = includeSeries ? [series].concat(metrics) : metrics; const ttypes = {}; - ttypes[fd.series] = 'string'; - metrics.forEach(function (v) { - ttypes[v] = 'number'; - }); + ttypes[series] = 'string'; + metrics.forEach((v) => { ttypes[v] = 'number'; }); - const secondaryMetric = fd.secondary_metric ? fd.secondary_metric.label : fd.secondary_metric; - const colorScaler = fd.secondary_metric ? - colorScalerFactory(fd.linear_color_scheme, data, d => d[secondaryMetric]) : - () => 'grey'; - const color = d => colorScaler(d[secondaryMetric]); - const container = d3.select(slice.selector); + const colorScaler = colorMetric + ? colorScalerFactory(linearColorScheme, data, d => d[colorMetric]) + : () => 'grey'; + const color = d => colorScaler(d[colorMetric]); + const container = d3.select(element); container.selectAll('*').remove(); - const effHeight = fd.show_datatable ? (slice.height() / 2) : slice.height(); + const effHeight = showDatatable ? (height / 2) : height; - container.append('div') - .attr('id', 'parcoords_' + slice.container_id) - .style('height', effHeight + 'px') - .classed('parcoords', true); + const div = container.append('div') + .style('height', effHeight + 'px') + .classed('parcoords', true); - const parcoords = d3.parcoords()('#parcoords_' + slice.container_id) - .width(slice.width()) - .color(color) - .alpha(0.5) - .composite('darken') - .height(effHeight) - .data(data) - .dimensions(cols) - .types(ttypes) - .render() - .createAxes() - .shadows() - .reorderable() - .brushMode('1D-axes'); + const chart = parcoords()(div.node()) + .width(width) + .color(color) + .alpha(0.5) + .composite('darken') + .height(effHeight) + .data(data) + .dimensions(cols) + .types(ttypes) + .render() + .createAxes() + .shadows() + .reorderable() + .brushMode('1D-axes'); - if (fd.show_datatable) { + if (showDatatable) { // create data table, row hover highlighting - const grid = d3.divgrid(); + const grid = divgrid(); container.append('div') - .style('height', effHeight + 'px') - .datum(data) - .call(grid) - .classed('parcoords grid', true) - .selectAll('.row') - .on({ - mouseover(d) { - parcoords.highlight([d]); - }, - mouseout: parcoords.unhighlight, - }); + .style('height', effHeight + 'px') + .datum(data) + .call(grid) + .classed('parcoords grid', true) + .selectAll('.row') + .on({ + mouseover(d) { + chart.highlight([d]); + }, + mouseout: chart.unhighlight, + }); // update data table on brush event - parcoords.on('brush', function (d) { + chart.on('brush', function (d) { d3.select('.grid') .datum(d) .call(grid) .selectAll('.row') .on({ mouseover(dd) { - parcoords.highlight([dd]); + chart.highlight([dd]); }, - mouseout: parcoords.unhighlight, + mouseout: chart.unhighlight, }); }); } } -module.exports = parallelCoordVis; +ParallelCoordinates.propTypes = propTypes; + +function adaptor(slice, payload) { + const { selector, formData } = slice; + const { + include_series: includeSeries, + linear_color_scheme: linearColorScheme, + metrics, + secondary_metric: secondaryMetric, + series, + show_datatable: showDatatable, + } = formData; + const element = document.querySelector(selector); + + return ParallelCoordinates(element, { + data: payload.data, + width: slice.width(), + height: slice.height(), + includeSeries, + linearColorScheme, + metrics: metrics.map(m => m.label || m), + colorMetric: secondaryMetric && secondaryMetric.label + ? secondaryMetric.label + : secondaryMetric, + series, + showDatatable, + }); +} + +export default adaptor; From 8858ef8b96bd22f7b3694776cf104d8e25b22048 Mon Sep 17 00:00:00 2001 From: Krist Wongsuphasawat Date: Wed, 5 Sep 2018 13:46:04 -0700 Subject: [PATCH 10/13] [SIP-5] Remove unused function #easy-review (#5825) * remove unused function * remove comment (cherry picked from commit a9952bb4492b86192a39a669e2d35d969d56c3dd) --- superset/assets/src/chart/Chart.jsx | 4 ---- superset/assets/src/visualizations/table.js | 4 ---- 2 files changed, 8 deletions(-) diff --git a/superset/assets/src/chart/Chart.jsx b/superset/assets/src/chart/Chart.jsx index bbb664a435998..f64d4273c6646 100644 --- a/superset/assets/src/chart/Chart.jsx +++ b/superset/assets/src/chart/Chart.jsx @@ -170,10 +170,6 @@ class Chart extends React.PureComponent { this.props.actions.chartRenderingFailed(e, this.props.chartId); } - verboseMetricName(metric) { - return this.props.datasource.verbose_map[metric] || metric; - } - renderTooltip() { if (this.state.tooltip) { return ( diff --git a/superset/assets/src/visualizations/table.js b/superset/assets/src/visualizations/table.js index 1e09b834022b3..a875aad655832 100644 --- a/superset/assets/src/visualizations/table.js +++ b/superset/assets/src/visualizations/table.js @@ -288,10 +288,6 @@ function adaptor(slice, payload) { orderDesc, pageLength: pageLength && parseInt(pageLength, 10), percentMetrics, - // Aug 22, 2018 - // Perhaps this `tableFilter` field can be removed as there is - // no code left in repo to set tableFilter to true. - // which make `onAddFilter` will never be called as well. tableFilter, tableTimestampFormat, timeseriesLimitMetric, From f98125d0b89f3ad2d18e76899dfb7f783b6606a5 Mon Sep 17 00:00:00 2001 From: Krist Wongsuphasawat Date: Thu, 6 Sep 2018 16:14:27 -0700 Subject: [PATCH 11/13] [SIP-5] Refactor Paired t-test (#5762) * extract TTestTable into another file. * Move into directory. * update proptypes (cherry picked from commit 68e7794daf79f64e9afd3ccd719ff436560019ea) --- .../PairedTTest.css} | 10 +-- .../PairedTTest/PairedTTest.jsx | 85 ++++++++++++++++++ .../TTestTable.jsx} | 87 ++++++------------- superset/assets/src/visualizations/index.js | 2 +- 4 files changed, 118 insertions(+), 66 deletions(-) rename superset/assets/src/visualizations/{paired_ttest.css => PairedTTest/PairedTTest.css} (98%) create mode 100644 superset/assets/src/visualizations/PairedTTest/PairedTTest.jsx rename superset/assets/src/visualizations/{paired_ttest.jsx => PairedTTest/TTestTable.jsx} (79%) diff --git a/superset/assets/src/visualizations/paired_ttest.css b/superset/assets/src/visualizations/PairedTTest/PairedTTest.css similarity index 98% rename from superset/assets/src/visualizations/paired_ttest.css rename to superset/assets/src/visualizations/PairedTTest/PairedTTest.css index 0a2c1b8d28f28..95068ca3011ac 100644 --- a/superset/assets/src/visualizations/paired_ttest.css +++ b/superset/assets/src/visualizations/PairedTTest/PairedTTest.css @@ -1,5 +1,5 @@ .paired_ttest .scrollbar-container { - overflow: scroll; + overflow: auto; } .paired-ttest-table .scrollbar-content { @@ -8,6 +8,10 @@ margin-bottom: 0; } +.paired-ttest-table table { + margin-bottom: 0; +} + .paired-ttest-table h1 { margin-left: 5px; } @@ -61,7 +65,3 @@ position: absolute; right: 10px; } - -.paired-ttest-table table { - margin-bottom: 0; -} diff --git a/superset/assets/src/visualizations/PairedTTest/PairedTTest.jsx b/superset/assets/src/visualizations/PairedTTest/PairedTTest.jsx new file mode 100644 index 0000000000000..3a26e9d399467 --- /dev/null +++ b/superset/assets/src/visualizations/PairedTTest/PairedTTest.jsx @@ -0,0 +1,85 @@ + +import PropTypes from 'prop-types'; +import ReactDOM from 'react-dom'; +import React from 'react'; +import TTestTable, { dataPropType } from './TTestTable'; +import './PairedTTest.css'; + +const propTypes = { + className: PropTypes.string, + metrics: PropTypes.arrayOf(PropTypes.string).isRequired, + groups: PropTypes.arrayOf(PropTypes.string).isRequired, + data: PropTypes.objectOf(dataPropType).isRequired, + alpha: PropTypes.number, + liftValPrec: PropTypes.number, + pValPrec: PropTypes.number, +}; + +const defaultProps = { + className: '', + alpha: 0.05, + liftValPrec: 4, + pValPrec: 6, +}; + +class PairedTTest extends React.PureComponent { + render() { + const { + className, + metrics, + groups, + data, + alpha, + pValPrec, + liftValPrec, + } = this.props; + return ( +
+
+ {metrics.map((metric, i) => ( + + ))} +
+
+ ); + } +} + +PairedTTest.propTypes = propTypes; +PairedTTest.defaultProps = defaultProps; + +function adaptor(slice, payload) { + const { formData, selector } = slice; + const element = document.querySelector(selector); + const { + groupby: groups, + metrics, + liftvalue_precision: liftValPrec, + pvalue_precision: pValPrec, + significance_level: alpha, + } = formData; + + console.log('groups', groups, payload.data); + + ReactDOM.render( + , + element, + ); +} + +export default adaptor; diff --git a/superset/assets/src/visualizations/paired_ttest.jsx b/superset/assets/src/visualizations/PairedTTest/TTestTable.jsx similarity index 79% rename from superset/assets/src/visualizations/paired_ttest.jsx rename to superset/assets/src/visualizations/PairedTTest/TTestTable.jsx index e715f02358615..06c880be2c11a 100644 --- a/superset/assets/src/visualizations/paired_ttest.jsx +++ b/superset/assets/src/visualizations/PairedTTest/TTestTable.jsx @@ -1,15 +1,32 @@ -import d3 from 'd3'; import dist from 'distributions'; - import React from 'react'; import { Table, Tr, Td, Thead, Th } from 'reactable'; -import ReactDOM from 'react-dom'; import PropTypes from 'prop-types'; -import './paired_ttest.css'; +export const dataPropType = PropTypes.arrayOf(PropTypes.shape({ + group: PropTypes.arrayOf(PropTypes.string), + values: PropTypes.arrayOf(PropTypes.shape({ + x: PropTypes.number, + y: PropTypes.number, + })), +})); -class TTestTable extends React.Component { +const propTypes = { + metric: PropTypes.string.isRequired, + groups: PropTypes.arrayOf(PropTypes.string).isRequired, + data: dataPropType.isRequired, + alpha: PropTypes.number, + liftValPrec: PropTypes.number, + pValPrec: PropTypes.number, +}; + +const defaultProps = { + alpha: 0.05, + liftValPrec: 4, + pValPrec: 6, +}; +class TTestTable extends React.Component { constructor(props) { super(props); this.state = { @@ -29,7 +46,7 @@ class TTestTable extends React.Component { return 'control'; } const liftVal = this.state.liftValues[row]; - if (isNaN(liftVal) || !isFinite(liftVal)) { + if (Number.isNaN(liftVal) || !Number.isFinite(liftVal)) { return 'invalid'; // infinite or NaN values } return liftVal >= 0 ? 'true' : 'false'; // green on true, red on false @@ -40,7 +57,7 @@ class TTestTable extends React.Component { return 'control'; } const pVal = this.state.pValues[row]; - if (isNaN(pVal) || !isFinite(pVal)) { + if (Number.isNaN(pVal) || !Number.isFinite(pVal)) { return 'invalid'; } return ''; // p-values won't normally be colored @@ -221,57 +238,7 @@ class TTestTable extends React.Component { } } -TTestTable.propTypes = { - metric: PropTypes.string.isRequired, - groups: PropTypes.array.isRequired, - data: PropTypes.array.isRequired, - alpha: PropTypes.number.isRequired, - liftValPrec: PropTypes.number.isRequired, - pValPrec: PropTypes.number.isRequired, -}; -TTestTable.defaultProps = { - metric: '', - groups: [], - data: [], - alpha: 0.05, - liftValPrec: 4, - pValPrec: 6, -}; - -function pairedTTestVis(slice, payload) { - const div = d3.select(slice.selector); - const container = slice.container; - const height = slice.container.height(); - const fd = slice.formData; - const data = payload.data; - const alpha = fd.significance_level; - const pValPrec = fd.pvalue_precision; - const liftValPrec = fd.liftvalue_precision; - const tables = fd.metrics.map((metric, i) => ( // create a table for each metric - 32 ? 32 : pValPrec} - liftValPrec={liftValPrec > 32 ? 32 : liftValPrec} - /> - )); - div.html(''); - ReactDOM.render( -
-
-
-
- {tables} -
-
-
-
, - div.node(), - ); - container.find('.scrollbar-container').css('max-height', height); -} +TTestTable.propTypes = propTypes; +TTestTable.defaultProps = defaultProps; -module.exports = pairedTTestVis; +export default TTestTable; diff --git a/superset/assets/src/visualizations/index.js b/superset/assets/src/visualizations/index.js index 99a70f26cb5c9..0189d2756edb8 100644 --- a/superset/assets/src/visualizations/index.js +++ b/superset/assets/src/visualizations/index.js @@ -113,7 +113,7 @@ const vizMap = { [VIZ_TYPES.event_flow]: () => loadVis(import(/* webpackChunkName: "EventFlow" */ './EventFlow.jsx')), [VIZ_TYPES.paired_ttest]: () => - loadVis(import(/* webpackChunkName: "paired_ttest" */ './paired_ttest.jsx')), + loadVis(import(/* webpackChunkName: "paired_ttest" */ './PairedTTest/PairedTTest.jsx')), [VIZ_TYPES.partition]: () => loadVis(import(/* webpackChunkName: "partition" */ './partition.js')), [VIZ_TYPES.deck_scatter]: () => From cc3fe622820f1760b008e3ae16200144d29d29ae Mon Sep 17 00:00:00 2001 From: Krist Wongsuphasawat Date: Tue, 11 Sep 2018 15:59:51 -0700 Subject: [PATCH 12/13] remove console.log --- superset/assets/src/visualizations/PairedTTest/PairedTTest.jsx | 2 -- 1 file changed, 2 deletions(-) diff --git a/superset/assets/src/visualizations/PairedTTest/PairedTTest.jsx b/superset/assets/src/visualizations/PairedTTest/PairedTTest.jsx index 3a26e9d399467..3fd9f61c25811 100644 --- a/superset/assets/src/visualizations/PairedTTest/PairedTTest.jsx +++ b/superset/assets/src/visualizations/PairedTTest/PairedTTest.jsx @@ -67,8 +67,6 @@ function adaptor(slice, payload) { significance_level: alpha, } = formData; - console.log('groups', groups, payload.data); - ReactDOM.render( Date: Mon, 10 Sep 2018 10:31:58 -0700 Subject: [PATCH 13/13] add timing to stats logger (#5844) (cherry picked from commit e35bfba308a1ed21226143c18feb4e11f5bec845) --- superset/stats_logger.py | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/superset/stats_logger.py b/superset/stats_logger.py index aaab8a11f19d6..e16ecbb5878c4 100644 --- a/superset/stats_logger.py +++ b/superset/stats_logger.py @@ -29,6 +29,9 @@ def decr(self, key): """Decrement a counter""" raise NotImplementedError() + def timing(self, key, value): + raise NotImplementedError() + def gauge(self, key): """Setup a gauge""" raise NotImplementedError() @@ -44,6 +47,11 @@ def decr(self, key): Fore.CYAN + '[stats_logger] (decr) ' + key + Style.RESET_ALL)) + def timing(self, key, value): + logging.debug(( + Fore.CYAN + '[stats_logger] (timing) {key} | {value} ' + + Style.RESET_ALL).format(**locals())) + def gauge(self, key, value): logging.debug(( Fore.CYAN + '[stats_logger] (gauge) ' @@ -63,6 +71,9 @@ def incr(self, key): def decr(self, key): self.client.decr(key) + def timing(self, key, value): + self.client.timing(key, value) + def gauge(self, key): # pylint: disable=no-value-for-parameter self.client.gauge(key)