From 897e9497378bb1651172a020b70eed52727b1a9e Mon Sep 17 00:00:00 2001 From: Sonja Happ Date: Wed, 17 Jul 2019 16:09:49 +0200 Subject: [PATCH 001/391] change version of node image back to 8.2 for compatibility reasons --- packaging/docker/Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packaging/docker/Dockerfile b/packaging/docker/Dockerfile index 28b1443..5fa8f1b 100644 --- a/packaging/docker/Dockerfile +++ b/packaging/docker/Dockerfile @@ -1,4 +1,4 @@ -FROM node:12.2 AS builder +FROM node:8.2 AS builder RUN apt-get install -y \ git From ca5b7170562dbf738167f76a92673f2ea53bc99b Mon Sep 17 00:00:00 2001 From: Sonja Happ Date: Wed, 17 Jul 2019 16:33:26 +0200 Subject: [PATCH 002/391] change version of node image 8.6; work around for href warnings with button --- packaging/docker/Dockerfile | 2 +- src/components/editable-header.js | 8 ++++---- src/components/table.js | 2 +- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/packaging/docker/Dockerfile b/packaging/docker/Dockerfile index 5fa8f1b..33e72b7 100644 --- a/packaging/docker/Dockerfile +++ b/packaging/docker/Dockerfile @@ -1,4 +1,4 @@ -FROM node:8.2 AS builder +FROM node:8.6 AS builder RUN apt-get install -y \ git diff --git a/src/components/editable-header.js b/src/components/editable-header.js index 44c0f46..fcc7e53 100644 --- a/src/components/editable-header.js +++ b/src/components/editable-header.js @@ -21,7 +21,7 @@ import React from 'react'; import PropTypes from 'prop-types'; -import { FormControl } from 'react-bootstrap'; +import { FormControl, Button } from 'react-bootstrap'; import Icon from './icon'; class EditableHeader extends React.Component { @@ -85,8 +85,8 @@ class EditableHeader extends React.Component { - - + + ; } @@ -95,7 +95,7 @@ class EditableHeader extends React.Component { {this.state.title} - + ; } } diff --git a/src/components/table.js b/src/components/table.js index b81b63a..aec0667 100644 --- a/src/components/table.js +++ b/src/components/table.js @@ -74,7 +74,7 @@ class CustomTable extends Component { if (linkKey && data[linkKey] != null) { cell.push({content}); } else if (child.props.clickable) { - cell.push( child.props.onClick(index)}>{content}); + cell.push(); } else { cell.push(content); } From 9b68230712c23141f5c018f218b607663a2ed62a Mon Sep 17 00:00:00 2001 From: Sonja Happ Date: Wed, 17 Jul 2019 17:28:31 +0200 Subject: [PATCH 003/391] fix test --- .../components/dialog/edit-widget-control-creator.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/__tests__/components/dialog/edit-widget-control-creator.js b/src/__tests__/components/dialog/edit-widget-control-creator.js index 29e8cd0..d93cdbe 100644 --- a/src/__tests__/components/dialog/edit-widget-control-creator.js +++ b/src/__tests__/components/dialog/edit-widget-control-creator.js @@ -28,12 +28,12 @@ describe('edit widget control creator', () => { { args: { widgetType: 'Lamp' }, result: { controlNumber: 5, controlTypes: [EditWidgetSimulationControl, EditWidgetSignalControl, EditWidgetTextControl, EditWidgetColorControl, EditWidgetColorControl] } }, { args: { widgetType: 'Value' }, result: { controlNumber: 5, controlTypes: [EditWidgetTextControl, EditWidgetSimulationControl, EditWidgetSignalControl, EditWidgetTextSizeControl, EditWidgetCheckboxControl] } }, { args: { widgetType: 'Plot' }, result: { controlNumber: 5, controlTypes: [EditWidgetTimeControl, EditWidgetSimulationControl, EditWidgetSignalsControl, EditWidgetTextControl, EditWidgetMinMaxControl] } }, - { args: { widgetType: 'Table' }, result: { controlNumber: 1, controlTypes: [EditWidgetSimulationControl] } }, + { args: { widgetType: 'Table' }, result: { controlNumber: 2, controlTypes: [EditWidgetSimulationControl, EditWidgetCheckboxControl] } }, { args: { widgetType: 'Image' }, result: { controlNumber: 2, controlTypes: [EditImageWidgetControl, EditWidgetAspectControl] } }, { args: { widgetType: 'Gauge' }, result: { controlNumber: 6, controlTypes: [EditWidgetTextControl, EditWidgetSimulationControl, EditWidgetSignalControl, EditWidgetCheckboxControl, EditWidgetColorZonesControl, EditWidgetMinMaxControl] } }, { args: { widgetType: 'PlotTable' }, result: { controlNumber: 5, controlTypes: [EditWidgetSimulationControl, EditWidgetSignalsControl, EditWidgetTextControl, EditWidgetTimeControl, EditWidgetMinMaxControl] } }, { args: { widgetType: 'Slider' }, result: { controlNumber: 9, controlTypes: [EditWidgetTextControl, EditWidgetOrientation, EditWidgetSimulationControl, EditWidgetSignalControl, EditWidgetCheckboxControl, EditWidgetCheckboxControl, EditWidgetMinMaxControl, EditWidgetNumberControl, EditWidgetNumberControl] } }, - { args: { widgetType: 'Button' }, result: { controlNumber: 4, controlTypes: [EditWidgetColorControl, EditWidgetSimulationControl, EditWidgetSignalControl] } }, + { args: { widgetType: 'Button' }, result: { controlNumber: 6, controlTypes: [EditWidgetTextControl, EditWidgetSimulationControl, EditWidgetSignalControl, EditWidgetCheckboxControl, EditWidgetNumberControl, EditWidgetNumberControl] } }, { args: { widgetType: 'Box' }, result: { controlNumber: 2, controlTypes: [EditWidgetColorControl, EditWidgetColorControl] } }, { args: { widgetType: 'Label' }, result: { controlNumber: 3, controlTypes: [EditWidgetTextControl, EditWidgetTextSizeControl, EditWidgetColorControl] } }, { args: { widgetType: 'HTML' }, result: { controlNumber: 1, controlTypes: [EditWidgetHTMLContent] } }, From 8ace42759aeddbbdfdcab3c9ee1b0465c4759b2c Mon Sep 17 00:00:00 2001 From: Sonja Happ Date: Mon, 22 Jul 2019 15:59:59 +0200 Subject: [PATCH 004/391] - update a lot of dependencies - adaptions in code for compatibility with new package version (esp. react-bootstrap, react-dnd, and d3-scale) - add (ugly) workaround for flux containers to work with ES6 - use node 12.2 in Dockerfile --- package-lock.json | 2622 ++++++++--------- package.json | 68 +- packaging/docker/Dockerfile | 2 +- src/components/dialogs/edit-project.js | 6 +- src/components/dialogs/edit-simulation.js | 6 +- src/components/dialogs/edit-simulator.js | 8 +- src/components/dialogs/edit-user.js | 8 +- src/components/dialogs/edit-visualization.js | 4 +- .../dialogs/edit-widget-aspect-control.js | 6 +- .../dialogs/edit-widget-checkbox-control.js | 6 +- .../dialogs/edit-widget-color-control.js | 12 +- .../edit-widget-color-zones-control.js | 4 +- .../dialogs/edit-widget-html-content.js | 4 +- .../dialogs/edit-widget-image-control.js | 6 +- .../dialogs/edit-widget-min-max-control.js | 6 +- .../dialogs/edit-widget-number-control.js | 4 +- .../dialogs/edit-widget-orientation.js | 8 +- .../dialogs/edit-widget-parameters-control.js | 4 +- .../dialogs/edit-widget-signal-control.js | 4 +- .../dialogs/edit-widget-signals-control.js | 6 +- .../dialogs/edit-widget-simulation-control.js | 4 +- .../dialogs/edit-widget-text-control.js | 4 +- .../dialogs/edit-widget-text-size-control.js | 6 +- .../dialogs/edit-widget-time-control.js | 6 +- src/components/dialogs/edit-widget.js | 2 +- .../dialogs/import-simulation-model.js | 6 +- src/components/dialogs/import-simulation.js | 10 +- src/components/dialogs/import-simulator.js | 12 +- .../dialogs/import-visualization.js | 6 +- src/components/dialogs/new-project.js | 6 +- src/components/dialogs/new-simulation.js | 6 +- src/components/dialogs/new-simulator.js | 8 +- src/components/dialogs/new-user.js | 12 +- src/components/dialogs/new-visualization.js | 4 +- src/components/login-form.js | 6 +- src/components/signal-mapping.js | 8 +- src/components/simulator-action.js | 6 +- src/components/table.js | 6 +- src/components/widget-plot/plot-legend.js | 3 +- src/components/widget-plot/plot.js | 3 +- src/components/widgets/input.js | 4 +- src/components/widgets/plot-table.js | 4 +- src/containers/FluxContainerConverter.js | 15 + src/containers/app.js | 61 +- src/containers/login.js | 7 +- src/containers/project.js | 3 +- src/containers/projects.js | 3 +- src/containers/select-file.js | 7 +- src/containers/select-simulator.js | 7 +- src/containers/simulation-model.js | 7 +- src/containers/simulation.js | 3 +- src/containers/simulations.js | 3 +- src/containers/simulators.js | 3 +- src/containers/users.js | 3 +- src/containers/visualization.js | 3 +- src/containers/widget.js | 5 +- src/data-managers/rest-data-manager.js | 2 +- 57 files changed, 1533 insertions(+), 1525 deletions(-) create mode 100644 src/containers/FluxContainerConverter.js diff --git a/package-lock.json b/package-lock.json index d1c1633..8ed2120 100644 --- a/package-lock.json +++ b/package-lock.json @@ -5,9 +5,9 @@ "requires": true, "dependencies": { "@babel/code-frame": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.0.0.tgz", - "integrity": "sha512-OfC2uemaknXr87bdLUkWog7nYuliM9Ij5HUcajsVcMCpQrcLmtxRbVFTIqmcSkSeYRBFBRxs2FiUqFJDLdiebA==", + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.5.5.tgz", + "integrity": "sha512-27d4lZoomVyo51VegxI20xZPuSHusqbQag/ztrBC7wegWoQ1nLREPVSKSW8byhTlzTKyNE4ifaTA6lCp7JjpFw==", "requires": { "@babel/highlight": "^7.0.0" } @@ -46,13 +46,13 @@ } }, "@babel/generator": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.4.4.tgz", - "integrity": "sha512-53UOLK6TVNqKxf7RUh8NE851EHRxOOeVXKbK2bivdb+iziMyk03Sr4eaE9OELCbyZAAafAKPDwF2TPUES5QbxQ==", + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.5.5.tgz", + "integrity": "sha512-ETI/4vyTSxTzGnU2c49XHv2zhExkv9JHLTwDAFz85kmcwuShvYG2H08FwgIguQf4JC75CBnXAUM5PqeF4fj0nQ==", "requires": { - "@babel/types": "^7.4.4", + "@babel/types": "^7.5.5", "jsesc": "^2.5.1", - "lodash": "^4.17.11", + "lodash": "^4.17.13", "source-map": "^0.5.0", "trim-right": "^1.0.1" }, @@ -101,26 +101,26 @@ } }, "@babel/helper-create-class-features-plugin": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.4.4.tgz", - "integrity": "sha512-UbBHIa2qeAGgyiNR9RszVF7bUHEdgS4JAUNT8SiqrAN6YJVxlOxeLr5pBzb5kan302dejJ9nla4RyKcR1XT6XA==", + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.5.5.tgz", + "integrity": "sha512-ZsxkyYiRA7Bg+ZTRpPvB6AbOFKTFFK4LrvTet8lInm0V468MWCaSYJE+I7v2z2r8KNLtYiV+K5kTCnR7dvyZjg==", "requires": { "@babel/helper-function-name": "^7.1.0", - "@babel/helper-member-expression-to-functions": "^7.0.0", + "@babel/helper-member-expression-to-functions": "^7.5.5", "@babel/helper-optimise-call-expression": "^7.0.0", "@babel/helper-plugin-utils": "^7.0.0", - "@babel/helper-replace-supers": "^7.4.4", + "@babel/helper-replace-supers": "^7.5.5", "@babel/helper-split-export-declaration": "^7.4.4" } }, "@babel/helper-define-map": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/helper-define-map/-/helper-define-map-7.4.4.tgz", - "integrity": "sha512-IX3Ln8gLhZpSuqHJSnTNBWGDE9kdkTEWl21A/K7PQ00tseBwbqCHTvNLHSBd9M0R5rER4h5Rsvj9vw0R5SieBg==", + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/helper-define-map/-/helper-define-map-7.5.5.tgz", + "integrity": "sha512-fTfxx7i0B5NJqvUOBBGREnrqbTxRh7zinBANpZXAVDlsZxYdclDp467G1sQ8VZYMnAURY3RpBUAgOYT9GfzHBg==", "requires": { "@babel/helper-function-name": "^7.1.0", - "@babel/types": "^7.4.4", - "lodash": "^4.17.11" + "@babel/types": "^7.5.5", + "lodash": "^4.17.13" } }, "@babel/helper-explode-assignable-expression": { @@ -159,11 +159,11 @@ } }, "@babel/helper-member-expression-to-functions": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.0.0.tgz", - "integrity": "sha512-avo+lm/QmZlv27Zsi0xEor2fKcqWG56D5ae9dzklpIaY7cQMK5N8VSpaNVPPagiqmy7LrEjK1IWdGMOqPu5csg==", + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.5.5.tgz", + "integrity": "sha512-5qZ3D1uMclSNqYcXqiHoA0meVdv+xUEex9em2fqMnrk/scphGlGgg66zjMrPJESPwrFJ6sbfFQYUSa0Mz7FabA==", "requires": { - "@babel/types": "^7.0.0" + "@babel/types": "^7.5.5" } }, "@babel/helper-module-imports": { @@ -175,16 +175,16 @@ } }, "@babel/helper-module-transforms": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.4.4.tgz", - "integrity": "sha512-3Z1yp8TVQf+B4ynN7WoHPKS8EkdTbgAEy0nU0rs/1Kw4pDgmvYH3rz3aI11KgxKCba2cn7N+tqzV1mY2HMN96w==", + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.5.5.tgz", + "integrity": "sha512-jBeCvETKuJqeiaCdyaheF40aXnnU1+wkSiUs/IQg3tB85up1LyL8x77ClY8qJpuRJUcXQo+ZtdNESmZl4j56Pw==", "requires": { "@babel/helper-module-imports": "^7.0.0", "@babel/helper-simple-access": "^7.1.0", "@babel/helper-split-export-declaration": "^7.4.4", "@babel/template": "^7.4.4", - "@babel/types": "^7.4.4", - "lodash": "^4.17.11" + "@babel/types": "^7.5.5", + "lodash": "^4.17.13" } }, "@babel/helper-optimise-call-expression": { @@ -201,11 +201,11 @@ "integrity": "sha512-CYAOUCARwExnEixLdB6sDm2dIJ/YgEAKDM1MOeMeZu9Ld/bDgVo8aiWrXwcY7OBh+1Ea2uUcVRcxKk0GJvW7QA==" }, "@babel/helper-regex": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/helper-regex/-/helper-regex-7.4.4.tgz", - "integrity": "sha512-Y5nuB/kESmR3tKjU8Nkn1wMGEx1tjJX076HBMeL3XLQCu6vA/YRzuTW0bbb+qRnXvQGn+d6Rx953yffl8vEy7Q==", + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/helper-regex/-/helper-regex-7.5.5.tgz", + "integrity": "sha512-CkCYQLkfkiugbRDO8eZn6lRuR8kzZoGXCg3149iTk5se7g6qykSpy3+hELSwquhu+TgHn8nkLiBwHvNX8Hofcw==", "requires": { - "lodash": "^4.17.11" + "lodash": "^4.17.13" } }, "@babel/helper-remap-async-to-generator": { @@ -221,14 +221,14 @@ } }, "@babel/helper-replace-supers": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.4.4.tgz", - "integrity": "sha512-04xGEnd+s01nY1l15EuMS1rfKktNF+1CkKmHoErDppjAAZL+IUBZpzT748x262HF7fibaQPhbvWUl5HeSt1EXg==", + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.5.5.tgz", + "integrity": "sha512-XvRFWrNnlsow2u7jXDuH4jDDctkxbS7gXssrP4q2nUD606ukXHRvydj346wmNg+zAgpFx4MWf4+usfC93bElJg==", "requires": { - "@babel/helper-member-expression-to-functions": "^7.0.0", + "@babel/helper-member-expression-to-functions": "^7.5.5", "@babel/helper-optimise-call-expression": "^7.0.0", - "@babel/traverse": "^7.4.4", - "@babel/types": "^7.4.4" + "@babel/traverse": "^7.5.5", + "@babel/types": "^7.5.5" } }, "@babel/helper-simple-access": { @@ -260,36 +260,29 @@ } }, "@babel/helpers": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.4.4.tgz", - "integrity": "sha512-igczbR/0SeuPR8RFfC7tGrbdTbFL3QTvH6D+Z6zNxnTe//GyqmtHmDkzrqDmyZ3eSwPqB/LhyKoU5DXsp+Vp2A==", + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.5.5.tgz", + "integrity": "sha512-nRq2BUhxZFnfEn/ciJuhklHvFOqjJUD5wpx+1bxUF2axL9C+v4DE/dmp5sT2dKnpOs4orZWzpAZqlCy8QqE/7g==", "requires": { "@babel/template": "^7.4.4", - "@babel/traverse": "^7.4.4", - "@babel/types": "^7.4.4" + "@babel/traverse": "^7.5.5", + "@babel/types": "^7.5.5" } }, "@babel/highlight": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.0.0.tgz", - "integrity": "sha512-UFMC4ZeFC48Tpvj7C8UgLvtkaUuovQX+5xNWrsIoMG8o2z+XFKjKaN9iVmS84dPwVN00W4wPmqvYoZF3EGAsfw==", + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.5.0.tgz", + "integrity": "sha512-7dV4eu9gBxoM0dAnj/BCFDW9LFU0zvTrkq0ugM7pnHEgguOEeOz1so2ZghEdzviYzQEED0r4EAgpsBChKy1TRQ==", "requires": { "chalk": "^2.0.0", "esutils": "^2.0.2", "js-tokens": "^4.0.0" - }, - "dependencies": { - "js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" - } } }, "@babel/parser": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.4.4.tgz", - "integrity": "sha512-5pCS4mOsL+ANsFZGdvNLybx4wtqAZJ0MJjMHxvzI3bvIsz6sQvzW8XX92EYIkiPtIvcfG3Aj+Ir5VNyjnZhP7w==" + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.5.5.tgz", + "integrity": "sha512-E5BN68cqR7dhKan1SfqgPGhQ178bkVKpXTPEXnFJBrEt8/DKRZlybmy+IgYLTeN7tp1R5Ccmbm2rBk17sHYU3g==" }, "@babel/plugin-proposal-async-generator-functions": { "version": "7.2.0", @@ -320,6 +313,15 @@ "@babel/plugin-syntax-decorators": "^7.2.0" } }, + "@babel/plugin-proposal-dynamic-import": { + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.5.0.tgz", + "integrity": "sha512-x/iMjggsKTFHYC6g11PL7Qy58IK8H5zqfm9e6hu4z1iH2IRyAp9u9dL80zA6R76yFovETFLKz2VJIC2iIPBuFw==", + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/plugin-syntax-dynamic-import": "^7.2.0" + } + }, "@babel/plugin-proposal-json-strings": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.2.0.tgz", @@ -330,9 +332,9 @@ } }, "@babel/plugin-proposal-object-rest-spread": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.4.4.tgz", - "integrity": "sha512-dMBG6cSPBbHeEBdFXeQ2QLc5gUpg4Vkaz8octD4aoW/ISO+jBOcsuxYL7bsb5WSu8RLP6boxrBIALEHgoHtO9g==", + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.5.5.tgz", + "integrity": "sha512-F2DxJJSQ7f64FyTVl5cw/9MWn6naXGdk3Q3UhDbFEEHv+EilCPoeRD3Zh/Utx1CJz4uyKlQ4uH+bJPbEhMV7Zw==", "requires": { "@babel/helper-plugin-utils": "^7.0.0", "@babel/plugin-syntax-object-rest-spread": "^7.2.0" @@ -438,9 +440,9 @@ } }, "@babel/plugin-transform-async-to-generator": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.4.4.tgz", - "integrity": "sha512-YiqW2Li8TXmzgbXw+STsSqPBPFnGviiaSp6CYOq55X8GQ2SGVLrXB6pNid8HkqkZAzOH6knbai3snhP7v0fNwA==", + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.5.0.tgz", + "integrity": "sha512-mqvkzwIGkq0bEF1zLRRiTdjfomZJDV33AH3oQzHVGkI2VzEmXLpKKOBvEVaFZBJdN0XTyH38s9j/Kiqr68dggg==", "requires": { "@babel/helper-module-imports": "^7.0.0", "@babel/helper-plugin-utils": "^7.0.0", @@ -456,25 +458,25 @@ } }, "@babel/plugin-transform-block-scoping": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.4.4.tgz", - "integrity": "sha512-jkTUyWZcTrwxu5DD4rWz6rDB5Cjdmgz6z7M7RLXOJyCUkFBawssDGcGh8M/0FTSB87avyJI1HsTwUXp9nKA1PA==", + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.5.5.tgz", + "integrity": "sha512-82A3CLRRdYubkG85lKwhZB0WZoHxLGsJdux/cOVaJCJpvYFl1LVzAIFyRsa7CvXqW8rBM4Zf3Bfn8PHt5DP0Sg==", "requires": { "@babel/helper-plugin-utils": "^7.0.0", - "lodash": "^4.17.11" + "lodash": "^4.17.13" } }, "@babel/plugin-transform-classes": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.4.4.tgz", - "integrity": "sha512-/e44eFLImEGIpL9qPxSRat13I5QNRgBLu2hOQJCF7VLy/otSM/sypV1+XaIw5+502RX/+6YaSAPmldk+nhHDPw==", + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.5.5.tgz", + "integrity": "sha512-U2htCNK/6e9K7jGyJ++1p5XRU+LJjrwtoiVn9SzRlDT2KubcZ11OOwy3s24TjHxPgxNwonCYP7U2K51uVYCMDg==", "requires": { "@babel/helper-annotate-as-pure": "^7.0.0", - "@babel/helper-define-map": "^7.4.4", + "@babel/helper-define-map": "^7.5.5", "@babel/helper-function-name": "^7.1.0", "@babel/helper-optimise-call-expression": "^7.0.0", "@babel/helper-plugin-utils": "^7.0.0", - "@babel/helper-replace-supers": "^7.4.4", + "@babel/helper-replace-supers": "^7.5.5", "@babel/helper-split-export-declaration": "^7.4.4", "globals": "^11.1.0" } @@ -488,9 +490,9 @@ } }, "@babel/plugin-transform-destructuring": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.4.4.tgz", - "integrity": "sha512-/aOx+nW0w8eHiEHm+BTERB2oJn5D127iye/SUQl7NjHy0lf+j7h4MKMMSOwdazGq9OxgiNADncE+SRJkCxjZpQ==", + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.5.0.tgz", + "integrity": "sha512-YbYgbd3TryYYLGyC7ZR+Tq8H/+bCmwoaxHfJHupom5ECstzbRLTch6gOQbhEY9Z4hiCNHEURgq06ykFv9JZ/QQ==", "requires": { "@babel/helper-plugin-utils": "^7.0.0" } @@ -506,9 +508,9 @@ } }, "@babel/plugin-transform-duplicate-keys": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.2.0.tgz", - "integrity": "sha512-q+yuxW4DsTjNceUiTzK0L+AfQ0zD9rWaTLiUqHA8p0gxx7lu1EylenfzjeIWNkPy6e/0VG/Wjw9uf9LueQwLOw==", + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.5.0.tgz", + "integrity": "sha512-igcziksHizyQPlX9gfSjHkE2wmoCH3evvD2qR5w29/Dk0SMKE/eOI7f1HhBdNhR/zxJDqrgpoDTq5YSLH/XMsQ==", "requires": { "@babel/helper-plugin-utils": "^7.0.0" } @@ -565,31 +567,34 @@ } }, "@babel/plugin-transform-modules-amd": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.2.0.tgz", - "integrity": "sha512-mK2A8ucqz1qhrdqjS9VMIDfIvvT2thrEsIQzbaTdc5QFzhDjQv2CkJJ5f6BXIkgbmaoax3zBr2RyvV/8zeoUZw==", + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.5.0.tgz", + "integrity": "sha512-n20UsQMKnWrltocZZm24cRURxQnWIvsABPJlw/fvoy9c6AgHZzoelAIzajDHAQrDpuKFFPPcFGd7ChsYuIUMpg==", "requires": { "@babel/helper-module-transforms": "^7.1.0", - "@babel/helper-plugin-utils": "^7.0.0" + "@babel/helper-plugin-utils": "^7.0.0", + "babel-plugin-dynamic-import-node": "^2.3.0" } }, "@babel/plugin-transform-modules-commonjs": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.4.4.tgz", - "integrity": "sha512-4sfBOJt58sEo9a2BQXnZq+Q3ZTSAUXyK3E30o36BOGnJ+tvJ6YSxF0PG6kERvbeISgProodWuI9UVG3/FMY6iw==", + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.5.0.tgz", + "integrity": "sha512-xmHq0B+ytyrWJvQTc5OWAC4ii6Dhr0s22STOoydokG51JjWhyYo5mRPXoi+ZmtHQhZZwuXNN+GG5jy5UZZJxIQ==", "requires": { "@babel/helper-module-transforms": "^7.4.4", "@babel/helper-plugin-utils": "^7.0.0", - "@babel/helper-simple-access": "^7.1.0" + "@babel/helper-simple-access": "^7.1.0", + "babel-plugin-dynamic-import-node": "^2.3.0" } }, "@babel/plugin-transform-modules-systemjs": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.4.4.tgz", - "integrity": "sha512-MSiModfILQc3/oqnG7NrP1jHaSPryO6tA2kOMmAQApz5dayPxWiHqmq4sWH2xF5LcQK56LlbKByCd8Aah/OIkQ==", + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.5.0.tgz", + "integrity": "sha512-Q2m56tyoQWmuNGxEtUyeEkm6qJYFqs4c+XyXH5RAuYxObRNz9Zgj/1g2GMnjYp2EUyEy7YTrxliGCXzecl/vJg==", "requires": { "@babel/helper-hoist-variables": "^7.4.4", - "@babel/helper-plugin-utils": "^7.0.0" + "@babel/helper-plugin-utils": "^7.0.0", + "babel-plugin-dynamic-import-node": "^2.3.0" } }, "@babel/plugin-transform-modules-umd": { @@ -602,11 +607,11 @@ } }, "@babel/plugin-transform-named-capturing-groups-regex": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.4.4.tgz", - "integrity": "sha512-Ki+Y9nXBlKfhD+LXaRS7v95TtTGYRAf9Y1rTDiE75zf8YQz4GDaWRXosMfJBXxnk88mGFjWdCRIeqDbon7spYA==", + "version": "7.4.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.4.5.tgz", + "integrity": "sha512-z7+2IsWafTBbjNsOxU/Iv5CvTJlr5w4+HGu1HovKYTtgJ362f7kBcQglkfmlspKKZ3bgrbSGvLfNx++ZJgCWsg==", "requires": { - "regexp-tree": "^0.1.0" + "regexp-tree": "^0.1.6" } }, "@babel/plugin-transform-new-target": { @@ -618,12 +623,12 @@ } }, "@babel/plugin-transform-object-super": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.2.0.tgz", - "integrity": "sha512-VMyhPYZISFZAqAPVkiYb7dUe2AsVi2/wCT5+wZdsNO31FojQJa9ns40hzZ6U9f50Jlq4w6qwzdBB2uwqZ00ebg==", + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.5.5.tgz", + "integrity": "sha512-un1zJQAhSosGFBduPgN/YFNvWVpRuHKU7IHBglLoLZsGmruJPOo6pbInneflUdmq7YvSVqhpPs5zdBvLnteltQ==", "requires": { "@babel/helper-plugin-utils": "^7.0.0", - "@babel/helper-replace-supers": "^7.1.0" + "@babel/helper-replace-supers": "^7.5.5" } }, "@babel/plugin-transform-parameters": { @@ -645,9 +650,9 @@ } }, "@babel/plugin-transform-react-constant-elements": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.2.0.tgz", - "integrity": "sha512-YYQFg6giRFMsZPKUM9v+VcHOdfSQdz9jHCx3akAi3UYgyjndmdYGSXylQ/V+HswQt4fL8IklchD9HTsaOCrWQQ==", + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.5.0.tgz", + "integrity": "sha512-c5Ba8cpybZFp1Izkf2sWGuNjOxoQ32tFgBvvYvwGhi4+9f6vGiSK9Gex4uVuO/Va6YJFu41aAh1MzMjUWkp0IQ==", "requires": { "@babel/helper-annotate-as-pure": "^7.0.0", "@babel/helper-plugin-utils": "^7.0.0" @@ -681,20 +686,20 @@ } }, "@babel/plugin-transform-react-jsx-source": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.2.0.tgz", - "integrity": "sha512-A32OkKTp4i5U6aE88GwwcuV4HAprUgHcTq0sSafLxjr6AW0QahrCRCjxogkbbcdtpbXkuTOlgpjophCxb6sh5g==", + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.5.0.tgz", + "integrity": "sha512-58Q+Jsy4IDCZx7kqEZuSDdam/1oW8OdDX8f+Loo6xyxdfg1yF0GE2XNJQSTZCaMol93+FBzpWiPEwtbMloAcPg==", "requires": { "@babel/helper-plugin-utils": "^7.0.0", "@babel/plugin-syntax-jsx": "^7.2.0" } }, "@babel/plugin-transform-regenerator": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.4.4.tgz", - "integrity": "sha512-Zz3w+pX1SI0KMIiqshFZkwnVGUhDZzpX2vtPzfJBKQQq8WsP/Xy9DNdELWivxcKOCX/Pywge4SiEaPaLtoDT4g==", + "version": "7.4.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.4.5.tgz", + "integrity": "sha512-gBKRh5qAaCWntnd09S8QC7r3auLCqq5DI6O0DlfoyDjslSBVqBibrMdsqO+Uhmx3+BlOmE/Kw1HFxmGbv0N9dA==", "requires": { - "regenerator-transform": "^0.13.4" + "regenerator-transform": "^0.14.0" } }, "@babel/plugin-transform-reserved-words": { @@ -766,10 +771,11 @@ } }, "@babel/plugin-transform-typescript": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.4.4.tgz", - "integrity": "sha512-rwDvjaMTx09WC0rXGBRlYSSkEHOKRrecY6hEr3SVIPKII8DVWXtapNAfAyMC0dovuO+zYArcAuKeu3q9DNRfzA==", + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.5.5.tgz", + "integrity": "sha512-pehKf4m640myZu5B2ZviLaiBlxMCjSZ1qTEO459AXKX5GnPueyulJeCqZFs1nz/Ya2dDzXQ1NxZ/kKNWyD4h6w==", "requires": { + "@babel/helper-create-class-features-plugin": "^7.5.5", "@babel/helper-plugin-utils": "^7.0.0", "@babel/plugin-syntax-typescript": "^7.2.0" } @@ -785,45 +791,47 @@ } }, "@babel/preset-env": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.4.4.tgz", - "integrity": "sha512-FU1H+ACWqZZqfw1x2G1tgtSSYSfxJLkpaUQL37CenULFARDo+h4xJoVHzRoHbK+85ViLciuI7ME4WTIhFRBBlw==", + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.5.5.tgz", + "integrity": "sha512-GMZQka/+INwsMz1A5UEql8tG015h5j/qjptpKY2gJ7giy8ohzU710YciJB5rcKsWGWHiW3RUnHib0E5/m3Tp3A==", "requires": { "@babel/helper-module-imports": "^7.0.0", "@babel/helper-plugin-utils": "^7.0.0", "@babel/plugin-proposal-async-generator-functions": "^7.2.0", + "@babel/plugin-proposal-dynamic-import": "^7.5.0", "@babel/plugin-proposal-json-strings": "^7.2.0", - "@babel/plugin-proposal-object-rest-spread": "^7.4.4", + "@babel/plugin-proposal-object-rest-spread": "^7.5.5", "@babel/plugin-proposal-optional-catch-binding": "^7.2.0", "@babel/plugin-proposal-unicode-property-regex": "^7.4.4", "@babel/plugin-syntax-async-generators": "^7.2.0", + "@babel/plugin-syntax-dynamic-import": "^7.2.0", "@babel/plugin-syntax-json-strings": "^7.2.0", "@babel/plugin-syntax-object-rest-spread": "^7.2.0", "@babel/plugin-syntax-optional-catch-binding": "^7.2.0", "@babel/plugin-transform-arrow-functions": "^7.2.0", - "@babel/plugin-transform-async-to-generator": "^7.4.4", + "@babel/plugin-transform-async-to-generator": "^7.5.0", "@babel/plugin-transform-block-scoped-functions": "^7.2.0", - "@babel/plugin-transform-block-scoping": "^7.4.4", - "@babel/plugin-transform-classes": "^7.4.4", + "@babel/plugin-transform-block-scoping": "^7.5.5", + "@babel/plugin-transform-classes": "^7.5.5", "@babel/plugin-transform-computed-properties": "^7.2.0", - "@babel/plugin-transform-destructuring": "^7.4.4", + "@babel/plugin-transform-destructuring": "^7.5.0", "@babel/plugin-transform-dotall-regex": "^7.4.4", - "@babel/plugin-transform-duplicate-keys": "^7.2.0", + "@babel/plugin-transform-duplicate-keys": "^7.5.0", "@babel/plugin-transform-exponentiation-operator": "^7.2.0", "@babel/plugin-transform-for-of": "^7.4.4", "@babel/plugin-transform-function-name": "^7.4.4", "@babel/plugin-transform-literals": "^7.2.0", "@babel/plugin-transform-member-expression-literals": "^7.2.0", - "@babel/plugin-transform-modules-amd": "^7.2.0", - "@babel/plugin-transform-modules-commonjs": "^7.4.4", - "@babel/plugin-transform-modules-systemjs": "^7.4.4", + "@babel/plugin-transform-modules-amd": "^7.5.0", + "@babel/plugin-transform-modules-commonjs": "^7.5.0", + "@babel/plugin-transform-modules-systemjs": "^7.5.0", "@babel/plugin-transform-modules-umd": "^7.2.0", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.4.4", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.4.5", "@babel/plugin-transform-new-target": "^7.4.4", - "@babel/plugin-transform-object-super": "^7.2.0", + "@babel/plugin-transform-object-super": "^7.5.5", "@babel/plugin-transform-parameters": "^7.4.4", "@babel/plugin-transform-property-literals": "^7.2.0", - "@babel/plugin-transform-regenerator": "^7.4.4", + "@babel/plugin-transform-regenerator": "^7.4.5", "@babel/plugin-transform-reserved-words": "^7.2.0", "@babel/plugin-transform-shorthand-properties": "^7.2.0", "@babel/plugin-transform-spread": "^7.2.0", @@ -831,9 +839,9 @@ "@babel/plugin-transform-template-literals": "^7.4.4", "@babel/plugin-transform-typeof-symbol": "^7.2.0", "@babel/plugin-transform-unicode-regex": "^7.4.4", - "@babel/types": "^7.4.4", - "browserslist": "^4.5.2", - "core-js-compat": "^3.0.0", + "@babel/types": "^7.5.5", + "browserslist": "^4.6.0", + "core-js-compat": "^3.1.1", "invariant": "^2.2.2", "js-levenshtein": "^1.1.3", "semver": "^5.5.0" @@ -868,17 +876,17 @@ } }, "@babel/runtime": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.4.4.tgz", - "integrity": "sha512-w0+uT71b6Yi7i5SE0co4NioIpSYS6lLiXvCzWzGSKvpK5vdQtCbICHMj+gbAKAOtxiV6HsVh/MBdaF9EQ6faSg==", + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.5.5.tgz", + "integrity": "sha512-28QvEGyQyNkB0/m2B4FU7IEZGK2NUrcMtT6BZEFALTguLk+AUT6ofsHtPk5QyjAdUkpMJ+/Em+quwz4HOt30AQ==", "requires": { "regenerator-runtime": "^0.13.2" }, "dependencies": { "regenerator-runtime": { - "version": "0.13.2", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.2.tgz", - "integrity": "sha512-S/TQAZJO+D3m9xeN1WTI8dLKBBiRgXBlTJvbWjCThHWZj9EvHK70Ff50/tYj2J/fvBY6JtFVwRuazHN2E7M9BA==" + "version": "0.13.3", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.3.tgz", + "integrity": "sha512-naKIZz2GQ8JWh///G7L3X6LaQUAMp2lvb1rvwwsURe/VXwD6VMfr+/1NuNw3ag8v2kY1aQ/go5SNn79O9JU7yw==" } } }, @@ -893,28 +901,28 @@ } }, "@babel/traverse": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.4.4.tgz", - "integrity": "sha512-Gw6qqkw/e6AGzlyj9KnkabJX7VcubqPtkUQVAwkc0wUMldr3A/hezNB3Rc5eIvId95iSGkGIOe5hh1kMKf951A==", + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.5.5.tgz", + "integrity": "sha512-MqB0782whsfffYfSjH4TM+LMjrJnhCNEDMDIjeTpl+ASaUvxcjoiVCo/sM1GhS1pHOXYfWVCYneLjMckuUxDaQ==", "requires": { - "@babel/code-frame": "^7.0.0", - "@babel/generator": "^7.4.4", + "@babel/code-frame": "^7.5.5", + "@babel/generator": "^7.5.5", "@babel/helper-function-name": "^7.1.0", "@babel/helper-split-export-declaration": "^7.4.4", - "@babel/parser": "^7.4.4", - "@babel/types": "^7.4.4", + "@babel/parser": "^7.5.5", + "@babel/types": "^7.5.5", "debug": "^4.1.0", "globals": "^11.1.0", - "lodash": "^4.17.11" + "lodash": "^4.17.13" } }, "@babel/types": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.4.4.tgz", - "integrity": "sha512-dOllgYdnEFOebhkKCjzSVFqw/PmmB8pH6RGOWkY4GsboQNd47b1fBThBSwlHAq9alF9vc1M3+6oqR47R50L0tQ==", + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.5.5.tgz", + "integrity": "sha512-s63F9nJioLqOlW3UkyMd+BYhXt44YuaFm/VV0VwuteqjYwRrObkU7ra9pY4wAJR3oXi8hJrMcrcJdO/HH33vtw==", "requires": { "esutils": "^2.0.2", - "lodash": "^4.17.11", + "lodash": "^4.17.13", "to-fast-properties": "^2.0.0" } }, @@ -944,34 +952,25 @@ "resolved": "https://registry.npmjs.org/@csstools/normalize.css/-/normalize.css-9.0.1.tgz", "integrity": "sha512-6It2EVfGskxZCQhuykrfnALg7oVeiI6KclWSmGDqB0AiInVrTGB9Jp9i4/Ad21u9Jde/voVQz6eFX/eSg/UsPA==" }, + "@fortawesome/fontawesome-common-types": { + "version": "0.2.19", + "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-common-types/-/fontawesome-common-types-0.2.19.tgz", + "integrity": "sha512-nd2Ul/CUs8U9sjofQYAALzOGpgkVJQgEhIJnOHaoyVR/LeC3x2mVg4eB910a4kS6WgLPebAY0M2fApEI497raQ==" + }, "@fortawesome/fontawesome-svg-core": { - "version": "1.2.18", - "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-svg-core/-/fontawesome-svg-core-1.2.18.tgz", - "integrity": "sha512-1vyLWVQqxQ8q8bA2zgZcljk3RkeELlDJ757ymLk+ebK019AFgEFH5kTnR5OMN1SFsTwW1OHlFQO3VufdeCg/Gg==", + "version": "1.2.19", + "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-svg-core/-/fontawesome-svg-core-1.2.19.tgz", + "integrity": "sha512-D4ICXg9oU08eF9o7Or392gPpjmwwgJu8ecCFusthbID95CLVXOgIyd4mOKD9Nud5Ckz+Ty59pqkNtThDKR0erA==", "requires": { - "@fortawesome/fontawesome-common-types": "^0.2.18" - }, - "dependencies": { - "@fortawesome/fontawesome-common-types": { - "version": "0.2.18", - "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-common-types/-/fontawesome-common-types-0.2.18.tgz", - "integrity": "sha512-834DrzO2Ne3upCW+mJJPC/E6BsFcj+2Z1HmPIhbpbj8UaKmXWum4NClqLpUiMetugRlHuG4jbIHNdv2/lc3c1Q==" - } + "@fortawesome/fontawesome-common-types": "^0.2.19" } }, "@fortawesome/free-solid-svg-icons": { - "version": "5.8.2", - "resolved": "https://registry.npmjs.org/@fortawesome/free-solid-svg-icons/-/free-solid-svg-icons-5.8.2.tgz", - "integrity": "sha512-5tF6WOFlqqO95zY5ukSB6jliDa3jnk1p5L4K/a58ccDFsbjSkhfGuvZkRkeWxH8uMms81pZd6yQTwQrkedeJmg==", + "version": "5.9.0", + "resolved": "https://registry.npmjs.org/@fortawesome/free-solid-svg-icons/-/free-solid-svg-icons-5.9.0.tgz", + "integrity": "sha512-U8YXPfWcSozsCW0psCtlRGKjjRs5+Am5JJwLOUmVHFZbIEWzaz4YbP84EoPwUsVmSAKrisu3QeNcVOtmGml0Xw==", "requires": { - "@fortawesome/fontawesome-common-types": "^0.2.18" - }, - "dependencies": { - "@fortawesome/fontawesome-common-types": { - "version": "0.2.18", - "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-common-types/-/fontawesome-common-types-0.2.18.tgz", - "integrity": "sha512-834DrzO2Ne3upCW+mJJPC/E6BsFcj+2Z1HmPIhbpbj8UaKmXWum4NClqLpUiMetugRlHuG4jbIHNdv2/lc3c1Q==" - } + "@fortawesome/fontawesome-common-types": "^0.2.19" } }, "@fortawesome/react-fontawesome": { @@ -989,26 +988,39 @@ "integrity": "sha512-mV6T0IYqb0xL1UALPFplXYQmR0twnXG0M6jUswpquqT2sD12BOiCiLy3EvMp/Fy7s3DZElC4/aPjEjo2jeZpvw==" }, "@hapi/hoek": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-6.2.1.tgz", - "integrity": "sha512-+ryw4GU9pjr1uT6lBuErHJg3NYqzwJTvZ75nKuJijEzpd00Uqi6oiawTGDDf5Hl0zWmI7qHfOtaqB0kpQZJQzA==" + "version": "6.2.4", + "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-6.2.4.tgz", + "integrity": "sha512-HOJ20Kc93DkDVvjwHyHawPwPkX44sIrbXazAUDiUXaY2R9JwQGo2PhFfnQtdrsIe4igjG2fPgMra7NYw7qhy0A==" }, "@hapi/joi": { - "version": "15.0.3", - "resolved": "https://registry.npmjs.org/@hapi/joi/-/joi-15.0.3.tgz", - "integrity": "sha512-z6CesJ2YBwgVCi+ci8SI8zixoj8bGFn/vZb9MBPbSyoxsS2PnWYjHcyTM17VLK6tx64YVK38SDIh10hJypB+ig==", + "version": "15.1.0", + "resolved": "https://registry.npmjs.org/@hapi/joi/-/joi-15.1.0.tgz", + "integrity": "sha512-n6kaRQO8S+kepUTbXL9O/UOL788Odqs38/VOfoCrATDtTvyfiO3fgjlSRaNkHabpTLgM7qru9ifqXlXbXk8SeQ==", "requires": { "@hapi/address": "2.x.x", "@hapi/hoek": "6.x.x", + "@hapi/marker": "1.x.x", "@hapi/topo": "3.x.x" } }, + "@hapi/marker": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@hapi/marker/-/marker-1.0.0.tgz", + "integrity": "sha512-JOfdekTXnJexfE8PyhZFyHvHjt81rBFSAbTIRAhF2vv/2Y1JzoKsGqxH/GpZJoF7aEfYok8JVcAHmSz1gkBieA==" + }, "@hapi/topo": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@hapi/topo/-/topo-3.1.0.tgz", - "integrity": "sha512-gZDI/eXOIk8kP2PkUKjWu9RW8GGVd2Hkgjxyr/S7Z+JF+0mr7bAlbw+DkTRxnD580o8Kqxlnba9wvqp5aOHBww==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@hapi/topo/-/topo-3.1.2.tgz", + "integrity": "sha512-r+aumOqJ5QbD6aLPJWqVjMAPsx5pZKz+F5yPqXZ/WWG9JTtHbQqlzrJoknJ0iJxLj9vlXtmpSdjlkszseeG8OA==", "requires": { - "@hapi/hoek": "6.x.x" + "@hapi/hoek": "8.x.x" + }, + "dependencies": { + "@hapi/hoek": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-8.0.2.tgz", + "integrity": "sha512-O6o6mrV4P65vVccxymuruucb+GhP2zl9NLCG8OdoFRS8BEGw3vwpPp20wpAtpbQQxz1CEUtmxJGgWhjq1XA3qw==" + } } }, "@jest/console": { @@ -1217,6 +1229,39 @@ "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-1.1.3.tgz", "integrity": "sha512-shAmDyaQC4H92APFoIaVDHCx5bStIocgvbwQyxPRrbUY20V1EYTbSDchWbuwlMG3V17cprZhA6+78JfB+3DTPw==" }, + "@react-bootstrap/react-popper": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@react-bootstrap/react-popper/-/react-popper-1.2.1.tgz", + "integrity": "sha512-4l3q7LcZEhrSkI4d3Ie3g4CdrXqqTexXX4PFT45CB0z5z2JUbaxgRwKNq7r5j2bLdVpZm+uvUGqxJw8d9vgbJQ==", + "requires": { + "babel-runtime": "6.x.x", + "create-react-context": "^0.2.1", + "popper.js": "^1.14.4", + "prop-types": "^15.6.1", + "typed-styles": "^0.0.5", + "warning": "^3.0.0" + }, + "dependencies": { + "warning": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/warning/-/warning-3.0.0.tgz", + "integrity": "sha1-MuU3fLVy3kqwR1O9+IIcAe1gW3w=", + "requires": { + "loose-envify": "^1.0.0" + } + } + } + }, + "@restart/context": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@restart/context/-/context-2.1.4.tgz", + "integrity": "sha512-INJYZQJP7g+IoDUh/475NlGiTeMfwTXUEr3tmRneckHIxNolGOW9CTq83S8cxq0CgJwwcMzMJFchxvlwe7Rk8Q==" + }, + "@restart/hooks": { + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/@restart/hooks/-/hooks-0.3.8.tgz", + "integrity": "sha512-0AO6p7iOqWeLu9++Qz1P0efRmA7nDT3uMx4banEUj0KZLNOBkK98zddsKtRjwBlJw2dbL/V+u5+recuCwjO/pg==" + }, "@svgr/babel-plugin-add-jsx-attribute": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-4.2.0.tgz", @@ -1238,9 +1283,9 @@ "integrity": "sha512-U9m870Kqm0ko8beHawRXLGLvSi/ZMrl89gJ5BNcT452fAjtF2p4uRzXkdzvGJJJYBgx7BmqlDjBN/eCp5AAX2w==" }, "@svgr/babel-plugin-svg-dynamic-title": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-dynamic-title/-/babel-plugin-svg-dynamic-title-4.2.0.tgz", - "integrity": "sha512-gH2qItapwCUp6CCqbxvzBbc4dh4OyxdYKsW3EOkYexr0XUmQL0ScbdNh6DexkZ01T+sdClniIbnCObsXcnx3sQ==" + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-dynamic-title/-/babel-plugin-svg-dynamic-title-4.3.1.tgz", + "integrity": "sha512-p6z6JJroP989jHWcuraeWpzdejehTmLUpyC9smhTBWyPN0VVGe2phbYxpPTV7Vh8XzmFrcG55idrnfWn/2oQEw==" }, "@svgr/babel-plugin-svg-em-dimensions": { "version": "4.2.0", @@ -1258,59 +1303,90 @@ "integrity": "sha512-hYfYuZhQPCBVotABsXKSCfel2slf/yvJY8heTVX1PCTaq/IgASq1IyxPPKJ0chWREEKewIU/JMSsIGBtK1KKxw==" }, "@svgr/babel-preset": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-preset/-/babel-preset-4.2.0.tgz", - "integrity": "sha512-iLetHpRCQXfK47voAs5/uxd736cCyocEdorisjAveZo8ShxJ/ivSZgstBmucI1c8HyMF5tOrilJLoFbhpkPiKw==", + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/@svgr/babel-preset/-/babel-preset-4.3.1.tgz", + "integrity": "sha512-rPFKLmyhlh6oeBv3j2vEAj2nd2QbWqpoJLKzBLjwQVt+d9aeXajVaPNEqrES2spjXKR4OxfgSs7U0NtmAEkr0Q==", "requires": { "@svgr/babel-plugin-add-jsx-attribute": "^4.2.0", "@svgr/babel-plugin-remove-jsx-attribute": "^4.2.0", "@svgr/babel-plugin-remove-jsx-empty-expression": "^4.2.0", "@svgr/babel-plugin-replace-jsx-attribute-value": "^4.2.0", - "@svgr/babel-plugin-svg-dynamic-title": "^4.2.0", + "@svgr/babel-plugin-svg-dynamic-title": "^4.3.1", "@svgr/babel-plugin-svg-em-dimensions": "^4.2.0", "@svgr/babel-plugin-transform-react-native-svg": "^4.2.0", "@svgr/babel-plugin-transform-svg-component": "^4.2.0" } }, "@svgr/core": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@svgr/core/-/core-4.2.0.tgz", - "integrity": "sha512-nvzXaf2VavqjMCTTfsZfjL4o9035KedALkMzk82qOlHOwBb8JT+9+zYDgBl0oOunbVF94WTLnvGunEg0csNP3Q==", + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/@svgr/core/-/core-4.3.2.tgz", + "integrity": "sha512-N+tP5CLFd1hP9RpO83QJPZY3NL8AtrdqNbuhRgBkjE/49RnMrrRsFm1wY8pueUfAGvzn6tSXUq29o6ah8RuR5w==", "requires": { - "@svgr/plugin-jsx": "^4.2.0", + "@svgr/plugin-jsx": "^4.3.2", "camelcase": "^5.3.1", - "cosmiconfig": "^5.2.0" + "cosmiconfig": "^5.2.1" } }, "@svgr/hast-util-to-babel-ast": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@svgr/hast-util-to-babel-ast/-/hast-util-to-babel-ast-4.2.0.tgz", - "integrity": "sha512-IvAeb7gqrGB5TH9EGyBsPrMRH/QCzIuAkLySKvH2TLfLb2uqk98qtJamordRQTpHH3e6TORfBXoTo7L7Opo/Ow==", + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/@svgr/hast-util-to-babel-ast/-/hast-util-to-babel-ast-4.3.2.tgz", + "integrity": "sha512-JioXclZGhFIDL3ddn4Kiq8qEqYM2PyDKV0aYno8+IXTLuYt6TOgHUbUAAFvqtb0Xn37NwP0BTHglejFoYr8RZg==", "requires": { - "@babel/types": "^7.4.0" + "@babel/types": "^7.4.4" } }, "@svgr/plugin-jsx": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@svgr/plugin-jsx/-/plugin-jsx-4.2.0.tgz", - "integrity": "sha512-AM1YokmZITgveY9bulLVquqNmwiFo2Px2HL+IlnTCR01YvWDfRL5QKdnF7VjRaS5MNP938mmqvL0/8oz3zQMkg==", + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/@svgr/plugin-jsx/-/plugin-jsx-4.3.2.tgz", + "integrity": "sha512-+1GW32RvmNmCsOkMoclA/TppNjHPLMnNZG3/Ecscxawp051XJ2MkO09Hn11VcotdC2EPrDfT8pELGRo+kbZ1Eg==", "requires": { - "@babel/core": "^7.4.3", - "@svgr/babel-preset": "^4.2.0", - "@svgr/hast-util-to-babel-ast": "^4.2.0", - "rehype-parse": "^6.0.0", - "unified": "^7.1.0", - "vfile": "^4.0.0" + "@babel/core": "^7.4.5", + "@svgr/babel-preset": "^4.3.1", + "@svgr/hast-util-to-babel-ast": "^4.3.2", + "svg-parser": "^2.0.0" + }, + "dependencies": { + "@babel/core": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.5.5.tgz", + "integrity": "sha512-i4qoSr2KTtce0DmkuuQBV4AuQgGPUcPXMr9L5MyYAtk06z068lQ10a4O009fe5OB/DfNV+h+qqT7ddNV8UnRjg==", + "requires": { + "@babel/code-frame": "^7.5.5", + "@babel/generator": "^7.5.5", + "@babel/helpers": "^7.5.5", + "@babel/parser": "^7.5.5", + "@babel/template": "^7.4.4", + "@babel/traverse": "^7.5.5", + "@babel/types": "^7.5.5", + "convert-source-map": "^1.1.0", + "debug": "^4.1.0", + "json5": "^2.1.0", + "lodash": "^4.17.13", + "resolve": "^1.3.2", + "semver": "^5.4.1", + "source-map": "^0.5.0" + } + }, + "semver": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz", + "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==" + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" + } } }, "@svgr/plugin-svgo": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@svgr/plugin-svgo/-/plugin-svgo-4.2.0.tgz", - "integrity": "sha512-zUEKgkT172YzHh3mb2B2q92xCnOAMVjRx+o0waZ1U50XqKLrVQ/8dDqTAtnmapdLsGurv8PSwenjLCUpj6hcvw==", + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/@svgr/plugin-svgo/-/plugin-svgo-4.3.1.tgz", + "integrity": "sha512-PrMtEDUWjX3Ea65JsVCwTIXuSqa3CG9px+DluF1/eo9mlDrgrtFE7NE/DjdhjJgSM9wenlVBzkzneSIUgfUI/w==", "requires": { - "cosmiconfig": "^5.2.0", + "cosmiconfig": "^5.2.1", "merge-deep": "^3.0.2", - "svgo": "^1.2.1" + "svgo": "^1.2.2" } }, "@svgr/webpack": { @@ -1328,6 +1404,11 @@ "loader-utils": "^1.1.0" } }, + "@types/asap": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@types/asap/-/asap-2.0.0.tgz", + "integrity": "sha512-upIS0Gt9Mc8eEpCbYMZ1K8rhNosfKUtimNcINce+zLwJF5UpM3Vv7yz3S5l/1IX+DxTa8lTkUjqynvjRXyJzsg==" + }, "@types/babel__core": { "version": "7.1.2", "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.2.tgz", @@ -1358,13 +1439,27 @@ } }, "@types/babel__traverse": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.0.6.tgz", - "integrity": "sha512-XYVgHF2sQ0YblLRMLNPB3CkFMewzFmlDsH/TneZFHUXDlABQgh88uOxuez7ZcXxayLFrqLwtDH1t+FmlFwNZxw==", + "version": "7.0.7", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.0.7.tgz", + "integrity": "sha512-CeBpmX1J8kWLcDEnI3Cl2Eo6RfbGvzUctA+CjZUhOKDFbLfcr7fc4usEqLNWetrlJd7RhAkyYe2czXop4fICpw==", "requires": { "@babel/types": "^7.3.0" } }, + "@types/hoist-non-react-statics": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/@types/hoist-non-react-statics/-/hoist-non-react-statics-3.3.1.tgz", + "integrity": "sha512-iMIqiko6ooLrTh1joXodJK5X9xeEALT1kM5G3ZLhD3hszxBdIEd5C75U834D9mLcINgD4OyZf5uQXjkuYydWvA==", + "requires": { + "@types/react": "*", + "hoist-non-react-statics": "^3.3.0" + } + }, + "@types/invariant": { + "version": "2.2.30", + "resolved": "https://registry.npmjs.org/@types/invariant/-/invariant-2.2.30.tgz", + "integrity": "sha512-98fB+yo7imSD2F7PF7GIpELNgtLNgo5wjivu0W5V4jx+KVVJxo6p/qN4zdzSTBWy4/sN3pPyXwnhRSD28QX+ag==" + }, "@types/istanbul-lib-coverage": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.1.tgz", @@ -1387,45 +1482,35 @@ "@types/istanbul-lib-report": "*" } }, - "@types/node": { - "version": "12.0.2", - "resolved": "https://registry.npmjs.org/@types/node/-/node-12.0.2.tgz", - "integrity": "sha512-5tabW/i+9mhrfEOUcLDu2xBPsHJ+X5Orqy9FKpale3SjDA17j5AEpYq5vfy3oAeAHGcvANRCO3NV3d2D6q3NiA==" + "@types/prop-types": { + "version": "15.7.1", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.1.tgz", + "integrity": "sha512-CFzn9idOEpHrgdw8JsoTkaDDyRWk1jrzIV8djzcgpq0y9tG4B4lFT+Nxh52DVpDXV+n4+NPNv7M1Dj5uMp6XFg==" }, "@types/q": { "version": "1.5.2", "resolved": "https://registry.npmjs.org/@types/q/-/q-1.5.2.tgz", "integrity": "sha512-ce5d3q03Ex0sy4R14722Rmt6MT07Ua+k4FwDfdcToYJcMKNtRVQvJ6JCAPdAmAnbRb6CsX6aYb9m96NGod9uTw==" }, + "@types/react": { + "version": "16.8.23", + "resolved": "https://registry.npmjs.org/@types/react/-/react-16.8.23.tgz", + "integrity": "sha512-abkEOIeljniUN9qB5onp++g0EY38h7atnDHxwKUFz1r3VH1+yG1OKi2sNPTyObL40goBmfKFpdii2lEzwLX1cA==", + "requires": { + "@types/prop-types": "*", + "csstype": "^2.2.0" + } + }, + "@types/shallowequal": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@types/shallowequal/-/shallowequal-1.1.1.tgz", + "integrity": "sha512-Lhni3aX80zbpdxRuWhnuYPm8j8UQaa571lHP/xI4W+7BAFhSIhRReXnqjEgT/XzPoXZTJkCqstFMJ8CZTK6IlQ==" + }, "@types/stack-utils": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-1.0.1.tgz", "integrity": "sha512-l42BggppR6zLmpfU6fq9HEa2oGPEI8yrSPL3GITjfRInppYFahObbIQOQK3UGxEnyQpltZLaPe75046NOZQikw==" }, - "@types/unist": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.3.tgz", - "integrity": "sha512-FvUupuM3rlRsRtCN+fDudtmytGO6iHJuuRKS1Ss0pG5z8oX0diNEw94UEL7hgDbpN94rgaK5R7sWm6RrSkZuAQ==" - }, - "@types/vfile": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@types/vfile/-/vfile-3.0.2.tgz", - "integrity": "sha512-b3nLFGaGkJ9rzOcuXRfHkZMdjsawuDD0ENL9fzTophtBg8FJHSGbH7daXkEpcwy3v7Xol3pAvsmlYyFhR4pqJw==", - "requires": { - "@types/node": "*", - "@types/unist": "*", - "@types/vfile-message": "*" - } - }, - "@types/vfile-message": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@types/vfile-message/-/vfile-message-1.0.1.tgz", - "integrity": "sha512-mlGER3Aqmq7bqR1tTTIVHq8KSAFFRyGbrxuM8C/H82g6k7r2fS+IMEkIu3D7JHzG10NvPdR8DNx0jr0pwpp4dA==", - "requires": { - "@types/node": "*", - "@types/unist": "*" - } - }, "@types/yargs": { "version": "12.0.12", "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-12.0.12.tgz", @@ -1651,9 +1736,9 @@ } }, "acorn": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.1.1.tgz", - "integrity": "sha512-jPTiwtOxaHNaAPg/dmrJ/beuzLRnXtB0kQPQ8JpotKJgTB6rX6c8mlf315941pyjBSaPg8NHXS9fhP4u17DpGA==" + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.2.1.tgz", + "integrity": "sha512-JD0xT5FCRDNyjDda3Lrg/IxFscp9q4tiYtxE1/nOzlKCk7hIRuYjhq1kCNkbPjMRMZuFq20HNQn1I9k8Oj0E+Q==" }, "acorn-dynamic-import": { "version": "4.0.0", @@ -1675,9 +1760,9 @@ "integrity": "sha512-HJ7CfNHrfJLlNTzIEUTj43LNWGkqpRLxm3YjAlcD0ACydk9XynzYsCBHxut+iqt+1aBXkx9UP/w/ZqMr13XIzg==" }, "acorn-walk": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-6.1.1.tgz", - "integrity": "sha512-OtUw6JUTgxA2QoqqmrmQ7F2NYqiBPi/L2jqHyFtllhOUvXYQXf0Z1CYUinIfyT4bTCGmrA7gX9FvHA81uzCoVw==" + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-6.2.0.tgz", + "integrity": "sha512-7evsyfH1cLOCdAzZAd43Cic04yKydNx0cF+7tiA19p1XnLLPU4dpCQOqpjqwokFe//vS0QqfqqjCS2JkiIs0cA==" }, "add-dom-event-listener": { "version": "1.1.0", @@ -1698,9 +1783,9 @@ "integrity": "sha512-z55ocwKBRLryBs394Sm3ushTtBeg6VAeuku7utSoSnsJKvKcnXFIyC6vh27n3rXyxSgkJBBCAvyOn7gSUcTYjg==" }, "ajv": { - "version": "6.10.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.10.0.tgz", - "integrity": "sha512-nffhOpkymDECQyR0mnsUtoCE8RlX38G0rYP+wgLWFyZuUyuuojSSvi/+euOiQBIn63whYwYVIIH1TvE3tu4OEg==", + "version": "6.10.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.10.2.tgz", + "integrity": "sha512-TXtUUEYHuaTEbLZWIKUr5pmBuhDLy+8KYtPYdcV8qC+pOZL+NKqYwvWSRrVXHn+ZmRRAu8vJTAznH7Oag6RVRw==", "requires": { "fast-deep-equal": "^2.0.1", "fast-json-stable-stringify": "^2.0.0", @@ -1714,9 +1799,9 @@ "integrity": "sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ==" }, "ajv-keywords": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.4.0.tgz", - "integrity": "sha512-aUjdRFISbuFOl0EIZc+9e4FfZp0bDZgAdOOf30bJmw8VM9v84SHyVyxDfbWxpGYbdZD/9XoKxfHVNmxPkhwyGw==" + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.4.1.tgz", + "integrity": "sha512-RO1ibKvd27e6FEShVFfPALuHI3WjSVNeK5FIsmme/LYRNxjKuNj+Dt7bucLa6NdSv3JcVTyMlm9kGR84z1XpaQ==" }, "alphanum-sort": { "version": "1.0.2", @@ -1944,7 +2029,7 @@ }, "asynckit": { "version": "0.4.0", - "resolved": false, + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" }, "atob": { @@ -1953,16 +2038,24 @@ "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==" }, "autoprefixer": { - "version": "9.5.1", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-9.5.1.tgz", - "integrity": "sha512-KJSzkStUl3wP0D5sdMlP82Q52JLy5+atf2MHAre48+ckWkXgixmfHyWmA77wFDy6jTHU6mIgXv6hAQ2mf1PjJQ==", + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-9.6.1.tgz", + "integrity": "sha512-aVo5WxR3VyvyJxcJC3h4FKfwCQvQWb1tSI5VHNibddCVWrcD1NvlxEweg3TSgiPztMnWfjpy2FURKA2kvDE+Tw==", "requires": { - "browserslist": "^4.5.4", - "caniuse-lite": "^1.0.30000957", + "browserslist": "^4.6.3", + "caniuse-lite": "^1.0.30000980", + "chalk": "^2.4.2", "normalize-range": "^0.1.2", "num2fraction": "^1.2.2", - "postcss": "^7.0.14", - "postcss-value-parser": "^3.3.1" + "postcss": "^7.0.17", + "postcss-value-parser": "^4.0.0" + }, + "dependencies": { + "postcss-value-parser": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.0.0.tgz", + "integrity": "sha512-ESPktioptiSUchCKgggAkzdmkgzKfmp0EU8jXH+5kbIUB+unr0Y4CY9SRMvibuvYUBjNh1ACLbxqYNpdTQOteQ==" + } } }, "aws-sign2": { @@ -2015,6 +2108,11 @@ "supports-color": "^2.0.0" } }, + "js-tokens": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", + "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=" + }, "strip-ansi": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", @@ -2088,18 +2186,19 @@ } }, "babel-plugin-dynamic-import-node": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.2.0.tgz", - "integrity": "sha512-fP899ELUnTaBcIzmrW7nniyqqdYWrWuJUyPWHxFa/c7r7hS6KC8FscNfLlBNIoPSc55kYMGEEKjPjJGCLbE1qA==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.0.tgz", + "integrity": "sha512-o6qFkpeQEBxcqt0XYlWzAVxNCSCZdUgcR8IRlhD/8DylxjjO4foPcvTW0GGKa/cVt3rvxZ7o5ippJ+/0nvLhlQ==", "requires": { "object.assign": "^4.1.0" } }, "babel-plugin-istanbul": { - "version": "5.1.4", - "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-5.1.4.tgz", - "integrity": "sha512-dySz4VJMH+dpndj0wjJ8JPs/7i1TdSPb1nRrn56/92pKOF9VKC1FMFJmMXjzlGGusnCAqujP6PBCiKq0sVA+YQ==", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-5.2.0.tgz", + "integrity": "sha512-5LphC0USA8t4i1zCtjbbNb6jJj/9+X6P37Qfirc/70EQ34xKlMW+a1RHGwxGI+SwWpNwZ27HqvzAobeqaXwiZw==", "requires": { + "@babel/helper-plugin-utils": "^7.0.0", "find-up": "^3.0.0", "istanbul-lib-instrument": "^3.3.0", "test-exclude": "^5.2.3" @@ -2213,6 +2312,15 @@ "@babel/helper-plugin-utils": "^7.0.0" } }, + "@babel/plugin-transform-react-constant-elements": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.2.0.tgz", + "integrity": "sha512-YYQFg6giRFMsZPKUM9v+VcHOdfSQdz9jHCx3akAi3UYgyjndmdYGSXylQ/V+HswQt4fL8IklchD9HTsaOCrWQQ==", + "requires": { + "@babel/helper-annotate-as-pure": "^7.0.0", + "@babel/helper-plugin-utils": "^7.0.0" + } + }, "@babel/preset-env": { "version": "7.4.3", "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.4.3.tgz", @@ -2276,10 +2384,18 @@ "regenerator-runtime": "^0.13.2" } }, + "babel-plugin-dynamic-import-node": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.2.0.tgz", + "integrity": "sha512-fP899ELUnTaBcIzmrW7nniyqqdYWrWuJUyPWHxFa/c7r7hS6KC8FscNfLlBNIoPSc55kYMGEEKjPjJGCLbE1qA==", + "requires": { + "object.assign": "^4.1.0" + } + }, "regenerator-runtime": { - "version": "0.13.2", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.2.tgz", - "integrity": "sha512-S/TQAZJO+D3m9xeN1WTI8dLKBBiRgXBlTJvbWjCThHWZj9EvHK70Ff50/tYj2J/fvBY6JtFVwRuazHN2E7M9BA==" + "version": "0.13.3", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.3.tgz", + "integrity": "sha512-naKIZz2GQ8JWh///G7L3X6LaQUAMp2lvb1rvwwsURe/VXwD6VMfr+/1NuNw3ag8v2kY1aQ/go5SNn79O9JU7yw==" }, "semver": { "version": "5.7.0", @@ -2295,13 +2411,6 @@ "requires": { "core-js": "^2.4.0", "regenerator-runtime": "^0.11.0" - }, - "dependencies": { - "core-js": { - "version": "2.5.7", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.7.tgz", - "integrity": "sha512-RszJCAxg/PP6uzXVXL6BsxSXx/B05oJAQ2vkJRjyjrEcNVycaqOmNb5OTxZPE3xa5gwZduqza6L9JOCenh/Ecw==" - } } }, "babylon": { @@ -2309,11 +2418,6 @@ "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz", "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==" }, - "bail": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/bail/-/bail-1.0.4.tgz", - "integrity": "sha512-S8vuDB4w6YpRhICUDET3guPlQpaJl7od94tpZ0Fvnyp+MKW/HyDTcRDck+29C9g+d/qQHnddRH3+94kZdrW0Ww==" - }, "balanced-match": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", @@ -2408,9 +2512,9 @@ "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==" }, "bluebird": { - "version": "3.5.4", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.4.tgz", - "integrity": "sha512-FG+nFEZChJrbQ9tIccIfZJBz3J7mLrAhxakAbnrJWn8d7aKOC+LWifa0G+p4ZqKp4y13T7juYvdhq9NzKdsrjw==" + "version": "3.5.5", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.5.tgz", + "integrity": "sha512-5am6HnnfN+urzt4yfg7IgTbotDjIT/u8AJpEt0sIU9FtXfVeezXAPKswrG+xKUCOYAINpSdgZVDU6QFh+cuH3w==" }, "bn.js": { "version": "4.11.8", @@ -2418,22 +2522,27 @@ "integrity": "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==" }, "body-parser": { - "version": "1.18.3", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.18.3.tgz", - "integrity": "sha1-WykhmP/dVTs6DyDe0FkrlWlVyLQ=", + "version": "1.19.0", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz", + "integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==", "requires": { - "bytes": "3.0.0", + "bytes": "3.1.0", "content-type": "~1.0.4", "debug": "2.6.9", "depd": "~1.1.2", - "http-errors": "~1.6.3", - "iconv-lite": "0.4.23", + "http-errors": "1.7.2", + "iconv-lite": "0.4.24", "on-finished": "~2.3.0", - "qs": "6.5.2", - "raw-body": "2.3.3", - "type-is": "~1.6.16" + "qs": "6.7.0", + "raw-body": "2.4.0", + "type-is": "~1.6.17" }, "dependencies": { + "bytes": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", + "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==" + }, "debug": { "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", @@ -2442,18 +2551,15 @@ "ms": "2.0.0" } }, - "iconv-lite": { - "version": "0.4.23", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.23.tgz", - "integrity": "sha512-neyTUVFtahjf0mB3dZT77u+8O0QB89jFdnBkd5P1JgYPbPaia3gXXOVL2fq8VyU2gMMD7SaN7QukTB/pmXYvDA==", - "requires": { - "safer-buffer": ">= 2.1.2 < 3" - } - }, "ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "qs": { + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", + "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==" } } }, @@ -2476,9 +2582,9 @@ "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24=" }, "bootstrap": { - "version": "3.3.7", - "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-3.3.7.tgz", - "integrity": "sha1-WjiTlFSfIzMIdaOxUGVldPip63E=" + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-4.3.1.tgz", + "integrity": "sha512-rXqOmH1VilAt2DyPzluTi2blhk17bO7ef+zLLPlWvG494pDxcM234pJ8wTc/6R40UWizAIIMgxjvxZg5kmsbag==" }, "brace-expansion": { "version": "1.1.11", @@ -2607,19 +2713,19 @@ } }, "browserslist": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.6.0.tgz", - "integrity": "sha512-Jk0YFwXBuMOOol8n6FhgkDzn3mY9PYLYGk29zybF05SbRTsMgPqmTNeQQhOghCxq5oFqAXE3u4sYddr4C0uRhg==", + "version": "4.6.6", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.6.6.tgz", + "integrity": "sha512-D2Nk3W9JL9Fp/gIcWei8LrERCS+eXu9AM5cfXA8WEZ84lFks+ARnZ0q/R69m2SV3Wjma83QDDPxsNKXUwdIsyA==", "requires": { - "caniuse-lite": "^1.0.30000967", - "electron-to-chromium": "^1.3.133", - "node-releases": "^1.1.19" + "caniuse-lite": "^1.0.30000984", + "electron-to-chromium": "^1.3.191", + "node-releases": "^1.1.25" } }, "bser": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/bser/-/bser-2.0.0.tgz", - "integrity": "sha1-mseNPtXZFYBP2HrLFYvHlxR6Fxk=", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.0.tgz", + "integrity": "sha512-8zsjWrQkkBoLK6uxASk1nJ2SKv97ltiGDo6A3wA0/yRPz+CwmEyDo0hUrhIuukG2JHpAl3bvFIixw2/3Hi0DOg==", "requires": { "node-int64": "^0.4.0" } @@ -2660,21 +2766,21 @@ "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=" }, "cacache": { - "version": "11.3.2", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-11.3.2.tgz", - "integrity": "sha512-E0zP4EPGDOaT2chM08Als91eYnf8Z+eH1awwwVsngUmgppfM5jjJ8l3z5vO5p5w/I3LsiXawb1sW0VY65pQABg==", + "version": "11.3.3", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-11.3.3.tgz", + "integrity": "sha512-p8WcneCytvzPxhDvYp31PD039vi77I12W+/KfR9S8AZbaiARFBCpsPJS+9uhWfeBfeAtW7o/4vt3MUqLkbY6nA==", "requires": { - "bluebird": "^3.5.3", + "bluebird": "^3.5.5", "chownr": "^1.1.1", "figgy-pudding": "^3.5.1", - "glob": "^7.1.3", + "glob": "^7.1.4", "graceful-fs": "^4.1.15", "lru-cache": "^5.1.1", "mississippi": "^3.0.0", "mkdirp": "^0.5.1", "move-concurrently": "^1.0.1", "promise-inflight": "^1.0.1", - "rimraf": "^2.6.2", + "rimraf": "^2.6.3", "ssri": "^6.0.1", "unique-filename": "^1.1.1", "y18n": "^4.0.0" @@ -2748,9 +2854,9 @@ } }, "caniuse-lite": { - "version": "1.0.30000967", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30000967.tgz", - "integrity": "sha512-rUBIbap+VJfxTzrM4akJ00lkvVb5/n5v3EGXfWzSH5zT8aJmGzjA8HWhJ4U6kCpzxozUSnB+yvAYDRPY6mRpgQ==" + "version": "1.0.30000985", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30000985.tgz", + "integrity": "sha512-1ngiwkgqAYPG0JSSUp3PUDGPKKY59EK7NrGGX+VOxaKCNzRbNc7uXMny+c3VJfZxtoK3wSImTvG9T9sXiTw2+w==" }, "capture-exit": { "version": "2.0.0", @@ -2770,11 +2876,6 @@ "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=" }, - "ccount": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/ccount/-/ccount-1.0.4.tgz", - "integrity": "sha512-fpZ81yYfzentuieinmGnphk0pLkOTMm6MZdVqwd77ROvhko6iujLNGrHH5E7utq3ygWklwfmwuG+A7P+NpqT6w==" - }, "chai": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/chai/-/chai-4.2.0.tgz", @@ -3318,14 +3419,14 @@ } }, "chownr": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.1.tgz", - "integrity": "sha512-j38EvO5+LHX84jlo6h4UzmOwi0UgW61WRyPtJz4qaadK5eY3BTS5TY/S1Stc3Uk2lIM6TPevAlULiEJwie860g==" + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.2.tgz", + "integrity": "sha512-GkfeAQh+QNy3wquu9oIZr6SS5x7wGdSgNQvD10X3r+AZr1Oys22HW8kAmDMvNg2+Dm0TeGaEuO8gFwdBXxwO8A==" }, "chrome-trace-event": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.0.tgz", - "integrity": "sha512-xDbVgyfDTT2piup/h8dK/y4QZfJRSa73bw1WZ8b4XM1o7fsFubUVGYcE+1ANtOzJJELGpYoG2961z0Z6OAld9A==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.2.tgz", + "integrity": "sha512-9e/zx1jw7B4CO+c/RXoCsfg/x1AfUBioy4owYH0bJprEYAx5hRFLRhWBqHAG57D0ZM4H7vxbP7bPe0VwhQRYDQ==", "requires": { "tslib": "^1.9.0" } @@ -3413,6 +3514,11 @@ "shallow-clone": "^0.1.2" } }, + "clsx": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-1.0.4.tgz", + "integrity": "sha512-1mQ557MIZTrL/140j+JVdRM6e31/OA4vTYxXgqIIZlndyfjHpyawKZia1Im05Vp9BWmImkcNrNtFYQMyFcgJDg==" + }, "co": { "version": "4.6.0", "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", @@ -3443,9 +3549,9 @@ } }, "color": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/color/-/color-3.1.1.tgz", - "integrity": "sha512-PvUltIXRjehRKPSy89VnDWFKY58xyhTLyxIg21vwQBI6qLwZNPmC8k3C1uytIgFKEpOIzN4y32iPm8231zFHIg==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/color/-/color-3.1.2.tgz", + "integrity": "sha512-vXTJhHebByxZn3lDvDJYw4lR5+uB3vuoHsuYA5AKuxRVn5wzzIfQKGLBmgdVRHKTJYeK5rvJcHnrd0Li49CFpg==", "requires": { "color-convert": "^1.9.1", "color-string": "^1.5.2" @@ -3481,11 +3587,6 @@ "delayed-stream": "~1.0.0" } }, - "comma-separated-tokens": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-1.0.7.tgz", - "integrity": "sha512-Jrx3xsP4pPv4AwJUDWY9wOXGtwPXARej6Xd99h4TUGotmf8APuquKMpK+dnD3UgyxK7OEWaisjZz+3b5jtL6xQ==" - }, "commander": { "version": "2.20.0", "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.0.tgz", @@ -3601,9 +3702,12 @@ "integrity": "sha1-/ozxhP9mcLa67wGp1IYaXL7EEgo=" }, "content-disposition": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz", - "integrity": "sha1-DPaLud318r55YcOoUXjLhdunjLQ=" + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz", + "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==", + "requires": { + "safe-buffer": "5.1.2" + } }, "content-type": { "version": "1.0.4", @@ -3619,9 +3723,9 @@ } }, "cookie": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz", - "integrity": "sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s=" + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz", + "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==" }, "cookie-signature": { "version": "1.0.6", @@ -3652,36 +3756,35 @@ "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=" }, "core-js": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-1.2.7.tgz", - "integrity": "sha1-ZSKUwUZR2yj6k70tX/KYOk8IxjY=" + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.9.tgz", + "integrity": "sha512-HOpZf6eXmnl7la+cUdMnLvUxKNqLUzJvgIziQ0DiF3JwSImNphIqdGqzj6hIKyX04MmV0poclQ7+wjWvxQyR2A==" }, "core-js-compat": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.0.1.tgz", - "integrity": "sha512-2pC3e+Ht/1/gD7Sim/sqzvRplMiRnFQVlPpDVaHtY9l7zZP7knamr3VRD6NyGfHd84MrDC0tAM9ulNxYMW0T3g==", + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.1.4.tgz", + "integrity": "sha512-Z5zbO9f1d0YrJdoaQhphVAnKPimX92D6z8lCGphH89MNRxlL1prI9ExJPqVwP0/kgkQCv8c4GJGT8X16yUncOg==", "requires": { - "browserslist": "^4.5.4", - "core-js": "3.0.1", - "core-js-pure": "3.0.1", - "semver": "^6.0.0" + "browserslist": "^4.6.2", + "core-js-pure": "3.1.4", + "semver": "^6.1.1" }, "dependencies": { - "core-js": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.0.1.tgz", - "integrity": "sha512-sco40rF+2KlE0ROMvydjkrVMMG1vYilP2ALoRXcYR4obqbYIuV3Bg+51GEDW+HF8n7NRA+iaA4qD0nD9lo9mew==" + "semver": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.2.0.tgz", + "integrity": "sha512-jdFC1VdUGT/2Scgbimf7FSx9iJLXoqfglSF+gJeuNWVpiE37OIbc1jywR/GJyFdz3mnkz2/id0L0J/cr0izR5A==" } } }, "core-js-pure": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.0.1.tgz", - "integrity": "sha512-mSxeQ6IghKW3MoyF4cz19GJ1cMm7761ON+WObSyLfTu/Jn3x7w4NwNFnrZxgl4MTSvYYepVLNuRtlB4loMwJ5g==" + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.1.4.tgz", + "integrity": "sha512-uJ4Z7iPNwiu1foygbcZYJsJs1jiXrTTCvxfLDXNhI/I+NHbSIEyr548y4fcsCEyWY0XgfAG/qqaunJ1SThHenA==" }, "core-util-is": { "version": "1.0.2", - "resolved": false, + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" }, "cosmiconfig": { @@ -3739,6 +3842,15 @@ "object-assign": "^4.1.1" } }, + "create-react-context": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/create-react-context/-/create-react-context-0.2.3.tgz", + "integrity": "sha512-CQBmD0+QGgTaxDL3OX1IDXYqjkp2It4RIbcb99jS6AEg27Ga+a9G3JtK6SIu0HBwPLZlmwt9F7UwWA4Bn92Rag==", + "requires": { + "fbjs": "^0.8.0", + "gud": "^1.0.0" + } + }, "cross-spawn": { "version": "6.0.5", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", @@ -3883,11 +3995,11 @@ "integrity": "sha512-jQVeeRG70QI08vSTwf1jHxp74JoZsr2XSgETae8/xC8ovSnL2WF87GTLO86Sbwdt2lK4Umg4HnnwMO4YF3Ce7w==" }, "css-tree": { - "version": "1.0.0-alpha.28", - "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.0.0-alpha.28.tgz", - "integrity": "sha512-joNNW1gCp3qFFzj4St6zk+Wh/NBv0vM5YbEreZk0SD4S23S+1xBKb6cLDg2uj4P4k/GUMlIm6cKIDqIG+vdt0w==", + "version": "1.0.0-alpha.33", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.0.0-alpha.33.tgz", + "integrity": "sha512-SPt57bh5nQnpsTBsx/IXbO14sRc9xXu5MtMAVuo0BaQQmyf0NupNPPSoMaqiAF5tDFafYsTkfeH4Q/HCKXkg4w==", "requires": { - "mdn-data": "~1.1.0", + "mdn-data": "2.0.4", "source-map": "^0.5.3" }, "dependencies": { @@ -3903,11 +4015,6 @@ "resolved": "https://registry.npmjs.org/css-unit-converter/-/css-unit-converter-1.1.1.tgz", "integrity": "sha1-2bkoGtz9jO2TW9urqDeGiX9k6ZY=" }, - "css-url-regex": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/css-url-regex/-/css-url-regex-1.1.0.tgz", - "integrity": "sha1-g4NCMMyfdMRX3lnuvRVD/uuDt+w=" - }, "css-what": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/css-what/-/css-what-2.1.3.tgz", @@ -4011,6 +4118,11 @@ "source-map": "^0.5.3" } }, + "mdn-data": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-1.1.4.tgz", + "integrity": "sha512-FSYbp3lyKjyj3E7fMl6rYvUdX0FBXaluGqlFoYESWQlyUTq8R+wp0rkFxoYFqZlHCvsUXGjyJmLQSnXToYhOSA==" + }, "source-map": { "version": "0.5.7", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", @@ -4019,18 +4131,23 @@ } }, "cssom": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.6.tgz", - "integrity": "sha512-DtUeseGk9/GBW0hl0vVPpU22iHL6YB5BUX7ml1hB+GMpo0NX5G4voX3kdWiMSEguFtcW3Vh3djqNF4aIe6ne0A==" + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", + "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==" }, "cssstyle": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-1.2.2.tgz", - "integrity": "sha512-43wY3kl1CVQSvL7wUY1qXkxVGkStjpkDmVjiIKX8R97uhajy8Bybay78uOtqvh7Q5GK75dNPfW0geWjE6qQQow==", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-1.4.0.tgz", + "integrity": "sha512-GBrLZYZ4X4x6/QEoBnIrqb8B/f5l4+8me2dkom/j1Gtbxy0kBv6OGzKuAsGM75bkGwGAFkt56Iwg28S3XTZgSA==", "requires": { "cssom": "0.3.x" } }, + "csstype": { + "version": "2.6.6", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-2.6.6.tgz", + "integrity": "sha512-RpFbQGUE74iyPgvr46U9t1xoQBM8T4BL8SxrN66Le2xYAPSaDJJKeztV3awugusb3g3G9iL8StmkBBXhcbbXhg==" + }, "cyclist": { "version": "0.2.2", "resolved": "https://registry.npmjs.org/cyclist/-/cyclist-0.2.2.tgz", @@ -4042,62 +4159,57 @@ "integrity": "sha1-vEZ0gAQ3iyGjYMn8fPUjF5B2L7g=" }, "d3-array": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-1.2.4.tgz", - "integrity": "sha512-KHW6M86R+FUPYGb3R5XiYjXPq7VzwxZ22buHhAEVG5ztoEcZZMLov530mmccaqA1GghZArjQV46fuc8kUqhhHw==" + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-2.2.0.tgz", + "integrity": "sha512-eE0QmSh6xToqM3sxHiJYg/QFdNn52ZEgmFE8A8abU8GsHvsIOolqH8B70/8+VGAKm5MlwaExhqR3DLIjOJMLPA==" }, "d3-axis": { "version": "1.0.12", "resolved": "https://registry.npmjs.org/d3-axis/-/d3-axis-1.0.12.tgz", "integrity": "sha512-ejINPfPSNdGFKEOAtnBtdkpr24c4d4jsei6Lg98mxf424ivoDP2956/5HDpIAtmHo85lqT4pruy+zEgvRUBqaQ==" }, + "d3-color": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-1.2.8.tgz", + "integrity": "sha512-yeANXzP37PHk0DbSTMNPhnJD+Nn4G//O5E825bR6fAfHH43hobSBpgB9G9oWVl9+XgUaQ4yCnsX1H+l8DoaL9A==" + }, + "d3-format": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/d3-format/-/d3-format-1.3.2.tgz", + "integrity": "sha512-Z18Dprj96ExragQ0DeGi+SYPQ7pPfRMtUXtsg/ChVIKNBCzjO8XYJvRTC1usblx52lqge56V5ect+frYTQc8WQ==" + }, + "d3-interpolate": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-1.3.2.tgz", + "integrity": "sha512-NlNKGopqaz9qM1PXh9gBF1KSCVh+jSFErrSlD/4hybwoNX/gt1d8CDbDW+3i+5UOHhjC6s6nMvRxcuoMVNgL2w==", + "requires": { + "d3-color": "1" + } + }, "d3-path": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-1.0.7.tgz", "integrity": "sha512-q0cW1RpvA5c5ma2rch62mX8AYaiLX0+bdaSM2wxSU9tXjU4DNvkx9qiUvjkuWCj3p22UO/hlPivujqMiR9PDzA==" }, "d3-scale": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-1.0.7.tgz", - "integrity": "sha512-KvU92czp2/qse5tUfGms6Kjig0AhHOwkzXG0+PqIJB3ke0WUv088AHMZI0OssO9NCkXt4RP8yju9rpH8aGB7Lw==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-3.0.0.tgz", + "integrity": "sha512-ktic5HBFlAZj2CN8CCl/p/JyY8bMQluN7+fA6ICE6yyoMOnSQAZ1Bb8/5LcNpNKMBMJge+5Vv4pWJhARYlQYFw==", "requires": { - "d3-array": "^1.2.0", - "d3-collection": "1", - "d3-color": "1", + "d3-array": "^1.2.0 || 2", "d3-format": "1", "d3-interpolate": "1", "d3-time": "1", "d3-time-format": "2" - }, - "dependencies": { - "d3-collection": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/d3-collection/-/d3-collection-1.0.4.tgz", - "integrity": "sha1-NC39EoN8kJdPM/HMCnha6lcNzcI=" - }, - "d3-color": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-1.0.3.tgz", - "integrity": "sha1-vHZD/KjlOoNH4vva/6I2eWtYUJs=" - }, - "d3-format": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/d3-format/-/d3-format-1.2.2.tgz", - "integrity": "sha512-zH9CfF/3C8zUI47nsiKfD0+AGDEuM8LwBIP7pBVpyR4l/sKkZqITmMtxRp04rwBrlshIZ17XeFAaovN3++wzkw==" - }, - "d3-interpolate": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-1.1.6.tgz", - "integrity": "sha512-mOnv5a+pZzkNIHtw/V6I+w9Lqm9L5bG3OTXPM5A+QO0yyVMQ4W1uZhR+VOJmazaOZXri2ppbiZ5BUNWT0pFM9A==", - "requires": { - "d3-color": "1" - } - }, - "d3-time": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/d3-time/-/d3-time-1.0.8.tgz", - "integrity": "sha512-YRZkNhphZh3KcnBfitvF3c6E0JOFGikHZ4YqD+Lzv83ZHn1/u6yGenRU1m+KAk9J1GnZMnKcrtfvSktlA1DXNQ==" - } + } + }, + "d3-scale-chromatic": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/d3-scale-chromatic/-/d3-scale-chromatic-1.3.3.tgz", + "integrity": "sha512-BWTipif1CimXcYfT02LKjAyItX5gKiwxuPRgr4xM58JwlLocWbjPLI7aMEjkcoOQXMkYsmNsvv3d2yl/OKuHHw==", + "requires": { + "d3-color": "1", + "d3-interpolate": "1" } }, "d3-selection": { @@ -4298,7 +4410,7 @@ }, "delayed-stream": { "version": "1.0.0", - "resolved": false, + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" }, "depd": { @@ -4378,20 +4490,16 @@ "path-type": "^3.0.0" } }, - "disposables": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/disposables/-/disposables-1.0.2.tgz", - "integrity": "sha1-NsamdEdfVaLWkTVnpgFETkh7S24=" - }, "dnd-core": { - "version": "2.6.0", - "resolved": "http://registry.npmjs.org/dnd-core/-/dnd-core-2.6.0.tgz", - "integrity": "sha1-ErrWbVh0LG5ffPKUP7aFlED4CcQ=", + "version": "9.3.2", + "resolved": "https://registry.npmjs.org/dnd-core/-/dnd-core-9.3.2.tgz", + "integrity": "sha512-cc6aAFmLDYdXguC+YbKB+SCsXlNd+LS/+T22M4OpmehWI3wBqXBik3o+myjr19ie3K11S3ATTiwir7b0s3TAhw==", "requires": { + "@types/asap": "^2.0.0", + "@types/invariant": "^2.2.30", "asap": "^2.0.6", - "invariant": "^2.0.0", - "lodash": "^4.2.0", - "redux": "^3.7.1" + "invariant": "^2.2.4", + "redux": "^4.0.1" } }, "dns-equal": { @@ -4425,9 +4533,9 @@ } }, "dom-align": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/dom-align/-/dom-align-1.8.2.tgz", - "integrity": "sha512-17vInOylbB7H4qua7QRsmQT05FFTZemO8BhnOPgF9BPqjAPDyQr/9V8fmJbn05vQ31m2gu3EJSSYN2u94szUZg==" + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/dom-align/-/dom-align-1.9.0.tgz", + "integrity": "sha512-HvPfXISxoU7dKrbqS4vIFa1hx88wD7VdKaZ7sHWeow8y76tuzsxXkiPGbeilemLXrTd9cWbPqR4MOl4y3dkcXA==" }, "dom-converter": { "version": "0.2.0", @@ -4438,9 +4546,12 @@ } }, "dom-helpers": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-3.3.1.tgz", - "integrity": "sha512-2Sm+JaYn74OiTM2wHvxJOo3roiq/h25Yi69Fqk269cNUwIXsCvATB6CRSFC9Am/20G2b28hGv/+7NiWydIrPvg==" + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-3.4.0.tgz", + "integrity": "sha512-LnuPJ+dwqKDIyotW1VzmOZ5TONUN7CwkCR5hrgawTUbkBGYdeoNLZo6nNfGkCrjtE1nXXaj7iMMpDa8/d9WoIA==", + "requires": { + "@babel/runtime": "^7.1.2" + } }, "dom-serializer": { "version": "0.1.1", @@ -4535,14 +4646,14 @@ "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" }, "electron-to-chromium": { - "version": "1.3.134", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.134.tgz", - "integrity": "sha512-C3uK2SrtWg/gSWaluLHWSHjyebVZCe4ZC0NVgTAoTq8tCR9FareRK5T7R7AS/nPZShtlEcjVMX1kQ8wi4nU68w==" + "version": "1.3.199", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.199.tgz", + "integrity": "sha512-gachlDdHSK47s0N2e58GH9HMC6Z4ip0SfmYUa5iEbE50AKaOUXysaJnXMfKj0xB245jWbYcyFSH+th3rqsF8hA==" }, "elliptic": { - "version": "6.4.1", - "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.4.1.tgz", - "integrity": "sha512-BsXLz5sqX8OHcsh7CqBMztyXARmGQ3LWPtGjJi6DiJHq5C/qvi9P3OqgswKSDftbu8+IoI/QDTAm2fFnQ9SZSQ==", + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.0.tgz", + "integrity": "sha512-eFOJTMyCYb7xtE/caJ6JJu+bhi67WCYNbkGSknu20pmM8Ke/bqOfdnZWxyoGN26JgfxTbXrsCkEw4KheCT/KGg==", "requires": { "bn.js": "^4.4.0", "brorand": "^1.0.1", @@ -4570,20 +4681,10 @@ }, "encoding": { "version": "0.1.12", - "resolved": false, + "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.12.tgz", "integrity": "sha1-U4tm8+5izRq1HsMjgp0flIDHS+s=", "requires": { "iconv-lite": "~0.4.13" - }, - "dependencies": { - "iconv-lite": { - "version": "0.4.21", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.21.tgz", - "integrity": "sha512-En5V9za5mBt2oUA03WGD3TwDv0MKAruqsuxstbMUZaj9W9k/m1CV/9py3l0L5kw9Bln8fdHQmzHSYtvpvTLpKw==", - "requires": { - "safer-buffer": "^2.1.0" - } - } } }, "end-of-stream": { @@ -4649,9 +4750,9 @@ } }, "es6-promise": { - "version": "4.2.6", - "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.6.tgz", - "integrity": "sha512-aRVgGdnmW2OiySVPUC9e6m+plolMAJKjZnQlCwNSuK5yQ0JN61DZSO1X1Ufd1foqWRAlig0rhduTCHe7sVtK5Q==" + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.8.tgz", + "integrity": "sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==" }, "escape-html": { "version": "1.0.3", @@ -4726,9 +4827,9 @@ }, "dependencies": { "import-fresh": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.0.0.tgz", - "integrity": "sha512-pOnA9tfM3Uwics+SaBLCNyZZZbK+4PTu0OPZtLlMIrv17EdBoC15S9Kn8ckJ9TZTyKb3ywNE5y1yeDxxGA7nTQ==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.1.0.tgz", + "integrity": "sha512-PpuksHKGt8rXfWEr9m9EHIpgyyaltBy8+eF6GJM0QCAxMgxCfucMF3mjecK2QsJr0amJW7gTqh5/wht0z2UhEQ==", "requires": { "parent-module": "^1.0.0", "resolve-from": "^4.0.0" @@ -4791,9 +4892,9 @@ } }, "eslint-module-utils": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.4.0.tgz", - "integrity": "sha512-14tltLm38Eu3zS+mt0KvILC3q8jyIAH518MlG+HO0p+yK885Lb1UHTY/UgR91eOyGdmxAPb+OLoW4znqIT6Ndw==", + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.4.1.tgz", + "integrity": "sha512-H6DOj+ejw7Tesdgbfs4jeS4YMFrT8uI8xwd1gtQqXssaR0EQ26L+2O/w6wkYFy2MymON0fTwHmXBvvfLNZVZEw==", "requires": { "debug": "^2.6.8", "pkg-dir": "^2.0.0" @@ -5038,9 +5139,9 @@ } }, "eslint-plugin-react-hooks": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-1.6.0.tgz", - "integrity": "sha512-lHBVRIaz5ibnIgNG07JNiAuBUeKhEf8l4etNx5vfAEwqQ5tcuK3jV9yjmopPgQDagQb7HwIuQVsE3IVcGrRnag==" + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-1.6.1.tgz", + "integrity": "sha512-wHhmGJyVuijnYIJXZJHDUF2WM+rJYTjulUTqF9k61d3BTk8etydz+M4dXUVH7M76ZRS85rqBTCx0Es/lLsrjnA==" }, "eslint-scope": { "version": "4.0.3", @@ -5052,9 +5153,12 @@ } }, "eslint-utils": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-1.3.1.tgz", - "integrity": "sha512-Z7YjnIldX+2XMcjr7ZkgEsOj/bREONV60qYeB/bjMAqqqZ4zxKyWX+BOUkdmRmA9riiIPVvo5x86m5elviOk0Q==" + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-1.4.0.tgz", + "integrity": "sha512-7ehnzPaP5IIEh1r1tkjuIrxqhNkzUJa9z3R92tLJdZIVdWaczEhr3EbhGtsMrVxi1KeR8qA7Off6SWc5WNQqyQ==", + "requires": { + "eslint-visitor-keys": "^1.0.0" + } }, "eslint-visitor-keys": { "version": "1.0.0", @@ -5217,38 +5321,38 @@ } }, "express": { - "version": "4.16.4", - "resolved": "https://registry.npmjs.org/express/-/express-4.16.4.tgz", - "integrity": "sha512-j12Uuyb4FMrd/qQAm6uCHAkPtO8FDTRJZBDd5D2KOL2eLaz1yUNdUB/NOIyq0iU4q4cFarsUCrnFDPBcnksuOg==", + "version": "4.17.1", + "resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz", + "integrity": "sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==", "requires": { - "accepts": "~1.3.5", + "accepts": "~1.3.7", "array-flatten": "1.1.1", - "body-parser": "1.18.3", - "content-disposition": "0.5.2", + "body-parser": "1.19.0", + "content-disposition": "0.5.3", "content-type": "~1.0.4", - "cookie": "0.3.1", + "cookie": "0.4.0", "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", + "finalhandler": "~1.1.2", "fresh": "0.5.2", "merge-descriptors": "1.0.1", "methods": "~1.1.2", "on-finished": "~2.3.0", - "parseurl": "~1.3.2", + "parseurl": "~1.3.3", "path-to-regexp": "0.1.7", - "proxy-addr": "~2.0.4", - "qs": "6.5.2", - "range-parser": "~1.2.0", + "proxy-addr": "~2.0.5", + "qs": "6.7.0", + "range-parser": "~1.2.1", "safe-buffer": "5.1.2", - "send": "0.16.2", - "serve-static": "1.13.2", - "setprototypeof": "1.1.0", - "statuses": "~1.4.0", - "type-is": "~1.6.16", + "send": "0.17.1", + "serve-static": "1.14.1", + "setprototypeof": "1.1.1", + "statuses": "~1.5.0", + "type-is": "~1.6.18", "utils-merge": "1.0.1", "vary": "~1.1.2" }, @@ -5275,6 +5379,11 @@ "version": "0.1.7", "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=" + }, + "qs": { + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", + "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==" } } }, @@ -5303,9 +5412,9 @@ } }, "external-editor": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.0.3.tgz", - "integrity": "sha512-bn71H9+qWoOQKyZDo25mOMVpSmXROAsTJVVVYzrrtol3d4y+AsKjf4Iwl2Q+IuT0kFSQ1qo166UuIwqYq7mGnA==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", + "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", "requires": { "chardet": "^0.7.0", "iconv-lite": "^0.4.24", @@ -5387,9 +5496,9 @@ "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=" }, "fast-glob": { - "version": "2.2.6", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-2.2.6.tgz", - "integrity": "sha512-0BvMaZc1k9F+MeWWMe8pL6YltFzZYcJsYU7D4JyDA6PAczaXvxqQQ/z+mDF7/4Mw01DeUc+i3CTKajnkANkV4w==", + "version": "2.2.7", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-2.2.7.tgz", + "integrity": "sha512-g1KuQwHOZAmOZMuBtHdxDtju+T2RT8jgCC9aANsbpdiDDTSnjgfuVsIBNKbUeJI3oKMRExcfNDtJl4OhbffMsw==", "requires": { "@mrmlnc/readdir-enhanced": "^2.2.1", "@nodelib/fs.stat": "^1.1.2", @@ -5409,10 +5518,20 @@ "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=" }, + "fast-memoize": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/fast-memoize/-/fast-memoize-2.5.1.tgz", + "integrity": "sha512-xdmw296PCL01tMOXx9mdJSmWY29jQgxyuZdq0rEHMu+Tpe1eOEtCycoG6chzlcrWsNgpZP7oL8RiQr7+G6Bl6g==" + }, + "fast-safe-stringify": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.0.6.tgz", + "integrity": "sha512-q8BZ89jjc+mz08rSxROs8VsrBBcn1SIw1kq9NjolL509tkABRk9io01RAjSaEv1Xb2uFLt8VtRiZbGp5H8iDtg==" + }, "faye-websocket": { - "version": "0.11.1", - "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.1.tgz", - "integrity": "sha1-8O/hjE9W5PQK/H4Gxxn9XuYYjzg=", + "version": "0.11.3", + "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.3.tgz", + "integrity": "sha512-D2y4bovYpzziGgbHYtGCMjlJM36vAl/y+xUyn1C+FVx8szd1E+86KwVw6XvYSzOP8iMpm1X0I4xJD+QtUb36OA==", "requires": { "websocket-driver": ">=0.5.1" } @@ -5434,9 +5553,9 @@ } }, "fbjs": { - "version": "0.8.12", - "resolved": "https://registry.npmjs.org/fbjs/-/fbjs-0.8.12.tgz", - "integrity": "sha512-SBiP6XPiWIlX1tE5mvU/UeUFoqzJgbf+ezkl0M8D2xk4urDb+2uyjjGB10HAPluLboUqqVHtgUwwyuWakUfMgQ==", + "version": "0.8.17", + "resolved": "https://registry.npmjs.org/fbjs/-/fbjs-0.8.17.tgz", + "integrity": "sha1-xNWY6taUkRJlPWWIsBpc3Nn5D90=", "requires": { "core-js": "^1.0.0", "isomorphic-fetch": "^2.1.1", @@ -5444,13 +5563,13 @@ "object-assign": "^4.1.0", "promise": "^7.1.1", "setimmediate": "^1.0.5", - "ua-parser-js": "^0.7.9" + "ua-parser-js": "^0.7.18" }, "dependencies": { - "object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" + "core-js": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-1.2.7.tgz", + "integrity": "sha1-ZSKUwUZR2yj6k70tX/KYOk8IxjY=" } } }, @@ -5485,9 +5604,9 @@ } }, "file-saver": { - "version": "1.3.8", - "resolved": "http://registry.npmjs.org/file-saver/-/file-saver-1.3.8.tgz", - "integrity": "sha512-spKHSBQIxxS81N/O21WmuXA2F6wppUCsutpzenOeZzOCCJ5gEfcbqJP983IrpLXzYmXnMUa6J03SubcNPdKrlg==" + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/file-saver/-/file-saver-2.0.2.tgz", + "integrity": "sha512-Wz3c3XQ5xroCxd1G8b7yL0Ehkf0TC9oYC6buPFkNnU9EnaPlifeAFCyCh+iewXTyFRcg0a6j3J7FmJsIhlhBdw==" }, "filesize": { "version": "3.6.1", @@ -5516,16 +5635,16 @@ } }, "finalhandler": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.1.tgz", - "integrity": "sha512-Y1GUDo39ez4aHAw7MysnUD5JzYX+WaIj8I57kO3aEPT1fFRL4sr7mjei97FgnwhAyyzRYmQZaTHb2+9uZ1dPtg==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", + "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", "requires": { "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", + "parseurl": "~1.3.3", + "statuses": "~1.5.0", "unpipe": "~1.0.0" }, "dependencies": { @@ -5573,9 +5692,9 @@ } }, "flatted": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.0.tgz", - "integrity": "sha512-R+H8IZclI8AAkSBRQJLVOsxwAoHd6WC40b4QTNWIjzAa6BXOBfQcM587MXDTVPeYaopFNWHUFLx7eNmHDSxMWg==" + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.1.tgz", + "integrity": "sha512-a1hQMktqW9Nmqr5aktAux3JMNqaucxGcjtjWnZLHX7yyPCmlSV3M54nGYbqT8K+0GhF3NBgmJCc3ma+WOgX8Jg==" }, "flatten": { "version": "1.0.2", @@ -5700,6 +5819,20 @@ "readable-stream": "^2.0.0" } }, + "frontend-collective-react-dnd-scrollzone": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/frontend-collective-react-dnd-scrollzone/-/frontend-collective-react-dnd-scrollzone-1.0.2.tgz", + "integrity": "sha512-me/D9PZJq9j/sjEjs/OPmm6V6nbaHbhgeQiwrWu0t35lhwAOKWc+QBzzKKcZQeboYTkgE8UvCD9el+5ANp+g5Q==", + "requires": { + "hoist-non-react-statics": "^3.1.0", + "lodash.throttle": "^4.0.1", + "prop-types": "^15.5.9", + "raf": "^3.2.0", + "react": "^16.3.0", + "react-display-name": "^0.2.0", + "react-dom": "^16.3.0" + } + }, "fs-extra": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", @@ -5751,9 +5884,9 @@ "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=" }, "gaugeJS": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/gaugeJS/-/gaugeJS-1.3.6.tgz", - "integrity": "sha1-ZZEzRNsl/sdeS6kxTHxzlwtRR68=" + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/gaugeJS/-/gaugeJS-1.3.7.tgz", + "integrity": "sha512-te8IYMlgZOSbDmiecCwI+IOEUvEhYbniC+2qicPz7Bco5XV05QMtUr8ILqPuR+txtPC5855dZZojUHi0r15oWQ==" }, "get-caller-file": { "version": "1.0.3", @@ -5886,15 +6019,20 @@ } }, "graceful-fs": { - "version": "4.1.15", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.15.tgz", - "integrity": "sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA==" + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.0.tgz", + "integrity": "sha512-jpSvDPV4Cq/bgtpndIWbI5hmYxhQGHPC4d4cqBPb4DLniCfhJokdXhwhaDuLBGLQdvvRum/UiX6ECVIPvDXqdg==" }, "growly": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/growly/-/growly-1.3.0.tgz", "integrity": "sha1-8QdIy+dq+WS3yWyTxrzCivEgwIE=" }, + "gud": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/gud/-/gud-1.0.0.tgz", + "integrity": "sha512-zGEOVKFM5sVPPrYs7J5/hYEw2Pof8KCyOwyhG8sAF26mCAeUFAcYPu1mwB7hhpIP29zOIBaDqwuHdLp0jvZXjw==" + }, "gzip-size": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-5.0.0.tgz", @@ -5991,11 +6129,6 @@ "kind-of": "^4.0.0" }, "dependencies": { - "is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" - }, "kind-of": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", @@ -6024,34 +6157,6 @@ "minimalistic-assert": "^1.0.1" } }, - "hast-util-from-parse5": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/hast-util-from-parse5/-/hast-util-from-parse5-5.0.0.tgz", - "integrity": "sha512-A7ev5OseS/J15214cvDdcI62uwovJO2PB60Xhnq7kaxvvQRFDEccuqbkrFXU03GPBGopdPqlpQBRqIcDS/Fjbg==", - "requires": { - "ccount": "^1.0.3", - "hastscript": "^5.0.0", - "property-information": "^5.0.0", - "web-namespaces": "^1.1.2", - "xtend": "^4.0.1" - } - }, - "hast-util-parse-selector": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/hast-util-parse-selector/-/hast-util-parse-selector-2.2.1.tgz", - "integrity": "sha512-Xyh0v+nHmQvrOqop2Jqd8gOdyQtE8sIP9IQf7mlVDqp924W4w/8Liuguk2L2qei9hARnQSG2m+wAOCxM7npJVw==" - }, - "hastscript": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/hastscript/-/hastscript-5.0.0.tgz", - "integrity": "sha512-xJtuJ8D42Xtq5yJrnDg/KAIxl2cXBXKoiIJwmWX9XMf8113qHTGl/Bf7jEsxmENJ4w6q4Tfl8s/Y6mEZo8x8qw==", - "requires": { - "comma-separated-tokens": "^1.0.0", - "hast-util-parse-selector": "^2.2.0", - "property-information": "^5.0.1", - "space-separated-tokens": "^1.0.0" - } - }, "he": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", @@ -6086,9 +6191,12 @@ } }, "hoist-non-react-statics": { - "version": "1.2.0", - "resolved": false, - "integrity": "sha1-qkSM8JhtVcxAdzsXF0t90GbLfPs=" + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.0.tgz", + "integrity": "sha512-0XsbTXxgiaCDYDIWFcwkmerZPSwywfUqYmwT4jzewKTQSWoE6FCMoUVOeBJWK3E/CrWbxRG3m5GzY4lnIwGRBA==", + "requires": { + "react-is": "^16.7.0" + } }, "hosted-git-info": { "version": "2.7.1", @@ -6198,9 +6306,9 @@ }, "dependencies": { "readable-stream": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.3.0.tgz", - "integrity": "sha512-EsI+s3k3XsW+fU8fQACLN59ky34AZ14LoeVZpYwmZvldCFo0r0gnelwF2TcMjLor/BTL5aDJVBMkss0dthToPw==", + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.4.0.tgz", + "integrity": "sha512-jItXPLmrSR8jmTRmRWJXCnGJsfy85mB3Wd/uINMXA65yrnFo0cPClFIUWzo2najVNSl+mx7/4W8ttlLWJe99pQ==", "requires": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", @@ -6215,20 +6323,28 @@ "integrity": "sha1-+nFolEq5pRnTN8sL7HKE3D5yPYc=" }, "http-errors": { - "version": "1.6.3", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", - "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=", + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz", + "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==", "requires": { "depd": "~1.1.2", "inherits": "2.0.3", - "setprototypeof": "1.1.0", - "statuses": ">= 1.4.0 < 2" + "setprototypeof": "1.1.1", + "statuses": ">= 1.5.0 < 2", + "toidentifier": "1.0.0" + }, + "dependencies": { + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + } } }, "http-parser-js": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.0.tgz", - "integrity": "sha512-cZdEF7r4gfRIq7ezX9J0T+kQmJNOub71dWbgAXVHDct80TKP4MCETtZQ31xyv38UwgzkWPYF/Xc0ge55dW9Z9w==" + "version": "0.4.10", + "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.4.10.tgz", + "integrity": "sha1-ksnBN0w1CF912zWexWzCV8u5P6Q=" }, "http-proxy": { "version": "1.17.0", @@ -6285,9 +6401,9 @@ "integrity": "sha1-Bupvg2ead0njhs/h/oEq5dsiPe0=" }, "icss-utils": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-4.1.0.tgz", - "integrity": "sha512-3DEun4VOeMvSczifM3F2cKQrDQ5Pj6WKhkOq6HD4QTnDUAq8MQRxy5TX6Sy1iY6WPBe4gQ3p5vTECjbIkglkkQ==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-4.1.1.tgz", + "integrity": "sha512-4aFq7wvWyMHKgxsH8QQtGpvbASCf+eM3wPRLI6R+MgAnTCZ6STYsRvttLvRWK0Nfif5piF394St3HeJDaljGPA==", "requires": { "postcss": "^7.0.14" } @@ -6326,9 +6442,9 @@ "integrity": "sha512-O3sR1/opvCDGLEVcvrGTMtLac8GJ5IwZC4puPrLuRj3l7ICKvkmA0vGuU9OW8mV9WIBRnaxp5GJh9IEAaNOoYg==" }, "immutable": { - "version": "3.8.2", - "resolved": "https://registry.npmjs.org/immutable/-/immutable-3.8.2.tgz", - "integrity": "sha1-wkOZUUVbs5kT2vKBN28VMOEErfM=" + "version": "4.0.0-rc.12", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.0.0-rc.12.tgz", + "integrity": "sha512-0M2XxkZLx/mi3t8NVwIm1g8nHoEmM9p9UBl/G9k4+hm0kBgOVdMV/B3CY5dQ8qG8qc80NN4gDV4HQv6FTJ5q7A==" }, "import-cwd": { "version": "2.1.0", @@ -6374,11 +6490,6 @@ "resolved": "https://registry.npmjs.org/indexes-of/-/indexes-of-1.0.1.tgz", "integrity": "sha1-8w9xbI4r00bHtn0985FVZqfAVgc=" }, - "indexof": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/indexof/-/indexof-0.0.1.tgz", - "integrity": "sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10=" - }, "inflight": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", @@ -6389,9 +6500,9 @@ } }, "inherits": { - "version": "2.0.3", - "resolved": false, - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" }, "ini": { "version": "1.3.5", @@ -6399,9 +6510,9 @@ "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==" }, "inquirer": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-6.3.1.tgz", - "integrity": "sha512-MmL624rfkFt4TG9y/Jvmt8vdmOo836U7Y0Hxr2aFk3RelZEGX4Igk0KabWrcaaZaTv9uzglOqWh1Vly+FAWAXA==", + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-6.5.0.tgz", + "integrity": "sha512-scfHejeG/lVZSpvCXpsB4j/wQNPM5JC8kiElOI0OUTwmc1RTpXr4H32/HOlQHcZiYl2z2VElwuCVDRG8vFmbnA==", "requires": { "ansi-escapes": "^3.2.0", "chalk": "^2.4.2", @@ -6409,7 +6520,7 @@ "cli-width": "^2.0.0", "external-editor": "^3.0.3", "figures": "^2.0.0", - "lodash": "^4.17.11", + "lodash": "^4.17.12", "mute-stream": "0.0.7", "run-async": "^2.2.0", "rxjs": "^6.4.0", @@ -6497,9 +6608,9 @@ } }, "is-buffer": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.3.tgz", - "integrity": "sha512-U15Q7MXTuZlrbymiz95PJpZxu8IlipAp4dtS3wOdgPXx3mqBnslrWU14kxfHB+Py/+2PVKSr37dMAgM2A4uArw==" + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" }, "is-callable": { "version": "1.1.4", @@ -6624,11 +6735,6 @@ "path-is-inside": "^1.0.1" } }, - "is-plain-obj": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", - "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=" - }, "is-plain-object": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", @@ -6955,6 +7061,11 @@ "xml-name-validator": "^3.0.0" } }, + "parse5": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-5.1.0.tgz", + "integrity": "sha512-fxNG2sQjHvlVAYmzBZS9YlDp6PTSSDwa98vkD4QgVDDCAo84z5X1t5XyJQ62ImdLXx5NdIIfihey6xpum9/gRQ==" + }, "whatwg-url": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-7.0.0.tgz", @@ -6993,9 +7104,9 @@ "integrity": "sha512-RR4fo8jEmMD9zSz2nLbs2j0zvPpk/KCEz3a62jJWbd2ayNo0cb+KFRxPHVhE4ZmgGJEQp0fosmNz84IfqM8cMQ==" }, "jest-haste-map": { - "version": "24.8.0", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-24.8.0.tgz", - "integrity": "sha512-ZBPRGHdPt1rHajWelXdqygIDpJx8u3xOoLyUBWRW28r3tagrgoepPrzAozW7kW9HrQfhvmiv1tncsxqHJO1onQ==", + "version": "24.8.1", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-24.8.1.tgz", + "integrity": "sha512-SwaxMGVdAZk3ernAx2Uv2sorA7jm3Kx+lR0grp6rMmnY06Kn/urtKx1LPN2mGTea4fCT38impYT28FfcLUhX0g==", "requires": { "@jest/types": "^24.8.0", "anymatch": "^2.0.0", @@ -7818,15 +7929,20 @@ } } }, + "jquery": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/jquery/-/jquery-3.4.1.tgz", + "integrity": "sha512-36+AdBzCL+y6qjw5Tx7HgzeGCzC81MDDgaUP8ld2zhx58HdqXGoBd+tHdrBMiyjGQs0Hxs/MLZTu/eHNJJuWPw==" + }, "js-levenshtein": { "version": "1.1.6", "resolved": "https://registry.npmjs.org/js-levenshtein/-/js-levenshtein-1.1.6.tgz", "integrity": "sha512-X2BB11YZtrRqY4EnQcLX5Rh373zbK4alC1FW7D7MBhL2gtcC17cTnr6DmfHZeS0s2rTHjUTMMHfG7gO8SSdw+g==" }, "js-tokens": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", - "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=" + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" }, "js-yaml": { "version": "3.13.1", @@ -7879,11 +7995,6 @@ "version": "5.7.3", "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.7.3.tgz", "integrity": "sha512-T/zvzYRfbVojPWahDsE5evJdHb3oJoQfFbsrKM7w5Zcs++Tr257tia3BmMP8XYVjp1S9RZXQMh7gao96BlqZOw==" - }, - "parse5": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-4.0.0.tgz", - "integrity": "sha512-VrZ7eOd3T1Fk4XWNXMgiGBK/z0MG48BWG2uQNU4I72fkQuKUTZpl+u9k+CxEG0twMVzSmXEEz12z5Fnw1jIQFA==" } } }, @@ -7926,9 +8037,9 @@ "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=" }, "json3": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/json3/-/json3-3.3.2.tgz", - "integrity": "sha1-PAQ0dD35Pi9cQq7nsZvLSDV19OE=" + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/json3/-/json3-3.3.3.tgz", + "integrity": "sha512-c7/8mbUsKigAbLkD5B010BK4D9LZm7A1pNItkEwiUZRpIN66exu/e7YQWysGun+TRKaJp8MhemM+VkfWv42aCA==" }, "json5": { "version": "2.1.0", @@ -7970,17 +8081,18 @@ } }, "jsx-ast-utils": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-2.1.0.tgz", - "integrity": "sha512-yDGDG2DS4JcqhA6blsuYbtsT09xL8AoLuUR2Gb5exrw7UEM19sBcOTq+YBBhrNbl0PUC4R4LnFu+dHg2HKeVvA==", + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-2.2.1.tgz", + "integrity": "sha512-v3FxCcAf20DayI+uxnCuw795+oOIkVu6EnJ1+kSzhqqTZHNkTZ7B66ZgLp4oLJ/gbA64cI0B7WRoHZMSRdyVRQ==", "requires": { - "array-includes": "^3.0.3" + "array-includes": "^3.0.3", + "object.assign": "^4.1.0" } }, "jszip": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.2.1.tgz", - "integrity": "sha512-iCMBbo4eE5rb1VCpm5qXOAaUiRKRUKiItn8ah2YQQx9qymmSAY98eyQfioChEYcVQLh0zxJ3wS4A0mh90AVPvw==", + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.2.2.tgz", + "integrity": "sha512-NmKajvAFQpbg3taXQXr/ccS2wcucR1AZ+NtyWp2Nq7HHVsXhcJFR8p0Baf32C2yVvBylFWVeKf+WI2AnvlPhpA==", "requires": { "lie": "~3.3.0", "pako": "~1.0.2", @@ -7988,6 +8100,11 @@ "set-immediate-shim": "~1.0.1" } }, + "keycode": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/keycode/-/keycode-2.2.0.tgz", + "integrity": "sha1-PQr1bce4uOXLqNCpfxByBO7CKwQ=" + }, "killable": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/killable/-/killable-1.0.1.tgz", @@ -7999,13 +8116,6 @@ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "requires": { "is-buffer": "^1.1.5" - }, - "dependencies": { - "is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" - } } }, "kleur": { @@ -8066,6 +8176,11 @@ "immediate": "~3.0.5" } }, + "linear-layout-vector": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/linear-layout-vector/-/linear-layout-vector-0.0.1.tgz", + "integrity": "sha1-OYEU1zA7bsx/1rJzr3uEAdi6nHA=" + }, "load-json-file": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", @@ -8163,14 +8278,9 @@ } }, "lodash": { - "version": "4.17.11", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", - "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==" - }, - "lodash-es": { - "version": "4.17.11", - "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.11.tgz", - "integrity": "sha512-DHb1ub+rMjjrxqlB3H56/6MXtm1lSksDp2rA2cNWjG8mlDUYFhUj3Di2Zn5IwSU87xLv8tNIQ7sSwE/YOX/D/Q==" + "version": "4.17.15", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", + "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==" }, "lodash._getnative": { "version": "3.9.1", @@ -8205,7 +8315,7 @@ "lodash.isequal": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz", - "integrity": "sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==" + "integrity": "sha1-QVxEePK8wwEgwizhDtMib30+GOA=" }, "lodash.keys": { "version": "3.1.2", @@ -8233,25 +8343,25 @@ "integrity": "sha1-0jM6NtnncXyK0vfKyv7HwytERmQ=" }, "lodash.template": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-4.4.0.tgz", - "integrity": "sha1-5zoDhcg1VZF0bgILmWecaQ5o+6A=", + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-4.5.0.tgz", + "integrity": "sha512-84vYFxIkmidUiFxidA/KjjH9pAycqW+h980j7Fuz5qxRtO9pgB7MDFTdys1N7A5mcucRiDyEq4fusljItR1T/A==", "requires": { - "lodash._reinterpolate": "~3.0.0", + "lodash._reinterpolate": "^3.0.0", "lodash.templatesettings": "^4.0.0" } }, "lodash.templatesettings": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/lodash.templatesettings/-/lodash.templatesettings-4.1.0.tgz", - "integrity": "sha1-K01OlbpEDZFf8IvImeRVNmZxMxY=", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lodash.templatesettings/-/lodash.templatesettings-4.2.0.tgz", + "integrity": "sha512-stgLz+i3Aa9mZgnjr/O+v9ruKZsPsndy7qPZOchbqk2cnTU1ZaldKK+v7m54WoKIyxiuMZTKT2H81F8BeAc3ZQ==", "requires": { - "lodash._reinterpolate": "~3.0.0" + "lodash._reinterpolate": "^3.0.0" } }, "lodash.throttle": { "version": "4.1.1", - "resolved": false, + "resolved": "https://registry.npmjs.org/lodash.throttle/-/lodash.throttle-4.1.1.tgz", "integrity": "sha1-wj6RtxAkKscMN/HhzaknTMOb8vQ=" }, "lodash.unescape": { @@ -8265,16 +8375,16 @@ "integrity": "sha1-0CJTc662Uq3BvILklFM5qEJ1R3M=" }, "loglevel": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.6.1.tgz", - "integrity": "sha1-4PyVEztu8nbNyIh82vJKpvFW+Po=" + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.6.3.tgz", + "integrity": "sha512-LoEDv5pgpvWgPF4kNYuIp0qqSJVWak/dML0RY74xlzMZiT9w77teNAwKYKWBTYjlokMirg+o3jBwp+vlLrcfAA==" }, "loose-envify": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz", - "integrity": "sha1-0aitM/qc4OcT1l/dCsi3SNR4yEg=", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", "requires": { - "js-tokens": "^3.0.0" + "js-tokens": "^3.0.0 || ^4.0.0" } }, "lower-case": { @@ -8356,9 +8466,9 @@ } }, "mdn-data": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-1.1.4.tgz", - "integrity": "sha512-FSYbp3lyKjyj3E7fMl6rYvUdX0FBXaluGqlFoYESWQlyUTq8R+wp0rkFxoYFqZlHCvsUXGjyJmLQSnXToYhOSA==" + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.4.tgz", + "integrity": "sha512-iV3XNKw06j5Q7mi6h+9vbx23Tv7JkjEVgKHW4pimwyDGWm0OIQntJJ+u1C6mg6mK1EaTv42XQ7w76yuzH7M2cA==" }, "media-typer": { "version": "0.3.0", @@ -8421,13 +8531,13 @@ }, "methods": { "version": "1.1.2", - "resolved": false, + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=" }, "microevent.ts": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/microevent.ts/-/microevent.ts-0.1.0.tgz", - "integrity": "sha1-OQdIuKUVCD5rY81REqPxjC/g66g=" + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/microevent.ts/-/microevent.ts-0.1.1.tgz", + "integrity": "sha512-jo1OfR4TaEwd5HOrt5+tAZ9mqT4jmpNAusXtyfNzqVm9uiSYFZlKM1wYL4oU7azZW/PxQW53wM0S6OR1JHNa2g==" }, "micromatch": { "version": "3.1.10", @@ -8466,9 +8576,9 @@ } }, "mime": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==" + "version": "2.4.4", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.4.tgz", + "integrity": "sha512-LRxmNwziLPT828z+4YkNzloCFC2YM4wrB99k+AV5ZbEyfGNWfG8SO1FUXLmLDBSo89NrJZ4DIWeLjy1CHGhMGA==" }, "mime-db": { "version": "1.40.0", @@ -8488,6 +8598,16 @@ "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==" }, + "mini-create-react-context": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/mini-create-react-context/-/mini-create-react-context-0.3.2.tgz", + "integrity": "sha512-2v+OeetEyliMt5VHMXsBhABoJ0/M4RCe7fatd/fBy6SMiKazUSEt3gxxypfnk2SHMkdBYvorHRoQxuGoiwbzAw==", + "requires": { + "@babel/runtime": "^7.4.0", + "gud": "^1.0.0", + "tiny-warning": "^1.0.2" + } + }, "mini-css-extract-plugin": { "version": "0.5.0", "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-0.5.0.tgz", @@ -8539,9 +8659,9 @@ } }, "mixin-deep": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.1.tgz", - "integrity": "sha512-8ZItLHeEgaqEvd5lYBXfm4EZSFCX29Jb9K+lAHhDKzReKBQKj3R+7NOF6tjqYi9t4oI8VUfaWITJQm86wnXGNQ==", + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", + "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", "requires": { "for-in": "^1.0.2", "is-extendable": "^1.0.1" @@ -8602,9 +8722,9 @@ } }, "ms": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", - "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==" + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, "multicast-dns": { "version": "6.2.3", @@ -8626,9 +8746,9 @@ "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=" }, "nan": { - "version": "2.13.2", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.13.2.tgz", - "integrity": "sha512-TghvYc72wlMGMVMluVo9WRJc0mB8KxxF/gZ4YYFy7V2ZQX9l7rgbPg7vjS9mt6U5HXODVFVI2bOduCzwOMv/lw==", + "version": "2.14.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.0.tgz", + "integrity": "sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg==", "optional": true }, "nanomatch": { @@ -8685,19 +8805,12 @@ } }, "node-fetch": { - "version": "1.7.1", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-1.7.1.tgz", - "integrity": "sha512-j8XsFGCLw79vWXkZtMSmmLaOk9z5SQ9bV/tkbZVCqvgwzrjAGq66igobLofHtF63NvMTp2WjytpsNTGKa+XRIQ==", + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-1.7.3.tgz", + "integrity": "sha512-NhZ4CsKx7cYm2vSrBAr2PvFOe6sWDf0UYLRqA6svUYg7+/TSfVAu49jYC4BvQ4Sms9SZgdqGBgroqfDhJdTyKQ==", "requires": { "encoding": "^0.1.11", "is-stream": "^1.0.1" - }, - "dependencies": { - "is-stream": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", - "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=" - } } }, "node-forge": { @@ -8711,9 +8824,9 @@ "integrity": "sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs=" }, "node-libs-browser": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.2.0.tgz", - "integrity": "sha512-5MQunG/oyOaBdttrL40dA7bUfPORLRWMUJLQtMg7nluxUvk5XwnLdL9twQHFAjRx/y7mIMkLKT9++qPbbk6BZA==", + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.2.1.tgz", + "integrity": "sha512-h/zcD8H9kaDZ9ALUWwlBUDo6TKF8a7qBSCSEGfjTVIYeqsioSKaAX+BN7NgiMGp6iSIXZ3PxgCu8KS3b71YK5Q==", "requires": { "assert": "^1.1.1", "browserify-zlib": "^0.2.0", @@ -8725,7 +8838,7 @@ "events": "^3.0.0", "https-browserify": "^1.0.0", "os-browserify": "^0.3.0", - "path-browserify": "0.0.0", + "path-browserify": "0.0.1", "process": "^0.11.10", "punycode": "^1.2.4", "querystring-es3": "^0.2.0", @@ -8737,7 +8850,7 @@ "tty-browserify": "0.0.0", "url": "^0.11.0", "util": "^0.11.0", - "vm-browserify": "0.0.4" + "vm-browserify": "^1.0.1" }, "dependencies": { "punycode": { @@ -8772,9 +8885,9 @@ } }, "node-releases": { - "version": "1.1.19", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.19.tgz", - "integrity": "sha512-SH/B4WwovHbulIALsQllAVwqZZD1kPmKCqrhGfR29dXjLAVZMHvBjD3S6nL9D/J9QkmZ1R92/0wCMDKXUUvyyA==", + "version": "1.1.25", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.25.tgz", + "integrity": "sha512-fI5BXuk83lKEoZDdH3gRhtsNgh05/wZacuXkgbiYkceE7+QIMXOg98n9ZV7mz27B+kFHnqHcUpscZZlGRSmTpQ==", "requires": { "semver": "^5.3.0" }, @@ -8860,7 +8973,7 @@ }, "object-assign": { "version": "4.1.1", - "resolved": false, + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" }, "object-copy": { @@ -8995,7 +9108,7 @@ }, "optimist": { "version": "0.6.1", - "resolved": false, + "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", "integrity": "sha1-2j6nRob6IaGaERwybpDrFaAZZoY=", "requires": { "minimist": "~0.0.1", @@ -9174,9 +9287,9 @@ } }, "parse5": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-5.1.0.tgz", - "integrity": "sha512-fxNG2sQjHvlVAYmzBZS9YlDp6PTSSDwa98vkD4QgVDDCAo84z5X1t5XyJQ62ImdLXx5NdIIfihey6xpum9/gRQ==" + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-4.0.0.tgz", + "integrity": "sha512-VrZ7eOd3T1Fk4XWNXMgiGBK/z0MG48BWG2uQNU4I72fkQuKUTZpl+u9k+CxEG0twMVzSmXEEz12z5Fnw1jIQFA==" }, "parseurl": { "version": "1.3.3", @@ -9189,9 +9302,9 @@ "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=" }, "path-browserify": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.0.tgz", - "integrity": "sha1-oLhwcpquIUAFt9UDLsLLuw+0RRo=" + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.1.tgz", + "integrity": "sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ==" }, "path-dirname": { "version": "1.0.2", @@ -9225,7 +9338,7 @@ }, "path-to-regexp": { "version": "1.7.0", - "resolved": false, + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.7.0.tgz", "integrity": "sha1-Wf3g9DW62suhA6hOnTvGTpa5k30=", "requires": { "isarray": "0.0.1" @@ -9266,7 +9379,7 @@ }, "performance-now": { "version": "2.1.0", - "resolved": false, + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=" }, "pify": { @@ -9364,10 +9477,15 @@ "ts-pnp": "^1.0.0" } }, + "popper.js": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/popper.js/-/popper.js-1.15.0.tgz", + "integrity": "sha512-w010cY1oCUmI+9KwwlWki+r5jxKfTFDVoadl7MSrIujHU5MJ5OR6HTDj6Xo8aoR/QsA56x8jKjA59qGH4ELtrA==" + }, "portfinder": { - "version": "1.0.20", - "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.20.tgz", - "integrity": "sha512-Yxe4mTyDzTd59PZJY4ojZR8F+E5e97iq2ZOHPz3HDgSvYC5siNad2tLooQ5y5QHyQhc3xVqvyk/eNA3wuoa7Sw==", + "version": "1.0.21", + "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.21.tgz", + "integrity": "sha512-ESabpDCzmBS3ekHbmpAIiESq3udRsCBGiBZLsC+HgBKv2ezb0R4oG+7RnYEVZ/ZCfhel5Tx3UzdNWA0Lox2QCA==", "requires": { "async": "^1.5.2", "debug": "^2.2.0", @@ -9395,9 +9513,9 @@ "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=" }, "postcss": { - "version": "7.0.16", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.16.tgz", - "integrity": "sha512-MOo8zNSlIqh22Uaa3drkdIAgUGEL+AD1ESiSdmElLUmE2uVDo1QloiT/IfW9qRw8Gw+Y/w69UVMGwbufMSftxA==", + "version": "7.0.17", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.17.tgz", + "integrity": "sha512-546ZowA+KZ3OasvQZHsbuEpysvwTZNGJv9EfyCQdsIDltPSWHAeTQ5fQy/Npi2ZDtLI3zs7Ps/p6wThErhm9fQ==", "requires": { "chalk": "^2.4.2", "source-map": "^0.6.1", @@ -9553,11 +9671,11 @@ } }, "postcss-custom-properties": { - "version": "8.0.10", - "resolved": "https://registry.npmjs.org/postcss-custom-properties/-/postcss-custom-properties-8.0.10.tgz", - "integrity": "sha512-GDL0dyd7++goDR4SSasYdRNNvp4Gqy1XMzcCnTijiph7VB27XXpJ8bW/AI0i2VSBZ55TpdGhMr37kMSpRfYD0Q==", + "version": "8.0.11", + "resolved": "https://registry.npmjs.org/postcss-custom-properties/-/postcss-custom-properties-8.0.11.tgz", + "integrity": "sha512-nm+o0eLdYqdnJ5abAJeXp4CEU1c1k+eB2yMCvhgzsds/e0umabFrN6HoTy/8Q4K5ilxERdl/JD1LO5ANoYBeMA==", "requires": { - "postcss": "^7.0.14", + "postcss": "^7.0.17", "postcss-values-parser": "^2.0.1" } }, @@ -9713,11 +9831,11 @@ } }, "postcss-initial": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/postcss-initial/-/postcss-initial-3.0.0.tgz", - "integrity": "sha512-WzrqZ5nG9R9fUtrA+we92R4jhVvEB32IIRTzfIG/PLL8UV4CvbF1ugTEHEFX6vWxl41Xt5RTCJPEZkuWzrOM+Q==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/postcss-initial/-/postcss-initial-3.0.1.tgz", + "integrity": "sha512-I2Sz83ZSHybMNh02xQDK609lZ1/QOyYeuizCjzEhlMgeV/HcDJapQiH4yTqLjZss0X6/6VvKFXUeObaHpJoINw==", "requires": { - "lodash.template": "^4.2.4", + "lodash.template": "^4.5.0", "postcss": "^7.0.2" } }, @@ -9732,25 +9850,12 @@ } }, "postcss-load-config": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-2.0.0.tgz", - "integrity": "sha512-V5JBLzw406BB8UIfsAWSK2KSwIJ5yoEIVFb4gVkXci0QdKgA24jLmHZ/ghe/GgX0lJ0/D1uUK1ejhzEY94MChQ==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-2.1.0.tgz", + "integrity": "sha512-4pV3JJVPLd5+RueiVVB+gFOAa7GWc25XQcMp86Zexzke69mKf6Nx9LRcQywdz7yZI9n1udOxmLuAwTBypypF8Q==", "requires": { - "cosmiconfig": "^4.0.0", + "cosmiconfig": "^5.0.0", "import-cwd": "^2.0.0" - }, - "dependencies": { - "cosmiconfig": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-4.0.0.tgz", - "integrity": "sha512-6e5vDdrXZD+t5v0L8CrurPeybg4Fmf+FCSYxXKYVAqLUtyCSbuyqE059d0kDthTNRzKVjL7QMgNpEUlsoYH3iQ==", - "requires": { - "is-directory": "^0.3.1", - "js-yaml": "^3.9.0", - "parse-json": "^4.0.0", - "require-from-string": "^2.0.1" - } - } } }, "postcss-loader": { @@ -10272,9 +10377,9 @@ "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=" }, "process-nextick-args": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", - "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==" + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" }, "progress": { "version": "2.0.3", @@ -10295,9 +10400,9 @@ "integrity": "sha1-mEcocL8igTL8vdhoEputEsPAKeM=" }, "prompts": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.0.4.tgz", - "integrity": "sha512-HTzM3UWp/99A0gk51gAegwo1QRYA7xjcZufMNe33rCclFszUYAuHe1fIN/3ZmiHeGPkUsNaRyQm1hHOfM0PKxA==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.1.0.tgz", + "integrity": "sha512-+x5TozgqYdOwWsQFZizE/Tra3fKvAoy037kOyU6cgz84n8f6zxngLOV4O32kTwt9FcLCxAqw0P/c8rOr9y+Gfg==", "requires": { "kleur": "^3.0.2", "sisteransi": "^1.0.0" @@ -10311,24 +10416,25 @@ "loose-envify": "^1.4.0", "object-assign": "^4.1.1", "react-is": "^16.8.1" - }, - "dependencies": { - "loose-envify": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", - "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", - "requires": { - "js-tokens": "^3.0.0 || ^4.0.0" - } - } } }, - "property-information": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/property-information/-/property-information-5.1.0.tgz", - "integrity": "sha512-tODH6R3+SwTkAQckSp2S9xyYX8dEKYkeXw+4TmJzTxnNzd6mQPu1OD4f9zPrvw/Rm4wpPgI+Zp63mNSGNzUgHg==", + "prop-types-extra": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/prop-types-extra/-/prop-types-extra-1.1.0.tgz", + "integrity": "sha512-QFyuDxvMipmIVKD2TwxLVPzMnO4e5oOf1vr3tJIomL8E7d0lr6phTHd5nkPhFIzTD1idBLLEPeylL9g+rrTzRg==", "requires": { - "xtend": "^4.0.1" + "react-is": "^16.3.2", + "warning": "^3.0.0" + }, + "dependencies": { + "warning": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/warning/-/warning-3.0.0.tgz", + "integrity": "sha1-MuU3fLVy3kqwR1O9+IIcAe1gW3w=", + "requires": { + "loose-envify": "^1.0.0" + } + } } }, "proxy-addr": { @@ -10346,9 +10452,9 @@ "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=" }, "psl": { - "version": "1.1.31", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.1.31.tgz", - "integrity": "sha512-/6pt4+C+T+wZUieKR620OpzN/LlnNKuWjy1iFLQ/UG35JqHlR/89MP1d96dUfkf6Dne3TuLQzOYEYshJ+Hx8mw==" + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.2.0.tgz", + "integrity": "sha512-GEn74ZffufCmkDDLNcl3uuyF/aSD6exEyh1v/ZSdAomB82t6G9hzJVRx0jBmLDW+VfZqks3aScmMw9DszwUalA==" }, "public-encrypt": { "version": "4.0.3", @@ -10429,9 +10535,9 @@ "integrity": "sha512-w7fLxIRCRT7U8Qu53jQnJyPkYZIaR4n5151KMfcJlO/A9397Wxb1amJvROTK6TOnp7PfoAmg/qXiNHI+08jRfA==" }, "raf": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/raf/-/raf-3.4.0.tgz", - "integrity": "sha512-pDP/NMRAXoTfrhCfyfSEwJAKLaxBU9eApMeBPB1TkDouZmvPerIClV8lTAd+uF8ZiTaVl69e1FCxQrAd/VTjGw==", + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/raf/-/raf-3.4.1.tgz", + "integrity": "sha512-Sq4CW4QhwOHE8ucn6J34MqtZCeWFP2aQSmrlroYgqAV1PjStIhJXxYuTgUIfkEk7zTLjmIjLmU5q+fbD1NnOJA==", "requires": { "performance-now": "^2.1.0" } @@ -10459,23 +10565,20 @@ "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==" }, "raw-body": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.3.3.tgz", - "integrity": "sha512-9esiElv1BrZoI3rCDuOuKCBRbuApGGaDPQfjSflGxdy4oyzqghxu6klEkkVIvBje+FF0BX9coEv8KqW6X/7njw==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz", + "integrity": "sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==", "requires": { - "bytes": "3.0.0", - "http-errors": "1.6.3", - "iconv-lite": "0.4.23", + "bytes": "3.1.0", + "http-errors": "1.7.2", + "iconv-lite": "0.4.24", "unpipe": "1.0.0" }, "dependencies": { - "iconv-lite": { - "version": "0.4.23", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.23.tgz", - "integrity": "sha512-neyTUVFtahjf0mB3dZT77u+8O0QB89jFdnBkd5P1JgYPbPaia3gXXOVL2fq8VyU2gMMD7SaN7QukTB/pmXYvDA==", - "requires": { - "safer-buffer": ">= 2.1.2 < 3" - } + "bytes": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", + "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==" } } }, @@ -10491,22 +10594,23 @@ } }, "rc-animate": { - "version": "2.8.2", - "resolved": "https://registry.npmjs.org/rc-animate/-/rc-animate-2.8.2.tgz", - "integrity": "sha512-JUKpst+OSDFQjqhhZliBcmO3Fie1SeiIxsEhS7PbZVz/UjCC8uDtp31+NRxidxy3BnfXbbfZdtG9mNWIDqIfTw==", + "version": "2.9.2", + "resolved": "https://registry.npmjs.org/rc-animate/-/rc-animate-2.9.2.tgz", + "integrity": "sha512-rkJjeJgfbDqVjVX1/QTRfS7PiCq3AnmeYo840cVcuC4pXq4k4yAQMsC2v5BPXXdawC04vnyO4/qHQdbx9ANaiw==", "requires": { "babel-runtime": "6.x", "classnames": "^2.2.6", "css-animation": "^1.3.2", "prop-types": "15.x", "raf": "^3.4.0", + "rc-util": "^4.8.0", "react-lifecycles-compat": "^3.0.4" } }, "rc-slider": { - "version": "8.6.11", - "resolved": "https://registry.npmjs.org/rc-slider/-/rc-slider-8.6.11.tgz", - "integrity": "sha512-k6dPXA7NkjSp5NCyjAJbRxnttj/U7qEMydT2Y/VY64INyoznMx968xz8s4KX1iTiTA69X7EBMD5TWM3cdsfzRg==", + "version": "8.6.13", + "resolved": "https://registry.npmjs.org/rc-slider/-/rc-slider-8.6.13.tgz", + "integrity": "sha512-fCUe8pPn8n9pq1ARX44nN2nzJoATtna4x/PdskUrxIvZXN8ja7HuceN/hq6kokZjo3FBD2B1yMZvZh6oi68l6Q==", "requires": { "babel-runtime": "6.x", "classnames": "^2.2.5", @@ -10528,26 +10632,28 @@ } }, "rc-trigger": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/rc-trigger/-/rc-trigger-2.6.2.tgz", - "integrity": "sha512-op4xCu95/gdHVaysyxxiYxbY+Z+UcIBSUY9nQfLqm1FlitdtnAN+owD5iMPfnnsRXntgcQ5+RdYKNUFQT5DjzA==", + "version": "2.6.5", + "resolved": "https://registry.npmjs.org/rc-trigger/-/rc-trigger-2.6.5.tgz", + "integrity": "sha512-m6Cts9hLeZWsTvWnuMm7oElhf+03GOjOLfTuU0QmdB9ZrW7jR2IpI5rpNM7i9MvAAlMAmTx5Zr7g3uu/aMvZAw==", "requires": { "babel-runtime": "6.x", "classnames": "^2.2.6", "prop-types": "15.x", "rc-align": "^2.4.0", "rc-animate": "2.x", - "rc-util": "^4.4.0" + "rc-util": "^4.4.0", + "react-lifecycles-compat": "^3.0.4" } }, "rc-util": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/rc-util/-/rc-util-4.6.0.tgz", - "integrity": "sha512-rbgrzm1/i8mgfwOI4t1CwWK7wGe+OwX+dNa7PVMgxZYPBADGh86eD4OcJO1UKGeajIMDUUKMluaZxvgraQIOmw==", + "version": "4.8.2", + "resolved": "https://registry.npmjs.org/rc-util/-/rc-util-4.8.2.tgz", + "integrity": "sha512-EXKOIvhMYABd4Ww1NQF++YKgzyMPz6VWvD/FIVqTUJR+3AGTuXDEzOPZ9/jMRkQcNS9aqpuRXc3Ad8cPVIMMQA==", "requires": { "add-dom-event-listener": "^1.1.0", "babel-runtime": "6.x", "prop-types": "^15.5.10", + "react-lifecycles-compat": "^3.0.4", "shallowequal": "^0.2.2" }, "dependencies": { @@ -10562,9 +10668,12 @@ } }, "re-resizable": { - "version": "4.5.1", - "resolved": "https://registry.npmjs.org/re-resizable/-/re-resizable-4.5.1.tgz", - "integrity": "sha512-amjlp4IuTSHs4XG1bP5WbAgBDIZitODKIsqcpZsNhEBYYEidol0dlP4S9zHiN3iu6Tff4WfYuruihLgN7RJeQw==" + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/re-resizable/-/re-resizable-5.0.1.tgz", + "integrity": "sha512-Iy8v5li7bhNBDxCN1DbA4l6G2Hk8NCZtcExoI1D+5pfvKyQcH8LH2P5h3DGoEfHhs0uyyRC1Qx8bHBomfrmxgA==", + "requires": { + "fast-memoize": "^2.5.1" + } }, "react": { "version": "16.8.6", @@ -10603,23 +10712,10 @@ "asap": "~2.0.6" } }, - "raf": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/raf/-/raf-3.4.1.tgz", - "integrity": "sha512-Sq4CW4QhwOHE8ucn6J34MqtZCeWFP2aQSmrlroYgqAV1PjStIhJXxYuTgUIfkEk7zTLjmIjLmU5q+fbD1NnOJA==", - "requires": { - "performance-now": "^2.1.0" - } - }, "regenerator-runtime": { "version": "0.13.2", "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.2.tgz", "integrity": "sha512-S/TQAZJO+D3m9xeN1WTI8dLKBBiRgXBlTJvbWjCThHWZj9EvHK70Ff50/tYj2J/fvBY6JtFVwRuazHN2E7M9BA==" - }, - "whatwg-fetch": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-3.0.0.tgz", - "integrity": "sha512-9GSJUgz1D4MfyKU7KRqwOjXCXTqWdFNvEr7eUBYchQiVc744mqK/MzXPNR2WsPkmkOa4ywfg8C2n8h+13Bey1Q==" } } }, @@ -10635,154 +10731,41 @@ } }, "react-bootstrap": { - "version": "0.31.5", - "resolved": "https://registry.npmjs.org/react-bootstrap/-/react-bootstrap-0.31.5.tgz", - "integrity": "sha512-xgDihgX4QvYHmHzL87faDBMDnGfYyqcrqV0TEbWY+JizePOG1vfb8M3xJN+6MJ3kUYqDtQSZ7v/Q6Y5YDrkMdA==", + "version": "1.0.0-beta.9", + "resolved": "https://registry.npmjs.org/react-bootstrap/-/react-bootstrap-1.0.0-beta.9.tgz", + "integrity": "sha512-M0BYLuuUdMITJ16+DDDb1p4vWV87csEBi/uOxZYODuDZh7hvbrJVahfvPXcqeqq4eEpNL+PKSlqb9fNaY0HZyA==", "requires": { - "babel-runtime": "^6.11.6", - "classnames": "^2.2.5", - "dom-helpers": "^3.2.0", - "invariant": "^2.2.1", - "keycode": "^2.1.2", - "prop-types": "^15.5.10", - "prop-types-extra": "^1.0.1", - "react-overlays": "^0.7.4", - "uncontrollable": "^4.1.0", - "warning": "^3.0.0" - }, - "dependencies": { - "babel-runtime": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", - "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", - "requires": { - "core-js": "^2.4.0", - "regenerator-runtime": "^0.11.0" - } - }, - "core-js": { - "version": "2.5.3", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.3.tgz", - "integrity": "sha1-isw4NFgk8W2DZbfJtCWRaOjtYD4=" - }, - "dom-helpers": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-3.3.1.tgz", - "integrity": "sha512-2Sm+JaYn74OiTM2wHvxJOo3roiq/h25Yi69Fqk269cNUwIXsCvATB6CRSFC9Am/20G2b28hGv/+7NiWydIrPvg==" - }, - "fbjs": { - "version": "0.8.16", - "resolved": "https://registry.npmjs.org/fbjs/-/fbjs-0.8.16.tgz", - "integrity": "sha1-XmdDL1UNxBtXK/VYR7ispk5TN9s=", - "requires": { - "core-js": "^1.0.0", - "isomorphic-fetch": "^2.1.1", - "loose-envify": "^1.0.0", - "object-assign": "^4.1.0", - "promise": "^7.1.1", - "setimmediate": "^1.0.5", - "ua-parser-js": "^0.7.9" - }, - "dependencies": { - "core-js": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-1.2.7.tgz", - "integrity": "sha1-ZSKUwUZR2yj6k70tX/KYOk8IxjY=" - }, - "object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" - } - } - }, - "invariant": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.2.tgz", - "integrity": "sha1-nh9WrArNtr8wMwbzOL47IErmA2A=", - "requires": { - "loose-envify": "^1.0.0" - } - }, - "keycode": { - "version": "2.1.9", - "resolved": "https://registry.npmjs.org/keycode/-/keycode-2.1.9.tgz", - "integrity": "sha1-lkojxU5IiUBbSGGlyfBIDUUUHfo=" - }, - "prop-types": { - "version": "15.6.0", - "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.6.0.tgz", - "integrity": "sha1-zq8IMCL8RrSjX2nhPvda7Q1jmFY=", - "requires": { - "fbjs": "^0.8.16", - "loose-envify": "^1.3.1", - "object-assign": "^4.1.1" - }, - "dependencies": { - "object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" - } - } - }, - "prop-types-extra": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/prop-types-extra/-/prop-types-extra-1.0.1.tgz", - "integrity": "sha1-pXvUgQ6C0no/9DF+zBtK0AX3moI=", - "requires": { - "warning": "^3.0.0" - } - }, - "react-overlays": { - "version": "0.7.4", - "resolved": "https://registry.npmjs.org/react-overlays/-/react-overlays-0.7.4.tgz", - "integrity": "sha512-7vsooMx3siLAuEfTs8FYeP/lAORWWFXTO8PON3KgX0Htq1Oa+po6ioSjGyO0/GO5CVSMNhpWt6V2opeexHgBuQ==", - "requires": { - "classnames": "^2.2.5", - "dom-helpers": "^3.2.1", - "prop-types": "^15.5.10", - "prop-types-extra": "^1.0.1", - "warning": "^3.0.0" - } - }, - "regenerator-runtime": { - "version": "0.11.1", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", - "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==" - }, - "ua-parser-js": { - "version": "0.7.17", - "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.17.tgz", - "integrity": "sha512-uRdSdu1oA1rncCQL7sCj8vSyZkgtL7faaw9Tc9rZ3mGgraQ7+Pdx7w5mnOSF3gw9ZNG6oc+KXfkon3bKuROm0g==" - }, - "uncontrollable": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/uncontrollable/-/uncontrollable-4.1.0.tgz", - "integrity": "sha1-4DWCkSUuGGUiLZCTmxny9J+Bwak=", - "requires": { - "invariant": "^2.1.0" - } - }, - "warning": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/warning/-/warning-3.0.0.tgz", - "integrity": "sha1-MuU3fLVy3kqwR1O9+IIcAe1gW3w=", - "requires": { - "loose-envify": "^1.0.0" - } - } + "@babel/runtime": "^7.4.2", + "@react-bootstrap/react-popper": "1.2.1", + "@restart/context": "^2.1.4", + "@restart/hooks": "^0.3.0", + "classnames": "^2.2.6", + "dom-helpers": "^3.4.0", + "invariant": "^2.2.4", + "keycode": "^2.2.0", + "popper.js": "^1.14.7", + "prop-types": "^15.7.2", + "prop-types-extra": "^1.1.0", + "react-overlays": "^1.2.0", + "react-transition-group": "^4.0.0", + "uncontrollable": "^6.1.0", + "warning": "^4.0.3" } }, "react-contexify": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/react-contexify/-/react-contexify-3.0.3.tgz", - "integrity": "sha512-Bk6r238FXKJptI2+bZff+JoyI1RTVW0ynv5hwlT+hrGFS81U5BGO5akzyWLXljFoJitHR20W/l6pSLasp7FeLQ==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/react-contexify/-/react-contexify-4.1.1.tgz", + "integrity": "sha512-WJeRI4ohHEOmNiH0xb62a/eV+5ae168FB7H6pfbeEVJkf0UN7D5H99l6b89poc2LHKN1gOimFjREyY8quGVsXA==", "requires": { - "classnames": "^2.2.5", - "prop-types": "^15.6.0" + "classnames": "^2.2.6", + "prop-types": "^15.6.2" } }, + "react-context-toolbox": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/react-context-toolbox/-/react-context-toolbox-2.0.2.tgz", + "integrity": "sha512-tY4j0imkYC3n5ZlYSgFkaw7fmlCp3IoQQ6DxpqeNHzcD0hf+6V+/HeJxviLUZ1Rv1Yn3N3xyO2EhkkZwHn0m1A==" + }, "react-d3": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/react-d3/-/react-d3-0.4.0.tgz", @@ -10824,6 +10807,14 @@ "text-table": "0.2.0" }, "dependencies": { + "@babel/code-frame": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.0.0.tgz", + "integrity": "sha512-OfC2uemaknXr87bdLUkWog7nYuliM9Ij5HUcajsVcMCpQrcLmtxRbVFTIqmcSkSeYRBFBRxs2FiUqFJDLdiebA==", + "requires": { + "@babel/highlight": "^7.0.0" + } + }, "ansi-regex": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", @@ -10870,48 +10861,28 @@ } }, "react-display-name": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/react-display-name/-/react-display-name-0.2.3.tgz", - "integrity": "sha1-9QIE1DDJyoGbwLreAwbpF12NGYc=" + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/react-display-name/-/react-display-name-0.2.4.tgz", + "integrity": "sha512-zvU6iouW+SWwHTyThwxGICjJYCMZFk/6r/+jmOdC7ntQoPlS/Pqb81MkxaMf2bHTSq9TN3K3zX2/ayMW/jCtyA==" }, "react-dnd": { - "version": "2.6.0", - "resolved": "http://registry.npmjs.org/react-dnd/-/react-dnd-2.6.0.tgz", - "integrity": "sha1-f6JWds+CfViokSk+PBq1naACVFo=", + "version": "9.3.2", + "resolved": "https://registry.npmjs.org/react-dnd/-/react-dnd-9.3.2.tgz", + "integrity": "sha512-3xwrd+z25CplNmO1j6BmvFlL72fK0IjW0WqCV7NCYLvKCjomZLhf3ZPAfCyCOSP9riTglnh53OV47M3ydo25ZA==", "requires": { - "disposables": "^1.0.1", - "dnd-core": "^2.6.0", - "hoist-non-react-statics": "^2.1.0", - "invariant": "^2.1.0", - "lodash": "^4.2.0", - "prop-types": "^15.5.10" - }, - "dependencies": { - "hoist-non-react-statics": { - "version": "2.5.5", - "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-2.5.5.tgz", - "integrity": "sha512-rqcy4pJo55FTTLWt+bU8ukscqHeE/e9KWvsOW2b/a3afxQZhwkQdT1rPPCJ0rYXdj4vNcasY8zHTH+jF/qStxw==" - } + "@types/hoist-non-react-statics": "^3.3.1", + "@types/shallowequal": "^1.1.1", + "dnd-core": "^9.3.2", + "hoist-non-react-statics": "^3.3.0", + "shallowequal": "^1.1.0" } }, "react-dnd-html5-backend": { - "version": "2.6.0", - "resolved": "http://registry.npmjs.org/react-dnd-html5-backend/-/react-dnd-html5-backend-2.6.0.tgz", - "integrity": "sha1-WQzRzKeEQbsnTt1XH+9MCxbdz44=", + "version": "9.3.2", + "resolved": "https://registry.npmjs.org/react-dnd-html5-backend/-/react-dnd-html5-backend-9.3.2.tgz", + "integrity": "sha512-EsQLA3fikHxkkvs6COnEdo3McJg2Q82z6EQxo7s3yqez4LAutrcp7pf5/eyW1nFDcdN3JNx2p+TrkjVjEd5exw==", "requires": { - "lodash": "^4.2.0" - } - }, - "react-dnd-scrollzone": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/react-dnd-scrollzone/-/react-dnd-scrollzone-4.0.0.tgz", - "integrity": "sha512-yu9Z/K/7Fy4MtlGYp5eoaZY+Zz+wOccWdC98IeiMvkgoEP+YsC6UCjjMoZMJdeqpi8f1j3agPb4D5uB1OCwuKg==", - "requires": { - "hoist-non-react-statics": "^1.2.0", - "lodash.throttle": "^4.0.1", - "prop-types": "^15.5.9", - "raf": "^3.2.0", - "react-display-name": "^0.2.0" + "dnd-core": "^9.3.2" } }, "react-dom": { @@ -10940,9 +10911,9 @@ "integrity": "sha512-X1Y+0jR47ImDVr54Ab6V9eGk0Hnu7fVWGeHQSOXHf/C2pF9c6uy3gef8QUeuUiWlNb0i08InPSE5a/KJzNzw1Q==" }, "react-fullscreenable": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/react-fullscreenable/-/react-fullscreenable-2.5.0.tgz", - "integrity": "sha512-z03SBarLfdZjWzK/nARyuylLBJnii1nnkCgU/JA1QOpav7lF7RbX3w+vTQ/9ZutOAo4clPXDtpYeb2xXurY6fA==", + "version": "2.5.1-0", + "resolved": "https://registry.npmjs.org/react-fullscreenable/-/react-fullscreenable-2.5.1-0.tgz", + "integrity": "sha512-E399l6uddp6IP95TtIuQH2emOHFRubKtjGBR86eH11FWGPQ6tcoG1Yajd0ZggWb+x+cDGgFtAoDTOqTMDUA+yA==", "requires": { "classnames": "^2.2.5", "fullscreen": "^1.1.1", @@ -10980,47 +10951,89 @@ "prop-types": "^15.5.6" } }, - "react-rnd": { - "version": "7.4.3", - "resolved": "https://registry.npmjs.org/react-rnd/-/react-rnd-7.4.3.tgz", - "integrity": "sha512-TLQ35nqXup7rC63qAETebbO6Znilr20CroTTeAdlYu8nvRSwB7BrmPKZhHB2GgeiSucOoeCyAA9pHPhbMpEd/Q==", + "react-overlays": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/react-overlays/-/react-overlays-1.2.0.tgz", + "integrity": "sha512-i/FCV8wR6aRaI+Kz/dpJhOdyx+ah2tN1RhT9InPrexyC4uzf3N4bNayFTGtUeQVacj57j1Mqh1CwV60/5153Iw==", "requires": { - "re-resizable": "4.5.1", - "react-draggable": "^3.0.5" + "classnames": "^2.2.6", + "dom-helpers": "^3.4.0", + "prop-types": "^15.6.2", + "prop-types-extra": "^1.1.0", + "react-context-toolbox": "^2.0.2", + "react-popper": "^1.3.2", + "uncontrollable": "^6.0.0", + "warning": "^4.0.2" } }, - "react-router": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/react-router/-/react-router-4.3.1.tgz", - "integrity": "sha512-yrvL8AogDh2X42Dt9iknk4wF4V8bWREPirFfS9gLU1huk6qK41sg7Z/1S81jjTrGHxa3B8R3J6xIkDAA6CVarg==", + "react-popper": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/react-popper/-/react-popper-1.3.3.tgz", + "integrity": "sha512-ynMZBPkXONPc5K4P5yFWgZx5JGAUIP3pGGLNs58cfAPgK67olx7fmLp+AdpZ0+GoQ+ieFDa/z4cdV6u7sioH6w==", "requires": { - "history": "^4.7.2", - "hoist-non-react-statics": "^2.5.0", - "invariant": "^2.2.4", - "loose-envify": "^1.3.1", - "path-to-regexp": "^1.7.0", + "@babel/runtime": "^7.1.2", + "create-react-context": "<=0.2.2", + "popper.js": "^1.14.4", "prop-types": "^15.6.1", - "warning": "^4.0.1" + "typed-styles": "^0.0.7", + "warning": "^4.0.2" }, "dependencies": { - "hoist-non-react-statics": { - "version": "2.5.5", - "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-2.5.5.tgz", - "integrity": "sha512-rqcy4pJo55FTTLWt+bU8ukscqHeE/e9KWvsOW2b/a3afxQZhwkQdT1rPPCJ0rYXdj4vNcasY8zHTH+jF/qStxw==" + "create-react-context": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/create-react-context/-/create-react-context-0.2.2.tgz", + "integrity": "sha512-KkpaLARMhsTsgp0d2NA/R94F/eDLbhXERdIq3LvX2biCAXcDvHYoOqHfWCHf1+OLj+HKBotLG3KqaOOf+C1C+A==", + "requires": { + "fbjs": "^0.8.0", + "gud": "^1.0.0" + } + }, + "typed-styles": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/typed-styles/-/typed-styles-0.0.7.tgz", + "integrity": "sha512-pzP0PWoZUhsECYjABgCGQlRGL1n7tOHsgwYv3oIiEpJwGhFTuty/YNeduxQYzXXa3Ge5BdT6sHYIQYpl4uJ+5Q==" } } }, - "react-router-dom": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-4.3.1.tgz", - "integrity": "sha512-c/MlywfxDdCp7EnB7YfPMOfMD3tOtIjrQlj/CKfNMBxdmpJP8xcz5P/UAFn3JbnQCNUxsHyVVqllF9LhgVyFCA==", + "react-rnd": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/react-rnd/-/react-rnd-10.0.0.tgz", + "integrity": "sha512-JLN5f17dvp8niAvNPSiPgbdXyOgMXz/0ADs8feBtE7C+lkvsfrvvzvudhGJnpe7Rd9kXW/MWEJHvkEmKkdN8aQ==", "requires": { - "history": "^4.7.2", - "invariant": "^2.2.4", + "re-resizable": "5.0.1", + "react-draggable": "3.3.0", + "tslib": "1.10.0" + } + }, + "react-router": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-5.0.1.tgz", + "integrity": "sha512-EM7suCPNKb1NxcTZ2LEOWFtQBQRQXecLxVpdsP4DW4PbbqYWeRiLyV/Tt1SdCrvT2jcyXAXmVTmzvSzrPR63Bg==", + "requires": { + "@babel/runtime": "^7.1.2", + "history": "^4.9.0", + "hoist-non-react-statics": "^3.1.0", "loose-envify": "^1.3.1", - "prop-types": "^15.6.1", - "react-router": "^4.3.1", - "warning": "^4.0.1" + "mini-create-react-context": "^0.3.0", + "path-to-regexp": "^1.7.0", + "prop-types": "^15.6.2", + "react-is": "^16.6.0", + "tiny-invariant": "^1.0.2", + "tiny-warning": "^1.0.0" + } + }, + "react-router-dom": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-5.0.1.tgz", + "integrity": "sha512-zaVHSy7NN0G91/Bz9GD4owex5+eop+KvgbxXsP/O+iW1/Ln+BrJ8QiIR5a6xNPtrdTvLkxqlDClx13QO1uB8CA==", + "requires": { + "@babel/runtime": "^7.1.2", + "history": "^4.9.0", + "loose-envify": "^1.3.1", + "prop-types": "^15.6.2", + "react-router": "5.0.1", + "tiny-invariant": "^1.0.2", + "tiny-warning": "^1.0.0" } }, "react-scripts": { @@ -11084,45 +11097,92 @@ } }, "react-sortable-tree": { - "version": "0.1.21", - "resolved": "https://registry.npmjs.org/react-sortable-tree/-/react-sortable-tree-0.1.21.tgz", - "integrity": "sha1-JqBd4gEv+kalpNsrcSdDcSV9rrg=", + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/react-sortable-tree/-/react-sortable-tree-2.6.2.tgz", + "integrity": "sha512-mYX6ByTs7fywPqTEWpEUMgtvLDVyVrkm1Tw/pOPteiLwwMnOqh1LxBwJPUJBmhU2E0P2Zvw3dhnBFL14Fe4EkA==", "requires": { - "lodash.isequal": "^4.4.0", - "prop-types": "^15.5.8", - "react-dnd": "^2.1.4", - "react-dnd-html5-backend": "^2.1.2", - "react-dnd-scrollzone": "^4.0.0", - "react-virtualized": "^9.9.0" + "frontend-collective-react-dnd-scrollzone": "^1.0.2", + "lodash.isequal": "^4.5.0", + "prop-types": "^15.6.1", + "react-dnd": "^7.3.0", + "react-dnd-html5-backend": "^7.0.1", + "react-lifecycles-compat": "^3.0.4", + "react-sortable-tree": "^2.6.0", + "react-virtualized": "^9.19.1" + }, + "dependencies": { + "dnd-core": { + "version": "7.7.0", + "resolved": "https://registry.npmjs.org/dnd-core/-/dnd-core-7.7.0.tgz", + "integrity": "sha512-+YqwflWEY1MEAEl2QiEiRaglYkCwIZryyQwximQGuTOm/ns7fS6Lg/i7OCkrtjM10D5FhArf/VUHIL4ZaRBK0g==", + "requires": { + "asap": "^2.0.6", + "invariant": "^2.2.4", + "redux": "^4.0.1" + } + }, + "react-dnd": { + "version": "7.7.0", + "resolved": "https://registry.npmjs.org/react-dnd/-/react-dnd-7.7.0.tgz", + "integrity": "sha512-anpJDKMgdXE6kXvtBFmIAe1fuaexpVy7meUyNjiTfCnjQ1mRvnttGTVvcW9fMKijsUQYadiyvzd3BRxteFuVXg==", + "requires": { + "@types/hoist-non-react-statics": "^3.3.1", + "dnd-core": "^7.7.0", + "hoist-non-react-statics": "^3.3.0", + "invariant": "^2.1.0", + "shallowequal": "^1.1.0" + } + }, + "react-dnd-html5-backend": { + "version": "7.7.0", + "resolved": "https://registry.npmjs.org/react-dnd-html5-backend/-/react-dnd-html5-backend-7.7.0.tgz", + "integrity": "sha512-JgKmWOxqorFyfGPeWV+SAPhVGFe6+LrOR24jETE9rrYZU5hCppzwK9ujjS508kWibeDvbfEgi9j5qC2wB1/MoQ==", + "requires": { + "dnd-core": "^7.7.0" + } + } } }, "react-svg-pan-zoom": { - "version": "2.18.0", - "resolved": "https://registry.npmjs.org/react-svg-pan-zoom/-/react-svg-pan-zoom-2.18.0.tgz", - "integrity": "sha1-HwM9nbHIK5u0lOIZYjcnb2lOesk=", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/react-svg-pan-zoom/-/react-svg-pan-zoom-3.1.0.tgz", + "integrity": "sha512-hmDUarqhNnCwuZumV9Pw7o5inW7lda4sX2U1vDK2B2slrSfNu1jbelOp6aaOEyUF7WzMA1xrpH6NBWvk4UeUTQ==", "requires": { - "prop-types": "^15.6.2", - "transformation-matrix": "^1.12.0" + "prop-types": "^15.7.2", + "transformation-matrix": "^2.0.0" } }, "react-textarea-autosize": { "version": "6.1.0", - "resolved": "http://registry.npmjs.org/react-textarea-autosize/-/react-textarea-autosize-6.1.0.tgz", + "resolved": "https://registry.npmjs.org/react-textarea-autosize/-/react-textarea-autosize-6.1.0.tgz", "integrity": "sha512-F6bI1dgib6fSvG8so1HuArPUv+iVEfPliuLWusLF+gAKz0FbB4jLrWUrTAeq1afnPT2c9toEZYUdz/y1uKMy4A==", "requires": { "prop-types": "^15.6.0" } }, - "react-virtualized": { - "version": "9.9.0", - "resolved": "https://registry.npmjs.org/react-virtualized/-/react-virtualized-9.9.0.tgz", - "integrity": "sha512-TDe2haZiFr5apN3myuumGyeJ7iqHcGcQ648tfNf9x+R6tkE1+o8yAmeh4nKC4ldcs9My1dOHN3x/lmEX9LyOLA==", + "react-transition-group": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-4.2.1.tgz", + "integrity": "sha512-IXrPr93VzCPupwm2O6n6C2kJIofJ/Rp5Ltihhm9UfE8lkuVX2ng/SUUl/oWjblybK9Fq2Io7LGa6maVqPB762Q==", "requires": { - "babel-runtime": "^6.11.6", - "classnames": "^2.2.3", + "@babel/runtime": "^7.4.5", + "dom-helpers": "^3.4.0", + "loose-envify": "^1.4.0", + "prop-types": "^15.6.2" + } + }, + "react-virtualized": { + "version": "9.21.1", + "resolved": "https://registry.npmjs.org/react-virtualized/-/react-virtualized-9.21.1.tgz", + "integrity": "sha512-E53vFjRRMCyUTEKuDLuGH1ld/9TFzjf/fFW816PE4HFXWZorESbSTYtiZz1oAjra0MminaUU1EnvUxoGuEFFPA==", + "requires": { + "babel-runtime": "^6.26.0", + "clsx": "^1.0.1", "dom-helpers": "^2.4.0 || ^3.0.0", + "linear-layout-vector": "0.0.1", "loose-envify": "^1.3.0", - "prop-types": "^15.5.4" + "prop-types": "^15.6.0", + "react-lifecycles-compat": "^3.0.4" } }, "read-pkg": { @@ -11185,14 +11245,12 @@ } }, "redux": { - "version": "3.7.2", - "resolved": "https://registry.npmjs.org/redux/-/redux-3.7.2.tgz", - "integrity": "sha512-pNqnf9q1hI5HHZRBkj3bAngGZW/JMCmexDlOxw4XagXY2o1327nHH54LoTjiPJ0gizoqPDRqWyX/00g0hD6w+A==", + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/redux/-/redux-4.0.4.tgz", + "integrity": "sha512-vKv4WdiJxOWKxK0yRoaK3Y4pxxB0ilzVx6dszU2W8wLxlb2yikRph4iV/ymtdJ6ZxpBLFbyrxklnT5yBbQSl3Q==", "requires": { - "lodash": "^4.2.1", - "lodash-es": "^4.2.1", - "loose-envify": "^1.1.0", - "symbol-observable": "^1.0.3" + "loose-envify": "^1.4.0", + "symbol-observable": "^1.2.0" } }, "regenerate": { @@ -11214,9 +11272,9 @@ "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==" }, "regenerator-transform": { - "version": "0.13.4", - "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.13.4.tgz", - "integrity": "sha512-T0QMBjK3J0MtxjPmdIMXm72Wvj2Abb0Bd4HADdfijwMdoIsyQZ6fWC7kDFhk2YinBBEMZDL7Y7wh0J1sGx3S4A==", + "version": "0.14.1", + "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.14.1.tgz", + "integrity": "sha512-flVuee02C3FKRISbxhXl9mGzdbWUVHubl1SMaknjxkFB1/iqpJhArQUvRxOOPEc/9tAiX0BaQ28FJH10E4isSQ==", "requires": { "private": "^0.1.6" } @@ -11231,9 +11289,9 @@ } }, "regexp-tree": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/regexp-tree/-/regexp-tree-0.1.6.tgz", - "integrity": "sha512-LFrA98Dw/heXqDojz7qKFdygZmFoiVlvE1Zp7Cq2cvF+ZA+03Gmhy0k0PQlsC1jvHPiTUSs+pDHEuSWv6+6D7w==" + "version": "0.1.11", + "resolved": "https://registry.npmjs.org/regexp-tree/-/regexp-tree-0.1.11.tgz", + "integrity": "sha512-7/l/DgapVVDzZobwMCCgMlqiqyLFJ0cduo/j+3BcDJIB+yJdsYCfKuI3l/04NV+H/rfNRdPIDbXNZHM9XvQatg==" }, "regexpp": { "version": "2.0.1", @@ -11273,16 +11331,6 @@ } } }, - "rehype-parse": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/rehype-parse/-/rehype-parse-6.0.0.tgz", - "integrity": "sha512-V2OjMD0xcSt39G4uRdMTqDXXm6HwkUbLMDayYKA/d037j8/OtVSQ+tqKwYWOuyBeoCs/3clXRe30VUjeMDTBSA==", - "requires": { - "hast-util-from-parse5": "^5.0.0", - "parse5": "^5.0.0", - "xtend": "^4.0.1" - } - }, "relateurl": { "version": "0.2.7", "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz", @@ -11350,11 +11398,6 @@ "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=" }, - "replace-ext": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-1.0.0.tgz", - "integrity": "sha1-3mMSg3P8v3w8z6TeWkgMRaZ5WOs=" - }, "request": { "version": "2.88.0", "resolved": "https://registry.npmjs.org/request/-/request-2.88.0.tgz", @@ -11421,11 +11464,6 @@ "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=" }, - "require-from-string": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", - "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==" - }, "require-main-filename": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", @@ -11514,9 +11552,9 @@ } }, "rsvp": { - "version": "4.8.4", - "resolved": "https://registry.npmjs.org/rsvp/-/rsvp-4.8.4.tgz", - "integrity": "sha512-6FomvYPfs+Jy9TfXmBpBuMWNH94SgCsZmJKcanySzgNNP6LjWxBvyLTa9KaMfDDM5oxRfrKDB0r/qeRsLwnBfA==" + "version": "4.8.5", + "resolved": "https://registry.npmjs.org/rsvp/-/rsvp-4.8.5.tgz", + "integrity": "sha512-nfMOlASu9OnRJo1mbEk2cz0D56a1MBNrJ7orjRZQG10XDyuvwksKbuXNp6qa+kbn839HwjwhBzhFmdsaEAfauA==" }, "run-async": { "version": "2.3.0", @@ -11650,11 +11688,11 @@ "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==" }, "saxes": { - "version": "3.1.9", - "resolved": "https://registry.npmjs.org/saxes/-/saxes-3.1.9.tgz", - "integrity": "sha512-FZeKhJglhJHk7eWG5YM0z46VHmI3KJpMBAQm3xa9meDvd+wevB5GuBB0wc0exPInZiBBHqi00DbS8AcvCGCFMw==", + "version": "3.1.11", + "resolved": "https://registry.npmjs.org/saxes/-/saxes-3.1.11.tgz", + "integrity": "sha512-Ydydq3zC+WYDJK1+gRxRapLIED9PWeSuuS41wqyoRmzvhhh9nc+QQrVMKJYzJFULazeGhzSV0QleN2wD3boh2g==", "requires": { - "xmlchars": "^1.3.1" + "xmlchars": "^2.1.1" } }, "scheduler": { @@ -11695,9 +11733,9 @@ "integrity": "sha512-0UewU+9rFapKFnlbirLi3byoOuhrSsli/z/ihNnvM24vgF+8sNBiI1LZPBSH9wJKUwaUbw+s3hToDLCXkrghrQ==" }, "send": { - "version": "0.16.2", - "resolved": "https://registry.npmjs.org/send/-/send-0.16.2.tgz", - "integrity": "sha512-E64YFPUssFHEFBvpbbjr44NCLtI1AohxQ8ZSiJjQLskAdKuriYEP6VyGEsRDH8ScozGpkaX1BGvhanqCwkcEZw==", + "version": "0.17.1", + "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz", + "integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==", "requires": { "debug": "2.6.9", "depd": "~1.1.2", @@ -11706,12 +11744,12 @@ "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", + "http-errors": "~1.7.2", + "mime": "1.6.0", + "ms": "2.1.1", "on-finished": "~2.3.0", - "range-parser": "~1.2.0", - "statuses": "~1.4.0" + "range-parser": "~1.2.1", + "statuses": "~1.5.0" }, "dependencies": { "debug": { @@ -11720,17 +11758,24 @@ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "requires": { "ms": "2.0.0" + }, + "dependencies": { + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + } } }, "mime": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.4.1.tgz", - "integrity": "sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ==" + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==" }, "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==" } } }, @@ -11761,22 +11806,43 @@ "ms": "2.0.0" } }, + "http-errors": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", + "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=", + "requires": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.0", + "statuses": ">= 1.4.0 < 2" + } + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + }, "ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "setprototypeof": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", + "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==" } } }, "serve-static": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.13.2.tgz", - "integrity": "sha512-p/tdJrO4U387R9oMjb1oj7qSMaMfmOyd4j9hOFoxZe2baQszgHcSWjuya/CiT5kgZZKRudHNOA0pYXOl8rQ5nw==", + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz", + "integrity": "sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==", "requires": { "encodeurl": "~1.0.2", "escape-html": "~1.0.3", - "parseurl": "~1.3.2", - "send": "0.16.2" + "parseurl": "~1.3.3", + "send": "0.17.1" } }, "set-blocking": { @@ -11790,9 +11856,9 @@ "integrity": "sha1-SysbJ+uAip+NzEgaWOXlb1mfP2E=" }, "set-value": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.0.tgz", - "integrity": "sha512-hw0yxk9GT/Hr5yJEYnHNKYXkIA8mVJgd9ditYZCe16ZczcaELYYcfvaXesNACk2O8O0nTiPQcQhGUQj8JLzeeg==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", + "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==", "requires": { "extend-shallow": "^2.0.1", "is-extendable": "^0.1.1", @@ -11816,9 +11882,9 @@ "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=" }, "setprototypeof": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", - "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==" + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", + "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==" }, "sha.js": { "version": "2.4.11", @@ -11840,11 +11906,6 @@ "mixin-object": "^2.0.1" }, "dependencies": { - "is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" - }, "kind-of": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-2.0.1.tgz", @@ -11915,9 +11976,9 @@ } }, "sisteransi": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.0.tgz", - "integrity": "sha512-N+z4pHB4AmUv0SjveWRd6q1Nj5w62m5jodv+GD8lvmbY/83T/rpbJGZOnK5T149OldDj4Db07BSv9xY4K6NTPQ==" + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.2.tgz", + "integrity": "sha512-ZcYcZcT69nSLAR2oLN2JwNmLkJEKGooFMCdvOkFrToUt/WfcRWqhIg4P4KwY4dmLbuyXIx4o4YmPsvMRJYJd/w==" }, "slash": { "version": "2.0.0", @@ -12122,11 +12183,6 @@ "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz", "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=" }, - "space-separated-tokens": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-1.1.4.tgz", - "integrity": "sha512-UyhMSmeIqZrQn2UdjYpxEkwY9JUrn8pP+7L4f91zRzOQuI8MF1FGLfYU9DKCYeLdo7LXMxwrX5zKFy7eeeVHuA==" - }, "spdx-correct": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.0.tgz", @@ -12151,9 +12207,9 @@ } }, "spdx-license-ids": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.4.tgz", - "integrity": "sha512-7j8LYJLeY/Yb6ACbQ7F76qy5jHkp0U6jgBfJsk97bwWlVUnUWsAgpyaCvo17h0/RQGnQ036tVDomiwoI4pDkQA==" + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.5.tgz", + "integrity": "sha512-J+FWzZoynJEXGphVIS+XEh3kFSjZX/1i9gFBaWQcB+/tmpe2qUsSBABpcxqxnAxFdiUFEgAX1bjYGQvIZmoz9Q==" }, "spdy": { "version": "4.0.0", @@ -12181,9 +12237,9 @@ }, "dependencies": { "readable-stream": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.3.0.tgz", - "integrity": "sha512-EsI+s3k3XsW+fU8fQACLN59ky34AZ14LoeVZpYwmZvldCFo0r0gnelwF2TcMjLor/BTL5aDJVBMkss0dthToPw==", + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.4.0.tgz", + "integrity": "sha512-jItXPLmrSR8jmTRmRWJXCnGJsfy85mB3Wd/uINMXA65yrnFo0cPClFIUWzo2najVNSl+mx7/4W8ttlLWJe99pQ==", "requires": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", @@ -12259,9 +12315,9 @@ } }, "statuses": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz", - "integrity": "sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew==" + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=" }, "stealthy-require": { "version": "1.1.1", @@ -12403,34 +12459,42 @@ } }, "superagent": { - "version": "3.8.3", - "resolved": "https://registry.npmjs.org/superagent/-/superagent-3.8.3.tgz", - "integrity": "sha512-GLQtLMCoEIK4eDv6OGtkOoSMt3D+oq0y3dsxMuYuDvaNUvuT8eFBuLmfR0iYYzHC1e8hpzC6ZsxbuP6DIalMFA==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/superagent/-/superagent-5.1.0.tgz", + "integrity": "sha512-7V6JVx5N+eTL1MMqRBX0v0bG04UjrjAvvZJTF/VDH/SH2GjSLqlrcYepFlpTrXpm37aSY6h3GGVWGxXl/98TKA==", "requires": { - "component-emitter": "^1.2.0", - "cookiejar": "^2.1.0", - "debug": "^3.1.0", - "extend": "^3.0.0", - "form-data": "^2.3.1", - "formidable": "^1.2.0", - "methods": "^1.1.1", - "mime": "^1.4.1", - "qs": "^6.5.1", - "readable-stream": "^2.3.5" + "component-emitter": "^1.3.0", + "cookiejar": "^2.1.2", + "debug": "^4.1.1", + "fast-safe-stringify": "^2.0.6", + "form-data": "^2.3.3", + "formidable": "^1.2.1", + "methods": "^1.1.2", + "mime": "^2.4.4", + "qs": "^6.7.0", + "readable-stream": "^3.4.0", + "semver": "^6.1.1" }, "dependencies": { - "debug": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", - "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "qs": { + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", + "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==" + }, + "readable-stream": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.4.0.tgz", + "integrity": "sha512-jItXPLmrSR8jmTRmRWJXCnGJsfy85mB3Wd/uINMXA65yrnFo0cPClFIUWzo2najVNSl+mx7/4W8ttlLWJe99pQ==", "requires": { - "ms": "^2.1.1" + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" } }, - "ms": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", - "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==" + "semver": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.2.0.tgz", + "integrity": "sha512-jdFC1VdUGT/2Scgbimf7FSx9iJLXoqfglSF+gJeuNWVpiE37OIbc1jywR/GJyFdz3mnkz2/id0L0J/cr0izR5A==" } } }, @@ -12442,17 +12506,21 @@ "has-flag": "^3.0.0" } }, + "svg-parser": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/svg-parser/-/svg-parser-2.0.1.tgz", + "integrity": "sha512-8eUnCsU2sc2hyfvjK++zi5u24a2UQIB2DK9GY/cprGlaDr7SIhm9F0m9CkGYOnOgrK3iTUSnJ7M1DTLqqZt96g==" + }, "svgo": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/svgo/-/svgo-1.2.2.tgz", - "integrity": "sha512-rAfulcwp2D9jjdGu+0CuqlrAUin6bBWrpoqXWwKDZZZJfXcUXQSxLJOFJCQCSA0x0pP2U0TxSlJu2ROq5Bq6qA==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/svgo/-/svgo-1.3.0.tgz", + "integrity": "sha512-MLfUA6O+qauLDbym+mMZgtXCGRfIxyQoeH6IKVcFslyODEe/ElJNwr0FohQ3xG4C6HK6bk3KYPPXwHVJk3V5NQ==", "requires": { "chalk": "^2.4.1", "coa": "^2.0.2", "css-select": "^2.0.0", "css-select-base-adapter": "^0.1.1", - "css-tree": "1.0.0-alpha.28", - "css-url-regex": "^1.1.0", + "css-tree": "1.0.0-alpha.33", "csso": "^3.5.1", "js-yaml": "^3.13.1", "mkdirp": "~0.5.1", @@ -12469,17 +12537,17 @@ "integrity": "sha512-e900nM8RRtGhlV36KGEU9k65K3mPb1WV70OdjfxlG2EAuM1noi/E/BaW/uMhL7bPEssK8QV57vN3esixjUvcXQ==" }, "symbol-tree": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.2.tgz", - "integrity": "sha1-rifbOPZgp64uHDt9G8KQgZuFGeY=" + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", + "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==" }, "table": { - "version": "5.3.3", - "resolved": "https://registry.npmjs.org/table/-/table-5.3.3.tgz", - "integrity": "sha512-3wUNCgdWX6PNpOe3amTTPWPuF6VGvgzjKCaO1snFj0z7Y3mUPWf5+zDtxUVGispJkDECPmR29wbzh6bVMOHbcw==", + "version": "5.4.4", + "resolved": "https://registry.npmjs.org/table/-/table-5.4.4.tgz", + "integrity": "sha512-IIfEAUx5QlODLblLrGTTLJA7Tk0iLSGBvgY8essPRVNGHAzThujww1YqHLs6h3HfTg55h++RzLHH5Xw/rfv+mg==", "requires": { - "ajv": "^6.9.1", - "lodash": "^4.17.11", + "ajv": "^6.10.2", + "lodash": "^4.17.14", "slice-ansi": "^2.1.0", "string-width": "^3.0.0" }, @@ -12593,14 +12661,14 @@ "integrity": "sha1-QFQRqOfmM5/mTbmiNN4R3DHgK9Q=" }, "tiny-invariant": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.0.4.tgz", - "integrity": "sha512-lMhRd/djQJ3MoaHEBrw8e2/uM4rs9YMNk0iOr8rHQ0QdbM7D4l0gFl3szKdeixrlyfm9Zqi4dxHCM2qVG8ND5g==" + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.0.6.tgz", + "integrity": "sha512-FOyLWWVjG+aC0UqG76V53yAWdXfH8bO6FNmyZOuUrzDzK8DI3/JRY25UD7+g49JWM1LXwymsKERB+DzI0dTEQA==" }, "tiny-warning": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/tiny-warning/-/tiny-warning-1.0.2.tgz", - "integrity": "sha512-rru86D9CpQRLvsFG5XFdy0KdLAvjdQDyZCsRcuu60WtzFylDM3eAWSxEVz5kzL2Gp544XiUvPbVKtOA/txLi9Q==" + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/tiny-warning/-/tiny-warning-1.0.3.tgz", + "integrity": "sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA==" }, "tmp": { "version": "0.0.33", @@ -12653,6 +12721,11 @@ "repeat-string": "^1.6.1" } }, + "toidentifier": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", + "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==" + }, "tough-cookie": { "version": "2.5.0", "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", @@ -12671,34 +12744,29 @@ } }, "transformation-matrix": { - "version": "1.15.3", - "resolved": "https://registry.npmjs.org/transformation-matrix/-/transformation-matrix-1.15.3.tgz", - "integrity": "sha512-ThJH58GNFKhCw3gIoOtwf3tNwuYjbyEeiGdeq4mNMYWdJctnI896KUqn6PVt7jmNVepqa1bcKQtnMB1HtjsDMA==" + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/transformation-matrix/-/transformation-matrix-2.0.5.tgz", + "integrity": "sha512-S6L67Z8V3WEyPm2/zDh3I3bO0OQwv88dh7IY2dIOVBfIZJ4WQGdEKOsh7phTgYkvfAmHRxfOPNt1ixN/zR6D/A==" }, "trim-right": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz", "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=" }, - "trough": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/trough/-/trough-1.0.4.tgz", - "integrity": "sha512-tdzBRDGWcI1OpPVmChbdSKhvSVurznZ8X36AYURAcl+0o2ldlCY2XPzyXNNxwJwwyIU+rIglTCG4kxtNKBQH7Q==" - }, "ts-pnp": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/ts-pnp/-/ts-pnp-1.1.2.tgz", "integrity": "sha512-f5Knjh7XCyRIzoC/z1Su1yLLRrPrFCgtUAh/9fCSP6NKbATwpOL1+idQVXQokK9GRFURn/jYPGPfegIctwunoA==" }, "tslib": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.9.3.tgz", - "integrity": "sha512-4krF8scpejhaOgqzBEcGM7yDIEfi0/8+8zDRZhNZZ2kjmHJ4hv3zCbQWxoJGz1iw5U0Jl0nma13xzHXcncMavQ==" + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.10.0.tgz", + "integrity": "sha512-qOebF53frne81cf0S9B41ByenJ3/IuH8yJKngAX35CmiZySA0khhkovshKK+jGCaMnVomla7gVlIcc3EvKPbTQ==" }, "tsutils": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.10.0.tgz", - "integrity": "sha512-q20XSMq7jutbGB8luhKKsQldRKWvyBO2BGqni3p4yq8Ys9bEP/xQw3KepKmMRt9gJ4lvQSScrihJrcKdKoSU7Q==", + "version": "3.14.0", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.14.0.tgz", + "integrity": "sha512-SmzGbB0l+8I0QwsPgjooFRaRvHLBLNYM8SeQ0k6rtNDru5sCGeLJcZdwilNndN+GysuFjF5EIYgN8GfFG6UeUw==", "requires": { "tslib": "^1.8.1" } @@ -12744,26 +12812,45 @@ "mime-types": "~2.1.24" } }, + "typed-styles": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/typed-styles/-/typed-styles-0.0.5.tgz", + "integrity": "sha512-ht+rEe5UsdEBAa3gr64+QjUOqjOLJfWLvl5HZR5Ev9uo/OnD3p43wPeFSB1hNFc13GXQF/JU1Bn0YHLUqBRIlw==" + }, "typedarray": { "version": "0.0.6", "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=" }, + "typescript": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.5.3.tgz", + "integrity": "sha512-ACzBtm/PhXBDId6a6sDJfroT2pOWt/oOnk4/dElG5G33ZL776N3Y6/6bKZJBFpd+b05F3Ct9qDjMeJmRWtE2/g==" + }, "ua-parser-js": { - "version": "0.7.17", - "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.17.tgz", - "integrity": "sha512-uRdSdu1oA1rncCQL7sCj8vSyZkgtL7faaw9Tc9rZ3mGgraQ7+Pdx7w5mnOSF3gw9ZNG6oc+KXfkon3bKuROm0g==" + "version": "0.7.20", + "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.20.tgz", + "integrity": "sha512-8OaIKfzL5cpx8eCMAhhvTlft8GYF8b2eQr6JkCyVdrgjcytyOmPCXrqXFcUnhonRpLlh5yxEZVohm6mzaowUOw==" }, "uglify-js": { - "version": "3.5.12", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.5.12.tgz", - "integrity": "sha512-KeQesOpPiZNgVwJj8Ge3P4JYbQHUdZzpx6Fahy6eKAYRSV4zhVmLXoC+JtOeYxcHCHTve8RG1ZGdTvpeOUM26Q==", + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.6.0.tgz", + "integrity": "sha512-W+jrUHJr3DXKhrsS7NUVxn3zqMOFn0hL/Ei6v0anCIMoKC93TjcflTagwIHLW7SfMFfiQuktQyFVCFHGUE0+yg==", "optional": true, "requires": { "commander": "~2.20.0", "source-map": "~0.6.1" } }, + "uncontrollable": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/uncontrollable/-/uncontrollable-6.2.3.tgz", + "integrity": "sha512-VgOAoBU2ptCL2bfTG2Mra0I8i1u6Aq84AFonD5tmCAYSfs3hWvr2Rlw0q2ntoxXTHjcQOmZOh3FKaN+UZVyREQ==", + "requires": { + "@babel/runtime": "^7.4.5", + "invariant": "^2.2.4" + } + }, "unicode-canonical-property-names-ecmascript": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz", @@ -12788,64 +12875,15 @@ "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-1.0.5.tgz", "integrity": "sha512-L5RAqCfXqAwR3RriF8pM0lU0w4Ryf/GgzONwi6KnL1taJQa7x1TCxdJnILX59WIGOwR57IVxn7Nej0fz1Ny6fw==" }, - "unified": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/unified/-/unified-7.1.0.tgz", - "integrity": "sha512-lbk82UOIGuCEsZhPj8rNAkXSDXd6p0QLzIuSsCdxrqnqU56St4eyOB+AlXsVgVeRmetPTYydIuvFfpDIed8mqw==", - "requires": { - "@types/unist": "^2.0.0", - "@types/vfile": "^3.0.0", - "bail": "^1.0.0", - "extend": "^3.0.0", - "is-plain-obj": "^1.1.0", - "trough": "^1.0.0", - "vfile": "^3.0.0", - "x-is-string": "^0.1.0" - }, - "dependencies": { - "vfile": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/vfile/-/vfile-3.0.1.tgz", - "integrity": "sha512-y7Y3gH9BsUSdD4KzHsuMaCzRjglXN0W2EcMf0gpvu6+SbsGhMje7xDc8AEoeXy6mIwCKMI6BkjMsRjzQbhMEjQ==", - "requires": { - "is-buffer": "^2.0.0", - "replace-ext": "1.0.0", - "unist-util-stringify-position": "^1.0.0", - "vfile-message": "^1.0.0" - } - } - } - }, "union-value": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.0.tgz", - "integrity": "sha1-XHHDTLW61dzr4+oM0IIHulqhrqQ=", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", + "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==", "requires": { "arr-union": "^3.1.0", "get-value": "^2.0.6", "is-extendable": "^0.1.1", - "set-value": "^0.4.3" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "requires": { - "is-extendable": "^0.1.0" - } - }, - "set-value": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/set-value/-/set-value-0.4.3.tgz", - "integrity": "sha1-fbCPnT0i3H945Trzw79GZuzfzPE=", - "requires": { - "extend-shallow": "^2.0.1", - "is-extendable": "^0.1.1", - "is-plain-object": "^2.0.1", - "to-object-path": "^0.3.0" - } - } + "set-value": "^2.0.1" } }, "uniq": { @@ -12867,18 +12905,13 @@ } }, "unique-slug": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.1.tgz", - "integrity": "sha512-n9cU6+gITaVu7VGj1Z8feKMmfAjEAQGhwD9fE3zvpRRa0wEIx8ODYkVGfSc94M2OX00tUFV8wH3zYbm1I8mxFg==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.2.tgz", + "integrity": "sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==", "requires": { "imurmurhash": "^0.1.4" } }, - "unist-util-stringify-position": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-1.1.2.tgz", - "integrity": "sha512-pNCVrk64LZv1kElr0N1wPiHEUoXNVFERp+mlTg/s9R5Lwg87f9bM/3sQB99w+N9D/qnM9ar3+AKDBwo/gm/iQQ==" - }, "universalify": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", @@ -12977,13 +13010,6 @@ "loader-utils": "^1.1.0", "mime": "^2.0.3", "schema-utils": "^1.0.0" - }, - "dependencies": { - "mime": { - "version": "2.4.3", - "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.3.tgz", - "integrity": "sha512-QgrPRJfE+riq5TPZMcHZOtm8c6K/yYrMbKIoRfapfiGLxS8OTeIfRhUGW5LU7MlRa52KOAGCfUNruqLrIBvWZw==" - } } }, "url-parse": { @@ -13006,11 +13032,18 @@ "integrity": "sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ==", "requires": { "inherits": "2.0.3" + }, + "dependencies": { + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + } } }, "util-deprecate": { "version": "1.0.2", - "resolved": false, + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" }, "util.promisify": { @@ -13047,9 +13080,9 @@ } }, "validator": { - "version": "10.11.0", - "resolved": "https://registry.npmjs.org/validator/-/validator-10.11.0.tgz", - "integrity": "sha512-X/p3UZerAIsbBfN/IwahhYaBbY68EN/UQBWHtsbXGT5bfrH/p4NQzUCG1kF/rtKaNpnJ7jAu6NGTdSNtyNIXMw==" + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/validator/-/validator-11.1.0.tgz", + "integrity": "sha512-qiQ5ktdO7CD6C/5/mYV4jku/7qnqzjrxb3C/Q5wR3vGGinHTgJZN/TdFT3ZX4vXhX2R1PXx42fB1cn5W+uJ4lg==" }, "value-equal": { "version": "0.4.0", @@ -13076,59 +13109,10 @@ "extsprintf": "^1.2.0" } }, - "vfile": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/vfile/-/vfile-4.0.0.tgz", - "integrity": "sha512-WMNeHy5djSl895BqE86D7WqA0Ie5fAIeGCa7V1EqiXyJg5LaGch2SUaZueok5abYQGH6mXEAsZ45jkoILIOlyA==", - "requires": { - "@types/unist": "^2.0.2", - "is-buffer": "^2.0.0", - "replace-ext": "1.0.0", - "unist-util-stringify-position": "^2.0.0", - "vfile-message": "^2.0.0" - }, - "dependencies": { - "unist-util-stringify-position": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-2.0.0.tgz", - "integrity": "sha512-Uz5negUTrf9zm2ZT2Z9kdOL7Mr7FJLyq3ByqagUi7QZRVK1HnspVazvSqwHt73jj7APHtpuJ4K110Jm8O6/elw==", - "requires": { - "@types/unist": "^2.0.2" - } - }, - "vfile-message": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-2.0.0.tgz", - "integrity": "sha512-YS6qg6UpBfIeiO+6XlhPOuJaoLvt1Y9g2cmlwqhBOOU0XRV8j5RLeoz72t6PWLvNXq3EBG1fQ05wNPrUoz0deQ==", - "requires": { - "@types/unist": "^2.0.2", - "unist-util-stringify-position": "^1.1.1" - }, - "dependencies": { - "unist-util-stringify-position": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-1.1.2.tgz", - "integrity": "sha512-pNCVrk64LZv1kElr0N1wPiHEUoXNVFERp+mlTg/s9R5Lwg87f9bM/3sQB99w+N9D/qnM9ar3+AKDBwo/gm/iQQ==" - } - } - } - } - }, - "vfile-message": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-1.1.1.tgz", - "integrity": "sha512-1WmsopSGhWt5laNir+633LszXvZ+Z/lxveBf6yhGsqnQIhlhzooZae7zV6YVM1Sdkw68dtAW3ow0pOdPANugvA==", - "requires": { - "unist-util-stringify-position": "^1.1.1" - } - }, "vm-browserify": { - "version": "0.0.4", - "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-0.0.4.tgz", - "integrity": "sha1-XX6kW7755Kb/ZflUOOCofDV9WnM=", - "requires": { - "indexof": "0.0.1" - } + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.0.tgz", + "integrity": "sha512-iq+S7vZJE60yejDYM0ek6zg308+UZsdtPExWP9VZoCFCz1zkJoXFnAX7aZfd/ZwrkidzdUZL0C/ryW+JwAiIGw==" }, "w3c-hr-time": { "version": "1.0.1", @@ -13182,11 +13166,6 @@ "minimalistic-assert": "^1.0.0" } }, - "web-namespaces": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/web-namespaces/-/web-namespaces-1.1.3.tgz", - "integrity": "sha512-r8sAtNmgR0WKOKOxzuSgk09JsHlpKlB+uHi937qypOu3PZ17UxPrierFKDye/uNHjNTTEshu5PId8rojIPj/tA==" - }, "webidl-conversions": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz", @@ -13232,13 +13211,6 @@ "mime": "^2.4.2", "range-parser": "^1.2.1", "webpack-log": "^2.0.0" - }, - "dependencies": { - "mime": { - "version": "2.4.3", - "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.3.tgz", - "integrity": "sha512-QgrPRJfE+riq5TPZMcHZOtm8c6K/yYrMbKIoRfapfiGLxS8OTeIfRhUGW5LU7MlRa52KOAGCfUNruqLrIBvWZw==" - } } }, "webpack-dev-server": { @@ -13380,11 +13352,12 @@ } }, "websocket-driver": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.0.tgz", - "integrity": "sha1-DK+dLXVdk67gSdS90NP+LMoqJOs=", + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.3.tgz", + "integrity": "sha512-bpxWlvbbB459Mlipc5GBzzZwhoZgGEZLuqPaR0INBGnPAY1vdBX6hPnoFXiw+3yWxDuHyQjO2oXTMyS8A5haFg==", "requires": { - "http-parser-js": ">=0.4.0", + "http-parser-js": ">=0.4.0 <0.4.11", + "safe-buffer": ">=5.1.0", "websocket-extensions": ">=0.1.1" } }, @@ -13402,9 +13375,9 @@ } }, "whatwg-fetch": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-2.0.3.tgz", - "integrity": "sha512-SA2KdOXATOroD3EBUYvcdugsusXS5YiQFqwskSbsp5b1gK8HpNi/YP0jcy/BDpdllp305HMnrsVf9K7Be9GiEQ==" + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-3.0.0.tgz", + "integrity": "sha512-9GSJUgz1D4MfyKU7KRqwOjXCXTqWdFNvEr7eUBYchQiVc744mqK/MzXPNR2WsPkmkOa4ywfg8C2n8h+13Bey1Q==" }, "whatwg-mimetype": { "version": "2.3.0", @@ -13609,11 +13582,11 @@ } }, "worker-rpc": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/worker-rpc/-/worker-rpc-0.1.0.tgz", - "integrity": "sha1-XxJY3KPWF80YyoZYf4oFrA7r2DQ=", + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/worker-rpc/-/worker-rpc-0.1.1.tgz", + "integrity": "sha512-P1WjMrUB3qgJNI9jfmpZ/htmBEjFh//6l/5y8SD9hg1Ef5zTTVVoRjTrTEzPrNBQvmhMxkoTsjOXN10GWU7aCg==", "requires": { - "microevent.ts": "~0.1.0" + "microevent.ts": "~0.1.1" } }, "wrap-ansi": { @@ -13689,20 +13662,15 @@ "async-limiter": "~1.0.0" } }, - "x-is-string": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/x-is-string/-/x-is-string-0.1.0.tgz", - "integrity": "sha1-R0tQhlrzpJqcRlfwWs0UVFj3fYI=" - }, "xml-name-validator": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-3.0.0.tgz", "integrity": "sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==" }, "xmlchars": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-1.3.1.tgz", - "integrity": "sha512-tGkGJkN8XqCod7OT+EvGYK5Z4SfDQGD30zAa58OcnAa0RRWgzUEK72tkXhsX1FZd+rgnhRxFtmO+ihkp8LHSkw==" + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.1.1.tgz", + "integrity": "sha512-7hew1RPJ1iIuje/Y01bGD/mXokXxegAgVS+e+E0wSi2ILHQkYAH1+JXARwTjZSM4Z4Z+c73aKspEcqj+zPPL/w==" }, "xregexp": { "version": "4.0.0", @@ -13710,9 +13678,9 @@ "integrity": "sha512-PHyM+sQouu7xspQQwELlGwwd05mXUFqwFYfqPO0cC7x4fxyHnnuetmQr6CjJiafIDoH4MogHb9dOoJzR/Y4rFg==" }, "xtend": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", - "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=" + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==" }, "y18n": { "version": "4.0.0", diff --git a/package.json b/package.json index e9295e2..909ec50 100644 --- a/package.json +++ b/package.json @@ -3,47 +3,51 @@ "version": "0.1.0", "private": true, "dependencies": { - "@fortawesome/fontawesome-svg-core": "^1.2.8", - "@fortawesome/free-solid-svg-icons": "^5.5.0", - "@fortawesome/react-fontawesome": "^0.1.3", + "@fortawesome/fontawesome-svg-core": "^1.2.19", + "@fortawesome/free-solid-svg-icons": "^5.9.0", + "@fortawesome/react-fontawesome": "^0.1.4", "babel-runtime": "^6.26.0", - "bootstrap": "^3.3.7", + "bootstrap": "^4.3.1", "classnames": "^2.2.6", - "d3-array": "^1.2.4", + "d3-array": "^2.2.0", "d3-axis": "^1.0.12", - "d3-scale": "^1.0.6", - "d3-selection": "^1.3.2", - "d3-shape": "^1.2.2", + "d3-scale": "^3.0.0", + "d3-scale-chromatic": "^1.3.3", + "d3-selection": "^1.4.0", + "d3-shape": "^1.3.5", "d3-time-format": "^2.1.3", - "es6-promise": "^4.2.5", - "file-saver": "^1.3.8", - "flux": "^3.1.2", - "gaugeJS": "^1.3.2", - "handlebars": "^4.1.1", - "immutable": "^3.8.1", - "jszip": "^3.2.0", + "es6-promise": "^4.2.8", + "file-saver": "^2.0.2", + "flux": "^3.1.3", + "frontend-collective-react-dnd-scrollzone": "^1.0.2", + "gaugeJS": "^1.3.7", + "handlebars": "^4.1.2", + "immutable": "^4.0.0-rc.12", + "jquery": "^3.4.1", + "jszip": "^3.2.2", "libcimsvg": "git+https://git.rwth-aachen.de/acs/public/cim/pintura-npm-package.git", - "lodash": "^4.17.11", - "prop-types": "^15.6.2", - "rc-slider": "^8.6.3", - "react": "^16.6.3", - "react-bootstrap": "^0.31.1", - "react-contexify": "^3.0.3", + "lodash": "^4.17.15", + "prop-types": "^15.7.2", + "rc-slider": "^8.6.13", + "react": "^16.8.6", + "react-bootstrap": "^1.0.0-beta.9", + "react-contexify": "^4.1.1", "react-d3": "^0.4.0", - "react-dnd": "^2.6.0", - "react-dnd-html5-backend": "^2.6.0", - "react-dom": "^16.6.3", - "react-fullscreenable": "^2.5.0", + "react-dnd": "^9.3.2", + "react-dnd-html5-backend": "^9.3.2", + "react-dom": "^16.8.6", + "react-fullscreenable": "^2.5.1-0", "react-json-view": "^1.19.1", "react-notification-system": "^0.2.17", - "react-rnd": "^7.4.3", - "react-router": "^4.3.1", - "react-router-dom": "^4.3.1", + "react-rnd": "^10.0.0", + "react-router": "^5.0.1", + "react-router-dom": "^5.0.1", "react-scripts": "^3.0.1", - "react-sortable-tree": "^0.1.19", - "react-svg-pan-zoom": "^2.18.0", - "superagent": "^3.8.3", - "validator": "^10.9.0" + "react-sortable-tree": "^2.6.2", + "react-svg-pan-zoom": "^3.1.0", + "superagent": "^5.1.0", + "typescript": "^3.5.3", + "validator": "^11.1.0" }, "devDependencies": { "chai": "^4.2.0" diff --git a/packaging/docker/Dockerfile b/packaging/docker/Dockerfile index 33e72b7..28b1443 100644 --- a/packaging/docker/Dockerfile +++ b/packaging/docker/Dockerfile @@ -1,4 +1,4 @@ -FROM node:8.6 AS builder +FROM node:12.2 AS builder RUN apt-get install -y \ git diff --git a/src/components/dialogs/edit-project.js b/src/components/dialogs/edit-project.js index 2b960b6..6f2081d 100644 --- a/src/components/dialogs/edit-project.js +++ b/src/components/dialogs/edit-project.js @@ -20,7 +20,7 @@ ******************************************************************************/ import React from 'react'; -import { FormGroup, FormControl, ControlLabel } from 'react-bootstrap'; +import { FormGroup, FormControl, FormLabel } from 'react-bootstrap'; import Dialog from './dialog'; @@ -80,12 +80,12 @@ class EditProjectDialog extends React.Component { this.onClose(c)} onReset={() => this.resetState()} valid={this.valid}>
- Name + Name this.handleChange(e)} /> - Simulation + Simulation this.handleChange(e)}> {this.props.simulations.map(simulation => ( diff --git a/src/components/dialogs/edit-simulation.js b/src/components/dialogs/edit-simulation.js index 0b1c87e..a312406 100644 --- a/src/components/dialogs/edit-simulation.js +++ b/src/components/dialogs/edit-simulation.js @@ -20,7 +20,7 @@ ******************************************************************************/ import React from 'react'; -import { FormGroup, FormControl, ControlLabel } from 'react-bootstrap'; +import { FormGroup, FormControl, FormLabel } from 'react-bootstrap'; import Dialog from './dialog'; import ParametersEditor from '../parameters-editor'; @@ -85,13 +85,13 @@ class EditSimulationDialog extends React.Component { return - Name + Name - Start Parameters + Start Parameters diff --git a/src/components/dialogs/edit-simulator.js b/src/components/dialogs/edit-simulator.js index 346fb2a..de08938 100644 --- a/src/components/dialogs/edit-simulator.js +++ b/src/components/dialogs/edit-simulator.js @@ -20,7 +20,7 @@ ******************************************************************************/ import React from 'react'; -import { FormGroup, FormControl, ControlLabel } from 'react-bootstrap'; +import { FormGroup, FormControl, FormLabel } from 'react-bootstrap'; import _ from 'lodash'; import Dialog from './dialog'; @@ -74,17 +74,17 @@ class EditSimulatorDialog extends React.Component { this.onClose(c)} onReset={() => this.resetState()} valid={this.valid}> - Name + Name this.handleChange(e)} /> - Endpoint + Endpoint this.handleChange(e)} /> - Properties + Properties diff --git a/src/components/dialogs/edit-user.js b/src/components/dialogs/edit-user.js index e518b7d..d6f1f84 100644 --- a/src/components/dialogs/edit-user.js +++ b/src/components/dialogs/edit-user.js @@ -20,7 +20,7 @@ ******************************************************************************/ import React from 'react'; -import { FormGroup, FormControl, ControlLabel } from 'react-bootstrap'; +import { FormGroup, FormControl, FormLabel } from 'react-bootstrap'; import Dialog from './dialog'; @@ -82,16 +82,16 @@ class EditUserDialog extends React.Component { this.onClose(c)} onReset={() => this.resetState()} valid={this.valid}>
- Username + Username this.handleChange(e)} /> - E-mail + E-mail this.handleChange(e)} /> - Role + Role this.handleChange(e)}> diff --git a/src/components/dialogs/edit-visualization.js b/src/components/dialogs/edit-visualization.js index ccd8578..565e141 100644 --- a/src/components/dialogs/edit-visualization.js +++ b/src/components/dialogs/edit-visualization.js @@ -20,7 +20,7 @@ ******************************************************************************/ import React from 'react'; -import { FormGroup, FormControl, ControlLabel } from 'react-bootstrap'; +import { FormGroup, FormControl, FormLabel } from 'react-bootstrap'; import Dialog from './dialog'; @@ -78,7 +78,7 @@ class EditVisualizationDialog extends React.Component { this.onClose(c)} onReset={() => this.resetState()} valid={this.valid}> - Name + Name this.handleChange(e)} /> diff --git a/src/components/dialogs/edit-widget-aspect-control.js b/src/components/dialogs/edit-widget-aspect-control.js index 2e4d4d8..502e837 100644 --- a/src/components/dialogs/edit-widget-aspect-control.js +++ b/src/components/dialogs/edit-widget-aspect-control.js @@ -20,7 +20,7 @@ ******************************************************************************/ import React from 'react'; -import { FormGroup, Checkbox } from 'react-bootstrap'; +import { FormGroup, FormCheck } from 'react-bootstrap'; class EditWidgetAspectControl extends React.Component { constructor(props) { @@ -40,10 +40,10 @@ class EditWidgetAspectControl extends React.Component { render() { return ( - this.props.handleChange(e)}>Lock Aspect + this.props.handleChange(e)}>Lock Aspect ); } } -export default EditWidgetAspectControl; \ No newline at end of file +export default EditWidgetAspectControl; diff --git a/src/components/dialogs/edit-widget-checkbox-control.js b/src/components/dialogs/edit-widget-checkbox-control.js index 9c063fb..0118abb 100644 --- a/src/components/dialogs/edit-widget-checkbox-control.js +++ b/src/components/dialogs/edit-widget-checkbox-control.js @@ -20,7 +20,7 @@ ******************************************************************************/ import React from 'react'; -import { FormGroup, Checkbox } from 'react-bootstrap'; +import { FormGroup, FormCheck } from 'react-bootstrap'; class EditWidgetCheckboxControl extends React.Component { constructor(props) { @@ -37,9 +37,9 @@ class EditWidgetCheckboxControl extends React.Component { render() { return - this.props.handleChange(e)}>{this.props.text} + this.props.handleChange(e)}>{this.props.text} ; } } -export default EditWidgetCheckboxControl; \ No newline at end of file +export default EditWidgetCheckboxControl; diff --git a/src/components/dialogs/edit-widget-color-control.js b/src/components/dialogs/edit-widget-color-control.js index 6a44e3d..b54b666 100644 --- a/src/components/dialogs/edit-widget-color-control.js +++ b/src/components/dialogs/edit-widget-color-control.js @@ -21,16 +21,18 @@ ******************************************************************************/ import React, { Component } from 'react'; -import { FormGroup, Col, Row, Radio, ControlLabel } from 'react-bootstrap'; +import { FormGroup, Col, Row, FormCheck, FormLabel } from 'react-bootstrap'; import classNames from 'classnames'; -import { scaleOrdinal, schemeCategory20 } from 'd3-scale'; +import { scaleOrdinal } from 'd3-scale'; +import {schemeCategory10} from 'd3-scale-chromatic' +// schemeCategory20 no longer available in d3 class EditWidgetColorControl extends Component { static get ColorPalette() { let colorCount = 0; const colors = []; - const colorScale = scaleOrdinal(schemeCategory20); + const colorScale = scaleOrdinal(schemeCategory10); while (colorCount < 20) { colors.push(colorScale(colorCount)); colorCount++; } colors.unshift('#000', '#FFF'); // include black and white @@ -55,7 +57,7 @@ class EditWidgetColorControl extends Component { return ( - + { this.props.label } @@ -70,7 +72,7 @@ class EditWidgetColorControl extends Component { 'checked': idx === this.state.widget[this.props.controlId] }); - return ( this.props.handleChange({target: { id: this.props.controlId, value: idx}})} />) + return ( this.props.handleChange({target: { id: this.props.controlId, value: idx}})} />) } ) } diff --git a/src/components/dialogs/edit-widget-color-zones-control.js b/src/components/dialogs/edit-widget-color-zones-control.js index 3367218..3fd97d4 100644 --- a/src/components/dialogs/edit-widget-color-zones-control.js +++ b/src/components/dialogs/edit-widget-color-zones-control.js @@ -20,7 +20,7 @@ ******************************************************************************/ import React from 'react'; -import { FormGroup, ControlLabel, Button } from 'react-bootstrap'; +import { FormGroup, FormLabel, Button } from 'react-bootstrap'; import Icon from '../icon'; @@ -115,7 +115,7 @@ class EditWidgetColorZonesControl extends React.Component { render() { return - Color zones + Color zones diff --git a/src/components/dialogs/edit-widget-html-content.js b/src/components/dialogs/edit-widget-html-content.js index 3b02bc3..8633a61 100644 --- a/src/components/dialogs/edit-widget-html-content.js +++ b/src/components/dialogs/edit-widget-html-content.js @@ -20,7 +20,7 @@ **********************************************************************************/ import React from 'react'; -import { FormGroup, FormControl, ControlLabel } from 'react-bootstrap'; +import { FormGroup, FormControl, FormLabel } from 'react-bootstrap'; class EditWidgetHTMLContent extends React.Component { constructor(props) { @@ -43,7 +43,7 @@ class EditWidgetHTMLContent extends React.Component { render() { return - HTML Content + HTML Content this.props.handleChange(e)} /> ; } diff --git a/src/components/dialogs/edit-widget-image-control.js b/src/components/dialogs/edit-widget-image-control.js index 9db27ac..5973a45 100644 --- a/src/components/dialogs/edit-widget-image-control.js +++ b/src/components/dialogs/edit-widget-image-control.js @@ -20,7 +20,7 @@ ******************************************************************************/ import React from 'react'; -import { FormGroup, FormControl, ControlLabel, Button, ProgressBar } from 'react-bootstrap'; +import { FormGroup, FormControl, FormLabel, Button, ProgressBar } from 'react-bootstrap'; import AppDispatcher from '../../app-dispatcher'; @@ -72,7 +72,7 @@ class EditImageWidgetControl extends React.Component { render() { return
- Image + Image this.props.handleChange(e)}> {this.props.files.length === 0 ? ( @@ -88,7 +88,7 @@ class EditImageWidgetControl extends React.Component { - Upload + Upload this.setState({ fileList: e.target.files }) } /> diff --git a/src/components/dialogs/edit-widget-min-max-control.js b/src/components/dialogs/edit-widget-min-max-control.js index 39218bf..a09ae77 100644 --- a/src/components/dialogs/edit-widget-min-max-control.js +++ b/src/components/dialogs/edit-widget-min-max-control.js @@ -20,7 +20,7 @@ ******************************************************************************/ import React from 'react'; -import { FormGroup, FormControl, ControlLabel, Checkbox, Table } from 'react-bootstrap'; +import { FormGroup, FormControl, FormLabel, FormCheck, Table } from 'react-bootstrap'; class EditWidgetMinMaxControl extends React.Component { constructor(props) { @@ -42,8 +42,8 @@ class EditWidgetMinMaxControl extends React.Component { render() { return - {this.props.label} - this.props.handleChange(e)}>Enable min-max + {this.props.label} + this.props.handleChange(e)}>Enable min-max
diff --git a/src/components/dialogs/edit-widget-number-control.js b/src/components/dialogs/edit-widget-number-control.js index 07de491..378d724 100644 --- a/src/components/dialogs/edit-widget-number-control.js +++ b/src/components/dialogs/edit-widget-number-control.js @@ -20,7 +20,7 @@ **********************************************************************************/ import React, { Component } from 'react'; -import { FormGroup, FormControl, ControlLabel } from 'react-bootstrap'; +import { FormGroup, FormControl, FormLabel } from 'react-bootstrap'; class EditWidgetNumberControl extends Component { constructor(props) { @@ -39,7 +39,7 @@ class EditWidgetNumberControl extends Component { render() { return ( - {this.props.label} + {this.props.label} this.props.handleChange(e)} /> ); diff --git a/src/components/dialogs/edit-widget-orientation.js b/src/components/dialogs/edit-widget-orientation.js index 737aaef..73f8830 100644 --- a/src/components/dialogs/edit-widget-orientation.js +++ b/src/components/dialogs/edit-widget-orientation.js @@ -20,7 +20,7 @@ **********************************************************************************/ import React, { Component } from 'react'; -import { FormGroup, Col, Row, Radio, ControlLabel } from 'react-bootstrap'; +import { FormGroup, Col, Row, FormCheck, FormLabel } from 'react-bootstrap'; import WidgetSlider from '../widgets/slider'; @@ -48,7 +48,7 @@ class EditWidgetOrientation extends Component { return ( - + Orientation @@ -58,9 +58,9 @@ class EditWidgetOrientation extends Component { let name = WidgetSlider.OrientationTypes[type].name; return ( - this.handleOrientationChange(value)}> + this.handleOrientationChange(value)}> { name } - ) + ) }) } diff --git a/src/components/dialogs/edit-widget-parameters-control.js b/src/components/dialogs/edit-widget-parameters-control.js index 8cf454b..0fd5695 100644 --- a/src/components/dialogs/edit-widget-parameters-control.js +++ b/src/components/dialogs/edit-widget-parameters-control.js @@ -20,7 +20,7 @@ **********************************************************************************/ import React, { Component } from 'react'; -import { FormGroup, ControlLabel } from 'react-bootstrap'; +import { FormGroup, FormLabel } from 'react-bootstrap'; import ParametersEditor from '../parameters-editor'; class EditWidgetParametersControl extends Component { @@ -49,7 +49,7 @@ class EditWidgetParametersControl extends Component { render() { return ( - {this.props.label} + {this.props.label} this.handleChange(v)} /> ); diff --git a/src/components/dialogs/edit-widget-signal-control.js b/src/components/dialogs/edit-widget-signal-control.js index 4664936..05f3710 100644 --- a/src/components/dialogs/edit-widget-signal-control.js +++ b/src/components/dialogs/edit-widget-signal-control.js @@ -20,7 +20,7 @@ **********************************************************************************/ import React, { Component } from 'react'; -import { FormGroup, FormControl, ControlLabel } from 'react-bootstrap'; +import { FormGroup, FormControl, FormLabel } from 'react-bootstrap'; class EditWidgetSignalControl extends Component { constructor(props) { @@ -53,7 +53,7 @@ class EditWidgetSignalControl extends Component { return ( - Signal + Signal this.props.handleChange(e)}> { signalsToRender.length === 0 ? ( diff --git a/src/components/dialogs/edit-widget-signals-control.js b/src/components/dialogs/edit-widget-signals-control.js index 0b55312..045a269 100644 --- a/src/components/dialogs/edit-widget-signals-control.js +++ b/src/components/dialogs/edit-widget-signals-control.js @@ -20,7 +20,7 @@ **********************************************************************************/ import React, { Component } from 'react'; -import { FormGroup, Checkbox, ControlLabel, FormControl } from 'react-bootstrap'; +import { FormGroup, FormCheck, FormLabel, FormControl } from 'react-bootstrap'; class EditWidgetSignalsControl extends Component { constructor(props) { @@ -65,13 +65,13 @@ class EditWidgetSignalsControl extends Component { return ( - Signals + Signals { signalsToRender.length === 0 || !this.state.widget.hasOwnProperty(this.props.controlId)? ( No signals available. ) : ( signalsToRender.map((signal, index) => ( - this.handleSignalChange(e.target.checked, index)}>{signal.name} + this.handleSignalChange(e.target.checked, index)}>{signal.name} )) ) } diff --git a/src/components/dialogs/edit-widget-simulation-control.js b/src/components/dialogs/edit-widget-simulation-control.js index 3ad0642..c9ca495 100644 --- a/src/components/dialogs/edit-widget-simulation-control.js +++ b/src/components/dialogs/edit-widget-simulation-control.js @@ -20,7 +20,7 @@ **********************************************************************************/ import React, { Component } from 'react'; -import { FormGroup, FormControl, ControlLabel } from 'react-bootstrap'; +import { FormGroup, FormControl, FormLabel } from 'react-bootstrap'; class EditWidgetSimulationControl extends Component { constructor(props) { @@ -41,7 +41,7 @@ class EditWidgetSimulationControl extends Component { render() { return ( - Simulation Model + Simulation Model this.props.handleChange(e)}> { this.props.simulationModels.length === 0 ? ( diff --git a/src/components/dialogs/edit-widget-text-control.js b/src/components/dialogs/edit-widget-text-control.js index d46b98a..bbac6d2 100644 --- a/src/components/dialogs/edit-widget-text-control.js +++ b/src/components/dialogs/edit-widget-text-control.js @@ -20,7 +20,7 @@ **********************************************************************************/ import React, { Component } from 'react'; -import { FormGroup, FormControl, ControlLabel } from 'react-bootstrap'; +import { FormGroup, FormControl, FormLabel } from 'react-bootstrap'; class EditWidgetTextControl extends Component { constructor(props) { @@ -39,7 +39,7 @@ class EditWidgetTextControl extends Component { render() { return ( - {this.props.label} + {this.props.label} this.props.handleChange(e)} /> diff --git a/src/components/dialogs/edit-widget-text-size-control.js b/src/components/dialogs/edit-widget-text-size-control.js index 0c66ebb..655cdf5 100644 --- a/src/components/dialogs/edit-widget-text-size-control.js +++ b/src/components/dialogs/edit-widget-text-size-control.js @@ -20,7 +20,7 @@ **********************************************************************************/ import React from 'react'; -import { FormGroup, FormControl, ControlLabel } from 'react-bootstrap'; +import { FormGroup, FormControl, FormLabel } from 'react-bootstrap'; class EditWidgetTextSizeControl extends React.Component { render() { @@ -28,7 +28,7 @@ class EditWidgetTextSizeControl extends React.Component { return ( - Text size + Text size this.props.handleChange(e)}> {sizes.map((size, index) => ( @@ -39,4 +39,4 @@ class EditWidgetTextSizeControl extends React.Component { } } -export default EditWidgetTextSizeControl; \ No newline at end of file +export default EditWidgetTextSizeControl; diff --git a/src/components/dialogs/edit-widget-time-control.js b/src/components/dialogs/edit-widget-time-control.js index 8f6434d..cd3d372 100644 --- a/src/components/dialogs/edit-widget-time-control.js +++ b/src/components/dialogs/edit-widget-time-control.js @@ -20,7 +20,7 @@ **********************************************************************************/ import React, { Component } from 'react'; -import { FormGroup, FormControl, ControlLabel, HelpBlock } from 'react-bootstrap'; +import { FormGroup, FormControl, FormLabel, FormText } from 'react-bootstrap'; class EditWidgetTimeControl extends Component { constructor(props) { @@ -41,9 +41,9 @@ class EditWidgetTimeControl extends Component { return ( - Time + Time this.props.handleChange(e)} /> - Time in seconds + Time in seconds ); } diff --git a/src/components/dialogs/edit-widget.js b/src/components/dialogs/edit-widget.js index 95e20c7..fd5debd 100644 --- a/src/components/dialogs/edit-widget.js +++ b/src/components/dialogs/edit-widget.js @@ -20,7 +20,7 @@ ******************************************************************************/ import React from 'react'; -//import { FormGroup, FormControl, ControlLabel } from 'react-bootstrap'; +//import { FormGroup, FormControl, FormLabel } from 'react-bootstrap'; import Dialog from './dialog'; diff --git a/src/components/dialogs/import-simulation-model.js b/src/components/dialogs/import-simulation-model.js index 137dfe9..af9a7dc 100644 --- a/src/components/dialogs/import-simulation-model.js +++ b/src/components/dialogs/import-simulation-model.js @@ -20,7 +20,7 @@ ******************************************************************************/ import React from 'react'; -import { FormGroup, FormControl, ControlLabel } from 'react-bootstrap'; +import { FormGroup, FormControl, FormLabel } from 'react-bootstrap'; import _ from 'lodash'; import Dialog from './dialog'; @@ -91,12 +91,12 @@ class ImportSimulationModelDialog extends React.Component { - Simulation Model File + Simulation Model File - Simulator + Simulator {this.props.simulators.map(simulator => ( diff --git a/src/components/dialogs/import-simulation.js b/src/components/dialogs/import-simulation.js index e14eada..1aadb37 100644 --- a/src/components/dialogs/import-simulation.js +++ b/src/components/dialogs/import-simulation.js @@ -20,7 +20,7 @@ ******************************************************************************/ import React from 'react'; -import { FormGroup, FormControl, ControlLabel } from 'react-bootstrap'; +import { FormGroup, FormControl, FormLabel } from 'react-bootstrap'; import Dialog from './dialog'; import ParametersEditor from '../parameters-editor'; @@ -119,25 +119,25 @@ class ImportSimulationDialog extends React.Component { return - Simulation File + Simulation File - Name + Name this.handleChange(e)} /> - Start Parameters + Start Parameters {/* {this.state.models.map((model, index) => ( - {model.name} - Simulator + {model.name} - Simulator this.handleChange(e, index)}> {this.props.nodes.map(node => ( node.simulators.map((simulator, index) => ( diff --git a/src/components/dialogs/import-simulator.js b/src/components/dialogs/import-simulator.js index 8320572..e884002 100644 --- a/src/components/dialogs/import-simulator.js +++ b/src/components/dialogs/import-simulator.js @@ -20,7 +20,7 @@ ******************************************************************************/ import React from 'react'; -import { FormGroup, FormControl, ControlLabel } from 'react-bootstrap'; +import { FormGroup, FormControl, FormLabel } from 'react-bootstrap'; import _ from 'lodash'; import Dialog from './dialog'; @@ -118,22 +118,22 @@ class ImportSimulatorDialog extends React.Component { this.onClose(c)} onReset={() => this.resetState()} valid={this.valid}> - Simulator File + Simulator File this.loadFile(e.target.files)} /> - Name + Name this.handleChange(e)} /> - Endpoint + Endpoint this.handleChange(e)} /> - UUID + UUID this.handleChange(e)} /> @@ -143,4 +143,4 @@ class ImportSimulatorDialog extends React.Component { } } -export default ImportSimulatorDialog; \ No newline at end of file +export default ImportSimulatorDialog; diff --git a/src/components/dialogs/import-visualization.js b/src/components/dialogs/import-visualization.js index 5d276f9..22188f2 100644 --- a/src/components/dialogs/import-visualization.js +++ b/src/components/dialogs/import-visualization.js @@ -20,7 +20,7 @@ ******************************************************************************/ import React from 'react'; -import { FormGroup, FormControl, ControlLabel } from 'react-bootstrap'; +import { FormGroup, FormControl, FormLabel } from 'react-bootstrap'; import Dialog from './dialog'; @@ -118,12 +118,12 @@ class ImportVisualizationDialog extends React.Component { this.onClose(c)} onReset={() => this.resetState()} valid={this.valid}> - Visualization File + Visualization File this.loadFile(e.target.files)} /> - Name + Name this.handleChange(e)} /> diff --git a/src/components/dialogs/new-project.js b/src/components/dialogs/new-project.js index babcf77..b9a2bbd 100644 --- a/src/components/dialogs/new-project.js +++ b/src/components/dialogs/new-project.js @@ -20,7 +20,7 @@ ******************************************************************************/ import React from 'react'; -import { FormGroup, FormControl, ControlLabel } from 'react-bootstrap'; +import { FormGroup, FormControl, FormLabel } from 'react-bootstrap'; import Dialog from './dialog'; @@ -82,12 +82,12 @@ class NewProjectDialog extends React.Component { this.onClose(c)} onReset={() => this.resetState()} valid={this.valid}> - Name + Name this.handleChange(e)} /> - Simulation + Simulation this.handleChange(e)}> {this.props.simulations.map(simulation => ( diff --git a/src/components/dialogs/new-simulation.js b/src/components/dialogs/new-simulation.js index b09559c..3d32e2d 100644 --- a/src/components/dialogs/new-simulation.js +++ b/src/components/dialogs/new-simulation.js @@ -20,7 +20,7 @@ ******************************************************************************/ import React from 'react'; -import { FormGroup, FormControl, ControlLabel } from 'react-bootstrap'; +import { FormGroup, FormControl, FormLabel } from 'react-bootstrap'; import Dialog from './dialog'; import ParametersEditor from '../parameters-editor'; @@ -81,13 +81,13 @@ class NewSimulationDialog extends React.Component { return - Name + Name - Start Parameters + Start Parameters diff --git a/src/components/dialogs/new-simulator.js b/src/components/dialogs/new-simulator.js index 1eb5b34..ea7335a 100644 --- a/src/components/dialogs/new-simulator.js +++ b/src/components/dialogs/new-simulator.js @@ -20,7 +20,7 @@ ******************************************************************************/ import React from 'react'; -import { FormGroup, FormControl, ControlLabel } from 'react-bootstrap'; +import { FormGroup, FormControl, FormLabel } from 'react-bootstrap'; import Dialog from './dialog'; @@ -99,17 +99,17 @@ class NewSimulatorDialog extends React.Component { this.onClose(c)} onReset={() => this.resetState()} valid={this.valid}> - Name + Name this.handleChange(e)} /> - Endpoint + Endpoint this.handleChange(e)} /> - UUID + UUID this.handleChange(e)} /> diff --git a/src/components/dialogs/new-user.js b/src/components/dialogs/new-user.js index f3cf20d..554e14f 100644 --- a/src/components/dialogs/new-user.js +++ b/src/components/dialogs/new-user.js @@ -20,7 +20,7 @@ ******************************************************************************/ import React from 'react'; -import { FormGroup, FormControl, ControlLabel, HelpBlock } from 'react-bootstrap'; +import { FormGroup, FormControl, FormLabel, FormText } from 'react-bootstrap'; import Dialog from './dialog'; @@ -84,23 +84,23 @@ class NewUserDialog extends React.Component { this.onClose(c)} onReset={() => this.resetState()} valid={this.valid}> - Username + Username this.handleChange(e)} /> - Min 3 characters. + Min 3 characters. - E-mail + E-mail this.handleChange(e)} /> - Password + Password this.handleChange(e)} /> - Role + Role this.handleChange(e)}> diff --git a/src/components/dialogs/new-visualization.js b/src/components/dialogs/new-visualization.js index 70b45ec..2427340 100644 --- a/src/components/dialogs/new-visualization.js +++ b/src/components/dialogs/new-visualization.js @@ -20,7 +20,7 @@ ******************************************************************************/ import React from 'react'; -import { FormGroup, FormControl, ControlLabel } from 'react-bootstrap'; +import { FormGroup, FormControl, FormLabel } from 'react-bootstrap'; import Dialog from './dialog'; @@ -74,7 +74,7 @@ class NewVisualzationDialog extends React.Component { this.onClose(c)} onReset={() => this.resetState()} valid={this.valid}> - Name + Name this.handleChange(e)} /> diff --git a/src/components/login-form.js b/src/components/login-form.js index 7e09091..e2b48c6 100644 --- a/src/components/login-form.js +++ b/src/components/login-form.js @@ -20,7 +20,7 @@ ******************************************************************************/ import React, { Component } from 'react'; -import { Form, Button, FormGroup, FormControl, ControlLabel, Col } from 'react-bootstrap'; +import { Form, Button, FormGroup, FormControl, FormLabel, Col } from 'react-bootstrap'; import AppDispatcher from '../app-dispatcher'; @@ -63,7 +63,7 @@ class LoginForm extends Component { return ( - + Username @@ -72,7 +72,7 @@ class LoginForm extends Component { - + Password diff --git a/src/components/signal-mapping.js b/src/components/signal-mapping.js index 815d90c..0a66ac5 100644 --- a/src/components/signal-mapping.js +++ b/src/components/signal-mapping.js @@ -21,7 +21,7 @@ import React from 'react'; import PropTypes from 'prop-types'; -import { FormGroup, FormControl, ControlLabel, HelpBlock } from 'react-bootstrap'; +import { FormGroup, FormControl, FormLabel, FormText } from 'react-bootstrap'; import validator from 'validator'; import Table from './table'; @@ -98,14 +98,14 @@ class SignalMapping extends React.Component { render() { return
- {this.props.name} Length + {this.props.name} Length - {this.props.name} Mapping - Click name or type cell to edit + {this.props.name} Mapping + Click name or type cell to edit
diff --git a/src/components/simulator-action.js b/src/components/simulator-action.js index aef6625..765856f 100644 --- a/src/components/simulator-action.js +++ b/src/components/simulator-action.js @@ -20,7 +20,7 @@ ******************************************************************************/ import React from 'react'; -import { Button, DropdownButton, MenuItem } from 'react-bootstrap'; +import { Button, DropdownButton, DropdownItem } from 'react-bootstrap'; class SimulatorAction extends React.Component { constructor(props) { @@ -50,9 +50,9 @@ class SimulatorAction extends React.Component { render() { const actionList = this.props.actions.map(action => ( - + {action.title} - + )); return
diff --git a/src/components/table.js b/src/components/table.js index 0eaac85..ed118a0 100644 --- a/src/components/table.js +++ b/src/components/table.js @@ -21,7 +21,7 @@ import React, { Component } from 'react'; import _ from 'lodash'; -import { Table, Button, FormControl, Label, Checkbox } from 'react-bootstrap'; +import { Table, Button, FormControl, FormLabel, FormCheck } from 'react-bootstrap'; import { Link } from 'react-router-dom'; import Icon from './icon'; @@ -89,7 +89,7 @@ class CustomTable extends Component { labelContent = child.props.labelModifier(labelContent, data); } - cell.push( ); + cell.push( {labelContent.toString()}); } if (child.props.dataIndex) { @@ -108,7 +108,7 @@ class CustomTable extends Component { if (child.props.checkbox) { const checkboxKey = this.props.checkboxKey; - cell.push( child.props.onChecked(index, e)} />); + cell.push( child.props.onChecked(index, e)} />); } if (child.props.exportButton) { diff --git a/src/components/widget-plot/plot-legend.js b/src/components/widget-plot/plot-legend.js index 4bde597..239072c 100644 --- a/src/components/widget-plot/plot-legend.js +++ b/src/components/widget-plot/plot-legend.js @@ -21,7 +21,8 @@ ******************************************************************************/ import React from 'react'; -import { scaleOrdinal, schemeCategory10 } from 'd3-scale'; +import { scaleOrdinal} from 'd3-scale'; +import {schemeCategory10} from 'd3-scale-chromatic' class PlotLegend extends React.Component { render() { diff --git a/src/components/widget-plot/plot.js b/src/components/widget-plot/plot.js index a3f6d37..044598d 100644 --- a/src/components/widget-plot/plot.js +++ b/src/components/widget-plot/plot.js @@ -21,7 +21,8 @@ ******************************************************************************/ import React from 'react'; -import { scaleLinear, scaleTime, scaleOrdinal, schemeCategory10 } from 'd3-scale'; +import { scaleLinear, scaleTime, scaleOrdinal} from 'd3-scale'; +import {schemeCategory10} from 'd3-scale-chromatic' import { extent } from 'd3-array'; import { line } from 'd3-shape'; import { axisBottom, axisLeft } from 'd3-axis'; diff --git a/src/components/widgets/input.js b/src/components/widgets/input.js index 63bc655..7272279 100644 --- a/src/components/widgets/input.js +++ b/src/components/widgets/input.js @@ -21,7 +21,7 @@ ******************************************************************************/ import React, { Component } from 'react'; -import { Form, FormGroup, Col, ControlLabel, FormControl, InputGroup } from 'react-bootstrap'; +import { Form, FormGroup, Col, FormLabel, FormControl, InputGroup } from 'react-bootstrap'; class WidgetInput extends Component { @@ -75,7 +75,7 @@ class WidgetInput extends Component {
-
+ {this.props.widget.name} diff --git a/src/components/widgets/plot-table.js b/src/components/widgets/plot-table.js index 368f7c5..1b6fc80 100644 --- a/src/components/widgets/plot-table.js +++ b/src/components/widgets/plot-table.js @@ -21,7 +21,7 @@ import React, { Component } from 'react'; import classNames from 'classnames'; -import { FormGroup, Checkbox } from 'react-bootstrap'; +import { FormGroup, FormCheck } from 'react-bootstrap'; import Plot from '../widget-plot/plot'; import PlotLegend from '../widget-plot/plot-legend'; @@ -118,7 +118,7 @@ class WidgetPlotTable extends Component { 'btn-default': true, 'active': checked }); - return this.updateSignalSelection(signal.index, e.target.checked) } > { signal.name } + return this.updateSignalSelection(signal.index, e.target.checked) } > { signal.name } }); } diff --git a/src/containers/FluxContainerConverter.js b/src/containers/FluxContainerConverter.js new file mode 100644 index 0000000..bd2196a --- /dev/null +++ b/src/containers/FluxContainerConverter.js @@ -0,0 +1,15 @@ +/// FluxContainerConverter.js +/// This is an ugly workaround found here https://github.com/facebook/flux/issues/351 to make Flux Containers work with ES6 + +module.exports = { + convert: function(containerClass) { + const tmp = containerClass; + containerClass = function(...args) { + return new tmp(...args); + }; + containerClass.prototype = tmp.prototype; + containerClass.getStores = tmp.getStores; + containerClass.calculateState = tmp.calculateState; + return containerClass; + } +}; diff --git a/src/containers/app.js b/src/containers/app.js index 4199935..5474190 100644 --- a/src/containers/app.js +++ b/src/containers/app.js @@ -21,7 +21,7 @@ import React from 'react'; import { Container } from 'flux/utils'; -import { DragDropContext } from 'react-dnd'; +import { DndProvider } from 'react-dnd'; import HTML5Backend from 'react-dnd-html5-backend'; import NotificationSystem from 'react-notification-system'; import { Redirect, Route } from 'react-router-dom'; @@ -51,6 +51,7 @@ import Users from './users'; import '../styles/app.css'; class App extends React.Component { + static getStores() { return [ SimulatorStore, UserStore, SimulationStore ]; } @@ -112,40 +113,44 @@ class App extends React.Component { } return ( -
-
- - + +
+
+ + -
- +
+ -
+
-
-
- - +
+
+ + -
- - - - - - - - - - +
+ + + + + + + + + + +
- -
+
+ - - ); + + ) } } -export default DragDropContext(HTML5Backend)(Container.create(App)); +let fluxContainerConverter = require('./FluxContainerConverter'); +export default Container.create(fluxContainerConverter.convert(App)); +//DragDropContext(HTML5Backend)(Container.create(App)); diff --git a/src/containers/login.js b/src/containers/login.js index 2a812cf..ee613a6 100644 --- a/src/containers/login.js +++ b/src/containers/login.js @@ -21,7 +21,7 @@ import React, { Component } from 'react'; import { Container } from 'flux/utils'; -import { PageHeader } from 'react-bootstrap'; +import { NavbarBrand } from 'react-bootstrap'; import NotificationSystem from 'react-notification-system'; import { Redirect } from 'react-router-dom'; @@ -82,7 +82,7 @@ class Login extends Component {
- Login + Login
@@ -93,4 +93,5 @@ class Login extends Component { } } -export default Container.create(Login); +let fluxContainerConverter = require('./FluxContainerConverter'); +export default Container.create(fluxContainerConverter.convert(Login)); diff --git a/src/containers/project.js b/src/containers/project.js index ce5e3b4..74e2da4 100644 --- a/src/containers/project.js +++ b/src/containers/project.js @@ -231,4 +231,5 @@ class Visualizations extends Component { } } -export default Container.create(Visualizations, {withProps: true}); +let fluxContainerConverter = require('./FluxContainerConverter'); +export default Container.create(fluxContainerConverter.convert(Visualizations), {withProps: true}); diff --git a/src/containers/projects.js b/src/containers/projects.js index b94c846..d42bd64 100644 --- a/src/containers/projects.js +++ b/src/containers/projects.js @@ -156,4 +156,5 @@ class Projects extends React.Component { } } -export default Container.create(Projects); +let fluxContainerConverter = require('./FluxContainerConverter'); +export default Container.create(fluxContainerConverter.convert(Projects)); diff --git a/src/containers/select-file.js b/src/containers/select-file.js index 755356d..3eb97c1 100644 --- a/src/containers/select-file.js +++ b/src/containers/select-file.js @@ -21,7 +21,7 @@ import React from 'react'; import { Container } from 'flux/utils'; -import { FormGroup, FormControl, ControlLabel, Button, ProgressBar, Col } from 'react-bootstrap'; +import { FormGroup, FormControl, FormLabel, Button, ProgressBar, Col } from 'react-bootstrap'; import FileStore from '../stores/file-store'; import UserStore from '../stores/user-store'; @@ -118,7 +118,7 @@ class SelectFile extends React.Component { return
-
+ {this.props.name} @@ -148,4 +148,5 @@ class SelectFile extends React.Component { } } -export default Container.create(SelectFile); +let fluxContainerConverter = require('./FluxContainerConverter'); +export default Container.create(fluxContainerConverter.convert(SelectFile)); diff --git a/src/containers/select-simulator.js b/src/containers/select-simulator.js index bcf7719..88f7151 100644 --- a/src/containers/select-simulator.js +++ b/src/containers/select-simulator.js @@ -21,7 +21,7 @@ import React from 'react'; import { Container } from 'flux/utils'; -import { FormGroup, FormControl, ControlLabel, Col } from 'react-bootstrap'; +import { FormGroup, FormControl, FormLabel, Col } from 'react-bootstrap'; import _ from 'lodash'; import SimulatorStore from '../stores/simulator-store'; @@ -72,7 +72,7 @@ class SelectSimulator extends React.Component { ); return - + Simulator @@ -85,4 +85,5 @@ class SelectSimulator extends React.Component { } } -export default Container.create(SelectSimulator); +let fluxContainerConverter = require('./FluxContainerConverter'); +export default Container.create(fluxContainerConverter.convert(SelectSimulator)); diff --git a/src/containers/simulation-model.js b/src/containers/simulation-model.js index 975b9e6..9ba7390 100644 --- a/src/containers/simulation-model.js +++ b/src/containers/simulation-model.js @@ -21,7 +21,7 @@ import React from 'react'; import { Container } from 'flux/utils'; -import { Button, Col, Form, ControlLabel } from 'react-bootstrap'; +import { Button, Col, Form, FormLabel } from 'react-bootstrap'; import SimulationModelStore from '../stores/simulation-model-store'; import UserStore from '../stores/user-store'; @@ -140,7 +140,7 @@ class SimulationModel extends React.Component {
-
+ Start Parameters @@ -168,4 +168,5 @@ class SimulationModel extends React.Component { } } -export default Container.create(SimulationModel, { withProps: true }); +let fluxContainerConverter = require('./FluxContainerConverter'); +export default Container.create(fluxContainerConverter.convert(SimulationModel), { withProps: true }); diff --git a/src/containers/simulation.js b/src/containers/simulation.js index 090a8de..9f9a0f3 100644 --- a/src/containers/simulation.js +++ b/src/containers/simulation.js @@ -285,4 +285,5 @@ class Simulation extends React.Component { } } -export default Container.create(Simulation, { withProps: true }); +let fluxContainerConverter = require('./FluxContainerConverter'); +export default Container.create(fluxContainerConverter.convert(Simulation), { withProps: true }); diff --git a/src/containers/simulations.js b/src/containers/simulations.js index 2bd8a1d..5f9429f 100644 --- a/src/containers/simulations.js +++ b/src/containers/simulations.js @@ -325,4 +325,5 @@ class Simulations extends Component { } } -export default Container.create(Simulations); +let fluxContainerConverter = require('./FluxContainerConverter'); +export default Container.create(fluxContainerConverter.convert(Simulations)); diff --git a/src/containers/simulators.js b/src/containers/simulators.js index 9e07bab..20fb207 100644 --- a/src/containers/simulators.js +++ b/src/containers/simulators.js @@ -310,4 +310,5 @@ class Simulators extends Component { } } -export default Container.create(Simulators); +let fluxContainerConverter = require('./FluxContainerConverter'); +export default Container.create(fluxContainerConverter.convert(Simulators)); diff --git a/src/containers/users.js b/src/containers/users.js index 1e1779e..59cb5af 100644 --- a/src/containers/users.js +++ b/src/containers/users.js @@ -139,4 +139,5 @@ class Users extends Component { } } -export default Container.create(Users); +let fluxContainerConverter = require('./FluxContainerConverter'); +export default Container.create(fluxContainerConverter.convert(Users)); diff --git a/src/containers/visualization.js b/src/containers/visualization.js index a9e53ff..36fac12 100644 --- a/src/containers/visualization.js +++ b/src/containers/visualization.js @@ -547,4 +547,5 @@ class Visualization extends React.Component { } } -export default Fullscreenable()(Container.create(Visualization, { withProps: true })); +let fluxContainerConverter = require('./FluxContainerConverter'); +export default Fullscreenable()(Container.create(fluxContainerConverter.convert(Visualization), { withProps: true })); diff --git a/src/containers/widget.js b/src/containers/widget.js index b4df992..3a6a715 100644 --- a/src/containers/widget.js +++ b/src/containers/widget.js @@ -22,7 +22,7 @@ import React from 'react'; import { Container } from 'flux/utils'; import { ContextMenuProvider } from 'react-contexify'; -import Rnd from 'react-rnd'; +import { Rnd } from 'react-rnd'; import classNames from 'classnames'; import AppDispatcher from '../app-dispatcher'; @@ -294,4 +294,5 @@ class Widget extends React.Component { } } -export default Container.create(Widget, { withProps: true }); +let fluxContainerConverter = require('./FluxContainerConverter'); +export default Container.create(fluxContainerConverter.convert(Widget), { withProps: true }); diff --git a/src/data-managers/rest-data-manager.js b/src/data-managers/rest-data-manager.js index dbd278e..321a542 100644 --- a/src/data-managers/rest-data-manager.js +++ b/src/data-managers/rest-data-manager.js @@ -22,7 +22,7 @@ import RestAPI from '../api/rest-api'; import AppDispatcher from '../app-dispatcher'; -const API_URL = '/api/v1'; +const API_URL = '/api/v2'; class RestDataManager { constructor(type, url, keyFilter) { From f72d7b892f22bb2ea49a00ab94c13e4c724feb79 Mon Sep 17 00:00:00 2001 From: Sonja Happ Date: Mon, 22 Jul 2019 16:12:32 +0200 Subject: [PATCH 005/391] comment query of counts endpoint for now --- src/components/home.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/components/home.js b/src/components/home.js index 86ea56b..b81bab7 100644 --- a/src/components/home.js +++ b/src/components/home.js @@ -41,9 +41,9 @@ class Home extends React.Component { } componentWillMount() { - RestAPI.get('/api/v1/counts').then(response => { - this.setState({ counts: response }); - }); + //RestAPI.get('/api/v1/counts').then(response => { + // this.setState({ counts: response }); + //}); } render() { From 00544c2fe046954d194b175896adfa45ce3f2bea Mon Sep 17 00:00:00 2001 From: Sonja Happ Date: Mon, 22 Jul 2019 16:13:39 +0200 Subject: [PATCH 006/391] save user information from login response of backend, omit users/me endpoint --- src/data-managers/users-data-manager.js | 29 +++++++++++++------------ src/stores/user-store.js | 13 ++++++----- 2 files changed, 22 insertions(+), 20 deletions(-) diff --git a/src/data-managers/users-data-manager.js b/src/data-managers/users-data-manager.js index f5db8f8..07d1b12 100644 --- a/src/data-managers/users-data-manager.js +++ b/src/data-managers/users-data-manager.js @@ -32,7 +32,8 @@ class UsersDataManager extends RestDataManager { RestAPI.post(this.makeURL('/authenticate'), { username: username, password: password }).then(response => { AppDispatcher.dispatch({ type: 'users/logged-in', - token: response.token + token: response.token, + user: response.user }); }).catch(error => { AppDispatcher.dispatch({ @@ -42,19 +43,19 @@ class UsersDataManager extends RestDataManager { }); } - getCurrentUser(token) { - RestAPI.get(this.makeURL('/users/me'), token).then(response => { - AppDispatcher.dispatch({ - type: 'users/current-user', - user: response.user - }); - }).catch(error => { - AppDispatcher.dispatch({ - type: 'users/current-user-error', - error: error - }); - }); - } + //getCurrentUser(token) { + // RestAPI.get(this.makeURL('/users/me'), token).then(response => { + // AppDispatcher.dispatch({ + // type: 'users/current-user', + // user: response.user + // }); + // }).catch(error => { + // AppDispatcher.dispatch({ + // type: 'users/current-user-error', + // error: error + // }); + // }); + //} } diff --git a/src/stores/user-store.js b/src/stores/user-store.js index e8722c8..ecaede5 100644 --- a/src/stores/user-store.js +++ b/src/stores/user-store.js @@ -53,14 +53,15 @@ class UserStore extends ReduceStore { return Object.assign({}, state, { token: null, currentUser: null }); case 'users/logged-in': - // request logged-in user data - UsersDataManager.getCurrentUser(action.token); + // // request logged-in user data + //UsersDataManager.getCurrentUser(action.token); - return Object.assign({}, state, { token: action.token }); + //save token and logged-in user + return Object.assign({}, state, { token: action.token, currentUser: action.user }); - case 'users/current-user': - // save logged-in user - return Object.assign({}, state, { currentUser: action.user }); + //case 'users/current-user': + // // save logged-in user + // return Object.assign({}, state, { currentUser: action.user }); case 'users/current-user-error': // discard user token From 5d97e1f32e71db2d554780431432a2fca6e15240 Mon Sep 17 00:00:00 2001 From: Sonja Happ Date: Tue, 23 Jul 2019 17:16:50 +0200 Subject: [PATCH 007/391] started with adaptions for new package versions and new Go backend API --- package-lock.json | 8 +++++ package.json | 1 + src/api/rest-api.js | 11 +++---- src/components/dialogs/edit-simulator.js | 10 +++---- .../dialogs/import-simulation-model.js | 2 +- src/components/dialogs/new-user.js | 11 +++++-- src/components/header-menu.js | 5 ++-- src/components/header.js | 17 +++++++---- src/components/home.js | 24 +++++++++++---- src/components/login-form.js | 14 ++++----- src/components/menu-sidebar.js | 2 +- src/components/table-column.js | 5 +++- src/components/table.js | 16 ++++++---- src/containers/app.js | 20 +++++++++---- src/containers/login.js | 8 +++-- src/containers/select-simulator.js | 4 +-- src/containers/simulation.js | 4 +-- src/containers/simulators.js | 30 +++++++++++-------- src/containers/users.js | 2 +- src/data-managers/rest-data-manager.js | 4 +-- src/data-managers/simulators-data-manager.js | 2 +- src/data-managers/users-data-manager.js | 29 +++++++++--------- src/stores/array-store.js | 2 +- src/stores/simulator-store.js | 5 ++-- src/stores/user-store.js | 10 +++---- 25 files changed, 154 insertions(+), 92 deletions(-) diff --git a/package-lock.json b/package-lock.json index 8ed2120..dfcc0c4 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10920,6 +10920,14 @@ "react-display-name": "^0.2.0" } }, + "react-grid-system": { + "version": "4.4.10", + "resolved": "https://registry.npmjs.org/react-grid-system/-/react-grid-system-4.4.10.tgz", + "integrity": "sha512-ZSmQ+284QOYqDKkb5kbaFUWsuczLMQmlkAYNVv2UorG1z177UxQPYcCwmzKXpuGascksImuLpitpMpnn0UacXg==", + "requires": { + "prop-types": "^15.7.2" + } + }, "react-is": { "version": "16.8.6", "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.8.6.tgz", diff --git a/package.json b/package.json index 909ec50..16782d4 100644 --- a/package.json +++ b/package.json @@ -37,6 +37,7 @@ "react-dnd-html5-backend": "^9.3.2", "react-dom": "^16.8.6", "react-fullscreenable": "^2.5.1-0", + "react-grid-system": "^4.4.10", "react-json-view": "^1.19.1", "react-notification-system": "^0.2.17", "react-rnd": "^10.0.0", diff --git a/src/api/rest-api.js b/src/api/rest-api.js index 43af793..4fb5395 100644 --- a/src/api/rest-api.js +++ b/src/api/rest-api.js @@ -58,7 +58,8 @@ class RestAPI { var req = request.get(url); if (token != null) { - req.set('x-access-token', token); + req.set('Authorization', "Bearer " + token); + } req.end(function (error, res) { @@ -76,7 +77,7 @@ class RestAPI { var req = request.post(url).send(body).timeout({ response: 5000 }); // Simple response start timeout (3s) if (token != null) { - req.set('x-access-token', token); + req.set('Authorization', "Bearer " + token); } req.end(function (error, res) { @@ -97,7 +98,7 @@ class RestAPI { var req = request.delete(url); if (token != null) { - req.set('x-access-token', token); + req.set('Authorization', "Bearer " + token); } req.end(function (error, res) { @@ -115,7 +116,7 @@ class RestAPI { var req = request.put(url).send(body); if (token != null) { - req.set('x-access-token', token); + req.set('Authorization', "Bearer " + token); } req.end(function (error, res) { @@ -133,7 +134,7 @@ class RestAPI { const req = request.post(url).send(data).on('progress', progressCallback); if (token != null) { - req.set('x-access-token', token); + req.set('Authorization', "Bearer " + token); } req.end(function (error, res) { diff --git a/src/components/dialogs/edit-simulator.js b/src/components/dialogs/edit-simulator.js index de08938..74edcd2 100644 --- a/src/components/dialogs/edit-simulator.js +++ b/src/components/dialogs/edit-simulator.js @@ -74,17 +74,17 @@ class EditSimulatorDialog extends React.Component { this.onClose(c)} onReset={() => this.resetState()} valid={this.valid}> - Name - this.handleChange(e)} /> + Name + this.handleChange(e)} /> - Endpoint - this.handleChange(e)} /> + Endpoint + this.handleChange(e)} /> - Properties + Properties diff --git a/src/components/dialogs/import-simulation-model.js b/src/components/dialogs/import-simulation-model.js index af9a7dc..55e7a2b 100644 --- a/src/components/dialogs/import-simulation-model.js +++ b/src/components/dialogs/import-simulation-model.js @@ -99,7 +99,7 @@ class ImportSimulationModelDialog extends React.Component { Simulator {this.props.simulators.map(simulator => ( - + ))} diff --git a/src/components/dialogs/new-user.js b/src/components/dialogs/new-user.js index 554e14f..a0c1ed0 100644 --- a/src/components/dialogs/new-user.js +++ b/src/components/dialogs/new-user.js @@ -34,7 +34,8 @@ class NewUserDialog extends React.Component { username: '', mail: '', role: 'admin', - password: '' + password: '', + id: 0 }; } @@ -57,7 +58,8 @@ class NewUserDialog extends React.Component { username: '', mail: '', role: 'admin', - password: '' + password: '', + id: 0 }); } @@ -65,8 +67,9 @@ class NewUserDialog extends React.Component { // check all controls let username = this.state.username !== '' && this.state.username.length >= 3; let password = this.state.password !== ''; + let id = this.state.id !== 0; - this.valid = username && password; + this.valid = username && password && id; // return state to control switch(target) { @@ -74,6 +77,8 @@ class NewUserDialog extends React.Component { return username ? "success" : "error"; case 'password': return password ? "success" : "error"; + case 'id': + return id ? "success" : "error"; default: return "success"; } diff --git a/src/components/header-menu.js b/src/components/header-menu.js index b2daf0e..0273407 100644 --- a/src/components/header-menu.js +++ b/src/components/header-menu.js @@ -26,14 +26,15 @@ import { NavLink } from 'react-router-dom'; export default class HeaderMenu extends React.Component { render() { return
- + +
  • Home
  • Projects
  • Simulations
  • Simulators
  • - { this.props.currentRole === 'admin' ? + { this.props.currentRole === 'Admin' ?
  • User Management
  • : '' }
  • Logout
  • diff --git a/src/components/header.js b/src/components/header.js index 710ea9b..7d72e0c 100644 --- a/src/components/header.js +++ b/src/components/header.js @@ -21,20 +21,25 @@ import React from 'react'; import { Col, Button } from 'react-bootstrap'; +import { Hidden } from 'react-grid-system' import Icon from './icon'; class Header extends React.Component { render() { return (
    -
+

VILLASweb

- - {this.props.showMenuButton && - - } - + + + {this.props.showMenuButton && + + } + + ); } diff --git a/src/components/home.js b/src/components/home.js index b81bab7..63863fb 100644 --- a/src/components/home.js +++ b/src/components/home.js @@ -21,16 +21,24 @@ import React from 'react'; -import { Link } from 'react-router-dom'; +//import { Link } from 'react-router-dom'; -import RestAPI from '../api/rest-api'; +//import RestAPI from '../api/rest-api'; import config from '../config'; +import UserStore from "../stores/user-store"; class Home extends React.Component { constructor(props) { super(props); - this.state = {}; + let currentUser = UserStore.getState().currentUser; + + this.state = { + currentRole: currentUser ? currentUser.role : '', + currentUsername: currentUser ? currentUser.username: '', + currentUserID: currentUser ? currentUser.id: 0, + token: UserStore.getState().token + }; } getCounts(type) { @@ -56,15 +64,21 @@ class Home extends React.Component { VILLASweb is a frontend for distributed real-time simulation hosted by {config.admin.name}.

- This instance is hosting {this.getCounts('projects')} projects consisting of {this.getCounts('simulators')} simulators, {this.getCounts('visualizations')} visualizations and {this.getCounts('simulations')} simulations. - A total of {this.getCounts('users')} users are registered.
+ You are logged in as user {this.state.currentUsername} with ID {this.state.currentUserID} and role {this.state.currentRole}.

+ {/* +

+ This instance is hosting {this.getCounts('projects')} projects consisting of {this.getCounts('simulators')} simulators, {this.getCounts('visualizations')} visualizations and {this.getCounts('simulations')} simulations. + A total of {this.getCounts('users')} users are registered.
+

+ */}

Credits

VILLASweb is developed by the Institute for Automation of Complex Power Systems at the RWTH Aachen University.

Links

    diff --git a/src/components/login-form.js b/src/components/login-form.js index e2b48c6..7747723 100644 --- a/src/components/login-form.js +++ b/src/components/login-form.js @@ -61,20 +61,16 @@ class LoginForm extends Component { render() { return ( -
    + -
- Username - + Username this.handleChange(e)} /> - - Password - + Password this.handleChange(e)} /> @@ -82,14 +78,14 @@ class LoginForm extends Component { {this.props.loginMessage &&
-
+ Error: {this.props.loginMessage} } - + diff --git a/src/components/menu-sidebar.js b/src/components/menu-sidebar.js index 51d7d83..8ea2e8d 100644 --- a/src/components/menu-sidebar.js +++ b/src/components/menu-sidebar.js @@ -33,7 +33,7 @@ class SidebarMenu extends React.Component {
  • Projects
  • Simulations
  • Simulators
  • - { this.props.currentRole === 'admin' ? + { this.props.currentRole === 'Admin' ?
  • Users
  • : '' }
  • Logout
  • diff --git a/src/components/table-column.js b/src/components/table-column.js index 1aafc2e..151e3eb 100644 --- a/src/components/table-column.js +++ b/src/components/table-column.js @@ -36,7 +36,10 @@ class TableColumn extends Component { clickable: false, labelKey: null, checkbox: false, - checkboxKey: '' + checkboxKey: '', + labelStyle: null, + labelModifier: null + }; render() { diff --git a/src/components/table.js b/src/components/table.js index ed118a0..8d2d33d 100644 --- a/src/components/table.js +++ b/src/components/table.js @@ -74,7 +74,7 @@ class CustomTable extends Component { if (linkKey && data[linkKey] != null) { cell.push({content}); } else if (child.props.clickable) { - cell.push(); + cell.push(); } else { cell.push(content); } @@ -89,7 +89,13 @@ class CustomTable extends Component { labelContent = child.props.labelModifier(labelContent, data); } - cell.push( {labelContent.toString()}); + cell.push( +   + + {labelContent.toString()} + + + ); } if (child.props.dataIndex) { @@ -98,11 +104,11 @@ class CustomTable extends Component { // add buttons if (child.props.editButton) { - cell.push(); + cell.push(); } if (child.props.deleteButton) { - cell.push(); + cell.push(); } if (child.props.checkbox) { @@ -112,7 +118,7 @@ class CustomTable extends Component { } if (child.props.exportButton) { - cell.push(); + cell.push(); } return cell; diff --git a/src/containers/app.js b/src/containers/app.js index 5474190..763e012 100644 --- a/src/containers/app.js +++ b/src/containers/app.js @@ -26,6 +26,7 @@ import HTML5Backend from 'react-dnd-html5-backend'; import NotificationSystem from 'react-notification-system'; import { Redirect, Route } from 'react-router-dom'; import { Col } from 'react-bootstrap'; +import { Hidden } from 'react-grid-system' import AppDispatcher from '../app-dispatcher'; import SimulationStore from '../stores/simulation-store'; @@ -63,6 +64,8 @@ class App extends React.Component { simulators: SimulatorStore.getState(), simulations: SimulationStore.getState(), currentRole: currentUser ? currentUser.role : '', + currentUsername: currentUser ? currentUser.username: '', + currentUserID: UserStore.getState().userid, token: UserStore.getState().token, showSidebarMenu: false, @@ -72,6 +75,7 @@ class App extends React.Component { componentWillMount() { // if token stored locally, request user const token = localStorage.getItem('token'); + const userid = localStorage.getItem('userid'); if (token != null && token !== '') { // save token so we dont logout @@ -79,7 +83,8 @@ class App extends React.Component { AppDispatcher.dispatch({ type: 'users/logged-in', - token: token + token: token, + userid: userid }); } } @@ -115,17 +120,22 @@ class App extends React.Component { return (
    + {/*
    - - + */} + + + + +
    -
    +
    -
    + diff --git a/src/containers/login.js b/src/containers/login.js index ee613a6..93afa80 100644 --- a/src/containers/login.js +++ b/src/containers/login.js @@ -42,7 +42,8 @@ class Login extends Component { return { currentUser: UserStore.getState().currentUser, token: UserStore.getState().token, - loginMessage: UserStore.getState().loginMessage + loginMessage: UserStore.getState().loginMessage, + userid: UserStore.getState().userid }; } @@ -54,11 +55,13 @@ class Login extends Component { // if token stored locally, request user if (nextState.token == null) { const token = localStorage.getItem('token'); + const userid = localStorage.getItem('userid'); if (token != null && token !== '' && nextState.currentUser == null) { AppDispatcher.dispatch({ type: 'users/logged-in', - token: token + token: token, + userid: userid }); } } else { @@ -66,6 +69,7 @@ class Login extends Component { if (nextState.currentUser != null) { // save login in local storage localStorage.setItem('token', nextState.token); + localStorage.setItem('userid', nextState.userid); } } } diff --git a/src/containers/select-simulator.js b/src/containers/select-simulator.js index 88f7151..4b69ff1 100644 --- a/src/containers/select-simulator.js +++ b/src/containers/select-simulator.js @@ -46,7 +46,7 @@ class SelectSimulator extends React.Component { let selectedSimulator = nextProps.value; if (selectedSimulator == null) { if (this.state.simulators.length > 0) { - selectedSimulator = this.state.simulators[0]._id; + selectedSimulator = this.state.simulators[0].id; } else { selectedSimulator = ''; } @@ -60,7 +60,7 @@ class SelectSimulator extends React.Component { // send complete simulator to callback if (this.props.onChange != null) { - const simulator = this.state.simulators.find(s => s._id === event.target.value); + const simulator = this.state.simulators.find(s => s.id === event.target.value); this.props.onChange(simulator); } diff --git a/src/containers/simulation.js b/src/containers/simulation.js index 9f9a0f3..7a66ea1 100644 --- a/src/containers/simulation.js +++ b/src/containers/simulation.js @@ -101,7 +101,7 @@ class Simulation extends React.Component { const simulationModel = { simulation: this.state.simulation._id, name: 'New Simulation Model', - simulator: this.state.simulators.length > 0 ? this.state.simulators[0]._id : null, + simulator: this.state.simulators.length > 0 ? this.state.simulators[0].id : null, outputLength: 1, outputMapping: [{ name: 'Signal', type: 'Type' }], inputLength: 1, @@ -165,7 +165,7 @@ class Simulation extends React.Component { getSimulatorName(simulatorId) { for (let simulator of this.state.simulators) { - if (simulator._id === simulatorId) { + if (simulator.id === simulatorId) { return _.get(simulator, 'properties.name') || _.get(simulator, 'rawProperties.name') || simulator.uuid; } } diff --git a/src/containers/simulators.js b/src/containers/simulators.js index 20fb207..7972dfb 100644 --- a/src/containers/simulators.js +++ b/src/containers/simulators.js @@ -66,12 +66,15 @@ class Simulators extends Component { static calculateState() { const simulators = SimulatorStore.getState().sort((a, b) => { - if (a.state !== b.state) - return this.statePrio(a.state) > this.statePrio(b.state); - else if (a.name !== b.name) + if (a.state !== b.state) { + return Simulators.statePrio(a.state) > Simulators.statePrio(b.state); + } + else if (a.name !== b.name) { return a.name < b.name; - else + } + else { return a.stateUpdatedAt < b.stateUpdatedAt; + } }); return { @@ -123,6 +126,9 @@ class Simulators extends Component { if (data) { let simulator = this.state.simulators[this.state.modalIndex]; + console.log("modalIndex: " + this.state.modalIndex); + console.log("Simulator Host:" + simulator.host); + console.log("Simulator at index 1: " + this.state.simulators[1].host) simulator.properties = data; this.setState({ simulator }); @@ -151,7 +157,7 @@ class Simulators extends Component { exportSimulator(index) { // filter properties let simulator = Object.assign({}, this.state.simulators[index]); - delete simulator._id; + delete simulator.id; // show save dialog const blob = new Blob([JSON.stringify(simulator, null, 2)], { type: 'application/json' }); @@ -206,7 +212,7 @@ class Simulators extends Component { } } - isSimulatorOutdated(simulator) { + static isSimulatorOutdated(simulator) { if (!simulator.stateUpdatedAt) return true; @@ -215,10 +221,10 @@ class Simulators extends Component { return Date.now() - new Date(simulator.stateUpdatedAt) > fiveMinutes; } - stateLabelStyle = (state, simulator) => { + static stateLabelStyle(state, simulator){ var style = [ 'label' ]; - if (this.isSimulatorOutdated(simulator) && state !== 'shutdown') { + if (Simulators.isSimulatorOutdated(simulator) && state !== 'shutdown') { style.push('label-outdated'); } @@ -250,7 +256,7 @@ class Simulators extends Component { return style.join(' '); } - stateUpdateModifier = updatedAt => { + static stateUpdateModifier(updatedAt) { const date = new Date(updatedAt); return date.toLocaleString('de-DE'); @@ -268,15 +274,15 @@ class Simulators extends Component {
    this.onSimulatorChecked(index, event)} width='30' /> - + {/* */} - + { + RestAPI.delete(this.makeURL(this.url + '/' + object.id), token).then(response => { AppDispatcher.dispatch({ type: this.type + 's/removed', data: response[this.type], @@ -132,7 +132,7 @@ class RestDataManager { var obj = {}; obj[this.type] = this.filterKeys(object); - RestAPI.put(this.makeURL(this.url + '/' + object._id), obj, token).then(response => { + RestAPI.put(this.makeURL(this.url + '/' + object.id), obj, token).then(response => { AppDispatcher.dispatch({ type: this.type + 's/edited', data: response[this.type] diff --git a/src/data-managers/simulators-data-manager.js b/src/data-managers/simulators-data-manager.js index df45f34..4c34f51 100644 --- a/src/data-managers/simulators-data-manager.js +++ b/src/data-managers/simulators-data-manager.js @@ -30,7 +30,7 @@ class SimulatorsDataManager extends RestDataManager { doActions(simulator, action, token = null) { // TODO: Make only simulator id dependent - RestAPI.post(this.makeURL(this.url + '/' + simulator._id), action, token).then(response => { + RestAPI.post(this.makeURL(this.url + '/' + simulator.id), action, token).then(response => { AppDispatcher.dispatch({ type: 'simulators/action-started', data: response diff --git a/src/data-managers/users-data-manager.js b/src/data-managers/users-data-manager.js index 07d1b12..692b18b 100644 --- a/src/data-managers/users-data-manager.js +++ b/src/data-managers/users-data-manager.js @@ -33,7 +33,8 @@ class UsersDataManager extends RestDataManager { AppDispatcher.dispatch({ type: 'users/logged-in', token: response.token, - user: response.user + user: response.user, + userid: response.user.id }); }).catch(error => { AppDispatcher.dispatch({ @@ -43,19 +44,19 @@ class UsersDataManager extends RestDataManager { }); } - //getCurrentUser(token) { - // RestAPI.get(this.makeURL('/users/me'), token).then(response => { - // AppDispatcher.dispatch({ - // type: 'users/current-user', - // user: response.user - // }); - // }).catch(error => { - // AppDispatcher.dispatch({ - // type: 'users/current-user-error', - // error: error - // }); - // }); - //} + getCurrentUser(token, id) { + RestAPI.get(this.makeURL('/users/' + id), token).then(response => { + AppDispatcher.dispatch({ + type: 'users/current-user', + user: response.user + }); + }).catch(error => { + AppDispatcher.dispatch({ + type: 'users/current-user-error', + error: error + }); + }); + } } diff --git a/src/stores/array-store.js b/src/stores/array-store.js index ccd9689..2d4be7c 100644 --- a/src/stores/array-store.js +++ b/src/stores/array-store.js @@ -39,7 +39,7 @@ class ArrayStore extends ReduceStore { // search for existing element to update state.forEach((element, index, array) => { newElements = newElements.filter((updateElement, newIndex) => { - if (element._id === updateElement._id) { + if (element.id === updateElement.id) { // update each property for (var key in updateElement) { if (updateElement.hasOwnProperty(key)) { diff --git a/src/stores/simulator-store.js b/src/stores/simulator-store.js index 00b8635..03ecf73 100644 --- a/src/stores/simulator-store.js +++ b/src/stores/simulator-store.js @@ -38,7 +38,7 @@ class SimulatorStore extends ArrayStore { const endpoint = _.get(simulator, 'properties.endpoint') || _.get(simulator, 'rawProperties.endpoint'); if (endpoint != null && endpoint !== '') { - SimulatorDataDataManager.open(endpoint, simulator._id); + SimulatorDataDataManager.open(endpoint, simulator.id); } else { // console.warn('Endpoint not found for simulator at ' + endpoint); // console.log(simulator); @@ -53,7 +53,8 @@ class SimulatorStore extends ArrayStore { const endpoint = _.get(simulator, 'properties.endpoint') || _.get(simulator, 'rawProperties.endpoint'); if (endpoint != null && endpoint !== '') { - SimulatorDataDataManager.update(endpoint, simulator._id); + console.log("Updating simulatorid " + simulator.id); + SimulatorDataDataManager.update(endpoint, simulator.id); } return super.reduce(state, action); diff --git a/src/stores/user-store.js b/src/stores/user-store.js index ecaede5..c3c563f 100644 --- a/src/stores/user-store.js +++ b/src/stores/user-store.js @@ -35,6 +35,7 @@ class UserStore extends ReduceStore { users: [], currentUser: null, token: null, + userid: 0, loginMessage: null }; } @@ -54,14 +55,13 @@ class UserStore extends ReduceStore { case 'users/logged-in': // // request logged-in user data - //UsersDataManager.getCurrentUser(action.token); + UsersDataManager.getCurrentUser(action.token, action.userid); - //save token and logged-in user - return Object.assign({}, state, { token: action.token, currentUser: action.user }); + return Object.assign({}, state, { token: action.token, userid: action.userid}); - //case 'users/current-user': + case 'users/current-user': // // save logged-in user - // return Object.assign({}, state, { currentUser: action.user }); + return Object.assign({}, state, { currentUser: action.user}); case 'users/current-user-error': // discard user token From 755784f64c9b20aa602fd4abf37af3fdb2a9c28f Mon Sep 17 00:00:00 2001 From: Sonja Happ Date: Wed, 24 Jul 2019 10:39:11 +0200 Subject: [PATCH 008/391] fix font weight issue --- src/styles/widgets.css | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/styles/widgets.css b/src/styles/widgets.css index 2e79f89..c52835c 100644 --- a/src/styles/widgets.css +++ b/src/styles/widgets.css @@ -231,7 +231,7 @@ li.signal-legend::before { span.signal-unit { color: grey; font-style: italic; - font-weight: 50%; + font-weight: 200; } span.signal-unit::before { From edd7c4f39ddd99885e8b2688d3c4c5628b204254 Mon Sep 17 00:00:00 2001 From: Sonja Happ Date: Wed, 24 Jul 2019 10:42:02 +0200 Subject: [PATCH 009/391] - add session userID as param to dispatcher - fix issue with event handler for deletion of simulator --- src/containers/simulators.js | 28 ++++++++++++++++++---------- 1 file changed, 18 insertions(+), 10 deletions(-) diff --git a/src/containers/simulators.js b/src/containers/simulators.js index 7972dfb..f73e7d3 100644 --- a/src/containers/simulators.js +++ b/src/containers/simulators.js @@ -79,6 +79,7 @@ class Simulators extends Component { return { sessionToken: UserStore.getState().token, + sessionUserID: UserStore.getState().userid, simulators, modalSimulator: {}, deleteModal: false, @@ -90,11 +91,12 @@ class Simulators extends Component { componentWillMount() { AppDispatcher.dispatch({ type: 'simulators/start-load', - token: this.state.sessionToken + token: this.state.sessionToken, + userid: this.state.sessionUserID }); // Start timer for periodic refresh - this.timer = window.setInterval(() => this.refresh(), 1000); + this.timer = window.setInterval(() => this.refresh(), 5000); } componentWillUnmount() { @@ -104,7 +106,8 @@ class Simulators extends Component { refresh() { AppDispatcher.dispatch({ type: 'simulators/start-load', - token: this.state.sessionToken + token: this.state.sessionToken, + userid: this.state.sessionUserID }); } @@ -116,7 +119,8 @@ class Simulators extends Component { AppDispatcher.dispatch({ type: 'simulators/start-add', data, - token: this.state.sessionToken + token: this.state.sessionToken, + userid: this.state.sessionUserID }); } } @@ -135,12 +139,13 @@ class Simulators extends Component { AppDispatcher.dispatch({ type: 'simulators/start-edit', data: simulator, - token: this.state.sessionToken + token: this.state.sessionToken, + userid: this.state.sessionUserID }); } } - closeDeleteModal = confirmDelete => { + closeDeleteModal(confirmDelete){ this.setState({ deleteModal: false }); if (confirmDelete === false) { @@ -150,7 +155,8 @@ class Simulators extends Component { AppDispatcher.dispatch({ type: 'simulators/start-remove', data: this.state.modalSimulator, - token: this.state.sessionToken + token: this.state.sessionToken, + userid: this.state.sessionUserID }); } @@ -171,7 +177,8 @@ class Simulators extends Component { AppDispatcher.dispatch({ type: 'simulators/start-add', data, - token: this.state.sessionToken + token: this.state.sessionToken, + userid: this.state.sessionUserID }); } } @@ -207,7 +214,8 @@ class Simulators extends Component { type: 'simulators/start-action', simulator: this.state.simulators[index], data: action.data, - token: this.state.sessionToken + token: this.state.sessionToken, + userid: this.state.sessionUserID }); } } @@ -310,7 +318,7 @@ class Simulators extends Component { this.closeEditModal(data)} simulator={this.state.modalSimulator} /> this.closeImportModal(data)} /> - + this.closeDeleteModal(e)} /> ); } From 9dc65a640b8c40a778581a5ad4dcc4335809d8ac Mon Sep 17 00:00:00 2001 From: Sonja Happ Date: Wed, 24 Jul 2019 10:58:08 +0200 Subject: [PATCH 010/391] add new funding info on home site --- src/components/home.js | 3 +++ src/img/uel.png | Bin 0 -> 21278 bytes src/img/uel_efre.jpeg | Bin 0 -> 27272 bytes 3 files changed, 3 insertions(+) create mode 100644 src/img/uel.png create mode 100644 src/img/uel_efre.jpeg diff --git a/src/components/home.js b/src/components/home.js index 63863fb..70dedbd 100644 --- a/src/components/home.js +++ b/src/components/home.js @@ -89,11 +89,14 @@ class Home extends React.Component {

    Funding

    The development of VILLASframework projects have received funding from

      +
    • Urban Energy Lab 4.0 a project funded by OP EFRE NRW (European Regional Development Fund) for the setup of a novel energy research infrastructure.
    • RESERVE a European Union’s Horizon 2020 research and innovation programme under grant agreement No 727481
    • JARA-ENERGY. Jülich-Aachen Research Alliance (JARA) is an initiative of RWTH Aachen University and Forschungszentrum Jülich.
    Logo EU Logo EU + Logo UEL OP EFRE NRW + Logo UEL Logo ACS { //Logo JARA diff --git a/src/img/uel.png b/src/img/uel.png new file mode 100644 index 0000000000000000000000000000000000000000..57dc0bded61be5f945d994004c0201a57a1522c8 GIT binary patch literal 21278 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 literal 0 HcmV?d00001 diff --git a/src/img/uel_efre.jpeg b/src/img/uel_efre.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..9887c5499b0a102245b75077df0b79b492357522 GIT binary patch literal 27272 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Ξ|f}5qV2j}b^qk)yqzG4^Yu+nb6~hxSz>Lh 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 Mkip^mW=PCGI+k74+9Sj~y*iG|bW?8=CTc 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 Date: Wed, 24 Jul 2019 16:42:04 +0200 Subject: [PATCH 011/391] some fixes to make simulator add and edit work --- src/components/dialogs/edit-simulator.js | 4 ++-- src/containers/simulators.js | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/components/dialogs/edit-simulator.js b/src/components/dialogs/edit-simulator.js index 74edcd2..89ff7e7 100644 --- a/src/components/dialogs/edit-simulator.js +++ b/src/components/dialogs/edit-simulator.js @@ -41,7 +41,7 @@ class EditSimulatorDialog extends React.Component { onClose(canceled) { if (canceled === false) { if (this.valid) { - let data = {}; + let data = this.props.simulator.properties; if (this.state.name != null && this.state.name !== "" && this.state.name !== _.get(this.props.simulator, 'rawProperties.name')) { data.name = this.state.name; @@ -85,7 +85,7 @@ class EditSimulatorDialog extends React.Component { Properties - + diff --git a/src/containers/simulators.js b/src/containers/simulators.js index f73e7d3..aae637f 100644 --- a/src/containers/simulators.js +++ b/src/containers/simulators.js @@ -96,7 +96,7 @@ class Simulators extends Component { }); // Start timer for periodic refresh - this.timer = window.setInterval(() => this.refresh(), 5000); + this.timer = window.setInterval(() => this.refresh(), 10000); } componentWillUnmount() { From d4c1f3cbcc7167693bc210c8c6541e5fb6402215 Mon Sep 17 00:00:00 2001 From: Sonja Happ Date: Wed, 24 Jul 2019 16:54:42 +0200 Subject: [PATCH 012/391] fix for bsStyle error in delete dialog --- src/components/dialogs/delete-dialog.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/dialogs/delete-dialog.js b/src/components/dialogs/delete-dialog.js index 13ece5e..c69ad7c 100644 --- a/src/components/dialogs/delete-dialog.js +++ b/src/components/dialogs/delete-dialog.js @@ -43,7 +43,7 @@ class DeleteDialog extends React.Component { - + ; } From 3f03dc98e4074377379a513e62cb55d6bb4c8d25 Mon Sep 17 00:00:00 2001 From: Sonja Happ Date: Wed, 24 Jul 2019 17:03:02 +0200 Subject: [PATCH 013/391] refresh only if no edit or delete dialog is open --- src/containers/simulators.js | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/src/containers/simulators.js b/src/containers/simulators.js index aae637f..c44567f 100644 --- a/src/containers/simulators.js +++ b/src/containers/simulators.js @@ -96,7 +96,7 @@ class Simulators extends Component { }); // Start timer for periodic refresh - this.timer = window.setInterval(() => this.refresh(), 10000); + this.timer = window.setInterval(() => this.refresh(), 1000); } componentWillUnmount() { @@ -104,11 +104,17 @@ class Simulators extends Component { } refresh() { - AppDispatcher.dispatch({ - type: 'simulators/start-load', - token: this.state.sessionToken, - userid: this.state.sessionUserID - }); + + if (this.state.editModal || this.state.deleteModal){ + // do nothing since a dialog is open at the moment + } + else { + AppDispatcher.dispatch({ + type: 'simulators/start-load', + token: this.state.sessionToken, + userid: this.state.sessionUserID + }); + } } From 2a04039e2afddc49965e40990d0894c36cc6b9ee Mon Sep 17 00:00:00 2001 From: Sonja Happ Date: Mon, 19 Aug 2019 15:26:13 +0200 Subject: [PATCH 014/391] add column for user ID in list of users --- src/containers/users.js | 1 + 1 file changed, 1 insertion(+) diff --git a/src/containers/users.js b/src/containers/users.js index ecb9364..d081bb4 100644 --- a/src/containers/users.js +++ b/src/containers/users.js @@ -123,6 +123,7 @@ class Users extends Component {
    + this.getHumanRoleName(role)} /> this.setState({ editModal: true, modalData: this.state.users[index] })} onDelete={index => this.setState({ deleteModal: true, modalData: this.state.users[index] })} /> From 2ecd1890d9ea0ffa65d9e1c42e18bca4f5135dc9 Mon Sep 17 00:00:00 2001 From: Sonja Happ Date: Mon, 19 Aug 2019 15:28:02 +0200 Subject: [PATCH 015/391] revise form for adding a new user - some modifications required due to React update - merge form validation with handling changes - role of new user defaults to User instead of Admin --- src/components/dialogs/new-user.js | 54 +++++++++++------------------- 1 file changed, 20 insertions(+), 34 deletions(-) diff --git a/src/components/dialogs/new-user.js b/src/components/dialogs/new-user.js index a0c1ed0..e711596 100644 --- a/src/components/dialogs/new-user.js +++ b/src/components/dialogs/new-user.js @@ -20,7 +20,7 @@ ******************************************************************************/ import React from 'react'; -import { FormGroup, FormControl, FormLabel, FormText } from 'react-bootstrap'; +import { FormGroup, FormControl, FormLabel, FormText, Col } from 'react-bootstrap'; import Dialog from './dialog'; @@ -33,9 +33,8 @@ class NewUserDialog extends React.Component { this.state = { username: '', mail: '', - role: 'admin', + role: 'User', password: '', - id: 0 }; } @@ -51,65 +50,52 @@ class NewUserDialog extends React.Component { handleChange(e) { this.setState({ [e.target.id]: e.target.value }); + + // check all controls + let username = this.state.username !== '' && this.state.username.length >= 3; + let password = this.state.password !== ''; + let role = this.state.role !== ''; + let mail = this.state.mail !== ''; + + this.valid = username && password && role && mail; + } resetState() { this.setState({ username: '', mail: '', - role: 'admin', + role: 'User', password: '', - id: 0 }); } - validateForm(target) { - // check all controls - let username = this.state.username !== '' && this.state.username.length >= 3; - let password = this.state.password !== ''; - let id = this.state.id !== 0; - - this.valid = username && password && id; - - // return state to control - switch(target) { - case 'username': - return username ? "success" : "error"; - case 'password': - return password ? "success" : "error"; - case 'id': - return id ? "success" : "error"; - default: - return "success"; - } - } - render() { return ( this.onClose(c)} onReset={() => this.resetState()} valid={this.valid}>
    - + Username this.handleChange(e)} /> Min 3 characters. - + E-mail this.handleChange(e)} /> - + Password this.handleChange(e)} /> - + Role - this.handleChange(e)}> - - - + this.handleChange(e)}> + + + From 7cf629517b2e261c2886767e78dde4f584c80ca6 Mon Sep 17 00:00:00 2001 From: Sonja Happ Date: Mon, 19 Aug 2019 16:05:43 +0200 Subject: [PATCH 016/391] rename Users side bar element to User Management --- src/components/menu-sidebar.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/menu-sidebar.js b/src/components/menu-sidebar.js index 8ea2e8d..000cdf7 100644 --- a/src/components/menu-sidebar.js +++ b/src/components/menu-sidebar.js @@ -34,7 +34,7 @@ class SidebarMenu extends React.Component {
  • Simulations
  • Simulators
  • { this.props.currentRole === 'Admin' ? -
  • Users
  • : '' +
  • User Management
  • : '' }
  • Logout
  • From 26bc566e36a58649d7d79e25715ff333a332d1d0 Mon Sep 17 00:00:00 2001 From: Sonja Happ Date: Mon, 19 Aug 2019 16:07:21 +0200 Subject: [PATCH 017/391] - some changes due to React update - make edit user dialog work with new backend - form validation moved to handle changes method - Admins can change any user's password --- src/components/dialogs/edit-user.js | 63 ++++++++++++++++++----------- 1 file changed, 39 insertions(+), 24 deletions(-) diff --git a/src/components/dialogs/edit-user.js b/src/components/dialogs/edit-user.js index d6f1f84..0d901bd 100644 --- a/src/components/dialogs/edit-user.js +++ b/src/components/dialogs/edit-user.js @@ -20,7 +20,7 @@ ******************************************************************************/ import React from 'react'; -import { FormGroup, FormControl, FormLabel } from 'react-bootstrap'; +import {FormGroup, FormControl, FormLabel, Col} from 'react-bootstrap'; import Dialog from './dialog'; @@ -34,7 +34,8 @@ class EditUserDialog extends React.Component { username: '', mail: '', role: '', - _id: '' + id: '', + password: '' } } @@ -50,52 +51,66 @@ class EditUserDialog extends React.Component { handleChange(e) { this.setState({ [e.target.id]: e.target.value }); - } - resetState() { - this.setState({ - username: this.props.user.username, - mail: this.props.user.mail, - role: this.props.user.role, - _id: this.props.user._id - }); - } - - validateForm(target) { // check all controls var username = true; + var role = true; + var mail = true; + var pw = true if (this.state.username === '') { username = false; } - this.valid = username; + if (this.state.role === ''){ + role = false; + } - // return state to control - if (target === 'username') return username ? "success" : "error"; + if(this.state.mail === ''){ + mail = false; + } - return "success"; + if(this.state.password === ''){ + pw = false; + } + + // form is valid if any of the fields contain somethig + this.valid = username || role || mail || pw; + + } + + resetState() { + this.setState({ + //username: this.props.user.username, + //mail: this.props.user.mail, + role: this.props.user.role, + id: this.props.user.id + }); } render() { return ( this.onClose(c)} onReset={() => this.resetState()} valid={this.valid}>
    - + Username this.handleChange(e)} /> - + E-mail this.handleChange(e)} /> - + + Password + this.handleChange(e)} /> + + Role - this.handleChange(e)}> - - - + this.handleChange(e)}> + + + From 982e56614f895dba39eec757a6bd187f8822407f Mon Sep 17 00:00:00 2001 From: Sonja Happ Date: Mon, 19 Aug 2019 16:09:30 +0200 Subject: [PATCH 018/391] fix for delete dialog of users --- src/containers/users.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/containers/users.js b/src/containers/users.js index d081bb4..b61e16c 100644 --- a/src/containers/users.js +++ b/src/containers/users.js @@ -75,7 +75,7 @@ class Users extends Component { } } - closeDeleteModal = confirmDelete => { + closeDeleteModal(confirmDelete) { this.setState({ deleteModal: false }); if (confirmDelete === false) { @@ -134,7 +134,7 @@ class Users extends Component { this.closeNewModal(data)} /> this.closeEditModal(data)} user={this.state.modalData} /> - + this.closeDeleteModal(e)} /> ); } From 78a604af2ec560b0349212314fa306a3fedbcf76 Mon Sep 17 00:00:00 2001 From: Sonja Happ Date: Tue, 20 Aug 2019 11:47:23 +0200 Subject: [PATCH 019/391] started creation of scenario element to replace simulation and project, WIP --- src/components/dialogs/edit-scenario.js | 99 ++++++ src/components/dialogs/import-scenario.js | 151 +++++++++ src/components/dialogs/new-scenario.js | 95 ++++++ src/components/menu-sidebar.js | 6 +- src/containers/app.js | 32 +- src/containers/scenario.js | 297 ++++++++++++++++++ src/containers/scenarios.js | 328 ++++++++++++++++++++ src/containers/simulation-model.js | 12 +- src/data-managers/scenarios-data-manager.js | 60 ++++ src/stores/scenario-store.js | 63 ++++ 10 files changed, 1122 insertions(+), 21 deletions(-) create mode 100644 src/components/dialogs/edit-scenario.js create mode 100644 src/components/dialogs/import-scenario.js create mode 100644 src/components/dialogs/new-scenario.js create mode 100644 src/containers/scenario.js create mode 100644 src/containers/scenarios.js create mode 100644 src/data-managers/scenarios-data-manager.js create mode 100644 src/stores/scenario-store.js diff --git a/src/components/dialogs/edit-scenario.js b/src/components/dialogs/edit-scenario.js new file mode 100644 index 0000000..0ce5dd6 --- /dev/null +++ b/src/components/dialogs/edit-scenario.js @@ -0,0 +1,99 @@ +/** + * File: edit-scenario.js + * Author: Sonja Happ + * Date: 20.08.2019 + * + * This file is part of VILLASweb. + * + * VILLASweb is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * VILLASweb is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with VILLASweb. If not, see . + ******************************************************************************/ + +import React from 'react'; +import {FormGroup, FormControl, FormLabel, Col} from 'react-bootstrap'; + +import Dialog from './dialog'; +import ParametersEditor from '../parameters-editor'; + +class EditScenarioDialog extends React.Component { + valid = true; + + constructor(props) { + super(props); + + this.state = { + name: '', + id: '', + startParameters: {} + }; + } + + onClose = canceled => { + if (canceled) { + if (this.props.onClose != null) { + this.props.onClose(); + } + + return; + } + + if (this.valid && this.props.onClose != null) { + this.props.onClose(this.state); + } + }; + + handleChange = event => { + this.setState({ [event.target.id]: event.target.value }); + + let name = true; + + if (this.state.name === '') { + name = false; + } + + this.valid = name; + + }; + + resetState = () => { + this.setState({ + name: this.props.scenario.name, + id: this.props.scenario.id, + startParameters: this.props.scenario.startParameters || {} + }); + } + + handleStartParametersChange = startParameters => { + this.setState({ startParameters }); + } + + render() { + return +
    + + Name + + + + + + Start Parameters + + + + +
    ; + } +} + +export default EditScenarioDialog; diff --git a/src/components/dialogs/import-scenario.js b/src/components/dialogs/import-scenario.js new file mode 100644 index 0000000..bab9f46 --- /dev/null +++ b/src/components/dialogs/import-scenario.js @@ -0,0 +1,151 @@ +/** + * File: import-scenario.js + * Author: Sonja Happ + * Date: 20.08.2019 + * + * This file is part of VILLASweb. + * + * VILLASweb is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * VILLASweb is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with VILLASweb. If not, see . + ******************************************************************************/ + +import React from 'react'; +import {FormGroup, FormControl, FormLabel, Col} from 'react-bootstrap'; + +import Dialog from './dialog'; +import ParametersEditor from '../parameters-editor'; + +class ImportScenarioDialog extends React.Component { + valid = false; + imported = false; + + constructor(props) { + super(props); + + this.state = { + name: '', + running: '', + simulationModels: [], + startParameters: {} + }; + } + + onClose = canceled => { + if (canceled) { + if (this.props.onClose != null) { + this.props.onClose(); + } + + return; + } + + if (this.valid && this.props.onClose != null) { + this.props.onClose(this.state); + } + } + + handleChange(e, index) { + if (e.target.id === 'simulator') { + const models = this.state.models; + models[index].simulator = JSON.parse(e.target.value); + + this.setState({ models }); + + return; + } + + this.setState({ [e.target.id]: e.target.value }); + + // check all controls + let name = true; + + if (this.state.name === '') { + name = false; + } + + this.valid = name; + } + + resetState = () => { + this.setState({ name: '', models: [], startParameters: {} }); + + this.imported = false; + } + + loadFile = event => { + const file = event.target.files[0]; + + if (!file.type.match('application/json')) { + return; + } + + // create file reader + const reader = new FileReader(); + const self = this; + + reader.onload = onloadEvent => { + const scenario = JSON.parse(onloadEvent.target.result); + + // scenario.simulationModels.forEach(model => { + // model.simulator = { + // node: self.props.nodes[0]._id, + // simulator: 0 + // }; + // }); + + self.imported = true; + self.valid = true; + self.setState({ name: scenario.name, models: scenario.simulationModels, startParameters: scenario.startParameters, running: scenario.running }); + }; + + reader.readAsText(file); + } + + render() { + return +
    + + Scenario File + + + + + Name + this.handleChange(e)} /> + + + + + Start Parameters + + + + + {/* {this.state.models.map((model, index) => ( + + {model.name} - Simulator + this.handleChange(e, index)}> + {this.props.nodes.map(node => ( + node.simulators.map((simulator, index) => ( + + )) + ))} + + + ))} */} + +
    ; + } +} + +export default ImportScenarioDialog; diff --git a/src/components/dialogs/new-scenario.js b/src/components/dialogs/new-scenario.js new file mode 100644 index 0000000..ff8dc68 --- /dev/null +++ b/src/components/dialogs/new-scenario.js @@ -0,0 +1,95 @@ +/** + * File: new-scenario.js + * Author: Sonja Happ + * Date: 20.08.2019 + * + * This file is part of VILLASweb. + * + * VILLASweb is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * VILLASweb is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with VILLASweb. If not, see . + ******************************************************************************/ + +import React from 'react'; +import {FormGroup, FormControl, FormLabel, Col} from 'react-bootstrap'; + +import Dialog from './dialog'; +import ParametersEditor from '../parameters-editor'; + +class NewScenarioDialog extends React.Component { + valid = false; + + constructor(props) { + super(props); + + this.state = { + name: '', + startParameters: {}, + running: false + }; + } + + onClose = canceled => { + if (canceled) { + if (this.props.onClose != null) { + this.props.onClose(); + } + + return; + } + + if (this.valid && this.props.onClose != null) { + this.props.onClose(this.state); + } + } + + handleChange = event => { + this.setState({ [event.target.id]: event.target.value }); + + // check all controls + let name = true; + + if (this.state.name === '') { + name = false; + } + + this.valid = name; + } + + resetState = () => { + this.setState({ name: '', startParameters: {} }); + } + + handleStartParametersChange = startParameters => { + this.setState({ startParameters }); + } + + render() { + return +
    + + Name + + + + + + Start Parameters + + + + +
    ; + } +} + +export default NewScenarioDialog; diff --git a/src/components/menu-sidebar.js b/src/components/menu-sidebar.js index 000cdf7..70a633a 100644 --- a/src/components/menu-sidebar.js +++ b/src/components/menu-sidebar.js @@ -22,6 +22,9 @@ import React from 'react'; import { NavLink } from 'react-router-dom'; +//
  • Simulations
  • +//
  • Projects
  • + class SidebarMenu extends React.Component { render() { return ( @@ -30,8 +33,7 @@ class SidebarMenu extends React.Component {
    • Home
    • -
    • Projects
    • -
    • Simulations
    • +
    • Scenarios
    • Simulators
    • { this.props.currentRole === 'Admin' ?
    • User Management
    • : '' diff --git a/src/containers/app.js b/src/containers/app.js index 763e012..93c860e 100644 --- a/src/containers/app.js +++ b/src/containers/app.js @@ -29,7 +29,7 @@ import { Col } from 'react-bootstrap'; import { Hidden } from 'react-grid-system' import AppDispatcher from '../app-dispatcher'; -import SimulationStore from '../stores/simulation-store'; +import ScenarioStore from '../stores/scenario-store'; import SimulatorStore from '../stores/simulator-store'; import UserStore from '../stores/user-store'; import NotificationsDataManager from '../data-managers/notifications-data-manager'; @@ -40,12 +40,14 @@ import Footer from '../components/footer'; import SidebarMenu from '../components/menu-sidebar'; import HeaderMenu from '../components/header-menu'; -import Projects from './projects'; -import Project from './project'; +//import Projects from './projects'; +//import Project from './project'; import Simulators from './simulators'; import Visualization from './visualization'; -import Simulations from './simulations'; -import Simulation from './simulation'; +//import Simulations from './simulations'; +//import Simulation from './simulation'; +import Scenarios from './scenarios' +import Scenario from './scenario' import SimulationModel from './simulation-model'; import Users from './users'; @@ -54,7 +56,7 @@ import '../styles/app.css'; class App extends React.Component { static getStores() { - return [ SimulatorStore, UserStore, SimulationStore ]; + return [ SimulatorStore, UserStore, ScenarioStore]; } static calculateState(prevState) { @@ -62,7 +64,7 @@ class App extends React.Component { return { simulators: SimulatorStore.getState(), - simulations: SimulationStore.getState(), + scenarios: ScenarioStore.getState(), currentRole: currentUser ? currentUser.role : '', currentUsername: currentUser ? currentUser.username: '', currentUserID: UserStore.getState().userid, @@ -90,14 +92,14 @@ class App extends React.Component { } componentDidMount() { - // load all simulators and simulations to fetch simulation data + // load all simulators and scenarios to fetch data AppDispatcher.dispatch({ type: 'simulators/start-load', token: this.state.token }); AppDispatcher.dispatch({ - type: 'simulations/start-load', + type: 'scenarios/start-load', token: this.state.token }); @@ -142,11 +144,9 @@ class App extends React.Component {
      - - - - + + @@ -161,6 +161,12 @@ class App extends React.Component { } } +// Removed routes +// +// +// +// + let fluxContainerConverter = require('./FluxContainerConverter'); export default Container.create(fluxContainerConverter.convert(App)); //DragDropContext(HTML5Backend)(Container.create(App)); diff --git a/src/containers/scenario.js b/src/containers/scenario.js new file mode 100644 index 0000000..ae03741 --- /dev/null +++ b/src/containers/scenario.js @@ -0,0 +1,297 @@ +/** + * File: scenario.js + * Author: Sonja Happ + * Date: 20.08.2019 + * + * This file is part of VILLASweb. + * + * VILLASweb is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * VILLASweb is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with VILLASweb. If not, see . + ******************************************************************************/ + +import React from 'react'; +import { Container } from 'flux/utils'; +import { Button } from 'react-bootstrap'; +import FileSaver from 'file-saver'; +import _ from 'lodash'; + +import ScenarioStore from '../stores/scenario-store'; +import SimulatorStore from '../stores/simulator-store'; +import SimulationModelStore from '../stores/simulation-model-store'; +import UserStore from '../stores/user-store'; +import AppDispatcher from '../app-dispatcher'; + +import Icon from '../components/icon'; +import Table from '../components/table'; +import TableColumn from '../components/table-column'; +import ImportSimulationModelDialog from '../components/dialogs/import-simulation-model'; + +import SimulatorAction from '../components/simulator-action'; +import DeleteDialog from '../components/dialogs/delete-dialog'; + +class Scenario extends React.Component { + static getStores() { + return [ ScenarioStore, SimulatorStore, SimulationModelStore, UserStore ]; + } + + static calculateState(prevState, props) { + // get selected scenario + const sessionToken = UserStore.getState().token; + + let scenario = ScenarioStore.getState().find(s => s.id === props.match.params.scenario); + if (scenario == null) { + AppDispatcher.dispatch({ + type: 'scenarios/start-load', + data: props.match.params.scenario, + token: sessionToken + }); + + scenario = {}; + } + + // load models + let simulationModels = []; + if (scenario.simulationModels != null) { + simulationModels = SimulationModelStore.getState().filter(m => m != null && scenario.simulationModels.includes(m.id)); + } + + return { + simulationModels, + scenario, + + //simulators: SimulatorStore.getState(), + sessionToken, + + deleteModal: false, + importModal: false, + modalData: {}, + + selectedSimulationModels: [] + } + } + + componentWillMount() { + AppDispatcher.dispatch({ + type: 'scenarios/start-load', + token: this.state.sessionToken + }); + + AppDispatcher.dispatch({ + type: 'simulationModels/start-load', + token: this.state.sessionToken + }); + + AppDispatcher.dispatch({ + type: 'simulators/start-load', + token: this.state.sessionToken + }); + + //TODO users + + //TODO dashboards + + + + + } + + addSimulationModel = () => { + const simulationModel = { + scenario: this.state.scenario.id, + name: 'New Simulation Model', + simulator: this.state.simulators.length > 0 ? this.state.simulators[0].id : null, + outputLength: 1, + outputMapping: [{ name: 'Signal', type: 'Type' }], + inputLength: 1, + inputMapping: [{ name: 'Signal', type: 'Type' }] + }; + + AppDispatcher.dispatch({ + type: 'simulationModels/start-add', + data: simulationModel, + token: this.state.sessionToken + }); + + this.setState({ scenario: {} }, () => { + AppDispatcher.dispatch({ + type: 'scenarios/start-load', + data: this.props.match.params.scenario, + token: this.state.sessionToken + }); + }); + } + + closeDeleteModal = confirmDelete => { + this.setState({ deleteModal: false }); + + if (confirmDelete === false) { + return; + } + + AppDispatcher.dispatch({ + type: 'simulationModels/start-remove', + data: this.state.modalData, + token: this.state.sessionToken + }); + } + + importSimulationModel = simulationModel => { + this.setState({ importModal: false }); + + if (simulationModel == null) { + return; + } + + simulationModel.scenario = this.state.scenario.id; + + console.log(simulationModel); + + AppDispatcher.dispatch({ + type: 'simulationModels/start-add', + data: simulationModel, + token: this.state.sessionToken + }); + + this.setState({ scenario: {} }, () => { + AppDispatcher.dispatch({ + type: 'scenarios/start-load', + data: this.props.match.params.scenario, + token: this.state.sessionToken + }); + }); + } + + getSimulatorName(simulatorId) { + for (let simulator of this.state.simulators) { + if (simulator.id === simulatorId) { + return _.get(simulator, 'properties.name') || _.get(simulator, 'rawProperties.name') || simulator.uuid; + } + } + } + + exportModel(index) { + // filter properties + const model = Object.assign({}, this.state.simulationModels[index]); + + delete model.simulator; + delete model.scenario; + + // show save dialog + const blob = new Blob([JSON.stringify(model, null, 2)], { type: 'application/json' }); + FileSaver.saveAs(blob, 'simulation model - ' + model.name + '.json'); + } + + onSimulationModelChecked(index, event) { + const selectedSimulationModels = Object.assign([], this.state.selectedSimulationModels); + for (let key in selectedSimulationModels) { + if (selectedSimulationModels[key] === index) { + // update existing entry + if (event.target.checked) { + return; + } + + selectedSimulationModels.splice(key, 1); + + this.setState({ selectedSimulationModels }); + return; + } + } + + // add new entry + if (event.target.checked === false) { + return; + } + + selectedSimulationModels.push(index); + this.setState({ selectedSimulationModels }); + } + + runAction = action => { + for (let index of this.state.selectedSimulationModels) { + // get simulator for model + let simulator = null; + for (let sim of this.state.simulators) { + if (sim._id === this.state.simulationModels[index].simulator) { + simulator = sim; + } + } + + if (simulator == null) { + continue; + } + + if (action.data.action === 'start') { + action.data.parameters = this.state.simulationModels[index].startParameters; + } + + AppDispatcher.dispatch({ + type: 'simulators/start-action', + simulator, + data: action.data, + token: this.state.sessionToken + }); + } + } + + render() { + const buttonStyle = { + marginLeft: '10px' + }; + + return
      +

      {this.state.simulation.name}

      + +
    + this.onSimulationModelChecked(index, event)} width='30' /> + + this.getSimulatorName(simulator)} /> + + + this.setState({ deleteModal: true, modalData: this.state.simulationModels[index], modalIndex: index })} + onExport={index => this.exportModel(index)} + /> +
    + +
    + +
    + +
    + + +
    + +
    + + + + +
    ; + } +} + +let fluxContainerConverter = require('./FluxContainerConverter'); +export default Container.create(fluxContainerConverter.convert(Scenario), { withProps: true }); diff --git a/src/containers/scenarios.js b/src/containers/scenarios.js new file mode 100644 index 0000000..72b63ee --- /dev/null +++ b/src/containers/scenarios.js @@ -0,0 +1,328 @@ +/** + * File: scenarios.js + * Author: Sonja Happ + * Date: 20.08.2019 + * + * This file is part of VILLASweb. + * + * VILLASweb is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * VILLASweb is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with VILLASweb. If not, see . + ******************************************************************************/ + +import React, { Component } from 'react'; +import { Container } from 'flux/utils'; +import { Button } from 'react-bootstrap'; +import FileSaver from 'file-saver'; + +import AppDispatcher from '../app-dispatcher'; +import ScenarioStore from '../stores/scenario-store'; +import UserStore from '../stores/user-store'; +import SimulatorStore from '../stores/simulator-store'; +import SimulationModelStore from '../stores/simulation-model-store'; + +import Icon from '../components/icon'; +import Table from '../components/table'; +import TableColumn from '../components/table-column'; +import NewScenarioDialog from '../components/dialogs/new-scenario'; +import EditScenarioDialog from '../components/dialogs/edit-scenario'; +import ImportScenarioDialog from '../components/dialogs/import-scenario'; + +import SimulatorAction from '../components/simulator-action'; +import DeleteDialog from '../components/dialogs/delete-dialog'; + +class Scenarios extends Component { + static getStores() { + return [ ScenarioStore, UserStore, SimulatorStore, SimulationModelStore ]; + } + + static calculateState() { + const scenarios = ScenarioStore.getState(); + const simulationModels = SimulationModelStore.getState(); + const simulators = SimulatorStore.getState(); + + const sessionToken = UserStore.getState().token; + + return { + scenarios, + simulationModels, + simulators, + sessionToken, + + newModal: false, + deleteModal: false, + editModal: false, + importModal: false, + modalScenario: {}, + + selectedScenarios: [] + }; + } + + componentDidMount() { + AppDispatcher.dispatch({ + type: 'scenarios/start-load', + token: this.state.sessionToken + }); + } + + componentDidUpdate() { + const simulationModelIds = []; + const simulatorIds = []; + + for (let scenario of this.state.scenarios) { + for (let modelId of scenario.simulationModels) { + const model = this.state.simulationModels.find(m => m != null && m.id === modelId); + + if (model == null) { + simulationModelIds.push(modelId); + + continue; + } + + if (this.state.simulators.includes(s => s._id === model.simulator) === false) { + simulatorIds.push(model.simulator); + } + } + } + + if (simulationModelIds.length > 0) { + AppDispatcher.dispatch({ + type: 'simulationModels/start-load', + data: simulationModelIds, + token: this.state.sessionToken + }); + } + + if (simulatorIds.length > 0) { + AppDispatcher.dispatch({ + type: 'simulators/start-load', + data: simulatorIds, + token: this.state.sessionToken + }); + } + } + + closeNewModal(data) { + this.setState({ newModal : false }); + + if (data) { + AppDispatcher.dispatch({ + type: 'scenarios/start-add', + data, + token: this.state.sessionToken + }); + } + } + + showDeleteModal(id) { + // get scenario by id + var deleteScenario; + + this.state.scenarios.forEach((scenario) => { + if (scenario.id === id) { + deleteScenario = scenario; + } + }); + + this.setState({ deleteModal: true, modalScenario: deleteScenario }); + } + + closeDeleteModal = confirmDelete => { + this.setState({ deleteModal: false }); + + if (confirmDelete === false) { + return; + } + + AppDispatcher.dispatch({ + type: 'scenarios/start-remove', + data: this.state.modalScenario, + token: this.state.sessionToken + }); + } + + showEditModal(id) { + // get scenario by id + var editScenario; + + this.state.scenarios.forEach((scenario) => { + if (scenario.id === id) { + editScenario = scenario; + } + }); + + this.setState({ editModal: true, modalScenario: editScenario }); + } + + closeEditModal(data) { + this.setState({ editModal : false }); + + if (data != null) { + AppDispatcher.dispatch({ + type: 'scenarios/start-edit', + data, + token: this.state.sessionToken + }); + } + } + + closeImportModal(data) { + this.setState({ importModal: false }); + + if (data) { + AppDispatcher.dispatch({ + type: 'scenarios/start-add', + data, + token: this.state.sessionToken + }); + } + } + + onModalKeyPress = (event) => { + if (event.key === 'Enter') { + event.preventDefault(); + + this.confirmDeleteModal(); + } + } + + exportScenario(index) { + // filter properties + let scenario = Object.assign({}, this.state.scenarios[index]); + delete scenario.id; + delete scenario.users; + delete scenario.dashboards; + + scenario.simulationModels.forEach(model => { + delete model.simulator; + }); + + // show save dialog + const blob = new Blob([JSON.stringify(scenario, null, 2)], { type: 'application/json' }); + FileSaver.saveAs(blob, 'scenario - ' + scenario.name + '.json'); + } + + onScenarioChecked(index, event) { + const selectedScenarios = Object.assign([], this.state.selectedScenarios); + for (let key in selectedScenarios) { + if (selectedScenarios[key] === index) { + // update existing entry + if (event.target.checked) { + return; + } + + selectedScenarios.splice(key, 1); + + this.setState({ selectedScenarios }); + return; + } + } + + // add new entry + if (event.target.checked === false) { + return; + } + + selectedScenarios.push(index); + this.setState({ selectedScenarios }); + } + + runAction = action => { + for (let index of this.state.selectedScenarios) { + for (let model of this.state.scenarios[index].simulationModels) { + // get simulation model + const simulationModel = this.state.simulationModels.find(m => m != null && m.id === model); + if (simulationModel == null) { + continue; + } + + // get simulator for model + let simulator = null; + for (let sim of this.state.simulators) { + if (sim.id === simulationModel.simulatorID) { + simulator = sim; + } + } + + if (simulator == null) { + continue; + } + + if (action.data.action === 'start') { + action.data.parameters = Object.assign({}, this.state.scenarios[index].startParameters, simulationModel.startParameters); + } + + AppDispatcher.dispatch({ + type: 'simulators/start-action', + simulator, + data: action.data, + token: this.state.sessionToken + }); + } + } + } + + render() { + const buttonStyle = { + marginLeft: '10px' + }; + + return ( +
    +

    Scenarios

    + + + this.onScenarioChecked(index, event)} width='30' /> + + this.setState({ editModal: true, modalScenario: this.state.scenarios[index] })} + onDelete={index => this.setState({ deleteModal: true, modalScenario: this.state.scenarios[index] })} + onExport={index => this.exportScenario(index)} + /> +
    + +
    + +
    + +
    + + +
    + +
    + + this.closeNewModal(data)} /> + this.closeEditModal(data)} scenario={this.state.modalScenario} /> + this.closeImportModal(data)} nodes={this.state.nodes} /> + + +
    + ); + } +} + +let fluxContainerConverter = require('./FluxContainerConverter'); +export default Container.create(fluxContainerConverter.convert(Scenarios)); diff --git a/src/containers/simulation-model.js b/src/containers/simulation-model.js index 9ba7390..2f536ec 100644 --- a/src/containers/simulation-model.js +++ b/src/containers/simulation-model.js @@ -39,7 +39,7 @@ class SimulationModel extends React.Component { } static calculateState(prevState, props) { - const simulationModel = SimulationModelStore.getState().find(m => m._id === props.match.params.simulationModel); + const simulationModel = SimulationModelStore.getState().find(m => m.id === props.match.params.simulationModel); return { simulationModel: simulationModel || {}, @@ -66,11 +66,11 @@ class SimulationModel extends React.Component { token: this.state.sessionToken }); - this.props.history.push('/simulations/' + this.state.simulationModel.simulation); + this.props.history.push('/scenarios/' + this.state.simulationModel.scenarioID); } discardChanges = () => { - this.props.history.push('/simulations/' + this.state.simulationModel.simulation); + this.props.history.push('/scenarios/' + this.state.simulationModel.scenarioID); } handleSimulatorChange = simulator => { @@ -141,14 +141,14 @@ class SimulationModel extends React.Component {
    - Start Parameters + Start Parameters - +
    - + diff --git a/src/data-managers/scenarios-data-manager.js b/src/data-managers/scenarios-data-manager.js new file mode 100644 index 0000000..136ee3d --- /dev/null +++ b/src/data-managers/scenarios-data-manager.js @@ -0,0 +1,60 @@ +/** + * File: scenarios-data-manager.js + * Author: Sonja Happ + * Date: 20.08.2019 + * + * This file is part of VILLASweb. + * + * VILLASweb is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * VILLASweb is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with VILLASweb. If not, see . + ******************************************************************************/ + +import RestDataManager from './rest-data-manager'; +import RestAPI from "../api/rest-api"; +import AppDispatcher from "../app-dispatcher"; + +class ScenariosDataManager extends RestDataManager { + constructor() { + super('scenario', '/scenarios'); + } + + getSimulationModels(token, id) { + RestAPI.get(this.makeURL('/scenarios/' + id + '/models'), token).then(response => { + AppDispatcher.dispatch({ + type: 'scenarios/simulationmodels', + simulationmodels: response.models + }); + }).catch(error => { + AppDispatcher.dispatch({ + type: 'scenarios/simulationmodels-error', + error: error + }); + }); + } + + getDashboards(token, id) { + RestAPI.get(this.makeURL('/scenarios/' + id + '/dashboards'), token).then(response => { + AppDispatcher.dispatch({ + type: 'scenarios/dashboards', + dashboards: response.dashboards + }); + }).catch(error => { + AppDispatcher.dispatch({ + type: 'scenarios/dashboards-error', + error: error + }); + }); + } + +} +export default new ScenariosDataManager(); diff --git a/src/stores/scenario-store.js b/src/stores/scenario-store.js new file mode 100644 index 0000000..c7e4dc4 --- /dev/null +++ b/src/stores/scenario-store.js @@ -0,0 +1,63 @@ +/** + * File: scenario-store.js + * Author: Sonja Happ + * Date: 20.08.2019 + * + * This file is part of VILLASweb. + * + * VILLASweb is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * VILLASweb is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with VILLASweb. If not, see . + ************************************************************s*****************/ + +import ArrayStore from './array-store'; +import ScenariosDataManager from '../data-managers/scenarios-data-manager'; +import UsersDataManager from "../data-managers/users-data-manager"; +import SimulatorDataDataManager from "../data-managers/simulator-data-data-manager"; +import {ReduceStore} from "flux/utils"; +import AppDispatcher from "../app-dispatcher"; + +//export default new ArrayStore('scenarios', ScenariosDataManager); + + +class ScenariosStore extends ReduceStore { + constructor() { + super('scenarios', ScenariosDataManager); + } + + getInitialState() { + return { + scenarios: [], + + }; + } + + reduce(state, action) { + switch (action.type) { + case 'scenarios/load-models': + // request simulation model data of scenario + ScenariosDataManager.getSimulationModels(action.token, action.scenarioID); + + return Object.assign({}, state, { token: action.token, simulationmodels: action.simulationmodels}); + + case 'scenarios/load-dashboards': + // request dashboard data of scenario + ScenariosDataManager.getDashboards(action.token, action.scenarioID); + + return Object.assign({}, state, { token: action.token, dashboards: action.dashboards}); + default: + return state; + } + } +} + +export default new ScenariosStore(); From f468b445578ff140d9a5571be89233bcf79a6483 Mon Sep 17 00:00:00 2001 From: Sonja Happ Date: Tue, 20 Aug 2019 14:46:33 +0200 Subject: [PATCH 020/391] Refactoring of js code base: - Grouping js files based on the elements of the data model instead of parent js class - All js files providing functionality for one element of the data model are now in one folder; this makes is easier to implement changes for one element in all affected files/ classes - js files which are common to multiple elements are in the common folder - The new structure is more in alignment with the new Go backend code base structure - This commit does not contain any changes in functionality of the frontend --- .../edit-widget-control-creator.js | 32 +++++++------- src/{containers => }/app.js | 40 ++++++++--------- .../FluxContainerConverter.js | 0 src/{ => common}/api/rest-api.js | 0 src/{ => common}/api/websocket-api.js | 0 src/{ => common}/app-dispatcher.js | 0 src/{stores => common}/array-store.js | 2 +- .../notifications-data-manager.js | 0 .../data-managers/notifications-factory.js | 0 .../data-managers/rest-data-manager.js | 0 .../dialogs/delete-dialog.js | 0 src/{components => common}/dialogs/dialog.js | 0 src/{components => common}/editable-header.js | 0 src/{components => common}/footer.js | 0 src/{components => common}/header-menu.js | 0 src/{components => common}/header.js | 0 src/{components => common}/home.js | 2 +- src/{components => common}/icon.js | 0 src/{components => common}/menu-sidebar.js | 0 .../parameters-editor.js | 0 src/{components => common}/table-column.js | 0 src/{components => common}/table.js | 0 src/{stores => file}/file-store.js | 4 +- .../files-data-manager.js | 6 +-- src/{containers => file}/select-file.js | 14 +++--- .../dialogs => project}/edit-project.js | 2 +- .../dialogs => project}/new-project.js | 2 +- src/{stores => project}/project-store.js | 4 +- src/{containers => project}/project.js | 26 +++++------ .../projects-data-manager.js | 2 +- src/{containers => project}/projects.js | 22 +++++----- src/router.js | 6 +-- .../dialogs => simulation}/edit-simulation.js | 4 +- .../import-simulation.js | 8 ++-- .../dialogs => simulation}/new-simulation.js | 6 +-- .../simulation-store.js | 4 +- src/{containers => simulation}/simulation.js | 24 +++++----- .../simulations-data-manager.js | 2 +- src/{containers => simulation}/simulations.js | 28 ++++++------ .../import-simulation-model.js | 2 +- .../signal-mapping.js | 4 +- .../simulation-model-store.js | 4 +- .../simulation-model.js | 24 +++++----- .../simulation-models-data-manager.js | 4 +- .../dialogs => simulator}/edit-simulator.js | 4 +- .../dialogs => simulator}/import-simulator.js | 10 ++--- .../dialogs => simulator}/new-simulator.js | 2 +- .../select-simulator.js | 6 +-- .../simulator-action.js | 0 .../simulator-data-data-manager.js | 4 +- .../simulator-data-store.js | 4 +- src/{stores => simulator}/simulator-store.js | 6 +-- .../simulators-data-manager.js | 6 +-- src/{containers => simulator}/simulators.js | 24 +++++----- src/{components/dialogs => user}/edit-user.js | 2 +- src/{components => user}/login-form.js | 2 +- src/{containers => user}/login.js | 14 +++--- src/{containers => user}/logout.js | 2 +- src/{components/dialogs => user}/new-user.js | 2 +- src/{stores => user}/user-store.js | 8 ++-- .../users-data-manager.js | 8 ++-- src/{stores => user}/users-store.js | 6 +-- src/{containers => user}/users.js | 20 ++++----- src/{components => visualization}/dropzone.js | 0 .../edit-visualization.js | 2 +- src/{components => visualization}/grid.js | 0 .../import-visualization.js | 2 +- .../new-visualization.js | 2 +- .../toolbox-item.js | 2 +- .../visualization-store.js | 4 +- .../visualization.js | 34 +++++++------- .../visualizations-data-manager.js | 2 +- .../edit-widget-aspect-control.js | 0 .../edit-widget-checkbox-control.js | 0 .../edit-widget-color-control.js | 0 .../edit-widget-color-zones-control.js | 6 +-- .../edit-widget-control-creator.js | 0 .../edit-widget-html-content.js | 0 .../edit-widget-image-control.js | 4 +- .../edit-widget-min-max-control.js | 0 .../edit-widget-number-control.js | 0 .../edit-widget-orientation.js | 2 +- .../edit-widget-parameters-control.js | 2 +- .../edit-widget-signal-control.js | 0 .../edit-widget-signals-control.js | 0 .../edit-widget-simulation-control.js | 0 .../edit-widget-text-control.js | 0 .../edit-widget-text-size-control.js | 0 .../edit-widget-time-control.js | 0 .../dialogs => widget}/edit-widget.js | 4 +- src/{components => widget}/widget-factory.js | 0 .../widget-plot/plot-legend.js | 0 .../widget-plot/plot.js | 0 src/{containers => widget}/widget.js | 44 +++++++++---------- src/{components => widget}/widgets/action.js | 2 +- src/{components => widget}/widgets/box.js | 2 +- src/{components => widget}/widgets/button.js | 0 .../widgets/custom-action.js | 8 ++-- src/{components => widget}/widgets/gauge.js | 0 src/{components => widget}/widgets/html.js | 0 src/{components => widget}/widgets/image.js | 2 +- src/{components => widget}/widgets/input.js | 0 src/{components => widget}/widgets/label.js | 2 +- src/{components => widget}/widgets/lamp.js | 2 +- .../widgets/plot-table.js | 0 src/{components => widget}/widgets/plot.js | 0 src/{components => widget}/widgets/slider.js | 0 src/{components => widget}/widgets/table.js | 4 +- .../widgets/topology.js | 0 src/{components => widget}/widgets/value.js | 0 110 files changed, 270 insertions(+), 270 deletions(-) rename src/__tests__/{components/dialog => widget}/edit-widget-control-creator.js (68%) rename src/{containers => }/app.js (82%) rename src/{containers => common}/FluxContainerConverter.js (100%) rename src/{ => common}/api/rest-api.js (100%) rename src/{ => common}/api/websocket-api.js (100%) rename src/{ => common}/app-dispatcher.js (100%) rename src/{stores => common}/array-store.js (98%) rename src/{ => common}/data-managers/notifications-data-manager.js (100%) rename src/{ => common}/data-managers/notifications-factory.js (100%) rename src/{ => common}/data-managers/rest-data-manager.js (100%) rename src/{components => common}/dialogs/delete-dialog.js (100%) rename src/{components => common}/dialogs/dialog.js (100%) rename src/{components => common}/editable-header.js (100%) rename src/{components => common}/footer.js (100%) rename src/{components => common}/header-menu.js (100%) rename src/{components => common}/header.js (100%) rename src/{components => common}/home.js (99%) rename src/{components => common}/icon.js (100%) rename src/{components => common}/menu-sidebar.js (100%) rename src/{components => common}/parameters-editor.js (100%) rename src/{components => common}/table-column.js (100%) rename src/{components => common}/table.js (100%) rename src/{stores => file}/file-store.js (93%) rename src/{data-managers => file}/files-data-manager.js (90%) rename src/{containers => file}/select-file.js (93%) rename src/{components/dialogs => project}/edit-project.js (98%) rename src/{components/dialogs => project}/new-project.js (98%) rename src/{stores => project}/project-store.js (89%) rename src/{containers => project}/project.js (89%) rename src/{data-managers => project}/projects-data-manager.js (92%) rename src/{containers => project}/projects.js (87%) rename src/{components/dialogs => simulation}/edit-simulation.js (96%) rename src/{components/dialogs => simulation}/import-simulation.js (97%) rename src/{components/dialogs => simulation}/new-simulation.js (96%) rename src/{stores => simulation}/simulation-store.js (88%) rename src/{containers => simulation}/simulation.js (92%) rename src/{data-managers => simulation}/simulations-data-manager.js (93%) rename src/{containers => simulation}/simulations.js (91%) rename src/{components/dialogs => simulationmodel}/import-simulation-model.js (98%) rename src/{components => simulationmodel}/signal-mapping.js (97%) rename src/{stores => simulationmodel}/simulation-model-store.js (87%) rename src/{containers => simulationmodel}/simulation-model.js (89%) rename src/{data-managers => simulationmodel}/simulation-models-data-manager.js (92%) rename src/{components/dialogs => simulator}/edit-simulator.js (96%) rename src/{components/dialogs => simulator}/import-simulator.js (96%) rename src/{components/dialogs => simulator}/new-simulator.js (98%) rename src/{containers => simulator}/select-simulator.js (93%) rename src/{components => simulator}/simulator-action.js (100%) rename src/{data-managers => simulator}/simulator-data-data-manager.js (97%) rename src/{stores => simulator}/simulator-data-store.js (96%) rename src/{stores => simulator}/simulator-store.js (92%) rename src/{data-managers => simulator}/simulators-data-manager.js (89%) rename src/{containers => simulator}/simulators.js (93%) rename src/{components/dialogs => user}/edit-user.js (98%) rename src/{components => user}/login-form.js (98%) rename src/{containers => user}/login.js (87%) rename src/{containers => user}/logout.js (95%) rename src/{components/dialogs => user}/new-user.js (98%) rename src/{stores => user}/user-store.js (91%) rename src/{data-managers => user}/users-data-manager.js (91%) rename src/{stores => user}/users-store.js (91%) rename src/{containers => user}/users.js (88%) rename src/{components => visualization}/dropzone.js (100%) rename src/{components/dialogs => visualization}/edit-visualization.js (98%) rename src/{components => visualization}/grid.js (100%) rename src/{components/dialogs => visualization}/import-visualization.js (98%) rename src/{components/dialogs => visualization}/new-visualization.js (98%) rename src/{components => visualization}/toolbox-item.js (98%) rename src/{stores => visualization}/visualization-store.js (88%) rename src/{containers => visualization}/visualization.js (95%) rename src/{data-managers => visualization}/visualizations-data-manager.js (92%) rename src/{components/dialogs => widget}/edit-widget-aspect-control.js (100%) rename src/{components/dialogs => widget}/edit-widget-checkbox-control.js (100%) rename src/{components/dialogs => widget}/edit-widget-color-control.js (100%) rename src/{components/dialogs => widget}/edit-widget-color-zones-control.js (96%) rename src/{components/dialogs => widget}/edit-widget-control-creator.js (100%) rename src/{components/dialogs => widget}/edit-widget-html-content.js (100%) rename src/{components/dialogs => widget}/edit-widget-image-control.js (98%) rename src/{components/dialogs => widget}/edit-widget-min-max-control.js (100%) rename src/{components/dialogs => widget}/edit-widget-number-control.js (100%) rename src/{components/dialogs => widget}/edit-widget-orientation.js (98%) rename src/{components/dialogs => widget}/edit-widget-parameters-control.js (96%) rename src/{components/dialogs => widget}/edit-widget-signal-control.js (100%) rename src/{components/dialogs => widget}/edit-widget-signals-control.js (100%) rename src/{components/dialogs => widget}/edit-widget-simulation-control.js (100%) rename src/{components/dialogs => widget}/edit-widget-text-control.js (100%) rename src/{components/dialogs => widget}/edit-widget-text-size-control.js (100%) rename src/{components/dialogs => widget}/edit-widget-time-control.js (100%) rename src/{components/dialogs => widget}/edit-widget.js (98%) rename src/{components => widget}/widget-factory.js (100%) rename src/{components => widget}/widget-plot/plot-legend.js (100%) rename src/{components => widget}/widget-plot/plot.js (100%) rename src/{containers => widget}/widget.js (88%) rename src/{components => widget}/widgets/action.js (97%) rename src/{components => widget}/widgets/box.js (95%) rename src/{components => widget}/widgets/button.js (100%) rename src/{components => widget}/widgets/custom-action.js (90%) rename src/{components => widget}/widgets/gauge.js (100%) rename src/{components => widget}/widgets/html.js (100%) rename src/{components => widget}/widgets/image.js (97%) rename src/{components => widget}/widgets/input.js (100%) rename src/{components => widget}/widgets/label.js (94%) rename src/{components => widget}/widgets/lamp.js (96%) rename src/{components => widget}/widgets/plot-table.js (100%) rename src/{components => widget}/widgets/plot.js (100%) rename src/{components => widget}/widgets/slider.js (100%) rename src/{components => widget}/widgets/table.js (96%) rename src/{components => widget}/widgets/topology.js (100%) rename src/{components => widget}/widgets/value.js (100%) diff --git a/src/__tests__/components/dialog/edit-widget-control-creator.js b/src/__tests__/widget/edit-widget-control-creator.js similarity index 68% rename from src/__tests__/components/dialog/edit-widget-control-creator.js rename to src/__tests__/widget/edit-widget-control-creator.js index d93cdbe..df9ce22 100644 --- a/src/__tests__/components/dialog/edit-widget-control-creator.js +++ b/src/__tests__/widget/edit-widget-control-creator.js @@ -1,22 +1,22 @@ import { expect } from 'chai'; -import createControls from '../../../components/dialogs/edit-widget-control-creator'; -import EditWidgetTextControl from '../../../components/dialogs/edit-widget-text-control'; -import EditWidgetColorControl from '../../../components/dialogs/edit-widget-color-control'; -import EditWidgetTimeControl from '../../../components/dialogs/edit-widget-time-control'; -import EditImageWidgetControl from '../../../components/dialogs/edit-widget-image-control'; -import EditWidgetSimulationControl from '../../../components/dialogs/edit-widget-simulation-control'; -import EditWidgetSignalControl from '../../../components/dialogs/edit-widget-signal-control'; -import EditWidgetSignalsControl from '../../../components/dialogs/edit-widget-signals-control'; -import EditWidgetOrientation from '../../../components/dialogs/edit-widget-orientation'; -import EditWidgetTextSizeControl from '../../../components/dialogs/edit-widget-text-size-control'; -import EditWidgetAspectControl from '../../../components/dialogs/edit-widget-aspect-control'; -import EditWidgetCheckboxControl from '../../../components/dialogs/edit-widget-checkbox-control'; -import EditWidgetMinMaxControl from '../../../components/dialogs/edit-widget-min-max-control'; -import EditWidgetColorZonesControl from '../../../components/dialogs/edit-widget-color-zones-control'; -import EditWidgetHTMLContent from '../../../components/dialogs/edit-widget-html-content'; -import EditWidgetNumberControl from '../../../components/dialogs/edit-widget-number-control'; +import createControls from '../widget/edit-widget-control-creator'; +import EditWidgetTextControl from '../widget/edit-widget-text-control'; +import EditWidgetColorControl from '../widget/edit-widget-color-control'; +import EditWidgetTimeControl from '../widget/edit-widget-time-control'; +import EditImageWidgetControl from '../widget/edit-widget-image-control'; +import EditWidgetSimulationControl from '../widget/edit-widget-simulation-control'; +import EditWidgetSignalControl from '../widget/edit-widget-signal-control'; +import EditWidgetSignalsControl from '../widget/edit-widget-signals-control'; +import EditWidgetOrientation from '../widget/edit-widget-orientation'; +import EditWidgetTextSizeControl from '../widget/edit-widget-text-size-control'; +import EditWidgetAspectControl from '../widget/edit-widget-aspect-control'; +import EditWidgetCheckboxControl from '../widget/edit-widget-checkbox-control'; +import EditWidgetMinMaxControl from '../widget/edit-widget-min-max-control'; +import EditWidgetColorZonesControl from '../widget/edit-widget-color-zones-control'; +import EditWidgetHTMLContent from '../widget/edit-widget-html-content'; +import EditWidgetNumberControl from '../widget/edit-widget-number-control'; describe('edit widget control creator', () => { it('should not return null', () => { diff --git a/src/containers/app.js b/src/app.js similarity index 82% rename from src/containers/app.js rename to src/app.js index 763e012..9f4f0ac 100644 --- a/src/containers/app.js +++ b/src/app.js @@ -28,28 +28,28 @@ import { Redirect, Route } from 'react-router-dom'; import { Col } from 'react-bootstrap'; import { Hidden } from 'react-grid-system' -import AppDispatcher from '../app-dispatcher'; -import SimulationStore from '../stores/simulation-store'; -import SimulatorStore from '../stores/simulator-store'; -import UserStore from '../stores/user-store'; -import NotificationsDataManager from '../data-managers/notifications-data-manager'; +import AppDispatcher from './common/app-dispatcher'; +import SimulationStore from './simulation/simulation-store'; +import SimulatorStore from './simulator/simulator-store'; +import UserStore from './user/user-store'; +import NotificationsDataManager from './common/data-managers/notifications-data-manager'; -import Home from '../components/home'; -import Header from '../components/header'; -import Footer from '../components/footer'; -import SidebarMenu from '../components/menu-sidebar'; -import HeaderMenu from '../components/header-menu'; +import Home from './common/home'; +import Header from './common/header'; +import Footer from './common/footer'; +import SidebarMenu from './common/menu-sidebar'; +import HeaderMenu from './common/header-menu'; -import Projects from './projects'; -import Project from './project'; -import Simulators from './simulators'; -import Visualization from './visualization'; -import Simulations from './simulations'; -import Simulation from './simulation'; -import SimulationModel from './simulation-model'; -import Users from './users'; +import Projects from './project/projects'; +import Project from './project/project'; +import Simulators from './simulator/simulators'; +import Visualization from './visualization/visualization'; +import Simulations from './simulation/simulations'; +import Simulation from './simulation/simulation'; +import SimulationModel from './simulationmodel/simulation-model'; +import Users from './user/users'; -import '../styles/app.css'; +import './styles/app.css'; class App extends React.Component { @@ -161,6 +161,6 @@ class App extends React.Component { } } -let fluxContainerConverter = require('./FluxContainerConverter'); +let fluxContainerConverter = require('./common/FluxContainerConverter'); export default Container.create(fluxContainerConverter.convert(App)); //DragDropContext(HTML5Backend)(Container.create(App)); diff --git a/src/containers/FluxContainerConverter.js b/src/common/FluxContainerConverter.js similarity index 100% rename from src/containers/FluxContainerConverter.js rename to src/common/FluxContainerConverter.js diff --git a/src/api/rest-api.js b/src/common/api/rest-api.js similarity index 100% rename from src/api/rest-api.js rename to src/common/api/rest-api.js diff --git a/src/api/websocket-api.js b/src/common/api/websocket-api.js similarity index 100% rename from src/api/websocket-api.js rename to src/common/api/websocket-api.js diff --git a/src/app-dispatcher.js b/src/common/app-dispatcher.js similarity index 100% rename from src/app-dispatcher.js rename to src/common/app-dispatcher.js diff --git a/src/stores/array-store.js b/src/common/array-store.js similarity index 98% rename from src/stores/array-store.js rename to src/common/array-store.js index 2d4be7c..70e9c9e 100644 --- a/src/stores/array-store.js +++ b/src/common/array-store.js @@ -21,7 +21,7 @@ import { ReduceStore } from 'flux/utils'; -import AppDispatcher from '../app-dispatcher'; +import AppDispatcher from './app-dispatcher'; class ArrayStore extends ReduceStore { constructor(type, dataManager) { diff --git a/src/data-managers/notifications-data-manager.js b/src/common/data-managers/notifications-data-manager.js similarity index 100% rename from src/data-managers/notifications-data-manager.js rename to src/common/data-managers/notifications-data-manager.js diff --git a/src/data-managers/notifications-factory.js b/src/common/data-managers/notifications-factory.js similarity index 100% rename from src/data-managers/notifications-factory.js rename to src/common/data-managers/notifications-factory.js diff --git a/src/data-managers/rest-data-manager.js b/src/common/data-managers/rest-data-manager.js similarity index 100% rename from src/data-managers/rest-data-manager.js rename to src/common/data-managers/rest-data-manager.js diff --git a/src/components/dialogs/delete-dialog.js b/src/common/dialogs/delete-dialog.js similarity index 100% rename from src/components/dialogs/delete-dialog.js rename to src/common/dialogs/delete-dialog.js diff --git a/src/components/dialogs/dialog.js b/src/common/dialogs/dialog.js similarity index 100% rename from src/components/dialogs/dialog.js rename to src/common/dialogs/dialog.js diff --git a/src/components/editable-header.js b/src/common/editable-header.js similarity index 100% rename from src/components/editable-header.js rename to src/common/editable-header.js diff --git a/src/components/footer.js b/src/common/footer.js similarity index 100% rename from src/components/footer.js rename to src/common/footer.js diff --git a/src/components/header-menu.js b/src/common/header-menu.js similarity index 100% rename from src/components/header-menu.js rename to src/common/header-menu.js diff --git a/src/components/header.js b/src/common/header.js similarity index 100% rename from src/components/header.js rename to src/common/header.js diff --git a/src/components/home.js b/src/common/home.js similarity index 99% rename from src/components/home.js rename to src/common/home.js index 70dedbd..e866249 100644 --- a/src/components/home.js +++ b/src/common/home.js @@ -26,7 +26,7 @@ import React from 'react'; //import RestAPI from '../api/rest-api'; import config from '../config'; -import UserStore from "../stores/user-store"; +import UserStore from "../user/user-store"; class Home extends React.Component { constructor(props) { diff --git a/src/components/icon.js b/src/common/icon.js similarity index 100% rename from src/components/icon.js rename to src/common/icon.js diff --git a/src/components/menu-sidebar.js b/src/common/menu-sidebar.js similarity index 100% rename from src/components/menu-sidebar.js rename to src/common/menu-sidebar.js diff --git a/src/components/parameters-editor.js b/src/common/parameters-editor.js similarity index 100% rename from src/components/parameters-editor.js rename to src/common/parameters-editor.js diff --git a/src/components/table-column.js b/src/common/table-column.js similarity index 100% rename from src/components/table-column.js rename to src/common/table-column.js diff --git a/src/components/table.js b/src/common/table.js similarity index 100% rename from src/components/table.js rename to src/common/table.js diff --git a/src/stores/file-store.js b/src/file/file-store.js similarity index 93% rename from src/stores/file-store.js rename to src/file/file-store.js index 1437652..f2d3a07 100644 --- a/src/stores/file-store.js +++ b/src/file/file-store.js @@ -19,8 +19,8 @@ * along with VILLASweb. If not, see . ******************************************************************************/ -import ArrayStore from './array-store'; -import FilesDataManager from '../data-managers/files-data-manager'; +import ArrayStore from '../common/array-store'; +import FilesDataManager from './files-data-manager'; class FileStore extends ArrayStore { constructor() { diff --git a/src/data-managers/files-data-manager.js b/src/file/files-data-manager.js similarity index 90% rename from src/data-managers/files-data-manager.js rename to src/file/files-data-manager.js index b9fbd91..e92aeff 100644 --- a/src/data-managers/files-data-manager.js +++ b/src/file/files-data-manager.js @@ -19,9 +19,9 @@ * along with VILLASweb. If not, see . ******************************************************************************/ -import RestDataManager from './rest-data-manager'; -import RestAPI from '../api/rest-api'; -import AppDispatcher from '../app-dispatcher'; +import RestDataManager from '../common/data-managers/rest-data-manager'; +import RestAPI from '../common/api/rest-api'; +import AppDispatcher from '../common/app-dispatcher'; class FilesDataManager extends RestDataManager { constructor() { diff --git a/src/containers/select-file.js b/src/file/select-file.js similarity index 93% rename from src/containers/select-file.js rename to src/file/select-file.js index 3eb97c1..fafe98f 100644 --- a/src/containers/select-file.js +++ b/src/file/select-file.js @@ -23,10 +23,10 @@ import React from 'react'; import { Container } from 'flux/utils'; import { FormGroup, FormControl, FormLabel, Button, ProgressBar, Col } from 'react-bootstrap'; -import FileStore from '../stores/file-store'; -import UserStore from '../stores/user-store'; +import FileStore from './file-store'; +import UserStore from '../user/user-store'; -import AppDispatcher from '../app-dispatcher'; +import AppDispatcher from '../common/app-dispatcher'; class SelectFile extends React.Component { static getStores() { @@ -107,12 +107,12 @@ class SelectFile extends React.Component { } render() { - const fileOptions = this.state.files.map(f => + const fileOptions = this.state.files.map(f => ); const progressBarStyle = { - marginLeft: '100px', + marginLeft: '100px', marginTop: '-25px' }; @@ -121,7 +121,7 @@ class SelectFile extends React.Component { {this.props.name} - + {fileOptions} @@ -148,5 +148,5 @@ class SelectFile extends React.Component { } } -let fluxContainerConverter = require('./FluxContainerConverter'); +let fluxContainerConverter = require('../common/FluxContainerConverter'); export default Container.create(fluxContainerConverter.convert(SelectFile)); diff --git a/src/components/dialogs/edit-project.js b/src/project/edit-project.js similarity index 98% rename from src/components/dialogs/edit-project.js rename to src/project/edit-project.js index 6f2081d..918633d 100644 --- a/src/components/dialogs/edit-project.js +++ b/src/project/edit-project.js @@ -22,7 +22,7 @@ import React from 'react'; import { FormGroup, FormControl, FormLabel } from 'react-bootstrap'; -import Dialog from './dialog'; +import Dialog from '../common/dialogs/dialog'; class EditProjectDialog extends React.Component { valid: true; diff --git a/src/components/dialogs/new-project.js b/src/project/new-project.js similarity index 98% rename from src/components/dialogs/new-project.js rename to src/project/new-project.js index b9a2bbd..c18cd89 100644 --- a/src/components/dialogs/new-project.js +++ b/src/project/new-project.js @@ -22,7 +22,7 @@ import React from 'react'; import { FormGroup, FormControl, FormLabel } from 'react-bootstrap'; -import Dialog from './dialog'; +import Dialog from '../common/dialogs/dialog'; class NewProjectDialog extends React.Component { valid: false; diff --git a/src/stores/project-store.js b/src/project/project-store.js similarity index 89% rename from src/stores/project-store.js rename to src/project/project-store.js index 0df9380..99b9bba 100644 --- a/src/stores/project-store.js +++ b/src/project/project-store.js @@ -19,7 +19,7 @@ * along with VILLASweb. If not, see . ******************************************************************************/ -import ArrayStore from './array-store'; -import ProjectsDataManager from '../data-managers/projects-data-manager'; +import ArrayStore from '../common/array-store'; +import ProjectsDataManager from './projects-data-manager'; export default new ArrayStore('projects', ProjectsDataManager); diff --git a/src/containers/project.js b/src/project/project.js similarity index 89% rename from src/containers/project.js rename to src/project/project.js index 74e2da4..78679d7 100644 --- a/src/containers/project.js +++ b/src/project/project.js @@ -24,20 +24,20 @@ import { Container } from 'flux/utils'; import { Button } from 'react-bootstrap'; import FileSaver from 'file-saver'; -import AppDispatcher from '../app-dispatcher'; -import ProjectStore from '../stores/project-store'; -import UserStore from '../stores/user-store'; -import VisualizationStore from '../stores/visualization-store'; -import SimulationStore from '../stores/simulation-store'; +import AppDispatcher from '../common/app-dispatcher'; +import ProjectStore from './project-store'; +import UserStore from '../user/user-store'; +import VisualizationStore from '../visualization/visualization-store'; +import SimulationStore from '../simulation/simulation-store'; -import Icon from '../components/icon'; -import CustomTable from '../components/table'; -import TableColumn from '../components/table-column'; -import NewVisualzationDialog from '../components/dialogs/new-visualization'; -import EditVisualizationDialog from '../components/dialogs/edit-visualization'; -import ImportVisualizationDialog from '../components/dialogs/import-visualization'; +import Icon from '../common/icon'; +import CustomTable from '../common/table'; +import TableColumn from '../common/table-column'; +import NewVisualzationDialog from '../visualization/new-visualization'; +import EditVisualizationDialog from '../visualization/edit-visualization'; +import ImportVisualizationDialog from '../visualization/import-visualization'; -import DeleteDialog from '../components/dialogs/delete-dialog'; +import DeleteDialog from '../common/dialogs/delete-dialog'; class Visualizations extends Component { static getStores() { @@ -231,5 +231,5 @@ class Visualizations extends Component { } } -let fluxContainerConverter = require('./FluxContainerConverter'); +let fluxContainerConverter = require('../common/FluxContainerConverter'); export default Container.create(fluxContainerConverter.convert(Visualizations), {withProps: true}); diff --git a/src/data-managers/projects-data-manager.js b/src/project/projects-data-manager.js similarity index 92% rename from src/data-managers/projects-data-manager.js rename to src/project/projects-data-manager.js index e1b8167..669e58a 100644 --- a/src/data-managers/projects-data-manager.js +++ b/src/project/projects-data-manager.js @@ -19,6 +19,6 @@ * along with VILLASweb. If not, see . ******************************************************************************/ -import RestDataManager from './rest-data-manager'; +import RestDataManager from '../common/data-managers/rest-data-manager'; export default new RestDataManager('project', '/projects'); diff --git a/src/containers/projects.js b/src/project/projects.js similarity index 87% rename from src/containers/projects.js rename to src/project/projects.js index d42bd64..4aba7cf 100644 --- a/src/containers/projects.js +++ b/src/project/projects.js @@ -23,18 +23,18 @@ import React from 'react'; import { Container } from 'flux/utils'; import { Button } from 'react-bootstrap'; -import AppDispatcher from '../app-dispatcher'; -import ProjectStore from '../stores/project-store'; -import UserStore from '../stores/user-store'; -import SimulationStore from '../stores/simulation-store'; +import AppDispatcher from '../common/app-dispatcher'; +import ProjectStore from './project-store'; +import UserStore from '../user/user-store'; +import SimulationStore from '../simulation/simulation-store'; -import Icon from '../components/icon'; -import Table from '../components/table'; -import TableColumn from '../components/table-column'; -import NewProjectDialog from '../components/dialogs/new-project'; -import EditProjectDialog from '../components/dialogs/edit-project'; +import Icon from '../common/icon'; +import Table from '../common/table'; +import TableColumn from '../common/table-column'; +import NewProjectDialog from './new-project'; +import EditProjectDialog from './edit-project'; -import DeleteDialog from '../components/dialogs/delete-dialog'; +import DeleteDialog from '../common/dialogs/delete-dialog'; class Projects extends React.Component { static getStores() { @@ -156,5 +156,5 @@ class Projects extends React.Component { } } -let fluxContainerConverter = require('./FluxContainerConverter'); +let fluxContainerConverter = require('../common/FluxContainerConverter'); export default Container.create(fluxContainerConverter.convert(Projects)); diff --git a/src/router.js b/src/router.js index d9f3e45..aee9c0f 100644 --- a/src/router.js +++ b/src/router.js @@ -22,9 +22,9 @@ import React from 'react'; import { BrowserRouter, Route, Switch } from 'react-router-dom'; -import App from './containers/app'; -import Login from './containers/login'; -import Logout from './containers/logout'; +import App from './app'; +import Login from './user/login'; +import Logout from './user/logout'; class Root extends React.Component { render() { diff --git a/src/components/dialogs/edit-simulation.js b/src/simulation/edit-simulation.js similarity index 96% rename from src/components/dialogs/edit-simulation.js rename to src/simulation/edit-simulation.js index a312406..7a99ab6 100644 --- a/src/components/dialogs/edit-simulation.js +++ b/src/simulation/edit-simulation.js @@ -22,8 +22,8 @@ import React from 'react'; import { FormGroup, FormControl, FormLabel } from 'react-bootstrap'; -import Dialog from './dialog'; -import ParametersEditor from '../parameters-editor'; +import Dialog from '../common/dialogs/dialog'; +import ParametersEditor from '../common/parameters-editor'; class EditSimulationDialog extends React.Component { valid = true; diff --git a/src/components/dialogs/import-simulation.js b/src/simulation/import-simulation.js similarity index 97% rename from src/components/dialogs/import-simulation.js rename to src/simulation/import-simulation.js index 1aadb37..afb1438 100644 --- a/src/components/dialogs/import-simulation.js +++ b/src/simulation/import-simulation.js @@ -22,8 +22,8 @@ import React from 'react'; import { FormGroup, FormControl, FormLabel } from 'react-bootstrap'; -import Dialog from './dialog'; -import ParametersEditor from '../parameters-editor'; +import Dialog from '../common/dialogs/dialog'; +import ParametersEditor from '../common/parameters-editor'; class ImportSimulationDialog extends React.Component { valid = false; @@ -47,7 +47,7 @@ class ImportSimulationDialog extends React.Component { return; } - + if (this.valid && this.props.onClose != null) { this.props.onClose(this.state); } @@ -62,7 +62,7 @@ class ImportSimulationDialog extends React.Component { return; } - + this.setState({ [e.target.id]: e.target.value }); } diff --git a/src/components/dialogs/new-simulation.js b/src/simulation/new-simulation.js similarity index 96% rename from src/components/dialogs/new-simulation.js rename to src/simulation/new-simulation.js index 3d32e2d..a6b1c8f 100644 --- a/src/components/dialogs/new-simulation.js +++ b/src/simulation/new-simulation.js @@ -22,8 +22,8 @@ import React from 'react'; import { FormGroup, FormControl, FormLabel } from 'react-bootstrap'; -import Dialog from './dialog'; -import ParametersEditor from '../parameters-editor'; +import Dialog from '../common/dialogs/dialog'; +import ParametersEditor from '../common/parameters-editor'; class NewSimulationDialog extends React.Component { valid = false; @@ -42,7 +42,7 @@ class NewSimulationDialog extends React.Component { if (this.props.onClose != null) { this.props.onClose(); } - + return; } diff --git a/src/stores/simulation-store.js b/src/simulation/simulation-store.js similarity index 88% rename from src/stores/simulation-store.js rename to src/simulation/simulation-store.js index 87f4676..fbc63eb 100644 --- a/src/stores/simulation-store.js +++ b/src/simulation/simulation-store.js @@ -19,7 +19,7 @@ * along with VILLASweb. If not, see . ******************************************************************************/ -import ArrayStore from './array-store'; -import SimulationsDataManager from '../data-managers/simulations-data-manager'; +import ArrayStore from '../common/array-store'; +import SimulationsDataManager from './simulations-data-manager'; export default new ArrayStore('simulations', SimulationsDataManager); diff --git a/src/containers/simulation.js b/src/simulation/simulation.js similarity index 92% rename from src/containers/simulation.js rename to src/simulation/simulation.js index 7a66ea1..db49b0f 100644 --- a/src/containers/simulation.js +++ b/src/simulation/simulation.js @@ -25,19 +25,19 @@ import { Button } from 'react-bootstrap'; import FileSaver from 'file-saver'; import _ from 'lodash'; -import SimulationStore from '../stores/simulation-store'; -import SimulatorStore from '../stores/simulator-store'; -import SimulationModelStore from '../stores/simulation-model-store'; -import UserStore from '../stores/user-store'; -import AppDispatcher from '../app-dispatcher'; +import SimulationStore from './simulation-store'; +import SimulatorStore from '../simulator/simulator-store'; +import SimulationModelStore from '../simulationmodel/simulation-model-store'; +import UserStore from '../user/user-store'; +import AppDispatcher from '../common/app-dispatcher'; -import Icon from '../components/icon'; -import Table from '../components/table'; -import TableColumn from '../components/table-column'; -import ImportSimulationModelDialog from '../components/dialogs/import-simulation-model'; +import Icon from '../common/icon'; +import Table from '../common/table'; +import TableColumn from '../common/table-column'; +import ImportSimulationModelDialog from '../simulationmodel/import-simulation-model'; -import SimulatorAction from '../components/simulator-action'; -import DeleteDialog from '../components/dialogs/delete-dialog'; +import SimulatorAction from '../simulator/simulator-action'; +import DeleteDialog from '../common/dialogs/delete-dialog'; class Simulation extends React.Component { static getStores() { @@ -285,5 +285,5 @@ class Simulation extends React.Component { } } -let fluxContainerConverter = require('./FluxContainerConverter'); +let fluxContainerConverter = require('../common/FluxContainerConverter'); export default Container.create(fluxContainerConverter.convert(Simulation), { withProps: true }); diff --git a/src/data-managers/simulations-data-manager.js b/src/simulation/simulations-data-manager.js similarity index 93% rename from src/data-managers/simulations-data-manager.js rename to src/simulation/simulations-data-manager.js index 30885aa..3090820 100644 --- a/src/data-managers/simulations-data-manager.js +++ b/src/simulation/simulations-data-manager.js @@ -19,6 +19,6 @@ * along with VILLASweb. If not, see . ******************************************************************************/ -import RestDataManager from './rest-data-manager'; +import RestDataManager from '../common/data-managers/rest-data-manager'; export default new RestDataManager('simulation', '/simulations', [ '_id', 'name', 'projects', 'models', 'startParameters' ]); diff --git a/src/containers/simulations.js b/src/simulation/simulations.js similarity index 91% rename from src/containers/simulations.js rename to src/simulation/simulations.js index 5f9429f..c74801c 100644 --- a/src/containers/simulations.js +++ b/src/simulation/simulations.js @@ -24,21 +24,21 @@ import { Container } from 'flux/utils'; import { Button } from 'react-bootstrap'; import FileSaver from 'file-saver'; -import AppDispatcher from '../app-dispatcher'; -import SimulationStore from '../stores/simulation-store'; -import UserStore from '../stores/user-store'; -import SimulatorStore from '../stores/simulator-store'; -import SimulationModelStore from '../stores/simulation-model-store'; +import AppDispatcher from '../common/app-dispatcher'; +import SimulationStore from './simulation-store'; +import UserStore from '../user/user-store'; +import SimulatorStore from '../simulator/simulator-store'; +import SimulationModelStore from '../simulationmodel/simulation-model-store'; -import Icon from '../components/icon'; -import Table from '../components/table'; -import TableColumn from '../components/table-column'; -import NewSimulationDialog from '../components/dialogs/new-simulation'; -import EditSimulationDialog from '../components/dialogs/edit-simulation'; -import ImportSimulationDialog from '../components/dialogs/import-simulation'; +import Icon from '../common/icon'; +import Table from '../common/table'; +import TableColumn from '../common/table-column'; +import NewSimulationDialog from './new-simulation'; +import EditSimulationDialog from './edit-simulation'; +import ImportSimulationDialog from './import-simulation'; -import SimulatorAction from '../components/simulator-action'; -import DeleteDialog from '../components/dialogs/delete-dialog'; +import SimulatorAction from '../simulator/simulator-action'; +import DeleteDialog from '../common/dialogs/delete-dialog'; class Simulations extends Component { static getStores() { @@ -325,5 +325,5 @@ class Simulations extends Component { } } -let fluxContainerConverter = require('./FluxContainerConverter'); +let fluxContainerConverter = require('../common/FluxContainerConverter'); export default Container.create(fluxContainerConverter.convert(Simulations)); diff --git a/src/components/dialogs/import-simulation-model.js b/src/simulationmodel/import-simulation-model.js similarity index 98% rename from src/components/dialogs/import-simulation-model.js rename to src/simulationmodel/import-simulation-model.js index 55e7a2b..991c76a 100644 --- a/src/components/dialogs/import-simulation-model.js +++ b/src/simulationmodel/import-simulation-model.js @@ -23,7 +23,7 @@ import React from 'react'; import { FormGroup, FormControl, FormLabel } from 'react-bootstrap'; import _ from 'lodash'; -import Dialog from './dialog'; +import Dialog from '../common/dialogs/dialog'; class ImportSimulationModelDialog extends React.Component { imported = false; diff --git a/src/components/signal-mapping.js b/src/simulationmodel/signal-mapping.js similarity index 97% rename from src/components/signal-mapping.js rename to src/simulationmodel/signal-mapping.js index 0a66ac5..ca65eac 100644 --- a/src/components/signal-mapping.js +++ b/src/simulationmodel/signal-mapping.js @@ -24,8 +24,8 @@ import PropTypes from 'prop-types'; import { FormGroup, FormControl, FormLabel, FormText } from 'react-bootstrap'; import validator from 'validator'; -import Table from './table'; -import TableColumn from './table-column'; +import Table from '../common/table'; +import TableColumn from '../common/table-column'; class SignalMapping extends React.Component { constructor(props) { diff --git a/src/stores/simulation-model-store.js b/src/simulationmodel/simulation-model-store.js similarity index 87% rename from src/stores/simulation-model-store.js rename to src/simulationmodel/simulation-model-store.js index 73d3dd2..0f06101 100644 --- a/src/stores/simulation-model-store.js +++ b/src/simulationmodel/simulation-model-store.js @@ -19,7 +19,7 @@ * along with VILLASweb. If not, see . ******************************************************************************/ -import ArrayStore from './array-store'; -import SimulationModelsDataManager from '../data-managers/simulation-models-data-manager'; +import ArrayStore from '../common/array-store'; +import SimulationModelsDataManager from './simulation-models-data-manager'; export default new ArrayStore('simulationModels', SimulationModelsDataManager); diff --git a/src/containers/simulation-model.js b/src/simulationmodel/simulation-model.js similarity index 89% rename from src/containers/simulation-model.js rename to src/simulationmodel/simulation-model.js index 9ba7390..6867f66 100644 --- a/src/containers/simulation-model.js +++ b/src/simulationmodel/simulation-model.js @@ -23,15 +23,15 @@ import React from 'react'; import { Container } from 'flux/utils'; import { Button, Col, Form, FormLabel } from 'react-bootstrap'; -import SimulationModelStore from '../stores/simulation-model-store'; -import UserStore from '../stores/user-store'; -import AppDispatcher from '../app-dispatcher'; +import SimulationModelStore from './simulation-model-store'; +import UserStore from '../user/user-store'; +import AppDispatcher from '../common/app-dispatcher'; -import SelectSimulator from './select-simulator'; -import SelectFile from './select-file'; -import SignalMapping from '../components/signal-mapping'; -import EditableHeader from '../components/editable-header'; -import ParametersEditor from '../components/parameters-editor'; +import SelectSimulator from '../simulator/select-simulator'; +import SelectFile from '../file/select-file'; +import SignalMapping from './signal-mapping'; +import EditableHeader from '../common/editable-header'; +import ParametersEditor from '../common/parameters-editor'; class SimulationModel extends React.Component { static getStores() { @@ -141,14 +141,14 @@ class SimulationModel extends React.Component {
    - Start Parameters + Start Parameters - +
    - + @@ -168,5 +168,5 @@ class SimulationModel extends React.Component { } } -let fluxContainerConverter = require('./FluxContainerConverter'); +let fluxContainerConverter = require('../common/FluxContainerConverter'); export default Container.create(fluxContainerConverter.convert(SimulationModel), { withProps: true }); diff --git a/src/data-managers/simulation-models-data-manager.js b/src/simulationmodel/simulation-models-data-manager.js similarity index 92% rename from src/data-managers/simulation-models-data-manager.js rename to src/simulationmodel/simulation-models-data-manager.js index 5496268..cd41baf 100644 --- a/src/data-managers/simulation-models-data-manager.js +++ b/src/simulationmodel/simulation-models-data-manager.js @@ -19,8 +19,8 @@ * along with VILLASweb. If not, see . ******************************************************************************/ -import RestDataManager from './rest-data-manager'; -import AppDispatcher from '../app-dispatcher'; +import RestDataManager from '../common/data-managers/rest-data-manager'; +import AppDispatcher from '../common/app-dispatcher'; class SimulationModelDataManager extends RestDataManager { constructor() { diff --git a/src/components/dialogs/edit-simulator.js b/src/simulator/edit-simulator.js similarity index 96% rename from src/components/dialogs/edit-simulator.js rename to src/simulator/edit-simulator.js index 89ff7e7..17358ad 100644 --- a/src/components/dialogs/edit-simulator.js +++ b/src/simulator/edit-simulator.js @@ -23,8 +23,8 @@ import React from 'react'; import { FormGroup, FormControl, FormLabel } from 'react-bootstrap'; import _ from 'lodash'; -import Dialog from './dialog'; -import ParametersEditor from '../parameters-editor'; +import Dialog from '../common/dialogs/dialog'; +import ParametersEditor from '../common/parameters-editor'; class EditSimulatorDialog extends React.Component { valid = true; diff --git a/src/components/dialogs/import-simulator.js b/src/simulator/import-simulator.js similarity index 96% rename from src/components/dialogs/import-simulator.js rename to src/simulator/import-simulator.js index e884002..4368c60 100644 --- a/src/components/dialogs/import-simulator.js +++ b/src/simulator/import-simulator.js @@ -23,7 +23,7 @@ import React from 'react'; import { FormGroup, FormControl, FormLabel } from 'react-bootstrap'; import _ from 'lodash'; -import Dialog from './dialog'; +import Dialog from '../common/dialogs/dialog'; class ImportSimulatorDialog extends React.Component { valid = false; @@ -42,7 +42,7 @@ class ImportSimulatorDialog extends React.Component { onClose(canceled) { if (canceled === false) { if (this.valid) { - const data = { + const data = { properties: { name: this.state.name }, @@ -83,10 +83,10 @@ class ImportSimulatorDialog extends React.Component { // read simulator const simulator = JSON.parse(event.target.result); self.imported = true; - self.setState({ - name: _.get(simulator, 'properties.name') || _.get(simulator, 'rawProperties.name'), + self.setState({ + name: _.get(simulator, 'properties.name') || _.get(simulator, 'rawProperties.name'), endpoint: _.get(simulator, 'properties.endpoint') || _.get(simulator, 'rawProperties.endpoint'), - uuid: simulator.uuid + uuid: simulator.uuid }); }; diff --git a/src/components/dialogs/new-simulator.js b/src/simulator/new-simulator.js similarity index 98% rename from src/components/dialogs/new-simulator.js rename to src/simulator/new-simulator.js index ea7335a..6116d12 100644 --- a/src/components/dialogs/new-simulator.js +++ b/src/simulator/new-simulator.js @@ -22,7 +22,7 @@ import React from 'react'; import { FormGroup, FormControl, FormLabel } from 'react-bootstrap'; -import Dialog from './dialog'; +import Dialog from '../common/dialogs/dialog'; class NewSimulatorDialog extends React.Component { valid = false; diff --git a/src/containers/select-simulator.js b/src/simulator/select-simulator.js similarity index 93% rename from src/containers/select-simulator.js rename to src/simulator/select-simulator.js index 4b69ff1..2061adf 100644 --- a/src/containers/select-simulator.js +++ b/src/simulator/select-simulator.js @@ -24,7 +24,7 @@ import { Container } from 'flux/utils'; import { FormGroup, FormControl, FormLabel, Col } from 'react-bootstrap'; import _ from 'lodash'; -import SimulatorStore from '../stores/simulator-store'; +import SimulatorStore from './simulator-store'; class SelectSimulator extends React.Component { static getStores() { @@ -67,7 +67,7 @@ class SelectSimulator extends React.Component { } render() { - const simulatorOptions = this.state.simulators.map(s => + const simulatorOptions = this.state.simulators.map(s => ); @@ -85,5 +85,5 @@ class SelectSimulator extends React.Component { } } -let fluxContainerConverter = require('./FluxContainerConverter'); +let fluxContainerConverter = require('../common/FluxContainerConverter'); export default Container.create(fluxContainerConverter.convert(SelectSimulator)); diff --git a/src/components/simulator-action.js b/src/simulator/simulator-action.js similarity index 100% rename from src/components/simulator-action.js rename to src/simulator/simulator-action.js diff --git a/src/data-managers/simulator-data-data-manager.js b/src/simulator/simulator-data-data-manager.js similarity index 97% rename from src/data-managers/simulator-data-data-manager.js rename to src/simulator/simulator-data-data-manager.js index 3154115..94e31a0 100644 --- a/src/data-managers/simulator-data-data-manager.js +++ b/src/simulator/simulator-data-data-manager.js @@ -19,8 +19,8 @@ * along with VILLASweb. If not, see . ******************************************************************************/ -import WebsocketAPI from '../api/websocket-api'; -import AppDispatcher from '../app-dispatcher'; +import WebsocketAPI from '../common/api/websocket-api'; +import AppDispatcher from '../common/app-dispatcher'; const OFFSET_TYPE = 2; const OFFSET_VERSION = 4; diff --git a/src/stores/simulator-data-store.js b/src/simulator/simulator-data-store.js similarity index 96% rename from src/stores/simulator-data-store.js rename to src/simulator/simulator-data-store.js index 1c4c8bf..bb84442 100644 --- a/src/stores/simulator-data-store.js +++ b/src/simulator/simulator-data-store.js @@ -21,8 +21,8 @@ import { ReduceStore } from 'flux/utils'; -import AppDispatcher from '../app-dispatcher'; -import SimulatorDataDataManager from '../data-managers/simulator-data-data-manager'; +import AppDispatcher from '../common/app-dispatcher'; +import SimulatorDataDataManager from './simulator-data-data-manager'; const MAX_VALUES = 10000; diff --git a/src/stores/simulator-store.js b/src/simulator/simulator-store.js similarity index 92% rename from src/stores/simulator-store.js rename to src/simulator/simulator-store.js index 03ecf73..7b51818 100644 --- a/src/stores/simulator-store.js +++ b/src/simulator/simulator-store.js @@ -21,9 +21,9 @@ import _ from 'lodash'; -import ArrayStore from './array-store'; -import SimulatorsDataManager from '../data-managers/simulators-data-manager'; -import SimulatorDataDataManager from '../data-managers/simulator-data-data-manager'; +import ArrayStore from '../common/array-store'; +import SimulatorsDataManager from './simulators-data-manager'; +import SimulatorDataDataManager from './simulator-data-data-manager'; class SimulatorStore extends ArrayStore { constructor() { diff --git a/src/data-managers/simulators-data-manager.js b/src/simulator/simulators-data-manager.js similarity index 89% rename from src/data-managers/simulators-data-manager.js rename to src/simulator/simulators-data-manager.js index 4c34f51..df08f95 100644 --- a/src/data-managers/simulators-data-manager.js +++ b/src/simulator/simulators-data-manager.js @@ -19,9 +19,9 @@ * along with VILLASweb. If not, see . ******************************************************************************/ -import RestDataManager from './rest-data-manager'; -import RestAPI from '../api/rest-api'; -import AppDispatcher from '../app-dispatcher'; +import RestDataManager from '../common/data-managers/rest-data-manager'; +import RestAPI from '../common/api/rest-api'; +import AppDispatcher from '../common/app-dispatcher'; class SimulatorsDataManager extends RestDataManager { constructor() { diff --git a/src/containers/simulators.js b/src/simulator/simulators.js similarity index 93% rename from src/containers/simulators.js rename to src/simulator/simulators.js index c44567f..d0d8e4f 100644 --- a/src/containers/simulators.js +++ b/src/simulator/simulators.js @@ -25,19 +25,19 @@ import { Button } from 'react-bootstrap'; import FileSaver from 'file-saver'; import _ from 'lodash'; -import AppDispatcher from '../app-dispatcher'; -import SimulatorStore from '../stores/simulator-store'; -import UserStore from '../stores/user-store'; +import AppDispatcher from '../common/app-dispatcher'; +import SimulatorStore from './simulator-store'; +import UserStore from '../user/user-store'; -import Icon from '../components/icon'; -import Table from '../components/table'; -import TableColumn from '../components/table-column'; -import NewSimulatorDialog from '../components/dialogs/new-simulator'; -import EditSimulatorDialog from '../components/dialogs/edit-simulator'; -import ImportSimulatorDialog from '../components/dialogs/import-simulator'; +import Icon from '../common/icon'; +import Table from '../common/table'; +import TableColumn from '../common/table-column'; +import NewSimulatorDialog from './new-simulator'; +import EditSimulatorDialog from './edit-simulator'; +import ImportSimulatorDialog from './import-simulator'; -import SimulatorAction from '../components/simulator-action'; -import DeleteDialog from '../components/dialogs/delete-dialog'; +import SimulatorAction from './simulator-action'; +import DeleteDialog from '../common/dialogs/delete-dialog'; class Simulators extends Component { static getStores() { @@ -330,5 +330,5 @@ class Simulators extends Component { } } -let fluxContainerConverter = require('./FluxContainerConverter'); +let fluxContainerConverter = require('../common/FluxContainerConverter'); export default Container.create(fluxContainerConverter.convert(Simulators)); diff --git a/src/components/dialogs/edit-user.js b/src/user/edit-user.js similarity index 98% rename from src/components/dialogs/edit-user.js rename to src/user/edit-user.js index 0d901bd..59cafc7 100644 --- a/src/components/dialogs/edit-user.js +++ b/src/user/edit-user.js @@ -22,7 +22,7 @@ import React from 'react'; import {FormGroup, FormControl, FormLabel, Col} from 'react-bootstrap'; -import Dialog from './dialog'; +import Dialog from '../common/dialogs/dialog'; class EditUserDialog extends React.Component { valid: true; diff --git a/src/components/login-form.js b/src/user/login-form.js similarity index 98% rename from src/components/login-form.js rename to src/user/login-form.js index 7747723..a038f38 100644 --- a/src/components/login-form.js +++ b/src/user/login-form.js @@ -22,7 +22,7 @@ import React, { Component } from 'react'; import { Form, Button, FormGroup, FormControl, FormLabel, Col } from 'react-bootstrap'; -import AppDispatcher from '../app-dispatcher'; +import AppDispatcher from '../common/app-dispatcher'; class LoginForm extends Component { constructor(props) { diff --git a/src/containers/login.js b/src/user/login.js similarity index 87% rename from src/containers/login.js rename to src/user/login.js index 93afa80..3f1e3b6 100644 --- a/src/containers/login.js +++ b/src/user/login.js @@ -25,13 +25,13 @@ import { NavbarBrand } from 'react-bootstrap'; import NotificationSystem from 'react-notification-system'; import { Redirect } from 'react-router-dom'; -import LoginForm from '../components/login-form'; -import Header from '../components/header'; -import Footer from '../components/footer'; -import NotificationsDataManager from '../data-managers/notifications-data-manager'; +import LoginForm from './login-form'; +import Header from '../common/header'; +import Footer from '../common/footer'; +import NotificationsDataManager from '../common/data-managers/notifications-data-manager'; -import AppDispatcher from '../app-dispatcher'; -import UserStore from '../stores/user-store'; +import AppDispatcher from '../common/app-dispatcher'; +import UserStore from './user-store'; class Login extends Component { static getStores() { @@ -97,5 +97,5 @@ class Login extends Component { } } -let fluxContainerConverter = require('./FluxContainerConverter'); +let fluxContainerConverter = require('../common/FluxContainerConverter'); export default Container.create(fluxContainerConverter.convert(Login)); diff --git a/src/containers/logout.js b/src/user/logout.js similarity index 95% rename from src/containers/logout.js rename to src/user/logout.js index 9fa39ae..2e19b43 100644 --- a/src/containers/logout.js +++ b/src/user/logout.js @@ -22,7 +22,7 @@ import React from 'react'; import { Redirect } from 'react-router-dom'; -import AppDispatcher from '../app-dispatcher'; +import AppDispatcher from '../common/app-dispatcher'; class Logout extends React.Component { componentWillMount() { diff --git a/src/components/dialogs/new-user.js b/src/user/new-user.js similarity index 98% rename from src/components/dialogs/new-user.js rename to src/user/new-user.js index e711596..5919568 100644 --- a/src/components/dialogs/new-user.js +++ b/src/user/new-user.js @@ -22,7 +22,7 @@ import React from 'react'; import { FormGroup, FormControl, FormLabel, FormText, Col } from 'react-bootstrap'; -import Dialog from './dialog'; +import Dialog from '../common/dialogs/dialog'; class NewUserDialog extends React.Component { valid: false; diff --git a/src/stores/user-store.js b/src/user/user-store.js similarity index 91% rename from src/stores/user-store.js rename to src/user/user-store.js index c3c563f..c925a35 100644 --- a/src/stores/user-store.js +++ b/src/user/user-store.js @@ -21,9 +21,9 @@ import { ReduceStore } from 'flux/utils'; -import AppDispatcher from '../app-dispatcher'; -import UsersDataManager from '../data-managers/users-data-manager'; -import SimulatorDataDataManager from '../data-managers/simulator-data-data-manager'; +import AppDispatcher from '../common/app-dispatcher'; +import UsersDataManager from './users-data-manager'; +import SimulatorDataDataManager from '../simulator/simulator-data-data-manager'; class UserStore extends ReduceStore { constructor() { @@ -73,7 +73,7 @@ class UserStore extends ReduceStore { state = Object.assign({}, state, { loginMessage: 'Wrong credentials! Please try again.' }); } - return state; + return state; default: return state; diff --git a/src/data-managers/users-data-manager.js b/src/user/users-data-manager.js similarity index 91% rename from src/data-managers/users-data-manager.js rename to src/user/users-data-manager.js index 692b18b..6ce0c7a 100644 --- a/src/data-managers/users-data-manager.js +++ b/src/user/users-data-manager.js @@ -19,9 +19,9 @@ * along with VILLASweb. If not, see . ******************************************************************************/ -import RestDataManager from './rest-data-manager'; -import RestAPI from '../api/rest-api'; -import AppDispatcher from '../app-dispatcher'; +import RestDataManager from '../common/data-managers/rest-data-manager'; +import RestAPI from '../common/api/rest-api'; +import AppDispatcher from '../common/app-dispatcher'; class UsersDataManager extends RestDataManager { constructor() { @@ -57,7 +57,7 @@ class UsersDataManager extends RestDataManager { }); }); } - + } export default new UsersDataManager(); diff --git a/src/stores/users-store.js b/src/user/users-store.js similarity index 91% rename from src/stores/users-store.js rename to src/user/users-store.js index e42b1ed..44622ba 100644 --- a/src/stores/users-store.js +++ b/src/user/users-store.js @@ -19,9 +19,9 @@ * along with VILLASweb. If not, see . ******************************************************************************/ -import ArrayStore from './array-store'; -import UsersDataManager from '../data-managers/users-data-manager'; -import NotificationsDataManager from '../data-managers/notifications-data-manager'; +import ArrayStore from '../common/array-store'; +import UsersDataManager from './users-data-manager'; +import NotificationsDataManager from '../common/data-managers/notifications-data-manager'; class UsersStore extends ArrayStore { constructor() { diff --git a/src/containers/users.js b/src/user/users.js similarity index 88% rename from src/containers/users.js rename to src/user/users.js index b61e16c..304412f 100644 --- a/src/containers/users.js +++ b/src/user/users.js @@ -23,17 +23,17 @@ import React, { Component } from 'react'; import { Container } from 'flux/utils'; import { Button } from 'react-bootstrap'; -import AppDispatcher from '../app-dispatcher'; -import UserStore from '../stores/user-store'; -import UsersStore from '../stores/users-store'; +import AppDispatcher from '../common/app-dispatcher'; +import UserStore from './user-store'; +import UsersStore from './users-store'; -import Icon from '../components/icon'; -import Table from '../components/table'; -import TableColumn from '../components/table-column'; -import NewUserDialog from '../components/dialogs/new-user'; -import EditUserDialog from '../components/dialogs/edit-user'; +import Icon from '../common/icon'; +import Table from '../common/table'; +import TableColumn from '../common/table-column'; +import NewUserDialog from './new-user'; +import EditUserDialog from './edit-user'; -import DeleteDialog from '../components/dialogs/delete-dialog'; +import DeleteDialog from '../common/dialogs/delete-dialog'; class Users extends Component { static getStores() { @@ -140,5 +140,5 @@ class Users extends Component { } } -let fluxContainerConverter = require('./FluxContainerConverter'); +let fluxContainerConverter = require('../common/FluxContainerConverter'); export default Container.create(fluxContainerConverter.convert(Users)); diff --git a/src/components/dropzone.js b/src/visualization/dropzone.js similarity index 100% rename from src/components/dropzone.js rename to src/visualization/dropzone.js diff --git a/src/components/dialogs/edit-visualization.js b/src/visualization/edit-visualization.js similarity index 98% rename from src/components/dialogs/edit-visualization.js rename to src/visualization/edit-visualization.js index 565e141..c8514c8 100644 --- a/src/components/dialogs/edit-visualization.js +++ b/src/visualization/edit-visualization.js @@ -22,7 +22,7 @@ import React from 'react'; import { FormGroup, FormControl, FormLabel } from 'react-bootstrap'; -import Dialog from './dialog'; +import Dialog from '../common/dialogs/dialog'; class EditVisualizationDialog extends React.Component { valid: false; diff --git a/src/components/grid.js b/src/visualization/grid.js similarity index 100% rename from src/components/grid.js rename to src/visualization/grid.js diff --git a/src/components/dialogs/import-visualization.js b/src/visualization/import-visualization.js similarity index 98% rename from src/components/dialogs/import-visualization.js rename to src/visualization/import-visualization.js index 22188f2..a833d70 100644 --- a/src/components/dialogs/import-visualization.js +++ b/src/visualization/import-visualization.js @@ -22,7 +22,7 @@ import React from 'react'; import { FormGroup, FormControl, FormLabel } from 'react-bootstrap'; -import Dialog from './dialog'; +import Dialog from '../common/dialogs/dialog'; class ImportVisualizationDialog extends React.Component { valid = false; diff --git a/src/components/dialogs/new-visualization.js b/src/visualization/new-visualization.js similarity index 98% rename from src/components/dialogs/new-visualization.js rename to src/visualization/new-visualization.js index 2427340..5618c14 100644 --- a/src/components/dialogs/new-visualization.js +++ b/src/visualization/new-visualization.js @@ -22,7 +22,7 @@ import React from 'react'; import { FormGroup, FormControl, FormLabel } from 'react-bootstrap'; -import Dialog from './dialog'; +import Dialog from '../common/dialogs/dialog'; class NewVisualzationDialog extends React.Component { valid: false; diff --git a/src/components/toolbox-item.js b/src/visualization/toolbox-item.js similarity index 98% rename from src/components/toolbox-item.js rename to src/visualization/toolbox-item.js index a4f5b14..be498f4 100644 --- a/src/components/toolbox-item.js +++ b/src/visualization/toolbox-item.js @@ -22,7 +22,7 @@ import React from 'react'; import { DragSource } from 'react-dnd'; import classNames from 'classnames'; -import Icon from './icon'; +import Icon from '../common/icon'; const toolboxItemSource = { beginDrag(props) { diff --git a/src/stores/visualization-store.js b/src/visualization/visualization-store.js similarity index 88% rename from src/stores/visualization-store.js rename to src/visualization/visualization-store.js index ba69682..adadd2d 100644 --- a/src/stores/visualization-store.js +++ b/src/visualization/visualization-store.js @@ -19,7 +19,7 @@ * along with VILLASweb. If not, see . ******************************************************************************/ -import ArrayStore from './array-store'; -import VisualizationsDataManager from '../data-managers/visualizations-data-manager'; +import ArrayStore from '../common/array-store'; +import VisualizationsDataManager from './visualizations-data-manager'; export default new ArrayStore('visualizations', VisualizationsDataManager); diff --git a/src/containers/visualization.js b/src/visualization/visualization.js similarity index 95% rename from src/containers/visualization.js rename to src/visualization/visualization.js index 36fac12..59ffbc1 100644 --- a/src/containers/visualization.js +++ b/src/visualization/visualization.js @@ -27,23 +27,23 @@ import Fullscreenable from 'react-fullscreenable'; import Slider from 'rc-slider'; import classNames from 'classnames'; -import Icon from '../components/icon'; -import WidgetFactory from '../components/widget-factory'; -import ToolboxItem from '../components/toolbox-item'; -import Dropzone from '../components/dropzone'; -import Widget from './widget'; -import EditWidget from '../components/dialogs/edit-widget'; -import Grid from '../components/grid'; +import Icon from '../common/icon'; +import WidgetFactory from '../widget/widget-factory'; +import ToolboxItem from './toolbox-item'; +import Dropzone from './dropzone'; +import Widget from '../widget/widget'; +import EditWidget from '../widget/edit-widget'; +import Grid from './grid'; -import UserStore from '../stores/user-store'; -import VisualizationStore from '../stores/visualization-store'; -import ProjectStore from '../stores/project-store'; -import SimulationStore from '../stores/simulation-store'; -import SimulationModelStore from '../stores/simulation-model-store'; -import FileStore from '../stores/file-store'; -import AppDispatcher from '../app-dispatcher'; -import NotificationsDataManager from '../data-managers/notifications-data-manager'; -import NotificationsFactory from '../data-managers/notifications-factory'; +import UserStore from '../user/user-store'; +import VisualizationStore from './visualization-store'; +import ProjectStore from '../project/project-store'; +import SimulationStore from '../simulation/simulation-store'; +import SimulationModelStore from '../simulationmodel/simulation-model-store'; +import FileStore from '../file/file-store'; +import AppDispatcher from '../common/app-dispatcher'; +import NotificationsDataManager from '../common/data-managers/notifications-data-manager'; +import NotificationsFactory from '../common/data-managers/notifications-factory'; import 'react-contexify/dist/ReactContexify.min.css'; @@ -547,5 +547,5 @@ class Visualization extends React.Component { } } -let fluxContainerConverter = require('./FluxContainerConverter'); +let fluxContainerConverter = require('../common/FluxContainerConverter'); export default Fullscreenable()(Container.create(fluxContainerConverter.convert(Visualization), { withProps: true })); diff --git a/src/data-managers/visualizations-data-manager.js b/src/visualization/visualizations-data-manager.js similarity index 92% rename from src/data-managers/visualizations-data-manager.js rename to src/visualization/visualizations-data-manager.js index b141880..ee12b3e 100644 --- a/src/data-managers/visualizations-data-manager.js +++ b/src/visualization/visualizations-data-manager.js @@ -19,6 +19,6 @@ * along with VILLASweb. If not, see . ******************************************************************************/ -import RestDataManager from './rest-data-manager'; +import RestDataManager from '../common/data-managers/rest-data-manager'; export default new RestDataManager('visualization', '/visualizations'); diff --git a/src/components/dialogs/edit-widget-aspect-control.js b/src/widget/edit-widget-aspect-control.js similarity index 100% rename from src/components/dialogs/edit-widget-aspect-control.js rename to src/widget/edit-widget-aspect-control.js diff --git a/src/components/dialogs/edit-widget-checkbox-control.js b/src/widget/edit-widget-checkbox-control.js similarity index 100% rename from src/components/dialogs/edit-widget-checkbox-control.js rename to src/widget/edit-widget-checkbox-control.js diff --git a/src/components/dialogs/edit-widget-color-control.js b/src/widget/edit-widget-color-control.js similarity index 100% rename from src/components/dialogs/edit-widget-color-control.js rename to src/widget/edit-widget-color-control.js diff --git a/src/components/dialogs/edit-widget-color-zones-control.js b/src/widget/edit-widget-color-zones-control.js similarity index 96% rename from src/components/dialogs/edit-widget-color-zones-control.js rename to src/widget/edit-widget-color-zones-control.js index 3fd97d4..c124353 100644 --- a/src/components/dialogs/edit-widget-color-zones-control.js +++ b/src/widget/edit-widget-color-zones-control.js @@ -23,9 +23,9 @@ import React from 'react'; import { FormGroup, FormLabel, Button } from 'react-bootstrap'; -import Icon from '../icon'; -import Table from '../table'; -import TableColumn from '../table-column'; +import Icon from '../common/icon'; +import Table from '../common/table'; +import TableColumn from '../common/table-column'; class EditWidgetColorZonesControl extends React.Component { constructor(props) { diff --git a/src/components/dialogs/edit-widget-control-creator.js b/src/widget/edit-widget-control-creator.js similarity index 100% rename from src/components/dialogs/edit-widget-control-creator.js rename to src/widget/edit-widget-control-creator.js diff --git a/src/components/dialogs/edit-widget-html-content.js b/src/widget/edit-widget-html-content.js similarity index 100% rename from src/components/dialogs/edit-widget-html-content.js rename to src/widget/edit-widget-html-content.js diff --git a/src/components/dialogs/edit-widget-image-control.js b/src/widget/edit-widget-image-control.js similarity index 98% rename from src/components/dialogs/edit-widget-image-control.js rename to src/widget/edit-widget-image-control.js index 5973a45..e9d0118 100644 --- a/src/components/dialogs/edit-widget-image-control.js +++ b/src/widget/edit-widget-image-control.js @@ -22,7 +22,7 @@ import React from 'react'; import { FormGroup, FormControl, FormLabel, Button, ProgressBar } from 'react-bootstrap'; -import AppDispatcher from '../../app-dispatcher'; +import AppDispatcher from '../common/app-dispatcher'; class EditImageWidgetControl extends React.Component { constructor(props) { @@ -50,7 +50,7 @@ class EditImageWidgetControl extends React.Component { formData.append(key, this.state.fileList[key]); } } - + // upload files AppDispatcher.dispatch({ type: 'files/start-upload', diff --git a/src/components/dialogs/edit-widget-min-max-control.js b/src/widget/edit-widget-min-max-control.js similarity index 100% rename from src/components/dialogs/edit-widget-min-max-control.js rename to src/widget/edit-widget-min-max-control.js diff --git a/src/components/dialogs/edit-widget-number-control.js b/src/widget/edit-widget-number-control.js similarity index 100% rename from src/components/dialogs/edit-widget-number-control.js rename to src/widget/edit-widget-number-control.js diff --git a/src/components/dialogs/edit-widget-orientation.js b/src/widget/edit-widget-orientation.js similarity index 98% rename from src/components/dialogs/edit-widget-orientation.js rename to src/widget/edit-widget-orientation.js index 73f8830..88ee57c 100644 --- a/src/components/dialogs/edit-widget-orientation.js +++ b/src/widget/edit-widget-orientation.js @@ -22,7 +22,7 @@ import React, { Component } from 'react'; import { FormGroup, Col, Row, FormCheck, FormLabel } from 'react-bootstrap'; -import WidgetSlider from '../widgets/slider'; +import WidgetSlider from './widgets/slider'; class EditWidgetOrientation extends Component { constructor(props) { diff --git a/src/components/dialogs/edit-widget-parameters-control.js b/src/widget/edit-widget-parameters-control.js similarity index 96% rename from src/components/dialogs/edit-widget-parameters-control.js rename to src/widget/edit-widget-parameters-control.js index 0fd5695..1831a5c 100644 --- a/src/components/dialogs/edit-widget-parameters-control.js +++ b/src/widget/edit-widget-parameters-control.js @@ -21,7 +21,7 @@ import React, { Component } from 'react'; import { FormGroup, FormLabel } from 'react-bootstrap'; -import ParametersEditor from '../parameters-editor'; +import ParametersEditor from '../common/parameters-editor'; class EditWidgetParametersControl extends Component { constructor(props) { diff --git a/src/components/dialogs/edit-widget-signal-control.js b/src/widget/edit-widget-signal-control.js similarity index 100% rename from src/components/dialogs/edit-widget-signal-control.js rename to src/widget/edit-widget-signal-control.js diff --git a/src/components/dialogs/edit-widget-signals-control.js b/src/widget/edit-widget-signals-control.js similarity index 100% rename from src/components/dialogs/edit-widget-signals-control.js rename to src/widget/edit-widget-signals-control.js diff --git a/src/components/dialogs/edit-widget-simulation-control.js b/src/widget/edit-widget-simulation-control.js similarity index 100% rename from src/components/dialogs/edit-widget-simulation-control.js rename to src/widget/edit-widget-simulation-control.js diff --git a/src/components/dialogs/edit-widget-text-control.js b/src/widget/edit-widget-text-control.js similarity index 100% rename from src/components/dialogs/edit-widget-text-control.js rename to src/widget/edit-widget-text-control.js diff --git a/src/components/dialogs/edit-widget-text-size-control.js b/src/widget/edit-widget-text-size-control.js similarity index 100% rename from src/components/dialogs/edit-widget-text-size-control.js rename to src/widget/edit-widget-text-size-control.js diff --git a/src/components/dialogs/edit-widget-time-control.js b/src/widget/edit-widget-time-control.js similarity index 100% rename from src/components/dialogs/edit-widget-time-control.js rename to src/widget/edit-widget-time-control.js diff --git a/src/components/dialogs/edit-widget.js b/src/widget/edit-widget.js similarity index 98% rename from src/components/dialogs/edit-widget.js rename to src/widget/edit-widget.js index fd5debd..051feae 100644 --- a/src/components/dialogs/edit-widget.js +++ b/src/widget/edit-widget.js @@ -22,7 +22,7 @@ import React from 'react'; //import { FormGroup, FormControl, FormLabel } from 'react-bootstrap'; -import Dialog from './dialog'; +import Dialog from '../common/dialogs/dialog'; import createControls from './edit-widget-control-creator'; @@ -58,7 +58,7 @@ class EditWidgetDialog extends React.Component { // scale width to match aspect const aspectRatio = file.dimensions.width / file.dimensions.height; changeObject.width = this.state.temporal.height * aspectRatio; - + return changeObject; } diff --git a/src/components/widget-factory.js b/src/widget/widget-factory.js similarity index 100% rename from src/components/widget-factory.js rename to src/widget/widget-factory.js diff --git a/src/components/widget-plot/plot-legend.js b/src/widget/widget-plot/plot-legend.js similarity index 100% rename from src/components/widget-plot/plot-legend.js rename to src/widget/widget-plot/plot-legend.js diff --git a/src/components/widget-plot/plot.js b/src/widget/widget-plot/plot.js similarity index 100% rename from src/components/widget-plot/plot.js rename to src/widget/widget-plot/plot.js diff --git a/src/containers/widget.js b/src/widget/widget.js similarity index 88% rename from src/containers/widget.js rename to src/widget/widget.js index 3a6a715..cb9944e 100644 --- a/src/containers/widget.js +++ b/src/widget/widget.js @@ -25,28 +25,28 @@ import { ContextMenuProvider } from 'react-contexify'; import { Rnd } from 'react-rnd'; import classNames from 'classnames'; -import AppDispatcher from '../app-dispatcher'; -import UserStore from '../stores/user-store'; -import SimulatorDataStore from '../stores/simulator-data-store'; -import SimulationModelStore from '../stores/simulation-model-store'; -import FileStore from '../stores/file-store'; +import AppDispatcher from '../common/app-dispatcher'; +import UserStore from '../user/user-store'; +import SimulatorDataStore from '../simulator/simulator-data-store'; +import SimulationModelStore from '../simulationmodel/simulation-model-store'; +import FileStore from '../file/file-store'; -import WidgetCustomAction from '../components/widgets/custom-action'; -import WidgetAction from '../components/widgets/action'; -import WidgetLamp from '../components/widgets/lamp'; -import WidgetValue from '../components/widgets/value'; -import WidgetPlot from '../components/widgets/plot'; -import WidgetTable from '../components/widgets/table'; -import WidgetLabel from '../components/widgets/label'; -import WidgetPlotTable from '../components/widgets/plot-table'; -import WidgetImage from '../components/widgets/image'; -import WidgetButton from '../components/widgets/button'; -import WidgetInput from '../components/widgets/input'; -import WidgetSlider from '../components/widgets/slider'; -import WidgetGauge from '../components/widgets/gauge'; -import WidgetBox from '../components/widgets/box'; -import WidgetHTML from '../components/widgets/html'; -import WidgetTopology from '../components/widgets/topology'; +import WidgetCustomAction from './widgets/custom-action'; +import WidgetAction from './widgets/action'; +import WidgetLamp from './widgets/lamp'; +import WidgetValue from './widgets/value'; +import WidgetPlot from './widgets/plot'; +import WidgetTable from './widgets/table'; +import WidgetLabel from './widgets/label'; +import WidgetPlotTable from './widgets/plot-table'; +import WidgetImage from './widgets/image'; +import WidgetButton from './widgets/button'; +import WidgetInput from './widgets/input'; +import WidgetSlider from './widgets/slider'; +import WidgetGauge from './widgets/gauge'; +import WidgetBox from './widgets/box'; +import WidgetHTML from './widgets/html'; +import WidgetTopology from './widgets/topology'; import '../styles/widgets.css'; @@ -294,5 +294,5 @@ class Widget extends React.Component { } } -let fluxContainerConverter = require('./FluxContainerConverter'); +let fluxContainerConverter = require('../common/FluxContainerConverter'); export default Container.create(fluxContainerConverter.convert(Widget), { withProps: true }); diff --git a/src/components/widgets/action.js b/src/widget/widgets/action.js similarity index 97% rename from src/components/widgets/action.js rename to src/widget/widgets/action.js index 24e105c..0d309a8 100644 --- a/src/components/widgets/action.js +++ b/src/widget/widgets/action.js @@ -22,7 +22,7 @@ import React, { Component } from 'react'; import { Button, ButtonGroup } from 'react-bootstrap'; -import Icon from '../icon'; +import Icon from '../../common/icon'; class WidgetAction extends Component { constructor(props) { diff --git a/src/components/widgets/box.js b/src/widget/widgets/box.js similarity index 95% rename from src/components/widgets/box.js rename to src/widget/widgets/box.js index c32517f..69539ab 100644 --- a/src/components/widgets/box.js +++ b/src/widget/widgets/box.js @@ -22,7 +22,7 @@ import React, { Component } from 'react'; -import EditWidgetColorControl from '../dialogs/edit-widget-color-control'; +import EditWidgetColorControl from '../edit-widget-color-control'; class WidgetBox extends Component { render() { diff --git a/src/components/widgets/button.js b/src/widget/widgets/button.js similarity index 100% rename from src/components/widgets/button.js rename to src/widget/widgets/button.js diff --git a/src/components/widgets/custom-action.js b/src/widget/widgets/custom-action.js similarity index 90% rename from src/components/widgets/custom-action.js rename to src/widget/widgets/custom-action.js index 4a1a7cb..6571c8f 100644 --- a/src/components/widgets/custom-action.js +++ b/src/widget/widgets/custom-action.js @@ -22,10 +22,10 @@ import React, { Component } from 'react'; import { Button } from 'react-bootstrap'; -import Icon from '../icon'; -import UserStore from '../../stores/user-store'; -import SimulatorStore from '../../stores/simulator-store'; -import AppDispatcher from '../../app-dispatcher'; +import Icon from '../../common/icon'; +import UserStore from '../../user/user-store'; +import SimulatorStore from '../../simulator/simulator-store'; +import AppDispatcher from '../../common/app-dispatcher'; class WidgetCustomAction extends Component { constructor(props) { diff --git a/src/components/widgets/gauge.js b/src/widget/widgets/gauge.js similarity index 100% rename from src/components/widgets/gauge.js rename to src/widget/widgets/gauge.js diff --git a/src/components/widgets/html.js b/src/widget/widgets/html.js similarity index 100% rename from src/components/widgets/html.js rename to src/widget/widgets/html.js diff --git a/src/components/widgets/image.js b/src/widget/widgets/image.js similarity index 97% rename from src/components/widgets/image.js rename to src/widget/widgets/image.js index 3438a51..1b73f2a 100644 --- a/src/components/widgets/image.js +++ b/src/widget/widgets/image.js @@ -21,7 +21,7 @@ import React from 'react'; -import AppDispatcher from '../../app-dispatcher'; +import AppDispatcher from '../../common/app-dispatcher'; import config from '../../config'; class WidgetImage extends React.Component { diff --git a/src/components/widgets/input.js b/src/widget/widgets/input.js similarity index 100% rename from src/components/widgets/input.js rename to src/widget/widgets/input.js diff --git a/src/components/widgets/label.js b/src/widget/widgets/label.js similarity index 94% rename from src/components/widgets/label.js rename to src/widget/widgets/label.js index 4ce680e..f53eb18 100644 --- a/src/components/widgets/label.js +++ b/src/widget/widgets/label.js @@ -21,7 +21,7 @@ import React, { Component } from 'react'; -import EditWidgetColorControl from '../dialogs/edit-widget-color-control'; +import EditWidgetColorControl from '../edit-widget-color-control'; class WidgetLabel extends Component { render() { diff --git a/src/components/widgets/lamp.js b/src/widget/widgets/lamp.js similarity index 96% rename from src/components/widgets/lamp.js rename to src/widget/widgets/lamp.js index 5b90f56..0514047 100644 --- a/src/components/widgets/lamp.js +++ b/src/widget/widgets/lamp.js @@ -21,7 +21,7 @@ import React, { Component } from 'react'; -import EditWidgetColorControl from '../dialogs/edit-widget-color-control'; +import EditWidgetColorControl from '../edit-widget-color-control'; class WidgetLamp extends Component { constructor(props) { diff --git a/src/components/widgets/plot-table.js b/src/widget/widgets/plot-table.js similarity index 100% rename from src/components/widgets/plot-table.js rename to src/widget/widgets/plot-table.js diff --git a/src/components/widgets/plot.js b/src/widget/widgets/plot.js similarity index 100% rename from src/components/widgets/plot.js rename to src/widget/widgets/plot.js diff --git a/src/components/widgets/slider.js b/src/widget/widgets/slider.js similarity index 100% rename from src/components/widgets/slider.js rename to src/widget/widgets/slider.js diff --git a/src/components/widgets/table.js b/src/widget/widgets/table.js similarity index 96% rename from src/components/widgets/table.js rename to src/widget/widgets/table.js index 53af120..9ac2d0e 100644 --- a/src/components/widgets/table.js +++ b/src/widget/widgets/table.js @@ -22,8 +22,8 @@ import React, { Component } from 'react'; import { format } from 'd3'; -import Table from '../table'; -import TableColumn from '../table-column'; +import Table from '../../common/table'; +import TableColumn from '../../common/table-column'; class WidgetTable extends Component { constructor(props) { diff --git a/src/components/widgets/topology.js b/src/widget/widgets/topology.js similarity index 100% rename from src/components/widgets/topology.js rename to src/widget/widgets/topology.js diff --git a/src/components/widgets/value.js b/src/widget/widgets/value.js similarity index 100% rename from src/components/widgets/value.js rename to src/widget/widgets/value.js From d1b5e416e2334ce9cc00544e33feea53c3fc7cba Mon Sep 17 00:00:00 2001 From: Sonja Happ Date: Tue, 20 Aug 2019 14:49:57 +0200 Subject: [PATCH 021/391] fix a path in testing file --- .../widget/edit-widget-control-creator.js | 32 +++++++++---------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/src/__tests__/widget/edit-widget-control-creator.js b/src/__tests__/widget/edit-widget-control-creator.js index df9ce22..fb5cfab 100644 --- a/src/__tests__/widget/edit-widget-control-creator.js +++ b/src/__tests__/widget/edit-widget-control-creator.js @@ -1,22 +1,22 @@ import { expect } from 'chai'; -import createControls from '../widget/edit-widget-control-creator'; -import EditWidgetTextControl from '../widget/edit-widget-text-control'; -import EditWidgetColorControl from '../widget/edit-widget-color-control'; -import EditWidgetTimeControl from '../widget/edit-widget-time-control'; -import EditImageWidgetControl from '../widget/edit-widget-image-control'; -import EditWidgetSimulationControl from '../widget/edit-widget-simulation-control'; -import EditWidgetSignalControl from '../widget/edit-widget-signal-control'; -import EditWidgetSignalsControl from '../widget/edit-widget-signals-control'; -import EditWidgetOrientation from '../widget/edit-widget-orientation'; -import EditWidgetTextSizeControl from '../widget/edit-widget-text-size-control'; -import EditWidgetAspectControl from '../widget/edit-widget-aspect-control'; -import EditWidgetCheckboxControl from '../widget/edit-widget-checkbox-control'; -import EditWidgetMinMaxControl from '../widget/edit-widget-min-max-control'; -import EditWidgetColorZonesControl from '../widget/edit-widget-color-zones-control'; -import EditWidgetHTMLContent from '../widget/edit-widget-html-content'; -import EditWidgetNumberControl from '../widget/edit-widget-number-control'; +import createControls from '../../widget/edit-widget-control-creator'; +import EditWidgetTextControl from '../../widget/edit-widget-text-control'; +import EditWidgetColorControl from '../../widget/edit-widget-color-control'; +import EditWidgetTimeControl from '../../widget/edit-widget-time-control'; +import EditImageWidgetControl from '../../widget/edit-widget-image-control'; +import EditWidgetSimulationControl from '../../widget/edit-widget-simulation-control'; +import EditWidgetSignalControl from '../../widget/edit-widget-signal-control'; +import EditWidgetSignalsControl from '../../widget/edit-widget-signals-control'; +import EditWidgetOrientation from '../../widget/edit-widget-orientation'; +import EditWidgetTextSizeControl from '../../widget/edit-widget-text-size-control'; +import EditWidgetAspectControl from '../../widget/edit-widget-aspect-control'; +import EditWidgetCheckboxControl from '../../widget/edit-widget-checkbox-control'; +import EditWidgetMinMaxControl from '../../widget/edit-widget-min-max-control'; +import EditWidgetColorZonesControl from '../../widget/edit-widget-color-zones-control'; +import EditWidgetHTMLContent from '../../widget/edit-widget-html-content'; +import EditWidgetNumberControl from '../../widget/edit-widget-number-control'; describe('edit widget control creator', () => { it('should not return null', () => { From ae2314312a60cfbb3648cd9dfa27be1deec1eb46 Mon Sep 17 00:00:00 2001 From: Sonja Happ Date: Tue, 20 Aug 2019 16:40:51 +0200 Subject: [PATCH 022/391] WIP, Add some TODOs in new scenario container, backend responses of scenarios endpoint require adaptions for frontend compatibility --- src/scenario/scenarios-data-manager.js | 2 +- src/scenario/scenarios.js | 35 +++++++++++++++++++++++--- 2 files changed, 32 insertions(+), 5 deletions(-) diff --git a/src/scenario/scenarios-data-manager.js b/src/scenario/scenarios-data-manager.js index 3ab824a..a56a61e 100644 --- a/src/scenario/scenarios-data-manager.js +++ b/src/scenario/scenarios-data-manager.js @@ -25,7 +25,7 @@ import AppDispatcher from "../common/app-dispatcher"; class ScenariosDataManager extends RestDataManager { constructor() { - super('scenario', '/scenarios'); + super('scenario', '/scenarios', ['id', 'name', 'running', 'simulationModelIDs', 'userIDs', 'dashboardIDs', 'startParameters' ]); } getSimulationModels(token, id) { diff --git a/src/scenario/scenarios.js b/src/scenario/scenarios.js index 864e552..9c8c59c 100644 --- a/src/scenario/scenarios.js +++ b/src/scenario/scenarios.js @@ -49,6 +49,7 @@ class Scenarios extends Component { const scenarios = ScenarioStore.getState(); const simulationModels = SimulationModelStore.getState(); const simulators = SimulatorStore.getState(); + const dashboards = []; // TODO get dashboards with DashboadStore.getState() here const sessionToken = UserStore.getState().token; @@ -56,6 +57,7 @@ class Scenarios extends Component { scenarios, simulationModels, simulators, + dashboards, sessionToken, newModal: false, @@ -78,9 +80,13 @@ class Scenarios extends Component { componentDidUpdate() { const simulationModelIds = []; const simulatorIds = []; + const dashboardIds = []; + for (let scenario of this.state.scenarios) { - for (let modelId of scenario.simulationModels) { + // collect missing simulationModels + // TODO response of backend has to contain simulationModelIDs and dashboardIDs per scenario + for (let modelId of scenario.simulationModelIDs) { const model = this.state.simulationModels.find(m => m != null && m.id === modelId); if (model == null) { @@ -89,12 +95,23 @@ class Scenarios extends Component { continue; } - if (this.state.simulators.includes(s => s._id === model.simulator) === false) { - simulatorIds.push(model.simulator); + // collect missing simulators + if (this.state.simulators.includes(s => s.id === model.simulatorID) === false) { + simulatorIds.push(model.simulatorID); + } + } + + // collect missing dashboards + for (let dashboardId of scenario.dashboardIDs) { + const dashboard = this.state.dashboards.find(d => d != null && d.id === dashboardId); + + if (dashboard == null) { + dashboardIds.push(dashboardId); } } } + // load missing simulationModels if (simulationModelIds.length > 0) { AppDispatcher.dispatch({ type: 'simulationModels/start-load', @@ -103,6 +120,7 @@ class Scenarios extends Component { }); } + // load missing simulators if (simulatorIds.length > 0) { AppDispatcher.dispatch({ type: 'simulators/start-load', @@ -110,6 +128,15 @@ class Scenarios extends Component { token: this.state.sessionToken }); } + + // load missing dashboards + if (dashboardIds.length > 0) { + AppDispatcher.dispatch( { + type: 'dashboards/start-load', + data: dashboardIds, + token: this.state.sessionToken + }) + } } closeNewModal(data) { @@ -270,7 +297,7 @@ class Scenarios extends Component { }); } } - } + }; render() { const buttonStyle = { From b8f8294a8b9f0c457c943223cf2eb106f44c4f7d Mon Sep 17 00:00:00 2001 From: Sonja Happ Date: Tue, 17 Sep 2019 15:33:15 +0200 Subject: [PATCH 023/391] clean up view that lists all scenarios --- src/scenario/edit-scenario.js | 10 ++- src/scenario/scenarios.js | 164 +++------------------------------- 2 files changed, 16 insertions(+), 158 deletions(-) diff --git a/src/scenario/edit-scenario.js b/src/scenario/edit-scenario.js index 4cebf47..6d22d07 100644 --- a/src/scenario/edit-scenario.js +++ b/src/scenario/edit-scenario.js @@ -34,6 +34,7 @@ class EditScenarioDialog extends React.Component { this.state = { name: '', id: '', + running: false, startParameters: {} }; } @@ -69,25 +70,26 @@ class EditScenarioDialog extends React.Component { this.setState({ name: this.props.scenario.name, id: this.props.scenario.id, + running: this.props.scenario.running, startParameters: this.props.scenario.startParameters || {} }); - } + }; handleStartParametersChange = startParameters => { this.setState({ startParameters }); - } + }; render() { return
    - Name + Name - Start Parameters + Start Parameters diff --git a/src/scenario/scenarios.js b/src/scenario/scenarios.js index 9c8c59c..ab6e173 100644 --- a/src/scenario/scenarios.js +++ b/src/scenario/scenarios.js @@ -27,8 +27,6 @@ import FileSaver from 'file-saver'; import AppDispatcher from '../common/app-dispatcher'; import ScenarioStore from './scenario-store'; import UserStore from '../user/user-store'; -import SimulatorStore from '../simulator/simulator-store'; -import SimulationModelStore from '../simulationmodel/simulation-model-store'; import Icon from '../common/icon'; import Table from '../common/table'; @@ -37,27 +35,19 @@ import NewScenarioDialog from './new-scenario'; import EditScenarioDialog from './edit-scenario'; import ImportScenarioDialog from './import-scenario'; -import SimulatorAction from '../simulator/simulator-action'; import DeleteDialog from '../common/dialogs/delete-dialog'; class Scenarios extends Component { static getStores() { - return [ ScenarioStore, UserStore, SimulatorStore, SimulationModelStore ]; + return [ ScenarioStore, UserStore ]; } static calculateState() { const scenarios = ScenarioStore.getState(); - const simulationModels = SimulationModelStore.getState(); - const simulators = SimulatorStore.getState(); - const dashboards = []; // TODO get dashboards with DashboadStore.getState() here - const sessionToken = UserStore.getState().token; return { scenarios, - simulationModels, - simulators, - dashboards, sessionToken, newModal: false, @@ -77,67 +67,7 @@ class Scenarios extends Component { }); } - componentDidUpdate() { - const simulationModelIds = []; - const simulatorIds = []; - const dashboardIds = []; - - - for (let scenario of this.state.scenarios) { - // collect missing simulationModels - // TODO response of backend has to contain simulationModelIDs and dashboardIDs per scenario - for (let modelId of scenario.simulationModelIDs) { - const model = this.state.simulationModels.find(m => m != null && m.id === modelId); - - if (model == null) { - simulationModelIds.push(modelId); - - continue; - } - - // collect missing simulators - if (this.state.simulators.includes(s => s.id === model.simulatorID) === false) { - simulatorIds.push(model.simulatorID); - } - } - - // collect missing dashboards - for (let dashboardId of scenario.dashboardIDs) { - const dashboard = this.state.dashboards.find(d => d != null && d.id === dashboardId); - - if (dashboard == null) { - dashboardIds.push(dashboardId); - } - } - } - - // load missing simulationModels - if (simulationModelIds.length > 0) { - AppDispatcher.dispatch({ - type: 'simulationModels/start-load', - data: simulationModelIds, - token: this.state.sessionToken - }); - } - - // load missing simulators - if (simulatorIds.length > 0) { - AppDispatcher.dispatch({ - type: 'simulators/start-load', - data: simulatorIds, - token: this.state.sessionToken - }); - } - - // load missing dashboards - if (dashboardIds.length > 0) { - AppDispatcher.dispatch( { - type: 'dashboards/start-load', - data: dashboardIds, - token: this.state.sessionToken - }) - } - } + componentDidUpdate() {} closeNewModal(data) { this.setState({ newModal : false }); @@ -164,7 +94,7 @@ class Scenarios extends Component { this.setState({ deleteModal: true, modalScenario: deleteScenario }); } - closeDeleteModal = confirmDelete => { + closeDeleteModal(confirmDelete) { this.setState({ deleteModal: false }); if (confirmDelete === false) { @@ -176,7 +106,7 @@ class Scenarios extends Component { data: this.state.modalScenario, token: this.state.sessionToken }); - } + }; showEditModal(id) { // get scenario by id @@ -221,83 +151,20 @@ class Scenarios extends Component { this.confirmDeleteModal(); } - } + }; exportScenario(index) { // filter properties let scenario = Object.assign({}, this.state.scenarios[index]); delete scenario.id; - delete scenario.users; - delete scenario.dashboards; - scenario.simulationModels.forEach(model => { - delete model.simulator; - }); + // TODO request missing scenario parameters (Dashboards and Simulation Modles) recursively for export // show save dialog const blob = new Blob([JSON.stringify(scenario, null, 2)], { type: 'application/json' }); FileSaver.saveAs(blob, 'scenario - ' + scenario.name + '.json'); } - onScenarioChecked(index, event) { - const selectedScenarios = Object.assign([], this.state.selectedScenarios); - for (let key in selectedScenarios) { - if (selectedScenarios[key] === index) { - // update existing entry - if (event.target.checked) { - return; - } - - selectedScenarios.splice(key, 1); - - this.setState({ selectedScenarios }); - return; - } - } - - // add new entry - if (event.target.checked === false) { - return; - } - - selectedScenarios.push(index); - this.setState({ selectedScenarios }); - } - - runAction = action => { - for (let index of this.state.selectedScenarios) { - for (let model of this.state.scenarios[index].simulationModels) { - // get simulation model - const simulationModel = this.state.simulationModels.find(m => m != null && m.id === model); - if (simulationModel == null) { - continue; - } - - // get simulator for model - let simulator = null; - for (let sim of this.state.simulators) { - if (sim.id === simulationModel.simulatorID) { - simulator = sim; - } - } - - if (simulator == null) { - continue; - } - - if (action.data.action === 'start') { - action.data.parameters = Object.assign({}, this.state.scenarios[index].startParameters, simulationModel.startParameters); - } - - AppDispatcher.dispatch({ - type: 'simulators/start-action', - simulator, - data: action.data, - token: this.state.sessionToken - }); - } - } - }; render() { const buttonStyle = { @@ -309,10 +176,11 @@ class Scenarios extends Component {

    Scenarios

    - this.onScenarioChecked(index, event)} width='30' /> + +
    -
    - -
    -
    @@ -345,7 +201,7 @@ class Scenarios extends Component { this.closeEditModal(data)} scenario={this.state.modalScenario} /> this.closeImportModal(data)} nodes={this.state.nodes} /> - + this.closeDeleteModal(e)} />
    ); } From e4877f4eb8071a1d39dcfc04abf2dfde744101e3 Mon Sep 17 00:00:00 2001 From: Sonja Happ Date: Tue, 17 Sep 2019 17:20:46 +0200 Subject: [PATCH 024/391] see and edit active state of user --- src/user/edit-user.js | 21 ++++++++++++++++++--- src/user/users.js | 1 + 2 files changed, 19 insertions(+), 3 deletions(-) diff --git a/src/user/edit-user.js b/src/user/edit-user.js index 59cafc7..d8ef87c 100644 --- a/src/user/edit-user.js +++ b/src/user/edit-user.js @@ -35,7 +35,8 @@ class EditUserDialog extends React.Component { mail: '', role: '', id: '', - password: '' + password: '', + active: '' } } @@ -56,7 +57,8 @@ class EditUserDialog extends React.Component { var username = true; var role = true; var mail = true; - var pw = true + var pw = true; + var active = true; if (this.state.username === '') { username = false; @@ -74,8 +76,12 @@ class EditUserDialog extends React.Component { pw = false; } + if(this.state.active === ''){ + active = false; + } + // form is valid if any of the fields contain somethig - this.valid = username || role || mail || pw; + this.valid = username || role || mail || pw || active; } @@ -113,6 +119,15 @@ class EditUserDialog extends React.Component { + + + Active + this.handleChange(e)}> + + + + +
    ); diff --git a/src/user/users.js b/src/user/users.js index 304412f..6981f6e 100644 --- a/src/user/users.js +++ b/src/user/users.js @@ -126,6 +126,7 @@ class Users extends Component { this.getHumanRoleName(role)} /> + this.setState({ editModal: true, modalData: this.state.users[index] })} onDelete={index => this.setState({ deleteModal: true, modalData: this.state.users[index] })} /> From ca09a5ee05ae0450e36343f83ec522f79c094a3c Mon Sep 17 00:00:00 2001 From: Sonja Happ Date: Mon, 7 Oct 2019 16:02:23 +0200 Subject: [PATCH 025/391] fix width of button column --- src/user/users.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/user/users.js b/src/user/users.js index 6981f6e..4cec1ef 100644 --- a/src/user/users.js +++ b/src/user/users.js @@ -113,7 +113,7 @@ class Users extends Component { this.confirmDeleteModal(); } - } + }; render() { @@ -127,7 +127,7 @@ class Users extends Component { this.getHumanRoleName(role)} /> - this.setState({ editModal: true, modalData: this.state.users[index] })} onDelete={index => this.setState({ deleteModal: true, modalData: this.state.users[index] })} /> + this.setState({ editModal: true, modalData: this.state.users[index] })} onDelete={index => this.setState({ deleteModal: true, modalData: this.state.users[index] })} /> From 236233b6db660169465e3f3fb2d4e0ee335c775f Mon Sep 17 00:00:00 2001 From: Sonja Happ Date: Mon, 7 Oct 2019 16:02:52 +0200 Subject: [PATCH 026/391] missing semicolons --- src/user/users-store.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/user/users-store.js b/src/user/users-store.js index 44622ba..5d88f7a 100644 --- a/src/user/users-store.js +++ b/src/user/users-store.js @@ -38,7 +38,7 @@ class UsersStore extends ArrayStore { title: 'Failed to add new user', message: action.error.response.body.message, level: 'error' - } + }; NotificationsDataManager.addNotification(USER_ADD_ERROR_NOTIFICATION); } @@ -51,7 +51,7 @@ class UsersStore extends ArrayStore { title: 'Failed to edit user', message: action.error.response.body.message, level: 'error' - } + }; NotificationsDataManager.addNotification(USER_EDIT_ERROR_NOTIFICATION); } From beca550aa7e50f8b2207f322b7c61a6726562894 Mon Sep 17 00:00:00 2001 From: Sonja Happ Date: Mon, 7 Oct 2019 16:03:18 +0200 Subject: [PATCH 027/391] update config file --- src/config.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/config.js b/src/config.js index 4054518..82be462 100644 --- a/src/config.js +++ b/src/config.js @@ -1,9 +1,9 @@ const config = { publicPathBase: 'public/', - instance: 'frontend of the Global RT-SuperLab Demonstration', + instance: 'VILLASweb', admin: { - name: 'Steffen Vogel', + name: 'Institute for Automation of Complex Power Systems, RWTH Aachen University, Germany', mail: 'stvogel@eonerc.rwth-aachen.de' } } From c9d678d8dfac43c09282b36345da597023453a0d Mon Sep 17 00:00:00 2001 From: Sonja Happ Date: Mon, 7 Oct 2019 16:04:34 +0200 Subject: [PATCH 028/391] add user component and menu item for account management, WIP --- src/app.js | 6 +- src/common/menu-sidebar.js | 1 + src/user/user.js | 156 +++++++++++++++++++++++++++++++++++++ 3 files changed, 161 insertions(+), 2 deletions(-) create mode 100644 src/user/user.js diff --git a/src/app.js b/src/app.js index cd07f75..ea6bb5f 100644 --- a/src/app.js +++ b/src/app.js @@ -50,6 +50,7 @@ import Scenarios from './scenario/scenarios'; import Scenario from './scenario/scenario'; import SimulationModel from './simulationmodel/simulation-model'; import Users from './user/users'; +import User from './user/user'; import './styles/app.css'; @@ -108,11 +109,11 @@ class App extends React.Component { showSidebarMenu = () => { this.setState({ showSidebarMenu: true }); - } + }; hideSidebarMenu = () => { this.setState({ showSidebarMenu: false }); - } + }; render() { if (this.state.token == null) { @@ -149,6 +150,7 @@ class App extends React.Component { +
    diff --git a/src/common/menu-sidebar.js b/src/common/menu-sidebar.js index 70a633a..5f43425 100644 --- a/src/common/menu-sidebar.js +++ b/src/common/menu-sidebar.js @@ -38,6 +38,7 @@ class SidebarMenu extends React.Component { { this.props.currentRole === 'Admin' ?
  • User Management
  • : '' } +
  • Account
  • Logout
  • diff --git a/src/user/user.js b/src/user/user.js new file mode 100644 index 0000000..ca424c5 --- /dev/null +++ b/src/user/user.js @@ -0,0 +1,156 @@ +/** + * File: user.js + * Author: Sonja Happ + * Date: 18.09.2019 + * + * This file is part of VILLASweb. + * + * VILLASweb is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * VILLASweb is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with VILLASweb. If not, see . + ******************************************************************************/ + +import React, { Component } from 'react'; +import { Container } from 'flux/utils'; +import {Button, Col, Row, FormGroup, FormLabel} from 'react-bootstrap'; + +import AppDispatcher from '../common/app-dispatcher'; +import UserStore from './user-store'; + +import Icon from '../common/icon'; +import EditUserDialog from './edit-user'; + +import DeleteDialog from '../common/dialogs/delete-dialog'; +import ParametersEditor from "../common/parameters-editor"; + +class User extends Component { + static getStores() { + return [ UserStore ]; + } + + static calculateState(prevState, props) { + prevState = prevState || {}; + + const sessionToken = UserStore.getState().token; + + let user = UserStore.getState().currentUser; + + if(user === null) { + AppDispatcher.dispatch({ + type: 'users/start-load', + data: UserStore.getState().userid, + token: sessionToken + }); + + user = {}; + } + + console.log("extracted user 2: " + user.username); + + return { + user, + + token: sessionToken, + editModal: prevState.editModal || false, + deleteModal: prevState.deleteModal || false, + modalData: prevState.modalData || {} + }; + } + + + closeDeleteModal(confirmDelete) { + this.setState({ deleteModal: false }); + + if (confirmDelete === false) { + return; + } + + AppDispatcher.dispatch({ + type: 'users/start-remove', + data: this.state.modalData, + token: this.state.token + }); + } + + closeEditModal(data) { + this.setState({ editModal: false }); + + if (data) { + AppDispatcher.dispatch({ + type: 'users/start-edit', + data: data, + token: this.state.token + }); + } + } + + getHumanRoleName(role_key) { + const HUMAN_ROLE_NAMES = {Admin: 'Administrator', User: 'User', Guest: 'Guest'}; + + return HUMAN_ROLE_NAMES.hasOwnProperty(role_key)? HUMAN_ROLE_NAMES[role_key] : ''; + } + + onModalKeyPress = (event) => { + if (event.key === 'Enter') { + event.preventDefault(); + + this.confirmDeleteModal(); + } + }; + + render() { + + return ( +
    +

    Your User Account

    + +
    + + Username: + {this.state.user.username} + + + + + E-mail: + {this.state.user.mail} + + + + Role: + {this.state.user.role} + + +
    + +
    + ); + } +} + +{/**/} +{/**/} + +{/* this.closeEditModal(data)} user={this.state.modalData} />*/} +{/* this.closeDeleteModal(e)} />*/} + +{/**/} +{/* */} +{/* */} +{/* */} +{/* this.getHumanRoleName(role)} />*/} +{/* */} +{/*
    */} + + +let fluxContainerConverter = require('../common/FluxContainerConverter'); +export default Container.create(fluxContainerConverter.convert(User)); From 2b5df63b3405241f42038726fbb9fe30318e9848 Mon Sep 17 00:00:00 2001 From: Sonja Happ Date: Mon, 7 Oct 2019 16:05:08 +0200 Subject: [PATCH 029/391] formatting of home page text --- src/common/home.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/common/home.js b/src/common/home.js index e866249..ed298ce 100644 --- a/src/common/home.js +++ b/src/common/home.js @@ -64,7 +64,7 @@ class Home extends React.Component { VILLASweb is a frontend for distributed real-time simulation hosted by {config.admin.name}.

    - You are logged in as user {this.state.currentUsername} with ID {this.state.currentUserID} and role {this.state.currentRole}. + You are logged in as user {this.state.currentUsername} with ID {this.state.currentUserID} and role {this.state.currentRole}.

    {/*

    From 6cfe8e4d82531cb6f880b2194e91ce97f7896473 Mon Sep 17 00:00:00 2001 From: Laura Fuentes Grau Date: Tue, 22 Oct 2019 15:43:44 +0200 Subject: [PATCH 030/391] improved #197 user can now change own name, email and password --- src/common/array-store.js | 4 ++ src/user/edit-own-user.js | 142 ++++++++++++++++++++++++++++++++++++++ src/user/user.js | 65 ++++++----------- 3 files changed, 167 insertions(+), 44 deletions(-) create mode 100644 src/user/edit-own-user.js diff --git a/src/common/array-store.js b/src/common/array-store.js index 70e9c9e..2789dcd 100644 --- a/src/common/array-store.js +++ b/src/common/array-store.js @@ -115,6 +115,10 @@ class ArrayStore extends ReduceStore { this.dataManager.update(action.data, action.token); return state; + case this.type + '/start-own-edit': + this.dataManager.update(action.data, action.token); + return state; + case this.type + '/edited': return this.updateElements(state, [action.data]); diff --git a/src/user/edit-own-user.js b/src/user/edit-own-user.js new file mode 100644 index 0000000..81c9d9c --- /dev/null +++ b/src/user/edit-own-user.js @@ -0,0 +1,142 @@ +/** + * File: edit-user.js + * Author: Ricardo Hernandez-Montoya + * Date: 02.05.2017 + * + * This file is part of VILLASweb. + * + * VILLASweb is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * VILLASweb is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with VILLASweb. If not, see . + ******************************************************************************/ + +import React from 'react'; +import {FormGroup, FormControl, FormLabel, Col} from 'react-bootstrap'; + +import Dialog from '../common/dialogs/dialog'; +import UserStore from './user-store'; + + +class EditOwnUserDialog extends React.Component { + valid: true; + + constructor(props) { + super(props); + + this.state = { + username: '', + currentpassword: '', + mail: '', + role: '', + id: '', + password: '', + active: '' + } + } + + + + onClose(canceled) { + if (canceled === false) { + if (this.valid) { + this.props.onClose(this.state); + } + } else { + this.props.onClose(); + } + } + + + + handleChange(e) { + let user = UserStore.getState().currentUser; + console.log("edit-own-user, handlechange methode called"); + this.setState({ [e.target.id]: e.target.value }); + + // check all controls + var username = true; + var role = true; + var mail = true; + var pw = true; + var active = true; + var currentpassword = true; + + if (this.state.username === '') { + username = false; + } + + + if(this.state.mail === ''){ + mail = false; + } + + if(this.state.password === ''){ + pw = false; + } + + if(this.state.active === ''){ + active = false; + } + + if(this.state.currentpassword === ''){ + currentpassword = false; + } + + + this.setState({ + role: user.role, + id: user.id + }); + + // form is valid if any of the fields contain somethig + this.valid = username || role || active || currentpassword || mail || pw; + + } + + resetState() { + this.setState({ + //username: this.props.user.username, + //mail: this.props.user.mail, + role: this.props.user.role, + id: this.props.user.id + }); + } + + render() { + return ( +

    this.onClose(c)} onReset={() => this.resetState()} valid={this.valid}> +
    + + Username + this.handleChange(e)} /> + + + + E-mail + this.handleChange(e)} /> + + + Old Password + this.handleChange(e)} /> + + + + New Password + this.handleChange(e)} /> + +
    +
    + ); + } +} + +export default EditOwnUserDialog; diff --git a/src/user/user.js b/src/user/user.js index ca424c5..9817069 100644 --- a/src/user/user.js +++ b/src/user/user.js @@ -21,28 +21,28 @@ import React, { Component } from 'react'; import { Container } from 'flux/utils'; -import {Button, Col, Row, FormGroup, FormLabel} from 'react-bootstrap'; +import {Button, Col, Row} from 'react-bootstrap'; import AppDispatcher from '../common/app-dispatcher'; import UserStore from './user-store'; +import UsersStore from './users-store'; + import Icon from '../common/icon'; -import EditUserDialog from './edit-user'; +import EditOwnUserDialog from './edit-own-user' -import DeleteDialog from '../common/dialogs/delete-dialog'; -import ParametersEditor from "../common/parameters-editor"; class User extends Component { static getStores() { - return [ UserStore ]; + return [ UserStore, UsersStore ]; } static calculateState(prevState, props) { - prevState = prevState || {}; - - const sessionToken = UserStore.getState().token; + //prevState = prevState || {}; + let sessionToken = UserStore.getState().token; let user = UserStore.getState().currentUser; + if(user === null) { AppDispatcher.dispatch({ @@ -60,52 +60,38 @@ class User extends Component { user, token: sessionToken, - editModal: prevState.editModal || false, - deleteModal: prevState.deleteModal || false, - modalData: prevState.modalData || {} + newModal: false, + editModal: false, + update: false, + modalData: {} }; } - closeDeleteModal(confirmDelete) { - this.setState({ deleteModal: false }); - - if (confirmDelete === false) { - return; - } - - AppDispatcher.dispatch({ - type: 'users/start-remove', - data: this.state.modalData, - token: this.state.token - }); - } closeEditModal(data) { this.setState({ editModal: false }); + console.log(data); if (data) { + + AppDispatcher.dispatch({ - type: 'users/start-edit', + type: 'users/start-own-edit', data: data, token: this.state.token }); } + } + getHumanRoleName(role_key) { const HUMAN_ROLE_NAMES = {Admin: 'Administrator', User: 'User', Guest: 'Guest'}; return HUMAN_ROLE_NAMES.hasOwnProperty(role_key)? HUMAN_ROLE_NAMES[role_key] : ''; } - onModalKeyPress = (event) => { - if (event.key === 'Enter') { - event.preventDefault(); - - this.confirmDeleteModal(); - } - }; render() { @@ -129,6 +115,9 @@ class User extends Component { Role: {this.state.user.role}
    + + + this.closeEditModal(data)} user={this.state.modalData} /> @@ -137,19 +126,7 @@ class User extends Component { } } -{/**/} -{/**/} -{/* this.closeEditModal(data)} user={this.state.modalData} />*/} -{/* this.closeDeleteModal(e)} />*/} - -{/**/} -{/* */} -{/* */} -{/* */} -{/* this.getHumanRoleName(role)} />*/} -{/* */} -{/*
    */} let fluxContainerConverter = require('../common/FluxContainerConverter'); From 14ff56dfafa3fc378e71053388bc96bba305fc15 Mon Sep 17 00:00:00 2001 From: Laura Fuentes Grau Date: Fri, 25 Oct 2019 22:16:36 +0200 Subject: [PATCH 031/391] improved #197 user needs to enter the old password and confirm the new one --- src/user/edit-own-user.js | 29 ++++++++++++++++++++--------- src/user/edit-user.js | 18 +++++++++++++++--- src/user/user.js | 9 +++++++-- src/user/users.js | 7 +++++++ 4 files changed, 49 insertions(+), 14 deletions(-) diff --git a/src/user/edit-own-user.js b/src/user/edit-own-user.js index 81c9d9c..3ec5d23 100644 --- a/src/user/edit-own-user.js +++ b/src/user/edit-own-user.js @@ -34,12 +34,13 @@ class EditOwnUserDialog extends React.Component { this.state = { username: '', - currentpassword: '', mail: '', role: '', id: '', password: '', - active: '' + oldPassword: '', + active: '', + confirmpassword: '' } } @@ -68,7 +69,8 @@ class EditOwnUserDialog extends React.Component { var mail = true; var pw = true; var active = true; - var currentpassword = true; + var oldPassword = true; + var confirmpassword = true; if (this.state.username === '') { username = false; @@ -87,8 +89,12 @@ class EditOwnUserDialog extends React.Component { active = false; } - if(this.state.currentpassword === ''){ - currentpassword = false; + if(this.state.oldPassword === ''){ + oldPassword = false; + } + + if(this.state.confirmpassword === ''){ + confirmpassword = false; } @@ -98,7 +104,7 @@ class EditOwnUserDialog extends React.Component { }); // form is valid if any of the fields contain somethig - this.valid = username || role || active || currentpassword || mail || pw; + this.valid = username || role || active || oldPassword || mail || pw || confirmpassword; } @@ -124,14 +130,19 @@ class EditOwnUserDialog extends React.Component { E-mail this.handleChange(e)} />
    - + Old Password - this.handleChange(e)} /> + this.handleChange(e)} /> New Password - this.handleChange(e)} /> + this.handleChange(e)} /> + + + + Confirm New Password + this.handleChange(e)} />
    diff --git a/src/user/edit-user.js b/src/user/edit-user.js index d8ef87c..a30019a 100644 --- a/src/user/edit-user.js +++ b/src/user/edit-user.js @@ -36,7 +36,8 @@ class EditUserDialog extends React.Component { role: '', id: '', password: '', - active: '' + active: '', + confirmpassword: '' } } @@ -59,6 +60,8 @@ class EditUserDialog extends React.Component { var mail = true; var pw = true; var active = true; + var confirmpassword = true; + if (this.state.username === '') { username = false; @@ -80,8 +83,13 @@ class EditUserDialog extends React.Component { active = false; } + if(this.state.confirmpassword === ''){ + confirmpassword = false; + } + + // form is valid if any of the fields contain somethig - this.valid = username || role || mail || pw || active; + this.valid = username || role || mail || pw || active || confirmpassword; } @@ -109,7 +117,11 @@ class EditUserDialog extends React.Component {
    Password - this.handleChange(e)} /> + this.handleChange(e)} /> + + + Confirm New Password + this.handleChange(e)} /> Role diff --git a/src/user/user.js b/src/user/user.js index 9817069..69e6b1e 100644 --- a/src/user/user.js +++ b/src/user/user.js @@ -74,7 +74,7 @@ class User extends Component { console.log(data); if (data) { - + if(data.password === data.confirmpassword){ AppDispatcher.dispatch({ type: 'users/start-own-edit', @@ -82,6 +82,11 @@ class User extends Component { token: this.state.token }); } + + else{ + console.log("error: not the same password"); + } + } } @@ -115,7 +120,7 @@ class User extends Component { Role: {this.state.user.role} - + this.closeEditModal(data)} user={this.state.modalData} /> diff --git a/src/user/users.js b/src/user/users.js index 4cec1ef..c22e81f 100644 --- a/src/user/users.js +++ b/src/user/users.js @@ -93,12 +93,19 @@ class Users extends Component { this.setState({ editModal: false }); if (data) { + if(data.password === data.confirmpassword){ + AppDispatcher.dispatch({ type: 'users/start-edit', data: data, token: this.state.token }); } + + else{ + console.log("error: not the same password"); + } + } } getHumanRoleName(role_key) { From c9ad98bca044c517a84828455074fda2566deef4 Mon Sep 17 00:00:00 2001 From: Laura Fuentes Grau Date: Tue, 29 Oct 2019 10:13:44 +0100 Subject: [PATCH 032/391] improved #197 user will be notified if the confirmed password doesn't match --- src/common/array-store.js | 46 +++++++++++++++++++++++++++++++-------- src/user/edit-user.js | 13 +++++++++-- src/user/user.js | 8 ++++++- src/user/users-store.js | 2 +- src/user/users.js | 6 ++++- 5 files changed, 61 insertions(+), 14 deletions(-) diff --git a/src/common/array-store.js b/src/common/array-store.js index 2789dcd..dbff5c3 100644 --- a/src/common/array-store.js +++ b/src/common/array-store.js @@ -22,6 +22,7 @@ import { ReduceStore } from 'flux/utils'; import AppDispatcher from './app-dispatcher'; +import NotificationsDataManager from '../common/data-managers/notifications-data-manager'; class ArrayStore extends ReduceStore { constructor(type, dataManager) { @@ -84,9 +85,18 @@ class ArrayStore extends ReduceStore { } case this.type + '/load-error': - // TODO: Add error message - return state; - + if (action.error && !action.error.handled && action.error.response) { + + const USER_LOAD_ERROR_NOTIFICATION = { + title: 'Failed to load', + message: action.error.response.body.message, + level: 'error' + }; + NotificationsDataManager.addNotification(USER_LOAD_ERROR_NOTIFICATION); + + } + return super.reduce(state, action); + case this.type + '/start-add': this.dataManager.add(action.data, action.token); return state; @@ -95,8 +105,9 @@ class ArrayStore extends ReduceStore { return this.updateElements(state, [action.data]); case this.type + '/add-error': - // TODO: Add error message - return state; + + return state; + case this.type + '/start-remove': this.dataManager.remove(action.data, action.token); @@ -108,9 +119,18 @@ class ArrayStore extends ReduceStore { }); case this.type + '/remove-error': - // TODO: Add error message - return state; + if (action.error && !action.error.handled && action.error.response) { + const USER_REMOVE_ERROR_NOTIFICATION = { + title: 'Failed to add remove ', + message: action.error.response.body.message, + level: 'error' + }; + NotificationsDataManager.addNotification(USER_REMOVE_ERROR_NOTIFICATION); + + } + return super.reduce(state, action); + case this.type + '/start-edit': this.dataManager.update(action.data, action.token); return state; @@ -122,10 +142,18 @@ class ArrayStore extends ReduceStore { case this.type + '/edited': return this.updateElements(state, [action.data]); - case this.type + '/edit-error': - // TODO: Add error message + case this.type + '/confirm-pw-doesnt-match': + const USER_PW_ERROR_NOTIFICATION = { + title: 'The new password does not match', + message: 'Try again', + level: 'error' + }; + NotificationsDataManager.addNotification(USER_PW_ERROR_NOTIFICATION); return state; + case this.type + '/edit-error': + return state; + default: return state; } diff --git a/src/user/edit-user.js b/src/user/edit-user.js index a30019a..3427452 100644 --- a/src/user/edit-user.js +++ b/src/user/edit-user.js @@ -37,7 +37,8 @@ class EditUserDialog extends React.Component { id: '', password: '', active: '', - confirmpassword: '' + confirmpassword: '', + oldPassword: '' } } @@ -61,6 +62,7 @@ class EditUserDialog extends React.Component { var pw = true; var active = true; var confirmpassword = true; + var oldPW = true; if (this.state.username === '') { @@ -87,9 +89,12 @@ class EditUserDialog extends React.Component { confirmpassword = false; } + if(this.state.oldPassword === ''){ + oldPW = false; + } // form is valid if any of the fields contain somethig - this.valid = username || role || mail || pw || active || confirmpassword; + this.valid = username || role || mail || pw || active || confirmpassword || oldPW; } @@ -115,6 +120,10 @@ class EditUserDialog extends React.Component { E-mail this.handleChange(e)} /> + + Old Password + this.handleChange(e)} /> + Password this.handleChange(e)} /> diff --git a/src/user/user.js b/src/user/user.js index 69e6b1e..74ac1a8 100644 --- a/src/user/user.js +++ b/src/user/user.js @@ -84,7 +84,11 @@ class User extends Component { } else{ - console.log("error: not the same password"); + AppDispatcher.dispatch({ + type: 'users/confirm-pw-doesnt-match', + data: data, + token: this.state.token + }); } } @@ -120,6 +124,8 @@ class User extends Component { Role: {this.state.user.role} + + this.closeEditModal(data)} user={this.state.modalData} /> diff --git a/src/user/users-store.js b/src/user/users-store.js index 5d88f7a..b2ddfe9 100644 --- a/src/user/users-store.js +++ b/src/user/users-store.js @@ -55,7 +55,7 @@ class UsersStore extends ArrayStore { NotificationsDataManager.addNotification(USER_EDIT_ERROR_NOTIFICATION); } - return super.reduce(state, action); + return super.reduce(state, action); default: return super.reduce(state, action); diff --git a/src/user/users.js b/src/user/users.js index c22e81f..1b788a0 100644 --- a/src/user/users.js +++ b/src/user/users.js @@ -103,7 +103,11 @@ class Users extends Component { } else{ - console.log("error: not the same password"); + AppDispatcher.dispatch({ + type: 'users/confirm-pw-doesnt-match', + data: data, + token: this.state.token + }); } } } From 5ecb254e13a92ff7270379e6e44ac818113fb712 Mon Sep 17 00:00:00 2001 From: Laura Fuentes Grau Date: Tue, 29 Oct 2019 14:41:35 +0100 Subject: [PATCH 033/391] renamed visualization to dashboard --- src/app.js | 4 +- src/common/array-store.js | 1 + src/common/home.js | 2 +- .../dashboard-store.js} | 6 +- .../dashboard.js} | 134 +++++++++--------- .../dashboards-data-manager.js} | 4 +- src/{visualization => dashboard}/dropzone.js | 0 .../edit-dashboard.js} | 12 +- src/{visualization => dashboard}/grid.js | 0 .../import-dashboard.js} | 14 +- .../new-dashboard.js} | 4 +- .../toolbox-item.js | 0 src/project/project.js | 70 ++++----- src/scenario/scenarios.js | 1 + src/styles/app.css | 2 +- src/user/edit-own-user.js | 1 - src/widget/widgets/topology.js | 14 +- 17 files changed, 135 insertions(+), 134 deletions(-) rename src/{visualization/visualization-store.js => dashboard/dashboard-store.js} (83%) rename src/{visualization/visualization.js => dashboard/dashboard.js} (77%) rename src/{visualization/visualizations-data-manager.js => dashboard/dashboards-data-manager.js} (89%) rename src/{visualization => dashboard}/dropzone.js (100%) rename src/{visualization/edit-visualization.js => dashboard/edit-dashboard.js} (84%) rename src/{visualization => dashboard}/grid.js (100%) rename src/{visualization/import-visualization.js => dashboard/import-dashboard.js} (85%) rename src/{visualization/new-visualization.js => dashboard/new-dashboard.js} (91%) rename src/{visualization => dashboard}/toolbox-item.js (100%) diff --git a/src/app.js b/src/app.js index ea6bb5f..92bb42c 100644 --- a/src/app.js +++ b/src/app.js @@ -43,7 +43,7 @@ import HeaderMenu from './common/header-menu'; //import Projects from './project/projects'; //import Project from './project/project'; import Simulators from './simulator/simulators'; -import Visualization from './visualization/visualization'; +import Dashboard from './dashboard/dashboard'; //import Simulations from './simulation/simulations'; //import Simulation from './simulation/simulation'; import Scenarios from './scenario/scenarios'; @@ -145,7 +145,7 @@ class App extends React.Component {
    - + diff --git a/src/common/array-store.js b/src/common/array-store.js index dbff5c3..1d76845 100644 --- a/src/common/array-store.js +++ b/src/common/array-store.js @@ -68,6 +68,7 @@ class ArrayStore extends ReduceStore { reduce(state, action) { switch (action.type) { case this.type + '/start-load': + if (Array.isArray(action.data)) { action.data.forEach((id) => { this.dataManager.load(id, action.token); diff --git a/src/common/home.js b/src/common/home.js index ed298ce..654ea6d 100644 --- a/src/common/home.js +++ b/src/common/home.js @@ -68,7 +68,7 @@ class Home extends React.Component {

    {/*

    - This instance is hosting {this.getCounts('projects')} projects consisting of {this.getCounts('simulators')} simulators, {this.getCounts('visualizations')} visualizations and {this.getCounts('simulations')} simulations. + This instance is hosting {this.getCounts('projects')} projects consisting of {this.getCounts('simulators')} simulators, {this.getCounts('dashboards')} dashboards and {this.getCounts('simulations')} simulations. A total of {this.getCounts('users')} users are registered.

    */} diff --git a/src/visualization/visualization-store.js b/src/dashboard/dashboard-store.js similarity index 83% rename from src/visualization/visualization-store.js rename to src/dashboard/dashboard-store.js index adadd2d..28bb9cb 100644 --- a/src/visualization/visualization-store.js +++ b/src/dashboard/dashboard-store.js @@ -1,5 +1,5 @@ /** - * File: visualization-store.js + * File: dashboard-store.js * Author: Markus Grigull * Date: 02.03.2017 * @@ -20,6 +20,6 @@ ******************************************************************************/ import ArrayStore from '../common/array-store'; -import VisualizationsDataManager from './visualizations-data-manager'; +import DashboardsDataManager from './dashboards-data-manager'; -export default new ArrayStore('visualizations', VisualizationsDataManager); +export default new ArrayStore('dashboards', DashboardsDataManager); diff --git a/src/visualization/visualization.js b/src/dashboard/dashboard.js similarity index 77% rename from src/visualization/visualization.js rename to src/dashboard/dashboard.js index 59ffbc1..1683bd3 100644 --- a/src/visualization/visualization.js +++ b/src/dashboard/dashboard.js @@ -1,5 +1,5 @@ /** - * File: visualization.js + * File: dashboard.js * Author: Markus Grigull * Date: 02.03.2017 * @@ -36,7 +36,7 @@ import EditWidget from '../widget/edit-widget'; import Grid from './grid'; import UserStore from '../user/user-store'; -import VisualizationStore from './visualization-store'; +import DashboardStore from './dashboard-store'; import ProjectStore from '../project/project-store'; import SimulationStore from '../simulation/simulation-store'; import SimulationModelStore from '../simulationmodel/simulation-model-store'; @@ -47,9 +47,9 @@ import NotificationsFactory from '../common/data-managers/notifications-factory' import 'react-contexify/dist/ReactContexify.min.css'; -class Visualization extends React.Component { +class Dashboard extends React.Component { static getStores() { - return [ VisualizationStore, ProjectStore, SimulationStore, SimulationModelStore, FileStore, UserStore ]; + return [ DashboardStore, ProjectStore, SimulationStore, SimulationModelStore, FileStore, UserStore ]; } static calculateState(prevState, props) { @@ -64,12 +64,12 @@ class Visualization extends React.Component { return { sessionToken: UserStore.getState().token, - visualizations: VisualizationStore.getState(), + dashboards: DashboardStore.getState(), projects: ProjectStore.getState(), simulations: SimulationStore.getState(), files: FileStore.getState(), - visualization: prevState.visualization || {}, + dashboard: prevState.dashboard || {}, project: prevState.project || null, simulation: prevState.simulation || null, simulationModels, @@ -92,7 +92,7 @@ class Visualization extends React.Component { //document.addEventListener('keydown', this.handleKeydown.bind(this)); AppDispatcher.dispatch({ - type: 'visualizations/start-load', + type: 'dashboards/start-load', token }); } @@ -102,14 +102,14 @@ class Visualization extends React.Component { } componentDidUpdate() { - if (this.state.visualization._id !== this.props.match.params.visualization) { - this.reloadVisualization(); + if (this.state.dashboard._id !== this.props.match.params.dashboard) { + this.reloadDashboard(); } // load depending project if (this.state.project == null && this.state.projects) { this.state.projects.forEach((project) => { - if (project._id === this.state.visualization.project) { + if (project._id === this.state.dashboard.project) { this.setState({ project: project, simulation: null }); const token = localStorage.getItem('token'); @@ -161,25 +161,25 @@ class Visualization extends React.Component { return Object.keys(widgets).map( (key) => widgets[key]); } - reloadVisualization() { - // select visualization by param id - this.state.visualizations.forEach((tempVisualization) => { - if (tempVisualization._id === this.props.match.params.visualization) { + reloadDashboard() { + // select dashboard by param id + this.state.dashboards.forEach((tempDashboard) => { + if (tempDashboard._id === this.props.match.params.dashboard) { // convert widgets list to a dictionary - var visualization = Object.assign({}, tempVisualization, { - widgets: tempVisualization.widgets ? this.transformToWidgetsDict(tempVisualization.widgets) : {} + var dashboard = Object.assign({}, tempDashboard, { + widgets: tempDashboard.widgets ? this.transformToWidgetsDict(tempDashboard.widgets) : {} }); - this.computeHeightWithWidgets(visualization.widgets); + this.computeHeightWithWidgets(dashboard.widgets); - this.setState({ visualization: visualization, project: null }); + this.setState({ dashboard: dashboard, project: null }); const token = localStorage.getItem('token'); AppDispatcher.dispatch({ type: 'projects/start-load', - data: visualization.project, + data: dashboard.project, token }); } @@ -187,9 +187,9 @@ class Visualization extends React.Component { } snapToGrid(value) { - if (this.state.visualization.grid === 1) return value; + if (this.state.dashboard.grid === 1) return value; - return Math.round(value / this.state.visualization.grid) * this.state.visualization.grid; + return Math.round(value / this.state.dashboard.grid) * this.state.dashboard.grid; } handleDrop(item, position) { @@ -210,17 +210,17 @@ class Visualization extends React.Component { // create new widget widget = WidgetFactory.createWidgetOfType(item.name, position, defaultSimulationModel); - var new_widgets = this.state.visualization.widgets; + var new_widgets = this.state.dashboard.widgets; var new_key = Object.keys(new_widgets).length; new_widgets[new_key] = widget; - var visualization = Object.assign({}, this.state.visualization, { + var dashboard = Object.assign({}, this.state.dashboard, { widgets: new_widgets }); this.increaseHeightWithWidget(widget); - this.setState({ visualization: visualization }); + this.setState({ dashboard: dashboard }); } widgetStatusChange(updated_widget, key) { @@ -231,17 +231,17 @@ class Visualization extends React.Component { widgetChange(updated_widget, key, callback = null) { var widgets_update = {}; widgets_update[key] = updated_widget; - var new_widgets = Object.assign({}, this.state.visualization.widgets, widgets_update); + var new_widgets = Object.assign({}, this.state.dashboard.widgets, widgets_update); - var visualization = Object.assign({}, this.state.visualization, { + var dashboard = Object.assign({}, this.state.dashboard, { widgets: new_widgets }); // Check if the height needs to be increased, the section may have shrunk if not if (!this.increaseHeightWithWidget(updated_widget)) { - this.computeHeightWithWidgets(visualization.widgets); + this.computeHeightWithWidgets(dashboard.widgets); } - this.setState({ visualization: visualization }, callback); + this.setState({ dashboard: dashboard }, callback); } /* @@ -279,7 +279,7 @@ class Visualization extends React.Component { } editWidget(e, data) { - this.setState({ editModal: true, modalData: this.state.visualization.widgets[data.key], modalIndex: data.key }); + this.setState({ editModal: true, modalData: this.state.dashboard.widgets[data.key], modalIndex: data.key }); } closeEdit(data) { @@ -288,24 +288,24 @@ class Visualization extends React.Component { var widgets_update = {}; widgets_update[this.state.modalIndex] = data; - var new_widgets = Object.assign({}, this.state.visualization.widgets, widgets_update); + var new_widgets = Object.assign({}, this.state.dashboard.widgets, widgets_update); - var visualization = Object.assign({}, this.state.visualization, { + var dashboard = Object.assign({}, this.state.dashboard, { widgets: new_widgets }); - this.setState({ editModal: false, visualization: visualization }); + this.setState({ editModal: false, dashboard: dashboard }); } else { this.setState({ editModal: false }); } } deleteWidget(e, data) { - delete this.state.visualization.widgets[data.key]; - var visualization = Object.assign({}, this.state.visualization, { - widgets: this.state.visualization.widgets + delete this.state.dashboard.widgets[data.key]; + var dashboard = Object.assign({}, this.state.dashboard, { + widgets: this.state.dashboard.widgets }); - this.setState({ visualization: visualization }); + this.setState({ dashboard: dashboard }); } stopEditing() { @@ -315,36 +315,36 @@ class Visualization extends React.Component { saveChanges() { // Transform to a list - var visualization = Object.assign({}, this.state.visualization, { - widgets: this.transformToWidgetsList(this.state.visualization.widgets) + var dashboard = Object.assign({}, this.state.dashboard, { + widgets: this.transformToWidgetsList(this.state.dashboard.widgets) }); const token = localStorage.getItem('token'); AppDispatcher.dispatch({ - type: 'visualizations/start-edit', - data: visualization, + type: 'dashboards/start-edit', + data: dashboard, token }); } discardChanges() { - this.setState({ editing: false, visualization: {} }); + this.setState({ editing: false, dashboard: {} }); - this.reloadVisualization(); + this.reloadDashboard(); } moveWidget(e, data, applyDirection) { - var widget = this.state.visualization.widgets[data.key]; + var widget = this.state.dashboard.widgets[data.key]; var updated_widgets = {}; updated_widgets[data.key] = applyDirection(widget); - var new_widgets = Object.assign({}, this.state.visualization.widgets, updated_widgets); + var new_widgets = Object.assign({}, this.state.dashboard.widgets, updated_widgets); - var visualization = Object.assign({}, this.state.visualization, { + var dashboard = Object.assign({}, this.state.dashboard, { widgets: new_widgets }); - this.setState({ visualization: visualization }); + this.setState({ dashboard: dashboard }); } moveAbove(widget) { @@ -380,39 +380,39 @@ class Visualization extends React.Component { value = 1; } - let visualization = Object.assign({}, this.state.visualization, { + let dashboard = Object.assign({}, this.state.dashboard, { grid: value }); - this.setState({ visualization }); + this.setState({ dashboard }); } lockWidget(data) { // lock the widget - let widget = this.state.visualization.widgets[data.key]; + let widget = this.state.dashboard.widgets[data.key]; widget.locked = true; - // update visualization + // update dashboard let widgets = {}; widgets[data.key] = widget; - widgets = Object.assign({}, this.state.visualization.widgets, widgets); + widgets = Object.assign({}, this.state.dashboard.widgets, widgets); - const visualization = Object.assign({}, this.state.visualization, { widgets }); - this.setState({ visualization }); + const dashboard = Object.assign({}, this.state.dashboard, { widgets }); + this.setState({ dashboard }); } unlockWidget(data) { // lock the widget - let widget = this.state.visualization.widgets[data.key]; + let widget = this.state.dashboard.widgets[data.key]; widget.locked = false; - // update visualization + // update dashboard let widgets = {}; widgets[data.key] = widget; - widgets = Object.assign({}, this.state.visualization.widgets, widgets); + widgets = Object.assign({}, this.state.dashboard.widgets, widgets); - const visualization = Object.assign({}, this.state.visualization, { widgets }); - this.setState({ visualization }); + const dashboard = Object.assign({}, this.state.dashboard, { widgets }); + this.setState({ dashboard }); } pauseData = () => { @@ -424,7 +424,7 @@ class Visualization extends React.Component { } render() { - const current_widgets = this.state.visualization.widgets; + const current_widgets = this.state.dashboard.widgets; let boxClasses = classNames('section', 'box', { 'fullscreen-container': this.props.isFullscreen }); @@ -437,8 +437,8 @@ class Visualization extends React.Component { buttons.push({ click: () => this.discardChanges(), icon: 'ban', text: 'Cancel' }); gridControl =
    - Grid: {this.state.visualization.grid > 1 ? this.state.visualization.grid : 'Disabled'} - this.setGrid(value)} /> + Grid: {this.state.dashboard.grid > 1 ? this.state.dashboard.grid : 'Disabled'} + this.setGrid(value)} />
    } @@ -464,7 +464,7 @@ class Visualization extends React.Component {
    - {this.state.visualization.name} + {this.state.dashboard.name}
    @@ -511,20 +511,20 @@ class Visualization extends React.Component { onWidgetStatusChange={(w, k) => this.widgetStatusChange(w, k)} editing={this.state.editing} index={widget_key} - grid={this.state.visualization.grid} + grid={this.state.dashboard.grid} paused={this.state.paused} /> ))} - + {current_widgets != null && Object.keys(current_widgets).map(widget_key => { const data = { key: widget_key }; - const locked = this.state.visualization.widgets[widget_key].locked; - const disabledMove = locked || this.state.visualization.widgets[widget_key].type === 'Box'; + const locked = this.state.dashboard.widgets[widget_key].locked; + const disabledMove = locked || this.state.dashboard.widgets[widget_key].type === 'Box'; return this.editWidget(e, data)}>Edit @@ -548,4 +548,4 @@ class Visualization extends React.Component { } let fluxContainerConverter = require('../common/FluxContainerConverter'); -export default Fullscreenable()(Container.create(fluxContainerConverter.convert(Visualization), { withProps: true })); +export default Fullscreenable()(Container.create(fluxContainerConverter.convert(Dashboard), { withProps: true })); diff --git a/src/visualization/visualizations-data-manager.js b/src/dashboard/dashboards-data-manager.js similarity index 89% rename from src/visualization/visualizations-data-manager.js rename to src/dashboard/dashboards-data-manager.js index ee12b3e..a39e017 100644 --- a/src/visualization/visualizations-data-manager.js +++ b/src/dashboard/dashboards-data-manager.js @@ -1,5 +1,5 @@ /** - * File: visualizations-data-manager.js + * File: dashboards-data-manager.js * Author: Markus Grigull * Date: 03.03.2017 * @@ -21,4 +21,4 @@ import RestDataManager from '../common/data-managers/rest-data-manager'; -export default new RestDataManager('visualization', '/visualizations'); +export default new RestDataManager('dashboard', '/dashboards'); diff --git a/src/visualization/dropzone.js b/src/dashboard/dropzone.js similarity index 100% rename from src/visualization/dropzone.js rename to src/dashboard/dropzone.js diff --git a/src/visualization/edit-visualization.js b/src/dashboard/edit-dashboard.js similarity index 84% rename from src/visualization/edit-visualization.js rename to src/dashboard/edit-dashboard.js index c8514c8..1e2fdd6 100644 --- a/src/visualization/edit-visualization.js +++ b/src/dashboard/edit-dashboard.js @@ -1,5 +1,5 @@ /** - * File: new-visualization.js + * File: new-dashboard.js * Author: Markus Grigull * Date: 03.03.2017 * @@ -24,7 +24,7 @@ import { FormGroup, FormControl, FormLabel } from 'react-bootstrap'; import Dialog from '../common/dialogs/dialog'; -class EditVisualizationDialog extends React.Component { +class EditDashboardDialog extends React.Component { valid: false; constructor(props) { @@ -52,8 +52,8 @@ class EditVisualizationDialog extends React.Component { resetState() { this.setState({ - name: this.props.visualization.name, - _id: this.props.visualization._id + name: this.props.dashboard.name, + _id: this.props.dashboard._id }); } @@ -75,7 +75,7 @@ class EditVisualizationDialog extends React.Component { render() { return ( - this.onClose(c)} onReset={() => this.resetState()} valid={this.valid}> + this.onClose(c)} onReset={() => this.resetState()} valid={this.valid}>
    Name @@ -88,4 +88,4 @@ class EditVisualizationDialog extends React.Component { } } -export default EditVisualizationDialog; +export default EditDashboardDialog; diff --git a/src/visualization/grid.js b/src/dashboard/grid.js similarity index 100% rename from src/visualization/grid.js rename to src/dashboard/grid.js diff --git a/src/visualization/import-visualization.js b/src/dashboard/import-dashboard.js similarity index 85% rename from src/visualization/import-visualization.js rename to src/dashboard/import-dashboard.js index a833d70..8144193 100644 --- a/src/visualization/import-visualization.js +++ b/src/dashboard/import-dashboard.js @@ -24,7 +24,7 @@ import { FormGroup, FormControl, FormLabel } from 'react-bootstrap'; import Dialog from '../common/dialogs/dialog'; -class ImportVisualizationDialog extends React.Component { +class ImportDashboardDialog extends React.Component { valid = false; imported = false; @@ -69,14 +69,14 @@ class ImportVisualizationDialog extends React.Component { reader.onload = function(event) { // read simulator - const visualization = JSON.parse(event.target.result); + const dashboard = JSON.parse(event.target.result); let defaultSimulator = ""; if (self.props.simulation.models != null) { defaultSimulator = self.props.simulation.models[0].simulator; } - visualization.widgets.forEach(widget => { + dashboard.widgets.forEach(widget => { switch (widget.type) { case 'Value': case 'Plot': @@ -93,7 +93,7 @@ class ImportVisualizationDialog extends React.Component { self.imported = true; self.valid = true; - self.setState({ name: visualization.name, widgets: visualization.widgets, grid: visualization.grid }); + self.setState({ name: dashboard.name, widgets: dashboard.widgets, grid: dashboard.grid }); }; reader.readAsText(file); @@ -115,10 +115,10 @@ class ImportVisualizationDialog extends React.Component { render() { return ( - this.onClose(c)} onReset={() => this.resetState()} valid={this.valid}> + this.onClose(c)} onReset={() => this.resetState()} valid={this.valid}> - Visualization File + Dashboard File this.loadFile(e.target.files)} /> @@ -133,4 +133,4 @@ class ImportVisualizationDialog extends React.Component { } } -export default ImportVisualizationDialog; +export default ImportDashboardDialog; diff --git a/src/visualization/new-visualization.js b/src/dashboard/new-dashboard.js similarity index 91% rename from src/visualization/new-visualization.js rename to src/dashboard/new-dashboard.js index 5618c14..cbac2cb 100644 --- a/src/visualization/new-visualization.js +++ b/src/dashboard/new-dashboard.js @@ -1,5 +1,5 @@ /** - * File: new-visualization.js + * File: new-dashboard.js * Author: Markus Grigull * Date: 03.03.2017 * @@ -71,7 +71,7 @@ class NewVisualzationDialog extends React.Component { render() { return ( - this.onClose(c)} onReset={() => this.resetState()} valid={this.valid}> + this.onClose(c)} onReset={() => this.resetState()} valid={this.valid}> Name diff --git a/src/visualization/toolbox-item.js b/src/dashboard/toolbox-item.js similarity index 100% rename from src/visualization/toolbox-item.js rename to src/dashboard/toolbox-item.js diff --git a/src/project/project.js b/src/project/project.js index 78679d7..f6c9530 100644 --- a/src/project/project.js +++ b/src/project/project.js @@ -27,21 +27,21 @@ import FileSaver from 'file-saver'; import AppDispatcher from '../common/app-dispatcher'; import ProjectStore from './project-store'; import UserStore from '../user/user-store'; -import VisualizationStore from '../visualization/visualization-store'; +import DashboardStore from '../dashboard/dashboard-store'; import SimulationStore from '../simulation/simulation-store'; import Icon from '../common/icon'; import CustomTable from '../common/table'; import TableColumn from '../common/table-column'; -import NewVisualzationDialog from '../visualization/new-visualization'; -import EditVisualizationDialog from '../visualization/edit-visualization'; -import ImportVisualizationDialog from '../visualization/import-visualization'; +import NewVisualzationDialog from '../dashboard/new-dashboard'; +import EditDashboardDialog from '../dashboard/edit-dashboard'; +import ImportDashboardDialog from '../dashboard/import-dashboard'; import DeleteDialog from '../common/dialogs/delete-dialog'; -class Visualizations extends Component { +class Dashboards extends Component { static getStores() { - return [ ProjectStore, VisualizationStore, UserStore, SimulationStore ]; + return [ ProjectStore, DashboardStore, UserStore, SimulationStore ]; } static calculateState(prevState, props) { @@ -68,15 +68,15 @@ class Visualizations extends Component { simulation = SimulationStore.getState().find(simulation => simulation._id === project.simulation); } - // load visualizations - let visualizations = []; + // load dashboards + let dashboards = []; - if (project.visualizations != null) { - visualizations = VisualizationStore.getState().filter(visualization => project.visualizations.includes(visualization._id)); + if (project.dashboards != null) { + dashboards = DashboardStore.getState().filter(dashboard => project.dashboards.includes(dashboard._id)); } return { - visualizations, + dashboards, project, simulation, sessionToken, @@ -91,7 +91,7 @@ class Visualizations extends Component { componentDidMount() { AppDispatcher.dispatch({ - type: 'visualizations/start-load', + type: 'dashboards/start-load', token: this.state.sessionToken }); @@ -105,11 +105,11 @@ class Visualizations extends Component { this.setState({ newModal: false }); if (data) { - // add project to visualization + // add project to dashboard data.project = this.state.project._id; AppDispatcher.dispatch({ - type: 'visualizations/start-add', + type: 'dashboards/start-add', data: data, token: this.state.sessionToken }); @@ -132,7 +132,7 @@ class Visualizations extends Component { } AppDispatcher.dispatch({ - type: 'visualizations/start-remove', + type: 'dashboards/start-remove', data: this.state.modalData, token: this.state.sessionToken }); @@ -143,7 +143,7 @@ class Visualizations extends Component { if (data) { AppDispatcher.dispatch({ - type: 'visualizations/start-edit', + type: 'dashboards/start-edit', data: data, token: this.state.sessionToken }); @@ -157,7 +157,7 @@ class Visualizations extends Component { data.project = this.state.project._id; AppDispatcher.dispatch({ - type: 'visualizations/start-add', + type: 'dashboards/start-add', data, token: this.state.sessionToken }); @@ -172,20 +172,20 @@ class Visualizations extends Component { } } - exportVisualization(index) { + exportDashboard(index) { // filter properties - let visualization = Object.assign({}, this.state.visualizations[index]); - delete visualization._id; - delete visualization.project; - delete visualization.user; + let dashboard = Object.assign({}, this.state.dashboards[index]); + delete dashboard._id; + delete dashboard.project; + delete dashboard.user; - visualization.widgets.forEach(widget => { + dashboard.widgets.forEach(widget => { delete widget.simulator; }); // show save dialog - const blob = new Blob([JSON.stringify(visualization, null, 2)], { type: 'application/json' }); - FileSaver.saveAs(blob, 'visualization - ' + visualization.name + '.json'); + const blob = new Blob([JSON.stringify(dashboard, null, 2)], { type: 'application/json' }); + FileSaver.saveAs(blob, 'dashboard - ' + dashboard.name + '.json'); } onModalKeyPress = (event) => { @@ -205,31 +205,31 @@ class Visualizations extends Component {

    {this.state.project.name}

    - - + + this.setState({ editModal: true, modalData: this.state.visualizations[index] })} - onDelete={(index) => this.setState({ deleteModal: true, modalData: this.state.visualizations[index] })} - onExport={index => this.exportVisualization(index)} + onEdit={(index) => this.setState({ editModal: true, modalData: this.state.dashboards[index] })} + onDelete={(index) => this.setState({ deleteModal: true, modalData: this.state.dashboards[index] })} + onExport={index => this.exportDashboard(index)} /> - + this.closeNewModal(data)} /> - this.closeEditModal(data)} visualization={this.state.modalData} /> - this.closeImportModal(data)} simulation={this.state.simulation} /> + this.closeEditModal(data)} dashboard={this.state.modalData} /> + this.closeImportModal(data)} simulation={this.state.simulation} /> - +
    ); } } let fluxContainerConverter = require('../common/FluxContainerConverter'); -export default Container.create(fluxContainerConverter.convert(Visualizations), {withProps: true}); +export default Container.create(fluxContainerConverter.convert(Dashboards), {withProps: true}); diff --git a/src/scenario/scenarios.js b/src/scenario/scenarios.js index ab6e173..5789e31 100644 --- a/src/scenario/scenarios.js +++ b/src/scenario/scenarios.js @@ -45,6 +45,7 @@ class Scenarios extends Component { static calculateState() { const scenarios = ScenarioStore.getState(); const sessionToken = UserStore.getState().token; + console.log(scenarios); return { scenarios, diff --git a/src/styles/app.css b/src/styles/app.css index 552f7ed..45e8557 100644 --- a/src/styles/app.css +++ b/src/styles/app.css @@ -216,7 +216,7 @@ body { } /** - * Visualizations + * Dashboards */ .fullscreen-container { padding: 10px; diff --git a/src/user/edit-own-user.js b/src/user/edit-own-user.js index 3ec5d23..bb37f50 100644 --- a/src/user/edit-own-user.js +++ b/src/user/edit-own-user.js @@ -60,7 +60,6 @@ class EditOwnUserDialog extends React.Component { handleChange(e) { let user = UserStore.getState().currentUser; - console.log("edit-own-user, handlechange methode called"); this.setState({ [e.target.id]: e.target.value }); // check all controls diff --git a/src/widget/widgets/topology.js b/src/widget/widgets/topology.js index c47b155..bd7c62a 100644 --- a/src/widget/widgets/topology.js +++ b/src/widget/widgets/topology.js @@ -86,7 +86,7 @@ class WidgetTopology extends React.Component { this.Viewer = null; this.state = { - visualizationState: 'initial' + dashboardState: 'initial' }; } @@ -108,13 +108,13 @@ class WidgetTopology extends React.Component { componentWillReceiveProps(nextProps) { const file = nextProps.files.find(file => file._id === nextProps.widget.file); // Ensure model is requested only once or a different was selected - if (this.props.widget.file !== nextProps.widget.file || (this.state.visualizationState === 'initial' && file)) { - this.setState({'visualizationState': 'loading' }); + if (this.props.widget.file !== nextProps.widget.file || (this.state.dashboardState === 'initial' && file)) { + this.setState({'dashboardState': 'loading' }); if (file) { fetch(new Request('/' + config.publicPathBase + file.path)) .then( response => { if (response.status === 200) { - this.setState({'visualizationState': 'ready' }); + this.setState({'dashboardState': 'ready' }); return response.text().then( contents => { if (this.svgElem) { let cimsvgInstance = new cimsvg(this.svgElem.current); @@ -135,7 +135,7 @@ class WidgetTopology extends React.Component { .catch(error => { console.error(error); this.setState({ - 'visualizationState': 'show_message', + 'dashboardState': 'show_message', 'message': 'Topology could not be loaded.'}); }); } @@ -143,7 +143,7 @@ class WidgetTopology extends React.Component { // No file has been selected if (!nextProps.widget.file) { this.setState({ - 'visualizationState': 'show_message', + 'dashboardState': 'show_message', 'message': 'Select a topology model first.'}); } } @@ -152,7 +152,7 @@ class WidgetTopology extends React.Component { render() { var markup = null; - switch(this.state.visualizationState) { + switch(this.state.dashboardState) { case 'loading': markup =
    ; break; case 'show_message': From 7331bf517b7c61df9d02ff40cdcb726b7e8f2e35 Mon Sep 17 00:00:00 2001 From: Sonja Happ Date: Mon, 4 Nov 2019 15:20:54 +0100 Subject: [PATCH 034/391] cherry picked all changes from the cleanup-widgets branch and merged them to the new file/ folder structure and package versions; most likely, further fixes are required to make things work. Improves #209 and #205 --- package-lock.json | 37 +- package.json | 2 +- src/dashboard/dashboard-button-group.js | 96 +++++ src/dashboard/dashboard.js | 494 +++++++++--------------- src/dashboard/widget-area.js | 78 ++++ src/dashboard/widget-context-menu.js | 123 ++++++ src/dashboard/widget-toolbox.js | 77 ++++ src/widget/editable-widget-container.js | 142 +++++++ src/widget/widget-container.js | 47 +++ src/widget/widget.js | 217 +++-------- 10 files changed, 823 insertions(+), 490 deletions(-) create mode 100644 src/dashboard/dashboard-button-group.js create mode 100644 src/dashboard/widget-area.js create mode 100644 src/dashboard/widget-context-menu.js create mode 100644 src/dashboard/widget-toolbox.js create mode 100644 src/widget/editable-widget-container.js create mode 100644 src/widget/widget-container.js diff --git a/package-lock.json b/package-lock.json index dfcc0c4..807685b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -5153,11 +5153,18 @@ } }, "eslint-utils": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-1.4.0.tgz", - "integrity": "sha512-7ehnzPaP5IIEh1r1tkjuIrxqhNkzUJa9z3R92tLJdZIVdWaczEhr3EbhGtsMrVxi1KeR8qA7Off6SWc5WNQqyQ==", + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-1.4.3.tgz", + "integrity": "sha512-fbBN5W2xdY45KulGXmLHZ3c3FHfVYmKg0IrAKGOkT/464PQsx2UeIzfz1RmEci+KLm1bBaAzZAh8+/E+XAeZ8Q==", "requires": { - "eslint-visitor-keys": "^1.0.0" + "eslint-visitor-keys": "^1.1.0" + }, + "dependencies": { + "eslint-visitor-keys": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.1.0.tgz", + "integrity": "sha512-8y9YjtM1JBJU/A9Kc+SbaOV4y29sSWckBwMHa+FGtVj5gN/sbnKDf6xJUl+8g7FAij9LVaP8C24DUiH/f/2Z9A==" + } } }, "eslint-visitor-keys": { @@ -6048,9 +6055,9 @@ "integrity": "sha512-d4sze1JNC454Wdo2fkuyzCr6aHcbL6PGGuFAz0Li/NcOm1tCHGnWDRmJP85dh9IhQErTc2svWFEX5xHIOo//kQ==" }, "handlebars": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.1.2.tgz", - "integrity": "sha512-nvfrjqvt9xQ8Z/w0ijewdD/vvWDTOweBUm96NTr66Wfvo1mJenBLwcYmPs3TIBP5ruzYGD7Hx/DaM9RmhroGPw==", + "version": "4.5.1", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.5.1.tgz", + "integrity": "sha512-C29UoFzHe9yM61lOsIlCE5/mQVGrnIOrOq7maQl76L7tYPCgC1og0Ajt6uWnX4ZTxBPnjw+CUvawphwCfJgUnA==", "requires": { "neo-async": "^2.6.0", "optimist": "^0.6.1", @@ -12841,13 +12848,21 @@ "integrity": "sha512-8OaIKfzL5cpx8eCMAhhvTlft8GYF8b2eQr6JkCyVdrgjcytyOmPCXrqXFcUnhonRpLlh5yxEZVohm6mzaowUOw==" }, "uglify-js": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.6.0.tgz", - "integrity": "sha512-W+jrUHJr3DXKhrsS7NUVxn3zqMOFn0hL/Ei6v0anCIMoKC93TjcflTagwIHLW7SfMFfiQuktQyFVCFHGUE0+yg==", + "version": "3.6.7", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.6.7.tgz", + "integrity": "sha512-4sXQDzmdnoXiO+xvmTzQsfIiwrjUCSA95rSP4SEd8tDb51W2TiDOlL76Hl+Kw0Ie42PSItCW8/t6pBNCF2R48A==", "optional": true, "requires": { - "commander": "~2.20.0", + "commander": "~2.20.3", "source-map": "~0.6.1" + }, + "dependencies": { + "commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "optional": true + } } }, "uncontrollable": { diff --git a/package.json b/package.json index 16782d4..9ce2493 100644 --- a/package.json +++ b/package.json @@ -21,7 +21,7 @@ "flux": "^3.1.3", "frontend-collective-react-dnd-scrollzone": "^1.0.2", "gaugeJS": "^1.3.7", - "handlebars": "^4.1.2", + "handlebars": "^4.5.1", "immutable": "^4.0.0-rc.12", "jquery": "^3.4.1", "jszip": "^3.2.2", diff --git a/src/dashboard/dashboard-button-group.js b/src/dashboard/dashboard-button-group.js new file mode 100644 index 0000000..785ac48 --- /dev/null +++ b/src/dashboard/dashboard-button-group.js @@ -0,0 +1,96 @@ +/** + * File: dashboard-button-group.js + * Author: Markus Grigull + * Date: 31.05.2018 + * + * This file is part of VILLASweb. + * + * VILLASweb is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * VILLASweb is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with VILLASweb. If not, see . + ******************************************************************************/ + +import React from 'react'; +import PropTypes from 'prop-types'; +import { Button } from 'react-bootstrap'; + +class DashboardButtonGroup extends React.Component { + render() { + const buttonStyle = { + marginLeft: '8px' + }; + + const buttons = []; + let key = 0; + + if (this.props.fullscreen) { + return null; + } + + if (this.props.editing) { + buttons.push( + , + + ); + } else { + if (this.props.fullscreen !== true) { + buttons.push( + + ); + } + + if (this.props.paused) { + buttons.push( + + ); + } else { + buttons.push( + + ); + } + + buttons.push( + + ); + } + + return
    + {buttons} +
    ; + } +} + +DashboardButtonGroup.propTypes = { + editing: PropTypes.bool, + fullscreen: PropTypes.bool, + paused: PropTypes.bool, + onEdit: PropTypes.func, + onSave: PropTypes.func, + onCancel: PropTypes.func, + onFullscreen: PropTypes.func, + onPause: PropTypes.func, + onUnpause: PropTypes.func +}; + +export default DashboardButtonGroup; diff --git a/src/dashboard/dashboard.js b/src/dashboard/dashboard.js index 1683bd3..80b5406 100644 --- a/src/dashboard/dashboard.js +++ b/src/dashboard/dashboard.js @@ -21,19 +21,18 @@ import React from 'react'; import { Container } from 'flux/utils'; -import { Button, ButtonToolbar } from 'react-bootstrap'; -import { ContextMenu, Item, Separator } from 'react-contexify'; import Fullscreenable from 'react-fullscreenable'; -import Slider from 'rc-slider'; import classNames from 'classnames'; +import { Map } from 'immutable' -import Icon from '../common/icon'; -import WidgetFactory from '../widget/widget-factory'; -import ToolboxItem from './toolbox-item'; -import Dropzone from './dropzone'; +//import Icon from '../common/icon'; import Widget from '../widget/widget'; import EditWidget from '../widget/edit-widget'; -import Grid from './grid'; + +import WidgetContextMenu from './widget-context-menu'; +import WidgetToolbox from './widget-toolbox'; +import WidgetArea from './widget-area'; +import DashboardButtonGroup from './dashboard-button-group'; import UserStore from '../user/user-store'; import DashboardStore from './dashboard-store'; @@ -42,12 +41,12 @@ import SimulationStore from '../simulation/simulation-store'; import SimulationModelStore from '../simulationmodel/simulation-model-store'; import FileStore from '../file/file-store'; import AppDispatcher from '../common/app-dispatcher'; -import NotificationsDataManager from '../common/data-managers/notifications-data-manager'; -import NotificationsFactory from '../common/data-managers/notifications-factory'; import 'react-contexify/dist/ReactContexify.min.css'; class Dashboard extends React.Component { + + static lastWidgetKey = 0; static getStores() { return [ DashboardStore, ProjectStore, SimulationStore, SimulationModelStore, FileStore, UserStore ]; } @@ -57,19 +56,46 @@ class Dashboard extends React.Component { prevState = {}; } + let dashboard = Map(); + let rawDashboard = DashboardStore.getState().find(v => v._id === props.match.params.dashboard); + + if (rawDashboard != null) { + dashboard = Map(rawDashboard); + + // convert widgets list to a dictionary to be able to reference widgets + const widgets = {}; + + for (let widget of dashboard.get('widgets')) { + widgets[this.getNewWidgetKey()] = widget; + } + + dashboard = dashboard.set('widgets', widgets); + + // this.computeHeightWithWidgets(widgets); + + // this.setState({ dashboard: selectedDashboards, project: null }); + + // AppDispatcher.dispatch({ + // type: 'projects/start-load', + // data: selectedDashboard.get('project'), + // token: this.state.sessionToken + // }); + + } + let simulationModels = []; if (prevState.simulation != null) { simulationModels = SimulationModelStore.getState().filter(m => prevState.simulation.models.includes(m._id)); } return { + dashboard, + sessionToken: UserStore.getState().token, - dashboards: DashboardStore.getState(), projects: ProjectStore.getState(), simulations: SimulationStore.getState(), files: FileStore.getState(), - dashboard: prevState.dashboard || {}, project: prevState.project || null, simulation: prevState.simulation || null, simulationModels, @@ -81,20 +107,30 @@ class Dashboard extends React.Component { modalIndex: prevState.modalIndex || null, maxWidgetHeight: prevState.maxWidgetHeight || 0, - dropZoneHeight: prevState.dropZoneHeight || 0 + dropZoneHeight: prevState.dropZoneHeight || 0, }; + } - componentWillMount() { - // TODO: Don't fetch token from local, use user-store! - const token = localStorage.getItem('token'); + static getNewWidgetKey() { + const widgetKey = this.lastWidgetKey; + this.lastWidgetKey++; + return widgetKey; + } + + + componentWillMount() { //document.addEventListener('keydown', this.handleKeydown.bind(this)); - AppDispatcher.dispatch({ - type: 'dashboards/start-load', - token - }); + if (this.state.dashboard.has('id') === false) { + AppDispatcher.dispatch({ + type: 'dashboards/start-load', + data: this.props.match.params.dashboard, + token: this.state.sessionToken + }); + } + } componentWillUnmount() { @@ -149,12 +185,24 @@ class Dashboard extends React.Component { } }*/ - transformToWidgetsDict(widgets) { - var widgetsDict = {}; - // Create a new key and make a copy of the widget object - var key = 0; - widgets.forEach( (widget) => widgetsDict[key++] = Object.assign({}, widget) ); - return widgetsDict; + /* + * Adapt the area's height with the position of the new widget. + * Return true if the height increased, otherwise false. + */ + increaseHeightWithWidget(widget) { + let increased = false; + let thisWidgetHeight = widget.y + widget.height; + + if (thisWidgetHeight > this.state.maxWidgetHeight) { + increased = true; + + this.setState({ + maxWidgetHeight: thisWidgetHeight, + dropZoneHeight: thisWidgetHeight + 40 + }); + } + + return increased; } transformToWidgetsList(widgets) { @@ -186,64 +234,40 @@ class Dashboard extends React.Component { }); } - snapToGrid(value) { - if (this.state.dashboard.grid === 1) return value; + handleDrop = widget => { + const widgets = this.state.dashboard.get('widgets') || []; - return Math.round(value / this.state.dashboard.grid) * this.state.dashboard.grid; - } + const widgetKey = this.getNewWidgetKey(); + widgets[widgetKey] = widget; - handleDrop(item, position) { + const dashboard = this.state.dashboard.set('widgets'); - let widget = null; - let defaultSimulationModel = null; + // this.increaseHeightWithWidget(widget); - if (this.state.simulation.models && this.state.simulation.models.length === 0) { - NotificationsDataManager.addNotification(NotificationsFactory.NO_SIM_MODEL_AVAILABLE); - } else { - defaultSimulationModel = this.state.simulation.models[0]; - } + this.setState({ dashboard }); + }; - // snap position to grid - position.x = this.snapToGrid(position.x); - position.y = this.snapToGrid(position.y); - - // create new widget - widget = WidgetFactory.createWidgetOfType(item.name, position, defaultSimulationModel); - - var new_widgets = this.state.dashboard.widgets; - var new_key = Object.keys(new_widgets).length; - - new_widgets[new_key] = widget; - - var dashboard = Object.assign({}, this.state.dashboard, { - widgets: new_widgets - }); - - this.increaseHeightWithWidget(widget); - this.setState({ dashboard: dashboard }); - } widgetStatusChange(updated_widget, key) { // Widget changed internally, make changes effective then save them this.widgetChange(updated_widget, key, this.saveChanges); } - widgetChange(updated_widget, key, callback = null) { - var widgets_update = {}; - widgets_update[key] = updated_widget; - var new_widgets = Object.assign({}, this.state.dashboard.widgets, widgets_update); + widgetChange = (widget, index, callback = null) => { + const widgets = this.state.dashboard.get('widgets'); + widgets[index] = widget; - var dashboard = Object.assign({}, this.state.dashboard, { - widgets: new_widgets - }); + const dashboard = this.state.dashboard.set('widgets'); // Check if the height needs to be increased, the section may have shrunk if not - if (!this.increaseHeightWithWidget(updated_widget)) { + if (!this.increaseHeightWithWidget(widget)) { this.computeHeightWithWidgets(dashboard.widgets); } - this.setState({ dashboard: dashboard }, callback); + + this.setState({ dashboard }, callback); } + /* * Set the initial height state based on the existing widgets */ @@ -261,289 +285,137 @@ class Dashboard extends React.Component { dropZoneHeight: maxHeight + 80 }); } - /* - * Adapt the area's height with the position of the new widget. - * Return true if the height increased, otherwise false. - */ - increaseHeightWithWidget(widget) { - let increased = false; - let thisWidgetHeight = widget.y + widget.height; - if (thisWidgetHeight > this.state.maxWidgetHeight) { - increased = true; - this.setState({ - maxWidgetHeight: thisWidgetHeight, - dropZoneHeight: thisWidgetHeight + 40 - }); - } - return increased; + + + editWidget = (widget, index) => { + this.setState({ editModal: true, modalData: widget, modalIndex: index }); } - editWidget(e, data) { - this.setState({ editModal: true, modalData: this.state.dashboard.widgets[data.key], modalIndex: data.key }); - } - closeEdit(data) { - if (data) { - // save changes temporarily - var widgets_update = {}; - widgets_update[this.state.modalIndex] = data; - - var new_widgets = Object.assign({}, this.state.dashboard.widgets, widgets_update); - - var dashboard = Object.assign({}, this.state.dashboard, { - widgets: new_widgets - }); - - this.setState({ editModal: false, dashboard: dashboard }); - } else { + closeEdit = data => { + if (data == null) { this.setState({ editModal: false }); + + return; } - } - deleteWidget(e, data) { - delete this.state.dashboard.widgets[data.key]; - var dashboard = Object.assign({}, this.state.dashboard, { - widgets: this.state.dashboard.widgets - }); - this.setState({ dashboard: dashboard }); - } + const widgets = this.state.dashboard.get('widgets'); + widgets[this.state.modalIndex] = data; - stopEditing() { + const dashboard = this.state.dashboard.set('widgets', widgets); + + this.setState({ editModal: false, dashboard }); + }; + + + deleteWidget = (widget, index) => { + const widgets = this.state.dashboard.get('widgets'); + delete widgets[index]; + + const dashboard = this.state.dashboard.set('widgets'); + + this.setState({ dashboard }); + }; + + + startEditing = () => { + this.setState({ editing: true }); + }; + + saveEditing = () => { // Provide the callback so it can be called when state change is applied + // TODO: Check if callback is needed this.setState({ editing: false }, this.saveChanges ); - } + }; saveChanges() { // Transform to a list - var dashboard = Object.assign({}, this.state.dashboard, { - widgets: this.transformToWidgetsList(this.state.dashboard.widgets) + const dashboard = Object.assign({}, this.state.dashboard.toJS(), { + widgets: this.transformToWidgetsList(this.state.dashboard.get('widgets')) }); - const token = localStorage.getItem('token'); - AppDispatcher.dispatch({ type: 'dashboards/start-edit', data: dashboard, - token + token: this.state.sessionToken }); } - discardChanges() { - this.setState({ editing: false, dashboard: {} }); + cancelEditing = () => { + this.setState({ editing: false, dasboard: {} }); this.reloadDashboard(); - } + }; - moveWidget(e, data, applyDirection) { - var widget = this.state.dashboard.widgets[data.key]; - var updated_widgets = {}; - updated_widgets[data.key] = applyDirection(widget); - var new_widgets = Object.assign({}, this.state.dashboard.widgets, updated_widgets); - - var dashboard = Object.assign({}, this.state.dashboard, { - widgets: new_widgets - }); - - this.setState({ dashboard: dashboard }); - } - - moveAbove(widget) { - // increase z-Order - widget.z++; - return widget; - } - - moveToFront(widget) { - // increase z-Order - widget.z = 100; - return widget; - } - - moveUnderneath(widget) { - // decrease z-Order - widget.z--; - if (widget.z < 0) { - widget.z = 0; - } - return widget; - } - - moveToBack(widget) { - // increase z-Order - widget.z = 0; - return widget; - } - - setGrid(value) { - // value 0 would block all widgets, set 1 as 'grid disabled' - if (value === 0) { - value = 1; - } - - let dashboard = Object.assign({}, this.state.dashboard, { - grid: value - }); + setGrid = value => { + const dashboard = this.state.dashboard.set('grid', value); this.setState({ dashboard }); - } - - lockWidget(data) { - // lock the widget - let widget = this.state.dashboard.widgets[data.key]; - widget.locked = true; - - // update dashboard - let widgets = {}; - widgets[data.key] = widget; - widgets = Object.assign({}, this.state.dashboard.widgets, widgets); - - const dashboard = Object.assign({}, this.state.dashboard, { widgets }); - this.setState({ dashboard }); - } - - unlockWidget(data) { - // lock the widget - let widget = this.state.dashboard.widgets[data.key]; - widget.locked = false; - - // update dashboard - let widgets = {}; - widgets[data.key] = widget; - widgets = Object.assign({}, this.state.dashboard.widgets, widgets); - - const dashboard = Object.assign({}, this.state.dashboard, { widgets }); - this.setState({ dashboard }); - } + }; pauseData = () => { this.setState({ paused: true }); - } + }; unpauseData = () => { this.setState({ paused: false }); - } + }; + render() { - const current_widgets = this.state.dashboard.widgets; + const widgets = this.state.dashboard.get('widgets'); + const grid = this.state.dashboard.get('grid'); - let boxClasses = classNames('section', 'box', { 'fullscreen-container': this.props.isFullscreen }); + const boxClasses = classNames('section', 'box', { 'fullscreen-padding': this.props.isFullscreen }); - let buttons = [] - let editingControls = []; - let gridControl = {}; - - if (this.state.editing) { - buttons.push({ click: () => this.stopEditing(), icon: 'save', text: 'Save' }); - buttons.push({ click: () => this.discardChanges(), icon: 'ban', text: 'Cancel' }); - - gridControl =
    - Grid: {this.state.dashboard.grid > 1 ? this.state.dashboard.grid : 'Disabled'} - this.setGrid(value)} /> -
    - } - - if (!this.props.isFullscreen) { - buttons.push({ click: this.props.toggleFullscreen, icon: 'expand', text: 'Fullscreen' }); - buttons.push({ click: this.state.paused ? this.unpauseData : this.pauseData, icon: this.state.paused ? 'play' : 'pause', text: this.state.paused ? 'Live' : 'Pause' }); - - if (!this.state.editing) - buttons.push({ click: () => this.setState({ editing: true }), icon: 'edit', text: 'Edit' }); - } - - const buttonList = buttons.map((btn, idx) => - - ); - - // Only one topology widget at the time is supported - let thereIsTopologyWidget = current_widgets && Object.values(current_widgets).filter( widget => widget.type === 'Topology').length > 0; - let topologyItemMsg = !thereIsTopologyWidget? '' : 'Currently only one is supported'; - - return ( -
    -
    -
    - {this.state.dashboard.name} -
    - -
    - { this.state.editing && gridControl } - { buttonList } -
    + return
    +
    +
    + {this.state.dashboard.get('name')}
    -
    e.preventDefault() }> - {this.state.editing && -
    - - { editingControls } - - - - - - - - - - - - - - - - - - - -
    - } - - this.handleDrop(item, position)} editing={this.state.editing}> - {current_widgets != null && - Object.keys(current_widgets).map(widget_key => ( - this.widgetChange(w, k)} - onWidgetStatusChange={(w, k) => this.widgetStatusChange(w, k)} - editing={this.state.editing} - index={widget_key} - grid={this.state.dashboard.grid} - paused={this.state.paused} - /> - ))} - - - - - {current_widgets != null && - Object.keys(current_widgets).map(widget_key => { - const data = { key: widget_key }; - - const locked = this.state.dashboard.widgets[widget_key].locked; - const disabledMove = locked || this.state.dashboard.widgets[widget_key].type === 'Box'; - - return - this.editWidget(e, data)}>Edit - this.deleteWidget(e, data)}>Delete - - this.moveWidget(e, data, this.moveAbove)}>Move above - this.moveWidget(e, data, this.moveToFront)}>Move to front - this.moveWidget(e, data, this.moveUnderneath)}>Move underneath - this.moveWidget(e, data, this.moveToBack)}>Move to back - - this.lockWidget(data)}>Lock - this.unlockWidget(data)}>Unlock - - })} - - this.closeEdit(data)} widget={this.state.modalData} simulationModels={this.state.simulationModels} files={this.state.files} /> -
    +
    - ); + +
    e.preventDefault() }> + {this.state.editing && + + } + + + {widgets != null && Object.keys(widgets).map(widgetKey => ( + this.widgetChange(w, k)} + onWidgetStatusChange={(w, k) => this.widgetStatusChange(w, k)} + editing={this.state.editing} + index={widgetKey} + grid={grid} + paused={this.state.paused} + /> + ))} + + + {/* TODO: Create only one context menu for all widgets */} + {widgets != null && Object.keys(widgets).map(widgetKey => ( + + ))} + + +
    +
    ; } } diff --git a/src/dashboard/widget-area.js b/src/dashboard/widget-area.js new file mode 100644 index 0000000..cc08afc --- /dev/null +++ b/src/dashboard/widget-area.js @@ -0,0 +1,78 @@ +/** + * File: widget-area.js + * Author: Markus Grigull + * Date: 31.05.2018 + * + * This file is part of VILLASweb. + * + * VILLASweb is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * VILLASweb is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with VILLASweb. If not, see . + ******************************************************************************/ + +import React from 'react'; +import PropTypes from 'prop-types'; + +import Dropzone from './dropzone'; +import Grid from './grid'; + +import WidgetFactory from '../widget/widget-factory'; + +class WidgetArea extends React.Component { + snapToGrid(value) { + if (this.props.grid === 1) { + return value; + } + + return Math.round(value / this.props.grid) * this.props.grid; + } + + handleDrop = (item, position) => { + position.x = this.snapToGrid(position.x); + position.y = this.snapToGrid(position.y); + + const widget = WidgetFactory.createWidgetOfType(item.name, position, this.props.defaultSimulationModel); + + if (this.props.onWidgetAdded != null) { + this.props.onWidgetAdded(widget); + } + } + + render() { + const maxHeight = Object.values(this.props.widgets).reduce((currentHeight, widget) => { + const absolutHeight = widget.y + widget.height; + + return absolutHeight > currentHeight ? absolutHeight : currentHeight; + }, 0); + + return + {this.props.children} + + + ; + } +} + +WidgetArea.propTypes = { + children: PropTypes.node, //TODO is .node correct here? Was .children before leading to compile error + editing: PropTypes.bool, + grid: PropTypes.number, + defaultSimulationModel: PropTypes.string, + widgets: PropTypes.object, + onWidgetAdded: PropTypes.func +}; + +WidgetArea.defaultProps = { + widgets: {} +}; + +export default WidgetArea; diff --git a/src/dashboard/widget-context-menu.js b/src/dashboard/widget-context-menu.js new file mode 100644 index 0000000..69e0683 --- /dev/null +++ b/src/dashboard/widget-context-menu.js @@ -0,0 +1,123 @@ +/** + * File: widget-context-menu.js + * Author: Markus Grigull + * Date: 31.05.2018 + * + * This file is part of VILLASweb. + * + * VILLASweb is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * VILLASweb is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with VILLASweb. If not, see . + ******************************************************************************/ + +import React from 'react'; +import PropTypes from 'prop-types'; +import { contextMenu, Item, Separator } from 'react-contexify'; + +class WidgetContextMenu extends React.Component { + editWidget = event => { + if (this.props.onEdit != null) { + this.props.onEdit(this.props.widget, this.props.index); + } + }; + + deleteWidget = event => { + if (this.props.onDelete != null) { + this.props.onDelete(this.props.widget, this.props.index); + } + }; + + moveAbove = event => { + this.props.widget.z++; + if (this.props.widget.z > 100) { + this.props.widget.z = 100; + } + + if (this.props.onChange != null) { + this.props.onChange(this.props.widget, this.props.index); + } + }; + + moveToFront = event => { + this.props.widget.z = 100; + + if (this.props.onChange != null) { + this.props.onChange(this.props.widget, this.props.index); + } + }; + + moveUnderneath = event => { + this.props.widget.z--; + if (this.props.widget.z < 0) { + this.props.widget.z = 0; + } + + if (this.props.onChange != null) { + this.props.onChange(this.props.widget, this.props.index); + } + }; + + moveToBack = event => { + this.props.widget.z = 0; + + if (this.props.onChange != null) { + this.props.onChange(this.props.widget, this.props.index); + } + }; + + lockWidget = event => { + this.props.widget.locked = true; + + if (this.props.onChange != null) { + this.props.onChange(this.props.widget, this.props.index); + } + }; + + unlockWidget = event => { + this.props.widget.locked = false; + + if (this.props.onChange != null) { + this.props.onChange(this.props.widget, this.props.index); + } + }; + + render() { + const isLocked = this.props.widget.locked; + + return + Edit + Delete + + + + Move above + Move to front + Move underneath + Move to back + + + + Lock + Unlock + ; + } +} + +WidgetContextMenu.propTypes = { + index: PropTypes.number.isRequired, + widget: PropTypes.object.isRequired, + onEdit: PropTypes.func, + onDelete: PropTypes.func, + onChange: PropTypes.func +}; + +export default WidgetContextMenu diff --git a/src/dashboard/widget-toolbox.js b/src/dashboard/widget-toolbox.js new file mode 100644 index 0000000..9799ff5 --- /dev/null +++ b/src/dashboard/widget-toolbox.js @@ -0,0 +1,77 @@ +/** + * File: widget-toolbox.js + * Author: Markus Grigull + * Date: 31.05.2018 + * + * This file is part of VILLASweb. + * + * VILLASweb is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * VILLASweb is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with VILLASweb. If not, see . + ******************************************************************************/ + +import React from 'react'; +import PropTypes from 'prop-types'; +import Slider from 'rc-slider'; + +import ToolboxItem from './toolbox-item'; + +class WidgetToolbox extends React.Component { + onGridChange = value => { + // value 0 would block all widgets, set 1 as 'grid disabled' + if (value === 0) { + value = 1; + } + + if (this.props.onGridChange != null) { + this.props.onGridChange(value); + } + }; + + render() { + // Only one topology widget at the time is supported + const thereIsTopologyWidget = this.props.widgets != null && Object.values(this.props.widgets).filter(w => w.type === 'Topology').length > 0; + const topologyItemMsg = thereIsTopologyWidget? 'Currently only one is supported' : ''; + + return
    + + + + + + + + + + + + + + + +
    +
    + Grid: { this.props.grid > 1 ? this.props.grid : 'Disabled' } + +
    +
    +
    ; + }; +} + +WidgetToolbox.propTypes = { + widgets: PropTypes.array, + grid: PropTypes.number, + onGridChange: PropTypes.func +}; + +export default WidgetToolbox; diff --git a/src/widget/editable-widget-container.js b/src/widget/editable-widget-container.js new file mode 100644 index 0000000..db5e828 --- /dev/null +++ b/src/widget/editable-widget-container.js @@ -0,0 +1,142 @@ +/** + * File: editable-widget-container.js + * Author: Markus Grigull + * Date: 31.05.2018 + * + * This file is part of VILLASweb. + * + * VILLASweb is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * VILLASweb is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with VILLASweb. If not, see . + ******************************************************************************/ + +import React from 'react'; +import PropTypes from 'prop-types'; +import classNames from 'classnames'; +import { Rnd } from 'react-rnd'; +import { contextMenu } from 'react-contexify'; + +class EditableWidgetContainer extends React.Component { + constructor(props) { + super(props); + + this.rnd = null; + } + + snapToGrid(value) { + if (this.props.grid === 1) { + return value; + } + + return Math.round(value / this.props.grid) * this.props.grid; + } + + borderWasClicked = event => { + if (event.button !== 2) { + return; + } + }; + + drag = (event, data) => { + const x = this.snapToGrid(data.x); + const y = this.snapToGrid(data.y); + + if (x !== data.x || y !== data.y) { + this.rnd.updatePosition({ x, y }); + } + }; + + dragStop = (event, data) => { + const widget = this.props.widget; + + widget.x = this.snapToGrid(data.x); + widget.y = this.snapToGrid(data.y); + + if (this.props.onWidgetChange != null) { + this.props.onWidgetChange(widget, this.props.index); + } + }; + + resizeStop = (direction, delta, ref, event) => { + const widget = this.props.widget; + + // resize depends on direction + if (direction === 'left' || direction === 'topLeft' || direction === 'bottomLeft') { + widget.x -= delta.width; + } + + if (direction === 'top' || direction === 'topLeft' || direction === 'topRight') { + widget.y -= delta.height; + } + + widget.width += delta.width; + widget.height += delta.height; + + if (this.props.onWidgetChange != null) { + this.props.onWidgetChange(widget, this.props.index); + } + }; + + render() { + const widget = this.props.widget; + + const resizing = { + bottom: !widget.locked, + bottomLeft: !widget.locked, + bottomRight: !widget.locked, + left: !widget.locked, + right: !widget.locked, + top: !widget.locked, + topLeft: !widget.locked, + topRight: !widget.locked + }; + + const gridArray = [ this.props.grid, this.props.grid ]; + + const widgetClasses = classNames({ + 'editing-widget': true, + 'locked': widget.locked + }); + + return { this.rnd = c; }} + default={{ x: Number(widget.x), y: Number(widget.y), width: widget.width, height: widget.height }} + minWidth={widget.minWidth} + minHeight={widget.minHeight} + lockAspectRatio={Boolean(widget.lockAspect)} + bounds={'parent'} + className={widgetClasses} + onResizeStart={this.borderWasClicked} + onResizeStop={this.resizeStop} + onDrag={this.drag} + onDragStop={this.dragStop} + dragGrid={gridArray} + resizeGrid={gridArray} + zIndex={widget.z} + enableResizing={resizing} + disableDragging={widget.locked} + > + + {this.props.children} + + ; + } +} + +EditableWidgetContainer.propTypes = { + widget: PropTypes.object.isRequired, + index: PropTypes.number.isRequired, + grid: PropTypes.number, + onWidgetChange: PropTypes.func +}; + +export default EditableWidgetContainer diff --git a/src/widget/widget-container.js b/src/widget/widget-container.js new file mode 100644 index 0000000..4aa62a5 --- /dev/null +++ b/src/widget/widget-container.js @@ -0,0 +1,47 @@ +/** + * File: widget-container.js + * Author: Markus Grigull + * Date: 31.05.2018 + * + * This file is part of VILLASweb. + * + * VILLASweb is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * VILLASweb is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with VILLASweb. If not, see . + ******************************************************************************/ + +import React from 'react'; +import PropTypes from 'prop-types'; + +class WidgetContainer extends React.Component { + render() { + const containerStyle = { + width: Number(this.props.widget.width), + height: Number(this.props.widget.height), + left: Number(this.props.widget.x), + top: Number(this.props.widget.y), + zIndex: Number(this.props.widget.z), + position: 'absolute' + }; + + return
    + {this.props.children} +
    ; + } +} + +WidgetContainer.propTypes = { + widget: PropTypes.object.isRequired, + children: PropTypes.node, //TODO is .node correct here? Was .children before leading to compile error +}; + +export default WidgetContainer diff --git a/src/widget/widget.js b/src/widget/widget.js index cb9944e..4513cf7 100644 --- a/src/widget/widget.js +++ b/src/widget/widget.js @@ -21,9 +21,6 @@ import React from 'react'; import { Container } from 'flux/utils'; -import { ContextMenuProvider } from 'react-contexify'; -import { Rnd } from 'react-rnd'; -import classNames from 'classnames'; import AppDispatcher from '../common/app-dispatcher'; import UserStore from '../user/user-store'; @@ -31,6 +28,9 @@ import SimulatorDataStore from '../simulator/simulator-data-store'; import SimulationModelStore from '../simulationmodel/simulation-model-store'; import FileStore from '../file/file-store'; +import EditableWidgetContainer from './editable-widget-container'; +import WidgetContainer from './widget-container'; + import WidgetCustomAction from './widgets/custom-action'; import WidgetAction from './widgets/action'; import WidgetLamp from './widgets/lamp'; @@ -56,8 +56,6 @@ class Widget extends React.Component { } static calculateState(prevState, props) { - const sessionToken = UserStore.getState().token; - let simulatorData = {}; if (props.paused) { @@ -68,101 +66,32 @@ class Widget extends React.Component { simulatorData = SimulatorDataStore.getState(); } - if (prevState) { - return { - sessionToken, - simulatorData, - files: FileStore.getState(), - sequence: prevState.sequence + 1, + return { + simulatorData, + files: FileStore.getState(), + simulationModels: SimulationModelStore.getState(), - simulationModels: SimulationModelStore.getState() - }; - } else { - return { - sessionToken, - simulatorData, - files: FileStore.getState(), - sequence: 0, + sequence: prevState != null ? prevState.sequence + 1 : 0, - simulationModels: SimulationModelStore.getState() - }; - } - } - - constructor(props) { - super(props); - - // Reference to the context menu element - this.contextMenuTriggerViaDraggable = null; + sessionToken: UserStore.getState().token + }; } componentWillMount() { - // If loading for the first time - if (this.state.sessionToken) { - AppDispatcher.dispatch({ - type: 'files/start-load', - token: this.state.sessionToken - }); - - AppDispatcher.dispatch({ - type: 'simulationModels/start-load', - token: this.state.sessionToken - }); - } - } - - snapToGrid(value) { - if (this.props.grid === 1) - return value; - - return Math.round(value / this.props.grid) * this.props.grid; - } - - drag(event, data) { - const x = this.snapToGrid(data.x); - const y = this.snapToGrid(data.y); - - if (x !== data.x || y !== data.y) { - this.rnd.updatePosition({ x, y }); - } - } - - dragStop(event, data) { - // update widget - let widget = this.props.data; - widget.x = this.snapToGrid(data.x); - widget.y = this.snapToGrid(data.y); - - this.props.onWidgetChange(widget, this.props.index); - } - - resizeStop(direction, delta, event) { - // update widget - let widget = Object.assign({}, this.props.data); - - // resize depends on direction - if (direction === 'left' || direction === 'topLeft' || direction === 'bottomLeft') { - widget.x -= delta.width; + if (this.state.sessionToken == null) { + return; } - if (direction === 'top' || direction === 'topLeft' || direction === 'topRight') { - widget.y -= delta.height; - } + AppDispatcher.dispatch({ + type: 'files/start-load', + token: this.state.sessionToken + }); - widget.width += delta.width; - widget.height += delta.height; + AppDispatcher.dispatch({ + type: 'simulationModels/start-load', + token: this.state.sessionToken + }); - this.props.onWidgetChange(widget, this.props.index); - } - - borderWasClicked(e) { - // check if it was triggered by the right button - if (e.button === 2) { - // launch the context menu using the reference - if(this.contextMenuTriggerViaDraggable) { - this.contextMenuTriggerViaDraggable.handleContextClick(e); - } - } } inputDataChanged(widget, data) { @@ -184,16 +113,7 @@ class Widget extends React.Component { }); } - render() { - // configure grid - const grid = [this.props.grid, this.props.grid]; - - // get widget element - const widget = this.props.data; - let borderedWidget = false; - let element = null; - let zIndex = Number(widget.z); - + createWidget(widget) { let simulationModel = null; for (let model of this.state.simulationModels) { @@ -204,93 +124,56 @@ class Widget extends React.Component { simulationModel = model; } - // dummy is passed to widgets to keep updating them while in edit mode if (widget.type === 'CustomAction') { - element = + return } else if (widget.type === 'Action') { - element = + return } else if (widget.type === 'Lamp') { - element = + return } else if (widget.type === 'Value') { - element = + return } else if (widget.type === 'Plot') { - element = + return } else if (widget.type === 'Table') { - element = + return } else if (widget.type === 'Label') { - element = + return } else if (widget.type === 'PlotTable') { - element = this.props.onWidgetStatusChange(w, this.props.index)} paused={this.props.paused} /> + return this.props.onWidgetStatusChange(w, this.props.index)} paused={this.props.paused} /> } else if (widget.type === 'Image') { - element = + return } else if (widget.type === 'Button') { - element = this.inputDataChanged(widget, value)} /> - } else if (widget.type === 'Input') { - element = this.inputDataChanged(widget, value)} /> + return this.inputDataChanged(widget, value)} /> + } else if (widget.type === 'NumberInput') { + return this.inputDataChanged(widget, value)} /> } else if (widget.type === 'Slider') { - element = this.inputDataChanged(widget, value)} onWidgetChange={(w) => this.props.onWidgetStatusChange(w, this.props.index) } /> + return this.props.onWidgetStatusChange(w, this.props.index) } onInputChanged={value => this.inputDataChanged(widget, value)} /> } else if (widget.type === 'Gauge') { - element = + return } else if (widget.type === 'Box') { - element = + return } else if (widget.type === 'HTML') { - element = + return } else if (widget.type === 'Topology') { - element = + return } - if (widget.type === 'Box') - zIndex = 0; + return null; + } - const widgetClasses = classNames({ - 'widget': !this.props.editing, - 'editing-widget': this.props.editing, - 'border': borderedWidget, - 'unselectable': false, - 'locked': widget.locked && this.props.editing - }); + + render() { + const element = this.createWidget(this.props.data); if (this.props.editing) { - const resizing = { bottom: !widget.locked, bottomLeft: !widget.locked, bottomRight: !widget.locked, left: !widget.locked, right: !widget.locked, top: !widget.locked, topLeft: !widget.locked, topRight: !widget.locked}; - - return ( - { this.rnd = c; }} - default={{ x: Number(widget.x), y: Number(widget.y), width: widget.width, height: widget.height }} - minWidth={widget.minWidth} - minHeight={widget.minHeight} - lockAspectRatio={Boolean(widget.lockAspect)} - bounds={'parent'} - className={ widgetClasses } - onResizeStart={(event, direction, ref) => this.borderWasClicked(event)} - onResizeStop={(event, direction, ref, delta) => this.resizeStop(direction, delta, event)} - onDrag={(event, data) => this.drag(event, data)} - onDragStop={(event, data) => this.dragStop(event, data)} - dragGrid={grid} - resizeGrid={grid} - z={zIndex} - enableResizing={resizing} - disableDragging={widget.locked} - > - - {element} - - - ); - } else { - return ( -
    - {element} -
    - ); + return + {element} + ; } + + return + {element} + ; } } From 11891016e44e98c08a5fcf3639a81bf6b4c9d46d Mon Sep 17 00:00:00 2001 From: Sonja Happ Date: Tue, 5 Nov 2019 10:42:29 +0100 Subject: [PATCH 035/391] add subtitle in config file and show it in header next to instance name --- src/common/header.js | 3 ++- src/config.js | 5 +++-- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/src/common/header.js b/src/common/header.js index 7d72e0c..e8c70c2 100644 --- a/src/common/header.js +++ b/src/common/header.js @@ -23,13 +23,14 @@ import React from 'react'; import { Col, Button } from 'react-bootstrap'; import { Hidden } from 'react-grid-system' import Icon from './icon'; +import config from '../config'; class Header extends React.Component { render() { return (
    -

    VILLASweb

    +

    {config.instance} - {config.subtitle}

    diff --git a/src/config.js b/src/config.js index 82be462..6b68fa3 100644 --- a/src/config.js +++ b/src/config.js @@ -2,10 +2,11 @@ const config = { publicPathBase: 'public/', instance: 'VILLASweb', + subtitle: 'ACS', admin: { - name: 'Institute for Automation of Complex Power Systems, RWTH Aachen University, Germany', + name: 'Institute for Automation of Complex Power Systems (ACS), RWTH Aachen University, Germany', mail: 'stvogel@eonerc.rwth-aachen.de' } -} +}; export default config From bfab0be2d906243b29b3dc05dd47dcf8d26e85ef Mon Sep 17 00:00:00 2001 From: Laura Fuentes Grau Date: Tue, 5 Nov 2019 14:56:40 +0100 Subject: [PATCH 036/391] wip #210 added query parameter 'param' --- src/common/api/rest-api.js | 1 + src/common/data-managers/rest-data-manager.js | 114 +++++++++++++----- src/user/edit-user.js | 4 +- 3 files changed, 84 insertions(+), 35 deletions(-) diff --git a/src/common/api/rest-api.js b/src/common/api/rest-api.js index 4fb5395..d515079 100644 --- a/src/common/api/rest-api.js +++ b/src/common/api/rest-api.js @@ -73,6 +73,7 @@ class RestAPI { } post(url, body, token) { + console.log(url); return new Promise(function (resolve, reject) { var req = request.post(url).send(body).timeout({ response: 5000 }); // Simple response start timeout (3s) diff --git a/src/common/data-managers/rest-data-manager.js b/src/common/data-managers/rest-data-manager.js index b667ac0..65b904d 100644 --- a/src/common/data-managers/rest-data-manager.js +++ b/src/common/data-managers/rest-data-manager.js @@ -52,7 +52,7 @@ class RestDataManager { return object; } - load(id, token = null) { + load(id, token = null,param = null) { if (id != null) { // load single object RestAPI.get(this.makeURL(this.url + '/' + id), token).then(response => { @@ -96,54 +96,102 @@ class RestDataManager { } } - add(object, token = null) { + add(object, token = null, param = null) { var obj = {}; obj[this.type] = this.filterKeys(object); - RestAPI.post(this.makeURL(this.url), obj, token).then(response => { - AppDispatcher.dispatch({ - type: this.type + 's/added', - data: response[this.type] + if (param === null) { + RestAPI.post(this.makeURL(this.url), obj, token).then(response => { + AppDispatcher.dispatch({ + type: this.type + 's/added', + data: response[this.type] + }); + }).catch(error => { + AppDispatcher.dispatch({ + type: this.type + 's/add-error', + error: error + }); }); - }).catch(error => { - AppDispatcher.dispatch({ - type: this.type + 's/add-error', - error: error + } + else{ + console.log("else was called in add"); + RestAPI.post(this.makeURL(this.url) + "?" + param, obj, token).then(response => { + AppDispatcher.dispatch({ + type: this.type + 's/added', + data: response[this.type] + }); + }).catch(error => { + AppDispatcher.dispatch({ + type: this.type + 's/add-error', + error: error + }); }); - }); + } } - remove(object, token = null) { - RestAPI.delete(this.makeURL(this.url + '/' + object.id), token).then(response => { - AppDispatcher.dispatch({ - type: this.type + 's/removed', - data: response[this.type], - original: object + remove(object, token = null, param = null) { + if (param === null) { + RestAPI.delete(this.makeURL(this.url + '/' + object.id), token).then(response => { + AppDispatcher.dispatch({ + type: this.type + 's/removed', + data: response[this.type], + original: object + }); + }).catch(error => { + AppDispatcher.dispatch({ + type: this.type + 's/remove-error', + error: error + }); }); - }).catch(error => { - AppDispatcher.dispatch({ - type: this.type + 's/remove-error', - error: error + } + else{ + RestAPI.delete(this.makeURL(this.url + '/' + object.id + '?' + param), token).then(response => { + AppDispatcher.dispatch({ + type: this.type + 's/removed', + data: response[this.type], + original: object + }); + }).catch(error => { + AppDispatcher.dispatch({ + type: this.type + 's/remove-error', + error: error + }); }); - }); + } } - update(object, token = null) { + update(object, token = null, param = null) { var obj = {}; obj[this.type] = this.filterKeys(object); - RestAPI.put(this.makeURL(this.url + '/' + object.id), obj, token).then(response => { - AppDispatcher.dispatch({ - type: this.type + 's/edited', - data: response[this.type] + if(param === null) { + RestAPI.put(this.makeURL(this.url + '/' + object.id), obj, token).then(response => { + AppDispatcher.dispatch({ + type: this.type + 's/edited', + data: response[this.type] + }); + }).catch(error => { + AppDispatcher.dispatch({ + type: this.type + 's/edit-error', + error: error + }); }); - }).catch(error => { - AppDispatcher.dispatch({ - type: this.type + 's/edit-error', - error: error + } + else{ + RestAPI.put(this.makeURL(this.url + '/' + object.id + '?' + param), obj, token).then(response => { + AppDispatcher.dispatch({ + type: this.type + 's/edited', + data: response[this.type] + }); + }).catch(error => { + AppDispatcher.dispatch({ + type: this.type + 's/edit-error', + error: error + }); }); - }); - } + } + } + }; export default RestDataManager; diff --git a/src/user/edit-user.js b/src/user/edit-user.js index 3427452..d60015b 100644 --- a/src/user/edit-user.js +++ b/src/user/edit-user.js @@ -121,8 +121,8 @@ class EditUserDialog extends React.Component { this.handleChange(e)} /> - Old Password - this.handleChange(e)} /> + Admin Password + this.handleChange(e)} /> Password From d03d7bacdc450c99a60823cc6c61297aad4ef0d6 Mon Sep 17 00:00:00 2001 From: Sonja Happ Date: Thu, 7 Nov 2019 16:52:22 +0100 Subject: [PATCH 037/391] Make API calls in componentDidMount instead of componentWillMount, closes #84 --- src/common/home.js | 2 +- src/dashboard/dashboard.js | 2 +- src/project/projects.js | 2 +- src/scenario/scenario.js | 2 +- src/simulation/simulation.js | 2 +- src/simulationmodel/simulation-model.js | 2 +- src/simulator/simulators.js | 2 +- src/user/logout.js | 2 +- src/widget/widget.js | 2 +- 9 files changed, 9 insertions(+), 9 deletions(-) diff --git a/src/common/home.js b/src/common/home.js index 654ea6d..e103918 100644 --- a/src/common/home.js +++ b/src/common/home.js @@ -48,7 +48,7 @@ class Home extends React.Component { return '?'; } - componentWillMount() { + componentDidMount() { //RestAPI.get('/api/v1/counts').then(response => { // this.setState({ counts: response }); //}); diff --git a/src/dashboard/dashboard.js b/src/dashboard/dashboard.js index 80b5406..5412d7d 100644 --- a/src/dashboard/dashboard.js +++ b/src/dashboard/dashboard.js @@ -120,7 +120,7 @@ class Dashboard extends React.Component { } - componentWillMount() { + componentDidMount() { //document.addEventListener('keydown', this.handleKeydown.bind(this)); if (this.state.dashboard.has('id') === false) { diff --git a/src/project/projects.js b/src/project/projects.js index 4aba7cf..c5d11e8 100644 --- a/src/project/projects.js +++ b/src/project/projects.js @@ -54,7 +54,7 @@ class Projects extends React.Component { }; } - componentWillMount() { + componentDidMount() { AppDispatcher.dispatch({ type: 'projects/start-load', token: this.state.sessionToken diff --git a/src/scenario/scenario.js b/src/scenario/scenario.js index 681dfc5..a71dff9 100644 --- a/src/scenario/scenario.js +++ b/src/scenario/scenario.js @@ -80,7 +80,7 @@ class Scenario extends React.Component { } } - componentWillMount() { + componentDidMount() { AppDispatcher.dispatch({ type: 'scenarios/start-load', token: this.state.sessionToken diff --git a/src/simulation/simulation.js b/src/simulation/simulation.js index db49b0f..91c9252 100644 --- a/src/simulation/simulation.js +++ b/src/simulation/simulation.js @@ -80,7 +80,7 @@ class Simulation extends React.Component { } } - componentWillMount() { + componentDidMount() { AppDispatcher.dispatch({ type: 'simulations/start-load', token: this.state.sessionToken diff --git a/src/simulationmodel/simulation-model.js b/src/simulationmodel/simulation-model.js index e716191..54f6648 100644 --- a/src/simulationmodel/simulation-model.js +++ b/src/simulationmodel/simulation-model.js @@ -47,7 +47,7 @@ class SimulationModel extends React.Component { }; } - componentWillMount() { + componentDidMount() { AppDispatcher.dispatch({ type: 'simulationModels/start-load', data: this.props.match.params.simulationModel, diff --git a/src/simulator/simulators.js b/src/simulator/simulators.js index d0d8e4f..95bba26 100644 --- a/src/simulator/simulators.js +++ b/src/simulator/simulators.js @@ -88,7 +88,7 @@ class Simulators extends Component { }; } - componentWillMount() { + componentDidMount() { AppDispatcher.dispatch({ type: 'simulators/start-load', token: this.state.sessionToken, diff --git a/src/user/logout.js b/src/user/logout.js index 2e19b43..dd1eafc 100644 --- a/src/user/logout.js +++ b/src/user/logout.js @@ -25,7 +25,7 @@ import { Redirect } from 'react-router-dom'; import AppDispatcher from '../common/app-dispatcher'; class Logout extends React.Component { - componentWillMount() { + componentDidMount() { AppDispatcher.dispatch({ type: 'users/logout' }); diff --git a/src/widget/widget.js b/src/widget/widget.js index 4513cf7..5de1b93 100644 --- a/src/widget/widget.js +++ b/src/widget/widget.js @@ -77,7 +77,7 @@ class Widget extends React.Component { }; } - componentWillMount() { + componentDidMount() { if (this.state.sessionToken == null) { return; } From a7124c3a24890d1f4178b594c7d2d5ca580ef0a0 Mon Sep 17 00:00:00 2001 From: Laura Fuentes Grau Date: Sun, 10 Nov 2019 18:59:24 +0100 Subject: [PATCH 038/391] wip #210 frontend can now send url with query parameters to backend --- src/common/array-store.js | 17 ++++-- src/common/data-managers/rest-data-manager.js | 58 +++++++++++++++++-- 2 files changed, 64 insertions(+), 11 deletions(-) diff --git a/src/common/array-store.js b/src/common/array-store.js index 1d76845..bb00c3c 100644 --- a/src/common/array-store.js +++ b/src/common/array-store.js @@ -71,10 +71,10 @@ class ArrayStore extends ReduceStore { if (Array.isArray(action.data)) { action.data.forEach((id) => { - this.dataManager.load(id, action.token); + this.dataManager.load(id, action.token,action.param); }); } else { - this.dataManager.load(action.data, action.token); + this.dataManager.load(action.data, action.token,action.param); } return state; @@ -99,7 +99,7 @@ class ArrayStore extends ReduceStore { return super.reduce(state, action); case this.type + '/start-add': - this.dataManager.add(action.data, action.token); + this.dataManager.add(action.data, action.token,action.param); return state; case this.type + '/added': @@ -111,7 +111,7 @@ class ArrayStore extends ReduceStore { case this.type + '/start-remove': - this.dataManager.remove(action.data, action.token); + this.dataManager.remove(action.data, action.token,action.param); return state; case this.type + '/removed': @@ -133,11 +133,11 @@ class ArrayStore extends ReduceStore { return super.reduce(state, action); case this.type + '/start-edit': - this.dataManager.update(action.data, action.token); + this.dataManager.update(action.data, action.token,action.param); return state; case this.type + '/start-own-edit': - this.dataManager.update(action.data, action.token); + this.dataManager.update(action.data, action.token,action.param); return state; case this.type + '/edited': @@ -155,6 +155,11 @@ class ArrayStore extends ReduceStore { case this.type + '/edit-error': return state; + case 'exdashboard/querytest' : + console.log("querytest wurde aufgerufen"); + this.dataManager.update(action.data, action.token,action.param); + return state; + default: return state; } diff --git a/src/common/data-managers/rest-data-manager.js b/src/common/data-managers/rest-data-manager.js index 65b904d..33f2de6 100644 --- a/src/common/data-managers/rest-data-manager.js +++ b/src/common/data-managers/rest-data-manager.js @@ -53,9 +53,53 @@ class RestDataManager { } load(id, token = null,param = null) { + if (param === null) { + if (id != null) { + // load single object + RestAPI.get(this.makeURL(this.url + '/' + id), token).then(response => { + const data = this.filterKeys(response[this.type]); + + AppDispatcher.dispatch({ + type: this.type + 's/loaded', + data: data + }); + + if (this.onLoad != null) { + this.onLoad(data); + } + }).catch(error => { + AppDispatcher.dispatch({ + type: this.type + 's/load-error', + error: error + }); + }); + } else { + // load all objects + RestAPI.get(this.makeURL(this.url), token).then(response => { + const data = response[this.type + 's'].map(element => { + return this.filterKeys(element); + }); + + AppDispatcher.dispatch({ + type: this.type + 's/loaded', + data: data + }); + + if (this.onLoad != null) { + this.onLoad(data); + } + }).catch(error => { + AppDispatcher.dispatch({ + type: this.type + 's/load-error', + error: error + }); + }); + } + } + else{ if (id != null) { // load single object - RestAPI.get(this.makeURL(this.url + '/' + id), token).then(response => { + RestAPI.get(this.makeURL(this.url + '/' + id + '/' + param), token).then(response => { const data = this.filterKeys(response[this.type]); AppDispatcher.dispatch({ @@ -74,7 +118,7 @@ class RestDataManager { }); } else { // load all objects - RestAPI.get(this.makeURL(this.url), token).then(response => { + RestAPI.get(this.makeURL(this.url) + '/' + param, token).then(response => { const data = response[this.type + 's'].map(element => { return this.filterKeys(element); }); @@ -94,6 +138,8 @@ class RestDataManager { }); }); } + + } } add(object, token = null, param = null) { @@ -115,7 +161,7 @@ class RestDataManager { } else{ console.log("else was called in add"); - RestAPI.post(this.makeURL(this.url) + "?" + param, obj, token).then(response => { + RestAPI.post(this.makeURL(this.url) + "/" + param, obj, token).then(response => { AppDispatcher.dispatch({ type: this.type + 's/added', data: response[this.type] @@ -145,7 +191,7 @@ class RestDataManager { }); } else{ - RestAPI.delete(this.makeURL(this.url + '/' + object.id + '?' + param), token).then(response => { + RestAPI.delete(this.makeURL(this.url + '/' + object.id + '/' + param), token).then(response => { AppDispatcher.dispatch({ type: this.type + 's/removed', data: response[this.type], @@ -163,6 +209,7 @@ class RestDataManager { update(object, token = null, param = null) { var obj = {}; obj[this.type] = this.filterKeys(object); + console.log("wir haben den rdm erreicht!"); if(param === null) { RestAPI.put(this.makeURL(this.url + '/' + object.id), obj, token).then(response => { @@ -178,7 +225,8 @@ class RestDataManager { }); } else{ - RestAPI.put(this.makeURL(this.url + '/' + object.id + '?' + param), obj, token).then(response => { + console.log("here we have: " + this.url); + RestAPI.put(this.makeURL(this.url + '/' + object.id + '/' + param), obj, token).then(response => { AppDispatcher.dispatch({ type: this.type + 's/edited', data: response[this.type] From c497d37f1efe163d4439b1943c31ed96907fe68f Mon Sep 17 00:00:00 2001 From: Steffen Vogel Date: Mon, 11 Nov 2019 18:32:24 +0100 Subject: [PATCH 039/391] ci: build production docker images for kubernetes deployment --- .gitlab-ci.yml | 48 ++++++++++++++------------------- Dockerfile | 19 ++++++++++++- packaging/docker/Dockerfile | 21 --------------- packaging/docker/Dockerfile.dev | 4 --- 4 files changed, 38 insertions(+), 54 deletions(-) mode change 120000 => 100644 Dockerfile delete mode 100644 packaging/docker/Dockerfile delete mode 100644 packaging/docker/Dockerfile.dev diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index ed24cbe..2e11611 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1,7 +1,7 @@ variables: GIT_SUBMODULE_STRATEGY: normal - DOCKER_TAG: ${CI_COMMIT_REF_NAME} - DOCKER_IMAGE_DEV: villas/web-dev:${CI_COMMIT_REF_NAME} + DOCKER_IMAGE_DEV: node:12.2 + DOCKER_IMAGE: ${CI_REGISTRY}/acs/public/villas/web cache: untracked: true @@ -13,20 +13,12 @@ cache: - .yarn stages: - - prepare - build - test -# - deploy - -prepare: - stage: prepare - script: - - docker build -t ${DOCKER_IMAGE_DEV} -f packaging/docker/Dockerfile.dev . - tags: - - linux - - shell + - deploy -build_job: + +build: stage: build before_script: - mkdir -p build @@ -41,26 +33,26 @@ build_job: tags: - docker -test_job: +test: stage: test script: - npm test image: ${DOCKER_IMAGE_DEV} dependencies: - - build_job + - build tags: - docker -#deploy:docker: -# stage: deploy -# script: -# - docker build -t ${DOCKER_IMAGE} -f packaging/docker/Dockerfile . -# - docker tag villas/web:${DOCKER_TAG} villas/web:latest -# - docker push villas/web:${DOCKER_TAG} -# - docker push villas/web:latest -# tags: -# - shell -# - linux -# only: -# refs: -# - master +deploy:docker: + stage: deploy + before_script: + - docker login -u ${CI_REGISTRY_USER} -p ${CI_REGISTRY_PASSWORD} ${CI_REGISTRY} + script: + - docker build -t ${DOCKER_IMAGE} . + - docker push ${DOCKER_IMAGE} + tags: + - shell + - linux + only: + refs: + - master diff --git a/Dockerfile b/Dockerfile deleted file mode 120000 index 30004e8..0000000 --- a/Dockerfile +++ /dev/null @@ -1 +0,0 @@ -packaging/docker/Dockerfile \ No newline at end of file diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..92283ec --- /dev/null +++ b/Dockerfile @@ -0,0 +1,18 @@ +FROM node:12.2 AS builder + +# Create app directory +RUN mkdir -p /usr/src/app +WORKDIR /usr/src/app + +# use changes to package.json to force Docker not to use the cache +# when we change our application's nodejs dependencies: +ADD package.json /usr/src/app +RUN npm install + +# Install app dependencies +COPY . /usr/src/app +RUN npm run build + +FROM nginx + +COPY --from=builder /usr/src/app/build /usr/share/nginx/html diff --git a/packaging/docker/Dockerfile b/packaging/docker/Dockerfile deleted file mode 100644 index 28b1443..0000000 --- a/packaging/docker/Dockerfile +++ /dev/null @@ -1,21 +0,0 @@ -FROM node:12.2 AS builder - -RUN apt-get install -y \ - git - -# Create app directory -RUN mkdir -p /usr/src/app -WORKDIR /usr/src/app - -# use changes to package.json to force Docker not to use the cache -# when we change our application's nodejs dependencies: -ADD package.json /usr/src/app -RUN npm install - -# Install app dependencies -COPY . /usr/src/app -RUN npm run build - -FROM nginx - -COPY --from=builder /usr/src/app/build /usr/share/nginx/html diff --git a/packaging/docker/Dockerfile.dev b/packaging/docker/Dockerfile.dev deleted file mode 100644 index 7e10c33..0000000 --- a/packaging/docker/Dockerfile.dev +++ /dev/null @@ -1,4 +0,0 @@ -FROM node:12.2 - -RUN apt-get install -y \ - git From 31ef67356d12e3c649ccf4439eb7aafd32b5424a Mon Sep 17 00:00:00 2001 From: Sonja Happ Date: Tue, 12 Nov 2019 09:49:18 +0100 Subject: [PATCH 040/391] Fix for flux container converter #211 --- src/app.js | 5 +++-- src/common/FluxContainerConverter.js | 2 +- src/dashboard/dashboard.js | 5 +++-- src/file/select-file.js | 5 +++-- src/scenario/scenario.js | 5 +++-- src/scenario/scenarios.js | 5 +++-- src/simulationmodel/simulation-model.js | 5 +++-- src/simulator/select-simulator.js | 5 +++-- src/simulator/simulators.js | 5 +++-- src/user/login.js | 5 +++-- src/user/user.js | 16 +++++++--------- src/user/users.js | 7 ++++--- src/widget/widget.js | 5 +++-- 13 files changed, 42 insertions(+), 33 deletions(-) diff --git a/src/app.js b/src/app.js index 92bb42c..23ef420 100644 --- a/src/app.js +++ b/src/app.js @@ -52,6 +52,8 @@ import SimulationModel from './simulationmodel/simulation-model'; import Users from './user/users'; import User from './user/user'; +import FluxContainerConverter from "./common/FluxContainerConverter"; + import './styles/app.css'; class App extends React.Component { @@ -169,6 +171,5 @@ class App extends React.Component { // // -let fluxContainerConverter = require('./common/FluxContainerConverter'); -export default Container.create(fluxContainerConverter.convert(App)); +export default Container.create(FluxContainerConverter.convert(App)); //DragDropContext(HTML5Backend)(Container.create(App)); diff --git a/src/common/FluxContainerConverter.js b/src/common/FluxContainerConverter.js index bd2196a..efa2ece 100644 --- a/src/common/FluxContainerConverter.js +++ b/src/common/FluxContainerConverter.js @@ -1,7 +1,7 @@ /// FluxContainerConverter.js /// This is an ugly workaround found here https://github.com/facebook/flux/issues/351 to make Flux Containers work with ES6 -module.exports = { +export default { convert: function(containerClass) { const tmp = containerClass; containerClass = function(...args) { diff --git a/src/dashboard/dashboard.js b/src/dashboard/dashboard.js index 5412d7d..75683b4 100644 --- a/src/dashboard/dashboard.js +++ b/src/dashboard/dashboard.js @@ -42,6 +42,8 @@ import SimulationModelStore from '../simulationmodel/simulation-model-store'; import FileStore from '../file/file-store'; import AppDispatcher from '../common/app-dispatcher'; +import FluxContainerConverter from "../common/FluxContainerConverter"; + import 'react-contexify/dist/ReactContexify.min.css'; class Dashboard extends React.Component { @@ -419,5 +421,4 @@ class Dashboard extends React.Component { } } -let fluxContainerConverter = require('../common/FluxContainerConverter'); -export default Fullscreenable()(Container.create(fluxContainerConverter.convert(Dashboard), { withProps: true })); +export default Fullscreenable()(Container.create(FluxContainerConverter.convert(Dashboard), { withProps: true })); diff --git a/src/file/select-file.js b/src/file/select-file.js index fafe98f..9d6122f 100644 --- a/src/file/select-file.js +++ b/src/file/select-file.js @@ -28,6 +28,8 @@ import UserStore from '../user/user-store'; import AppDispatcher from '../common/app-dispatcher'; +import FluxContainerConverter from "../common/FluxContainerConverter"; + class SelectFile extends React.Component { static getStores() { return [ FileStore, UserStore ]; @@ -148,5 +150,4 @@ class SelectFile extends React.Component { } } -let fluxContainerConverter = require('../common/FluxContainerConverter'); -export default Container.create(fluxContainerConverter.convert(SelectFile)); +export default Container.create(FluxContainerConverter.convert(SelectFile)); diff --git a/src/scenario/scenario.js b/src/scenario/scenario.js index a71dff9..ca3eb3d 100644 --- a/src/scenario/scenario.js +++ b/src/scenario/scenario.js @@ -39,6 +39,8 @@ import ImportSimulationModelDialog from '../simulationmodel/import-simulation-mo import SimulatorAction from '../simulator/simulator-action'; import DeleteDialog from '../common/dialogs/delete-dialog'; +import FluxContainerConverter from "../common/FluxContainerConverter"; + class Scenario extends React.Component { static getStores() { return [ ScenarioStore, SimulatorStore, SimulationModelStore, UserStore ]; @@ -293,5 +295,4 @@ class Scenario extends React.Component { } } -let fluxContainerConverter = require('../common/FluxContainerConverter'); -export default Container.create(fluxContainerConverter.convert(Scenario), { withProps: true }); +export default Container.create(FluxContainerConverter.convert(Scenario), { withProps: true }); diff --git a/src/scenario/scenarios.js b/src/scenario/scenarios.js index 5789e31..5cdc7eb 100644 --- a/src/scenario/scenarios.js +++ b/src/scenario/scenarios.js @@ -37,6 +37,8 @@ import ImportScenarioDialog from './import-scenario'; import DeleteDialog from '../common/dialogs/delete-dialog'; +import FluxContainerConverter from "../common/FluxContainerConverter"; + class Scenarios extends Component { static getStores() { return [ ScenarioStore, UserStore ]; @@ -208,5 +210,4 @@ class Scenarios extends Component { } } -let fluxContainerConverter = require('../common/FluxContainerConverter'); -export default Container.create(fluxContainerConverter.convert(Scenarios)); +export default Container.create(FluxContainerConverter.convert(Scenarios)); diff --git a/src/simulationmodel/simulation-model.js b/src/simulationmodel/simulation-model.js index 54f6648..12ed881 100644 --- a/src/simulationmodel/simulation-model.js +++ b/src/simulationmodel/simulation-model.js @@ -33,6 +33,8 @@ import SignalMapping from './signal-mapping'; import EditableHeader from '../common/editable-header'; import ParametersEditor from '../common/parameters-editor'; +import FluxContainerConverter from "../common/FluxContainerConverter"; + class SimulationModel extends React.Component { static getStores() { return [ SimulationModelStore, UserStore ]; @@ -168,5 +170,4 @@ class SimulationModel extends React.Component { } } -let fluxContainerConverter = require('../common/FluxContainerConverter'); -export default Container.create(fluxContainerConverter.convert(SimulationModel), { withProps: true }); +export default Container.create(FluxContainerConverter.convert(SimulationModel), { withProps: true }); diff --git a/src/simulator/select-simulator.js b/src/simulator/select-simulator.js index 2061adf..b9c69c8 100644 --- a/src/simulator/select-simulator.js +++ b/src/simulator/select-simulator.js @@ -26,6 +26,8 @@ import _ from 'lodash'; import SimulatorStore from './simulator-store'; +import FluxContainerConverter from "../common/FluxContainerConverter"; + class SelectSimulator extends React.Component { static getStores() { return [ SimulatorStore ]; @@ -85,5 +87,4 @@ class SelectSimulator extends React.Component { } } -let fluxContainerConverter = require('../common/FluxContainerConverter'); -export default Container.create(fluxContainerConverter.convert(SelectSimulator)); +export default Container.create(FluxContainerConverter.convert(SelectSimulator)); diff --git a/src/simulator/simulators.js b/src/simulator/simulators.js index 95bba26..b1138ac 100644 --- a/src/simulator/simulators.js +++ b/src/simulator/simulators.js @@ -39,6 +39,8 @@ import ImportSimulatorDialog from './import-simulator'; import SimulatorAction from './simulator-action'; import DeleteDialog from '../common/dialogs/delete-dialog'; +import FluxContainerConverter from "../common/FluxContainerConverter"; + class Simulators extends Component { static getStores() { return [ UserStore, SimulatorStore ]; @@ -330,5 +332,4 @@ class Simulators extends Component { } } -let fluxContainerConverter = require('../common/FluxContainerConverter'); -export default Container.create(fluxContainerConverter.convert(Simulators)); +export default Container.create(FluxContainerConverter.convert(Simulators)); diff --git a/src/user/login.js b/src/user/login.js index 3f1e3b6..2cef20c 100644 --- a/src/user/login.js +++ b/src/user/login.js @@ -33,6 +33,8 @@ import NotificationsDataManager from '../common/data-managers/notifications-data import AppDispatcher from '../common/app-dispatcher'; import UserStore from './user-store'; +import FluxContainerConverter from "../common/FluxContainerConverter"; + class Login extends Component { static getStores() { return [ UserStore ]; @@ -97,5 +99,4 @@ class Login extends Component { } } -let fluxContainerConverter = require('../common/FluxContainerConverter'); -export default Container.create(fluxContainerConverter.convert(Login)); +export default Container.create(FluxContainerConverter.convert(Login)); diff --git a/src/user/user.js b/src/user/user.js index 74ac1a8..692f8e4 100644 --- a/src/user/user.js +++ b/src/user/user.js @@ -31,6 +31,8 @@ import UsersStore from './users-store'; import Icon from '../common/icon'; import EditOwnUserDialog from './edit-own-user' +import FluxContainerConverter from "../common/FluxContainerConverter"; + class User extends Component { static getStores() { @@ -42,7 +44,7 @@ class User extends Component { let sessionToken = UserStore.getState().token; let user = UserStore.getState().currentUser; - + if(user === null) { AppDispatcher.dispatch({ @@ -75,7 +77,7 @@ class User extends Component { if (data) { if(data.password === data.confirmpassword){ - + AppDispatcher.dispatch({ type: 'users/start-own-edit', data: data, @@ -91,7 +93,7 @@ class User extends Component { }); } } - + } @@ -125,7 +127,7 @@ class User extends Component { {this.state.user.role} - + this.closeEditModal(data)} user={this.state.modalData} /> @@ -137,8 +139,4 @@ class User extends Component { } } - - - -let fluxContainerConverter = require('../common/FluxContainerConverter'); -export default Container.create(fluxContainerConverter.convert(User)); +export default Container.create(FluxContainerConverter.convert(User)); diff --git a/src/user/users.js b/src/user/users.js index 1b788a0..ee8178d 100644 --- a/src/user/users.js +++ b/src/user/users.js @@ -35,6 +35,8 @@ import EditUserDialog from './edit-user'; import DeleteDialog from '../common/dialogs/delete-dialog'; +import FluxContainerConverter from "../common/FluxContainerConverter"; + class Users extends Component { static getStores() { return [ UserStore, UsersStore ]; @@ -94,7 +96,7 @@ class Users extends Component { if (data) { if(data.password === data.confirmpassword){ - + AppDispatcher.dispatch({ type: 'users/start-edit', data: data, @@ -152,5 +154,4 @@ class Users extends Component { } } -let fluxContainerConverter = require('../common/FluxContainerConverter'); -export default Container.create(fluxContainerConverter.convert(Users)); +export default Container.create(FluxContainerConverter.convert(Users)); diff --git a/src/widget/widget.js b/src/widget/widget.js index 5de1b93..bf6e921 100644 --- a/src/widget/widget.js +++ b/src/widget/widget.js @@ -48,6 +48,8 @@ import WidgetBox from './widgets/box'; import WidgetHTML from './widgets/html'; import WidgetTopology from './widgets/topology'; +import FluxContainerConverter from "../common/FluxContainerConverter"; + import '../styles/widgets.css'; class Widget extends React.Component { @@ -177,5 +179,4 @@ class Widget extends React.Component { } } -let fluxContainerConverter = require('../common/FluxContainerConverter'); -export default Container.create(fluxContainerConverter.convert(Widget), { withProps: true }); +export default Container.create(FluxContainerConverter.convert(Widget), { withProps: true }); From 33fb59e080ae751b96d17126eb1ff193a98b58f4 Mon Sep 17 00:00:00 2001 From: Sonja Happ Date: Tue, 12 Nov 2019 11:43:56 +0100 Subject: [PATCH 041/391] CI: temporarily add develop branch to execute deploy stage --- .gitlab-ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 2e11611..c234d5b 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -17,7 +17,6 @@ stages: - test - deploy - build: stage: build before_script: @@ -56,3 +55,4 @@ deploy:docker: only: refs: - master + - develop From 700c64fc1fde42c722bbad4cb0a375ffd51c53a3 Mon Sep 17 00:00:00 2001 From: Laura Fuentes Grau Date: Tue, 12 Nov 2019 15:17:40 +0100 Subject: [PATCH 042/391] wip #210 fixed query parameters, added an example dashboard file for testing --- src/app.js | 2 + src/common/array-store.js | 5 - src/common/data-managers/rest-data-manager.js | 157 +++++++----------- src/common/menu-sidebar.js | 1 + src/dashboard/exdashboard.js | 66 ++++++++ 5 files changed, 125 insertions(+), 106 deletions(-) create mode 100644 src/dashboard/exdashboard.js diff --git a/src/app.js b/src/app.js index 92bb42c..a13b632 100644 --- a/src/app.js +++ b/src/app.js @@ -51,6 +51,7 @@ import Scenario from './scenario/scenario'; import SimulationModel from './simulationmodel/simulation-model'; import Users from './user/users'; import User from './user/user'; +import ExDashboard from './dashboard/exdashboard'; import './styles/app.css'; @@ -152,6 +153,7 @@ class App extends React.Component { +
    diff --git a/src/common/array-store.js b/src/common/array-store.js index bb00c3c..710ff94 100644 --- a/src/common/array-store.js +++ b/src/common/array-store.js @@ -155,11 +155,6 @@ class ArrayStore extends ReduceStore { case this.type + '/edit-error': return state; - case 'exdashboard/querytest' : - console.log("querytest wurde aufgerufen"); - this.dataManager.update(action.data, action.token,action.param); - return state; - default: return state; } diff --git a/src/common/data-managers/rest-data-manager.js b/src/common/data-managers/rest-data-manager.js index 33f2de6..e2418ac 100644 --- a/src/common/data-managers/rest-data-manager.js +++ b/src/common/data-managers/rest-data-manager.js @@ -52,11 +52,57 @@ class RestDataManager { return object; } + sendRequest(form, id, token, param, object = null, obj = null) { + switch (form) { + case 'load': + if (param === null) { + if (id != null) { + // load single object + return RestAPI.get(this.makeURL(this.url + '/' + id), token); + } else { + // load all objects + return RestAPI.get(this.makeURL(this.url), token); + } + } + else { + if (id != null) { + // load single object + return RestAPI.get(this.makeURL(this.url + '/' + id + '?' + param), token) + } else { + // load all objects + return RestAPI.get(this.makeURL(this.url) + '?' + param, token) + } + } + case 'add': + if (param === null) { + return RestAPI.post(this.makeURL(this.url), obj, token); + } else { + return RestAPI.post(this.makeURL(this.url) + "?" + param, obj, token); + } + case 'remove': + if (param === null) { + return RestAPI.delete(this.makeURL(this.url + '/' + object.id), token) + } + else { + return RestAPI.delete(this.makeURL(this.url + '/' + object.id + '?' + param)) + } + case 'update': + if (param === null) { + return RestAPI.put(this.makeURL(this.url + '/' + object.id), obj, token); + } + else { + return RestAPI.put(this.makeURL(this.url + '/' + object.id + '?' + param), obj, token); + } + default: + console.log("something went wrong"); + break; + } + } + load(id, token = null,param = null) { - if (param === null) { if (id != null) { // load single object - RestAPI.get(this.makeURL(this.url + '/' + id), token).then(response => { + this.sendRequest('load',id,token,param).then(response => { const data = this.filterKeys(response[this.type]); AppDispatcher.dispatch({ @@ -75,7 +121,7 @@ class RestDataManager { }); } else { // load all objects - RestAPI.get(this.makeURL(this.url), token).then(response => { + this.sendRequest('load',id,token,param).then(response => { const data = response[this.type + 's'].map(element => { return this.filterKeys(element); }); @@ -96,58 +142,13 @@ class RestDataManager { }); } } - else{ - if (id != null) { - // load single object - RestAPI.get(this.makeURL(this.url + '/' + id + '/' + param), token).then(response => { - const data = this.filterKeys(response[this.type]); - - AppDispatcher.dispatch({ - type: this.type + 's/loaded', - data: data - }); - - if (this.onLoad != null) { - this.onLoad(data); - } - }).catch(error => { - AppDispatcher.dispatch({ - type: this.type + 's/load-error', - error: error - }); - }); - } else { - // load all objects - RestAPI.get(this.makeURL(this.url) + '/' + param, token).then(response => { - const data = response[this.type + 's'].map(element => { - return this.filterKeys(element); - }); - - AppDispatcher.dispatch({ - type: this.type + 's/loaded', - data: data - }); - - if (this.onLoad != null) { - this.onLoad(data); - } - }).catch(error => { - AppDispatcher.dispatch({ - type: this.type + 's/load-error', - error: error - }); - }); - } - - } - } + add(object, token = null, param = null) { var obj = {}; obj[this.type] = this.filterKeys(object); - if (param === null) { - RestAPI.post(this.makeURL(this.url), obj, token).then(response => { + this.sendRequest('add',null,token,param,null,obj).then(response => { AppDispatcher.dispatch({ type: this.type + 's/added', data: response[this.type] @@ -158,26 +159,10 @@ class RestDataManager { error: error }); }); - } - else{ - console.log("else was called in add"); - RestAPI.post(this.makeURL(this.url) + "/" + param, obj, token).then(response => { - AppDispatcher.dispatch({ - type: this.type + 's/added', - data: response[this.type] - }); - }).catch(error => { - AppDispatcher.dispatch({ - type: this.type + 's/add-error', - error: error - }); - }); - } } remove(object, token = null, param = null) { - if (param === null) { - RestAPI.delete(this.makeURL(this.url + '/' + object.id), token).then(response => { + this.sendRequest('remove',null,token,param,object).then(response => { AppDispatcher.dispatch({ type: this.type + 's/removed', data: response[this.type], @@ -190,29 +175,12 @@ class RestDataManager { }); }); } - else{ - RestAPI.delete(this.makeURL(this.url + '/' + object.id + '/' + param), token).then(response => { - AppDispatcher.dispatch({ - type: this.type + 's/removed', - data: response[this.type], - original: object - }); - }).catch(error => { - AppDispatcher.dispatch({ - type: this.type + 's/remove-error', - error: error - }); - }); - } - } - + update(object, token = null, param = null) { var obj = {}; obj[this.type] = this.filterKeys(object); - console.log("wir haben den rdm erreicht!"); - if(param === null) { - RestAPI.put(this.makeURL(this.url + '/' + object.id), obj, token).then(response => { + this.sendRequest('update',null,token,param,object,obj).then(response => { AppDispatcher.dispatch({ type: this.type + 's/edited', data: response[this.type] @@ -224,21 +192,8 @@ class RestDataManager { }); }); } - else{ - console.log("here we have: " + this.url); - RestAPI.put(this.makeURL(this.url + '/' + object.id + '/' + param), obj, token).then(response => { - AppDispatcher.dispatch({ - type: this.type + 's/edited', - data: response[this.type] - }); - }).catch(error => { - AppDispatcher.dispatch({ - type: this.type + 's/edit-error', - error: error - }); - }); - } - } + + }; diff --git a/src/common/menu-sidebar.js b/src/common/menu-sidebar.js index 5f43425..be42a68 100644 --- a/src/common/menu-sidebar.js +++ b/src/common/menu-sidebar.js @@ -35,6 +35,7 @@ class SidebarMenu extends React.Component {
  • Home
  • Scenarios
  • Simulators
  • +
  • Example Dashboard
  • { this.props.currentRole === 'Admin' ?
  • User Management
  • : '' } diff --git a/src/dashboard/exdashboard.js b/src/dashboard/exdashboard.js new file mode 100644 index 0000000..54ab039 --- /dev/null +++ b/src/dashboard/exdashboard.js @@ -0,0 +1,66 @@ +import React, { Component } from 'react'; +import { Container } from 'flux/utils'; +import DashboardStore from './dashboard-store'; +import AppDispatcher from '../common/app-dispatcher'; +import Table from '../common/table'; +import TableColumn from '../common/table-column'; +import UserStore from '../user/user-store' + + + + + + + +class ExDashboard extends Component { + static getStores() { + return [ DashboardStore ]; + } + + static calculateState(prevState, props) { + prevState = prevState || {}; + + console.log("calculateState has been called"); + const dashboards = DashboardStore.getState(); + let tokenState = UserStore.getState().token; + console.log(dashboards); + + return{ + dashboards, + tokenState + } + + } + + componentDidMount() { + AppDispatcher.dispatch({ + type: 'dashboards/start-load', + token: this.state.tokenState, + param: 'scenarioID=1' + }); + } + + + + + render() { + + return ( +
    +

    Dashboards

    + + + + + +
    +
    + ); + } +} + + + + +let fluxContainerConverter = require('../common/FluxContainerConverter'); +export default Container.create(fluxContainerConverter.convert(ExDashboard)); From 36b97bc058c2a2eea722058649f22fde174db090 Mon Sep 17 00:00:00 2001 From: Laura Fuentes Grau Date: Mon, 18 Nov 2019 14:51:41 +0100 Subject: [PATCH 043/391] wip #210 added requestURL function to RestDataManager --- src/common/data-managers/rest-data-manager.js | 71 ++++++++----------- 1 file changed, 28 insertions(+), 43 deletions(-) diff --git a/src/common/data-managers/rest-data-manager.js b/src/common/data-managers/rest-data-manager.js index e2418ac..7fc3c98 100644 --- a/src/common/data-managers/rest-data-manager.js +++ b/src/common/data-managers/rest-data-manager.js @@ -52,57 +52,42 @@ class RestDataManager { return object; } - sendRequest(form, id, token, param, object = null, obj = null) { - switch (form) { - case 'load': - if (param === null) { - if (id != null) { - // load single object - return RestAPI.get(this.makeURL(this.url + '/' + id), token); - } else { - // load all objects - return RestAPI.get(this.makeURL(this.url), token); + requestURL(form, id, param, object = null){ + switch(form){ + case 'load/add': + if (param === null){ + if(id != null){ + return this.url + '/' + id; + } + else { + return this.makeURL(this.url); } } - else { - if (id != null) { - // load single object - return RestAPI.get(this.makeURL(this.url + '/' + id + '?' + param), token) - } else { - // load all objects - return RestAPI.get(this.makeURL(this.url) + '?' + param, token) + else{ + if(id != null){ + return this.url + '/' + id + '?' + param; + } + else { + return this.makeURL(this.url) + '?' + param } - } - case 'add': - if (param === null) { - return RestAPI.post(this.makeURL(this.url), obj, token); - } else { - return RestAPI.post(this.makeURL(this.url) + "?" + param, obj, token); } - case 'remove': - if (param === null) { - return RestAPI.delete(this.makeURL(this.url + '/' + object.id), token) + case 'remove/update': + if(param === null){ + return this.makeURL(this.url + '/' + object.id); } - else { - return RestAPI.delete(this.makeURL(this.url + '/' + object.id + '?' + param)) + else{ + return this.makeURL(this.url + '/' + object.id + '?' + param); } - case 'update': - if (param === null) { - return RestAPI.put(this.makeURL(this.url + '/' + object.id), obj, token); - } - else { - return RestAPI.put(this.makeURL(this.url + '/' + object.id + '?' + param), obj, token); - } - default: - console.log("something went wrong"); - break; + default: + console.log("something went wrong"); + break; } } load(id, token = null,param = null) { if (id != null) { // load single object - this.sendRequest('load',id,token,param).then(response => { + RestAPI.get(this.requestURL('load/add',id,param), token).then(response => { const data = this.filterKeys(response[this.type]); AppDispatcher.dispatch({ @@ -121,7 +106,7 @@ class RestDataManager { }); } else { // load all objects - this.sendRequest('load',id,token,param).then(response => { + RestAPI.get(this.requestURL('load/add',id,param), token).then(response => { const data = response[this.type + 's'].map(element => { return this.filterKeys(element); }); @@ -148,7 +133,7 @@ class RestDataManager { var obj = {}; obj[this.type] = this.filterKeys(object); - this.sendRequest('add',null,token,param,null,obj).then(response => { + RestAPI.post(this.requestURL('load/add',null,param), obj, token).then(response => { AppDispatcher.dispatch({ type: this.type + 's/added', data: response[this.type] @@ -162,7 +147,7 @@ class RestDataManager { } remove(object, token = null, param = null) { - this.sendRequest('remove',null,token,param,object).then(response => { + RestAPI.delete(this.requestURL('remove/update',null,param,object), token).then(response => { AppDispatcher.dispatch({ type: this.type + 's/removed', data: response[this.type], @@ -180,7 +165,7 @@ class RestDataManager { var obj = {}; obj[this.type] = this.filterKeys(object); - this.sendRequest('update',null,token,param,object,obj).then(response => { + RestAPI.put(this.requestURL('remove/update',null,param,object), obj, token).then(response => { AppDispatcher.dispatch({ type: this.type + 's/edited', data: response[this.type] From f379137ff2f66413f328164cfe8246ffb6050684 Mon Sep 17 00:00:00 2001 From: Laura Fuentes Grau Date: Tue, 19 Nov 2019 09:53:47 +0100 Subject: [PATCH 044/391] final state #210 query parameters added to RestDataManager --- src/app.js | 3 +- src/common/api/rest-api.js | 1 - src/common/menu-sidebar.js | 1 - src/dashboard/exdashboard.js | 66 ------------------------------------ src/user/user.js | 1 - 5 files changed, 1 insertion(+), 71 deletions(-) delete mode 100644 src/dashboard/exdashboard.js diff --git a/src/app.js b/src/app.js index a13b632..d4da58f 100644 --- a/src/app.js +++ b/src/app.js @@ -51,7 +51,7 @@ import Scenario from './scenario/scenario'; import SimulationModel from './simulationmodel/simulation-model'; import Users from './user/users'; import User from './user/user'; -import ExDashboard from './dashboard/exdashboard'; + import './styles/app.css'; @@ -153,7 +153,6 @@ class App extends React.Component { -
    diff --git a/src/common/api/rest-api.js b/src/common/api/rest-api.js index d515079..4fb5395 100644 --- a/src/common/api/rest-api.js +++ b/src/common/api/rest-api.js @@ -73,7 +73,6 @@ class RestAPI { } post(url, body, token) { - console.log(url); return new Promise(function (resolve, reject) { var req = request.post(url).send(body).timeout({ response: 5000 }); // Simple response start timeout (3s) diff --git a/src/common/menu-sidebar.js b/src/common/menu-sidebar.js index be42a68..5f43425 100644 --- a/src/common/menu-sidebar.js +++ b/src/common/menu-sidebar.js @@ -35,7 +35,6 @@ class SidebarMenu extends React.Component {
  • Home
  • Scenarios
  • Simulators
  • -
  • Example Dashboard
  • { this.props.currentRole === 'Admin' ?
  • User Management
  • : '' } diff --git a/src/dashboard/exdashboard.js b/src/dashboard/exdashboard.js deleted file mode 100644 index 54ab039..0000000 --- a/src/dashboard/exdashboard.js +++ /dev/null @@ -1,66 +0,0 @@ -import React, { Component } from 'react'; -import { Container } from 'flux/utils'; -import DashboardStore from './dashboard-store'; -import AppDispatcher from '../common/app-dispatcher'; -import Table from '../common/table'; -import TableColumn from '../common/table-column'; -import UserStore from '../user/user-store' - - - - - - - -class ExDashboard extends Component { - static getStores() { - return [ DashboardStore ]; - } - - static calculateState(prevState, props) { - prevState = prevState || {}; - - console.log("calculateState has been called"); - const dashboards = DashboardStore.getState(); - let tokenState = UserStore.getState().token; - console.log(dashboards); - - return{ - dashboards, - tokenState - } - - } - - componentDidMount() { - AppDispatcher.dispatch({ - type: 'dashboards/start-load', - token: this.state.tokenState, - param: 'scenarioID=1' - }); - } - - - - - render() { - - return ( -
    -

    Dashboards

    - - - - - -
    -
    - ); - } -} - - - - -let fluxContainerConverter = require('../common/FluxContainerConverter'); -export default Container.create(fluxContainerConverter.convert(ExDashboard)); diff --git a/src/user/user.js b/src/user/user.js index 74ac1a8..e35a148 100644 --- a/src/user/user.js +++ b/src/user/user.js @@ -71,7 +71,6 @@ class User extends Component { closeEditModal(data) { this.setState({ editModal: false }); - console.log(data); if (data) { if(data.password === data.confirmpassword){ From cfb6cae688c9dbabb9500f0648c17af058f764e5 Mon Sep 17 00:00:00 2001 From: Sonja Happ Date: Tue, 19 Nov 2019 11:24:03 +0100 Subject: [PATCH 045/391] fix a bug in RequestURL method --- src/common/data-managers/rest-data-manager.js | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/common/data-managers/rest-data-manager.js b/src/common/data-managers/rest-data-manager.js index 7fc3c98..a502086 100644 --- a/src/common/data-managers/rest-data-manager.js +++ b/src/common/data-managers/rest-data-manager.js @@ -57,7 +57,7 @@ class RestDataManager { case 'load/add': if (param === null){ if(id != null){ - return this.url + '/' + id; + return this.makeURL(this.url + '/' + id); } else { return this.makeURL(this.url); @@ -65,10 +65,10 @@ class RestDataManager { } else{ if(id != null){ - return this.url + '/' + id + '?' + param; + return this.makeURL(this.url + '/' + id + '?' + param); } else { - return this.makeURL(this.url) + '?' + param + return this.makeURL(this.url + '?' + param); } } case 'remove/update': @@ -127,7 +127,7 @@ class RestDataManager { }); } } - + add(object, token = null, param = null) { var obj = {}; @@ -160,7 +160,7 @@ class RestDataManager { }); }); } - + update(object, token = null, param = null) { var obj = {}; obj[this.type] = this.filterKeys(object); @@ -177,8 +177,8 @@ class RestDataManager { }); }); } - - + + }; From ab714e6896ee2edc7dff60b9ba7c322722515976 Mon Sep 17 00:00:00 2001 From: Laura Fuentes Grau Date: Sun, 24 Nov 2019 20:32:12 +0100 Subject: [PATCH 046/391] wip: dashboardA and widgets can be accessed but aren't rendered yet --- src/app.js | 1 + src/common/api/rest-api.js | 1 + src/common/array-store.js | 7 +- src/common/data-managers/rest-data-manager.js | 10 +- src/dashboard/dashboard.js | 125 ++++++++++++------ src/dashboard/exdashboard.js | 23 +++- src/scenario/scenario.js | 1 + src/user/user.js | 2 +- src/widget/widget-store.js | 4 + src/widget/widgets-data-manager.js | 3 + 10 files changed, 132 insertions(+), 45 deletions(-) create mode 100644 src/widget/widget-store.js create mode 100644 src/widget/widgets-data-manager.js diff --git a/src/app.js b/src/app.js index a13b632..cd68009 100644 --- a/src/app.js +++ b/src/app.js @@ -146,6 +146,7 @@ class App extends React.Component {
    + diff --git a/src/common/api/rest-api.js b/src/common/api/rest-api.js index d515079..78f5d52 100644 --- a/src/common/api/rest-api.js +++ b/src/common/api/rest-api.js @@ -54,6 +54,7 @@ function isNetworkError(err) { class RestAPI { get(url, token) { + console.log(url); return new Promise(function (resolve, reject) { var req = request.get(url); diff --git a/src/common/array-store.js b/src/common/array-store.js index 710ff94..2bbdb1a 100644 --- a/src/common/array-store.js +++ b/src/common/array-store.js @@ -68,7 +68,6 @@ class ArrayStore extends ReduceStore { reduce(state, action) { switch (action.type) { case this.type + '/start-load': - if (Array.isArray(action.data)) { action.data.forEach((id) => { this.dataManager.load(id, action.token,action.param); @@ -80,8 +79,14 @@ class ArrayStore extends ReduceStore { case this.type + '/loaded': if (Array.isArray(action.data)) { + console.log(" loaded Array: "); + console.log(action.data); + console.log(state); return this.updateElements(state, action.data); } else { + console.log("loaded single object: "); + console.log([action.data]); + console.log(state); return this.updateElements(state, [action.data]); } diff --git a/src/common/data-managers/rest-data-manager.js b/src/common/data-managers/rest-data-manager.js index 7fc3c98..e928804 100644 --- a/src/common/data-managers/rest-data-manager.js +++ b/src/common/data-managers/rest-data-manager.js @@ -57,7 +57,8 @@ class RestDataManager { case 'load/add': if (param === null){ if(id != null){ - return this.url + '/' + id; + console.log("id != 0"); + return this.makeURL(this.url + '/' + id); } else { return this.makeURL(this.url); @@ -65,10 +66,10 @@ class RestDataManager { } else{ if(id != null){ - return this.url + '/' + id + '?' + param; + return this.makeURL(this.url + '/' + id + '?' + param); } else { - return this.makeURL(this.url) + '?' + param + return this.makeURL(this.url + '?' + param) } } case 'remove/update': @@ -86,10 +87,11 @@ class RestDataManager { load(id, token = null,param = null) { if (id != null) { + console.log("rdm load was called"); // load single object RestAPI.get(this.requestURL('load/add',id,param), token).then(response => { const data = this.filterKeys(response[this.type]); - + AppDispatcher.dispatch({ type: this.type + 's/loaded', data: data diff --git a/src/dashboard/dashboard.js b/src/dashboard/dashboard.js index 80b5406..7e5caff 100644 --- a/src/dashboard/dashboard.js +++ b/src/dashboard/dashboard.js @@ -27,7 +27,7 @@ import { Map } from 'immutable' //import Icon from '../common/icon'; import Widget from '../widget/widget'; -import EditWidget from '../widget/edit-widget'; +//import EditWidget from '../widget/edit-widget'; import WidgetContextMenu from './widget-context-menu'; import WidgetToolbox from './widget-toolbox'; @@ -40,6 +40,7 @@ import ProjectStore from '../project/project-store'; import SimulationStore from '../simulation/simulation-store'; import SimulationModelStore from '../simulationmodel/simulation-model-store'; import FileStore from '../file/file-store'; +import WidgetStore from '../widget/widget-store'; import AppDispatcher from '../common/app-dispatcher'; import 'react-contexify/dist/ReactContexify.min.css'; @@ -48,53 +49,100 @@ class Dashboard extends React.Component { static lastWidgetKey = 0; static getStores() { - return [ DashboardStore, ProjectStore, SimulationStore, SimulationModelStore, FileStore, UserStore ]; + return [ DashboardStore, ProjectStore, SimulationStore, SimulationModelStore, FileStore, UserStore, WidgetStore ]; } static calculateState(prevState, props) { if (prevState == null) { prevState = {}; } - + const sessionToken = UserStore.getState().token; let dashboard = Map(); - let rawDashboard = DashboardStore.getState().find(v => v._id === props.match.params.dashboard); - + console.log("dashboard calculate state was called: " + props.match.params.dashboard); + let dashboards = DashboardStore.getState() + let rawDashboard = dashboards[props.match.params.dashboard - 1]; + + + let str = JSON.stringify(rawDashboard, null, 4); + console.log(str); if (rawDashboard != null) { dashboard = Map(rawDashboard); + console.log("dashboard: " + dashboard); - // convert widgets list to a dictionary to be able to reference widgets - const widgets = {}; + // convert widgets list to a dictionary to be able to reference widgets + //let widgets = {}; - for (let widget of dashboard.get('widgets')) { - widgets[this.getNewWidgetKey()] = widget; + let rawWidgets = WidgetStore.getState(); + + if(rawWidgets.length === 0){ + AppDispatcher.dispatch({ + type: 'widgets/start-load', + token: sessionToken, + param: 'dashboardID=1' + }); } - dashboard = dashboard.set('widgets', widgets); + + console.log("here are the widgets: "); + console.log(rawWidgets); + + dashboard = dashboard.set('widgets', rawWidgets); - // this.computeHeightWithWidgets(widgets); + + /* for(let widget of dashboard.get('widgets')){ + console.log("load files got called") + console.log(widget); + AppDispatcher.dispatch({ + type: 'files/start-load', + token: sessionToken, + param: 'objectID=' + widget.id + '&objectType=widget' + }); + } + */ + let widgets = {}; - // this.setState({ dashboard: selectedDashboards, project: null }); + for (let widget of dashboard.get('widgets')) { + widgets[this.lastWidgetKey] = widget; + this.lastWidgetKey++; + } + //ist das überhaupt nötiG?? + /* if (this.state.dashboard.has('id') === false) { + AppDispatcher.dispatch({ + type: 'dashboards/start-load', + data: this.props.match.params.dashboard, + token: this.state.sessionToken + }); + } + + + // this.computeHeightWithWidgets(widgets); - // AppDispatcher.dispatch({ - // type: 'projects/start-load', - // data: selectedDashboard.get('project'), - // token: this.state.sessionToken - // }); + let selectedDashboards = dashboard; + /* this.setState({ dashboard: selectedDashboards, project: null }); + + AppDispatcher.dispatch({ + type: 'projects/start-load', + data: selectedDashboards.get('project'), + token: this.state.sessionToken + }); +*/ } + let simulationModels = []; - if (prevState.simulation != null) { - simulationModels = SimulationModelStore.getState().filter(m => prevState.simulation.models.includes(m._id)); - } + //if (prevState.simulation != null) { + // simulationModels = SimulationModelStore.getState().filter(m => prevState.simulation.models.includes(m._id)); + //} return { + rawDashboard, dashboard, - sessionToken: UserStore.getState().token, - projects: ProjectStore.getState(), - simulations: SimulationStore.getState(), - files: FileStore.getState(), + sessionToken: sessionToken, + projects: null, //ProjectStore.getState(), + simulations: null, //SimulationStore.getState(), + files: null, //FileStore.getState(), project: prevState.project || null, simulation: prevState.simulation || null, @@ -102,7 +150,7 @@ class Dashboard extends React.Component { editing: prevState.editing || false, paused: prevState.paused || false, - editModal: prevState.editModal || false, + //editModal: prevState.editModal || false, modalData: prevState.modalData || null, modalIndex: prevState.modalIndex || null, @@ -119,10 +167,10 @@ class Dashboard extends React.Component { return widgetKey; } - - componentWillMount() { +//!!!won't work anymore + /* componentDidMount() { //document.addEventListener('keydown', this.handleKeydown.bind(this)); - + console.log("problem in componentdidmount"); if (this.state.dashboard.has('id') === false) { AppDispatcher.dispatch({ type: 'dashboards/start-load', @@ -137,7 +185,7 @@ class Dashboard extends React.Component { //document.removeEventListener('keydown', this.handleKeydown.bind(this)); } - componentDidUpdate() { + /*componentDidUpdate() { if (this.state.dashboard._id !== this.props.match.params.dashboard) { this.reloadDashboard(); } @@ -167,7 +215,7 @@ class Dashboard extends React.Component { } }); } - } + }* /*handleKeydown(e) { switch (e.key) { @@ -183,8 +231,9 @@ class Dashboard extends React.Component { break; default: } - }*/ - + } + + } /* * Adapt the area's height with the position of the new widget. * Return true if the height increased, otherwise false. @@ -210,6 +259,7 @@ class Dashboard extends React.Component { } reloadDashboard() { + console.log("Error: reloadDashboard was called"); // select dashboard by param id this.state.dashboards.forEach((tempDashboard) => { if (tempDashboard._id === this.props.match.params.dashboard) { @@ -287,9 +337,9 @@ class Dashboard extends React.Component { } - editWidget = (widget, index) => { - this.setState({ editModal: true, modalData: widget, modalIndex: index }); - } + //editWidget = (widget, index) => { + // this.setState({ editModal: true, modalData: widget, modalIndex: index }); + //} closeEdit = data => { @@ -378,7 +428,6 @@ class Dashboard extends React.Component { editing={this.state.editing} fullscreen={this.props.isFullscreen} paused={this.state.paused} - onEdit={this.startEditing} onSave={this.saveEditing} onCancel={this.cancelEditing} onFullscreen={this.props.toggleFullscreen} @@ -413,7 +462,7 @@ class Dashboard extends React.Component { ))} - +
    ; } @@ -421,3 +470,5 @@ class Dashboard extends React.Component { let fluxContainerConverter = require('../common/FluxContainerConverter'); export default Fullscreenable()(Container.create(fluxContainerConverter.convert(Dashboard), { withProps: true })); +// +//onEdit={this.startEditing} \ No newline at end of file diff --git a/src/dashboard/exdashboard.js b/src/dashboard/exdashboard.js index 54ab039..ee7a014 100644 --- a/src/dashboard/exdashboard.js +++ b/src/dashboard/exdashboard.js @@ -4,7 +4,9 @@ import DashboardStore from './dashboard-store'; import AppDispatcher from '../common/app-dispatcher'; import Table from '../common/table'; import TableColumn from '../common/table-column'; -import UserStore from '../user/user-store' +import UserStore from '../user/user-store'; +import { Button } from 'react-bootstrap'; +import Icon from '../common/icon'; @@ -40,20 +42,37 @@ class ExDashboard extends Component { }); } + loadDash(){ + console.log('bis hierhin gekommen'); + AppDispatcher.dispatch({ + type: 'dashboards/start-load', + token: this.state.tokenState, + param: 'scenarioID=1' + }); + } render() { + const buttonStyle = { + marginLeft: '10px' + }; return ( +
    +

    Dashboards

    - +
    + +
    + +
    ); } diff --git a/src/scenario/scenario.js b/src/scenario/scenario.js index 681dfc5..7de6e7d 100644 --- a/src/scenario/scenario.js +++ b/src/scenario/scenario.js @@ -57,6 +57,7 @@ class Scenario extends React.Component { }); scenario = {}; + console.log(scenario); } // load models diff --git a/src/user/user.js b/src/user/user.js index 74ac1a8..b587637 100644 --- a/src/user/user.js +++ b/src/user/user.js @@ -53,7 +53,7 @@ class User extends Component { user = {}; } - + console.log(user); console.log("extracted user 2: " + user.username); return { diff --git a/src/widget/widget-store.js b/src/widget/widget-store.js new file mode 100644 index 0000000..d6256ed --- /dev/null +++ b/src/widget/widget-store.js @@ -0,0 +1,4 @@ +import ArrayStore from '../common/array-store'; +import WidgetsDataManager from './widgets-data-manager'; + +export default new ArrayStore('widgets', WidgetsDataManager); diff --git a/src/widget/widgets-data-manager.js b/src/widget/widgets-data-manager.js new file mode 100644 index 0000000..ed03b2f --- /dev/null +++ b/src/widget/widgets-data-manager.js @@ -0,0 +1,3 @@ +import RestDataManager from '../common/data-managers/rest-data-manager'; + +export default new RestDataManager('widget', '/widgets'); From 3b3448e111e1f0bb42f5a7c00a927b96db11cf5e Mon Sep 17 00:00:00 2001 From: Sonja Happ Date: Tue, 26 Nov 2019 11:19:05 +0100 Subject: [PATCH 047/391] fix icon syntax in dashboard button group --- src/dashboard/dashboard-button-group.js | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/src/dashboard/dashboard-button-group.js b/src/dashboard/dashboard-button-group.js index 785ac48..756a09d 100644 --- a/src/dashboard/dashboard-button-group.js +++ b/src/dashboard/dashboard-button-group.js @@ -22,6 +22,7 @@ import React from 'react'; import PropTypes from 'prop-types'; import { Button } from 'react-bootstrap'; +import Icon from "../common/icon"; class DashboardButtonGroup extends React.Component { render() { @@ -38,17 +39,20 @@ class DashboardButtonGroup extends React.Component { if (this.props.editing) { buttons.push( - , - ); } else { if (this.props.fullscreen !== true) { buttons.push( - ); @@ -56,20 +60,23 @@ class DashboardButtonGroup extends React.Component { if (this.props.paused) { buttons.push( - ); } else { buttons.push( - ); } buttons.push( - ); From 33cc47c1786461bef1c84ef737133c2ba8da2da6 Mon Sep 17 00:00:00 2001 From: Laura Fuentes Grau Date: Tue, 26 Nov 2019 11:48:42 +0100 Subject: [PATCH 048/391] fixed version bugs --- src/dashboard/dashboard.js | 48 ++++++++++++++++++++-------- src/dashboard/widget-area.js | 2 +- src/dashboard/widget-context-menu.js | 6 ++-- src/user/user-store.js | 3 ++ src/user/user.js | 15 ++++++++- 5 files changed, 56 insertions(+), 18 deletions(-) diff --git a/src/dashboard/dashboard.js b/src/dashboard/dashboard.js index 7e5caff..499d620 100644 --- a/src/dashboard/dashboard.js +++ b/src/dashboard/dashboard.js @@ -87,6 +87,7 @@ class Dashboard extends React.Component { console.log(rawWidgets); dashboard = dashboard.set('widgets', rawWidgets); + console.log("") /* for(let widget of dashboard.get('widgets')){ @@ -99,12 +100,9 @@ class Dashboard extends React.Component { }); } */ - let widgets = {}; - - for (let widget of dashboard.get('widgets')) { - widgets[this.lastWidgetKey] = widget; - this.lastWidgetKey++; - } + + + //ist das überhaupt nötiG?? /* if (this.state.dashboard.has('id') === false) { AppDispatcher.dispatch({ @@ -113,9 +111,13 @@ class Dashboard extends React.Component { token: this.state.sessionToken }); } + */ + + - - // this.computeHeightWithWidgets(widgets); + /*if(Object.keys(widgets).length !== 0 ){ + this.computeHeightWithWidgets(widgets); + } let selectedDashboards = dashboard; @@ -128,8 +130,23 @@ class Dashboard extends React.Component { }); */ } - + let widgets = {}; + for (let widget of dashboard.get('widgets')) { + widgets[Dashboard.lastWidgetKey] = widget; + console.log(" the last widgetKey: " + Dashboard.lastWidgetKey); + Dashboard.lastWidgetKey++; + } + let maxHeight = Object.keys(widgets).reduce( (maxHeightSoFar, widgetKey) => { + console.log("!! the widget key: "+ widgetKey); + let thisWidget = widgets[widgetKey]; + let thisWidgetHeight = thisWidget.y + thisWidget.height; + + return thisWidgetHeight > maxHeightSoFar? thisWidgetHeight : maxHeightSoFar; + }, 0); + + console.log("now the object keys: "); + console.log(Object.keys(widgets)); let simulationModels = []; //if (prevState.simulation != null) { // simulationModels = SimulationModelStore.getState().filter(m => prevState.simulation.models.includes(m._id)); @@ -138,6 +155,7 @@ class Dashboard extends React.Component { return { rawDashboard, dashboard, + widgets, sessionToken: sessionToken, projects: null, //ProjectStore.getState(), @@ -154,8 +172,8 @@ class Dashboard extends React.Component { modalData: prevState.modalData || null, modalIndex: prevState.modalIndex || null, - maxWidgetHeight: prevState.maxWidgetHeight || 0, - dropZoneHeight: prevState.dropZoneHeight || 0, + maxWidgetHeight: maxHeight, + dropZoneHeight: maxHeight +80, }; } @@ -180,6 +198,7 @@ class Dashboard extends React.Component { } } + componentWillUnmount() { //document.removeEventListener('keydown', this.handleKeydown.bind(this)); @@ -321,7 +340,7 @@ class Dashboard extends React.Component { /* * Set the initial height state based on the existing widgets */ - computeHeightWithWidgets(widgets) { + computeHeightWithWidgets(widgets) { // Compute max height from widgets let maxHeight = Object.keys(widgets).reduce( (maxHeightSoFar, widgetKey) => { let thisWidget = widgets[widgetKey]; @@ -414,7 +433,10 @@ class Dashboard extends React.Component { render() { const widgets = this.state.dashboard.get('widgets'); + console.log("the widgets in render: "); + console.log(widgets); const grid = this.state.dashboard.get('grid'); + console.log("the grid in render: "+ grid); const boxClasses = classNames('section', 'box', { 'fullscreen-padding': this.props.isFullscreen }); @@ -459,7 +481,7 @@ class Dashboard extends React.Component { {/* TODO: Create only one context menu for all widgets */} {widgets != null && Object.keys(widgets).map(widgetKey => ( - + ))} diff --git a/src/dashboard/widget-area.js b/src/dashboard/widget-area.js index cc08afc..f3e7c0f 100644 --- a/src/dashboard/widget-area.js +++ b/src/dashboard/widget-area.js @@ -67,7 +67,7 @@ WidgetArea.propTypes = { editing: PropTypes.bool, grid: PropTypes.number, defaultSimulationModel: PropTypes.string, - widgets: PropTypes.object, + widgets: PropTypes.array, onWidgetAdded: PropTypes.func }; diff --git a/src/dashboard/widget-context-menu.js b/src/dashboard/widget-context-menu.js index 69e0683..9276d3c 100644 --- a/src/dashboard/widget-context-menu.js +++ b/src/dashboard/widget-context-menu.js @@ -21,7 +21,7 @@ import React from 'react'; import PropTypes from 'prop-types'; -import { contextMenu, Item, Separator } from 'react-contexify'; +import { Menu, Item, Separator } from 'react-contexify'; class WidgetContextMenu extends React.Component { editWidget = event => { @@ -93,7 +93,7 @@ class WidgetContextMenu extends React.Component { render() { const isLocked = this.props.widget.locked; - return + return Edit Delete @@ -108,7 +108,7 @@ class WidgetContextMenu extends React.Component { Lock Unlock - ; + ; } } diff --git a/src/user/user-store.js b/src/user/user-store.js index c925a35..2da3ca3 100644 --- a/src/user/user-store.js +++ b/src/user/user-store.js @@ -63,6 +63,9 @@ class UserStore extends ReduceStore { // // save logged-in user return Object.assign({}, state, { currentUser: action.user}); + case 'users/reload-current-user': + return state; + case 'users/current-user-error': // discard user token return Object.assign({}, state, { currentUser: null, token: null }); diff --git a/src/user/user.js b/src/user/user.js index b587637..9f888b6 100644 --- a/src/user/user.js +++ b/src/user/user.js @@ -38,7 +38,7 @@ class User extends Component { } static calculateState(prevState, props) { - //prevState = prevState || {}; + prevState = prevState || {}; let sessionToken = UserStore.getState().token; let user = UserStore.getState().currentUser; @@ -67,6 +67,18 @@ class User extends Component { }; } + update(){ + let tokenState = UserStore.getState().token; + setTimeout(function() { + AppDispatcher.dispatch({ + type: 'users/start-load', + data: UserStore.getState().userid, + token: tokenState + }); + }.bind(this), 1000) + + } + closeEditModal(data) { @@ -91,6 +103,7 @@ class User extends Component { }); } } + this.update(); } From c7937486b2c186c9b9c516e1cfb441d9b7b4a6c7 Mon Sep 17 00:00:00 2001 From: Sonja Happ Date: Tue, 26 Nov 2019 14:26:42 +0100 Subject: [PATCH 049/391] remove logging, ? indicating start of parameter has to be contained in param --- src/common/data-managers/rest-data-manager.js | 18 ++++----- src/dashboard/dashboard.js | 40 +++++++++---------- src/dashboard/exdashboard.js | 16 ++++---- 3 files changed, 36 insertions(+), 38 deletions(-) diff --git a/src/common/data-managers/rest-data-manager.js b/src/common/data-managers/rest-data-manager.js index e928804..559d404 100644 --- a/src/common/data-managers/rest-data-manager.js +++ b/src/common/data-managers/rest-data-manager.js @@ -57,7 +57,6 @@ class RestDataManager { case 'load/add': if (param === null){ if(id != null){ - console.log("id != 0"); return this.makeURL(this.url + '/' + id); } else { @@ -66,10 +65,10 @@ class RestDataManager { } else{ if(id != null){ - return this.makeURL(this.url + '/' + id + '?' + param); + return this.makeURL(this.url + '/' + id + param); } else { - return this.makeURL(this.url + '?' + param) + return this.makeURL(this.url + param) } } case 'remove/update': @@ -77,7 +76,7 @@ class RestDataManager { return this.makeURL(this.url + '/' + object.id); } else{ - return this.makeURL(this.url + '/' + object.id + '?' + param); + return this.makeURL(this.url + '/' + object.id + param); } default: console.log("something went wrong"); @@ -87,11 +86,10 @@ class RestDataManager { load(id, token = null,param = null) { if (id != null) { - console.log("rdm load was called"); // load single object RestAPI.get(this.requestURL('load/add',id,param), token).then(response => { const data = this.filterKeys(response[this.type]); - + AppDispatcher.dispatch({ type: this.type + 's/loaded', data: data @@ -129,7 +127,7 @@ class RestDataManager { }); } } - + add(object, token = null, param = null) { var obj = {}; @@ -162,7 +160,7 @@ class RestDataManager { }); }); } - + update(object, token = null, param = null) { var obj = {}; obj[this.type] = this.filterKeys(object); @@ -179,8 +177,8 @@ class RestDataManager { }); }); } - - + + }; diff --git a/src/dashboard/dashboard.js b/src/dashboard/dashboard.js index 499d620..9ce23a8 100644 --- a/src/dashboard/dashboard.js +++ b/src/dashboard/dashboard.js @@ -61,35 +61,35 @@ class Dashboard extends React.Component { console.log("dashboard calculate state was called: " + props.match.params.dashboard); let dashboards = DashboardStore.getState() let rawDashboard = dashboards[props.match.params.dashboard - 1]; - - + + let str = JSON.stringify(rawDashboard, null, 4); console.log(str); if (rawDashboard != null) { dashboard = Map(rawDashboard); console.log("dashboard: " + dashboard); - // convert widgets list to a dictionary to be able to reference widgets + // convert widgets list to a dictionary to be able to reference widgets //let widgets = {}; let rawWidgets = WidgetStore.getState(); - + if(rawWidgets.length === 0){ AppDispatcher.dispatch({ type: 'widgets/start-load', token: sessionToken, - param: 'dashboardID=1' + param: '?dashboardID=1' }); } - + console.log("here are the widgets: "); console.log(rawWidgets); - + dashboard = dashboard.set('widgets', rawWidgets); console.log("") - + /* for(let widget of dashboard.get('widgets')){ console.log("load files got called") console.log(widget); @@ -100,9 +100,9 @@ class Dashboard extends React.Component { }); } */ - - - + + + //ist das überhaupt nötiG?? /* if (this.state.dashboard.has('id') === false) { AppDispatcher.dispatch({ @@ -112,14 +112,14 @@ class Dashboard extends React.Component { }); } */ - - + + /*if(Object.keys(widgets).length !== 0 ){ this.computeHeightWithWidgets(widgets); } - let selectedDashboards = dashboard; + let selectedDashboards = dashboard; /* this.setState({ dashboard: selectedDashboards, project: null }); @@ -141,10 +141,10 @@ class Dashboard extends React.Component { console.log("!! the widget key: "+ widgetKey); let thisWidget = widgets[widgetKey]; let thisWidgetHeight = thisWidget.y + thisWidget.height; - + return thisWidgetHeight > maxHeightSoFar? thisWidgetHeight : maxHeightSoFar; }, 0); - + console.log("now the object keys: "); console.log(Object.keys(widgets)); let simulationModels = []; @@ -198,7 +198,7 @@ class Dashboard extends React.Component { } } - + componentWillUnmount() { //document.removeEventListener('keydown', this.handleKeydown.bind(this)); @@ -251,7 +251,7 @@ class Dashboard extends React.Component { default: } } - + } /* * Adapt the area's height with the position of the new widget. @@ -484,7 +484,7 @@ class Dashboard extends React.Component { ))} - +
    ; } @@ -493,4 +493,4 @@ class Dashboard extends React.Component { let fluxContainerConverter = require('../common/FluxContainerConverter'); export default Fullscreenable()(Container.create(fluxContainerConverter.convert(Dashboard), { withProps: true })); // -//onEdit={this.startEditing} \ No newline at end of file +//onEdit={this.startEditing} diff --git a/src/dashboard/exdashboard.js b/src/dashboard/exdashboard.js index ee7a014..21c5615 100644 --- a/src/dashboard/exdashboard.js +++ b/src/dashboard/exdashboard.js @@ -18,7 +18,7 @@ class ExDashboard extends Component { static getStores() { return [ DashboardStore ]; } - + static calculateState(prevState, props) { prevState = prevState || {}; @@ -31,23 +31,23 @@ class ExDashboard extends Component { dashboards, tokenState } - + } - + componentDidMount() { AppDispatcher.dispatch({ type: 'dashboards/start-load', token: this.state.tokenState, - param: 'scenarioID=1' + param: '?scenarioID=1' }); } - + loadDash(){ console.log('bis hierhin gekommen'); AppDispatcher.dispatch({ type: 'dashboards/start-load', token: this.state.tokenState, - param: 'scenarioID=1' + param: '?scenarioID=1' }); } @@ -59,9 +59,9 @@ class ExDashboard extends Component { }; return ( - +
    - +

    Dashboards

    From 4bcebd29a4ee07bc9e04a613c347ccf0fb5dc05a Mon Sep 17 00:00:00 2001 From: Sonja Happ Date: Tue, 26 Nov 2019 14:27:06 +0100 Subject: [PATCH 050/391] remove logging --- src/common/api/rest-api.js | 8 +++----- src/common/array-store.js | 24 ++++++++++++------------ 2 files changed, 15 insertions(+), 17 deletions(-) diff --git a/src/common/api/rest-api.js b/src/common/api/rest-api.js index 78f5d52..bb92e10 100644 --- a/src/common/api/rest-api.js +++ b/src/common/api/rest-api.js @@ -37,7 +37,7 @@ const REQUEST_TIMEOUT_NOTIFICATION = { level: 'error' }; -// Check if the error was due to network failure, timeouts, etc. +// Check if the error was due to network failure, timeouts, etc. // Can be used for the rest of requests function isNetworkError(err) { let result = false; @@ -45,7 +45,7 @@ function isNetworkError(err) { // If not status nor response fields, it is a network error. TODO: Handle timeouts if (err.status == null || err.response == null) { result = true; - + let notification = err.timeout? REQUEST_TIMEOUT_NOTIFICATION : SERVER_NOT_REACHABLE_NOTIFICATION; NotificationsDataManager.addNotification(notification); } @@ -54,7 +54,6 @@ function isNetworkError(err) { class RestAPI { get(url, token) { - console.log(url); return new Promise(function (resolve, reject) { var req = request.get(url); @@ -74,14 +73,13 @@ class RestAPI { } post(url, body, token) { - console.log(url); return new Promise(function (resolve, reject) { var req = request.post(url).send(body).timeout({ response: 5000 }); // Simple response start timeout (3s) if (token != null) { req.set('Authorization', "Bearer " + token); } - + req.end(function (error, res) { if (res == null || res.status !== 200) { diff --git a/src/common/array-store.js b/src/common/array-store.js index 2bbdb1a..15a13ab 100644 --- a/src/common/array-store.js +++ b/src/common/array-store.js @@ -79,30 +79,30 @@ class ArrayStore extends ReduceStore { case this.type + '/loaded': if (Array.isArray(action.data)) { - console.log(" loaded Array: "); - console.log(action.data); - console.log(state); + console.log("####### loaded array of type " + this.type); + //console.log(action.data); + //console.log(state); return this.updateElements(state, action.data); } else { - console.log("loaded single object: "); - console.log([action.data]); - console.log(state); + console.log("####### loaded single object of type " + this.type); + //console.log([action.data]); + //console.log(state); return this.updateElements(state, [action.data]); } case this.type + '/load-error': if (action.error && !action.error.handled && action.error.response) { - + const USER_LOAD_ERROR_NOTIFICATION = { title: 'Failed to load', message: action.error.response.body.message, level: 'error' }; NotificationsDataManager.addNotification(USER_LOAD_ERROR_NOTIFICATION); - + } return super.reduce(state, action); - + case this.type + '/start-add': this.dataManager.add(action.data, action.token,action.param); return state; @@ -111,7 +111,7 @@ class ArrayStore extends ReduceStore { return this.updateElements(state, [action.data]); case this.type + '/add-error': - + return state; @@ -133,10 +133,10 @@ class ArrayStore extends ReduceStore { level: 'error' }; NotificationsDataManager.addNotification(USER_REMOVE_ERROR_NOTIFICATION); - + } return super.reduce(state, action); - + case this.type + '/start-edit': this.dataManager.update(action.data, action.token,action.param); return state; From 5ab70f2bbd3a98e894cd96571fe458b8aa84f885 Mon Sep 17 00:00:00 2001 From: Sonja Happ Date: Tue, 26 Nov 2019 14:27:42 +0100 Subject: [PATCH 051/391] link to scenario only in first table column (name) --- src/scenario/scenarios.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/scenario/scenarios.js b/src/scenario/scenarios.js index 5789e31..912abe5 100644 --- a/src/scenario/scenarios.js +++ b/src/scenario/scenarios.js @@ -178,8 +178,8 @@ class Scenarios extends Component {
    - - + + Date: Tue, 26 Nov 2019 15:08:51 +0100 Subject: [PATCH 052/391] fix renaming from visualization to dashboard --- src/dashboard/new-dashboard.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/dashboard/new-dashboard.js b/src/dashboard/new-dashboard.js index cbac2cb..b05fbad 100644 --- a/src/dashboard/new-dashboard.js +++ b/src/dashboard/new-dashboard.js @@ -24,7 +24,7 @@ import { FormGroup, FormControl, FormLabel } from 'react-bootstrap'; import Dialog from '../common/dialogs/dialog'; -class NewVisualzationDialog extends React.Component { +class NewDashboardDialog extends React.Component { valid: false; constructor(props) { @@ -84,4 +84,4 @@ class NewVisualzationDialog extends React.Component { } } -export default NewVisualzationDialog; +export default NewDashboardDialog; From 3aacba30be444b20b23b23704734ef9a64c758d2 Mon Sep 17 00:00:00 2001 From: Sonja Happ Date: Tue, 26 Nov 2019 15:09:40 +0100 Subject: [PATCH 053/391] initial version of scenario frame (users not showing, no buttons tested) --- src/scenario/scenario.js | 189 ++++++++++++++++++++++++++++++--------- 1 file changed, 146 insertions(+), 43 deletions(-) diff --git a/src/scenario/scenario.js b/src/scenario/scenario.js index 7de6e7d..76fead2 100644 --- a/src/scenario/scenario.js +++ b/src/scenario/scenario.js @@ -27,83 +27,96 @@ import _ from 'lodash'; import ScenarioStore from './scenario-store'; import SimulatorStore from '../simulator/simulator-store'; +import DashboardStore from '../dashboard/dashboard-store'; import SimulationModelStore from '../simulationmodel/simulation-model-store'; import UserStore from '../user/user-store'; +import UsersStore from '../user/users-store'; import AppDispatcher from '../common/app-dispatcher'; import Icon from '../common/icon'; import Table from '../common/table'; import TableColumn from '../common/table-column'; import ImportSimulationModelDialog from '../simulationmodel/import-simulation-model'; +import ImportDashboardDialog from "../dashboard/import-dashboard"; +import NewDashboardDialog from "../dashboard/new-dashboard"; import SimulatorAction from '../simulator/simulator-action'; import DeleteDialog from '../common/dialogs/delete-dialog'; class Scenario extends React.Component { static getStores() { - return [ ScenarioStore, SimulatorStore, SimulationModelStore, UserStore ]; + return [ ScenarioStore, SimulationModelStore, UsersStore, DashboardStore, SimulatorStore]; } static calculateState(prevState, props) { // get selected scenario const sessionToken = UserStore.getState().token; - let scenario = ScenarioStore.getState().find(s => s.id === props.match.params.scenario); + const scenario = ScenarioStore.getState().find(s => s.id === parseInt(props.match.params.scenario, 10)); if (scenario == null) { AppDispatcher.dispatch({ type: 'scenarios/start-load', data: props.match.params.scenario, token: sessionToken }); - - scenario = {}; - console.log(scenario); - } - - // load models - let simulationModels = []; - if (scenario.simulationModels != null) { - simulationModels = SimulationModelStore.getState().filter(m => m != null && scenario.simulationModels.includes(m.id)); } return { - simulationModels, scenario, - - //simulators: SimulatorStore.getState(), sessionToken, + simulationModels: SimulationModelStore.getState(), + users: UsersStore.getState(), + dashboards: DashboardStore.getState(), + simulators: SimulatorStore.getState(), - deleteModal: false, - importModal: false, - modalData: {}, + deleteSimulationModelModal: false, + importSimulationModelModal: false, + modalSimulationModelData: {}, + selectedSimulationModels: [], - selectedSimulationModels: [] + newDashboardModal: false, + deleteDashboardModal: false, + importDashboardModal: false, + modalDashboardData: {}, } } componentWillMount() { + + //load selected scenario AppDispatcher.dispatch({ type: 'scenarios/start-load', + data: this.state.scenario.id, token: this.state.sessionToken }); + // load simulation models for selected scenario AppDispatcher.dispatch({ type: 'simulationModels/start-load', - token: this.state.sessionToken + token: this.state.sessionToken, + param: '?scenarioID='+this.state.scenario.id, }); + // load users of selected scenario + AppDispatcher.dispatch({ + type: 'scenarios/start-load', + token: this.state.sessionToken, + data: this.state.scenario.id, + param: '/users' + }); + + // load dashboards of selected scenario + AppDispatcher.dispatch({ + type: 'dashboards/start-load', + token: this.state.sessionToken, + param: '?scenarioID='+this.state.scenario.id, + }); + + // load simulators to enable that simulation models work with them AppDispatcher.dispatch({ type: 'simulators/start-load', - token: this.state.sessionToken + token: this.state.sessionToken, }); - - //TODO users - - //TODO dashboards - - - - } addSimulationModel = () => { @@ -132,8 +145,8 @@ class Scenario extends React.Component { }); } - closeDeleteModal = confirmDelete => { - this.setState({ deleteModal: false }); + closeDeleteSimulationModelModal = confirmDelete => { + this.setState({ deleteSimulationModelModal: false }); if (confirmDelete === false) { return; @@ -141,13 +154,13 @@ class Scenario extends React.Component { AppDispatcher.dispatch({ type: 'simulationModels/start-remove', - data: this.state.modalData, + data: this.state.modalSimulationModelData, token: this.state.sessionToken }); } importSimulationModel = simulationModel => { - this.setState({ importModal: false }); + this.setState({ importSimulationModelModal: false }); if (simulationModel == null) { return; @@ -155,8 +168,6 @@ class Scenario extends React.Component { simulationModel.scenario = this.state.scenario.id; - console.log(simulationModel); - AppDispatcher.dispatch({ type: 'simulationModels/start-add', data: simulationModel, @@ -172,6 +183,47 @@ class Scenario extends React.Component { }); } + closeNewDashboardModal(data) { + this.setState({ newDashboardModal : false }); + + if (data) { + AppDispatcher.dispatch({ + type: 'dashboards/start-add', + data, + token: this.state.sessionToken, + userid: this.state.sessionUserID + }); + } + } + + closeDeleteDashboardModal(confirmDelete){ + this.setState({ deleteDashboardModal: false }); + + if (confirmDelete === false) { + return; + } + + AppDispatcher.dispatch({ + type: 'dashboards/start-remove', + data: this.state.modalDashboardData, + token: this.state.sessionToken, + userid: this.state.sessionUserID + }); + } + + closeImportDashboardModal(data) { + this.setState({ importDashboardModal: false }); + + if (data) { + AppDispatcher.dispatch({ + type: 'dashboards/start-add', + data, + token: this.state.sessionToken, + userid: this.state.sessionUserID + }); + } + } + getSimulatorName(simulatorId) { for (let simulator of this.state.simulators) { if (simulator.id === simulatorId) { @@ -184,14 +236,26 @@ class Scenario extends React.Component { // filter properties const model = Object.assign({}, this.state.simulationModels[index]); - delete model.simulator; - delete model.scenario; + //delete model.simulator; + //delete model.scenario; + // TODO get elements recursively // show save dialog const blob = new Blob([JSON.stringify(model, null, 2)], { type: 'application/json' }); FileSaver.saveAs(blob, 'simulation model - ' + model.name + '.json'); } + exportDashboard(index) { + // filter properties + const dashboard = Object.assign({}, this.state.dashboards[index]); + + // TODO get elements recursively + + // show save dialog + const blob = new Blob([JSON.stringify(dashboard, null, 2)], { type: 'application/json' }); + FileSaver.saveAs(blob, 'dashboard - ' + dashboard.name + '.json'); + } + onSimulationModelChecked(index, event) { const selectedSimulationModels = Object.assign([], this.state.selectedSimulationModels); for (let key in selectedSimulationModels) { @@ -250,20 +314,22 @@ class Scenario extends React.Component { }; return
    -

    {this.state.simulation.name}

    +

    {this.state.scenario.name}

    + {/*Simulation Model table*/} +

    Simulation Models

    this.onSimulationModelChecked(index, event)} width='30' /> - + this.getSimulatorName(simulator)} /> this.setState({ deleteModal: true, modalData: this.state.simulationModels[index], modalIndex: index })} + onDelete={(index) => this.setState({ deleteSimulationModelModal: true, modalSimulationModelData: this.state.simulationModels[index], modalSimulationModelIndex: index })} onExport={index => this.exportModel(index)} />
    @@ -282,14 +348,51 @@ class Scenario extends React.Component {
    - +
    - + + + + + {/*Dashboard table*/} +

    Dashboards

    + + + + this.setState({ deleteDashboardModal: true, modalDashboardData: this.state.dashboards[index], modalDashboardIndex: index })} + onExport={index => this.exportDashboard(index)} + /> +
    + +
    + + +
    + +
    + + this.closeNewDashboardModal(data)}/> + this.closeImportDashboardModal(data)} /> + + this.closeDeleteDashboardModal(e)}/> + + {/*Users table*/} +

    Users

    + + + + +
    + -
    ; } } From 20967006a45e3adfcb6e2dfb873cb25db5d0865f Mon Sep 17 00:00:00 2001 From: Sonja Happ Date: Tue, 26 Nov 2019 16:27:27 +0100 Subject: [PATCH 054/391] use ButtonToolbar to place run button next to drop down menu --- src/simulator/simulator-action.js | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/src/simulator/simulator-action.js b/src/simulator/simulator-action.js index 765856f..e4f52ed 100644 --- a/src/simulator/simulator-action.js +++ b/src/simulator/simulator-action.js @@ -20,7 +20,7 @@ ******************************************************************************/ import React from 'react'; -import { Button, DropdownButton, DropdownItem } from 'react-bootstrap'; +import { Button, ButtonToolbar, DropdownButton, DropdownItem } from 'react-bootstrap'; class SimulatorAction extends React.Component { constructor(props) { @@ -38,7 +38,7 @@ class SimulatorAction extends React.Component { } } } - + setAction = id => { // search action for (let action of this.props.actions) { @@ -56,11 +56,13 @@ class SimulatorAction extends React.Component { )); return
    + - {actionList} + {actionList} - + +
    ; } } From a7fa55f32de45ce4b52265d3386fd6e855d808b7 Mon Sep 17 00:00:00 2001 From: Laura Fuentes Grau Date: Tue, 26 Nov 2019 16:29:47 +0100 Subject: [PATCH 055/391] wip: user component now rerenders after editing --- src/dashboard/dashboard.js | 12 +++++++++++- src/user/user-store.js | 6 +++++- src/user/user.js | 7 ++++--- 3 files changed, 20 insertions(+), 5 deletions(-) diff --git a/src/dashboard/dashboard.js b/src/dashboard/dashboard.js index 499d620..227a536 100644 --- a/src/dashboard/dashboard.js +++ b/src/dashboard/dashboard.js @@ -82,6 +82,16 @@ class Dashboard extends React.Component { }); } + let files = FileStore.getState(); + + if(files.length === 0){ + AppDispatcher.dispatch({ + type: 'files/start-load', + token: sessionToken, + param: 'objectID=1&objectType=widget' + }); + } + console.log("here are the widgets: "); console.log(rawWidgets); @@ -160,7 +170,7 @@ class Dashboard extends React.Component { sessionToken: sessionToken, projects: null, //ProjectStore.getState(), simulations: null, //SimulationStore.getState(), - files: null, //FileStore.getState(), + files: FileStore.getState(), project: prevState.project || null, simulation: prevState.simulation || null, diff --git a/src/user/user-store.js b/src/user/user-store.js index 2da3ca3..d18e960 100644 --- a/src/user/user-store.js +++ b/src/user/user-store.js @@ -55,6 +55,7 @@ class UserStore extends ReduceStore { case 'users/logged-in': // // request logged-in user data + UsersDataManager.getCurrentUser(action.token, action.userid); return Object.assign({}, state, { token: action.token, userid: action.userid}); @@ -64,7 +65,10 @@ class UserStore extends ReduceStore { return Object.assign({}, state, { currentUser: action.user}); case 'users/reload-current-user': - return state; + + UsersDataManager.getCurrentUser(action.token, action.userid); + + return Object.assign({}, state, { token: action.token, userid: action.userid}); case 'users/current-user-error': // discard user token diff --git a/src/user/user.js b/src/user/user.js index 9f888b6..773c235 100644 --- a/src/user/user.js +++ b/src/user/user.js @@ -71,11 +71,12 @@ class User extends Component { let tokenState = UserStore.getState().token; setTimeout(function() { AppDispatcher.dispatch({ - type: 'users/start-load', - data: UserStore.getState().userid, + type: 'users/logged-in', + user: this.state.user, + userid: this.state.user.id, token: tokenState }); - }.bind(this), 1000) + }.bind(this), 0.00001) } From e50a43a56988a16cc1be004834ae9dce95dc5777 Mon Sep 17 00:00:00 2001 From: Sonja Happ Date: Tue, 26 Nov 2019 16:33:57 +0100 Subject: [PATCH 056/391] Dashboards are now reachable via scenarios, removed example dashboard --- src/app.js | 3 -- src/common/menu-sidebar.js | 1 - src/dashboard/exdashboard.js | 85 ------------------------------------ 3 files changed, 89 deletions(-) delete mode 100644 src/dashboard/exdashboard.js diff --git a/src/app.js b/src/app.js index cd68009..92bb42c 100644 --- a/src/app.js +++ b/src/app.js @@ -51,7 +51,6 @@ import Scenario from './scenario/scenario'; import SimulationModel from './simulationmodel/simulation-model'; import Users from './user/users'; import User from './user/user'; -import ExDashboard from './dashboard/exdashboard'; import './styles/app.css'; @@ -146,7 +145,6 @@ class App extends React.Component {
    - @@ -154,7 +152,6 @@ class App extends React.Component { -
    diff --git a/src/common/menu-sidebar.js b/src/common/menu-sidebar.js index be42a68..5f43425 100644 --- a/src/common/menu-sidebar.js +++ b/src/common/menu-sidebar.js @@ -35,7 +35,6 @@ class SidebarMenu extends React.Component {
  • Home
  • Scenarios
  • Simulators
  • -
  • Example Dashboard
  • { this.props.currentRole === 'Admin' ?
  • User Management
  • : '' } diff --git a/src/dashboard/exdashboard.js b/src/dashboard/exdashboard.js deleted file mode 100644 index 21c5615..0000000 --- a/src/dashboard/exdashboard.js +++ /dev/null @@ -1,85 +0,0 @@ -import React, { Component } from 'react'; -import { Container } from 'flux/utils'; -import DashboardStore from './dashboard-store'; -import AppDispatcher from '../common/app-dispatcher'; -import Table from '../common/table'; -import TableColumn from '../common/table-column'; -import UserStore from '../user/user-store'; -import { Button } from 'react-bootstrap'; -import Icon from '../common/icon'; - - - - - - - -class ExDashboard extends Component { - static getStores() { - return [ DashboardStore ]; - } - - static calculateState(prevState, props) { - prevState = prevState || {}; - - console.log("calculateState has been called"); - const dashboards = DashboardStore.getState(); - let tokenState = UserStore.getState().token; - console.log(dashboards); - - return{ - dashboards, - tokenState - } - - } - - componentDidMount() { - AppDispatcher.dispatch({ - type: 'dashboards/start-load', - token: this.state.tokenState, - param: '?scenarioID=1' - }); - } - - loadDash(){ - console.log('bis hierhin gekommen'); - AppDispatcher.dispatch({ - type: 'dashboards/start-load', - token: this.state.tokenState, - param: '?scenarioID=1' - }); - } - - - - render() { - const buttonStyle = { - marginLeft: '10px' - }; - - return ( - -
    - -

    Dashboards

    - - - - - -
    - -
    - -
    -
    - ); - } -} - - - - -let fluxContainerConverter = require('../common/FluxContainerConverter'); -export default Container.create(fluxContainerConverter.convert(ExDashboard)); From 04265d31d7bd198ae8886465f1f9e51eea4134d4 Mon Sep 17 00:00:00 2001 From: Sonja Happ Date: Tue, 26 Nov 2019 16:36:33 +0100 Subject: [PATCH 057/391] show only simulation models and dashboards that belong to currently selected scenario, remove users for now, show name of simulator in simulation model list --- src/scenario/scenario.js | 38 +++++++++++++------------------------- 1 file changed, 13 insertions(+), 25 deletions(-) diff --git a/src/scenario/scenario.js b/src/scenario/scenario.js index 76fead2..85fee67 100644 --- a/src/scenario/scenario.js +++ b/src/scenario/scenario.js @@ -30,7 +30,6 @@ import SimulatorStore from '../simulator/simulator-store'; import DashboardStore from '../dashboard/dashboard-store'; import SimulationModelStore from '../simulationmodel/simulation-model-store'; import UserStore from '../user/user-store'; -import UsersStore from '../user/users-store'; import AppDispatcher from '../common/app-dispatcher'; import Icon from '../common/icon'; @@ -45,7 +44,7 @@ import DeleteDialog from '../common/dialogs/delete-dialog'; class Scenario extends React.Component { static getStores() { - return [ ScenarioStore, SimulationModelStore, UsersStore, DashboardStore, SimulatorStore]; + return [ ScenarioStore, SimulationModelStore, DashboardStore, SimulatorStore]; } static calculateState(prevState, props) { @@ -61,12 +60,17 @@ class Scenario extends React.Component { }); } + // obtain all dashboards of a scenario + let dashboards = DashboardStore.getState().filter(dashb => dashb.scenarioID === parseInt(props.match.params.scenario, 10)); + + // obtain all simulation models of a scenario + let simulationmodels = SimulationModelStore.getState().filter(simmodel => simmodel.scenarioID === parseInt(props.match.params.scenario, 10)); + return { scenario, sessionToken, - simulationModels: SimulationModelStore.getState(), - users: UsersStore.getState(), - dashboards: DashboardStore.getState(), + simulationModels: simulationmodels, + dashboards: dashboards, simulators: SimulatorStore.getState(), deleteSimulationModelModal: false, @@ -97,14 +101,6 @@ class Scenario extends React.Component { param: '?scenarioID='+this.state.scenario.id, }); - // load users of selected scenario - AppDispatcher.dispatch({ - type: 'scenarios/start-load', - token: this.state.sessionToken, - data: this.state.scenario.id, - param: '/users' - }); - // load dashboards of selected scenario AppDispatcher.dispatch({ type: 'dashboards/start-load', @@ -321,9 +317,9 @@ class Scenario extends React.Component { this.onSimulationModelChecked(index, event)} width='30' /> - this.getSimulatorName(simulator)} /> - - + this.getSimulatorName(simulatorID)} /> + + Dashboards
    - + this.closeDeleteDashboardModal(e)}/> - {/*Users table*/} -

    Users

    -
    - - - -
    -
    ; } From 0646d85aa367c0b713e6917d3d7e0c2b0bf10a16 Mon Sep 17 00:00:00 2001 From: Sonja Happ Date: Tue, 26 Nov 2019 16:42:16 +0100 Subject: [PATCH 058/391] minor fix required after the last merge --- src/dashboard/dashboard.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/dashboard/dashboard.js b/src/dashboard/dashboard.js index 67bdbc7..4999aeb 100644 --- a/src/dashboard/dashboard.js +++ b/src/dashboard/dashboard.js @@ -88,7 +88,7 @@ class Dashboard extends React.Component { AppDispatcher.dispatch({ type: 'files/start-load', token: sessionToken, - param: 'objectID=1&objectType=widget' + param: '?objectID=1&objectType=widget' }); } @@ -106,7 +106,7 @@ class Dashboard extends React.Component { AppDispatcher.dispatch({ type: 'files/start-load', token: sessionToken, - param: 'objectID=' + widget.id + '&objectType=widget' + param: '?objectID=' + widget.id + '&objectType=widget' }); } */ From 0895ad3c85155ca94241e0526e66a0b208e14f13 Mon Sep 17 00:00:00 2001 From: Sonja Happ Date: Thu, 28 Nov 2019 16:01:17 +0100 Subject: [PATCH 059/391] Major modifications in login data management: - only token and currentUser are stored (and error msg if any) - token and current User are stored in local storage and used by app.js - placeholders in user edit dialogs are replaced by actual values (except for pw) - UserStore is renamed to LoginStore to resolve naming confusion - Error notifications are moved to react components instead of data managers/ dispatchers - updateCurrentUser method was added in UserDataManager for updating own user #197 - cleanup of edit-own-user dialog #197 --- src/app.js | 29 ++---- src/common/array-store.js | 19 ---- src/common/home.js | 11 +-- src/dashboard/dashboard.js | 6 +- src/file/select-file.js | 6 +- src/project/project.js | 6 +- src/project/projects.js | 6 +- src/scenario/scenario-store.js | 37 ------- src/scenario/scenario.js | 9 +- src/scenario/scenarios.js | 6 +- src/simulation/simulation.js | 6 +- src/simulation/simulations.js | 6 +- src/simulationmodel/simulation-model.js | 6 +- src/simulator/simulators.js | 14 +-- src/user/edit-own-user.js | 47 ++++----- src/user/edit-user.js | 4 +- src/user/{user-store.js => login-store.js} | 27 +++--- src/user/login.js | 17 ++-- src/user/user.js | 106 ++++++++++----------- src/user/users-data-manager.js | 21 +++- src/user/users.js | 36 +++---- src/widget/widget.js | 6 +- src/widget/widgets/custom-action.js | 4 +- 23 files changed, 176 insertions(+), 259 deletions(-) rename src/user/{user-store.js => login-store.js} (76%) diff --git a/src/app.js b/src/app.js index 92bb42c..9d2e063 100644 --- a/src/app.js +++ b/src/app.js @@ -31,7 +31,7 @@ import { Hidden } from 'react-grid-system' import AppDispatcher from './common/app-dispatcher'; import ScenarioStore from './scenario/scenario-store'; import SimulatorStore from './simulator/simulator-store'; -import UserStore from './user/user-store'; +import LoginStore from './user/login-store'; import NotificationsDataManager from './common/data-managers/notifications-data-manager'; import Home from './common/home'; @@ -40,12 +40,8 @@ import Footer from './common/footer'; import SidebarMenu from './common/menu-sidebar'; import HeaderMenu from './common/header-menu'; -//import Projects from './project/projects'; -//import Project from './project/project'; import Simulators from './simulator/simulators'; import Dashboard from './dashboard/dashboard'; -//import Simulations from './simulation/simulations'; -//import Simulation from './simulation/simulation'; import Scenarios from './scenario/scenarios'; import Scenario from './scenario/scenario'; import SimulationModel from './simulationmodel/simulation-model'; @@ -57,19 +53,16 @@ import './styles/app.css'; class App extends React.Component { static getStores() { - return [ SimulatorStore, UserStore, ScenarioStore]; + return [ SimulatorStore, LoginStore, ScenarioStore]; } static calculateState(prevState) { - let currentUser = UserStore.getState().currentUser; return { simulators: SimulatorStore.getState(), scenarios: ScenarioStore.getState(), - currentRole: currentUser ? currentUser.role : '', - currentUsername: currentUser ? currentUser.username: '', - currentUserID: UserStore.getState().userid, - token: UserStore.getState().token, + currentUser: LoginStore.getState().currentUser, + token: LoginStore.getState().token, showSidebarMenu: false, }; @@ -77,17 +70,13 @@ class App extends React.Component { componentWillMount() { // if token stored locally, request user - const token = localStorage.getItem('token'); - const userid = localStorage.getItem('userid'); - + let token = localStorage.getItem("token"); + let currentUser = JSON.parse(localStorage.getItem("currentUser")); if (token != null && token !== '') { - // save token so we dont logout - this.setState({ token }); - AppDispatcher.dispatch({ type: 'users/logged-in', token: token, - userid: userid + currentUser: currentUser }); } } @@ -128,7 +117,7 @@ class App extends React.Component { */} - + @@ -139,7 +128,7 @@ class App extends React.Component {
    - +
    diff --git a/src/common/array-store.js b/src/common/array-store.js index 15a13ab..bd18854 100644 --- a/src/common/array-store.js +++ b/src/common/array-store.js @@ -79,14 +79,8 @@ class ArrayStore extends ReduceStore { case this.type + '/loaded': if (Array.isArray(action.data)) { - console.log("####### loaded array of type " + this.type); - //console.log(action.data); - //console.log(state); return this.updateElements(state, action.data); } else { - console.log("####### loaded single object of type " + this.type); - //console.log([action.data]); - //console.log(state); return this.updateElements(state, [action.data]); } @@ -141,22 +135,9 @@ class ArrayStore extends ReduceStore { this.dataManager.update(action.data, action.token,action.param); return state; - case this.type + '/start-own-edit': - this.dataManager.update(action.data, action.token,action.param); - return state; - case this.type + '/edited': return this.updateElements(state, [action.data]); - case this.type + '/confirm-pw-doesnt-match': - const USER_PW_ERROR_NOTIFICATION = { - title: 'The new password does not match', - message: 'Try again', - level: 'error' - }; - NotificationsDataManager.addNotification(USER_PW_ERROR_NOTIFICATION); - return state; - case this.type + '/edit-error': return state; diff --git a/src/common/home.js b/src/common/home.js index 654ea6d..4e889da 100644 --- a/src/common/home.js +++ b/src/common/home.js @@ -26,18 +26,15 @@ import React from 'react'; //import RestAPI from '../api/rest-api'; import config from '../config'; -import UserStore from "../user/user-store"; +import LoginStore from "../user/login-store"; class Home extends React.Component { constructor(props) { super(props); - let currentUser = UserStore.getState().currentUser; this.state = { - currentRole: currentUser ? currentUser.role : '', - currentUsername: currentUser ? currentUser.username: '', - currentUserID: currentUser ? currentUser.id: 0, - token: UserStore.getState().token + currentUser: LoginStore.getState().currentUser, + token: LoginStore.getState().token }; } @@ -64,7 +61,7 @@ class Home extends React.Component { VILLASweb is a frontend for distributed real-time simulation hosted by {config.admin.name}.

    - You are logged in as user {this.state.currentUsername} with ID {this.state.currentUserID} and role {this.state.currentRole}. + You are logged in as user {this.state.currentUser.username} with ID {this.state.currentUser.id} and role {this.state.currentUser.role}.

    {/*

    diff --git a/src/dashboard/dashboard.js b/src/dashboard/dashboard.js index 4999aeb..968f141 100644 --- a/src/dashboard/dashboard.js +++ b/src/dashboard/dashboard.js @@ -34,7 +34,7 @@ import WidgetToolbox from './widget-toolbox'; import WidgetArea from './widget-area'; import DashboardButtonGroup from './dashboard-button-group'; -import UserStore from '../user/user-store'; +import LoginStore from '../user/login-store'; import DashboardStore from './dashboard-store'; import ProjectStore from '../project/project-store'; import SimulationStore from '../simulation/simulation-store'; @@ -49,14 +49,14 @@ class Dashboard extends React.Component { static lastWidgetKey = 0; static getStores() { - return [ DashboardStore, ProjectStore, SimulationStore, SimulationModelStore, FileStore, UserStore, WidgetStore ]; + return [ DashboardStore, ProjectStore, SimulationStore, SimulationModelStore, FileStore, LoginStore, WidgetStore ]; } static calculateState(prevState, props) { if (prevState == null) { prevState = {}; } - const sessionToken = UserStore.getState().token; + const sessionToken = LoginStore.getState().token; let dashboard = Map(); console.log("dashboard calculate state was called: " + props.match.params.dashboard); let dashboards = DashboardStore.getState() diff --git a/src/file/select-file.js b/src/file/select-file.js index fafe98f..8c05cac 100644 --- a/src/file/select-file.js +++ b/src/file/select-file.js @@ -24,19 +24,19 @@ import { Container } from 'flux/utils'; import { FormGroup, FormControl, FormLabel, Button, ProgressBar, Col } from 'react-bootstrap'; import FileStore from './file-store'; -import UserStore from '../user/user-store'; +import LoginStore from '../user/login-store'; import AppDispatcher from '../common/app-dispatcher'; class SelectFile extends React.Component { static getStores() { - return [ FileStore, UserStore ]; + return [ FileStore, LoginStore ]; } static calculateState() { return { files: FileStore.getState(), - sessionToken: UserStore.getState().token, + sessionToken: LoginStore.getState().token, selectedFile: '', uploadFile: null, uploadProgress: 0 diff --git a/src/project/project.js b/src/project/project.js index f6c9530..61bb390 100644 --- a/src/project/project.js +++ b/src/project/project.js @@ -26,7 +26,7 @@ import FileSaver from 'file-saver'; import AppDispatcher from '../common/app-dispatcher'; import ProjectStore from './project-store'; -import UserStore from '../user/user-store'; +import LoginStore from '../user/login-store'; import DashboardStore from '../dashboard/dashboard-store'; import SimulationStore from '../simulation/simulation-store'; @@ -41,14 +41,14 @@ import DeleteDialog from '../common/dialogs/delete-dialog'; class Dashboards extends Component { static getStores() { - return [ ProjectStore, DashboardStore, UserStore, SimulationStore ]; + return [ ProjectStore, DashboardStore, LoginStore, SimulationStore ]; } static calculateState(prevState, props) { prevState = prevState || {}; // load project - const sessionToken = UserStore.getState().token; + const sessionToken = LoginStore.getState().token; let project = ProjectStore.getState().find(project => project._id === props.match.params.project); if (project == null) { diff --git a/src/project/projects.js b/src/project/projects.js index 4aba7cf..389ce1f 100644 --- a/src/project/projects.js +++ b/src/project/projects.js @@ -25,7 +25,7 @@ import { Button } from 'react-bootstrap'; import AppDispatcher from '../common/app-dispatcher'; import ProjectStore from './project-store'; -import UserStore from '../user/user-store'; +import LoginStore from '../user/login-store'; import SimulationStore from '../simulation/simulation-store'; import Icon from '../common/icon'; @@ -38,14 +38,14 @@ import DeleteDialog from '../common/dialogs/delete-dialog'; class Projects extends React.Component { static getStores() { - return [ ProjectStore, SimulationStore, UserStore ]; + return [ ProjectStore, SimulationStore, LoginStore ]; } static calculateState() { return { projects: ProjectStore.getState(), simulations: SimulationStore.getState(), - sessionToken: UserStore.getState().token, + sessionToken: LoginStore.getState().token, newModal: false, editModal: false, diff --git a/src/scenario/scenario-store.js b/src/scenario/scenario-store.js index cd45335..4ab7ae4 100644 --- a/src/scenario/scenario-store.js +++ b/src/scenario/scenario-store.js @@ -22,42 +22,5 @@ import ScenariosDataManager from './scenarios-data-manager'; import ArrayStore from '../common/array-store'; -//import UsersDataManager from "../user/users-data-manager"; -//import SimulatorDataDataManager from "../simulator/simulator-data-data-manager"; -//import AppDispatcher from "../common/app-dispatcher"; export default new ArrayStore('scenarios', ScenariosDataManager); - - -// class ScenariosStore extends ReduceStore { -// constructor() { -// super('scenarios', ScenariosDataManager); -// } -// -// getInitialState() { -// return { -// scenarios: [], -// -// }; -// } -// -// reduce(state, action) { -// switch (action.type) { -// case 'scenarios/load-models': -// // request simulation model data of scenario -// ScenariosDataManager.getSimulationModels(action.token, action.scenarioID); -// -// return Object.assign({}, state, { token: action.token, simulationmodels: action.simulationmodels}); -// -// case 'scenarios/load-dashboards': -// // request dashboard data of scenario -// ScenariosDataManager.getDashboards(action.token, action.scenarioID); -// -// return Object.assign({}, state, { token: action.token, dashboards: action.dashboards}); -// default: -// return state; -// } -// } -// } -// -// export default new ScenariosStore(); diff --git a/src/scenario/scenario.js b/src/scenario/scenario.js index 85fee67..931dc3b 100644 --- a/src/scenario/scenario.js +++ b/src/scenario/scenario.js @@ -29,7 +29,7 @@ import ScenarioStore from './scenario-store'; import SimulatorStore from '../simulator/simulator-store'; import DashboardStore from '../dashboard/dashboard-store'; import SimulationModelStore from '../simulationmodel/simulation-model-store'; -import UserStore from '../user/user-store'; +import LoginStore from '../user/login-store'; import AppDispatcher from '../common/app-dispatcher'; import Icon from '../common/icon'; @@ -44,12 +44,12 @@ import DeleteDialog from '../common/dialogs/delete-dialog'; class Scenario extends React.Component { static getStores() { - return [ ScenarioStore, SimulationModelStore, DashboardStore, SimulatorStore]; + return [ ScenarioStore, SimulationModelStore, DashboardStore, SimulatorStore, LoginStore]; } static calculateState(prevState, props) { // get selected scenario - const sessionToken = UserStore.getState().token; + const sessionToken = LoginStore.getState().token; const scenario = ScenarioStore.getState().find(s => s.id === parseInt(props.match.params.scenario, 10)); if (scenario == null) { @@ -187,7 +187,6 @@ class Scenario extends React.Component { type: 'dashboards/start-add', data, token: this.state.sessionToken, - userid: this.state.sessionUserID }); } } @@ -203,7 +202,6 @@ class Scenario extends React.Component { type: 'dashboards/start-remove', data: this.state.modalDashboardData, token: this.state.sessionToken, - userid: this.state.sessionUserID }); } @@ -215,7 +213,6 @@ class Scenario extends React.Component { type: 'dashboards/start-add', data, token: this.state.sessionToken, - userid: this.state.sessionUserID }); } } diff --git a/src/scenario/scenarios.js b/src/scenario/scenarios.js index 912abe5..2c985d7 100644 --- a/src/scenario/scenarios.js +++ b/src/scenario/scenarios.js @@ -26,7 +26,7 @@ import FileSaver from 'file-saver'; import AppDispatcher from '../common/app-dispatcher'; import ScenarioStore from './scenario-store'; -import UserStore from '../user/user-store'; +import LoginStore from '../user/login-store'; import Icon from '../common/icon'; import Table from '../common/table'; @@ -39,12 +39,12 @@ import DeleteDialog from '../common/dialogs/delete-dialog'; class Scenarios extends Component { static getStores() { - return [ ScenarioStore, UserStore ]; + return [ ScenarioStore, LoginStore ]; } static calculateState() { const scenarios = ScenarioStore.getState(); - const sessionToken = UserStore.getState().token; + const sessionToken = LoginStore.getState().token; console.log(scenarios); return { diff --git a/src/simulation/simulation.js b/src/simulation/simulation.js index db49b0f..6cc3ebf 100644 --- a/src/simulation/simulation.js +++ b/src/simulation/simulation.js @@ -28,7 +28,7 @@ import _ from 'lodash'; import SimulationStore from './simulation-store'; import SimulatorStore from '../simulator/simulator-store'; import SimulationModelStore from '../simulationmodel/simulation-model-store'; -import UserStore from '../user/user-store'; +import LoginStore from '../user/login-store'; import AppDispatcher from '../common/app-dispatcher'; import Icon from '../common/icon'; @@ -41,12 +41,12 @@ import DeleteDialog from '../common/dialogs/delete-dialog'; class Simulation extends React.Component { static getStores() { - return [ SimulationStore, SimulatorStore, SimulationModelStore, UserStore ]; + return [ SimulationStore, SimulatorStore, SimulationModelStore, LoginStore ]; } static calculateState(prevState, props) { // get selected simulation - const sessionToken = UserStore.getState().token; + const sessionToken = LoginStore.getState().token; let simulation = SimulationStore.getState().find(s => s._id === props.match.params.simulation); if (simulation == null) { diff --git a/src/simulation/simulations.js b/src/simulation/simulations.js index c74801c..6a8879d 100644 --- a/src/simulation/simulations.js +++ b/src/simulation/simulations.js @@ -26,7 +26,7 @@ import FileSaver from 'file-saver'; import AppDispatcher from '../common/app-dispatcher'; import SimulationStore from './simulation-store'; -import UserStore from '../user/user-store'; +import LoginStore from '../user/login-store'; import SimulatorStore from '../simulator/simulator-store'; import SimulationModelStore from '../simulationmodel/simulation-model-store'; @@ -42,7 +42,7 @@ import DeleteDialog from '../common/dialogs/delete-dialog'; class Simulations extends Component { static getStores() { - return [ SimulationStore, UserStore, SimulatorStore, SimulationModelStore ]; + return [ SimulationStore, LoginStore, SimulatorStore, SimulationModelStore ]; } static calculateState() { @@ -50,7 +50,7 @@ class Simulations extends Component { const simulationModels = SimulationModelStore.getState(); const simulators = SimulatorStore.getState(); - const sessionToken = UserStore.getState().token; + const sessionToken = LoginStore.getState().token; return { simulations, diff --git a/src/simulationmodel/simulation-model.js b/src/simulationmodel/simulation-model.js index e716191..15ba7ea 100644 --- a/src/simulationmodel/simulation-model.js +++ b/src/simulationmodel/simulation-model.js @@ -24,7 +24,7 @@ import { Container } from 'flux/utils'; import { Button, Col, Form, FormLabel } from 'react-bootstrap'; import SimulationModelStore from './simulation-model-store'; -import UserStore from '../user/user-store'; +import LoginStore from '../user/login-store'; import AppDispatcher from '../common/app-dispatcher'; import SelectSimulator from '../simulator/select-simulator'; @@ -35,7 +35,7 @@ import ParametersEditor from '../common/parameters-editor'; class SimulationModel extends React.Component { static getStores() { - return [ SimulationModelStore, UserStore ]; + return [ SimulationModelStore, LoginStore ]; } static calculateState(prevState, props) { @@ -43,7 +43,7 @@ class SimulationModel extends React.Component { return { simulationModel: simulationModel || {}, - sessionToken: UserStore.getState().token + sessionToken: LoginStore.getState().token }; } diff --git a/src/simulator/simulators.js b/src/simulator/simulators.js index d0d8e4f..354979a 100644 --- a/src/simulator/simulators.js +++ b/src/simulator/simulators.js @@ -27,7 +27,7 @@ import _ from 'lodash'; import AppDispatcher from '../common/app-dispatcher'; import SimulatorStore from './simulator-store'; -import UserStore from '../user/user-store'; +import LoginStore from '../user/login-store'; import Icon from '../common/icon'; import Table from '../common/table'; @@ -41,7 +41,7 @@ import DeleteDialog from '../common/dialogs/delete-dialog'; class Simulators extends Component { static getStores() { - return [ UserStore, SimulatorStore ]; + return [ LoginStore, SimulatorStore ]; } static statePrio(state) { @@ -78,8 +78,7 @@ class Simulators extends Component { }); return { - sessionToken: UserStore.getState().token, - sessionUserID: UserStore.getState().userid, + sessionToken: LoginStore.getState().token, simulators, modalSimulator: {}, deleteModal: false, @@ -92,7 +91,6 @@ class Simulators extends Component { AppDispatcher.dispatch({ type: 'simulators/start-load', token: this.state.sessionToken, - userid: this.state.sessionUserID }); // Start timer for periodic refresh @@ -112,7 +110,6 @@ class Simulators extends Component { AppDispatcher.dispatch({ type: 'simulators/start-load', token: this.state.sessionToken, - userid: this.state.sessionUserID }); } } @@ -126,7 +123,6 @@ class Simulators extends Component { type: 'simulators/start-add', data, token: this.state.sessionToken, - userid: this.state.sessionUserID }); } } @@ -146,7 +142,6 @@ class Simulators extends Component { type: 'simulators/start-edit', data: simulator, token: this.state.sessionToken, - userid: this.state.sessionUserID }); } } @@ -162,7 +157,6 @@ class Simulators extends Component { type: 'simulators/start-remove', data: this.state.modalSimulator, token: this.state.sessionToken, - userid: this.state.sessionUserID }); } @@ -184,7 +178,6 @@ class Simulators extends Component { type: 'simulators/start-add', data, token: this.state.sessionToken, - userid: this.state.sessionUserID }); } } @@ -221,7 +214,6 @@ class Simulators extends Component { simulator: this.state.simulators[index], data: action.data, token: this.state.sessionToken, - userid: this.state.sessionUserID }); } } diff --git a/src/user/edit-own-user.js b/src/user/edit-own-user.js index bb37f50..66f5324 100644 --- a/src/user/edit-own-user.js +++ b/src/user/edit-own-user.js @@ -23,7 +23,7 @@ import React from 'react'; import {FormGroup, FormControl, FormLabel, Col} from 'react-bootstrap'; import Dialog from '../common/dialogs/dialog'; -import UserStore from './user-store'; +//import LoginStore from './login-store'; class EditOwnUserDialog extends React.Component { @@ -34,17 +34,15 @@ class EditOwnUserDialog extends React.Component { this.state = { username: '', - mail: '', - role: '', id: '', + mail: '', password: '', oldPassword: '', - active: '', confirmpassword: '' } } - + onClose(canceled) { if (canceled === false) { @@ -56,18 +54,15 @@ class EditOwnUserDialog extends React.Component { } } - + handleChange(e) { - let user = UserStore.getState().currentUser; this.setState({ [e.target.id]: e.target.value }); // check all controls var username = true; - var role = true; var mail = true; var pw = true; - var active = true; var oldPassword = true; var confirmpassword = true; @@ -75,7 +70,6 @@ class EditOwnUserDialog extends React.Component { username = false; } - if(this.state.mail === ''){ mail = false; } @@ -84,10 +78,6 @@ class EditOwnUserDialog extends React.Component { pw = false; } - if(this.state.active === ''){ - active = false; - } - if(this.state.oldPassword === ''){ oldPassword = false; } @@ -96,23 +86,26 @@ class EditOwnUserDialog extends React.Component { confirmpassword = false; } - - this.setState({ - role: user.role, - id: user.id - }); - // form is valid if any of the fields contain somethig - this.valid = username || role || active || oldPassword || mail || pw || confirmpassword; + /*this.setState({ + role: user.role, + id: user.id, + active: user.active + });*/ + + // form is valid if the following condition is met + this.valid = username || mail || (oldPassword && pw && confirmpassword); } resetState() { this.setState({ - //username: this.props.user.username, - //mail: this.props.user.mail, - role: this.props.user.role, - id: this.props.user.id + username: '', + mail: '', + oldPassword: '', + confirmpassword: '', + password: '', + id: this.props.user.id, }); } @@ -122,12 +115,12 @@ class EditOwnUserDialog extends React.Component { Username - this.handleChange(e)} /> + this.handleChange(e)} /> E-mail - this.handleChange(e)} /> + this.handleChange(e)} /> Old Password diff --git a/src/user/edit-user.js b/src/user/edit-user.js index d60015b..046cd46 100644 --- a/src/user/edit-user.js +++ b/src/user/edit-user.js @@ -113,12 +113,12 @@ class EditUserDialog extends React.Component { Username - this.handleChange(e)} /> + this.handleChange(e)} /> E-mail - this.handleChange(e)} /> + this.handleChange(e)} /> Admin Password diff --git a/src/user/user-store.js b/src/user/login-store.js similarity index 76% rename from src/user/user-store.js rename to src/user/login-store.js index d18e960..b19ba43 100644 --- a/src/user/user-store.js +++ b/src/user/login-store.js @@ -25,17 +25,15 @@ import AppDispatcher from '../common/app-dispatcher'; import UsersDataManager from './users-data-manager'; import SimulatorDataDataManager from '../simulator/simulator-data-data-manager'; -class UserStore extends ReduceStore { +class LoginStore extends ReduceStore { constructor() { super(AppDispatcher); } getInitialState() { return { - users: [], currentUser: null, token: null, - userid: 0, loginMessage: null }; } @@ -49,27 +47,30 @@ class UserStore extends ReduceStore { case 'users/logout': // disconnect from all simulators SimulatorDataDataManager.closeAll(); + //remove token and current user from local storage + localStorage.clear(); // delete user and token return Object.assign({}, state, { token: null, currentUser: null }); case 'users/logged-in': // // request logged-in user data - - UsersDataManager.getCurrentUser(action.token, action.userid); - - return Object.assign({}, state, { token: action.token, userid: action.userid}); + UsersDataManager.getCurrentUser(action.token, action.currentUser.id); + return Object.assign({}, state, { token: action.token, currentUser: action.currentUser}); case 'users/current-user': // // save logged-in user - return Object.assign({}, state, { currentUser: action.user}); + return Object.assign({}, state, { currentUser: action.currentUser}); + + case 'users/start-edit-own-user': + // update the current user + UsersDataManager.updateCurrentUser(action.token, action.data); + return Object.assign({}, state, { token: action.token, currentUser: action.data}); case 'users/reload-current-user': + UsersDataManager.getCurrentUser(action.token, action.currentUser.id); + return Object.assign({}, state, { token: action.token, currentUser: action.currentUser}); - UsersDataManager.getCurrentUser(action.token, action.userid); - - return Object.assign({}, state, { token: action.token, userid: action.userid}); - case 'users/current-user-error': // discard user token return Object.assign({}, state, { currentUser: null, token: null }); @@ -88,4 +89,4 @@ class UserStore extends ReduceStore { } } -export default new UserStore(); +export default new LoginStore(); diff --git a/src/user/login.js b/src/user/login.js index 3f1e3b6..09679b6 100644 --- a/src/user/login.js +++ b/src/user/login.js @@ -31,19 +31,18 @@ import Footer from '../common/footer'; import NotificationsDataManager from '../common/data-managers/notifications-data-manager'; import AppDispatcher from '../common/app-dispatcher'; -import UserStore from './user-store'; +import LoginStore from './login-store'; class Login extends Component { static getStores() { - return [ UserStore ]; + return [ LoginStore ]; } static calculateState() { return { - currentUser: UserStore.getState().currentUser, - token: UserStore.getState().token, - loginMessage: UserStore.getState().loginMessage, - userid: UserStore.getState().userid + currentUser: LoginStore.getState().currentUser, + token: LoginStore.getState().token, + loginMessage: LoginStore.getState().loginMessage, }; } @@ -55,13 +54,13 @@ class Login extends Component { // if token stored locally, request user if (nextState.token == null) { const token = localStorage.getItem('token'); - const userid = localStorage.getItem('userid'); + const currentUser = localStorage.getItem('currentUser'); if (token != null && token !== '' && nextState.currentUser == null) { AppDispatcher.dispatch({ type: 'users/logged-in', token: token, - userid: userid + currentUser: currentUser }); } } else { @@ -69,7 +68,7 @@ class Login extends Component { if (nextState.currentUser != null) { // save login in local storage localStorage.setItem('token', nextState.token); - localStorage.setItem('userid', nextState.userid); + localStorage.setItem('currentUser', JSON.stringify(nextState.currentUser)); } } } diff --git a/src/user/user.js b/src/user/user.js index 773c235..781005b 100644 --- a/src/user/user.js +++ b/src/user/user.js @@ -24,88 +24,78 @@ import { Container } from 'flux/utils'; import {Button, Col, Row} from 'react-bootstrap'; import AppDispatcher from '../common/app-dispatcher'; -import UserStore from './user-store'; +import LoginStore from './login-store'; import UsersStore from './users-store'; import Icon from '../common/icon'; import EditOwnUserDialog from './edit-own-user' +import NotificationsDataManager from "../common/data-managers/notifications-data-manager" class User extends Component { static getStores() { - return [ UserStore, UsersStore ]; + return [ LoginStore, UsersStore ]; } static calculateState(prevState, props) { prevState = prevState || {}; - let sessionToken = UserStore.getState().token; - let user = UserStore.getState().currentUser; - - - if(user === null) { - AppDispatcher.dispatch({ - type: 'users/start-load', - data: UserStore.getState().userid, - token: sessionToken - }); - - user = {}; - } - console.log(user); - console.log("extracted user 2: " + user.username); + let user = LoginStore.getState().currentUser; return { - user, - - token: sessionToken, - newModal: false, + currentUser: user, + token: LoginStore.getState().token, editModal: false, - update: false, - modalData: {} }; } - update(){ - let tokenState = UserStore.getState().token; - setTimeout(function() { - AppDispatcher.dispatch({ - type: 'users/logged-in', - user: this.state.user, - userid: this.state.user.id, - token: tokenState - }); - }.bind(this), 0.00001) - - } - - - closeEditModal(data) { + this.setState({ editModal: false }); - console.log(data); + //this.setState({currentUser: data}); + let updatedData = {}; - if (data) { - if(data.password === data.confirmpassword){ - - AppDispatcher.dispatch({ - type: 'users/start-own-edit', - data: data, - token: this.state.token - }); + + if (data.username !== ''){ + updatedData["id"] = data.id; + updatedData["username"] = data.username; + } + if (data.mail !== ''){ + updatedData["id"] = data.id; + updatedData["mail"] = data.mail; + } + if (data.password !== '' && data.oldPassword !== '' && data.password === data.confirmpassword ){ + updatedData["id"] = data.id; + updatedData["password"] = data.password; + updatedData["oldPassword"] = data.oldPassword; + } else if (data.password !== '' && data.password !== data.confirmpassword) { + const USER_UPDATE_ERROR_NOTIFICATION = { + title: 'Update Error ', + message: 'New password not correctly confirmed', + level: 'error' + }; + NotificationsDataManager.addNotification(USER_UPDATE_ERROR_NOTIFICATION); + return } - else{ + if (updatedData !== {}) { + let requestData = {}; + requestData["user"] = updatedData; + AppDispatcher.dispatch({ - type: 'users/confirm-pw-doesnt-match', - data: data, + type: 'users/start-edit-own-user', + data: requestData, token: this.state.token }); + } else { + const USER_UPDATE_WARNING_NOTIFICATION = { + title: 'Update Warning ', + message: 'No update requested, no input data', + level: 'warning' + }; + NotificationsDataManager.addNotification(USER_UPDATE_WARNING_NOTIFICATION); } - } - this.update(); - } @@ -125,24 +115,24 @@ class User extends Component { Username: - {this.state.user.username} + {this.state.currentUser.username} E-mail: - {this.state.user.mail} + {this.state.currentUser.mail} Role: - {this.state.user.role} + {this.state.currentUser.role} - + - this.closeEditModal(data)} user={this.state.modalData} /> + this.closeEditModal(data)} user={this.state.currentUser} /> diff --git a/src/user/users-data-manager.js b/src/user/users-data-manager.js index 6ce0c7a..96f11dd 100644 --- a/src/user/users-data-manager.js +++ b/src/user/users-data-manager.js @@ -33,8 +33,7 @@ class UsersDataManager extends RestDataManager { AppDispatcher.dispatch({ type: 'users/logged-in', token: response.token, - user: response.user, - userid: response.user.id + currentUser: response.user, }); }).catch(error => { AppDispatcher.dispatch({ @@ -45,10 +44,26 @@ class UsersDataManager extends RestDataManager { } getCurrentUser(token, id) { + console.log("getCurrentUser: ", id); RestAPI.get(this.makeURL('/users/' + id), token).then(response => { AppDispatcher.dispatch({ type: 'users/current-user', - user: response.user + currentUser: response.user + }); + }).catch(error => { + AppDispatcher.dispatch({ + type: 'users/current-user-error', + error: error + }); + }); + } + + updateCurrentUser(token, userUpdate){ + console.log("UpdateCurrentUser", userUpdate.user.id); + RestAPI.put(this.makeURL('/users/' + userUpdate.user.id), userUpdate, token).then( response => { + AppDispatcher.dispatch({ + type: 'users/current-user', + currentUser: response.user }); }).catch(error => { AppDispatcher.dispatch({ diff --git a/src/user/users.js b/src/user/users.js index 1b788a0..47b8d26 100644 --- a/src/user/users.js +++ b/src/user/users.js @@ -24,7 +24,7 @@ import { Container } from 'flux/utils'; import { Button } from 'react-bootstrap'; import AppDispatcher from '../common/app-dispatcher'; -import UserStore from './user-store'; +import LoginStore from './login-store'; import UsersStore from './users-store'; import Icon from '../common/icon'; @@ -34,15 +34,16 @@ import NewUserDialog from './new-user'; import EditUserDialog from './edit-user'; import DeleteDialog from '../common/dialogs/delete-dialog'; +import NotificationsDataManager from "../common/data-managers/notifications-data-manager"; class Users extends Component { static getStores() { - return [ UserStore, UsersStore ]; + return [ LoginStore, UsersStore ]; } static calculateState(prevState, props) { - let tokenState = UserStore.getState().token; + let tokenState = LoginStore.getState().token; // If there is a token available and this method was called as a result of loading users if (!prevState && tokenState) { @@ -93,22 +94,21 @@ class Users extends Component { this.setState({ editModal: false }); if (data) { - if(data.password === data.confirmpassword){ - - AppDispatcher.dispatch({ - type: 'users/start-edit', - data: data, - token: this.state.token - }); - } + if(data.password === data.confirmpassword) { - else{ - AppDispatcher.dispatch({ - type: 'users/confirm-pw-doesnt-match', - data: data, - token: this.state.token - }); - } + AppDispatcher.dispatch({ + type: 'users/start-edit', + data: data, + token: this.state.token + }); + } else{ + const USER_UPDATE_ERROR_NOTIFICATION = { + title: 'Update Error ', + message: 'New password not correctly confirmed', + level: 'error' + }; + NotificationsDataManager.addNotification(USER_UPDATE_ERROR_NOTIFICATION) + } } } diff --git a/src/widget/widget.js b/src/widget/widget.js index 4513cf7..698611c 100644 --- a/src/widget/widget.js +++ b/src/widget/widget.js @@ -23,7 +23,7 @@ import React from 'react'; import { Container } from 'flux/utils'; import AppDispatcher from '../common/app-dispatcher'; -import UserStore from '../user/user-store'; +import LoginStore from '../user/login-store'; import SimulatorDataStore from '../simulator/simulator-data-store'; import SimulationModelStore from '../simulationmodel/simulation-model-store'; import FileStore from '../file/file-store'; @@ -52,7 +52,7 @@ import '../styles/widgets.css'; class Widget extends React.Component { static getStores() { - return [ SimulatorDataStore, SimulationModelStore, FileStore, UserStore ]; + return [ SimulatorDataStore, SimulationModelStore, FileStore, LoginStore ]; } static calculateState(prevState, props) { @@ -73,7 +73,7 @@ class Widget extends React.Component { sequence: prevState != null ? prevState.sequence + 1 : 0, - sessionToken: UserStore.getState().token + sessionToken: LoginStore.getState().token }; } diff --git a/src/widget/widgets/custom-action.js b/src/widget/widgets/custom-action.js index 6571c8f..ceba7d0 100644 --- a/src/widget/widgets/custom-action.js +++ b/src/widget/widgets/custom-action.js @@ -23,7 +23,7 @@ import React, { Component } from 'react'; import { Button } from 'react-bootstrap'; import Icon from '../../common/icon'; -import UserStore from '../../user/user-store'; +import LoginStore from '../../user/login-store'; import SimulatorStore from '../../simulator/simulator-store'; import AppDispatcher from '../../common/app-dispatcher'; @@ -46,7 +46,7 @@ class WidgetCustomAction extends Component { this.setState({ simulator: SimulatorStore.getState().find(s => s._id === props.simulationModel.simulator), - sessionToken: UserStore.getState().token + sessionToken: LoginStore.getState().token }); } From 6a2201a59afe85c9ad1e8f7fe9287a1989447c35 Mon Sep 17 00:00:00 2001 From: Sonja Happ Date: Thu, 28 Nov 2019 16:17:25 +0100 Subject: [PATCH 060/391] Remove logging output and do not load simulator and scenarios upon login since they are loaded in their containers anyway --- src/app.js | 18 +++++++++--------- src/scenario/scenarios.js | 1 - src/user/users-data-manager.js | 2 -- 3 files changed, 9 insertions(+), 12 deletions(-) diff --git a/src/app.js b/src/app.js index 9d2e063..69084f5 100644 --- a/src/app.js +++ b/src/app.js @@ -83,15 +83,15 @@ class App extends React.Component { componentDidMount() { // load all simulators and scenarios to fetch data - AppDispatcher.dispatch({ - type: 'simulators/start-load', - token: this.state.token - }); - - AppDispatcher.dispatch({ - type: 'scenarios/start-load', - token: this.state.token - }); + // AppDispatcher.dispatch({ + // type: 'simulators/start-load', + // token: this.state.token + // }); + // + // AppDispatcher.dispatch({ + // type: 'scenarios/start-load', + // token: this.state.token + // }); NotificationsDataManager.setSystem(this.refs.notificationSystem); } diff --git a/src/scenario/scenarios.js b/src/scenario/scenarios.js index 2c985d7..1cd1e04 100644 --- a/src/scenario/scenarios.js +++ b/src/scenario/scenarios.js @@ -45,7 +45,6 @@ class Scenarios extends Component { static calculateState() { const scenarios = ScenarioStore.getState(); const sessionToken = LoginStore.getState().token; - console.log(scenarios); return { scenarios, diff --git a/src/user/users-data-manager.js b/src/user/users-data-manager.js index 96f11dd..aae60e1 100644 --- a/src/user/users-data-manager.js +++ b/src/user/users-data-manager.js @@ -44,7 +44,6 @@ class UsersDataManager extends RestDataManager { } getCurrentUser(token, id) { - console.log("getCurrentUser: ", id); RestAPI.get(this.makeURL('/users/' + id), token).then(response => { AppDispatcher.dispatch({ type: 'users/current-user', @@ -59,7 +58,6 @@ class UsersDataManager extends RestDataManager { } updateCurrentUser(token, userUpdate){ - console.log("UpdateCurrentUser", userUpdate.user.id); RestAPI.put(this.makeURL('/users/' + userUpdate.user.id), userUpdate, token).then( response => { AppDispatcher.dispatch({ type: 'users/current-user', From 508ad8918e3530c78937e887eb2d28cd29bcad0c Mon Sep 17 00:00:00 2001 From: Laura Fuentes Grau Date: Tue, 3 Dec 2019 13:55:34 +0100 Subject: [PATCH 061/391] wip: widgets are now viewable, to get the needed testdata switch to the example-dashboard branch in the backend --- src/dashboard/dashboard.js | 22 ++++++++++++---------- src/widget/widget.js | 14 ++++++++++---- src/widget/widgets/gauge.js | 2 +- src/widget/widgets/label.js | 4 ++-- src/widget/widgets/slider.js | 21 ++++++++++++++------- 5 files changed, 39 insertions(+), 24 deletions(-) diff --git a/src/dashboard/dashboard.js b/src/dashboard/dashboard.js index 968f141..9bbe661 100644 --- a/src/dashboard/dashboard.js +++ b/src/dashboard/dashboard.js @@ -57,6 +57,7 @@ class Dashboard extends React.Component { prevState = {}; } const sessionToken = LoginStore.getState().token; + let dashboard = Map(); console.log("dashboard calculate state was called: " + props.match.params.dashboard); let dashboards = DashboardStore.getState() @@ -82,7 +83,7 @@ class Dashboard extends React.Component { }); } - let files = FileStore.getState(); + /*let files = FileStore.getState(); if(files.length === 0){ AppDispatcher.dispatch({ @@ -90,7 +91,7 @@ class Dashboard extends React.Component { token: sessionToken, param: '?objectID=1&objectType=widget' }); - } + }*/ console.log("here are the widgets: "); @@ -141,7 +142,7 @@ class Dashboard extends React.Component { */ } let widgets = {}; - + for (let widget of dashboard.get('widgets')) { widgets[Dashboard.lastWidgetKey] = widget; console.log(" the last widgetKey: " + Dashboard.lastWidgetKey); @@ -170,10 +171,10 @@ class Dashboard extends React.Component { sessionToken: sessionToken, projects: null, //ProjectStore.getState(), simulations: null, //SimulationStore.getState(), - files: FileStore.getState(), + files: null, - project: prevState.project || null, - simulation: prevState.simulation || null, + project: null, + simulation: null, simulationModels, editing: prevState.editing || false, paused: prevState.paused || false, @@ -196,19 +197,20 @@ class Dashboard extends React.Component { } //!!!won't work anymore - /* componentDidMount() { + componentWillMount() { //document.addEventListener('keydown', this.handleKeydown.bind(this)); console.log("problem in componentdidmount"); if (this.state.dashboard.has('id') === false) { AppDispatcher.dispatch({ type: 'dashboards/start-load', - data: this.props.match.params.dashboard, - token: this.state.sessionToken + token: this.state.sessionToken, + param: '?scenarioID=1', }); + } } - +/* componentWillUnmount() { //document.removeEventListener('keydown', this.handleKeydown.bind(this)); diff --git a/src/widget/widget.js b/src/widget/widget.js index 698611c..e7b8363 100644 --- a/src/widget/widget.js +++ b/src/widget/widget.js @@ -84,12 +84,14 @@ class Widget extends React.Component { AppDispatcher.dispatch({ type: 'files/start-load', - token: this.state.sessionToken + token: this.state.sessionToken, + param: '?objectID=1&objectType=widget' }); AppDispatcher.dispatch({ type: 'simulationModels/start-load', - token: this.state.sessionToken + token: this.state.sessionToken, + param: '?scenarioID=1' }); } @@ -116,6 +118,8 @@ class Widget extends React.Component { createWidget(widget) { let simulationModel = null; + console.log("createwidget was called"); + console.log(" the widget type is: " + widget.type); for (let model of this.state.simulationModels) { if (model._id !== widget.simulationModel) { continue; @@ -123,7 +127,7 @@ class Widget extends React.Component { simulationModel = model; } - + //all types are lowercase!!! at least slider is if (widget.type === 'CustomAction') { return } else if (widget.type === 'Action') { @@ -147,6 +151,7 @@ class Widget extends React.Component { } else if (widget.type === 'NumberInput') { return this.inputDataChanged(widget, value)} /> } else if (widget.type === 'Slider') { + console.log("inside slider: simulationModel: " + simulationModel); return this.props.onWidgetStatusChange(w, this.props.index) } onInputChanged={value => this.inputDataChanged(widget, value)} /> } else if (widget.type === 'Gauge') { return @@ -160,9 +165,10 @@ class Widget extends React.Component { return null; } - + rn render() { + console.log("!!!render Widget was called"); const element = this.createWidget(this.props.data); if (this.props.editing) { diff --git a/src/widget/widgets/gauge.js b/src/widget/widgets/gauge.js index d1baa50..25cacf6 100644 --- a/src/widget/widgets/gauge.js +++ b/src/widget/widgets/gauge.js @@ -33,7 +33,7 @@ class WidgetGauge extends Component { this.state = { value: 0, minValue: null, - maxValue: null + maxValue: null }; } diff --git a/src/widget/widgets/label.js b/src/widget/widgets/label.js index f53eb18..c9cafdf 100644 --- a/src/widget/widgets/label.js +++ b/src/widget/widgets/label.js @@ -26,8 +26,8 @@ import EditWidgetColorControl from '../edit-widget-color-control'; class WidgetLabel extends Component { render() { const style = { - fontSize: this.props.widget.textSize + 'px', - color: EditWidgetColorControl.ColorPalette[this.props.widget.fontColor] + fontSize: this.props.widget.customProperties.textSize + 'px', + color: EditWidgetColorControl.ColorPalette[this.props.widget.customProperties.fontColor] }; return ( diff --git a/src/widget/widgets/slider.js b/src/widget/widgets/slider.js index 4212eef..d00f9f7 100644 --- a/src/widget/widgets/slider.js +++ b/src/widget/widgets/slider.js @@ -39,19 +39,22 @@ class WidgetSlider extends Component { super(props); this.state = { - unit: '' + unit: 'bla', + }; } componentWillReceiveProps(nextProps) { + console.log("componentwillreceiveprops calle, next props: "); + console.log(nextProps); if (nextProps.simulationModel == null) { return; } // Update value - if (nextProps.widget.default_value && this.state.value === undefined) { + if (nextProps.widget.customProperties.default_value && this.state.value === undefined) { this.setState({ - value: nextProps.widget.default_value, + value: nextProps.widget.customProperties.default_value, }); } @@ -63,7 +66,7 @@ class WidgetSlider extends Component { } // Check if the orientation changed, update the size if it did - if (this.props.widget.orientation !== nextProps.widget.orientation) { + if (this.props.widget.customProperties.orientation !== nextProps.widget.customProperties.orientation) { let baseWidget = nextProps.widget; // Exchange dimensions and constraints @@ -94,11 +97,15 @@ class WidgetSlider extends Component { } render() { - let isVertical = this.props.widget.orientation === WidgetSlider.OrientationTypes.VERTICAL.value; + console.log("render of slider was called"); + console.log(this.props.widget); + console.log("the maxRange is : " + this.props.widget.customProperties.rangeMax); + let isVertical = this.props.widget.customProperties.orientation === WidgetSlider.OrientationTypes.VERTICAL.value; + console.log("this state has the value: " + this.state.value); let fields = { name: this.props.widget.name, - control: this.valueIsChanging(v) } onAfterChange={ (v) => this.valueChanged(v) }/>, + control: this.valueIsChanging(v) } onAfterChange={ (v) => this.valueChanged(v) }/>, value: { format('.3s')(Number.parseFloat(this.state.value)) }, unit: { this.state.unit } } @@ -111,7 +118,7 @@ class WidgetSlider extends Component { }); return ( - this.props.widget.orientation === WidgetSlider.OrientationTypes.HORIZONTAL.value? ( + !isVertical? (

    { fields.control }
    From c662285037a5c55058b7e3b9ee8c1b281e06fb1c Mon Sep 17 00:00:00 2001 From: Laura Fuentes Grau Date: Sun, 8 Dec 2019 19:06:14 +0100 Subject: [PATCH 062/391] wip: cleanup --- src/dashboard/dashboard-button-group.js | 1 + src/dashboard/dashboard.js | 46 ++++++------------------- src/widget/editable-widget-container.js | 1 + src/widget/widget.js | 4 --- src/widget/widgets/slider.js | 7 ---- 5 files changed, 12 insertions(+), 47 deletions(-) diff --git a/src/dashboard/dashboard-button-group.js b/src/dashboard/dashboard-button-group.js index 756a09d..7653ff0 100644 --- a/src/dashboard/dashboard-button-group.js +++ b/src/dashboard/dashboard-button-group.js @@ -26,6 +26,7 @@ import Icon from "../common/icon"; class DashboardButtonGroup extends React.Component { render() { + console.log("DashboardButtonGroup was called"); const buttonStyle = { marginLeft: '8px' }; diff --git a/src/dashboard/dashboard.js b/src/dashboard/dashboard.js index 9bbe661..9569e4d 100644 --- a/src/dashboard/dashboard.js +++ b/src/dashboard/dashboard.js @@ -27,7 +27,7 @@ import { Map } from 'immutable' //import Icon from '../common/icon'; import Widget from '../widget/widget'; -//import EditWidget from '../widget/edit-widget'; +import EditWidget from '../widget/edit-widget'; import WidgetContextMenu from './widget-context-menu'; import WidgetToolbox from './widget-toolbox'; @@ -59,13 +59,11 @@ class Dashboard extends React.Component { const sessionToken = LoginStore.getState().token; let dashboard = Map(); - console.log("dashboard calculate state was called: " + props.match.params.dashboard); let dashboards = DashboardStore.getState() let rawDashboard = dashboards[props.match.params.dashboard - 1]; - let str = JSON.stringify(rawDashboard, null, 4); - console.log(str); + if (rawDashboard != null) { dashboard = Map(rawDashboard); console.log("dashboard: " + dashboard); @@ -83,23 +81,7 @@ class Dashboard extends React.Component { }); } - /*let files = FileStore.getState(); - - if(files.length === 0){ - AppDispatcher.dispatch({ - type: 'files/start-load', - token: sessionToken, - param: '?objectID=1&objectType=widget' - }); - }*/ - - - console.log("here are the widgets: "); - console.log(rawWidgets); - dashboard = dashboard.set('widgets', rawWidgets); - console.log("") - /* for(let widget of dashboard.get('widgets')){ console.log("load files got called") @@ -141,23 +123,21 @@ class Dashboard extends React.Component { }); */ } + let widgets = {}; for (let widget of dashboard.get('widgets')) { widgets[Dashboard.lastWidgetKey] = widget; - console.log(" the last widgetKey: " + Dashboard.lastWidgetKey); Dashboard.lastWidgetKey++; } let maxHeight = Object.keys(widgets).reduce( (maxHeightSoFar, widgetKey) => { - console.log("!! the widget key: "+ widgetKey); let thisWidget = widgets[widgetKey]; let thisWidgetHeight = thisWidget.y + thisWidget.height; return thisWidgetHeight > maxHeightSoFar? thisWidgetHeight : maxHeightSoFar; }, 0); - console.log("now the object keys: "); - console.log(Object.keys(widgets)); + let simulationModels = []; //if (prevState.simulation != null) { // simulationModels = SimulationModelStore.getState().filter(m => prevState.simulation.models.includes(m._id)); @@ -166,7 +146,7 @@ class Dashboard extends React.Component { return { rawDashboard, dashboard, - widgets, + sessionToken: sessionToken, projects: null, //ProjectStore.getState(), @@ -179,7 +159,7 @@ class Dashboard extends React.Component { editing: prevState.editing || false, paused: prevState.paused || false, - //editModal: prevState.editModal || false, + editModal: prevState.editModal || false, modalData: prevState.modalData || null, modalIndex: prevState.modalIndex || null, @@ -199,7 +179,6 @@ class Dashboard extends React.Component { //!!!won't work anymore componentWillMount() { //document.addEventListener('keydown', this.handleKeydown.bind(this)); - console.log("problem in componentdidmount"); if (this.state.dashboard.has('id') === false) { AppDispatcher.dispatch({ type: 'dashboards/start-load', @@ -368,9 +347,9 @@ class Dashboard extends React.Component { } - //editWidget = (widget, index) => { - // this.setState({ editModal: true, modalData: widget, modalIndex: index }); - //} + editWidget = (widget, index) => { + this.setState({ editModal: true, modalData: widget, modalIndex: index }); + } closeEdit = data => { @@ -445,11 +424,7 @@ class Dashboard extends React.Component { render() { const widgets = this.state.dashboard.get('widgets'); - console.log("the widgets in render: "); - console.log(widgets); const grid = this.state.dashboard.get('grid'); - console.log("the grid in render: "+ grid); - const boxClasses = classNames('section', 'box', { 'fullscreen-padding': this.props.isFullscreen }); return
    @@ -495,6 +470,7 @@ class Dashboard extends React.Component { {widgets != null && Object.keys(widgets).map(widgetKey => ( ))} +
    @@ -504,5 +480,3 @@ class Dashboard extends React.Component { let fluxContainerConverter = require('../common/FluxContainerConverter'); export default Fullscreenable()(Container.create(fluxContainerConverter.convert(Dashboard), { withProps: true })); -// -//onEdit={this.startEditing} diff --git a/src/widget/editable-widget-container.js b/src/widget/editable-widget-container.js index db5e828..94944b2 100644 --- a/src/widget/editable-widget-container.js +++ b/src/widget/editable-widget-container.js @@ -88,6 +88,7 @@ class EditableWidgetContainer extends React.Component { render() { const widget = this.props.widget; + console.log("editable-widget-container was called"); const resizing = { bottom: !widget.locked, diff --git a/src/widget/widget.js b/src/widget/widget.js index e7b8363..f6b7f92 100644 --- a/src/widget/widget.js +++ b/src/widget/widget.js @@ -118,8 +118,6 @@ class Widget extends React.Component { createWidget(widget) { let simulationModel = null; - console.log("createwidget was called"); - console.log(" the widget type is: " + widget.type); for (let model of this.state.simulationModels) { if (model._id !== widget.simulationModel) { continue; @@ -151,7 +149,6 @@ class Widget extends React.Component { } else if (widget.type === 'NumberInput') { return this.inputDataChanged(widget, value)} /> } else if (widget.type === 'Slider') { - console.log("inside slider: simulationModel: " + simulationModel); return this.props.onWidgetStatusChange(w, this.props.index) } onInputChanged={value => this.inputDataChanged(widget, value)} /> } else if (widget.type === 'Gauge') { return @@ -168,7 +165,6 @@ class Widget extends React.Component { rn render() { - console.log("!!!render Widget was called"); const element = this.createWidget(this.props.data); if (this.props.editing) { diff --git a/src/widget/widgets/slider.js b/src/widget/widgets/slider.js index d00f9f7..8754752 100644 --- a/src/widget/widgets/slider.js +++ b/src/widget/widgets/slider.js @@ -45,8 +45,6 @@ class WidgetSlider extends Component { } componentWillReceiveProps(nextProps) { - console.log("componentwillreceiveprops calle, next props: "); - console.log(nextProps); if (nextProps.simulationModel == null) { return; } @@ -97,12 +95,7 @@ class WidgetSlider extends Component { } render() { - console.log("render of slider was called"); - console.log(this.props.widget); - console.log("the maxRange is : " + this.props.widget.customProperties.rangeMax); let isVertical = this.props.widget.customProperties.orientation === WidgetSlider.OrientationTypes.VERTICAL.value; - console.log("this state has the value: " + this.state.value); - let fields = { name: this.props.widget.name, control: this.valueIsChanging(v) } onAfterChange={ (v) => this.valueChanged(v) }/>, From 9190cd52e9ba153bba78db6f429f0ddd14efdb70 Mon Sep 17 00:00:00 2001 From: Laura Fuentes Grau Date: Tue, 17 Dec 2019 11:46:14 +0100 Subject: [PATCH 063/391] wip: edit widget panel now viewable --- src/dashboard/dashboard-button-group.js | 1 - src/dashboard/dashboard.js | 57 ++++++++++++-------- src/dashboard/widget-context-menu.js | 20 +++++-- src/widget/edit-widget-color-control.js | 8 +-- src/widget/edit-widget-control-creator.js | 38 ++++++------- src/widget/edit-widget-orientation.js | 2 +- src/widget/edit-widget-signal-control.js | 2 +- src/widget/edit-widget-simulation-control.js | 2 +- src/widget/edit-widget-text-control.js | 2 +- src/widget/edit-widget-text-size-control.js | 2 +- src/widget/edit-widget.js | 6 ++- 11 files changed, 82 insertions(+), 58 deletions(-) diff --git a/src/dashboard/dashboard-button-group.js b/src/dashboard/dashboard-button-group.js index 7653ff0..756a09d 100644 --- a/src/dashboard/dashboard-button-group.js +++ b/src/dashboard/dashboard-button-group.js @@ -26,7 +26,6 @@ import Icon from "../common/icon"; class DashboardButtonGroup extends React.Component { render() { - console.log("DashboardButtonGroup was called"); const buttonStyle = { marginLeft: '8px' }; diff --git a/src/dashboard/dashboard.js b/src/dashboard/dashboard.js index 9569e4d..b8ec62e 100644 --- a/src/dashboard/dashboard.js +++ b/src/dashboard/dashboard.js @@ -19,7 +19,7 @@ * along with VILLASweb. If not, see . ******************************************************************************/ -import React from 'react'; +import React, {Component} from 'react'; import { Container } from 'flux/utils'; import Fullscreenable from 'react-fullscreenable'; import classNames from 'classnames'; @@ -45,8 +45,8 @@ import AppDispatcher from '../common/app-dispatcher'; import 'react-contexify/dist/ReactContexify.min.css'; -class Dashboard extends React.Component { - +class Dashboard extends Component { + static lastWidgetKey = 0; static getStores() { return [ DashboardStore, ProjectStore, SimulationStore, SimulationModelStore, FileStore, LoginStore, WidgetStore ]; @@ -66,7 +66,6 @@ class Dashboard extends React.Component { if (rawDashboard != null) { dashboard = Map(rawDashboard); - console.log("dashboard: " + dashboard); // convert widgets list to a dictionary to be able to reference widgets //let widgets = {}; @@ -159,9 +158,9 @@ class Dashboard extends React.Component { editing: prevState.editing || false, paused: prevState.paused || false, - editModal: prevState.editModal || false, - modalData: prevState.modalData || null, - modalIndex: prevState.modalIndex || null, + editModal: false, + modalData: null, + modalIndex: null, maxWidgetHeight: maxHeight, dropZoneHeight: maxHeight +80, @@ -269,7 +268,6 @@ class Dashboard extends React.Component { } reloadDashboard() { - console.log("Error: reloadDashboard was called"); // select dashboard by param id this.state.dashboards.forEach((tempDashboard) => { if (tempDashboard._id === this.props.match.params.dashboard) { @@ -294,7 +292,7 @@ class Dashboard extends React.Component { }); } - handleDrop = widget => { + handleDrop(widget) { const widgets = this.state.dashboard.get('widgets') || []; const widgetKey = this.getNewWidgetKey(); @@ -347,12 +345,13 @@ class Dashboard extends React.Component { } - editWidget = (widget, index) => { + editWidget(widget, index){ + console.log("dashboard editWidget was called widget: " + widget +" index: " + index); this.setState({ editModal: true, modalData: widget, modalIndex: index }); - } + }; - closeEdit = data => { + closeEdit(data){ if (data == null) { this.setState({ editModal: false }); @@ -368,21 +367,27 @@ class Dashboard extends React.Component { }; - deleteWidget = (widget, index) => { - const widgets = this.state.dashboard.get('widgets'); + deleteWidget(widget, index) { + /*const widgets = this.state.dashboard.get('widgets'); delete widgets[index]; const dashboard = this.state.dashboard.set('widgets'); - this.setState({ dashboard }); + this.setState({ dashboard });*/ + console.log("delete Widget in dashboard was called"); + AppDispatcher.dispatch({ + type: 'widgets/start-remove', + data: widget, + token: this.state.sessionToken + }); }; - startEditing = () => { + startEditing(){ this.setState({ editing: true }); }; - saveEditing = () => { + saveEditing() { // Provide the callback so it can be called when state change is applied // TODO: Check if callback is needed this.setState({ editing: false }, this.saveChanges ); @@ -401,23 +406,23 @@ class Dashboard extends React.Component { }); } - cancelEditing = () => { + cancelEditing() { this.setState({ editing: false, dasboard: {} }); this.reloadDashboard(); }; - setGrid = value => { + setGrid(value) { const dashboard = this.state.dashboard.set('grid', value); this.setState({ dashboard }); }; - pauseData = () => { + pauseData(){ this.setState({ paused: true }); }; - unpauseData = () => { + unpauseData() { this.setState({ paused: false }); }; @@ -463,13 +468,21 @@ class Dashboard extends React.Component { grid={grid} paused={this.state.paused} /> + ))} {/* TODO: Create only one context menu for all widgets */} {widgets != null && Object.keys(widgets).map(widgetKey => ( - + ))} + diff --git a/src/dashboard/widget-context-menu.js b/src/dashboard/widget-context-menu.js index 9276d3c..c1cd082 100644 --- a/src/dashboard/widget-context-menu.js +++ b/src/dashboard/widget-context-menu.js @@ -21,7 +21,7 @@ import React from 'react'; import PropTypes from 'prop-types'; -import { Menu, Item, Separator } from 'react-contexify'; +import { Menu, Item, Separator, MenuProvider } from 'react-contexify'; class WidgetContextMenu extends React.Component { editWidget = event => { @@ -32,6 +32,7 @@ class WidgetContextMenu extends React.Component { deleteWidget = event => { if (this.props.onDelete != null) { + console.log("deleteWIget in wcm was called"); this.props.onDelete(this.props.widget, this.props.index); } }; @@ -91,9 +92,10 @@ class WidgetContextMenu extends React.Component { }; render() { + const isLocked = this.props.widget.locked; - - return + const ContextMenu = () => ( + Edit Delete @@ -108,14 +110,22 @@ class WidgetContextMenu extends React.Component { Lock Unlock - ; + + ); + + return
    + + {"Widget " + this.props.widget.name} + + +
    } } WidgetContextMenu.propTypes = { index: PropTypes.number.isRequired, widget: PropTypes.object.isRequired, - onEdit: PropTypes.func, + onEdit: PropTypes.func.isRequired, onDelete: PropTypes.func, onChange: PropTypes.func }; diff --git a/src/widget/edit-widget-color-control.js b/src/widget/edit-widget-color-control.js index b54b666..8ec2bd3 100644 --- a/src/widget/edit-widget-color-control.js +++ b/src/widget/edit-widget-color-control.js @@ -53,14 +53,14 @@ class EditWidgetColorControl extends Component { } render() { - + console.log("edit widgetcolorcontrol was called"); return ( - + - + { this.props.label } - + { EditWidgetColorControl.ColorPalette.map( (color, idx ) => { let colorStyle = { diff --git a/src/widget/edit-widget-control-creator.js b/src/widget/edit-widget-control-creator.js index fdce7e5..f435085 100644 --- a/src/widget/edit-widget-control-creator.js +++ b/src/widget/edit-widget-control-creator.js @@ -38,13 +38,13 @@ import EditWidgetMinMaxControl from './edit-widget-min-max-control'; import EditWidgetHTMLContent from './edit-widget-html-content'; import EditWidgetParametersControl from './edit-widget-parameters-control'; -export default function createControls(widgetType = null, widget = null, sessionToken = null, files = null, validateForm, simulationModels, handleChange) { +export default function CreateControls(widgetType = null, widget = null, sessionToken = null, files = null, validateForm, simulationModels, handleChange) { // Use a list to concatenate the controls according to the widget type - var dialogControls = []; + var DialogControls = []; switch(widgetType) { case 'CustomAction': - dialogControls.push( + DialogControls.push( validateForm(id)} handleChange={e => handleChange(e)} />, validateForm(id)} handleChange={e => handleChange(e)} />, validateForm(id)} simulationModels={simulationModels} handleChange={(e) => handleChange(e)} />, @@ -52,7 +52,7 @@ export default function createControls(widgetType = null, widget = null, session ) break; case 'Action': - dialogControls.push( + DialogControls.push( validateForm(id)} simulationModels={simulationModels} handleChange={(e) => handleChange(e)} /> ) break; @@ -60,7 +60,7 @@ export default function createControls(widgetType = null, widget = null, session let valueBoundOnChange = (e) => { handleChange([e, {target: {id: 'signal', value: 0}}]); } - dialogControls.push( + DialogControls.push( validateForm(id)} handleChange={e => handleChange(e)} />, validateForm(id)} simulationModels={simulationModels} handleChange={(e) => valueBoundOnChange(e)} />, validateForm(id)} simulationModels={simulationModels} handleChange={(e) => handleChange(e)} />, @@ -72,7 +72,7 @@ export default function createControls(widgetType = null, widget = null, session let lampBoundOnChange = (e) => { handleChange([e, {target: {id: 'signal', value: 0}}]); } - dialogControls.push( + DialogControls.push( validateForm(id)} simulationModels={simulationModels} handleChange={(e) => lampBoundOnChange(e)} />, validateForm(id)} simulationModels={simulationModels} handleChange={(e) => handleChange(e)} />, validateForm(id)} handleChange={e => handleChange(e)} />, @@ -84,7 +84,7 @@ export default function createControls(widgetType = null, widget = null, session let plotBoundOnChange = (e) => { handleChange([e, {target: {id: 'signals', value: []}}]); } - dialogControls.push( + DialogControls.push( validateForm(id)} simulationModels={simulationModels} handleChange={(e) => handleChange(e)} />, validateForm(id)} simulationModels={simulationModels} handleChange={(e) => plotBoundOnChange(e)} />, validateForm(id)} simulationModels={simulationModels} handleChange={(e) => handleChange(e)} />, @@ -93,7 +93,7 @@ export default function createControls(widgetType = null, widget = null, session ); break; case 'Table': - dialogControls.push( + DialogControls.push( validateForm(id)} simulationModels={simulationModels} handleChange={(e) => handleChange(e)} />, handleChange(e)} /> ); @@ -101,7 +101,7 @@ export default function createControls(widgetType = null, widget = null, session case 'Image': // Restrict to only image file types (MIME) let imageControlFiles = files == null? [] : files.filter(file => file.type.includes('image')); - dialogControls.push( + DialogControls.push( validateForm(id)} simulationModels={simulationModels} handleChange={(e) => handleChange(e)} />, handleChange(e)} /> ); @@ -110,7 +110,7 @@ export default function createControls(widgetType = null, widget = null, session let gaugeBoundOnChange = (e) => { handleChange([e, {target: {id: 'signal', value: ''}}]); } - dialogControls.push( + DialogControls.push( validateForm(id)} handleChange={e => handleChange(e)} />, validateForm(id)} simulationModels={simulationModels} handleChange={(e) => gaugeBoundOnChange(e) } />, validateForm(id)} simulationModels={simulationModels} handleChange={(e) => handleChange(e)} />, @@ -123,7 +123,7 @@ export default function createControls(widgetType = null, widget = null, session let plotTableBoundOnChange = (e) => { handleChange([e, {target: {id: 'preselectedSignals', value: []}}]); } - dialogControls.push( + DialogControls.push( validateForm(id)} simulationModels={simulationModels} handleChange={(e) => plotTableBoundOnChange(e)} />, validateForm(id)} simulationModels={simulationModels} handleChange={(e) => handleChange(e)} />, handleChange(e)} />, @@ -132,7 +132,7 @@ export default function createControls(widgetType = null, widget = null, session ); break; case 'Slider': - dialogControls.push( + DialogControls.push( handleChange(e)} validate={id => validateForm(id)} />, validateForm(id)} simulationModels={simulationModels} handleChange={(e) => handleChange(e)} />, validateForm(id)} simulationModels={simulationModels} handleChange={(e) => handleChange(e)} />, @@ -148,7 +148,7 @@ export default function createControls(widgetType = null, widget = null, session let buttonBoundOnChange = (e) => { handleChange([e, {target: {id: 'signal', value: 0}}]); } - dialogControls.push( + DialogControls.push( handleChange(e)} validate={id => validateForm(id)} />, validateForm(id)} simulationModels={simulationModels} handleChange={(e) => buttonBoundOnChange(e)} />, validateForm(id)} simulationModels={simulationModels} handleChange={(e) => handleChange(e)} />, @@ -158,27 +158,27 @@ export default function createControls(widgetType = null, widget = null, session ); break; case 'Box': - dialogControls.push( + DialogControls.push( validateForm(id)} handleChange={(e) => handleChange(e)} />, handleChange(e)} /> ); break; case 'Label': - dialogControls.push( + DialogControls.push( handleChange(e)} validate={id => validateForm(id)} />, handleChange(e)} />, handleChange(e)} /> ); break; case 'HTML': - dialogControls.push( + DialogControls.push( handleChange(e)} /> ); break; case 'Topology': // Restrict to only xml files (MIME) let topologyControlFiles = files == null? [] : files.filter( file => file.type.includes('xml')); - dialogControls.push( + DialogControls.push( validateForm(id)} simulationModels={simulationModels} handleChange={(e) => handleChange(e)} /> ); break; @@ -187,7 +187,7 @@ export default function createControls(widgetType = null, widget = null, session let inputBoundOnChange = (e) => { handleChange([e, {target: {id: 'signal', value: 0}}]); } - dialogControls.push( + DialogControls.push( validateForm(id)} handleChange={e => handleChange(e)} />, validateForm(id)} simulationModels={simulationModels} handleChange={(e) => inputBoundOnChange(e)} />, validateForm(id)} simulationModels={simulationModels} handleChange={(e) => handleChange(e)} /> @@ -198,5 +198,5 @@ export default function createControls(widgetType = null, widget = null, session console.log('Non-valid widget type: ' + widgetType); } - return dialogControls; + return DialogControls; } diff --git a/src/widget/edit-widget-orientation.js b/src/widget/edit-widget-orientation.js index 88ee57c..41503ba 100644 --- a/src/widget/edit-widget-orientation.js +++ b/src/widget/edit-widget-orientation.js @@ -48,7 +48,7 @@ class EditWidgetOrientation extends Component { return ( - + Orientation diff --git a/src/widget/edit-widget-signal-control.js b/src/widget/edit-widget-signal-control.js index 05f3710..9591470 100644 --- a/src/widget/edit-widget-signal-control.js +++ b/src/widget/edit-widget-signal-control.js @@ -54,7 +54,7 @@ class EditWidgetSignalControl extends Component { return ( Signal - this.props.handleChange(e)}> + this.props.handleChange(e)}> { signalsToRender.length === 0 ? ( diff --git a/src/widget/edit-widget-simulation-control.js b/src/widget/edit-widget-simulation-control.js index c9ca495..a988b39 100644 --- a/src/widget/edit-widget-simulation-control.js +++ b/src/widget/edit-widget-simulation-control.js @@ -42,7 +42,7 @@ class EditWidgetSimulationControl extends Component { return ( Simulation Model - this.props.handleChange(e)}> + this.props.handleChange(e)}> { this.props.simulationModels.length === 0 ? ( diff --git a/src/widget/edit-widget-text-control.js b/src/widget/edit-widget-text-control.js index bbac6d2..c94887f 100644 --- a/src/widget/edit-widget-text-control.js +++ b/src/widget/edit-widget-text-control.js @@ -38,7 +38,7 @@ class EditWidgetTextControl extends Component { render() { return ( - + {this.props.label} this.props.handleChange(e)} /> diff --git a/src/widget/edit-widget-text-size-control.js b/src/widget/edit-widget-text-size-control.js index 655cdf5..949b1dd 100644 --- a/src/widget/edit-widget-text-size-control.js +++ b/src/widget/edit-widget-text-size-control.js @@ -29,7 +29,7 @@ class EditWidgetTextSizeControl extends React.Component { return ( Text size - this.props.handleChange(e)}> + this.props.handleChange(e)}> {sizes.map((size, index) => ( ))} diff --git a/src/widget/edit-widget.js b/src/widget/edit-widget.js index 051feae..d78069d 100644 --- a/src/widget/edit-widget.js +++ b/src/widget/edit-widget.js @@ -24,10 +24,11 @@ import React from 'react'; import Dialog from '../common/dialogs/dialog'; -import createControls from './edit-widget-control-creator'; +import CreateControls from './edit-widget-control-creator'; class EditWidgetDialog extends React.Component { valid = true; + constructor(props) { super(props); @@ -121,9 +122,10 @@ class EditWidgetDialog extends React.Component { } render() { + console.log("####edit widget render was called"); let controls = null; if (this.props.widget) { - controls = createControls( + controls = CreateControls( this.props.widget.type, this.state.temporal, this.props.sessionToken, From 2f6a6851c4bdea261b1c503b71f5108f01f72b8c Mon Sep 17 00:00:00 2001 From: Laura Fuentes Grau Date: Thu, 26 Dec 2019 18:37:28 +0100 Subject: [PATCH 064/391] wip: make widgets editable --- src/dashboard/dashboard-button-group.js | 6 +- src/dashboard/dashboard.js | 72 ++++++++----- src/widget/edit-widget-min-max-control.js | 2 + src/widget/edit-widget-number-control.js | 2 +- src/widget/edit-widget-signal-control.js | 2 +- src/widget/edit-widget-simulation-control.js | 4 +- src/widget/edit-widget.js | 21 +++- src/widget/editable-widget-container.js | 8 +- src/widget/widget-container.js | 2 +- src/widget/widget-factory.js | 103 ++++++++++--------- src/widget/widget.js | 2 +- src/widget/widgets/box.js | 6 +- src/widget/widgets/label.js | 2 + 13 files changed, 137 insertions(+), 95 deletions(-) diff --git a/src/dashboard/dashboard-button-group.js b/src/dashboard/dashboard-button-group.js index 756a09d..04163f0 100644 --- a/src/dashboard/dashboard-button-group.js +++ b/src/dashboard/dashboard-button-group.js @@ -41,11 +41,11 @@ class DashboardButtonGroup extends React.Component { buttons.push( , ); } else { @@ -77,7 +77,7 @@ class DashboardButtonGroup extends React.Component { buttons.push( ); } diff --git a/src/dashboard/dashboard.js b/src/dashboard/dashboard.js index b8ec62e..e45c5ad 100644 --- a/src/dashboard/dashboard.js +++ b/src/dashboard/dashboard.js @@ -188,13 +188,13 @@ class Dashboard extends Component { } } -/* +/* componentWillUnmount() { //document.removeEventListener('keydown', this.handleKeydown.bind(this)); } - /*componentDidUpdate() { + componentDidUpdate() { if (this.state.dashboard._id !== this.props.match.params.dashboard) { this.reloadDashboard(); } @@ -224,9 +224,9 @@ class Dashboard extends Component { } }); } - }* + } */ - /*handleKeydown(e) { + handleKeydown(e) { switch (e.key) { case ' ': case 'p': @@ -242,7 +242,7 @@ class Dashboard extends Component { } } - } + /* * Adapt the area's height with the position of the new widget. * Return true if the height increased, otherwise false. @@ -293,16 +293,25 @@ class Dashboard extends Component { } handleDrop(widget) { - const widgets = this.state.dashboard.get('widgets') || []; - const widgetKey = this.getNewWidgetKey(); + widget.dashboardID = this.state.dashboard.id; + + AppDispatcher.dispatch({ + type: 'widgets/start-add', + token: this.state.sessionToken, + data: widget + }); + /*let widgets = []; + widgets = this.state.dashboard.get('widgets'); + + const widgetKey = Dashboard.getNewWidgetKey(); widgets[widgetKey] = widget; - const dashboard = this.state.dashboard.set('widgets'); + const dashboard = this.state.dashboard.set('widgets',widgets); // this.increaseHeightWithWidget(widget); - this.setState({ dashboard }); + this.setState({ dashboard });*/ }; @@ -311,7 +320,7 @@ class Dashboard extends Component { this.widgetChange(updated_widget, key, this.saveChanges); } - widgetChange = (widget, index, callback = null) => { + widgetChange(widget, index, callback = null){ const widgets = this.state.dashboard.get('widgets'); widgets[index] = widget; @@ -352,18 +361,21 @@ class Dashboard extends Component { closeEdit(data){ + console.log("dashboard close edit was called: "); + console.log(data); if (data == null) { this.setState({ editModal: false }); return; } - const widgets = this.state.dashboard.get('widgets'); - widgets[this.state.modalIndex] = data; + AppDispatcher.dispatch({ + type: 'widgets/start-edit', + token: this.state.sessionToken, + data: data + }); - const dashboard = this.state.dashboard.set('widgets', widgets); - - this.setState({ editModal: false, dashboard }); + this.setState({ editModal: false }); }; @@ -390,7 +402,7 @@ class Dashboard extends Component { saveEditing() { // Provide the callback so it can be called when state change is applied // TODO: Check if callback is needed - this.setState({ editing: false }, this.saveChanges ); + this.setState({ editing: false }); }; saveChanges() { @@ -407,9 +419,8 @@ class Dashboard extends Component { } cancelEditing() { - this.setState({ editing: false, dasboard: {} }); + this.setState({ editing: false }); - this.reloadDashboard(); }; setGrid(value) { @@ -440,29 +451,30 @@ class Dashboard extends Component {
    e.preventDefault() }> {this.state.editing && - + } - + {widgets != null && Object.keys(widgets).map(widgetKey => ( this.widgetChange(w, k)} - onWidgetStatusChange={(w, k) => this.widgetStatusChange(w, k)} + onWidgetChange={this.widgetChange.bind(this)} + onWidgetStatusChange={this.widgetStatusChange.bind(this)} editing={this.state.editing} index={widgetKey} grid={grid} @@ -480,16 +492,20 @@ class Dashboard extends Component { widget={widgets[widgetKey]} onEdit={this.editWidget.bind(this)} onDelete={this.deleteWidget.bind(this)} - onChange={this.widgetChange} /> + onChange={this.widgetChange.bind(this)} /> ))} - +
    ; } } +/* +onWidgetChange={(w, k) => this.widgetChange(w, k)} +onWidgetStatusChange={(w, k) => this.widgetStatusChange(w, k)} +*/ let fluxContainerConverter = require('../common/FluxContainerConverter'); export default Fullscreenable()(Container.create(fluxContainerConverter.convert(Dashboard), { withProps: true })); diff --git a/src/widget/edit-widget-min-max-control.js b/src/widget/edit-widget-min-max-control.js index a09ae77..c717f55 100644 --- a/src/widget/edit-widget-min-max-control.js +++ b/src/widget/edit-widget-min-max-control.js @@ -41,6 +41,8 @@ class EditWidgetMinMaxControl extends React.Component { } render() { + console.log("in minmax control, widget: "); + console.log(this.state.widget); return {this.props.label} this.props.handleChange(e)}>Enable min-max diff --git a/src/widget/edit-widget-number-control.js b/src/widget/edit-widget-number-control.js index 378d724..0328333 100644 --- a/src/widget/edit-widget-number-control.js +++ b/src/widget/edit-widget-number-control.js @@ -40,7 +40,7 @@ class EditWidgetNumberControl extends Component { return ( {this.props.label} - this.props.handleChange(e)} /> + this.props.handleChange(e)} /> ); } diff --git a/src/widget/edit-widget-signal-control.js b/src/widget/edit-widget-signal-control.js index 9591470..18a180f 100644 --- a/src/widget/edit-widget-signal-control.js +++ b/src/widget/edit-widget-signal-control.js @@ -54,7 +54,7 @@ class EditWidgetSignalControl extends Component { return ( Signal - this.props.handleChange(e)}> + this.props.handleChange(e)}> { signalsToRender.length === 0 ? ( diff --git a/src/widget/edit-widget-simulation-control.js b/src/widget/edit-widget-simulation-control.js index a988b39..e6d88ee 100644 --- a/src/widget/edit-widget-simulation-control.js +++ b/src/widget/edit-widget-simulation-control.js @@ -39,10 +39,12 @@ class EditWidgetSimulationControl extends Component { } render() { + console.log("editwidgetsimulationcontrol was called"); + console.log(this.state.widget); return ( Simulation Model - this.props.handleChange(e)}> + this.props.handleChange(e)}> { this.props.simulationModels.length === 0 ? ( diff --git a/src/widget/edit-widget.js b/src/widget/edit-widget.js index d78069d..8b19af0 100644 --- a/src/widget/edit-widget.js +++ b/src/widget/edit-widget.js @@ -42,7 +42,11 @@ class EditWidgetDialog extends React.Component { }; } + + onClose(canceled) { + console.log("in editWidget. the temporal state: "); + console.log(this.state.temporal); if (canceled === false) { if (this.valid) { this.props.onClose(this.state.temporal); @@ -66,8 +70,11 @@ class EditWidgetDialog extends React.Component { handleChange(e) { if (e.constructor === Array) { // Every property in the array will be updated + console.log("####its an array!"); let changes = e.reduce( (changesObject, event) => { changesObject[event.target.id] = event.target.value; + console.log("hier ist changes object: "); + console.log(changesObject); return changesObject; }, {}); @@ -96,8 +103,20 @@ class EditWidgetDialog extends React.Component { } else { changeObject[e.target.id] = e.target.value; } + console.log("this.state.temporal is: "); + console.log(this.state.temporal); + console.log("the event target id: " + e.target.id); + console.log("the value is: " + e.target.value) + console.log("change Object is: "); + console.log(changeObject); - this.setState({ temporal: Object.assign({}, this.state.temporal, changeObject ) }); + let finalChange = this.state.temporal; + + finalChange.customProperties[e.target.id] = changeObject[e.target.id]; + + + + this.setState({ temporal: finalChange}); } } diff --git a/src/widget/editable-widget-container.js b/src/widget/editable-widget-container.js index 94944b2..3fcddf0 100644 --- a/src/widget/editable-widget-container.js +++ b/src/widget/editable-widget-container.js @@ -23,7 +23,7 @@ import React from 'react'; import PropTypes from 'prop-types'; import classNames from 'classnames'; import { Rnd } from 'react-rnd'; -import { contextMenu } from 'react-contexify'; +import { Menu } from 'react-contexify'; class EditableWidgetContainer extends React.Component { constructor(props) { @@ -122,13 +122,13 @@ class EditableWidgetContainer extends React.Component { onDragStop={this.dragStop} dragGrid={gridArray} resizeGrid={gridArray} - zIndex={widget.z} + zindex={widget.z} enableResizing={resizing} disableDragging={widget.locked} > - + {this.props.children} - + ; } } diff --git a/src/widget/widget-container.js b/src/widget/widget-container.js index 4aa62a5..b5258ff 100644 --- a/src/widget/widget-container.js +++ b/src/widget/widget-container.js @@ -29,7 +29,7 @@ class WidgetContainer extends React.Component { height: Number(this.props.widget.height), left: Number(this.props.widget.x), top: Number(this.props.widget.y), - zIndex: Number(this.props.widget.z), + zindex: Number(this.props.widget.z), position: 'absolute' }; diff --git a/src/widget/widget-factory.js b/src/widget/widget-factory.js index 4ab6731..b131e2d 100644 --- a/src/widget/widget-factory.js +++ b/src/widget/widget-factory.js @@ -35,13 +35,14 @@ class WidgetFactory { x: position.x, y: position.y, z: position.z, - locked: false + locked: false, + customProperties: {} }; // set type specific properties switch(type) { case 'CustomAction': - widget.actions = [ + widget.customProperties.actions = [ { action: 'stop' }, @@ -56,51 +57,51 @@ class WidgetFactory { } ]; widget.name = 'Action'; - widget.icon = 'star'; + widget.customProperties.icon = 'star'; widget.width = 100; widget.height = 50; - widget.simulationModel = defaultSimulationModel; + widget.customProperties.simulationModel = defaultSimulationModel; break; case 'Action': - widget.simulationModel = defaultSimulationModel; + widget.customProperties.simulationModel = defaultSimulationModel; break; case 'Lamp': - widget.simulationModel = defaultSimulationModel; - widget.signal = 0; + widget.customProperties.simulationModel = defaultSimulationModel; + widget.customProperties.signal = 0; widget.minWidth = 5; widget.minHeight = 5; widget.width = 20; widget.height = 20; - widget.on_color = 6; - widget.off_color = 8; - widget.threshold = 0.5; + widget.customProperties.on_color = 6; + widget.customProperties.off_color = 8; + widget.customProperties.threshold = 0.5; break; case 'Value': - widget.simulationModel = defaultSimulationModel; - widget.signal = 0; + widget.customProperties.simulationModel = defaultSimulationModel; + widget.customProperties.signal = 0; widget.minWidth = 70; widget.minHeight = 20; widget.width = 120; widget.height = 30; - widget.textSize = 16; + widget.customProperties.textSize = 16; widget.name = 'Value'; - widget.showUnit = false; + widget.customProperties.showUnit = false; break; case 'Plot': - widget.simulationModel = defaultSimulationModel; - widget.signals = [ 0 ]; - widget.ylabel = ''; - widget.time = 60; + widget.customProperties.simulationModel = defaultSimulationModel; + widget.customProperties.signals = [ 0 ]; + widget.customProperties.ylabel = ''; + widget.customProperties.time = 60; widget.minWidth = 400; widget.minHeight = 200; widget.width = 400; widget.height = 200; - widget.yMin = 0; - widget.yMax = 10; - widget.yUseMinMax = false; + widget.customProperties.yMin = 0; + widget.customProperties.yMax = 10; + widget.customProperties.yUseMinMax = false; break; case 'Table': - widget.simulationModel = defaultSimulationModel; + widget.customProperties.simulationModel = defaultSimulationModel; widget.minWidth = 200; widget.width = 300; widget.height = 200; @@ -111,80 +112,80 @@ class WidgetFactory { widget.width = 100; widget.height = 35; widget.name = 'Label'; - widget.textSize = 32; - widget.fontColor = 0; + widget.customProperties.textSize = 32; + widget.customProperties.fontColor = 0; break; case 'PlotTable': - widget.simulationModel = defaultSimulationModel; - widget.preselectedSignals = []; - widget.signals = []; // initialize selected signals - widget.ylabel = ''; + widget.customProperties.simulationModel = defaultSimulationModel; + widget.customProperties.preselectedSignals = []; + widget.customProperties.signals = []; // initialize selected signals + widget.customProperties.ylabel = ''; widget.minWidth = 200; widget.minHeight = 100; widget.width = 600; widget.height = 300; - widget.time = 60; - widget.yMin = 0; - widget.yMax = 10; - widget.yUseMinMax = false; + widget.customProperties.time = 60; + widget.customProperties.yMin = 0; + widget.customProperties.yMax = 10; + widget.customProperties.yUseMinMax = false; break; case 'Image': widget.minWidth = 20; widget.minHeight = 20; widget.width = 200; widget.height = 200; - widget.lockAspect = true; + widget.customProperties.lockAspect = true; break; case 'Button': widget.minWidth = 100; widget.minHeight = 50; widget.width = 100; widget.height = 100; - widget.background_color = 1; - widget.font_color = 0; - widget.simulationModel = defaultSimulationModel; - widget.signal = 0; + widget.customProperties.background_color = 1; + widget.customProperties.font_color = 0; + widget.customProperties.simulationModel = defaultSimulationModel; + widget.customProperties.signal = 0; break; case 'Input': widget.minWidth = 200; widget.minHeight = 50; widget.width = 200; widget.height = 50; - widget.simulationModel = defaultSimulationModel; - widget.signal = 0; + widget.customProperties.simulationModel = defaultSimulationModel; + widget.customProperties.signal = 0; break; case 'Slider': widget.minWidth = 380; widget.minHeight = 30; widget.width = 400; widget.height = 50; - widget.orientation = WidgetSlider.OrientationTypes.HORIZONTAL.value; // Assign default orientation - widget.simulationModel = defaultSimulationModel; - widget.signal = 0; + widget.customProperties.orientation = WidgetSlider.OrientationTypes.HORIZONTAL.value; // Assign default orientation + widget.customProperties.simulationModel = defaultSimulationModel; + widget.customProperties.signal = 0; break; case 'Gauge': - widget.simulationModel = defaultSimulationModel; - widget.signal = 0; + widget.customProperties.simulationModel = defaultSimulationModel; + widget.customProperties.signal = 0; widget.minWidth = 100; widget.minHeight = 150; widget.width = 150; widget.height = 150; - widget.colorZones = false; - widget.zones = []; - widget.valueMin = 0; - widget.valueMax = 1; - widget.valueUseMinMax = false; + widget.customProperties.colorZones = false; + widget.customProperties.zones = []; + widget.customProperties.valueMin = 0; + widget.customProperties.valueMax = 1; + widget.customProperties.valueUseMinMax = false; break; case 'Box': widget.minWidth = 50; widget.minHeight = 50; widget.width = 100; widget.height = 100; - widget.border_color = 0; + widget.customProperties.border_color = 0; widget.z = 0; break; case 'HTML': - widget.content = 'Hello World'; + widget.customProperties.content = 'Hello World'; break; case 'Topology': widget.width = 600; diff --git a/src/widget/widget.js b/src/widget/widget.js index f6b7f92..e9c3f2c 100644 --- a/src/widget/widget.js +++ b/src/widget/widget.js @@ -168,7 +168,7 @@ class Widget extends React.Component { const element = this.createWidget(this.props.data); if (this.props.editing) { - return + return {element} ; } diff --git a/src/widget/widgets/box.js b/src/widget/widgets/box.js index 69539ab..db06848 100644 --- a/src/widget/widgets/box.js +++ b/src/widget/widgets/box.js @@ -30,9 +30,9 @@ class WidgetBox extends Component { let colors = EditWidgetColorControl.ColorPalette; let colorStyle = { - borderColor: colors[this.props.widget.border_color], - backgroundColor: colors[this.props.widget.background_color], - opacity: this.props.widget.background_color_opacity + borderColor: colors[this.props.widget.customProperties.border_color], + backgroundColor: colors[this.props.widget.customProperties.background_color], + opacity: this.props.widget.customProperties.background_color_opacity } return ( diff --git a/src/widget/widgets/label.js b/src/widget/widgets/label.js index c9cafdf..68a2ee0 100644 --- a/src/widget/widgets/label.js +++ b/src/widget/widgets/label.js @@ -25,6 +25,8 @@ import EditWidgetColorControl from '../edit-widget-color-control'; class WidgetLabel extends Component { render() { + console.log("here is the label; "); + console.log(this.props.widget); const style = { fontSize: this.props.widget.customProperties.textSize + 'px', color: EditWidgetColorControl.ColorPalette[this.props.widget.customProperties.fontColor] From 7fcbe737963ca3f6ca3c7dd4eee4214387c10b2e Mon Sep 17 00:00:00 2001 From: Laura Fuentes Grau Date: Thu, 2 Jan 2020 18:24:33 +0100 Subject: [PATCH 065/391] wip: add and edit widgets --- src/dashboard/dashboard.js | 8 ++++---- src/widget/edit-widget.js | 28 +++++++++++++++++++++------- src/widget/widget.js | 2 +- src/widget/widgets/button.js | 8 ++++---- src/widget/widgets/custom-action.js | 4 ++-- src/widget/widgets/gauge.js | 16 ++++++++-------- src/widget/widgets/html.js | 2 +- src/widget/widgets/image.js | 4 ++-- src/widget/widgets/input.js | 10 +++++----- src/widget/widgets/label.js | 2 -- src/widget/widgets/lamp.js | 8 ++++---- src/widget/widgets/plot-table.js | 22 +++++++++++----------- src/widget/widgets/plot.js | 14 +++++++------- src/widget/widgets/slider.js | 10 +++++----- src/widget/widgets/table.js | 2 +- src/widget/widgets/topology.js | 6 +++--- src/widget/widgets/value.js | 13 +++++++------ 17 files changed, 86 insertions(+), 73 deletions(-) diff --git a/src/dashboard/dashboard.js b/src/dashboard/dashboard.js index e45c5ad..f35eb67 100644 --- a/src/dashboard/dashboard.js +++ b/src/dashboard/dashboard.js @@ -293,8 +293,8 @@ class Dashboard extends Component { } handleDrop(widget) { - - widget.dashboardID = this.state.dashboard.id; + widget.dashboardID = this.state.dashboard.get('id'); + console.log(widget); AppDispatcher.dispatch({ type: 'widgets/start-add', @@ -473,8 +473,8 @@ class Dashboard extends Component { key={widgetKey} data={widgets[widgetKey]} simulation={this.state.simulation} - onWidgetChange={this.widgetChange.bind(this)} - onWidgetStatusChange={this.widgetStatusChange.bind(this)} + onWidgetChange={this.widgetChange} + onWidgetStatusChange={this.widgetStatusChange} editing={this.state.editing} index={widgetKey} grid={grid} diff --git a/src/widget/edit-widget.js b/src/widget/edit-widget.js index 8b19af0..f2c2161 100644 --- a/src/widget/edit-widget.js +++ b/src/widget/edit-widget.js @@ -38,6 +38,7 @@ class EditWidgetDialog extends React.Component { name: '', simulationModel: '', signal: 0 + } }; } @@ -68,7 +69,8 @@ class EditWidgetDialog extends React.Component { } handleChange(e) { - if (e.constructor === Array) { + /*is this needed? + if (e.constructor === Array) { // Every property in the array will be updated console.log("####its an array!"); let changes = e.reduce( (changesObject, event) => { @@ -80,7 +82,8 @@ class EditWidgetDialog extends React.Component { }, {}); this.setState({ temporal: Object.assign({}, this.state.temporal, changes ) }); - } else { + */ + if(e.target.type !== 'text'){ let changeObject = {}; if (e.target.id === 'lockAspect') { changeObject[e.target.id] = e.target.checked; @@ -100,12 +103,15 @@ class EditWidgetDialog extends React.Component { changeObject[e.target.id] = e.target.checked; } else if (e.target.type === 'number') { changeObject[e.target.id] = Number(e.target.value); - } else { + } + else { changeObject[e.target.id] = e.target.value; } + console.log("this.state.temporal is: "); console.log(this.state.temporal); console.log("the event target id: " + e.target.id); + console.log("this state target type is: " + e.target.type); console.log("the value is: " + e.target.value) console.log("change Object is: "); console.log(changeObject); @@ -113,11 +119,19 @@ class EditWidgetDialog extends React.Component { let finalChange = this.state.temporal; finalChange.customProperties[e.target.id] = changeObject[e.target.id]; - - - this.setState({ temporal: finalChange}); - } + } + else{ + if(this.state.temporal[e.target.id]){ + let finalChange = this.state.temporal; + + finalChange[e.target.id] = e.target.value; + this.setState({ temporal: finalChange}); + + } + } + + } resetState() { diff --git a/src/widget/widget.js b/src/widget/widget.js index e9c3f2c..3bca049 100644 --- a/src/widget/widget.js +++ b/src/widget/widget.js @@ -81,7 +81,7 @@ class Widget extends React.Component { if (this.state.sessionToken == null) { return; } - + console.log('widget componentwillmount called'); AppDispatcher.dispatch({ type: 'files/start-load', token: this.state.sessionToken, diff --git a/src/widget/widgets/button.js b/src/widget/widgets/button.js index e9c32c2..62b8c1b 100644 --- a/src/widget/widgets/button.js +++ b/src/widget/widgets/button.js @@ -34,20 +34,20 @@ class WidgetButton extends Component { } onPress(e) { - if (!this.props.widget.toggle) { + if (!this.props.widget.customProperties.toggle) { this.setState({ pressed: true }); - this.valueChanged(this.props.widget.on_value); + this.valueChanged(this.props.widget.customProperties.on_value); } } onRelease(e) { let nextState = false; - if (this.props.widget.toggle) { + if (this.props.widget.customProperties.toggle) { nextState = !this.state.pressed; } this.setState({ pressed: nextState }); - this.valueChanged(nextState ? this.props.widget.on_value : this.props.widget.off_value); + this.valueChanged(nextState ? this.props.widget.customProperties.on_value : this.props.widget.customProperties.off_value); } valueChanged(newValue) { diff --git a/src/widget/widgets/custom-action.js b/src/widget/widgets/custom-action.js index ceba7d0..63005f3 100644 --- a/src/widget/widgets/custom-action.js +++ b/src/widget/widgets/custom-action.js @@ -54,7 +54,7 @@ class WidgetCustomAction extends Component { AppDispatcher.dispatch({ type: 'simulators/start-action', simulator: this.state.simulator, - data: this.props.widget.actions, + data: this.props.widget.customProperties.actions, token: this.state.sessionToken }); } @@ -62,7 +62,7 @@ class WidgetCustomAction extends Component { render() { return
    ; } diff --git a/src/widget/widgets/gauge.js b/src/widget/widgets/gauge.js index 25cacf6..bd268d4 100644 --- a/src/widget/widgets/gauge.js +++ b/src/widget/widgets/gauge.js @@ -66,7 +66,7 @@ class WidgetGauge extends Component { } // check if value has changed - const signal = nextProps.data[simulator].output.values[nextProps.widget.signal]; + const signal = nextProps.data[simulator].output.values[nextProps.widget.customProperties.signal]; // Take just 3 decimal positions // Note: Favor this method over Number.toFixed(n) in order to avoid a type conversion, since it returns a String if (signal != null) { @@ -95,9 +95,9 @@ class WidgetGauge extends Component { this.gauge.maxValue = maxValue; } - if (nextProps.widget.valueUseMinMax) { - if (this.state.minValue > nextProps.widget.valueMin) { - minValue = nextProps.widget.valueMin; + if (nextProps.widget.customProperties.valueUseMinMax) { + if (this.state.minValue > nextProps.widget.customProperties.valueMin) { + minValue = nextProps.widget.customProperties.valueMin; this.setState({ minValue }); this.gauge.setMinValue(minValue); @@ -105,8 +105,8 @@ class WidgetGauge extends Component { updateLabels = true; } - if (this.state.maxValue < nextProps.widget.valueMax) { - maxValue = nextProps.widget.valueMax; + if (this.state.maxValue < nextProps.widget.customProperties.valueMax) { + maxValue = nextProps.widget.customProperties.valueMax; this.setState({ maxValue }); this.gauge.maxValue = maxValue; @@ -153,7 +153,7 @@ class WidgetGauge extends Component { } // calculate zones - let zones = this.props.widget.colorZones ? this.props.widget.zones : null; + let zones = this.props.widget.customProperties.colorZones ? this.props.widget.customProperties.zones : null; if (zones != null) { // adapt range 0-100 to actual min-max const step = (maxValue - minValue) / 100; @@ -197,7 +197,7 @@ class WidgetGauge extends Component { let signalType = null; if (this.props.simulationModel != null) { - signalType = (this.props.simulationModel != null && this.props.simulationModel.outputLength > 0 && this.props.widget.signal < this.props.simulationModel.outputLength) ? this.props.simulationModel.outputMapping[this.props.widget.signal].type : ''; + signalType = (this.props.simulationModel != null && this.props.simulationModel.outputLength > 0 && this.props.widget.customProperties.signal < this.props.simulationModel.outputLength) ? this.props.simulationModel.outputMapping[this.props.widget.customProperties.signal].type : ''; } return ( diff --git a/src/widget/widgets/html.js b/src/widget/widgets/html.js index 78dd3c6..773aefa 100644 --- a/src/widget/widgets/html.js +++ b/src/widget/widgets/html.js @@ -23,7 +23,7 @@ import React from 'react'; class WidgetHTML extends React.Component { render() { - return
    + return
    } } diff --git a/src/widget/widgets/image.js b/src/widget/widgets/image.js index 1b73f2a..a38c0b7 100644 --- a/src/widget/widgets/image.js +++ b/src/widget/widgets/image.js @@ -27,7 +27,7 @@ import config from '../../config'; class WidgetImage extends React.Component { componentWillReceiveProps(nextProps) { // Query the image referenced by the widget - let widgetFile = nextProps.widget.file; + let widgetFile = nextProps.widget.customProperties.file; if (widgetFile && !nextProps.files.find(file => file._id === widgetFile)) { AppDispatcher.dispatch({ type: 'files/start-load', @@ -38,7 +38,7 @@ class WidgetImage extends React.Component { } render() { - const file = this.props.files.find(file => file._id === this.props.widget.file); + const file = this.props.files.find(file => file._id === this.props.widget.customProperties.file); return (
    diff --git a/src/widget/widgets/input.js b/src/widget/widgets/input.js index 7272279..464f9b0 100644 --- a/src/widget/widgets/input.js +++ b/src/widget/widgets/input.js @@ -40,16 +40,16 @@ class WidgetInput extends Component { } // Update value - if (nextProps.widget.default_value && this.state.value === undefined) { + if (nextProps.widget.customProperties.default_value && this.state.value === undefined) { this.setState({ - value: nextProps.widget.default_value + value: nextProps.widget.customProperties.default_value }); } // Update unit - if (nextProps.widget.simulationModel && nextProps.simulationModel.inputMapping && this.state.unit !== nextProps.simulationModel.inputMapping[nextProps.widget.signal].type) { + if (nextProps.widget.customProperties.simulationModel && nextProps.simulationModel.inputMapping && this.state.unit !== nextProps.simulationModel.inputMapping[nextProps.widget.customProperties.signal].type) { this.setState({ - unit: nextProps.simulationModel.inputMapping[nextProps.widget.signal].type + unit: nextProps.simulationModel.inputMapping[nextProps.widget.customProperties.signal].type }); } } @@ -75,7 +75,7 @@ class WidgetInput extends Component {
    - + {this.props.widget.name} diff --git a/src/widget/widgets/label.js b/src/widget/widgets/label.js index 68a2ee0..c9cafdf 100644 --- a/src/widget/widgets/label.js +++ b/src/widget/widgets/label.js @@ -25,8 +25,6 @@ import EditWidgetColorControl from '../edit-widget-color-control'; class WidgetLabel extends Component { render() { - console.log("here is the label; "); - console.log(this.props.widget); const style = { fontSize: this.props.widget.customProperties.textSize + 'px', color: EditWidgetColorControl.ColorPalette[this.props.widget.customProperties.fontColor] diff --git a/src/widget/widgets/lamp.js b/src/widget/widgets/lamp.js index 0514047..8ca0bcc 100644 --- a/src/widget/widgets/lamp.js +++ b/src/widget/widgets/lamp.js @@ -48,7 +48,7 @@ class WidgetLamp extends Component { } // check if value has changed - const signal = nextProps.data[simulator].output.values[nextProps.widget.signal]; + const signal = nextProps.data[simulator].output.values[nextProps.widget.customProperties.signal]; if (signal != null && this.state.value !== signal[signal.length - 1].y) { this.setState({ value: signal[signal.length - 1].y }); } @@ -58,10 +58,10 @@ class WidgetLamp extends Component { let colors = EditWidgetColorControl.ColorPalette; let color; - if (Number(this.state.value) > Number(this.props.widget.threshold)) - color = colors[this.props.widget.on_color]; + if (Number(this.state.value) > Number(this.props.widget.customProperties.threshold)) + color = colors[this.props.widget.customProperties.on_color]; else - color = colors[this.props.widget.off_color]; + color = colors[this.props.widget.customProperties.off_color]; let style = { backgroundColor: color, diff --git a/src/widget/widgets/plot-table.js b/src/widget/widgets/plot-table.js index 1b6fc80..2f9b552 100644 --- a/src/widget/widgets/plot-table.js +++ b/src/widget/widgets/plot-table.js @@ -42,15 +42,15 @@ class WidgetPlotTable extends Component { } // Update internal selected signals state with props (different array objects) - if (this.props.widget.signals !== nextProps.widget.signals) { - this.setState( {signals: nextProps.widget.signals}); + if (this.props.widget.customProperties.signals !== nextProps.widget.customProperties.signals) { + this.setState( {signals: nextProps.widget.customProperties.signals}); } // Identify if there was a change in the preselected signals - if (JSON.stringify(nextProps.widget.preselectedSignals) !== JSON.stringify(this.props.widget.preselectedSignals) || this.state.preselectedSignals.length === 0) { + if (JSON.stringify(nextProps.widget.customProperties.preselectedSignals) !== JSON.stringify(this.props.widget.customProperties.preselectedSignals) || this.state.preselectedSignals.length === 0) { // Update the currently selected signals by intersecting with the preselected signals // Do the same with the plot values - var intersection = this.computeIntersection(nextProps.widget.preselectedSignals, nextProps.widget.signals); + var intersection = this.computeIntersection(nextProps.widget.customProperties.preselectedSignals, nextProps.widget.customProperties.signals); this.setState({ signals: intersection }); this.updatePreselectedSignalsState(nextProps); @@ -69,7 +69,7 @@ class WidgetPlotTable extends Component { // Loop through simulation model signals (accum, model_signal, signal_index) => { // Append them if they belong to the current selected type - if (nextProps.widget.preselectedSignals.indexOf(signal_index) > -1) { + if (nextProps.widget.customProperties.preselectedSignals.indexOf(signal_index) > -1) { accum.push( { index: signal_index, @@ -105,7 +105,7 @@ class WidgetPlotTable extends Component { if (this.props.data[simulator] != null && this.props.data[simulator].output != null && this.props.data[simulator].output.values != null) { simulatorData = this.props.data[simulator].output.values.filter((values, index) => ( - this.props.widget.signals.findIndex(value => value === index) !== -1 + this.props.widget.customProperties.signals.findIndex(value => value === index) !== -1 )); } @@ -150,14 +150,14 @@ class WidgetPlotTable extends Component {
    diff --git a/src/widget/widgets/plot.js b/src/widget/widgets/plot.js index e61ca10..7a2425d 100644 --- a/src/widget/widgets/plot.js +++ b/src/widget/widgets/plot.js @@ -44,10 +44,10 @@ class WidgetPlot extends React.Component { // Proceed if a simulation with models and a simulator are available if (simulator && nextProps.data[simulator] != null && nextProps.data[simulator] != null && nextProps.data[simulator].output != null && nextProps.data[simulator].output.values != null) { - const chosenSignals = nextProps.widget.signals; + const chosenSignals = nextProps.widget.customProperties.signals; const data = nextProps.data[simulator].output.values.filter((values, index) => ( - nextProps.widget.signals.findIndex(value => value === index) !== -1 + nextProps.widget.customProperties.signals.findIndex(value => value === index) !== -1 )); // Query the signals that will be displayed in the legend @@ -72,12 +72,12 @@ class WidgetPlot extends React.Component { data={this.state.data} height={this.props.widget.height - 55} width={this.props.widget.width - 20} - time={this.props.widget.time} - yMin={this.props.widget.yMin} - yMax={this.props.widget.yMax} - yUseMinMax={this.props.widget.yUseMinMax} + time={this.props.widget.customProperties.time} + yMin={this.props.widget.customProperties.yMin} + yMax={this.props.widget.customProperties.yMax} + yUseMinMax={this.props.widget.customProperties.yUseMinMax} paused={this.props.paused} - yLabel={this.props.widget.ylabel} + yLabel={this.props.widget.customProperties.ylabel} />
    diff --git a/src/widget/widgets/slider.js b/src/widget/widgets/slider.js index 8754752..435a29e 100644 --- a/src/widget/widgets/slider.js +++ b/src/widget/widgets/slider.js @@ -57,9 +57,9 @@ class WidgetSlider extends Component { } // Update unit - if (nextProps.widget.simulationModel && nextProps.simulationModel.inputMapping && this.state.unit !== nextProps.simulationModel.inputMapping[nextProps.widget.signal].type) { + if (nextProps.widget.customProperties.simulationModel && nextProps.simulationModel.inputMapping && this.state.unit !== nextProps.simulationModel.inputMapping[nextProps.widget.customProperties.signal].type) { this.setState({ - unit: nextProps.simulationModel.inputMapping[nextProps.widget.signal].type + unit: nextProps.simulationModel.inputMapping[nextProps.widget.customProperties.signal].type }); } @@ -73,8 +73,8 @@ class WidgetSlider extends Component { height: baseWidget.width, minWidth: baseWidget.minHeight, minHeight: baseWidget.minWidth, - maxWidth: baseWidget.maxHeight, - maxHeight: baseWidget.maxWidth + maxWidth: baseWidget.customProperties.maxHeight, + maxHeight: baseWidget.customProperties.maxWidth }); nextProps.onWidgetChange(newWidget); @@ -122,7 +122,7 @@ class WidgetSlider extends Component { { fields.control } { fields.value } - { this.props.widget.showUnit && fields.unit } + { this.props.widget.customProperties.showUnit && fields.unit }
    ) ); diff --git a/src/widget/widgets/table.js b/src/widget/widgets/table.js index 9ac2d0e..c618000 100644 --- a/src/widget/widgets/table.js +++ b/src/widget/widgets/table.js @@ -83,7 +83,7 @@ class WidgetTable extends Component { ]; - if (this.props.widget.showUnit) + if (this.props.widget.customProperties.showUnit) columns.push() return ( diff --git a/src/widget/widgets/topology.js b/src/widget/widgets/topology.js index bd7c62a..00542a3 100644 --- a/src/widget/widgets/topology.js +++ b/src/widget/widgets/topology.js @@ -106,9 +106,9 @@ class WidgetTopology extends React.Component { } componentWillReceiveProps(nextProps) { - const file = nextProps.files.find(file => file._id === nextProps.widget.file); + const file = nextProps.files.find(file => file._id === nextProps.widget.customProperties.file); // Ensure model is requested only once or a different was selected - if (this.props.widget.file !== nextProps.widget.file || (this.state.dashboardState === 'initial' && file)) { + if (this.props.widget.customProperties.file !== nextProps.widget.customProperties.file || (this.state.dashboardState === 'initial' && file)) { this.setState({'dashboardState': 'loading' }); if (file) { fetch(new Request('/' + config.publicPathBase + file.path)) @@ -141,7 +141,7 @@ class WidgetTopology extends React.Component { } } else { // No file has been selected - if (!nextProps.widget.file) { + if (!nextProps.widget.customProperties.file) { this.setState({ 'dashboardState': 'show_message', 'message': 'Select a topology model first.'}); diff --git a/src/widget/widgets/value.js b/src/widget/widgets/value.js index c58f57d..49393db 100644 --- a/src/widget/widgets/value.js +++ b/src/widget/widgets/value.js @@ -46,10 +46,11 @@ class WidgetValue extends Component { return; } - const unit = nextProps.simulationModel.outputMapping[nextProps.widget.signal].type; + //const unit = nextProps.simulationModel.outputMapping[nextProps.widget.customProperties.signal].type; + const unit = 42; // check if value has changed - const signal = nextProps.data[simulator].output.values[nextProps.widget.signal]; + const signal = nextProps.data[simulator].output.values[nextProps.widget.customProperties.signal]; if (signal != null && this.state.value !== signal[signal.length - 1].y) { this.setState({ value: signal[signal.length - 1].y, unit }); } @@ -59,10 +60,10 @@ class WidgetValue extends Component { var value_to_render = Number(this.state.value); return (
    - {this.props.widget.name} - {Number.isNaN(value_to_render) ? NaN : format('.3s')(value_to_render)} - {this.props.widget.showUnit && - [{this.state.unit}] + {this.props.widget.name} + {Number.isNaN(value_to_render) ? NaN : format('.3s')(value_to_render)} + {this.props.widget.customProperties.showUnit && + [{this.state.unit}] }
    ); From 60e82fbbff23cbb4841dabb4c4e2f5c4d2ea067c Mon Sep 17 00:00:00 2001 From: Laura Fuentes Grau Date: Mon, 6 Jan 2020 18:27:56 +0100 Subject: [PATCH 066/391] wip: restore editability --- src/widget/edit-widget-aspect-control.js | 6 ++++-- src/widget/edit-widget-checkbox-control.js | 8 ++++++-- src/widget/edit-widget-color-control.js | 8 +++++--- src/widget/edit-widget-color-zones-control.js | 20 ++++++++++--------- src/widget/edit-widget-html-content.js | 2 +- src/widget/edit-widget-image-control.js | 4 +++- src/widget/edit-widget-min-max-control.js | 2 +- src/widget/edit-widget-orientation.js | 9 +++++---- src/widget/widgets/button.js | 2 ++ src/widget/widgets/slider.js | 19 ++++++++++++++---- 10 files changed, 53 insertions(+), 27 deletions(-) diff --git a/src/widget/edit-widget-aspect-control.js b/src/widget/edit-widget-aspect-control.js index 502e837..59af823 100644 --- a/src/widget/edit-widget-aspect-control.js +++ b/src/widget/edit-widget-aspect-control.js @@ -28,7 +28,9 @@ class EditWidgetAspectControl extends React.Component { this.state = { widget: { - lockAspect: true + customProperties:{ + isLocked: true + } } }; } @@ -40,7 +42,7 @@ class EditWidgetAspectControl extends React.Component { render() { return ( - this.props.handleChange(e)}>Lock Aspect + this.props.handleChange(e)}>Lock Aspect ); } diff --git a/src/widget/edit-widget-checkbox-control.js b/src/widget/edit-widget-checkbox-control.js index 0118abb..41c17c6 100644 --- a/src/widget/edit-widget-checkbox-control.js +++ b/src/widget/edit-widget-checkbox-control.js @@ -27,7 +27,11 @@ class EditWidgetCheckboxControl extends React.Component { super(props); this.state = { - widget: {} + widget: { + customProperties:{ + + } + } }; } @@ -37,7 +41,7 @@ class EditWidgetCheckboxControl extends React.Component { render() { return - this.props.handleChange(e)}>{this.props.text} + this.props.handleChange(e)}> ; } } diff --git a/src/widget/edit-widget-color-control.js b/src/widget/edit-widget-color-control.js index 8ec2bd3..212e487 100644 --- a/src/widget/edit-widget-color-control.js +++ b/src/widget/edit-widget-color-control.js @@ -43,7 +43,9 @@ class EditWidgetColorControl extends Component { super(props); this.state = { - widget: {} + widget: { + customProperties:{} + } }; } @@ -57,7 +59,7 @@ class EditWidgetColorControl extends Component { return ( - + { this.props.label } @@ -69,7 +71,7 @@ class EditWidgetColorControl extends Component { }; let checkedClass = classNames({ - 'checked': idx === this.state.widget[this.props.controlId] + 'checked': idx === this.state.widget[this.props.controlId] || this.state.widget.customProperties[this.props.controlId] }); return ( this.props.handleChange({target: { id: this.props.controlId, value: idx}})} />) diff --git a/src/widget/edit-widget-color-zones-control.js b/src/widget/edit-widget-color-zones-control.js index c124353..3e64684 100644 --- a/src/widget/edit-widget-color-zones-control.js +++ b/src/widget/edit-widget-color-zones-control.js @@ -33,7 +33,9 @@ class EditWidgetColorZonesControl extends React.Component { this.state = { widget: { + customProperties:{ zones: [] + } }, selectedZones: [] }; @@ -46,7 +48,7 @@ class EditWidgetColorZonesControl extends React.Component { addZone = () => { // add row const widget = this.state.widget; - widget.zones.push({ strokeStyle: 'ffffff', min: 0, max: 100 }); + widget.customProperties.zones.push({ strokeStyle: 'ffffff', min: 0, max: 100 }); this.setState({ widget }); @@ -58,7 +60,7 @@ class EditWidgetColorZonesControl extends React.Component { const widget = this.state.widget; this.state.selectedZones.forEach(row => { - widget.zones.splice(row, 1); + widget.customProperties.zones.splice(row, 1); }); this.setState({ selectedZones: [], widget }); @@ -71,11 +73,11 @@ class EditWidgetColorZonesControl extends React.Component { const widget = this.state.widget; if (column === 1) { - widget.zones[row].strokeStyle = event.target.value; + widget.customProperties.zones[row].strokeStyle = event.target.value; } else if (column === 2) { - widget.zones[row].min = event.target.value; + widget.customProperties.zones[row].min = event.target.value; } else if (column === 3) { - widget.zones[row].max = event.target.value; + widget.customProperties.zones[row].max = event.target.value; } this.setState({ widget }); @@ -88,7 +90,7 @@ class EditWidgetColorZonesControl extends React.Component { const event = { target: { id: 'zones', - value: widget.zones + value: widget.customProperties.zones } }; @@ -117,15 +119,15 @@ class EditWidgetColorZonesControl extends React.Component { return Color zones - +
    - - + +
    ; } } diff --git a/src/widget/edit-widget-html-content.js b/src/widget/edit-widget-html-content.js index 8633a61..e11fd60 100644 --- a/src/widget/edit-widget-html-content.js +++ b/src/widget/edit-widget-html-content.js @@ -44,7 +44,7 @@ class EditWidgetHTMLContent extends React.Component { render() { return HTML Content - this.props.handleChange(e)} /> + this.props.handleChange(e)} /> ; } } diff --git a/src/widget/edit-widget-image-control.js b/src/widget/edit-widget-image-control.js index e9d0118..501e5eb 100644 --- a/src/widget/edit-widget-image-control.js +++ b/src/widget/edit-widget-image-control.js @@ -30,7 +30,9 @@ class EditImageWidgetControl extends React.Component { this.state = { widget: { + customProperties:{ file: '' + } }, fileList: null, progress: 0 @@ -73,7 +75,7 @@ class EditImageWidgetControl extends React.Component { return
    Image - this.props.handleChange(e)}> + this.props.handleChange(e)}> {this.props.files.length === 0 ? ( ) : ( diff --git a/src/widget/edit-widget-min-max-control.js b/src/widget/edit-widget-min-max-control.js index c717f55..ef7f00a 100644 --- a/src/widget/edit-widget-min-max-control.js +++ b/src/widget/edit-widget-min-max-control.js @@ -45,7 +45,7 @@ class EditWidgetMinMaxControl extends React.Component { console.log(this.state.widget); return {this.props.label} - this.props.handleChange(e)}>Enable min-max + this.props.handleChange(e)}> diff --git a/src/widget/edit-widget-orientation.js b/src/widget/edit-widget-orientation.js index 41503ba..2da449d 100644 --- a/src/widget/edit-widget-orientation.js +++ b/src/widget/edit-widget-orientation.js @@ -29,7 +29,9 @@ class EditWidgetOrientation extends Component { super(props); this.state = { - widget: {} + widget: { + customProperties:{} + } }; } @@ -48,7 +50,7 @@ class EditWidgetOrientation extends Component { return ( - + Orientation @@ -58,8 +60,7 @@ class EditWidgetOrientation extends Component { let name = WidgetSlider.OrientationTypes[type].name; return ( - this.handleOrientationChange(value)}> - { name } + this.handleOrientationChange(value)}> ) }) } diff --git a/src/widget/widgets/button.js b/src/widget/widgets/button.js index 62b8c1b..a7fd2ae 100644 --- a/src/widget/widgets/button.js +++ b/src/widget/widgets/button.js @@ -34,6 +34,7 @@ class WidgetButton extends Component { } onPress(e) { + console.log("button was pressed!"); if (!this.props.widget.customProperties.toggle) { this.setState({ pressed: true }); this.valueChanged(this.props.widget.customProperties.on_value); @@ -41,6 +42,7 @@ class WidgetButton extends Component { } onRelease(e) { + console.log("button was released!"); let nextState = false; if (this.props.widget.customProperties.toggle) { nextState = !this.state.pressed; diff --git a/src/widget/widgets/slider.js b/src/widget/widgets/slider.js index 435a29e..4c41a4c 100644 --- a/src/widget/widgets/slider.js +++ b/src/widget/widgets/slider.js @@ -119,10 +119,7 @@ class WidgetSlider extends Component { ) : (
    - - { fields.control } - { fields.value } - { this.props.widget.customProperties.showUnit && fields.unit } + this.valueIsChanging(v) } onAfterChange={ (v) => this.valueChanged(v) }/>,
    ) ); @@ -130,3 +127,17 @@ class WidgetSlider extends Component { } export default WidgetSlider; +/*!isVertical? ( +
    + +
    { fields.control }
    + { fields.value } +
    +) : ( +
    + + { fields.control } + { fields.value } + { this.props.widget.customProperties.showUnit && fields.unit } +
    +)*/ \ No newline at end of file From b4343aaa78f20b62d3cb95c87a6c607d4a36dbab Mon Sep 17 00:00:00 2001 From: Laura Fuentes Grau Date: Sat, 11 Jan 2020 19:16:55 +0100 Subject: [PATCH 067/391] wip: restore editability --- src/scenario/scenario.js | 2 +- src/user/edit-own-user.js | 10 +++++----- src/user/user.js | 3 ++- src/widget/edit-widget-min-max-control.js | 19 +++++++++---------- src/widget/edit-widget-number-control.js | 6 ++++-- src/widget/edit-widget-signals-control.js | 4 ++-- src/widget/edit-widget-simulation-control.js | 8 +++++--- src/widget/widget-factory.js | 5 +++++ src/widget/widgets/plot-table.js | 6 ++++-- 9 files changed, 37 insertions(+), 26 deletions(-) diff --git a/src/scenario/scenario.js b/src/scenario/scenario.js index 931dc3b..1ca36eb 100644 --- a/src/scenario/scenario.js +++ b/src/scenario/scenario.js @@ -85,7 +85,7 @@ class Scenario extends React.Component { } } - componentWillMount() { + componentDidMount() { //load selected scenario AppDispatcher.dispatch({ diff --git a/src/user/edit-own-user.js b/src/user/edit-own-user.js index 66f5324..fc63914 100644 --- a/src/user/edit-own-user.js +++ b/src/user/edit-own-user.js @@ -60,11 +60,11 @@ class EditOwnUserDialog extends React.Component { this.setState({ [e.target.id]: e.target.value }); // check all controls - var username = true; - var mail = true; - var pw = true; - var oldPassword = true; - var confirmpassword = true; + let username = true; + let mail = true; + let pw = true; + let oldPassword = true; + let confirmpassword = true; if (this.state.username === '') { username = false; diff --git a/src/user/user.js b/src/user/user.js index 781005b..8e7e67c 100644 --- a/src/user/user.js +++ b/src/user/user.js @@ -56,7 +56,7 @@ class User extends Component { //this.setState({currentUser: data}); let updatedData = {}; - + if(data){ if (data.username !== ''){ updatedData["id"] = data.id; updatedData["username"] = data.username; @@ -97,6 +97,7 @@ class User extends Component { NotificationsDataManager.addNotification(USER_UPDATE_WARNING_NOTIFICATION); } } + } getHumanRoleName(role_key) { diff --git a/src/widget/edit-widget-min-max-control.js b/src/widget/edit-widget-min-max-control.js index ef7f00a..eae6d65 100644 --- a/src/widget/edit-widget-min-max-control.js +++ b/src/widget/edit-widget-min-max-control.js @@ -26,14 +26,13 @@ class EditWidgetMinMaxControl extends React.Component { constructor(props) { super(props); - const widget = {}; - widget[props.controlID + "UseMinMax"] = false; - widget[props.controlId + "Min"] = 0; - widget[props.controlId + "Max"] = 100; - this.state = { - widget - }; + widget: { + customProperties:{ + + } + } + } } componentWillReceiveProps(nextProps) { @@ -45,16 +44,16 @@ class EditWidgetMinMaxControl extends React.Component { console.log(this.state.widget); return {this.props.label} - this.props.handleChange(e)}> + this.props.handleChange(e)}>
    diff --git a/src/widget/edit-widget-number-control.js b/src/widget/edit-widget-number-control.js index 0328333..e937aa8 100644 --- a/src/widget/edit-widget-number-control.js +++ b/src/widget/edit-widget-number-control.js @@ -27,7 +27,9 @@ class EditWidgetNumberControl extends Component { super(props); this.state = { - widget: {} + widget: { + customProperties:{} + } }; } @@ -40,7 +42,7 @@ class EditWidgetNumberControl extends Component { return ( {this.props.label} - this.props.handleChange(e)} /> + this.props.handleChange(e)} /> ); } diff --git a/src/widget/edit-widget-signals-control.js b/src/widget/edit-widget-signals-control.js index 045a269..19ca43b 100644 --- a/src/widget/edit-widget-signals-control.js +++ b/src/widget/edit-widget-signals-control.js @@ -20,7 +20,7 @@ **********************************************************************************/ import React, { Component } from 'react'; -import { FormGroup, FormCheck, FormLabel, FormControl } from 'react-bootstrap'; +import { FormGroup, FormCheck, FormLabel } from 'react-bootstrap'; class EditWidgetSignalsControl extends Component { constructor(props) { @@ -68,7 +68,7 @@ class EditWidgetSignalsControl extends Component { Signals { signalsToRender.length === 0 || !this.state.widget.hasOwnProperty(this.props.controlId)? ( - No signals available. + No signals available ) : ( signalsToRender.map((signal, index) => ( this.handleSignalChange(e.target.checked, index)}>{signal.name} diff --git a/src/widget/edit-widget-simulation-control.js b/src/widget/edit-widget-simulation-control.js index e6d88ee..8862567 100644 --- a/src/widget/edit-widget-simulation-control.js +++ b/src/widget/edit-widget-simulation-control.js @@ -28,12 +28,14 @@ class EditWidgetSimulationControl extends Component { this.state = { widget: { - simulationModel: '' + customProperties: { + simulationModel: '' + } } }; } - componentWillReceiveProps(nextProps) { + componentDidUpdate(nextProps) { // Update state's widget with props this.setState({ widget: nextProps.widget }); } @@ -44,7 +46,7 @@ class EditWidgetSimulationControl extends Component { return ( Simulation Model - this.props.handleChange(e)}> + this.props.handleChange(e)}> { this.props.simulationModels.length === 0 ? ( diff --git a/src/widget/widget-factory.js b/src/widget/widget-factory.js index b131e2d..eb2dc68 100644 --- a/src/widget/widget-factory.js +++ b/src/widget/widget-factory.js @@ -162,6 +162,11 @@ class WidgetFactory { widget.customProperties.orientation = WidgetSlider.OrientationTypes.HORIZONTAL.value; // Assign default orientation widget.customProperties.simulationModel = defaultSimulationModel; widget.customProperties.signal = 0; + widget.customProperties.rangeMin = 0; + widget.customProperties.rangeMax = 200; + widget.customProperties.rangeUseMinMax = true; + widget.customProperties.showUnit = true + break; case 'Gauge': widget.customProperties.simulationModel = defaultSimulationModel; diff --git a/src/widget/widgets/plot-table.js b/src/widget/widgets/plot-table.js index 2f9b552..7cd0cbf 100644 --- a/src/widget/widgets/plot-table.js +++ b/src/widget/widgets/plot-table.js @@ -48,7 +48,7 @@ class WidgetPlotTable extends Component { // Identify if there was a change in the preselected signals if (JSON.stringify(nextProps.widget.customProperties.preselectedSignals) !== JSON.stringify(this.props.widget.customProperties.preselectedSignals) || this.state.preselectedSignals.length === 0) { - // Update the currently selected signals by intersecting with the preselected signals + // Update the currently selected signals by intersecting with the preselected signalsWidget // Do the same with the plot values var intersection = this.computeIntersection(nextProps.widget.customProperties.preselectedSignals, nextProps.widget.customProperties.signals); this.setState({ signals: intersection }); @@ -65,6 +65,7 @@ class WidgetPlotTable extends Component { updatePreselectedSignalsState(nextProps) { // Create checkboxes using the signal indices from simulation model + if(nextProps.simulationModel.outputMapping){ const preselectedSignals = nextProps.simulationModel.outputMapping.reduce( // Loop through simulation model signals (accum, model_signal, signal_index) => { @@ -80,8 +81,9 @@ class WidgetPlotTable extends Component { } return accum; }, []); - + this.setState({ preselectedSignals }); + } } updateSignalSelection(signal_index, checked) { From 374437dfad252e366ab2e93f78b87021a3cd67d4 Mon Sep 17 00:00:00 2001 From: Laura Fuentes Grau Date: Sat, 11 Jan 2020 20:03:53 +0100 Subject: [PATCH 068/391] context menu now integrated into widget --- src/dashboard/dashboard.js | 59 ++++++++++++++--------- src/dashboard/dropzone.js | 1 + src/dashboard/widget-context-menu.js | 13 ++++- src/widget/edit-widget-color-control.js | 1 - src/widget/edit-widget-min-max-control.js | 2 - src/widget/edit-widget.js | 11 +++-- src/widget/editable-widget-container.js | 3 +- src/widget/widget-container.js | 1 + src/widget/widget.js | 6 +-- src/widget/widgets/label.js | 1 + src/widget/widgets/slider.js | 1 + 11 files changed, 61 insertions(+), 38 deletions(-) diff --git a/src/dashboard/dashboard.js b/src/dashboard/dashboard.js index f35eb67..a6b277f 100644 --- a/src/dashboard/dashboard.js +++ b/src/dashboard/dashboard.js @@ -57,14 +57,14 @@ class Dashboard extends Component { prevState = {}; } const sessionToken = LoginStore.getState().token; - + let maxHeight = null; let dashboard = Map(); let dashboards = DashboardStore.getState() let rawDashboard = dashboards[props.match.params.dashboard - 1]; - if (rawDashboard != null) { + if (rawDashboard) { dashboard = Map(rawDashboard); // convert widgets list to a dictionary to be able to reference widgets @@ -95,7 +95,7 @@ class Dashboard extends Component { - //ist das überhaupt nötiG?? + /* if (this.state.dashboard.has('id') === false) { AppDispatcher.dispatch({ type: 'dashboards/start-load', @@ -121,7 +121,7 @@ class Dashboard extends Component { token: this.state.sessionToken }); */ - } + let widgets = {}; @@ -129,13 +129,14 @@ class Dashboard extends Component { widgets[Dashboard.lastWidgetKey] = widget; Dashboard.lastWidgetKey++; } - let maxHeight = Object.keys(widgets).reduce( (maxHeightSoFar, widgetKey) => { + maxHeight = Object.keys(widgets).reduce( (maxHeightSoFar, widgetKey) => { let thisWidget = widgets[widgetKey]; let thisWidgetHeight = thisWidget.y + thisWidget.height; return thisWidgetHeight > maxHeightSoFar? thisWidgetHeight : maxHeightSoFar; }, 0); + } let simulationModels = []; //if (prevState.simulation != null) { @@ -162,8 +163,8 @@ class Dashboard extends Component { modalData: null, modalIndex: null, - maxWidgetHeight: maxHeight, - dropZoneHeight: maxHeight +80, + maxWidgetHeight: maxHeight || null, + dropZoneHeight: maxHeight +80 || null, }; } @@ -176,7 +177,7 @@ class Dashboard extends Component { } //!!!won't work anymore - componentWillMount() { + componentDidMount() { //document.addEventListener('keydown', this.handleKeydown.bind(this)); if (this.state.dashboard.has('id') === false) { AppDispatcher.dispatch({ @@ -355,7 +356,6 @@ class Dashboard extends Component { editWidget(widget, index){ - console.log("dashboard editWidget was called widget: " + widget +" index: " + index); this.setState({ editModal: true, modalData: widget, modalIndex: index }); }; @@ -442,7 +442,7 @@ class Dashboard extends Component { const widgets = this.state.dashboard.get('widgets'); const grid = this.state.dashboard.get('grid'); const boxClasses = classNames('section', 'box', { 'fullscreen-padding': this.props.isFullscreen }); - + let draggable = this.state.editing; return
    @@ -466,8 +466,30 @@ class Dashboard extends Component { {this.state.editing && } - + {!draggable?( + {widgets != null && Object.keys(widgets).map(widgetKey => ( + + + + ))} + + ) : ( + {widgets != null && Object.keys(widgets).map(widgetKey => ( @@ -484,17 +506,8 @@ class Dashboard extends Component { ))} - {/* TODO: Create only one context menu for all widgets */} - {widgets != null && Object.keys(widgets).map(widgetKey => ( - - ))} - + )} + diff --git a/src/dashboard/dropzone.js b/src/dashboard/dropzone.js index 7a9af88..d73a295 100644 --- a/src/dashboard/dropzone.js +++ b/src/dashboard/dropzone.js @@ -52,6 +52,7 @@ const dropzoneTarget = { }; function collect(connect, monitor) { + return { connectDropTarget: connect.dropTarget(), isOver: monitor.isOver(), diff --git a/src/dashboard/widget-context-menu.js b/src/dashboard/widget-context-menu.js index c1cd082..ee53b4a 100644 --- a/src/dashboard/widget-context-menu.js +++ b/src/dashboard/widget-context-menu.js @@ -22,6 +22,7 @@ import React from 'react'; import PropTypes from 'prop-types'; import { Menu, Item, Separator, MenuProvider } from 'react-contexify'; +import Widget from '../widget/widget'; class WidgetContextMenu extends React.Component { editWidget = event => { @@ -92,7 +93,6 @@ class WidgetContextMenu extends React.Component { }; render() { - const isLocked = this.props.widget.locked; const ContextMenu = () => ( @@ -115,7 +115,16 @@ class WidgetContextMenu extends React.Component { return
    - {"Widget " + this.props.widget.name} +
    diff --git a/src/widget/edit-widget-color-control.js b/src/widget/edit-widget-color-control.js index 212e487..cadafa8 100644 --- a/src/widget/edit-widget-color-control.js +++ b/src/widget/edit-widget-color-control.js @@ -55,7 +55,6 @@ class EditWidgetColorControl extends Component { } render() { - console.log("edit widgetcolorcontrol was called"); return ( diff --git a/src/widget/edit-widget-min-max-control.js b/src/widget/edit-widget-min-max-control.js index eae6d65..b45aac8 100644 --- a/src/widget/edit-widget-min-max-control.js +++ b/src/widget/edit-widget-min-max-control.js @@ -40,8 +40,6 @@ class EditWidgetMinMaxControl extends React.Component { } render() { - console.log("in minmax control, widget: "); - console.log(this.state.widget); return {this.props.label} this.props.handleChange(e)}> diff --git a/src/widget/edit-widget.js b/src/widget/edit-widget.js index f2c2161..021fcd7 100644 --- a/src/widget/edit-widget.js +++ b/src/widget/edit-widget.js @@ -69,7 +69,7 @@ class EditWidgetDialog extends React.Component { } handleChange(e) { - /*is this needed? + if (e.constructor === Array) { // Every property in the array will be updated console.log("####its an array!"); @@ -82,7 +82,8 @@ class EditWidgetDialog extends React.Component { }, {}); this.setState({ temporal: Object.assign({}, this.state.temporal, changes ) }); - */ + } + if(e.target.type !== 'text'){ let changeObject = {}; if (e.target.id === 'lockAspect') { @@ -103,7 +104,8 @@ class EditWidgetDialog extends React.Component { changeObject[e.target.id] = e.target.checked; } else if (e.target.type === 'number') { changeObject[e.target.id] = Number(e.target.value); - } + } + else { changeObject[e.target.id] = e.target.value; } @@ -148,14 +150,13 @@ class EditWidgetDialog extends React.Component { } //this.valid = name; - this.valid = true; + this.valid = name; // return state to control if (target === 'name') return name ? "success" : "error"; } render() { - console.log("####edit widget render was called"); let controls = null; if (this.props.widget) { controls = CreateControls( diff --git a/src/widget/editable-widget-container.js b/src/widget/editable-widget-container.js index 3fcddf0..27824b4 100644 --- a/src/widget/editable-widget-container.js +++ b/src/widget/editable-widget-container.js @@ -28,7 +28,7 @@ import { Menu } from 'react-contexify'; class EditableWidgetContainer extends React.Component { constructor(props) { super(props); - + this.rnd = null; } @@ -88,7 +88,6 @@ class EditableWidgetContainer extends React.Component { render() { const widget = this.props.widget; - console.log("editable-widget-container was called"); const resizing = { bottom: !widget.locked, diff --git a/src/widget/widget-container.js b/src/widget/widget-container.js index b5258ff..3218ba6 100644 --- a/src/widget/widget-container.js +++ b/src/widget/widget-container.js @@ -24,6 +24,7 @@ import PropTypes from 'prop-types'; class WidgetContainer extends React.Component { render() { + const containerStyle = { width: Number(this.props.widget.width), height: Number(this.props.widget.height), diff --git a/src/widget/widget.js b/src/widget/widget.js index 3bca049..41de002 100644 --- a/src/widget/widget.js +++ b/src/widget/widget.js @@ -56,6 +56,7 @@ class Widget extends React.Component { } static calculateState(prevState, props) { + let simulatorData = {}; if (props.paused) { @@ -81,7 +82,6 @@ class Widget extends React.Component { if (this.state.sessionToken == null) { return; } - console.log('widget componentwillmount called'); AppDispatcher.dispatch({ type: 'files/start-load', token: this.state.sessionToken, @@ -125,7 +125,7 @@ class Widget extends React.Component { simulationModel = model; } - //all types are lowercase!!! at least slider is + if (widget.type === 'CustomAction') { return } else if (widget.type === 'Action') { @@ -168,7 +168,7 @@ class Widget extends React.Component { const element = this.createWidget(this.props.data); if (this.props.editing) { - return + return {element} ; } diff --git a/src/widget/widgets/label.js b/src/widget/widgets/label.js index c9cafdf..2ee131f 100644 --- a/src/widget/widgets/label.js +++ b/src/widget/widgets/label.js @@ -25,6 +25,7 @@ import EditWidgetColorControl from '../edit-widget-color-control'; class WidgetLabel extends Component { render() { + const style = { fontSize: this.props.widget.customProperties.textSize + 'px', color: EditWidgetColorControl.ColorPalette[this.props.widget.customProperties.fontColor] diff --git a/src/widget/widgets/slider.js b/src/widget/widgets/slider.js index 4c41a4c..b536edd 100644 --- a/src/widget/widgets/slider.js +++ b/src/widget/widgets/slider.js @@ -95,6 +95,7 @@ class WidgetSlider extends Component { } render() { + let isVertical = this.props.widget.customProperties.orientation === WidgetSlider.OrientationTypes.VERTICAL.value; let fields = { name: this.props.widget.name, From 6f4604c75e0c5716b83a0ab4f1ee261cddc66e9f Mon Sep 17 00:00:00 2001 From: Sonja Happ Date: Thu, 16 Jan 2020 15:11:17 +0100 Subject: [PATCH 069/391] Removes componentWillUpdate and componentWillReceiveProps due conflicts with React's unsafe life cycles #212 --- package-lock.json | 7374 ++++++++++------- package.json | 55 +- src/app.js | 8 +- src/common/editable-header.js | 6 +- src/common/home.js | 6 - src/common/table.js | 20 +- src/file/select-file.js | 196 +- src/simulationmodel/signal-mapping.js | 13 +- src/simulationmodel/simulation-model.js | 2 +- src/simulator/select-simulator.js | 28 +- src/simulator/simulator-action.js | 15 +- src/simulator/simulators.js | 2 +- src/user/login.js | 14 +- src/user/logout.js | 2 +- src/widget/edit-widget-aspect-control.js | 6 +- src/widget/edit-widget-checkbox-control.js | 6 +- src/widget/edit-widget-color-control.js | 7 +- src/widget/edit-widget-color-zones-control.js | 6 +- src/widget/edit-widget-html-content.js | 7 +- src/widget/edit-widget-image-control.js | 6 +- src/widget/edit-widget-min-max-control.js | 6 +- src/widget/edit-widget-number-control.js | 7 +- src/widget/edit-widget-orientation.js | 7 +- src/widget/edit-widget-parameters-control.js | 7 +- src/widget/edit-widget-signal-control.js | 7 +- src/widget/edit-widget-signals-control.js | 7 +- src/widget/edit-widget-text-control.js | 7 +- src/widget/edit-widget-time-control.js | 6 +- src/widget/widget-plot/plot.js | 37 +- src/widget/widget.js | 6 +- src/widget/widgets/custom-action.js | 10 +- src/widget/widgets/gauge.js | 134 +- src/widget/widgets/image.js | 9 +- src/widget/widgets/input.js | 23 +- src/widget/widgets/lamp.js | 25 +- src/widget/widgets/plot-table.js | 26 +- src/widget/widgets/plot.js | 35 +- src/widget/widgets/slider.js | 43 +- src/widget/widgets/table.js | 46 +- src/widget/widgets/topology.js | 20 +- src/widget/widgets/value.js | 27 +- 41 files changed, 5049 insertions(+), 3225 deletions(-) diff --git a/package-lock.json b/package-lock.json index 807685b..917f5a1 100644 --- a/package-lock.json +++ b/package-lock.json @@ -5,38 +5,55 @@ "requires": true, "dependencies": { "@babel/code-frame": { - "version": "7.5.5", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.5.5.tgz", - "integrity": "sha512-27d4lZoomVyo51VegxI20xZPuSHusqbQag/ztrBC7wegWoQ1nLREPVSKSW8byhTlzTKyNE4ifaTA6lCp7JjpFw==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.0.tgz", + "integrity": "sha512-AN2IR/wCUYsM+PdErq6Bp3RFTXl8W0p9Nmymm7zkpsCmh+r/YYcckaCGpU8Q/mEKmST19kkGRaG42A/jxOWwBA==", "requires": { - "@babel/highlight": "^7.0.0" + "@babel/highlight": "^7.8.0" + } + }, + "@babel/compat-data": { + "version": "7.8.1", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.8.1.tgz", + "integrity": "sha512-Z+6ZOXvyOWYxJ50BwxzdhRnRsGST8Y3jaZgxYig575lTjVSs3KtJnmESwZegg6e2Dn0td1eDhoWlp1wI4BTCPw==", + "requires": { + "browserslist": "^4.8.2", + "invariant": "^2.2.4", + "semver": "^5.5.0" + }, + "dependencies": { + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" + } } }, "@babel/core": { - "version": "7.4.3", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.4.3.tgz", - "integrity": "sha512-oDpASqKFlbspQfzAE7yaeTmdljSH2ADIvBlb0RwbStltTuWa0+7CCI1fYVINNv9saHPa1W7oaKeuNuKj+RQCvA==", + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.7.4.tgz", + "integrity": "sha512-+bYbx56j4nYBmpsWtnPUsKW3NdnYxbqyfrP2w9wILBuHzdfIKz9prieZK0DFPyIzkjYVUe4QkusGL07r5pXznQ==", "requires": { - "@babel/code-frame": "^7.0.0", - "@babel/generator": "^7.4.0", - "@babel/helpers": "^7.4.3", - "@babel/parser": "^7.4.3", - "@babel/template": "^7.4.0", - "@babel/traverse": "^7.4.3", - "@babel/types": "^7.4.0", - "convert-source-map": "^1.1.0", + "@babel/code-frame": "^7.5.5", + "@babel/generator": "^7.7.4", + "@babel/helpers": "^7.7.4", + "@babel/parser": "^7.7.4", + "@babel/template": "^7.7.4", + "@babel/traverse": "^7.7.4", + "@babel/types": "^7.7.4", + "convert-source-map": "^1.7.0", "debug": "^4.1.0", "json5": "^2.1.0", - "lodash": "^4.17.11", + "lodash": "^4.17.13", "resolve": "^1.3.2", "semver": "^5.4.1", "source-map": "^0.5.0" }, "dependencies": { "semver": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz", - "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==" + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" }, "source-map": { "version": "0.5.7", @@ -46,15 +63,14 @@ } }, "@babel/generator": { - "version": "7.5.5", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.5.5.tgz", - "integrity": "sha512-ETI/4vyTSxTzGnU2c49XHv2zhExkv9JHLTwDAFz85kmcwuShvYG2H08FwgIguQf4JC75CBnXAUM5PqeF4fj0nQ==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.8.0.tgz", + "integrity": "sha512-2Lp2e02CV2C7j/H4n4D9YvsvdhPVVg9GDIamr6Tu4tU35mL3mzOrzl1lZ8ZJtysfZXh+y+AGORc2rPS7yHxBUg==", "requires": { - "@babel/types": "^7.5.5", + "@babel/types": "^7.8.0", "jsesc": "^2.5.1", "lodash": "^4.17.13", - "source-map": "^0.5.0", - "trim-right": "^1.0.1" + "source-map": "^0.5.0" }, "dependencies": { "source-map": { @@ -65,214 +81,242 @@ } }, "@babel/helper-annotate-as-pure": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.0.0.tgz", - "integrity": "sha512-3UYcJUj9kvSLbLbUIfQTqzcy5VX7GRZ/CCDrnOaZorFFM01aXp1+GJwuFGV4NDDoAS+mOUyHcO6UD/RfqOks3Q==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.8.0.tgz", + "integrity": "sha512-WWj+1amBdowU2g18p3/KUc1Y5kWnaNm1paohq2tT4/RreeMNssYkv6ul9wkE2iIqjwLBwNMZGH4pTGlMSUqMMg==", "requires": { - "@babel/types": "^7.0.0" + "@babel/types": "^7.8.0" } }, "@babel/helper-builder-binary-assignment-operator-visitor": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.1.0.tgz", - "integrity": "sha512-qNSR4jrmJ8M1VMM9tibvyRAHXQs2PmaksQF7c1CGJNipfe3D8p+wgNwgso/P2A2r2mdgBWAXljNWR0QRZAMW8w==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.8.0.tgz", + "integrity": "sha512-KbBloNiBHM3ZyHg1ViDRs4QcnAunwMJ+rLpAEA8l3cWb3Z1xof7ag1iHvX16EwhUfaTG3+YSvTRPv4xHIrseUQ==", "requires": { - "@babel/helper-explode-assignable-expression": "^7.1.0", - "@babel/types": "^7.0.0" + "@babel/helper-explode-assignable-expression": "^7.8.0", + "@babel/types": "^7.8.0" } }, "@babel/helper-builder-react-jsx": { - "version": "7.3.0", - "resolved": "https://registry.npmjs.org/@babel/helper-builder-react-jsx/-/helper-builder-react-jsx-7.3.0.tgz", - "integrity": "sha512-MjA9KgwCuPEkQd9ncSXvSyJ5y+j2sICHyrI0M3L+6fnS4wMSNDc1ARXsbTfbb2cXHn17VisSnU/sHFTCxVxSMw==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-react-jsx/-/helper-builder-react-jsx-7.8.0.tgz", + "integrity": "sha512-Zg7VLtZzcAHoQ13S0pEIGKo8OAG3s5kjsk/4keGmUeNuc810T9fVp6izIaL8ZVeAErRFWJdvqFItY3QMTHMsSg==", "requires": { - "@babel/types": "^7.3.0", + "@babel/types": "^7.8.0", "esutils": "^2.0.0" } }, "@babel/helper-call-delegate": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/helper-call-delegate/-/helper-call-delegate-7.4.4.tgz", - "integrity": "sha512-l79boDFJ8S1c5hvQvG+rc+wHw6IuH7YldmRKsYtpbawsxURu/paVy57FZMomGK22/JckepaikOkY0MoAmdyOlQ==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/helper-call-delegate/-/helper-call-delegate-7.8.0.tgz", + "integrity": "sha512-Vi8K1LScr8ZgLicfuCNSE7JWUPG/H/9Bw9zn+3vQyy4vA54FEGTCuUTOXCFwmBM93OD6jHfjrQ6ZnivM5U+bHg==", "requires": { - "@babel/helper-hoist-variables": "^7.4.4", - "@babel/traverse": "^7.4.4", - "@babel/types": "^7.4.4" + "@babel/helper-hoist-variables": "^7.8.0", + "@babel/traverse": "^7.8.0", + "@babel/types": "^7.8.0" + } + }, + "@babel/helper-compilation-targets": { + "version": "7.8.1", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.8.1.tgz", + "integrity": "sha512-Fsrljg8DHSdnKSzC0YFopX7lseRpVfWMYuC1Dnvf7tw972E2KDjZ4XEaqjO9aJL0sLcG4KNRXxowDxHYIcZ+Cw==", + "requires": { + "@babel/compat-data": "^7.8.1", + "browserslist": "^4.8.2", + "invariant": "^2.2.4", + "levenary": "^1.1.0", + "semver": "^5.5.0" + }, + "dependencies": { + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" + } } }, "@babel/helper-create-class-features-plugin": { - "version": "7.5.5", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.5.5.tgz", - "integrity": "sha512-ZsxkyYiRA7Bg+ZTRpPvB6AbOFKTFFK4LrvTet8lInm0V468MWCaSYJE+I7v2z2r8KNLtYiV+K5kTCnR7dvyZjg==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.8.0.tgz", + "integrity": "sha512-ctCvqYBTlwEl2uF4hCxE0cd/sSw71Zfag0jKa39y4HDLh0BQ4PVBX1384Ye8GqrEZ69xgLp9fwPbv3GgIDDF2Q==", "requires": { - "@babel/helper-function-name": "^7.1.0", - "@babel/helper-member-expression-to-functions": "^7.5.5", - "@babel/helper-optimise-call-expression": "^7.0.0", - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/helper-replace-supers": "^7.5.5", - "@babel/helper-split-export-declaration": "^7.4.4" + "@babel/helper-function-name": "^7.8.0", + "@babel/helper-member-expression-to-functions": "^7.8.0", + "@babel/helper-optimise-call-expression": "^7.8.0", + "@babel/helper-plugin-utils": "^7.8.0", + "@babel/helper-replace-supers": "^7.8.0", + "@babel/helper-split-export-declaration": "^7.8.0" + } + }, + "@babel/helper-create-regexp-features-plugin": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.8.0.tgz", + "integrity": "sha512-vJj2hPbxxLUWJEV86iZiac5curAnC3ZVc+rFmFeWZigUOcuCPpbF+KxoEmxrkmuCGylHFF9t4lkpcDUcxnhQ5g==", + "requires": { + "@babel/helper-regex": "^7.8.0", + "regexpu-core": "^4.6.0" } }, "@babel/helper-define-map": { - "version": "7.5.5", - "resolved": "https://registry.npmjs.org/@babel/helper-define-map/-/helper-define-map-7.5.5.tgz", - "integrity": "sha512-fTfxx7i0B5NJqvUOBBGREnrqbTxRh7zinBANpZXAVDlsZxYdclDp467G1sQ8VZYMnAURY3RpBUAgOYT9GfzHBg==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/helper-define-map/-/helper-define-map-7.8.0.tgz", + "integrity": "sha512-Go06lUlZ4YImNEmdyAH5iO38yh5mbpOPSwA2PtV1vyczFhTZfX0OtzkiIL2pACo6AOYf89pLh42nhhDrqgzC3A==", "requires": { - "@babel/helper-function-name": "^7.1.0", - "@babel/types": "^7.5.5", + "@babel/helper-function-name": "^7.8.0", + "@babel/types": "^7.8.0", "lodash": "^4.17.13" } }, "@babel/helper-explode-assignable-expression": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.1.0.tgz", - "integrity": "sha512-NRQpfHrJ1msCHtKjbzs9YcMmJZOg6mQMmGRB+hbamEdG5PNpaSm95275VD92DvJKuyl0s2sFiDmMZ+EnnvufqA==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.8.0.tgz", + "integrity": "sha512-w4mRQqKAh4M7BSLwvDMm8jYFroEzpqMCtXDhFHP+kNjMIQWpbC6b0Q/RUQsJNSf54rIx6XMdci1Stf60DWw+og==", "requires": { - "@babel/traverse": "^7.1.0", - "@babel/types": "^7.0.0" + "@babel/traverse": "^7.8.0", + "@babel/types": "^7.8.0" } }, "@babel/helper-function-name": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.1.0.tgz", - "integrity": "sha512-A95XEoCpb3TO+KZzJ4S/5uW5fNe26DjBGqf1o9ucyLyCmi1dXq/B3c8iaWTfBk3VvetUxl16e8tIrd5teOCfGw==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.8.0.tgz", + "integrity": "sha512-x9psucuU0Xalw+0Vpr2FYJMLB7/KnPSLZhlkUyOGbYAWRDfmtZBrguYpJYiaNCRV7vGkYjO/gF6/J6yMvdWTDw==", "requires": { - "@babel/helper-get-function-arity": "^7.0.0", - "@babel/template": "^7.1.0", - "@babel/types": "^7.0.0" + "@babel/helper-get-function-arity": "^7.8.0", + "@babel/template": "^7.8.0", + "@babel/types": "^7.8.0" } }, "@babel/helper-get-function-arity": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0.tgz", - "integrity": "sha512-r2DbJeg4svYvt3HOS74U4eWKsUAMRH01Z1ds1zx8KNTPtpTL5JAsdFv8BNyOpVqdFhHkkRDIg5B4AsxmkjAlmQ==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.8.0.tgz", + "integrity": "sha512-eUP5grliToMapQiTaYS2AAO/WwaCG7cuJztR1v/a1aPzUzUeGt+AaI9OvLATc/AfFkF8SLJ10d5ugGt/AQ9d6w==", "requires": { - "@babel/types": "^7.0.0" + "@babel/types": "^7.8.0" } }, "@babel/helper-hoist-variables": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.4.4.tgz", - "integrity": "sha512-VYk2/H/BnYbZDDg39hr3t2kKyifAm1W6zHRfhx8jGjIHpQEBv9dry7oQ2f3+J703TLu69nYdxsovl0XYfcnK4w==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.8.0.tgz", + "integrity": "sha512-jDl66KvuklTXUADcoXDMur1jDtAZUZZkzLIaQ54+z38ih8C0V0hC56hMaoVoyoxN60MwQmmrHctBwcLqP0c/Lw==", "requires": { - "@babel/types": "^7.4.4" + "@babel/types": "^7.8.0" } }, "@babel/helper-member-expression-to-functions": { - "version": "7.5.5", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.5.5.tgz", - "integrity": "sha512-5qZ3D1uMclSNqYcXqiHoA0meVdv+xUEex9em2fqMnrk/scphGlGgg66zjMrPJESPwrFJ6sbfFQYUSa0Mz7FabA==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.8.0.tgz", + "integrity": "sha512-0m1QabGrdXuoxX/g+KOAGndoHwskC70WweqHRQyCsaO67KOEELYh4ECcGw6ZGKjDKa5Y7SW4Qbhw6ly4Fah/jQ==", "requires": { - "@babel/types": "^7.5.5" + "@babel/types": "^7.8.0" } }, "@babel/helper-module-imports": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.0.0.tgz", - "integrity": "sha512-aP/hlLq01DWNEiDg4Jn23i+CXxW/owM4WpDLFUbpjxe4NS3BhLVZQ5i7E0ZrxuQ/vwekIeciyamgB1UIYxxM6A==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.8.0.tgz", + "integrity": "sha512-ylY9J6ZxEcjmJaJ4P6aVs/fZdrZVctCGnxxfYXwCnSMapqd544zT8lWK2qI/vBPjE5gS0o2jILnH+AkpsPauEQ==", "requires": { - "@babel/types": "^7.0.0" + "@babel/types": "^7.8.0" } }, "@babel/helper-module-transforms": { - "version": "7.5.5", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.5.5.tgz", - "integrity": "sha512-jBeCvETKuJqeiaCdyaheF40aXnnU1+wkSiUs/IQg3tB85up1LyL8x77ClY8qJpuRJUcXQo+ZtdNESmZl4j56Pw==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.8.0.tgz", + "integrity": "sha512-fvGhX4FY7YwRdWW/zfddNaKpYl8TaA8hvwONIYhv1/a1ZbgxbTrjsmH6IGWUgUNki7QzbpZ27OEh88sZdft3YA==", "requires": { - "@babel/helper-module-imports": "^7.0.0", - "@babel/helper-simple-access": "^7.1.0", - "@babel/helper-split-export-declaration": "^7.4.4", - "@babel/template": "^7.4.4", - "@babel/types": "^7.5.5", + "@babel/helper-module-imports": "^7.8.0", + "@babel/helper-simple-access": "^7.8.0", + "@babel/helper-split-export-declaration": "^7.8.0", + "@babel/template": "^7.8.0", + "@babel/types": "^7.8.0", "lodash": "^4.17.13" } }, "@babel/helper-optimise-call-expression": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.0.0.tgz", - "integrity": "sha512-u8nd9NQePYNQV8iPWu/pLLYBqZBa4ZaY1YWRFMuxrid94wKI1QNt67NEZ7GAe5Kc/0LLScbim05xZFWkAdrj9g==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.8.0.tgz", + "integrity": "sha512-aiJt1m+K57y0n10fTw+QXcCXzmpkG+o+NoQmAZqlZPstkTE0PZT+Z27QSd/6Gf00nuXJQO4NiJ0/YagSW5kC2A==", "requires": { - "@babel/types": "^7.0.0" + "@babel/types": "^7.8.0" } }, "@babel/helper-plugin-utils": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.0.0.tgz", - "integrity": "sha512-CYAOUCARwExnEixLdB6sDm2dIJ/YgEAKDM1MOeMeZu9Ld/bDgVo8aiWrXwcY7OBh+1Ea2uUcVRcxKk0GJvW7QA==" + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.0.tgz", + "integrity": "sha512-+hAlRGdf8fHQAyNnDBqTHQhwdLURLdrCROoWaEQYiQhk2sV9Rhs+GoFZZfMJExTq9HG8o2NX3uN2G90bFtmFdA==" }, "@babel/helper-regex": { - "version": "7.5.5", - "resolved": "https://registry.npmjs.org/@babel/helper-regex/-/helper-regex-7.5.5.tgz", - "integrity": "sha512-CkCYQLkfkiugbRDO8eZn6lRuR8kzZoGXCg3149iTk5se7g6qykSpy3+hELSwquhu+TgHn8nkLiBwHvNX8Hofcw==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/helper-regex/-/helper-regex-7.8.0.tgz", + "integrity": "sha512-haD8fRsPtyFZkbtxBIaGBBHRtbn0YsyecdYrxNgO0Bl6SlGokJPQX9M2tDuVbeQBYHZVLUPMSwGQn4obHevsMQ==", "requires": { "lodash": "^4.17.13" } }, "@babel/helper-remap-async-to-generator": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.1.0.tgz", - "integrity": "sha512-3fOK0L+Fdlg8S5al8u/hWE6vhufGSn0bN09xm2LXMy//REAF8kDCrYoOBKYmA8m5Nom+sV9LyLCwrFynA8/slg==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.8.0.tgz", + "integrity": "sha512-+aKyBd4oHAaIZgOLq/uLjkUz7ExZ0ppdNBc8Qr72BmtKNAy3A6EJa/ifjj0//CIzQtUDPs3E6HjKM2cV6bnXsQ==", "requires": { - "@babel/helper-annotate-as-pure": "^7.0.0", - "@babel/helper-wrap-function": "^7.1.0", - "@babel/template": "^7.1.0", - "@babel/traverse": "^7.1.0", - "@babel/types": "^7.0.0" + "@babel/helper-annotate-as-pure": "^7.8.0", + "@babel/helper-wrap-function": "^7.8.0", + "@babel/template": "^7.8.0", + "@babel/traverse": "^7.8.0", + "@babel/types": "^7.8.0" } }, "@babel/helper-replace-supers": { - "version": "7.5.5", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.5.5.tgz", - "integrity": "sha512-XvRFWrNnlsow2u7jXDuH4jDDctkxbS7gXssrP4q2nUD606ukXHRvydj346wmNg+zAgpFx4MWf4+usfC93bElJg==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.8.0.tgz", + "integrity": "sha512-R2CyorW4tcO3YzdkClLpt6MS84G+tPkOi0MmiCn1bvYVnmDpdl9R15XOi3NQW2mhOAEeBnuQ4g1Bh7pT2sX8fg==", "requires": { - "@babel/helper-member-expression-to-functions": "^7.5.5", - "@babel/helper-optimise-call-expression": "^7.0.0", - "@babel/traverse": "^7.5.5", - "@babel/types": "^7.5.5" + "@babel/helper-member-expression-to-functions": "^7.8.0", + "@babel/helper-optimise-call-expression": "^7.8.0", + "@babel/traverse": "^7.8.0", + "@babel/types": "^7.8.0" } }, "@babel/helper-simple-access": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.1.0.tgz", - "integrity": "sha512-Vk+78hNjRbsiu49zAPALxTb+JUQCz1aolpd8osOF16BGnLtseD21nbHgLPGUwrXEurZgiCOUmvs3ExTu4F5x6w==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.8.0.tgz", + "integrity": "sha512-I+7yKZJnxp7VIC2UFzXfVjLiJuU16rYFF59x27c+boINkO/pLETgZcoesCryg9jmU4jxEa0foFueW+2wjc9Gsw==", "requires": { - "@babel/template": "^7.1.0", - "@babel/types": "^7.0.0" + "@babel/template": "^7.8.0", + "@babel/types": "^7.8.0" } }, "@babel/helper-split-export-declaration": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.4.4.tgz", - "integrity": "sha512-Ro/XkzLf3JFITkW6b+hNxzZ1n5OQ80NvIUdmHspih1XAhtN3vPTuUFT4eQnela+2MaZ5ulH+iyP513KJrxbN7Q==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.8.0.tgz", + "integrity": "sha512-YhYFhH4T6DlbT6CPtVgLfC1Jp2gbCawU/ml7WJvUpBg01bCrXSzTYMZZXbbIGjq/kHmK8YUATxTppcRGzj31pA==", "requires": { - "@babel/types": "^7.4.4" + "@babel/types": "^7.8.0" } }, "@babel/helper-wrap-function": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.2.0.tgz", - "integrity": "sha512-o9fP1BZLLSrYlxYEYyl2aS+Flun5gtjTIG8iln+XuEzQTs0PLagAGSXUcqruJwD5fM48jzIEggCKpIfWTcR7pQ==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.8.0.tgz", + "integrity": "sha512-2j6idN2jt8Y+8nJ4UPN/6AZa53DAkcETMVmroJQh50qZc59PuQKVjgOIIqmrLoQf6Ia9bs90MHRcID1OW5tfag==", "requires": { - "@babel/helper-function-name": "^7.1.0", - "@babel/template": "^7.1.0", - "@babel/traverse": "^7.1.0", - "@babel/types": "^7.2.0" + "@babel/helper-function-name": "^7.8.0", + "@babel/template": "^7.8.0", + "@babel/traverse": "^7.8.0", + "@babel/types": "^7.8.0" } }, "@babel/helpers": { - "version": "7.5.5", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.5.5.tgz", - "integrity": "sha512-nRq2BUhxZFnfEn/ciJuhklHvFOqjJUD5wpx+1bxUF2axL9C+v4DE/dmp5sT2dKnpOs4orZWzpAZqlCy8QqE/7g==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.8.0.tgz", + "integrity": "sha512-srWKpjAFbiut5JoCReZJ098hLqoZ9HufOnKZPggc7j74XaPuQ+9b3RYPV1M/HfjL63lCNd8uI1O487qIWxAFNA==", "requires": { - "@babel/template": "^7.4.4", - "@babel/traverse": "^7.5.5", - "@babel/types": "^7.5.5" + "@babel/template": "^7.8.0", + "@babel/traverse": "^7.8.0", + "@babel/types": "^7.8.0" } }, "@babel/highlight": { - "version": "7.5.0", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.5.0.tgz", - "integrity": "sha512-7dV4eu9gBxoM0dAnj/BCFDW9LFU0zvTrkq0ugM7pnHEgguOEeOz1so2ZghEdzviYzQEED0r4EAgpsBChKy1TRQ==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.8.0.tgz", + "integrity": "sha512-OsdTJbHlPtIk2mmtwXItYrdmalJ8T0zpVzNAbKSkHshuywj7zb29Y09McV/jQsQunc/nEyHiPV2oy9llYMLqxw==", "requires": { "chalk": "^2.0.0", "esutils": "^2.0.2", @@ -280,605 +324,669 @@ } }, "@babel/parser": { - "version": "7.5.5", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.5.5.tgz", - "integrity": "sha512-E5BN68cqR7dhKan1SfqgPGhQ178bkVKpXTPEXnFJBrEt8/DKRZlybmy+IgYLTeN7tp1R5Ccmbm2rBk17sHYU3g==" + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.8.0.tgz", + "integrity": "sha512-VVtsnUYbd1+2A2vOVhm4P2qNXQE8L/W859GpUHfUcdhX8d3pEKThZuIr6fztocWx9HbK+00/CR0tXnhAggJ4CA==" }, "@babel/plugin-proposal-async-generator-functions": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.2.0.tgz", - "integrity": "sha512-+Dfo/SCQqrwx48ptLVGLdE39YtWRuKc/Y9I5Fy0P1DDBB9lsAHpjcEJQt+4IifuSOSTLBKJObJqMvaO1pIE8LQ==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.8.0.tgz", + "integrity": "sha512-8vIQf8JYced7gCeKDsGETNGKE+zdD/JmP1LBlRn+w3UXc1aSpZv2Y330bB/fnOEbUgPbuFv+IEi+gopg+Fu0kQ==", "requires": { - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/helper-remap-async-to-generator": "^7.1.0", - "@babel/plugin-syntax-async-generators": "^7.2.0" + "@babel/helper-plugin-utils": "^7.8.0", + "@babel/helper-remap-async-to-generator": "^7.8.0", + "@babel/plugin-syntax-async-generators": "^7.8.0" } }, "@babel/plugin-proposal-class-properties": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.4.0.tgz", - "integrity": "sha512-t2ECPNOXsIeK1JxJNKmgbzQtoG27KIlVE61vTqX0DKR9E9sZlVVxWUtEW9D5FlZ8b8j7SBNCHY47GgPKCKlpPg==", + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.7.4.tgz", + "integrity": "sha512-EcuXeV4Hv1X3+Q1TsuOmyyxeTRiSqurGJ26+I/FW1WbymmRRapVORm6x1Zl3iDIHyRxEs+VXWp6qnlcfcJSbbw==", "requires": { - "@babel/helper-create-class-features-plugin": "^7.4.0", + "@babel/helper-create-class-features-plugin": "^7.7.4", "@babel/helper-plugin-utils": "^7.0.0" } }, "@babel/plugin-proposal-decorators": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.4.0.tgz", - "integrity": "sha512-d08TLmXeK/XbgCo7ZeZ+JaeZDtDai/2ctapTRsWWkkmy7G/cqz8DQN/HlWG7RR4YmfXxmExsbU3SuCjlM7AtUg==", + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.7.4.tgz", + "integrity": "sha512-GftcVDcLCwVdzKmwOBDjATd548+IE+mBo7ttgatqNDR7VG7GqIuZPtRWlMLHbhTXhcnFZiGER8iIYl1n/imtsg==", "requires": { - "@babel/helper-create-class-features-plugin": "^7.4.0", + "@babel/helper-create-class-features-plugin": "^7.7.4", "@babel/helper-plugin-utils": "^7.0.0", - "@babel/plugin-syntax-decorators": "^7.2.0" + "@babel/plugin-syntax-decorators": "^7.7.4" } }, "@babel/plugin-proposal-dynamic-import": { - "version": "7.5.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.5.0.tgz", - "integrity": "sha512-x/iMjggsKTFHYC6g11PL7Qy58IK8H5zqfm9e6hu4z1iH2IRyAp9u9dL80zA6R76yFovETFLKz2VJIC2iIPBuFw==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.8.0.tgz", + "integrity": "sha512-YzMq0AqeTR4Mh2pz3GrCWqhcEV38HgUMMR/56/YR5GPc4Y2p1KJ4Le6j92vMnW8TJqVj+qJz/KDNglpMeww9Yg==", "requires": { - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/plugin-syntax-dynamic-import": "^7.2.0" + "@babel/helper-plugin-utils": "^7.8.0", + "@babel/plugin-syntax-dynamic-import": "^7.8.0" } }, "@babel/plugin-proposal-json-strings": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.2.0.tgz", - "integrity": "sha512-MAFV1CA/YVmYwZG0fBQyXhmj0BHCB5egZHCKWIFVv/XCxAeVGIHfos3SwDck4LvCllENIAg7xMKOG5kH0dzyUg==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.8.0.tgz", + "integrity": "sha512-pSpuhwn926vtNeUH2FHx1OzIXaUMgklG0MzlFZJVEg37fB904gOxN572NgBae+KDwFyZDpkLMyEkVA011lBJrQ==", + "requires": { + "@babel/helper-plugin-utils": "^7.8.0", + "@babel/plugin-syntax-json-strings": "^7.8.0" + } + }, + "@babel/plugin-proposal-nullish-coalescing-operator": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.8.0.tgz", + "integrity": "sha512-cQMI+RQdcK2IyMm13NKKFCYfOSBUtFxEeRBOdFCi2Pubv/CpkrCubc/ikdeKMT6Lu+uQ+lNSDEJvDCOQZkUy0g==", + "requires": { + "@babel/helper-plugin-utils": "^7.8.0", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.0" + } + }, + "@babel/plugin-proposal-numeric-separator": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.7.4.tgz", + "integrity": "sha512-CG605v7lLpVgVldSY6kxsN9ui1DxFOyepBfuX2AzU2TNriMAYApoU55mrGw9Jr4TlrTzPCG10CL8YXyi+E/iPw==", "requires": { "@babel/helper-plugin-utils": "^7.0.0", - "@babel/plugin-syntax-json-strings": "^7.2.0" + "@babel/plugin-syntax-numeric-separator": "^7.7.4" } }, "@babel/plugin-proposal-object-rest-spread": { - "version": "7.5.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.5.5.tgz", - "integrity": "sha512-F2DxJJSQ7f64FyTVl5cw/9MWn6naXGdk3Q3UhDbFEEHv+EilCPoeRD3Zh/Utx1CJz4uyKlQ4uH+bJPbEhMV7Zw==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.8.0.tgz", + "integrity": "sha512-SjJ2ZXCylpWC+5DTES0/pbpNmw/FnjU/3dF068xF0DU9aN+oOKah+3MCSFcb4pnZ9IwmxfOy4KnbGJSQR+hAZA==", "requires": { - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/plugin-syntax-object-rest-spread": "^7.2.0" + "@babel/helper-plugin-utils": "^7.8.0", + "@babel/plugin-syntax-object-rest-spread": "^7.8.0" } }, "@babel/plugin-proposal-optional-catch-binding": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.2.0.tgz", - "integrity": "sha512-mgYj3jCcxug6KUcX4OBoOJz3CMrwRfQELPQ5560F70YQUBZB7uac9fqaWamKR1iWUzGiK2t0ygzjTScZnVz75g==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.8.0.tgz", + "integrity": "sha512-tHP3eez6TrpPJYttBZ/6uItRbIuXUIDpQ9xwvzKwR+RboWGMJ7WzFC5dDJ3vjLuCx0/DG1tM0MVkmgcBybth9w==", "requires": { - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/plugin-syntax-optional-catch-binding": "^7.2.0" + "@babel/helper-plugin-utils": "^7.8.0", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.0" + } + }, + "@babel/plugin-proposal-optional-chaining": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.8.0.tgz", + "integrity": "sha512-PNBHxPHE91m+LLOdGwlvyGicWfrMgiVwng5WdB3CMjd61+vn3vPw0GbgECIAUCZnyi7Jqs5htUIZRztGuV8/5g==", + "requires": { + "@babel/helper-plugin-utils": "^7.8.0", + "@babel/plugin-syntax-optional-chaining": "^7.8.0" } }, "@babel/plugin-proposal-unicode-property-regex": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.4.4.tgz", - "integrity": "sha512-j1NwnOqMG9mFUOH58JTFsA/+ZYzQLUZ/drqWUqxCYLGeu2JFZL8YrNC9hBxKmWtAuOCHPcRpgv7fhap09Fb4kA==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.8.0.tgz", + "integrity": "sha512-3oK0Qt5w4arb+es3rWBribDbtc0TYJP7dFZ1dXcYul3cXderqfIOoSx9YUC1oD208nJwJO/++fvrgLmkYSbe8A==", "requires": { - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/helper-regex": "^7.4.4", - "regexpu-core": "^4.5.4" + "@babel/helper-create-regexp-features-plugin": "^7.8.0", + "@babel/helper-plugin-utils": "^7.8.0" } }, "@babel/plugin-syntax-async-generators": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.2.0.tgz", - "integrity": "sha512-1ZrIRBv2t0GSlcwVoQ6VgSLpLgiN/FVQUzt9znxo7v2Ov4jJrs8RY8tv0wvDmFN3qIdMKWrmMMW6yZ0G19MfGg==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.0.tgz", + "integrity": "sha512-a8w8k7pK8nYhem07rXdAq03T+DlTX8LFojUptrh9JEx80AgLqGiuoFIyQOGTWif39kFnDOQqbzl1s6KQqrfV+A==", "requires": { - "@babel/helper-plugin-utils": "^7.0.0" + "@babel/helper-plugin-utils": "^7.8.0" } }, "@babel/plugin-syntax-decorators": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.2.0.tgz", - "integrity": "sha512-38QdqVoXdHUQfTpZo3rQwqQdWtCn5tMv4uV6r2RMfTqNBuv4ZBhz79SfaQWKTVmxHjeFv/DnXVC/+agHCklYWA==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.8.0.tgz", + "integrity": "sha512-Qz68qh9jJqQePGWqbNW9PA7vkE2gvnWkYtx32jgPOszpE7u+xObPkRGm3B80oXAjQlBdTa4ktqjkOIRiKRuapw==", "requires": { - "@babel/helper-plugin-utils": "^7.0.0" + "@babel/helper-plugin-utils": "^7.8.0" } }, "@babel/plugin-syntax-dynamic-import": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.2.0.tgz", - "integrity": "sha512-mVxuJ0YroI/h/tbFTPGZR8cv6ai+STMKNBq0f8hFxsxWjl94qqhsb+wXbpNMDPU3cfR1TIsVFzU3nXyZMqyK4w==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.0.tgz", + "integrity": "sha512-Mx2RzpCHJaBfmFdA2abXDKRHVJdzJ6R0Wqwb6TxCgM7NRR5wcC4cyiAsRL7Ga+lwG8GG1cKvb+4ENjic8y15jA==", "requires": { - "@babel/helper-plugin-utils": "^7.0.0" + "@babel/helper-plugin-utils": "^7.8.0" } }, "@babel/plugin-syntax-flow": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.2.0.tgz", - "integrity": "sha512-r6YMuZDWLtLlu0kqIim5o/3TNRAlWb073HwT3e2nKf9I8IIvOggPrnILYPsrrKilmn/mYEMCf/Z07w3yQJF6dg==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.8.0.tgz", + "integrity": "sha512-MDK9WdjDccrxzz+4sthpSDnqdf5McJwTtfBYGitOweC/j0Zg6e8wHmP4RGLTeyGYe/IySoRgKC5hvSm6ddrNRw==", "requires": { - "@babel/helper-plugin-utils": "^7.0.0" + "@babel/helper-plugin-utils": "^7.8.0" } }, "@babel/plugin-syntax-json-strings": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.2.0.tgz", - "integrity": "sha512-5UGYnMSLRE1dqqZwug+1LISpA403HzlSfsg6P9VXU6TBjcSHeNlw4DxDx7LgpF+iKZoOG/+uzqoRHTdcUpiZNg==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.0.tgz", + "integrity": "sha512-LPykaAbH86L5NnDfCRSpNxtEHZk+6GaFzXfWEFU/6R4v69EXQr6GOp7hwH+Uw0QlYVN++s6TukTJ3flFcspahA==", "requires": { - "@babel/helper-plugin-utils": "^7.0.0" + "@babel/helper-plugin-utils": "^7.8.0" } }, "@babel/plugin-syntax-jsx": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.2.0.tgz", - "integrity": "sha512-VyN4QANJkRW6lDBmENzRszvZf3/4AXaj9YR7GwrWeeN9tEBPuXbmDYVU9bYBN0D70zCWVwUy0HWq2553VCb6Hw==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.8.0.tgz", + "integrity": "sha512-zLDUckAuKeOtxJhfNE0TlR7iEApb2u7EYRlh5cxKzq6A5VzUbYEdyJGJlug41jDbjRbHTtsLKZUnUcy/8V3xZw==", "requires": { - "@babel/helper-plugin-utils": "^7.0.0" + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-nullish-coalescing-operator": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.0.tgz", + "integrity": "sha512-Rv2hnBToN6rbA9hO2a4vtwXZLzNa+TWkoSIMMvUezFz5+D9NPeX7SFrArwtFzzbwndmWiqboTr5rNpzAz0MPpA==", + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-numeric-separator": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.8.0.tgz", + "integrity": "sha512-GEYjlQAr/zXMVuce0Nq/boG4wNjJxdIOc4RKcgBEo/r/J3LrghZz8+ZYo8k+OuLJKvvV22k84tBuw1YunnLgCQ==", + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" } }, "@babel/plugin-syntax-object-rest-spread": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.2.0.tgz", - "integrity": "sha512-t0JKGgqk2We+9may3t0xDdmneaXmyxq0xieYcKHxIsrJO64n1OiMWNUtc5gQK1PA0NpdCRrtZp4z+IUaKugrSA==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.0.tgz", + "integrity": "sha512-dt89fDlkfkTrQcy5KavMQPyF2A6tR0kYp8HAnIoQv5hO34iAUffHghP/hMGd7Gf/+uYTmLQO0ar7peX1SUWyIA==", "requires": { - "@babel/helper-plugin-utils": "^7.0.0" + "@babel/helper-plugin-utils": "^7.8.0" } }, "@babel/plugin-syntax-optional-catch-binding": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.2.0.tgz", - "integrity": "sha512-bDe4xKNhb0LI7IvZHiA13kff0KEfaGX/Hv4lMA9+7TEc63hMNvfKo6ZFpXhKuEp+II/q35Gc4NoMeDZyaUbj9w==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.0.tgz", + "integrity": "sha512-EIgJVy+u1RvR2gJfX4ReLwAupO/twllUue1wPrRxhu18+eC3bGTEcOSXLQdaE9ya9NG1rE0eQs0GSiloUGFEwg==", "requires": { - "@babel/helper-plugin-utils": "^7.0.0" + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-optional-chaining": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.0.tgz", + "integrity": "sha512-LV1c+TTAO8Vawe3t+WXBHYWbS7endP8MSlqKPKEZOyWPEJX2akl3jfvFG828/OE7RpyoC3JXfLJDFj/jN7A8hg==", + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-top-level-await": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.8.0.tgz", + "integrity": "sha512-iXR/Cw32fMfWlD1sK2zD/nXtuLStkalRv+xee6VrX84CFrn2LKwb/EOs/4UaDNUpUsws8YZYKeQjPagacFquug==", + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" } }, "@babel/plugin-syntax-typescript": { - "version": "7.3.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.3.3.tgz", - "integrity": "sha512-dGwbSMA1YhVS8+31CnPR7LB4pcbrzcV99wQzby4uAfrkZPYZlQ7ImwdpzLqi6Z6IL02b8IAL379CaMwo0x5Lag==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.8.0.tgz", + "integrity": "sha512-LrvVrabb993Ve5fzXsyEkfYCuhpXBwsUFjlvgD8UmXXg3r/8/ceooSdRvjdmtPXXz+lHaqZHZooV1jMWer2qkA==", "requires": { - "@babel/helper-plugin-utils": "^7.0.0" + "@babel/helper-plugin-utils": "^7.8.0" } }, "@babel/plugin-transform-arrow-functions": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.2.0.tgz", - "integrity": "sha512-ER77Cax1+8/8jCB9fo4Ud161OZzWN5qawi4GusDuRLcDbDG+bIGYY20zb2dfAFdTRGzrfq2xZPvF0R64EHnimg==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.8.0.tgz", + "integrity": "sha512-9KfteDp9d8cF388dxFMOh3Dum41qpOVUPVjQhXGd1kPyQBE05FJgYndiAriML2yhMIbZ2bjgweh2nnvBXDH2MQ==", "requires": { - "@babel/helper-plugin-utils": "^7.0.0" + "@babel/helper-plugin-utils": "^7.8.0" } }, "@babel/plugin-transform-async-to-generator": { - "version": "7.5.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.5.0.tgz", - "integrity": "sha512-mqvkzwIGkq0bEF1zLRRiTdjfomZJDV33AH3oQzHVGkI2VzEmXLpKKOBvEVaFZBJdN0XTyH38s9j/Kiqr68dggg==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.8.0.tgz", + "integrity": "sha512-9dvBvJnEdsDWYMrykoMyLNVRPGoub6SFlARtsYgSQ1riTjnyBjhctihSME4XsSku86F59PDeFpC9PCU+9I154w==", "requires": { - "@babel/helper-module-imports": "^7.0.0", - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/helper-remap-async-to-generator": "^7.1.0" + "@babel/helper-module-imports": "^7.8.0", + "@babel/helper-plugin-utils": "^7.8.0", + "@babel/helper-remap-async-to-generator": "^7.8.0" } }, "@babel/plugin-transform-block-scoped-functions": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.2.0.tgz", - "integrity": "sha512-ntQPR6q1/NKuphly49+QiQiTN0O63uOwjdD6dhIjSWBI5xlrbUFh720TIpzBhpnrLfv2tNH/BXvLIab1+BAI0w==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.8.0.tgz", + "integrity": "sha512-bim6gUfHq2kPN+aQst33ZEMeglpaUXAo6PWTZvOA8BOnWpNKgZcUzBvpZhh2ofL6YhZgzGoRwVVfzwynDEf47g==", "requires": { - "@babel/helper-plugin-utils": "^7.0.0" + "@babel/helper-plugin-utils": "^7.8.0" } }, "@babel/plugin-transform-block-scoping": { - "version": "7.5.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.5.5.tgz", - "integrity": "sha512-82A3CLRRdYubkG85lKwhZB0WZoHxLGsJdux/cOVaJCJpvYFl1LVzAIFyRsa7CvXqW8rBM4Zf3Bfn8PHt5DP0Sg==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.8.0.tgz", + "integrity": "sha512-FKTK4hzg7W950Yu9iqMl12WBixCmusMc5HBt3/ErvpFLnvr3/6mu/EBTZoCEJ0mw/lQUDfU01vTcZY9oEahlMg==", "requires": { - "@babel/helper-plugin-utils": "^7.0.0", + "@babel/helper-plugin-utils": "^7.8.0", "lodash": "^4.17.13" } }, "@babel/plugin-transform-classes": { - "version": "7.5.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.5.5.tgz", - "integrity": "sha512-U2htCNK/6e9K7jGyJ++1p5XRU+LJjrwtoiVn9SzRlDT2KubcZ11OOwy3s24TjHxPgxNwonCYP7U2K51uVYCMDg==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.8.0.tgz", + "integrity": "sha512-18RLDwKtGXCLLbf5V03GojebPH7dKYCmIBqQGhgfZDoYsyEzR9kMZ6IxlJP72K5ROC9ADa4KPI6ywuh7NfQOgQ==", "requires": { - "@babel/helper-annotate-as-pure": "^7.0.0", - "@babel/helper-define-map": "^7.5.5", - "@babel/helper-function-name": "^7.1.0", - "@babel/helper-optimise-call-expression": "^7.0.0", - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/helper-replace-supers": "^7.5.5", - "@babel/helper-split-export-declaration": "^7.4.4", + "@babel/helper-annotate-as-pure": "^7.8.0", + "@babel/helper-define-map": "^7.8.0", + "@babel/helper-function-name": "^7.8.0", + "@babel/helper-optimise-call-expression": "^7.8.0", + "@babel/helper-plugin-utils": "^7.8.0", + "@babel/helper-replace-supers": "^7.8.0", + "@babel/helper-split-export-declaration": "^7.8.0", "globals": "^11.1.0" } }, "@babel/plugin-transform-computed-properties": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.2.0.tgz", - "integrity": "sha512-kP/drqTxY6Xt3NNpKiMomfgkNn4o7+vKxK2DDKcBG9sHj51vHqMBGy8wbDS/J4lMxnqs153/T3+DmCEAkC5cpA==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.8.0.tgz", + "integrity": "sha512-FaODHuQRdnWFVwxLPlTN85Lk/aitfvQBHTXahf58FnatCynfhkeNUO8ID+AqAxY4IJsZjeH6OnKDzcGfgKJcVw==", "requires": { - "@babel/helper-plugin-utils": "^7.0.0" + "@babel/helper-plugin-utils": "^7.8.0" } }, "@babel/plugin-transform-destructuring": { - "version": "7.5.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.5.0.tgz", - "integrity": "sha512-YbYgbd3TryYYLGyC7ZR+Tq8H/+bCmwoaxHfJHupom5ECstzbRLTch6gOQbhEY9Z4hiCNHEURgq06ykFv9JZ/QQ==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.8.0.tgz", + "integrity": "sha512-D+69HT//cE86aBTLULzSBFLC5A7HcPQzJPiny6P4SLHkDF750MylRKO3iWvdgvb+OSp5dOrOxwXajvaxk1ZfYA==", "requires": { - "@babel/helper-plugin-utils": "^7.0.0" + "@babel/helper-plugin-utils": "^7.8.0" } }, "@babel/plugin-transform-dotall-regex": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.4.4.tgz", - "integrity": "sha512-P05YEhRc2h53lZDjRPk/OektxCVevFzZs2Gfjd545Wde3k+yFDbXORgl2e0xpbq8mLcKJ7Idss4fAg0zORN/zg==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.8.0.tgz", + "integrity": "sha512-pq/XLkDB4MPvTe9ktHJInfWksalXogrIGRZJUG7RiDXhEfdNrlducoMPbACZQuCFtelVgVpD0VyreiY0l38G7g==", "requires": { - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/helper-regex": "^7.4.4", - "regexpu-core": "^4.5.4" + "@babel/helper-create-regexp-features-plugin": "^7.8.0", + "@babel/helper-plugin-utils": "^7.8.0" } }, "@babel/plugin-transform-duplicate-keys": { - "version": "7.5.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.5.0.tgz", - "integrity": "sha512-igcziksHizyQPlX9gfSjHkE2wmoCH3evvD2qR5w29/Dk0SMKE/eOI7f1HhBdNhR/zxJDqrgpoDTq5YSLH/XMsQ==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.8.0.tgz", + "integrity": "sha512-REtYWvpP4TDw4oVeP01vQJcAeewjgk8/i7tPFP11vUjvarUGGyxJLeq79WEnIdnKPQJirZaoDRT4kEWEdSWkDw==", "requires": { - "@babel/helper-plugin-utils": "^7.0.0" + "@babel/helper-plugin-utils": "^7.8.0" } }, "@babel/plugin-transform-exponentiation-operator": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.2.0.tgz", - "integrity": "sha512-umh4hR6N7mu4Elq9GG8TOu9M0bakvlsREEC+ialrQN6ABS4oDQ69qJv1VtR3uxlKMCQMCvzk7vr17RHKcjx68A==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.8.0.tgz", + "integrity": "sha512-vaDgF3gPLzVcoe3UZqnra6FA7O797sZc+UCHPd9eQTI34cPtpCA270LzopIXS3Fhc3UmFrijLmre9mHTmUKVgg==", "requires": { - "@babel/helper-builder-binary-assignment-operator-visitor": "^7.1.0", - "@babel/helper-plugin-utils": "^7.0.0" + "@babel/helper-builder-binary-assignment-operator-visitor": "^7.8.0", + "@babel/helper-plugin-utils": "^7.8.0" } }, "@babel/plugin-transform-flow-strip-types": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.4.0.tgz", - "integrity": "sha512-C4ZVNejHnfB22vI2TYN4RUp2oCmq6cSEAg4RygSvYZUECRqUu9O4PMEMNJ4wsemaRGg27BbgYctG4BZh+AgIHw==", + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.7.4.tgz", + "integrity": "sha512-w9dRNlHY5ElNimyMYy0oQowvQpwt/PRHI0QS98ZJCTZU2bvSnKXo5zEiD5u76FBPigTm8TkqzmnUTg16T7qbkA==", "requires": { "@babel/helper-plugin-utils": "^7.0.0", - "@babel/plugin-syntax-flow": "^7.2.0" + "@babel/plugin-syntax-flow": "^7.7.4" } }, "@babel/plugin-transform-for-of": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.4.4.tgz", - "integrity": "sha512-9T/5Dlr14Z9TIEXLXkt8T1DU7F24cbhwhMNUziN3hB1AXoZcdzPcTiKGRn/6iOymDqtTKWnr/BtRKN9JwbKtdQ==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.8.0.tgz", + "integrity": "sha512-9j9g0qViCAo8E5qCBSaQdghymn7A9bRXSfS9jU7oLpYccYFZg9A+1KO8X+HV7fhJYH6mZ+e7MRg4p3sLo+RG6Q==", "requires": { - "@babel/helper-plugin-utils": "^7.0.0" + "@babel/helper-plugin-utils": "^7.8.0" } }, "@babel/plugin-transform-function-name": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.4.4.tgz", - "integrity": "sha512-iU9pv7U+2jC9ANQkKeNF6DrPy4GBa4NWQtl6dHB4Pb3izX2JOEvDTFarlNsBj/63ZEzNNIAMs3Qw4fNCcSOXJA==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.8.0.tgz", + "integrity": "sha512-YL8Ol54UKeIyY1uUGfry+B9ppXAB3aVBB1gG9gxqhg/OBCPpV2QUNswmjvfmyXEdaWv8qODssBgX7on792h44w==", "requires": { - "@babel/helper-function-name": "^7.1.0", - "@babel/helper-plugin-utils": "^7.0.0" + "@babel/helper-function-name": "^7.8.0", + "@babel/helper-plugin-utils": "^7.8.0" } }, "@babel/plugin-transform-literals": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.2.0.tgz", - "integrity": "sha512-2ThDhm4lI4oV7fVQ6pNNK+sx+c/GM5/SaML0w/r4ZB7sAneD/piDJtwdKlNckXeyGK7wlwg2E2w33C/Hh+VFCg==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.8.0.tgz", + "integrity": "sha512-7UDPKG+uVltsZt98Hw+rMbLg772r8fQC6YJ2fNDckcpAXgIWqQbMCmCpfYo0hBNhdhqocM73auk4P/zziQshQw==", "requires": { - "@babel/helper-plugin-utils": "^7.0.0" + "@babel/helper-plugin-utils": "^7.8.0" } }, "@babel/plugin-transform-member-expression-literals": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.2.0.tgz", - "integrity": "sha512-HiU3zKkSU6scTidmnFJ0bMX8hz5ixC93b4MHMiYebmk2lUVNGOboPsqQvx5LzooihijUoLR/v7Nc1rbBtnc7FA==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.8.0.tgz", + "integrity": "sha512-lJSdaWR56wmrosCiyqKFRVnLrFYoVAk2mtZAyegt7akeJky/gguv0Rukx9GV3XwHGuM1ZPE06cZMjNlcLp8LrQ==", "requires": { - "@babel/helper-plugin-utils": "^7.0.0" + "@babel/helper-plugin-utils": "^7.8.0" } }, "@babel/plugin-transform-modules-amd": { - "version": "7.5.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.5.0.tgz", - "integrity": "sha512-n20UsQMKnWrltocZZm24cRURxQnWIvsABPJlw/fvoy9c6AgHZzoelAIzajDHAQrDpuKFFPPcFGd7ChsYuIUMpg==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.8.0.tgz", + "integrity": "sha512-mFr1O3TaDL4XozM3AzNPz9AsxzzjTxwn4aOShYP5TlO+4rufvjagV2KKDTPMZTQm1ZA/C/PxJDsDekEnnUGz5A==", "requires": { - "@babel/helper-module-transforms": "^7.1.0", - "@babel/helper-plugin-utils": "^7.0.0", + "@babel/helper-module-transforms": "^7.8.0", + "@babel/helper-plugin-utils": "^7.8.0", "babel-plugin-dynamic-import-node": "^2.3.0" } }, "@babel/plugin-transform-modules-commonjs": { - "version": "7.5.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.5.0.tgz", - "integrity": "sha512-xmHq0B+ytyrWJvQTc5OWAC4ii6Dhr0s22STOoydokG51JjWhyYo5mRPXoi+ZmtHQhZZwuXNN+GG5jy5UZZJxIQ==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.8.0.tgz", + "integrity": "sha512-w2g8tmL7NgBYt6alc8YawMcmPiYqnVvvI0kLB++VOUOssqdJMAkfQOMGV+2M8H5uhJYDaAghAVMUYps3s+jMrw==", "requires": { - "@babel/helper-module-transforms": "^7.4.4", - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/helper-simple-access": "^7.1.0", + "@babel/helper-module-transforms": "^7.8.0", + "@babel/helper-plugin-utils": "^7.8.0", + "@babel/helper-simple-access": "^7.8.0", "babel-plugin-dynamic-import-node": "^2.3.0" } }, "@babel/plugin-transform-modules-systemjs": { - "version": "7.5.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.5.0.tgz", - "integrity": "sha512-Q2m56tyoQWmuNGxEtUyeEkm6qJYFqs4c+XyXH5RAuYxObRNz9Zgj/1g2GMnjYp2EUyEy7YTrxliGCXzecl/vJg==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.8.0.tgz", + "integrity": "sha512-tKF9KLiIsiKyWTVU0yo+NcNAylGn7euggYwXw63/tMxGtDTPsB9Y7Ecqv4EoXEwtoJOJ0Lewf17oaWQtindxIA==", "requires": { - "@babel/helper-hoist-variables": "^7.4.4", - "@babel/helper-plugin-utils": "^7.0.0", + "@babel/helper-hoist-variables": "^7.8.0", + "@babel/helper-module-transforms": "^7.8.0", + "@babel/helper-plugin-utils": "^7.8.0", "babel-plugin-dynamic-import-node": "^2.3.0" } }, "@babel/plugin-transform-modules-umd": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.2.0.tgz", - "integrity": "sha512-BV3bw6MyUH1iIsGhXlOK6sXhmSarZjtJ/vMiD9dNmpY8QXFFQTj+6v92pcfy1iqa8DeAfJFwoxcrS/TUZda6sw==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.8.0.tgz", + "integrity": "sha512-lAwNfXwmfTy7fl2XOyoVpMXnLkJANgH0vdSYNFcS4RuJPBtHfunGA+Y0L7wsHmfPzyVYt8sUglLjaWtdZMNJNg==", "requires": { - "@babel/helper-module-transforms": "^7.1.0", - "@babel/helper-plugin-utils": "^7.0.0" + "@babel/helper-module-transforms": "^7.8.0", + "@babel/helper-plugin-utils": "^7.8.0" } }, "@babel/plugin-transform-named-capturing-groups-regex": { - "version": "7.4.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.4.5.tgz", - "integrity": "sha512-z7+2IsWafTBbjNsOxU/Iv5CvTJlr5w4+HGu1HovKYTtgJ362f7kBcQglkfmlspKKZ3bgrbSGvLfNx++ZJgCWsg==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.8.0.tgz", + "integrity": "sha512-kq1rxQ1HviCP13SMGZ4WjBBpdogTGK7yn/g/+p+g1AQledgHOWKVeMY1DwKYGlGJ/grDGTOqpJLF1v3Sb7ghKA==", "requires": { - "regexp-tree": "^0.1.6" + "@babel/helper-create-regexp-features-plugin": "^7.8.0" } }, "@babel/plugin-transform-new-target": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.4.4.tgz", - "integrity": "sha512-r1z3T2DNGQwwe2vPGZMBNjioT2scgWzK9BCnDEh+46z8EEwXBq24uRzd65I7pjtugzPSj921aM15RpESgzsSuA==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.8.0.tgz", + "integrity": "sha512-hH1Afz9Xy/wkcxhoI0vYw48kTBJqYUhMmhp3SLI1p817iByM6ItH4LS8tZatDAIKmAQAXj8d3Ups1BgVJECDrA==", "requires": { - "@babel/helper-plugin-utils": "^7.0.0" + "@babel/helper-plugin-utils": "^7.8.0" } }, "@babel/plugin-transform-object-super": { - "version": "7.5.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.5.5.tgz", - "integrity": "sha512-un1zJQAhSosGFBduPgN/YFNvWVpRuHKU7IHBglLoLZsGmruJPOo6pbInneflUdmq7YvSVqhpPs5zdBvLnteltQ==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.8.0.tgz", + "integrity": "sha512-2DYqQ811nRlFVlni6iqfxBVVGqkBgfvEv/lcvmdNu2CaG+EA7zSP1hqYUsqamR+uCdDbsrV7uY6/0rkXbJo5YQ==", "requires": { - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/helper-replace-supers": "^7.5.5" + "@babel/helper-plugin-utils": "^7.8.0", + "@babel/helper-replace-supers": "^7.8.0" } }, "@babel/plugin-transform-parameters": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.4.4.tgz", - "integrity": "sha512-oMh5DUO1V63nZcu/ZVLQFqiihBGo4OpxJxR1otF50GMeCLiRx5nUdtokd+u9SuVJrvvuIh9OosRFPP4pIPnwmw==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.8.0.tgz", + "integrity": "sha512-9R2yykk7H92rntETO0fq52vJ4OFaTcDA49K9s8bQPyoD4o3/SkWEklukArCsQC6fowEuraPkH/umopr9uO539g==", "requires": { - "@babel/helper-call-delegate": "^7.4.4", - "@babel/helper-get-function-arity": "^7.0.0", - "@babel/helper-plugin-utils": "^7.0.0" + "@babel/helper-call-delegate": "^7.8.0", + "@babel/helper-get-function-arity": "^7.8.0", + "@babel/helper-plugin-utils": "^7.8.0" } }, "@babel/plugin-transform-property-literals": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.2.0.tgz", - "integrity": "sha512-9q7Dbk4RhgcLp8ebduOpCbtjh7C0itoLYHXd9ueASKAG/is5PQtMR5VJGka9NKqGhYEGn5ITahd4h9QeBMylWQ==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.8.0.tgz", + "integrity": "sha512-vjZaQlojnZIahu5ofEW+hPJfDI5A6r2Sbi5C0RuCaAOFj7viDIR5kOR7ul3Fz5US8V1sVk5Zd2yuPaz7iBeysg==", "requires": { - "@babel/helper-plugin-utils": "^7.0.0" + "@babel/helper-plugin-utils": "^7.8.0" } }, "@babel/plugin-transform-react-constant-elements": { - "version": "7.5.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.5.0.tgz", - "integrity": "sha512-c5Ba8cpybZFp1Izkf2sWGuNjOxoQ32tFgBvvYvwGhi4+9f6vGiSK9Gex4uVuO/Va6YJFu41aAh1MzMjUWkp0IQ==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.8.0.tgz", + "integrity": "sha512-Rv1xUzuQK1tC66/4FxaG750bDr/Nv5AiSBmIwAK4bhksGUsl8XHPznASFchvsM7JMjI50gZvXMKmDJiKbyAfLw==", "requires": { - "@babel/helper-annotate-as-pure": "^7.0.0", - "@babel/helper-plugin-utils": "^7.0.0" + "@babel/helper-annotate-as-pure": "^7.8.0", + "@babel/helper-plugin-utils": "^7.8.0" } }, "@babel/plugin-transform-react-display-name": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.2.0.tgz", - "integrity": "sha512-Htf/tPa5haZvRMiNSQSFifK12gtr/8vwfr+A9y69uF0QcU77AVu4K7MiHEkTxF7lQoHOL0F9ErqgfNEAKgXj7A==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.8.0.tgz", + "integrity": "sha512-oozdOhU2hZ6Tb9LS9BceGqDSmiUrlZX8lmRqnxQuiGzqWlhflIRQ1oFBHdV+hv+Zi9e5BhRkfSYtMLRLEkuOVA==", "requires": { - "@babel/helper-plugin-utils": "^7.0.0" + "@babel/helper-plugin-utils": "^7.8.0" } }, "@babel/plugin-transform-react-jsx": { - "version": "7.3.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.3.0.tgz", - "integrity": "sha512-a/+aRb7R06WcKvQLOu4/TpjKOdvVEKRLWFpKcNuHhiREPgGRB4TQJxq07+EZLS8LFVYpfq1a5lDUnuMdcCpBKg==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.8.0.tgz", + "integrity": "sha512-r5DgP2ZblaGmW/azRS9rlaf3oY4r/ByXRDA5Lcr3iHUkx3cCfL9RM10gU7AQmzwKymoq8LZ55sHyq9VeQFHwyQ==", "requires": { - "@babel/helper-builder-react-jsx": "^7.3.0", - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/plugin-syntax-jsx": "^7.2.0" + "@babel/helper-builder-react-jsx": "^7.8.0", + "@babel/helper-plugin-utils": "^7.8.0", + "@babel/plugin-syntax-jsx": "^7.8.0" } }, "@babel/plugin-transform-react-jsx-self": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.2.0.tgz", - "integrity": "sha512-v6S5L/myicZEy+jr6ielB0OR8h+EH/1QFx/YJ7c7Ua+7lqsjj/vW6fD5FR9hB/6y7mGbfT4vAURn3xqBxsUcdg==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.8.0.tgz", + "integrity": "sha512-hJXfJdLDDlJoxW/rAjkuIpGUUTizQ6fN9tIciW1M8KIqFsmpEf9psBPNTXYRCOLYLEsra+/WgVq+sc+1z05nQw==", "requires": { - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/plugin-syntax-jsx": "^7.2.0" + "@babel/helper-plugin-utils": "^7.8.0", + "@babel/plugin-syntax-jsx": "^7.8.0" } }, "@babel/plugin-transform-react-jsx-source": { - "version": "7.5.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.5.0.tgz", - "integrity": "sha512-58Q+Jsy4IDCZx7kqEZuSDdam/1oW8OdDX8f+Loo6xyxdfg1yF0GE2XNJQSTZCaMol93+FBzpWiPEwtbMloAcPg==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.8.0.tgz", + "integrity": "sha512-W+0VXOhMRdUTL7brjKXND+BiXbsxczfMdZongQ/Jtti0JVMtcTxWo66NMxNNtbPYvbc4aUXmgjl3eMms41sYtg==", "requires": { - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/plugin-syntax-jsx": "^7.2.0" + "@babel/helper-plugin-utils": "^7.8.0", + "@babel/plugin-syntax-jsx": "^7.8.0" } }, "@babel/plugin-transform-regenerator": { - "version": "7.4.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.4.5.tgz", - "integrity": "sha512-gBKRh5qAaCWntnd09S8QC7r3auLCqq5DI6O0DlfoyDjslSBVqBibrMdsqO+Uhmx3+BlOmE/Kw1HFxmGbv0N9dA==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.8.0.tgz", + "integrity": "sha512-n88GT8PZuOHWxqxCJORW3g1QaYzQhHu5sEslxYeQkHVoewfnfuWN37t7YGaRLaNUdaZUlRPXhDcLGT7zBa/u0g==", "requires": { "regenerator-transform": "^0.14.0" } }, "@babel/plugin-transform-reserved-words": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.2.0.tgz", - "integrity": "sha512-fz43fqW8E1tAB3DKF19/vxbpib1fuyCwSPE418ge5ZxILnBhWyhtPgz8eh1RCGGJlwvksHkyxMxh0eenFi+kFw==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.8.0.tgz", + "integrity": "sha512-DnshRyDTXZhmAgO2c1QKZI4CfZjoP2t3fSwRsnbCP9P/FSBpf9I7ovnAELswklw5OeY+/D/JIiaGLoUt2II3LA==", "requires": { - "@babel/helper-plugin-utils": "^7.0.0" + "@babel/helper-plugin-utils": "^7.8.0" } }, "@babel/plugin-transform-runtime": { - "version": "7.4.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.4.3.tgz", - "integrity": "sha512-7Q61bU+uEI7bCUFReT1NKn7/X6sDQsZ7wL1sJ9IYMAO7cI+eg6x9re1cEw2fCRMbbTVyoeUKWSV1M6azEfKCfg==", + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.7.4.tgz", + "integrity": "sha512-O8kSkS5fP74Ad/8pfsCMGa8sBRdLxYoSReaARRNSz3FbFQj3z/QUvoUmJ28gn9BO93YfnXc3j+Xyaqe8cKDNBQ==", "requires": { - "@babel/helper-module-imports": "^7.0.0", + "@babel/helper-module-imports": "^7.7.4", "@babel/helper-plugin-utils": "^7.0.0", "resolve": "^1.8.1", "semver": "^5.5.1" }, "dependencies": { "semver": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz", - "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==" + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" } } }, "@babel/plugin-transform-shorthand-properties": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.2.0.tgz", - "integrity": "sha512-QP4eUM83ha9zmYtpbnyjTLAGKQritA5XW/iG9cjtuOI8s1RuL/3V6a3DeSHfKutJQ+ayUfeZJPcnCYEQzaPQqg==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.8.0.tgz", + "integrity": "sha512-sExhzq63Gl2PMbl7ETpN7Z1A38rLD6GeCT6EEEIIKjTVt9u6dRqJ6nHhaquL7QgR3egj/8fcvq23UvzfPqGAYA==", "requires": { - "@babel/helper-plugin-utils": "^7.0.0" + "@babel/helper-plugin-utils": "^7.8.0" } }, "@babel/plugin-transform-spread": { - "version": "7.2.2", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.2.2.tgz", - "integrity": "sha512-KWfky/58vubwtS0hLqEnrWJjsMGaOeSBn90Ezn5Jeg9Z8KKHmELbP1yGylMlm5N6TPKeY9A2+UaSYLdxahg01w==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.8.0.tgz", + "integrity": "sha512-6Zjl0pv6x10YmFVRI0VhwJ/rE++geVHNJ9xwd+UIt3ON2VMRO7qI2lPsyLnzidR5HYNd/JXj47kdU9Rrn4YcnQ==", "requires": { - "@babel/helper-plugin-utils": "^7.0.0" + "@babel/helper-plugin-utils": "^7.8.0" } }, "@babel/plugin-transform-sticky-regex": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.2.0.tgz", - "integrity": "sha512-KKYCoGaRAf+ckH8gEL3JHUaFVyNHKe3ASNsZ+AlktgHevvxGigoIttrEJb8iKN03Q7Eazlv1s6cx2B2cQ3Jabw==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.8.0.tgz", + "integrity": "sha512-uksok0Bqox8YeIRFhr6RRtlBXeGpN1ogiEVjEd7A7rVLPZBXKGbL7kODpE7MQ+avjDLv5EEKtDCeYuWZK7FF7g==", "requires": { - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/helper-regex": "^7.0.0" + "@babel/helper-plugin-utils": "^7.8.0", + "@babel/helper-regex": "^7.8.0" } }, "@babel/plugin-transform-template-literals": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.4.4.tgz", - "integrity": "sha512-mQrEC4TWkhLN0z8ygIvEL9ZEToPhG5K7KDW3pzGqOfIGZ28Jb0POUkeWcoz8HnHvhFy6dwAT1j8OzqN8s804+g==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.8.0.tgz", + "integrity": "sha512-EF7Q7LEgeMpogHcvmHMNXBWdLWG1tpA1ErXH3i8zTu3+UEKo6aBn+FldPAJ16UbbbOwSCUCiDP6oZxvVRPhwnQ==", "requires": { - "@babel/helper-annotate-as-pure": "^7.0.0", - "@babel/helper-plugin-utils": "^7.0.0" + "@babel/helper-annotate-as-pure": "^7.8.0", + "@babel/helper-plugin-utils": "^7.8.0" } }, "@babel/plugin-transform-typeof-symbol": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.2.0.tgz", - "integrity": "sha512-2LNhETWYxiYysBtrBTqL8+La0jIoQQnIScUJc74OYvUGRmkskNY4EzLCnjHBzdmb38wqtTaixpo1NctEcvMDZw==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.8.0.tgz", + "integrity": "sha512-rEUBEFzsA9mCS2r7EtXFlM/6GqtzgLdC4WVYM9fIgJX+HcSJ8oMmj8LinfKhbo0ipRauvUM2teE2iNDNqDwO1g==", "requires": { - "@babel/helper-plugin-utils": "^7.0.0" + "@babel/helper-plugin-utils": "^7.8.0" } }, "@babel/plugin-transform-typescript": { - "version": "7.5.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.5.5.tgz", - "integrity": "sha512-pehKf4m640myZu5B2ZviLaiBlxMCjSZ1qTEO459AXKX5GnPueyulJeCqZFs1nz/Ya2dDzXQ1NxZ/kKNWyD4h6w==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.8.0.tgz", + "integrity": "sha512-RhMZnNWcyvX+rM6mk888MaeoVl5pGfmYP3as709n4+0d15SRedz4r+LPRg2a9s4z+t+DM+gy8uz/rmM3Cb8JBw==", "requires": { - "@babel/helper-create-class-features-plugin": "^7.5.5", - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/plugin-syntax-typescript": "^7.2.0" + "@babel/helper-create-class-features-plugin": "^7.8.0", + "@babel/helper-plugin-utils": "^7.8.0", + "@babel/plugin-syntax-typescript": "^7.8.0" } }, "@babel/plugin-transform-unicode-regex": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.4.4.tgz", - "integrity": "sha512-il+/XdNw01i93+M9J9u4T7/e/Ue/vWfNZE4IRUQjplu2Mqb/AFTDimkw2tdEdSH50wuQXZAbXSql0UphQke+vA==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.8.0.tgz", + "integrity": "sha512-qDg8wsnE47B/Sj8ZtOndPHrGBxJMssZJ71SzXrItum9n++iVFN7kYuJO+OHhjom7+/or0zzYqvJNzCkUjyNKqg==", "requires": { - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/helper-regex": "^7.4.4", - "regexpu-core": "^4.5.4" + "@babel/helper-create-regexp-features-plugin": "^7.8.0", + "@babel/helper-plugin-utils": "^7.8.0" } }, "@babel/preset-env": { - "version": "7.5.5", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.5.5.tgz", - "integrity": "sha512-GMZQka/+INwsMz1A5UEql8tG015h5j/qjptpKY2gJ7giy8ohzU710YciJB5rcKsWGWHiW3RUnHib0E5/m3Tp3A==", + "version": "7.8.2", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.8.2.tgz", + "integrity": "sha512-AF2YUl2bGsLWTtFL68upTTB7nDo05aEcKjHmXJE+aXRvsx5K+9yRsHQP3MjnTrLOWe/eFyUr93dfILROsKC4eg==", "requires": { - "@babel/helper-module-imports": "^7.0.0", - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/plugin-proposal-async-generator-functions": "^7.2.0", - "@babel/plugin-proposal-dynamic-import": "^7.5.0", - "@babel/plugin-proposal-json-strings": "^7.2.0", - "@babel/plugin-proposal-object-rest-spread": "^7.5.5", - "@babel/plugin-proposal-optional-catch-binding": "^7.2.0", - "@babel/plugin-proposal-unicode-property-regex": "^7.4.4", - "@babel/plugin-syntax-async-generators": "^7.2.0", - "@babel/plugin-syntax-dynamic-import": "^7.2.0", - "@babel/plugin-syntax-json-strings": "^7.2.0", - "@babel/plugin-syntax-object-rest-spread": "^7.2.0", - "@babel/plugin-syntax-optional-catch-binding": "^7.2.0", - "@babel/plugin-transform-arrow-functions": "^7.2.0", - "@babel/plugin-transform-async-to-generator": "^7.5.0", - "@babel/plugin-transform-block-scoped-functions": "^7.2.0", - "@babel/plugin-transform-block-scoping": "^7.5.5", - "@babel/plugin-transform-classes": "^7.5.5", - "@babel/plugin-transform-computed-properties": "^7.2.0", - "@babel/plugin-transform-destructuring": "^7.5.0", - "@babel/plugin-transform-dotall-regex": "^7.4.4", - "@babel/plugin-transform-duplicate-keys": "^7.5.0", - "@babel/plugin-transform-exponentiation-operator": "^7.2.0", - "@babel/plugin-transform-for-of": "^7.4.4", - "@babel/plugin-transform-function-name": "^7.4.4", - "@babel/plugin-transform-literals": "^7.2.0", - "@babel/plugin-transform-member-expression-literals": "^7.2.0", - "@babel/plugin-transform-modules-amd": "^7.5.0", - "@babel/plugin-transform-modules-commonjs": "^7.5.0", - "@babel/plugin-transform-modules-systemjs": "^7.5.0", - "@babel/plugin-transform-modules-umd": "^7.2.0", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.4.5", - "@babel/plugin-transform-new-target": "^7.4.4", - "@babel/plugin-transform-object-super": "^7.5.5", - "@babel/plugin-transform-parameters": "^7.4.4", - "@babel/plugin-transform-property-literals": "^7.2.0", - "@babel/plugin-transform-regenerator": "^7.4.5", - "@babel/plugin-transform-reserved-words": "^7.2.0", - "@babel/plugin-transform-shorthand-properties": "^7.2.0", - "@babel/plugin-transform-spread": "^7.2.0", - "@babel/plugin-transform-sticky-regex": "^7.2.0", - "@babel/plugin-transform-template-literals": "^7.4.4", - "@babel/plugin-transform-typeof-symbol": "^7.2.0", - "@babel/plugin-transform-unicode-regex": "^7.4.4", - "@babel/types": "^7.5.5", - "browserslist": "^4.6.0", - "core-js-compat": "^3.1.1", + "@babel/compat-data": "^7.8.0", + "@babel/helper-compilation-targets": "^7.8.0", + "@babel/helper-module-imports": "^7.8.0", + "@babel/helper-plugin-utils": "^7.8.0", + "@babel/plugin-proposal-async-generator-functions": "^7.8.0", + "@babel/plugin-proposal-dynamic-import": "^7.8.0", + "@babel/plugin-proposal-json-strings": "^7.8.0", + "@babel/plugin-proposal-nullish-coalescing-operator": "^7.8.0", + "@babel/plugin-proposal-object-rest-spread": "^7.8.0", + "@babel/plugin-proposal-optional-catch-binding": "^7.8.0", + "@babel/plugin-proposal-optional-chaining": "^7.8.0", + "@babel/plugin-proposal-unicode-property-regex": "^7.8.0", + "@babel/plugin-syntax-async-generators": "^7.8.0", + "@babel/plugin-syntax-dynamic-import": "^7.8.0", + "@babel/plugin-syntax-json-strings": "^7.8.0", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.0", + "@babel/plugin-syntax-object-rest-spread": "^7.8.0", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.0", + "@babel/plugin-syntax-optional-chaining": "^7.8.0", + "@babel/plugin-syntax-top-level-await": "^7.8.0", + "@babel/plugin-transform-arrow-functions": "^7.8.0", + "@babel/plugin-transform-async-to-generator": "^7.8.0", + "@babel/plugin-transform-block-scoped-functions": "^7.8.0", + "@babel/plugin-transform-block-scoping": "^7.8.0", + "@babel/plugin-transform-classes": "^7.8.0", + "@babel/plugin-transform-computed-properties": "^7.8.0", + "@babel/plugin-transform-destructuring": "^7.8.0", + "@babel/plugin-transform-dotall-regex": "^7.8.0", + "@babel/plugin-transform-duplicate-keys": "^7.8.0", + "@babel/plugin-transform-exponentiation-operator": "^7.8.0", + "@babel/plugin-transform-for-of": "^7.8.0", + "@babel/plugin-transform-function-name": "^7.8.0", + "@babel/plugin-transform-literals": "^7.8.0", + "@babel/plugin-transform-member-expression-literals": "^7.8.0", + "@babel/plugin-transform-modules-amd": "^7.8.0", + "@babel/plugin-transform-modules-commonjs": "^7.8.0", + "@babel/plugin-transform-modules-systemjs": "^7.8.0", + "@babel/plugin-transform-modules-umd": "^7.8.0", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.8.0", + "@babel/plugin-transform-new-target": "^7.8.0", + "@babel/plugin-transform-object-super": "^7.8.0", + "@babel/plugin-transform-parameters": "^7.8.0", + "@babel/plugin-transform-property-literals": "^7.8.0", + "@babel/plugin-transform-regenerator": "^7.8.0", + "@babel/plugin-transform-reserved-words": "^7.8.0", + "@babel/plugin-transform-shorthand-properties": "^7.8.0", + "@babel/plugin-transform-spread": "^7.8.0", + "@babel/plugin-transform-sticky-regex": "^7.8.0", + "@babel/plugin-transform-template-literals": "^7.8.0", + "@babel/plugin-transform-typeof-symbol": "^7.8.0", + "@babel/plugin-transform-unicode-regex": "^7.8.0", + "@babel/types": "^7.8.0", + "browserslist": "^4.8.2", + "core-js-compat": "^3.6.2", "invariant": "^2.2.2", - "js-levenshtein": "^1.1.3", + "levenary": "^1.1.0", "semver": "^5.5.0" }, "dependencies": { "semver": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz", - "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==" + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" } } }, "@babel/preset-react": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.0.0.tgz", - "integrity": "sha512-oayxyPS4Zj+hF6Et11BwuBkmpgT/zMxyuZgFrMeZID6Hdh3dGlk4sHCAhdBCpuCKW2ppBfl2uCCetlrUIJRY3w==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.8.0.tgz", + "integrity": "sha512-GP9t18RjtH67ea3DA2k71VqtMnTOupYJx34Z+KUEBRoRxvdETaucmtMWH5uoGHWzAD4qxbuV5ckxpewm39NXkA==", "requires": { - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/plugin-transform-react-display-name": "^7.0.0", - "@babel/plugin-transform-react-jsx": "^7.0.0", - "@babel/plugin-transform-react-jsx-self": "^7.0.0", - "@babel/plugin-transform-react-jsx-source": "^7.0.0" + "@babel/helper-plugin-utils": "^7.8.0", + "@babel/plugin-transform-react-display-name": "^7.8.0", + "@babel/plugin-transform-react-jsx": "^7.8.0", + "@babel/plugin-transform-react-jsx-self": "^7.8.0", + "@babel/plugin-transform-react-jsx-source": "^7.8.0" } }, "@babel/preset-typescript": { - "version": "7.3.3", - "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.3.3.tgz", - "integrity": "sha512-mzMVuIP4lqtn4du2ynEfdO0+RYcslwrZiJHXu4MGaC1ctJiW2fyaeDrtjJGs7R/KebZ1sgowcIoWf4uRpEfKEg==", + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.7.4.tgz", + "integrity": "sha512-rqrjxfdiHPsnuPur0jKrIIGQCIgoTWMTjlbWE69G4QJ6TIOVnnRnIJhUxNTL/VwDmEAVX08Tq3B1nirer5341w==", "requires": { "@babel/helper-plugin-utils": "^7.0.0", - "@babel/plugin-transform-typescript": "^7.3.2" + "@babel/plugin-transform-typescript": "^7.7.4" } }, "@babel/runtime": { - "version": "7.5.5", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.5.5.tgz", - "integrity": "sha512-28QvEGyQyNkB0/m2B4FU7IEZGK2NUrcMtT6BZEFALTguLk+AUT6ofsHtPk5QyjAdUkpMJ+/Em+quwz4HOt30AQ==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.8.0.tgz", + "integrity": "sha512-Z7ti+HB0puCcLmFE3x90kzaVgbx6TRrYIReaygW6EkBEnJh1ajS4/inhF7CypzWeDV3NFl1AfWj0eMtdihojxw==", "requires": { "regenerator-runtime": "^0.13.2" }, @@ -890,36 +998,52 @@ } } }, - "@babel/template": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.4.4.tgz", - "integrity": "sha512-CiGzLN9KgAvgZsnivND7rkA+AeJ9JB0ciPOD4U59GKbQP2iQl+olF1l76kJOupqidozfZ32ghwBEJDhnk9MEcw==", + "@babel/runtime-corejs3": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.8.0.tgz", + "integrity": "sha512-5XaME/D4hTkUclw4BW+FeDyfUcxN5/Fox/+9UiWUqdyU33zsLxDAE74IexAmLccuHSQyFbIzF5+Yb4E6obVOSg==", "requires": { - "@babel/code-frame": "^7.0.0", - "@babel/parser": "^7.4.4", - "@babel/types": "^7.4.4" + "core-js-pure": "^3.0.0", + "regenerator-runtime": "^0.13.2" + }, + "dependencies": { + "regenerator-runtime": { + "version": "0.13.3", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.3.tgz", + "integrity": "sha512-naKIZz2GQ8JWh///G7L3X6LaQUAMp2lvb1rvwwsURe/VXwD6VMfr+/1NuNw3ag8v2kY1aQ/go5SNn79O9JU7yw==" + } + } + }, + "@babel/template": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.8.0.tgz", + "integrity": "sha512-0NNMDsY2t3ltAVVK1WHNiaePo3tXPUeJpCX4I3xSKFoEl852wJHG8mrgHVADf8Lz1y+8al9cF7cSSfzSnFSYiw==", + "requires": { + "@babel/code-frame": "^7.8.0", + "@babel/parser": "^7.8.0", + "@babel/types": "^7.8.0" } }, "@babel/traverse": { - "version": "7.5.5", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.5.5.tgz", - "integrity": "sha512-MqB0782whsfffYfSjH4TM+LMjrJnhCNEDMDIjeTpl+ASaUvxcjoiVCo/sM1GhS1pHOXYfWVCYneLjMckuUxDaQ==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.8.0.tgz", + "integrity": "sha512-d/6sPXFLGlJHZO/zWDtgFaKyalCOHLedzxpVJn6el1cw+f2TZa7xZEszeXdOw6EUemqRFBAn106BWBvtSck9Qw==", "requires": { - "@babel/code-frame": "^7.5.5", - "@babel/generator": "^7.5.5", - "@babel/helper-function-name": "^7.1.0", - "@babel/helper-split-export-declaration": "^7.4.4", - "@babel/parser": "^7.5.5", - "@babel/types": "^7.5.5", + "@babel/code-frame": "^7.8.0", + "@babel/generator": "^7.8.0", + "@babel/helper-function-name": "^7.8.0", + "@babel/helper-split-export-declaration": "^7.8.0", + "@babel/parser": "^7.8.0", + "@babel/types": "^7.8.0", "debug": "^4.1.0", "globals": "^11.1.0", "lodash": "^4.17.13" } }, "@babel/types": { - "version": "7.5.5", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.5.5.tgz", - "integrity": "sha512-s63F9nJioLqOlW3UkyMd+BYhXt44YuaFm/VV0VwuteqjYwRrObkU7ra9pY4wAJR3oXi8hJrMcrcJdO/HH33vtw==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.0.tgz", + "integrity": "sha512-1RF84ehyx9HH09dMMwGWl3UTWlVoCPtqqJPjGuC4JzMe1ZIVDJ2DT8mv3cPv/A7veLD6sgR7vi95lJqm+ZayIg==", "requires": { "esutils": "^2.0.2", "lodash": "^4.17.13", @@ -948,170 +1072,155 @@ "integrity": "sha512-5a6wqoJV/xEdbRNKVo6I4hO3VjyDq//8q2f9I6PBAvMesJHFauXDorcNCsr9RzvsZnaWi5NYCcfyqP1QeFHFbw==" }, "@csstools/normalize.css": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/@csstools/normalize.css/-/normalize.css-9.0.1.tgz", - "integrity": "sha512-6It2EVfGskxZCQhuykrfnALg7oVeiI6KclWSmGDqB0AiInVrTGB9Jp9i4/Ad21u9Jde/voVQz6eFX/eSg/UsPA==" + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/@csstools/normalize.css/-/normalize.css-10.1.0.tgz", + "integrity": "sha512-ij4wRiunFfaJxjB0BdrYHIH8FxBJpOwNPhhAcunlmPdXudL1WQV1qoP9un6JsEBAgQH+7UXyyjh0g7jTxXK6tg==" }, "@fortawesome/fontawesome-common-types": { - "version": "0.2.19", - "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-common-types/-/fontawesome-common-types-0.2.19.tgz", - "integrity": "sha512-nd2Ul/CUs8U9sjofQYAALzOGpgkVJQgEhIJnOHaoyVR/LeC3x2mVg4eB910a4kS6WgLPebAY0M2fApEI497raQ==" + "version": "0.2.26", + "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-common-types/-/fontawesome-common-types-0.2.26.tgz", + "integrity": "sha512-CcM/fIFwZlRdiWG/25xE/wHbtyUuCtqoCTrr6BsWw7hH072fR++n4L56KPydAr3ANgMJMjT8v83ZFIsDc7kE+A==" }, "@fortawesome/fontawesome-svg-core": { - "version": "1.2.19", - "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-svg-core/-/fontawesome-svg-core-1.2.19.tgz", - "integrity": "sha512-D4ICXg9oU08eF9o7Or392gPpjmwwgJu8ecCFusthbID95CLVXOgIyd4mOKD9Nud5Ckz+Ty59pqkNtThDKR0erA==", + "version": "1.2.26", + "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-svg-core/-/fontawesome-svg-core-1.2.26.tgz", + "integrity": "sha512-3Dfd/v2IztP1TxKOxZiB5+4kaOZK9mNy0KU1vVK7nFlPWz3gzxrCWB+AloQhQUoJ8HhGqbzjliK89Vl7PExGbw==", "requires": { - "@fortawesome/fontawesome-common-types": "^0.2.19" + "@fortawesome/fontawesome-common-types": "^0.2.26" } }, "@fortawesome/free-solid-svg-icons": { - "version": "5.9.0", - "resolved": "https://registry.npmjs.org/@fortawesome/free-solid-svg-icons/-/free-solid-svg-icons-5.9.0.tgz", - "integrity": "sha512-U8YXPfWcSozsCW0psCtlRGKjjRs5+Am5JJwLOUmVHFZbIEWzaz4YbP84EoPwUsVmSAKrisu3QeNcVOtmGml0Xw==", + "version": "5.12.0", + "resolved": "https://registry.npmjs.org/@fortawesome/free-solid-svg-icons/-/free-solid-svg-icons-5.12.0.tgz", + "integrity": "sha512-CnpsWs6GhTs9ekNB3d8rcO5HYqRkXbYKf2YNiAlTWbj5eVlPqsd/XH1F9If8jkcR1aegryAbln/qYeKVZzpM0g==", "requires": { - "@fortawesome/fontawesome-common-types": "^0.2.19" + "@fortawesome/fontawesome-common-types": "^0.2.26" } }, "@fortawesome/react-fontawesome": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/@fortawesome/react-fontawesome/-/react-fontawesome-0.1.4.tgz", - "integrity": "sha512-GwmxQ+TK7PEdfSwvxtGnMCqrfEm0/HbRHArbUudsYiy9KzVCwndxa2KMcfyTQ8El0vROrq8gOOff09RF1oQe8g==", + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/@fortawesome/react-fontawesome/-/react-fontawesome-0.1.8.tgz", + "integrity": "sha512-I5h9YQg/ePA3Br9ISS18fcwOYmzQYDSM1ftH03/8nHkiqIVHtUyQBw482+60dnzvlr82gHt3mGm+nDUp159FCw==", "requires": { - "humps": "^2.0.1", "prop-types": "^15.5.10" } }, "@hapi/address": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@hapi/address/-/address-2.0.0.tgz", - "integrity": "sha512-mV6T0IYqb0xL1UALPFplXYQmR0twnXG0M6jUswpquqT2sD12BOiCiLy3EvMp/Fy7s3DZElC4/aPjEjo2jeZpvw==" + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@hapi/address/-/address-2.1.4.tgz", + "integrity": "sha512-QD1PhQk+s31P1ixsX0H0Suoupp3VMXzIVMSwobR3F3MSUO2YCV0B7xqLcUw/Bh8yuvd3LhpyqLQWTNcRmp6IdQ==" + }, + "@hapi/bourne": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@hapi/bourne/-/bourne-1.3.2.tgz", + "integrity": "sha512-1dVNHT76Uu5N3eJNTYcvxee+jzX4Z9lfciqRRHCU27ihbUcYi+iSc2iml5Ke1LXe1SyJCLA0+14Jh4tXJgOppA==" }, "@hapi/hoek": { - "version": "6.2.4", - "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-6.2.4.tgz", - "integrity": "sha512-HOJ20Kc93DkDVvjwHyHawPwPkX44sIrbXazAUDiUXaY2R9JwQGo2PhFfnQtdrsIe4igjG2fPgMra7NYw7qhy0A==" + "version": "8.5.0", + "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-8.5.0.tgz", + "integrity": "sha512-7XYT10CZfPsH7j9F1Jmg1+d0ezOux2oM2GfArAzLwWe4mE2Dr3hVjsAL6+TFY49RRJlCdJDMw3nJsLFroTc8Kw==" }, "@hapi/joi": { - "version": "15.1.0", - "resolved": "https://registry.npmjs.org/@hapi/joi/-/joi-15.1.0.tgz", - "integrity": "sha512-n6kaRQO8S+kepUTbXL9O/UOL788Odqs38/VOfoCrATDtTvyfiO3fgjlSRaNkHabpTLgM7qru9ifqXlXbXk8SeQ==", + "version": "15.1.1", + "resolved": "https://registry.npmjs.org/@hapi/joi/-/joi-15.1.1.tgz", + "integrity": "sha512-entf8ZMOK8sc+8YfeOlM8pCfg3b5+WZIKBfUaaJT8UsjAAPjartzxIYm3TIbjvA4u+u++KbcXD38k682nVHDAQ==", "requires": { "@hapi/address": "2.x.x", - "@hapi/hoek": "6.x.x", - "@hapi/marker": "1.x.x", + "@hapi/bourne": "1.x.x", + "@hapi/hoek": "8.x.x", "@hapi/topo": "3.x.x" } }, - "@hapi/marker": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@hapi/marker/-/marker-1.0.0.tgz", - "integrity": "sha512-JOfdekTXnJexfE8PyhZFyHvHjt81rBFSAbTIRAhF2vv/2Y1JzoKsGqxH/GpZJoF7aEfYok8JVcAHmSz1gkBieA==" - }, "@hapi/topo": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@hapi/topo/-/topo-3.1.2.tgz", - "integrity": "sha512-r+aumOqJ5QbD6aLPJWqVjMAPsx5pZKz+F5yPqXZ/WWG9JTtHbQqlzrJoknJ0iJxLj9vlXtmpSdjlkszseeG8OA==", + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/@hapi/topo/-/topo-3.1.6.tgz", + "integrity": "sha512-tAag0jEcjwH+P2quUfipd7liWCNX2F8NvYjQp2wtInsZxnMlypdw0FtAOLxtvvkO+GSRRbmNi8m/5y42PQJYCQ==", "requires": { - "@hapi/hoek": "8.x.x" - }, - "dependencies": { - "@hapi/hoek": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-8.0.2.tgz", - "integrity": "sha512-O6o6mrV4P65vVccxymuruucb+GhP2zl9NLCG8OdoFRS8BEGw3vwpPp20wpAtpbQQxz1CEUtmxJGgWhjq1XA3qw==" - } + "@hapi/hoek": "^8.3.0" } }, "@jest/console": { - "version": "24.7.1", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-24.7.1.tgz", - "integrity": "sha512-iNhtIy2M8bXlAOULWVTUxmnelTLFneTNEkHCgPmgd+zNwy9zVddJ6oS5rZ9iwoscNdT5mMwUd0C51v/fSlzItg==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-24.9.0.tgz", + "integrity": "sha512-Zuj6b8TnKXi3q4ymac8EQfc3ea/uhLeCGThFqXeC8H9/raaH8ARPUTdId+XyGd03Z4In0/VjD2OYFcBF09fNLQ==", "requires": { - "@jest/source-map": "^24.3.0", + "@jest/source-map": "^24.9.0", "chalk": "^2.0.1", "slash": "^2.0.0" } }, "@jest/core": { - "version": "24.8.0", - "resolved": "https://registry.npmjs.org/@jest/core/-/core-24.8.0.tgz", - "integrity": "sha512-R9rhAJwCBQzaRnrRgAdVfnglUuATXdwTRsYqs6NMdVcAl5euG8LtWDe+fVkN27YfKVBW61IojVsXKaOmSnqd/A==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-24.9.0.tgz", + "integrity": "sha512-Fogg3s4wlAr1VX7q+rhV9RVnUv5tD7VuWfYy1+whMiWUrvl7U3QJSJyWcDio9Lq2prqYsZaeTv2Rz24pWGkJ2A==", "requires": { "@jest/console": "^24.7.1", - "@jest/reporters": "^24.8.0", - "@jest/test-result": "^24.8.0", - "@jest/transform": "^24.8.0", - "@jest/types": "^24.8.0", + "@jest/reporters": "^24.9.0", + "@jest/test-result": "^24.9.0", + "@jest/transform": "^24.9.0", + "@jest/types": "^24.9.0", "ansi-escapes": "^3.0.0", "chalk": "^2.0.1", "exit": "^0.1.2", "graceful-fs": "^4.1.15", - "jest-changed-files": "^24.8.0", - "jest-config": "^24.8.0", - "jest-haste-map": "^24.8.0", - "jest-message-util": "^24.8.0", + "jest-changed-files": "^24.9.0", + "jest-config": "^24.9.0", + "jest-haste-map": "^24.9.0", + "jest-message-util": "^24.9.0", "jest-regex-util": "^24.3.0", - "jest-resolve-dependencies": "^24.8.0", - "jest-runner": "^24.8.0", - "jest-runtime": "^24.8.0", - "jest-snapshot": "^24.8.0", - "jest-util": "^24.8.0", - "jest-validate": "^24.8.0", - "jest-watcher": "^24.8.0", + "jest-resolve": "^24.9.0", + "jest-resolve-dependencies": "^24.9.0", + "jest-runner": "^24.9.0", + "jest-runtime": "^24.9.0", + "jest-snapshot": "^24.9.0", + "jest-util": "^24.9.0", + "jest-validate": "^24.9.0", + "jest-watcher": "^24.9.0", "micromatch": "^3.1.10", "p-each-series": "^1.0.0", - "pirates": "^4.0.1", "realpath-native": "^1.1.0", "rimraf": "^2.5.4", + "slash": "^2.0.0", "strip-ansi": "^5.0.0" }, "dependencies": { - "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==" - }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "requires": { - "ansi-regex": "^4.1.0" - } + "ansi-escapes": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz", + "integrity": "sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==" } } }, "@jest/environment": { - "version": "24.8.0", - "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-24.8.0.tgz", - "integrity": "sha512-vlGt2HLg7qM+vtBrSkjDxk9K0YtRBi7HfRFaDxoRtyi+DyVChzhF20duvpdAnKVBV6W5tym8jm0U9EfXbDk1tw==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-24.9.0.tgz", + "integrity": "sha512-5A1QluTPhvdIPFYnO3sZC3smkNeXPVELz7ikPbhUj0bQjB07EoE9qtLrem14ZUYWdVayYbsjVwIiL4WBIMV4aQ==", "requires": { - "@jest/fake-timers": "^24.8.0", - "@jest/transform": "^24.8.0", - "@jest/types": "^24.8.0", - "jest-mock": "^24.8.0" + "@jest/fake-timers": "^24.9.0", + "@jest/transform": "^24.9.0", + "@jest/types": "^24.9.0", + "jest-mock": "^24.9.0" } }, "@jest/fake-timers": { - "version": "24.8.0", - "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-24.8.0.tgz", - "integrity": "sha512-2M4d5MufVXwi6VzZhJ9f5S/wU4ud2ck0kxPof1Iz3zWx6Y+V2eJrES9jEktB6O3o/oEyk+il/uNu9PvASjWXQw==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-24.9.0.tgz", + "integrity": "sha512-eWQcNa2YSwzXWIMC5KufBh3oWRIijrQFROsIqt6v/NS9Io/gknw1jsAC9c+ih/RQX4A3O7SeWAhQeN0goKhT9A==", "requires": { - "@jest/types": "^24.8.0", - "jest-message-util": "^24.8.0", - "jest-mock": "^24.8.0" + "@jest/types": "^24.9.0", + "jest-message-util": "^24.9.0", + "jest-mock": "^24.9.0" } }, "@jest/reporters": { - "version": "24.8.0", - "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-24.8.0.tgz", - "integrity": "sha512-eZ9TyUYpyIIXfYCrw0UHUWUvE35vx5I92HGMgS93Pv7du+GHIzl+/vh8Qj9MCWFK/4TqyttVBPakWMOfZRIfxw==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-24.9.0.tgz", + "integrity": "sha512-mu4X0yjaHrffOsWmVLzitKmmmWSQ3GGuefgNscUSWNiUNcEOSEQk9k3pERKEQVBb0Cnn88+UESIsZEMH3o88Gw==", "requires": { - "@jest/environment": "^24.8.0", - "@jest/test-result": "^24.8.0", - "@jest/transform": "^24.8.0", - "@jest/types": "^24.8.0", + "@jest/environment": "^24.9.0", + "@jest/test-result": "^24.9.0", + "@jest/transform": "^24.9.0", + "@jest/types": "^24.9.0", "chalk": "^2.0.1", "exit": "^0.1.2", "glob": "^7.1.2", @@ -1119,36 +1228,22 @@ "istanbul-lib-instrument": "^3.0.1", "istanbul-lib-report": "^2.0.4", "istanbul-lib-source-maps": "^3.0.1", - "istanbul-reports": "^2.1.1", - "jest-haste-map": "^24.8.0", - "jest-resolve": "^24.8.0", - "jest-runtime": "^24.8.0", - "jest-util": "^24.8.0", + "istanbul-reports": "^2.2.6", + "jest-haste-map": "^24.9.0", + "jest-resolve": "^24.9.0", + "jest-runtime": "^24.9.0", + "jest-util": "^24.9.0", "jest-worker": "^24.6.0", - "node-notifier": "^5.2.1", + "node-notifier": "^5.4.2", "slash": "^2.0.0", "source-map": "^0.6.0", "string-length": "^2.0.0" - }, - "dependencies": { - "jest-resolve": { - "version": "24.8.0", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-24.8.0.tgz", - "integrity": "sha512-+hjSzi1PoRvnuOICoYd5V/KpIQmkAsfjFO71458hQ2Whi/yf1GDeBOFj8Gxw4LrApHsVJvn5fmjcPdmoUHaVKw==", - "requires": { - "@jest/types": "^24.8.0", - "browser-resolve": "^1.11.3", - "chalk": "^2.0.1", - "jest-pnp-resolver": "^1.2.1", - "realpath-native": "^1.1.0" - } - } } }, "@jest/source-map": { - "version": "24.3.0", - "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-24.3.0.tgz", - "integrity": "sha512-zALZt1t2ou8le/crCeeiRYzvdnTzaIlpOWaet45lNSqNJUnXbppUUFR4ZUAlzgDmKee4Q5P/tKXypI1RiHwgag==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-24.9.0.tgz", + "integrity": "sha512-/Xw7xGlsZb4MJzNDgB7PW5crou5JqWiBQaz6xyPd3ArOg2nfn/PunV8+olXbbEZzNl591o5rWKE9BRDaFAuIBg==", "requires": { "callsites": "^3.0.0", "graceful-fs": "^4.1.15", @@ -1163,42 +1258,43 @@ } }, "@jest/test-result": { - "version": "24.8.0", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-24.8.0.tgz", - "integrity": "sha512-+YdLlxwizlfqkFDh7Mc7ONPQAhA4YylU1s529vVM1rsf67vGZH/2GGm5uO8QzPeVyaVMobCQ7FTxl38QrKRlng==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-24.9.0.tgz", + "integrity": "sha512-XEFrHbBonBJ8dGp2JmF8kP/nQI/ImPpygKHwQ/SY+es59Z3L5PI4Qb9TQQMAEeYsThG1xF0k6tmG0tIKATNiiA==", "requires": { - "@jest/console": "^24.7.1", - "@jest/types": "^24.8.0", + "@jest/console": "^24.9.0", + "@jest/types": "^24.9.0", "@types/istanbul-lib-coverage": "^2.0.0" } }, "@jest/test-sequencer": { - "version": "24.8.0", - "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-24.8.0.tgz", - "integrity": "sha512-OzL/2yHyPdCHXEzhoBuq37CE99nkme15eHkAzXRVqthreWZamEMA0WoetwstsQBCXABhczpK03JNbc4L01vvLg==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-24.9.0.tgz", + "integrity": "sha512-6qqsU4o0kW1dvA95qfNog8v8gkRN9ph6Lz7r96IvZpHdNipP2cBcb07J1Z45mz/VIS01OHJ3pY8T5fUY38tg4A==", "requires": { - "@jest/test-result": "^24.8.0", - "jest-haste-map": "^24.8.0", - "jest-runner": "^24.8.0", - "jest-runtime": "^24.8.0" + "@jest/test-result": "^24.9.0", + "jest-haste-map": "^24.9.0", + "jest-runner": "^24.9.0", + "jest-runtime": "^24.9.0" } }, "@jest/transform": { - "version": "24.8.0", - "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-24.8.0.tgz", - "integrity": "sha512-xBMfFUP7TortCs0O+Xtez2W7Zu1PLH9bvJgtraN1CDST6LBM/eTOZ9SfwS/lvV8yOfcDpFmwf9bq5cYbXvqsvA==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-24.9.0.tgz", + "integrity": "sha512-TcQUmyNRxV94S0QpMOnZl0++6RMiqpbH/ZMccFB/amku6Uwvyb1cjYX7xkp5nGNkbX4QPH/FcB6q1HBTHynLmQ==", "requires": { "@babel/core": "^7.1.0", - "@jest/types": "^24.8.0", + "@jest/types": "^24.9.0", "babel-plugin-istanbul": "^5.1.0", "chalk": "^2.0.1", "convert-source-map": "^1.4.0", "fast-json-stable-stringify": "^2.0.0", "graceful-fs": "^4.1.15", - "jest-haste-map": "^24.8.0", - "jest-regex-util": "^24.3.0", - "jest-util": "^24.8.0", + "jest-haste-map": "^24.9.0", + "jest-regex-util": "^24.9.0", + "jest-util": "^24.9.0", "micromatch": "^3.1.10", + "pirates": "^4.0.1", "realpath-native": "^1.1.0", "slash": "^2.0.0", "source-map": "^0.6.1", @@ -1206,13 +1302,13 @@ } }, "@jest/types": { - "version": "24.8.0", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-24.8.0.tgz", - "integrity": "sha512-g17UxVr2YfBtaMUxn9u/4+siG1ptg9IGYAYwvpwn61nBg779RXnjE/m7CxYcIzEt0AbHZZAHSEZNhkE2WxURVg==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-24.9.0.tgz", + "integrity": "sha512-XKK7ze1apu5JWQ5eZjHITP66AX+QsLlbaJRBGYr8pNzwcAE2JVkwnf0yqjHTsDRcjR0mujy/NmZMXw5kl+kGBw==", "requires": { "@types/istanbul-lib-coverage": "^2.0.0", "@types/istanbul-reports": "^1.1.1", - "@types/yargs": "^12.0.9" + "@types/yargs": "^13.0.0" } }, "@mrmlnc/readdir-enhanced": { @@ -1229,38 +1325,15 @@ "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-1.1.3.tgz", "integrity": "sha512-shAmDyaQC4H92APFoIaVDHCx5bStIocgvbwQyxPRrbUY20V1EYTbSDchWbuwlMG3V17cprZhA6+78JfB+3DTPw==" }, - "@react-bootstrap/react-popper": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@react-bootstrap/react-popper/-/react-popper-1.2.1.tgz", - "integrity": "sha512-4l3q7LcZEhrSkI4d3Ie3g4CdrXqqTexXX4PFT45CB0z5z2JUbaxgRwKNq7r5j2bLdVpZm+uvUGqxJw8d9vgbJQ==", - "requires": { - "babel-runtime": "6.x.x", - "create-react-context": "^0.2.1", - "popper.js": "^1.14.4", - "prop-types": "^15.6.1", - "typed-styles": "^0.0.5", - "warning": "^3.0.0" - }, - "dependencies": { - "warning": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/warning/-/warning-3.0.0.tgz", - "integrity": "sha1-MuU3fLVy3kqwR1O9+IIcAe1gW3w=", - "requires": { - "loose-envify": "^1.0.0" - } - } - } - }, "@restart/context": { "version": "2.1.4", "resolved": "https://registry.npmjs.org/@restart/context/-/context-2.1.4.tgz", "integrity": "sha512-INJYZQJP7g+IoDUh/475NlGiTeMfwTXUEr3tmRneckHIxNolGOW9CTq83S8cxq0CgJwwcMzMJFchxvlwe7Rk8Q==" }, "@restart/hooks": { - "version": "0.3.8", - "resolved": "https://registry.npmjs.org/@restart/hooks/-/hooks-0.3.8.tgz", - "integrity": "sha512-0AO6p7iOqWeLu9++Qz1P0efRmA7nDT3uMx4banEUj0KZLNOBkK98zddsKtRjwBlJw2dbL/V+u5+recuCwjO/pg==" + "version": "0.3.19", + "resolved": "https://registry.npmjs.org/@restart/hooks/-/hooks-0.3.19.tgz", + "integrity": "sha512-8bskLEkiDvuZztnfGN+vM56q2HQV8dyXS/Eb0nhXPx6fonii3hQLxfNVA2r5NTMbvEkwDo59bAau3idUXaGvww==" }, "@svgr/babel-plugin-add-jsx-attribute": { "version": "4.2.0", @@ -1283,9 +1356,9 @@ "integrity": "sha512-U9m870Kqm0ko8beHawRXLGLvSi/ZMrl89gJ5BNcT452fAjtF2p4uRzXkdzvGJJJYBgx7BmqlDjBN/eCp5AAX2w==" }, "@svgr/babel-plugin-svg-dynamic-title": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-dynamic-title/-/babel-plugin-svg-dynamic-title-4.3.1.tgz", - "integrity": "sha512-p6z6JJroP989jHWcuraeWpzdejehTmLUpyC9smhTBWyPN0VVGe2phbYxpPTV7Vh8XzmFrcG55idrnfWn/2oQEw==" + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-dynamic-title/-/babel-plugin-svg-dynamic-title-4.3.3.tgz", + "integrity": "sha512-w3Be6xUNdwgParsvxkkeZb545VhXEwjGMwExMVBIdPQJeyMQHqm9Msnb2a1teHBqUYL66qtwfhNkbj1iarCG7w==" }, "@svgr/babel-plugin-svg-em-dimensions": { "version": "4.2.0", @@ -1303,26 +1376,26 @@ "integrity": "sha512-hYfYuZhQPCBVotABsXKSCfel2slf/yvJY8heTVX1PCTaq/IgASq1IyxPPKJ0chWREEKewIU/JMSsIGBtK1KKxw==" }, "@svgr/babel-preset": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/@svgr/babel-preset/-/babel-preset-4.3.1.tgz", - "integrity": "sha512-rPFKLmyhlh6oeBv3j2vEAj2nd2QbWqpoJLKzBLjwQVt+d9aeXajVaPNEqrES2spjXKR4OxfgSs7U0NtmAEkr0Q==", + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@svgr/babel-preset/-/babel-preset-4.3.3.tgz", + "integrity": "sha512-6PG80tdz4eAlYUN3g5GZiUjg2FMcp+Wn6rtnz5WJG9ITGEF1pmFdzq02597Hn0OmnQuCVaBYQE1OVFAnwOl+0A==", "requires": { "@svgr/babel-plugin-add-jsx-attribute": "^4.2.0", "@svgr/babel-plugin-remove-jsx-attribute": "^4.2.0", "@svgr/babel-plugin-remove-jsx-empty-expression": "^4.2.0", "@svgr/babel-plugin-replace-jsx-attribute-value": "^4.2.0", - "@svgr/babel-plugin-svg-dynamic-title": "^4.3.1", + "@svgr/babel-plugin-svg-dynamic-title": "^4.3.3", "@svgr/babel-plugin-svg-em-dimensions": "^4.2.0", "@svgr/babel-plugin-transform-react-native-svg": "^4.2.0", "@svgr/babel-plugin-transform-svg-component": "^4.2.0" } }, "@svgr/core": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/@svgr/core/-/core-4.3.2.tgz", - "integrity": "sha512-N+tP5CLFd1hP9RpO83QJPZY3NL8AtrdqNbuhRgBkjE/49RnMrrRsFm1wY8pueUfAGvzn6tSXUq29o6ah8RuR5w==", + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@svgr/core/-/core-4.3.3.tgz", + "integrity": "sha512-qNuGF1QON1626UCaZamWt5yedpgOytvLj5BQZe2j1k1B8DUG4OyugZyfEwBeXozCUwhLEpsrgPrE+eCu4fY17w==", "requires": { - "@svgr/plugin-jsx": "^4.3.2", + "@svgr/plugin-jsx": "^4.3.3", "camelcase": "^5.3.1", "cosmiconfig": "^5.2.1" } @@ -1336,47 +1409,14 @@ } }, "@svgr/plugin-jsx": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/@svgr/plugin-jsx/-/plugin-jsx-4.3.2.tgz", - "integrity": "sha512-+1GW32RvmNmCsOkMoclA/TppNjHPLMnNZG3/Ecscxawp051XJ2MkO09Hn11VcotdC2EPrDfT8pELGRo+kbZ1Eg==", + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@svgr/plugin-jsx/-/plugin-jsx-4.3.3.tgz", + "integrity": "sha512-cLOCSpNWQnDB1/v+SUENHH7a0XY09bfuMKdq9+gYvtuwzC2rU4I0wKGFEp1i24holdQdwodCtDQdFtJiTCWc+w==", "requires": { "@babel/core": "^7.4.5", - "@svgr/babel-preset": "^4.3.1", + "@svgr/babel-preset": "^4.3.3", "@svgr/hast-util-to-babel-ast": "^4.3.2", "svg-parser": "^2.0.0" - }, - "dependencies": { - "@babel/core": { - "version": "7.5.5", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.5.5.tgz", - "integrity": "sha512-i4qoSr2KTtce0DmkuuQBV4AuQgGPUcPXMr9L5MyYAtk06z068lQ10a4O009fe5OB/DfNV+h+qqT7ddNV8UnRjg==", - "requires": { - "@babel/code-frame": "^7.5.5", - "@babel/generator": "^7.5.5", - "@babel/helpers": "^7.5.5", - "@babel/parser": "^7.5.5", - "@babel/template": "^7.4.4", - "@babel/traverse": "^7.5.5", - "@babel/types": "^7.5.5", - "convert-source-map": "^1.1.0", - "debug": "^4.1.0", - "json5": "^2.1.0", - "lodash": "^4.17.13", - "resolve": "^1.3.2", - "semver": "^5.4.1", - "source-map": "^0.5.0" - } - }, - "semver": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz", - "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==" - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" - } } }, "@svgr/plugin-svgo": { @@ -1390,18 +1430,18 @@ } }, "@svgr/webpack": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/@svgr/webpack/-/webpack-4.1.0.tgz", - "integrity": "sha512-d09ehQWqLMywP/PT/5JvXwPskPK9QCXUjiSkAHehreB381qExXf5JFCBWhfEyNonRbkIneCeYM99w+Ud48YIQQ==", + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@svgr/webpack/-/webpack-4.3.3.tgz", + "integrity": "sha512-bjnWolZ6KVsHhgyCoYRFmbd26p8XVbulCzSG53BDQqAr+JOAderYK7CuYrB3bDjHJuF6LJ7Wrr42+goLRV9qIg==", "requires": { - "@babel/core": "^7.1.6", + "@babel/core": "^7.4.5", "@babel/plugin-transform-react-constant-elements": "^7.0.0", - "@babel/preset-env": "^7.1.6", + "@babel/preset-env": "^7.4.5", "@babel/preset-react": "^7.0.0", - "@svgr/core": "^4.1.0", - "@svgr/plugin-jsx": "^4.1.0", - "@svgr/plugin-svgo": "^4.0.3", - "loader-utils": "^1.1.0" + "@svgr/core": "^4.3.3", + "@svgr/plugin-jsx": "^4.3.3", + "@svgr/plugin-svgo": "^4.3.1", + "loader-utils": "^1.2.3" } }, "@types/asap": { @@ -1410,9 +1450,9 @@ "integrity": "sha512-upIS0Gt9Mc8eEpCbYMZ1K8rhNosfKUtimNcINce+zLwJF5UpM3Vv7yz3S5l/1IX+DxTa8lTkUjqynvjRXyJzsg==" }, "@types/babel__core": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.2.tgz", - "integrity": "sha512-cfCCrFmiGY/yq0NuKNxIQvZFy9kY/1immpSpTngOnyIbD4+eJOG5mxphhHDv3CHL9GltO4GcKr54kGBg3RNdbg==", + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.3.tgz", + "integrity": "sha512-8fBo0UR2CcwWxeX7WIIgJ7lXjasFxoYgRnFHUj+hRvKkpiBJbxhdAPTCY6/ZKM0uxANFVzt4yObSLuTiTnazDA==", "requires": { "@babel/parser": "^7.1.0", "@babel/types": "^7.0.0", @@ -1422,9 +1462,9 @@ } }, "@types/babel__generator": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.0.2.tgz", - "integrity": "sha512-NHcOfab3Zw4q5sEE2COkpfXjoE7o+PmqD9DQW4koUT3roNxwziUdXGnRndMat/LJNUtePwn1TlP4do3uoe3KZQ==", + "version": "7.6.1", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.1.tgz", + "integrity": "sha512-bBKm+2VPJcMRVwNhxKu8W+5/zT7pwNEqeokFOmbvVSqGzFneNxYcEBro9Ac7/N9tlsaPYnZLK8J1LWKkMsLAew==", "requires": { "@babel/types": "^7.0.0" } @@ -1439,13 +1479,33 @@ } }, "@types/babel__traverse": { - "version": "7.0.7", - "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.0.7.tgz", - "integrity": "sha512-CeBpmX1J8kWLcDEnI3Cl2Eo6RfbGvzUctA+CjZUhOKDFbLfcr7fc4usEqLNWetrlJd7RhAkyYe2czXop4fICpw==", + "version": "7.0.8", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.0.8.tgz", + "integrity": "sha512-yGeB2dHEdvxjP0y4UbRtQaSkXJ9649fYCmIdRoul5kfAoGCwxuCbMhag0k3RPfnuh9kPGm8x89btcfDEXdVWGw==", "requires": { "@babel/types": "^7.3.0" } }, + "@types/eslint-visitor-keys": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@types/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz", + "integrity": "sha512-OCutwjDZ4aFS6PB1UZ988C4YgwlBHJd6wCeQqaLdmadZ/7e+w79+hbMUFC1QXDNCmdyoRfAFdm0RypzwR+Qpag==" + }, + "@types/events": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/events/-/events-3.0.0.tgz", + "integrity": "sha512-EaObqwIvayI5a8dCzhFrjKzVwKLxjoG9T6Ppd5CEo07LRKfQ8Yokw54r5+Wq7FaBQ+yXRvQAYPrHwya1/UFt9g==" + }, + "@types/glob": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.1.1.tgz", + "integrity": "sha512-1Bh06cbWJUHMC97acuD6UMG29nMt0Aqz1vF3guLfG+kHHJhy3AyohZFFxYk2f7Q1SQIrNwvncxAE0N/9s70F2w==", + "requires": { + "@types/events": "*", + "@types/minimatch": "*", + "@types/node": "*" + } + }, "@types/hoist-non-react-statics": { "version": "3.3.1", "resolved": "https://registry.npmjs.org/@types/hoist-non-react-statics/-/hoist-non-react-statics-3.3.1.tgz", @@ -1456,9 +1516,9 @@ } }, "@types/invariant": { - "version": "2.2.30", - "resolved": "https://registry.npmjs.org/@types/invariant/-/invariant-2.2.30.tgz", - "integrity": "sha512-98fB+yo7imSD2F7PF7GIpELNgtLNgo5wjivu0W5V4jx+KVVJxo6p/qN4zdzSTBWy4/sN3pPyXwnhRSD28QX+ag==" + "version": "2.2.31", + "resolved": "https://registry.npmjs.org/@types/invariant/-/invariant-2.2.31.tgz", + "integrity": "sha512-jMlgg9pIURvy9jgBHCjQp/CyBjYHUwj91etVcDdXkFl2CwTFiQlB+8tcsMeXpXf2PFE5X2pjk4Gm43hQSMHAdA==" }, "@types/istanbul-lib-coverage": { "version": "2.0.1", @@ -1482,10 +1542,30 @@ "@types/istanbul-lib-report": "*" } }, + "@types/json-schema": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.4.tgz", + "integrity": "sha512-8+KAKzEvSUdeo+kmqnKrqgeE+LcA0tjYWFY7RPProVYwnqDjukzO+3b6dLD56rYX5TdWejnEOLJYOIeh4CXKuA==" + }, + "@types/minimatch": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.3.tgz", + "integrity": "sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA==" + }, + "@types/node": { + "version": "13.1.6", + "resolved": "https://registry.npmjs.org/@types/node/-/node-13.1.6.tgz", + "integrity": "sha512-Jg1F+bmxcpENHP23sVKkNuU3uaxPnsBMW0cLjleiikFKomJQbsn0Cqk2yDvQArqzZN6ABfBkZ0To7pQ8sLdWDg==" + }, + "@types/parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==" + }, "@types/prop-types": { - "version": "15.7.1", - "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.1.tgz", - "integrity": "sha512-CFzn9idOEpHrgdw8JsoTkaDDyRWk1jrzIV8djzcgpq0y9tG4B4lFT+Nxh52DVpDXV+n4+NPNv7M1Dj5uMp6XFg==" + "version": "15.7.3", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.3.tgz", + "integrity": "sha512-KfRL3PuHmqQLOG+2tGpRO26Ctg+Cq1E01D2DMriKEATHgWLfeNDmq9e29Q9WIky0dQ3NPkd1mzYH8Lm936Z9qw==" }, "@types/q": { "version": "1.5.2", @@ -1493,9 +1573,9 @@ "integrity": "sha512-ce5d3q03Ex0sy4R14722Rmt6MT07Ua+k4FwDfdcToYJcMKNtRVQvJ6JCAPdAmAnbRb6CsX6aYb9m96NGod9uTw==" }, "@types/react": { - "version": "16.8.23", - "resolved": "https://registry.npmjs.org/@types/react/-/react-16.8.23.tgz", - "integrity": "sha512-abkEOIeljniUN9qB5onp++g0EY38h7atnDHxwKUFz1r3VH1+yG1OKi2sNPTyObL40goBmfKFpdii2lEzwLX1cA==", + "version": "16.9.17", + "resolved": "https://registry.npmjs.org/@types/react/-/react-16.9.17.tgz", + "integrity": "sha512-UP27In4fp4sWF5JgyV6pwVPAQM83Fj76JOcg02X5BZcpSu5Wx+fP9RMqc2v0ssBoQIFvD5JdKY41gjJJKmw6Bg==", "requires": { "@types/prop-types": "*", "csstype": "^2.2.0" @@ -1512,45 +1592,63 @@ "integrity": "sha512-l42BggppR6zLmpfU6fq9HEa2oGPEI8yrSPL3GITjfRInppYFahObbIQOQK3UGxEnyQpltZLaPe75046NOZQikw==" }, "@types/yargs": { - "version": "12.0.12", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-12.0.12.tgz", - "integrity": "sha512-SOhuU4wNBxhhTHxYaiG5NY4HBhDIDnJF60GU+2LqHAdKKer86//e4yg69aENCtQ04n0ovz+tq2YPME5t5yp4pw==" + "version": "13.0.5", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-13.0.5.tgz", + "integrity": "sha512-CF/+sxTO7FOwbIRL4wMv0ZYLCRfMid2HQpzDRyViH7kSpfoAFiMdGqKIxb1PxWfjtQXQhnQuD33lvRHNwr809Q==", + "requires": { + "@types/yargs-parser": "*" + } + }, + "@types/yargs-parser": { + "version": "13.1.0", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-13.1.0.tgz", + "integrity": "sha512-gCubfBUZ6KxzoibJ+SCUc/57Ms1jz5NjHe4+dI2krNmU5zCPAphyLJYyTOg06ueIyfj+SaCUqmzun7ImlxDcKg==" }, "@typescript-eslint/eslint-plugin": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-1.6.0.tgz", - "integrity": "sha512-U224c29E2lo861TQZs6GSmyC0OYeRNg6bE9UVIiFBxN2MlA0nq2dCrgIVyyRbC05UOcrgf2Wk/CF2gGOPQKUSQ==", + "version": "2.15.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-2.15.0.tgz", + "integrity": "sha512-XRJFznI5v4K1WvIrWmjFjBAdQWaUTz4xJEdqR7+wAFsv6Q9dP3mOlE6BMNT3pdlp9eF1+bC5m5LZTmLMqffCVw==", "requires": { - "@typescript-eslint/parser": "1.6.0", - "@typescript-eslint/typescript-estree": "1.6.0", - "requireindex": "^1.2.0", - "tsutils": "^3.7.0" + "@typescript-eslint/experimental-utils": "2.15.0", + "eslint-utils": "^1.4.3", + "functional-red-black-tree": "^1.0.1", + "regexpp": "^3.0.0", + "tsutils": "^3.17.1" + } + }, + "@typescript-eslint/experimental-utils": { + "version": "2.15.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-2.15.0.tgz", + "integrity": "sha512-Qkxu5zndY5hqlcQkmA88gfLvqQulMpX/TN91XC7OuXsRf4XG5xLGie0sbpX97o/oeccjeZYRMipIsjKk/tjDHA==", + "requires": { + "@types/json-schema": "^7.0.3", + "@typescript-eslint/typescript-estree": "2.15.0", + "eslint-scope": "^5.0.0" } }, "@typescript-eslint/parser": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-1.6.0.tgz", - "integrity": "sha512-VB9xmSbfafI+/kI4gUK3PfrkGmrJQfh0N4EScT1gZXSZyUxpsBirPL99EWZg9MmPG0pzq/gMtgkk7/rAHj4aQw==", + "version": "2.15.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-2.15.0.tgz", + "integrity": "sha512-6iSgQsqAYTaHw59t0tdjzZJluRAjswdGltzKEdLtcJOxR2UVTPHYvZRqkAVGCkaMVb6Fpa60NnuozNCvsSpA9g==", "requires": { - "@typescript-eslint/typescript-estree": "1.6.0", - "eslint-scope": "^4.0.0", - "eslint-visitor-keys": "^1.0.0" + "@types/eslint-visitor-keys": "^1.0.0", + "@typescript-eslint/experimental-utils": "2.15.0", + "@typescript-eslint/typescript-estree": "2.15.0", + "eslint-visitor-keys": "^1.1.0" } }, "@typescript-eslint/typescript-estree": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-1.6.0.tgz", - "integrity": "sha512-A4CanUwfaG4oXobD5y7EXbsOHjCwn8tj1RDd820etpPAjH+Icjc2K9e/DQM1Hac5zH2BSy+u6bjvvF2wwREvYA==", + "version": "2.15.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-2.15.0.tgz", + "integrity": "sha512-L6Pog+w3VZzXkAdyqA0VlwybF8WcwZX+mufso86CMxSdWmcizJ38lgBdpqTbc9bo92iyi0rOvmATKiwl+amjxg==", "requires": { + "debug": "^4.1.1", + "eslint-visitor-keys": "^1.1.0", + "glob": "^7.1.6", + "is-glob": "^4.0.1", "lodash.unescape": "4.0.1", - "semver": "5.5.0" - }, - "dependencies": { - "semver": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.0.tgz", - "integrity": "sha512-4SJ3dm0WAwWy/NVeioZh5AntkdJoWKxHxcmyP622fOkgHa4z3R0TdBJICINyaSDE6uNwVc8gZr+ZinwZAH4xIA==" - } + "semver": "^6.3.0", + "tsutils": "^3.17.1" } }, "@webassemblyjs/ast": { @@ -1722,9 +1820,14 @@ "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==" }, "abab": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.0.tgz", - "integrity": "sha512-sY5AXXVZv4Y1VACTtR11UJCPHHudgY5i26Qj5TypE6DKlIApbwb5uqhXcJ5UUGbvZNRh7EeIoW+LrJumBsKp7w==" + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.3.tgz", + "integrity": "sha512-tsFzPpcttalNjFBCFMqsKYQcWxxen1pgJR56by//QwvJc4/OUS3kPOOttx2tSIfjsylB0pYu7f5D3K1RCxUnUg==" + }, + "abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==" }, "accepts": { "version": "1.3.7", @@ -1736,28 +1839,30 @@ } }, "acorn": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.2.1.tgz", - "integrity": "sha512-JD0xT5FCRDNyjDda3Lrg/IxFscp9q4tiYtxE1/nOzlKCk7hIRuYjhq1kCNkbPjMRMZuFq20HNQn1I9k8Oj0E+Q==" - }, - "acorn-dynamic-import": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/acorn-dynamic-import/-/acorn-dynamic-import-4.0.0.tgz", - "integrity": "sha512-d3OEjQV4ROpoflsnUA8HozoIR504TFxNivYEUi6uwz0IYhBkTDXGuWlNdMtybRt3nqVx/L6XqMt0FxkXuWKZhw==" + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.1.0.tgz", + "integrity": "sha512-kL5CuoXA/dgxlBbVrflsflzQ3PAas7RYZB52NOm/6839iVYJgKMJ3cQJD+t2i5+qFa8h3MDpEOJiS64E8JLnSQ==" }, "acorn-globals": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-4.3.2.tgz", - "integrity": "sha512-BbzvZhVtZP+Bs1J1HcwrQe8ycfO0wStkSGxuul3He3GkHOIZ6eTqOkPuw9IP1X3+IkOo4wiJmwkobzXYz4wewQ==", + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-4.3.4.tgz", + "integrity": "sha512-clfQEh21R+D0leSbUdWf3OcfqyaCSAQ8Ryq00bofSekfr9W8u1jyYZo6ir0xu9Gtcf7BjcHJpnbZH7JOCpP60A==", "requires": { "acorn": "^6.0.1", "acorn-walk": "^6.0.1" + }, + "dependencies": { + "acorn": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.0.tgz", + "integrity": "sha512-gac8OEcQ2Li1dxIEWGZzsp2BitJxwkwcOm0zHAJLcPJaVvm58FRnk6RkuLRpU1EujipU2ZFODv2P9DLMfnV8mw==" + } } }, "acorn-jsx": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.0.1.tgz", - "integrity": "sha512-HJ7CfNHrfJLlNTzIEUTj43LNWGkqpRLxm3YjAlcD0ACydk9XynzYsCBHxut+iqt+1aBXkx9UP/w/ZqMr13XIzg==" + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.1.0.tgz", + "integrity": "sha512-tMUqwBWfLFbJbizRmEcWSLw6HnFzfdJs2sOJEOwwtVPMoH/0Ay+E703oZz78VSXZiiDcZrQ5XKjPIUQixhmgVw==" }, "acorn-walk": { "version": "6.2.0", @@ -1778,9 +1883,37 @@ "integrity": "sha1-p2Ip68ZMiu+uIEoWJzovJVq+otA=" }, "address": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/address/-/address-1.0.3.tgz", - "integrity": "sha512-z55ocwKBRLryBs394Sm3ushTtBeg6VAeuku7utSoSnsJKvKcnXFIyC6vh27n3rXyxSgkJBBCAvyOn7gSUcTYjg==" + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/address/-/address-1.1.2.tgz", + "integrity": "sha512-aT6camzM4xEA54YVJYSqxz1kv4IHnQZRtThJJHhUMRExaU5spC7jX5ugSwTaTgJliIgs4VhZOk7htClvQ/LmRA==" + }, + "adjust-sourcemap-loader": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/adjust-sourcemap-loader/-/adjust-sourcemap-loader-2.0.0.tgz", + "integrity": "sha512-4hFsTsn58+YjrU9qKzML2JSSDqKvN8mUGQ0nNIrfPi8hmIONT4L3uUaT6MKdMsZ9AjsU6D2xDkZxCkbQPxChrA==", + "requires": { + "assert": "1.4.1", + "camelcase": "5.0.0", + "loader-utils": "1.2.3", + "object-path": "0.11.4", + "regex-parser": "2.2.10" + }, + "dependencies": { + "camelcase": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.0.0.tgz", + "integrity": "sha512-faqwZqnWxbxn+F1d399ygeamQNy3lPp/H9H6rNrqYh4FSVCtcY+3cub1MxA8o9mDd55mM8Aghuu/kuyYA6VTsA==" + } + } + }, + "aggregate-error": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.0.1.tgz", + "integrity": "sha512-quoaXsZ9/BLNae5yiNoUz+Nhkwz83GhWwtYFglcjEQB2NDHCIpApbqXxIFnm4Pq/Nvhrsq5sYJFyohrrxnTGAA==", + "requires": { + "clean-stack": "^2.0.0", + "indent-string": "^4.0.0" + } }, "ajv": { "version": "6.10.2", @@ -1808,15 +1941,23 @@ "resolved": "https://registry.npmjs.org/alphanum-sort/-/alphanum-sort-1.0.2.tgz", "integrity": "sha1-l6ERlkmyEa0zaR2fn0hqjsn74KM=" }, + "amdefine": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz", + "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=" + }, "ansi-colors": { "version": "3.2.4", "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.4.tgz", "integrity": "sha512-hHUXGagefjN2iRrID63xckIvotOXOojhQKWIPUZ4mNUZ9nLZW+7FMNoE1lOkEhNWYsx/7ysGIuJYCiMAA9FnrA==" }, "ansi-escapes": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz", - "integrity": "sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==" + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.0.tgz", + "integrity": "sha512-EiYhwo0v255HUL6eDyuLrXEkTi7WwVCLAw+SeOQ7M7qdun1z1pum4DEm/nuqIVbPvi9RPPc9k9LbyBv6H0DwVg==", + "requires": { + "type-fest": "^0.8.1" + } }, "ansi-html": { "version": "0.0.7", @@ -1824,9 +1965,9 @@ "integrity": "sha1-gTWEAhliqenm/QOflA0S9WynhZ4=" }, "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==" }, "ansi-styles": { "version": "3.2.1", @@ -1850,6 +1991,15 @@ "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==" }, + "are-we-there-yet": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz", + "integrity": "sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w==", + "requires": { + "delegates": "^1.0.0", + "readable-stream": "^2.0.6" + } + }, "argparse": { "version": "1.0.10", "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", @@ -1867,6 +2017,11 @@ "commander": "^2.11.0" } }, + "arity-n": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/arity-n/-/arity-n-1.0.4.tgz", + "integrity": "sha1-2edrEXM+CFacCEeuezmyhgswt0U=" + }, "arr-diff": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", @@ -1887,10 +2042,10 @@ "resolved": "https://registry.npmjs.org/array-equal/-/array-equal-1.0.0.tgz", "integrity": "sha1-jCpe8kcv2ep0KwTHenUJO6J1fJM=" }, - "array-filter": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/array-filter/-/array-filter-0.0.1.tgz", - "integrity": "sha1-fajPLiZijtcygDWB/SH2fKzS7uw=" + "array-find-index": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz", + "integrity": "sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E=" }, "array-flatten": { "version": "2.1.2", @@ -1898,24 +2053,15 @@ "integrity": "sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ==" }, "array-includes": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.0.3.tgz", - "integrity": "sha1-GEtI9i2S10UrsxsyMWXH+L0CJm0=", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.1.tgz", + "integrity": "sha512-c2VXaCHl7zPsvpkFsw4nxvFie4fh1ur9bpcgsVkIjqn0H/Xwdg+7fv3n2r/isyS8EBj5b06M9kHyZuIr4El6WQ==", "requires": { - "define-properties": "^1.1.2", - "es-abstract": "^1.7.0" + "define-properties": "^1.1.3", + "es-abstract": "^1.17.0", + "is-string": "^1.0.5" } }, - "array-map": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/array-map/-/array-map-0.0.0.tgz", - "integrity": "sha1-iKK6tz0c97zVwbEYoAP2b2ZfpmI=" - }, - "array-reduce": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/array-reduce/-/array-reduce-0.0.0.tgz", - "integrity": "sha1-FziZ0//Rx9k4PkR5Ul2+J4yrXys=" - }, "array-union": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", @@ -1963,27 +2109,11 @@ } }, "assert": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/assert/-/assert-1.5.0.tgz", - "integrity": "sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA==", + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/assert/-/assert-1.4.1.tgz", + "integrity": "sha1-mZEtWRg2tab1s0XA8H7vwI/GXZE=", "requires": { - "object-assign": "^4.1.1", "util": "0.10.3" - }, - "dependencies": { - "inherits": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", - "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=" - }, - "util": { - "version": "0.10.3", - "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", - "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=", - "requires": { - "inherits": "2.0.1" - } - } } }, "assert-plus": { @@ -2013,19 +2143,27 @@ "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==" }, "async": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", - "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=" + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.3.tgz", + "integrity": "sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==", + "requires": { + "lodash": "^4.17.14" + } }, "async-each": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.3.tgz", "integrity": "sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ==" }, + "async-foreach": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/async-foreach/-/async-foreach-0.1.3.tgz", + "integrity": "sha1-NhIfhFwFeBct5Bmpfb6x0W7DRUI=" + }, "async-limiter": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.0.tgz", - "integrity": "sha512-jp/uFnooOiO+L211eZOoSyzpOITMXx1rBITauYykG3BRYPu8h0UcxsPNB04RR5vo4Tyz3+ay17tR6JVf9qzYWg==" + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz", + "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==" }, "asynckit": { "version": "0.4.0", @@ -2038,24 +2176,17 @@ "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==" }, "autoprefixer": { - "version": "9.6.1", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-9.6.1.tgz", - "integrity": "sha512-aVo5WxR3VyvyJxcJC3h4FKfwCQvQWb1tSI5VHNibddCVWrcD1NvlxEweg3TSgiPztMnWfjpy2FURKA2kvDE+Tw==", + "version": "9.7.3", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-9.7.3.tgz", + "integrity": "sha512-8T5Y1C5Iyj6PgkPSFd0ODvK9DIleuPKUPYniNxybS47g2k2wFgLZ46lGQHlBuGKIAEV8fbCDfKCCRS1tvOgc3Q==", "requires": { - "browserslist": "^4.6.3", - "caniuse-lite": "^1.0.30000980", + "browserslist": "^4.8.0", + "caniuse-lite": "^1.0.30001012", "chalk": "^2.4.2", "normalize-range": "^0.1.2", "num2fraction": "^1.2.2", - "postcss": "^7.0.17", - "postcss-value-parser": "^4.0.0" - }, - "dependencies": { - "postcss-value-parser": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.0.0.tgz", - "integrity": "sha512-ESPktioptiSUchCKgggAkzdmkgzKfmp0EU8jXH+5kbIUB+unr0Y4CY9SRMvibuvYUBjNh1ACLbxqYNpdTQOteQ==" - } + "postcss": "^7.0.23", + "postcss-value-parser": "^4.0.2" } }, "aws-sign2": { @@ -2064,16 +2195,17 @@ "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=" }, "aws4": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.8.0.tgz", - "integrity": "sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ==" + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.9.0.tgz", + "integrity": "sha512-Uvq6hVe90D0B2WEnUqtdgY1bATGz3mw33nH9Y+dmA+w5DHvUmBgkr5rM/KCHpCsiFNRUfokW/szpPPgMK2hm4A==" }, "axobject-query": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-2.0.2.tgz", - "integrity": "sha512-MCeek8ZH7hKyO1rWUbKNQBbl4l2eY0ntk7OGi+q0RlafrCnfPxC06WZA+uebCfmYp4mNU9jRBP1AhGyf8+W3ww==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-2.1.1.tgz", + "integrity": "sha512-lF98xa/yvy6j3fBHAgQXIYl+J4eZadOSqsPojemUqClzNbBV38wWGpUbQbVEyf4eUF5yF7eHmGgGA2JiHyjeqw==", "requires": { - "ast-types-flow": "0.0.7" + "@babel/runtime": "^7.7.4", + "@babel/runtime-corejs3": "^7.7.4" } }, "babel-code-frame": { @@ -2129,27 +2261,16 @@ } }, "babel-eslint": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/babel-eslint/-/babel-eslint-10.0.1.tgz", - "integrity": "sha512-z7OT1iNV+TjOwHNLLyJk+HN+YVWX+CLE6fPD2SymJZOZQBs+QIexFjhm4keGTm8MW9xr4EC9Q0PbaLB24V5GoQ==", + "version": "10.0.3", + "resolved": "https://registry.npmjs.org/babel-eslint/-/babel-eslint-10.0.3.tgz", + "integrity": "sha512-z3U7eMY6r/3f3/JB9mTsLjyxrv0Yb1zb8PCWCLpguxfCzBIZUwy23R1t/XKewP+8mEN2Ck8Dtr4q20z6ce6SoA==", "requires": { "@babel/code-frame": "^7.0.0", "@babel/parser": "^7.0.0", "@babel/traverse": "^7.0.0", "@babel/types": "^7.0.0", - "eslint-scope": "3.7.1", - "eslint-visitor-keys": "^1.0.0" - }, - "dependencies": { - "eslint-scope": { - "version": "3.7.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-3.7.1.tgz", - "integrity": "sha1-PWPD7f2gLgbgGkUq2IyqzHzctug=", - "requires": { - "esrecurse": "^4.1.0", - "estraverse": "^4.1.1" - } - } + "eslint-visitor-keys": "^1.0.0", + "resolve": "^1.12.0" } }, "babel-extract-comments": { @@ -2161,28 +2282,35 @@ } }, "babel-jest": { - "version": "24.8.0", - "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-24.8.0.tgz", - "integrity": "sha512-+5/kaZt4I9efoXzPlZASyK/lN9qdRKmmUav9smVc0ruPQD7IsfucQ87gpOE8mn2jbDuS6M/YOW6n3v9ZoIfgnw==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-24.9.0.tgz", + "integrity": "sha512-ntuddfyiN+EhMw58PTNL1ph4C9rECiQXjI4nMMBKBaNjXvqLdkXpPRcMSr4iyBrJg/+wz9brFUD6RhOAT6r4Iw==", "requires": { - "@jest/transform": "^24.8.0", - "@jest/types": "^24.8.0", + "@jest/transform": "^24.9.0", + "@jest/types": "^24.9.0", "@types/babel__core": "^7.1.0", "babel-plugin-istanbul": "^5.1.0", - "babel-preset-jest": "^24.6.0", + "babel-preset-jest": "^24.9.0", "chalk": "^2.4.2", "slash": "^2.0.0" } }, "babel-loader": { - "version": "8.0.5", - "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.0.5.tgz", - "integrity": "sha512-NTnHnVRd2JnRqPC0vW+iOQWU5pchDbYXsG2E6DMXEpMfUcQKclF9gmf3G3ZMhzG7IG9ji4coL0cm+FxeWxDpnw==", + "version": "8.0.6", + "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.0.6.tgz", + "integrity": "sha512-4BmWKtBOBm13uoUwd08UwjZlaw3O9GWf456R9j+5YykFZ6LUIjIKLc0zEZf+hauxPOJs96C8k6FvYD09vWzhYw==", "requires": { "find-cache-dir": "^2.0.0", "loader-utils": "^1.0.2", "mkdirp": "^0.5.1", - "util.promisify": "^1.0.0" + "pify": "^4.0.1" + }, + "dependencies": { + "pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==" + } } }, "babel-plugin-dynamic-import-node": { @@ -2205,27 +2333,71 @@ } }, "babel-plugin-jest-hoist": { - "version": "24.6.0", - "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-24.6.0.tgz", - "integrity": "sha512-3pKNH6hMt9SbOv0F3WVmy5CWQ4uogS3k0GY5XLyQHJ9EGpAT9XWkFd2ZiXXtkwFHdAHa5j7w7kfxSP5lAIwu7w==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-24.9.0.tgz", + "integrity": "sha512-2EMA2P8Vp7lG0RAzr4HXqtYwacfMErOuv1U3wrvxHX6rD1sV6xS3WXG3r8TRQ2r6w8OhvSdWt+z41hQNwNm3Xw==", "requires": { "@types/babel__traverse": "^7.0.6" } }, "babel-plugin-macros": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-2.5.1.tgz", - "integrity": "sha512-xN3KhAxPzsJ6OQTktCanNpIFnnMsCV+t8OloKxIL72D6+SUZYFn9qfklPgef5HyyDtzYZqqb+fs1S12+gQY82Q==", + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-2.7.1.tgz", + "integrity": "sha512-HNM284amlKSQ6FddI4jLXD+XTqF0cTYOe5uemOIZxHJHnamC+OhFQ57rMF9sgnYhkJQptVl9U1SKVZsV9/GLQQ==", "requires": { - "@babel/runtime": "^7.4.2", - "cosmiconfig": "^5.2.0", - "resolve": "^1.10.0" + "@babel/runtime": "^7.7.2", + "cosmiconfig": "^6.0.0", + "resolve": "^1.12.0" + }, + "dependencies": { + "cosmiconfig": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-6.0.0.tgz", + "integrity": "sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg==", + "requires": { + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.1.0", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.7.2" + } + }, + "import-fresh": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.2.1.tgz", + "integrity": "sha512-6e1q1cnWP2RXD9/keSkxHScg508CdXqXWgWBaETNhyuBFz+kUZlKboh+ISK+bU++DmbHimVBrOz/zzPe0sZ3sQ==", + "requires": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + } + }, + "parse-json": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.0.0.tgz", + "integrity": "sha512-OOY5b7PAEFV0E2Fir1KOkxchnZNCdowAJgQ5NuxjpBKTRP3pQhwkrkxqQjeoKJ+fO7bCpmIZaogI4eZGDMEGOw==", + "requires": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1", + "lines-and-columns": "^1.1.6" + } + }, + "path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==" + }, + "resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==" + } } }, "babel-plugin-named-asset-import": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/babel-plugin-named-asset-import/-/babel-plugin-named-asset-import-0.3.2.tgz", - "integrity": "sha512-CxwvxrZ9OirpXQ201Ec57OmGhmI8/ui/GwTDy0hSp6CmRvgRC0pSair6Z04Ck+JStA0sMPZzSJ3uE4n17EXpPQ==" + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/babel-plugin-named-asset-import/-/babel-plugin-named-asset-import-0.3.5.tgz", + "integrity": "sha512-sGhfINU+AuMw9oFAdIn/nD5sem3pn/WgxAfDZ//Q3CnF+5uaho7C7shh2rKLk6sKE/XkfmyibghocwKdVjLIKg==" }, "babel-plugin-syntax-object-rest-spread": { "version": "6.13.0", @@ -2247,149 +2419,167 @@ "integrity": "sha512-eqj0hVcJUR57/Ug2zE1Yswsw4LhuqqHhD+8v120T1cl3kjg76QwtyBrdIk4WVwK+lAhBJVYCd/v+4nc4y+8JsA==" }, "babel-preset-jest": { - "version": "24.6.0", - "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-24.6.0.tgz", - "integrity": "sha512-pdZqLEdmy1ZK5kyRUfvBb2IfTPb2BUvIJczlPspS8fWmBQslNNDBqVfh7BW5leOVJMDZKzjD8XEyABTk6gQ5yw==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-24.9.0.tgz", + "integrity": "sha512-izTUuhE4TMfTRPF92fFwD2QfdXaZW08qvWTFCI51V8rW5x00UuPgc3ajRoWofXOuxjfcOM5zzSYsQS3H8KGCAg==", "requires": { "@babel/plugin-syntax-object-rest-spread": "^7.0.0", - "babel-plugin-jest-hoist": "^24.6.0" + "babel-plugin-jest-hoist": "^24.9.0" } }, "babel-preset-react-app": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/babel-preset-react-app/-/babel-preset-react-app-9.0.0.tgz", - "integrity": "sha512-YVsDA8HpAKklhFLJtl9+AgaxrDaor8gGvDFlsg1ByOS0IPGUovumdv4/gJiAnLcDmZmKlH6+9sVOz4NVW7emAg==", + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/babel-preset-react-app/-/babel-preset-react-app-9.1.0.tgz", + "integrity": "sha512-0qMOv/pCcCQWxX1eNyKD9GlzZTdzZIK/Pq3O6TGe65tZSJTSplw1pFlaPujm0GjBj4g3GeCQbP08vvzlH7OGHg==", "requires": { - "@babel/core": "7.4.3", - "@babel/plugin-proposal-class-properties": "7.4.0", - "@babel/plugin-proposal-decorators": "7.4.0", - "@babel/plugin-proposal-object-rest-spread": "7.4.3", - "@babel/plugin-syntax-dynamic-import": "7.2.0", - "@babel/plugin-transform-classes": "7.4.3", - "@babel/plugin-transform-destructuring": "7.4.3", - "@babel/plugin-transform-flow-strip-types": "7.4.0", - "@babel/plugin-transform-react-constant-elements": "7.2.0", - "@babel/plugin-transform-react-display-name": "7.2.0", - "@babel/plugin-transform-runtime": "7.4.3", - "@babel/preset-env": "7.4.3", - "@babel/preset-react": "7.0.0", - "@babel/preset-typescript": "7.3.3", - "@babel/runtime": "7.4.3", - "babel-plugin-dynamic-import-node": "2.2.0", - "babel-plugin-macros": "2.5.1", + "@babel/core": "7.7.4", + "@babel/plugin-proposal-class-properties": "7.7.4", + "@babel/plugin-proposal-decorators": "7.7.4", + "@babel/plugin-proposal-nullish-coalescing-operator": "7.7.4", + "@babel/plugin-proposal-numeric-separator": "7.7.4", + "@babel/plugin-proposal-object-rest-spread": "7.7.4", + "@babel/plugin-proposal-optional-chaining": "7.7.4", + "@babel/plugin-syntax-dynamic-import": "7.7.4", + "@babel/plugin-transform-destructuring": "7.7.4", + "@babel/plugin-transform-flow-strip-types": "7.7.4", + "@babel/plugin-transform-react-display-name": "7.7.4", + "@babel/plugin-transform-runtime": "7.7.4", + "@babel/preset-env": "7.7.4", + "@babel/preset-react": "7.7.4", + "@babel/preset-typescript": "7.7.4", + "@babel/runtime": "7.7.4", + "babel-plugin-dynamic-import-node": "2.3.0", + "babel-plugin-macros": "2.7.1", "babel-plugin-transform-react-remove-prop-types": "0.4.24" }, "dependencies": { + "@babel/plugin-proposal-nullish-coalescing-operator": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.7.4.tgz", + "integrity": "sha512-TbYHmr1Gl1UC7Vo2HVuj/Naci5BEGNZ0AJhzqD2Vpr6QPFWpUmBRLrIDjedzx7/CShq0bRDS2gI4FIs77VHLVQ==", + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.7.4" + } + }, "@babel/plugin-proposal-object-rest-spread": { - "version": "7.4.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.4.3.tgz", - "integrity": "sha512-xC//6DNSSHVjq8O2ge0dyYlhshsH4T7XdCVoxbi5HzLYWfsC5ooFlJjrXk8RcAT+hjHAK9UjBXdylzSoDK3t4g==", + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.7.4.tgz", + "integrity": "sha512-rnpnZR3/iWKmiQyJ3LKJpSwLDcX/nSXhdLk4Aq/tXOApIvyu7qoabrige0ylsAJffaUC51WiBu209Q0U+86OWQ==", "requires": { "@babel/helper-plugin-utils": "^7.0.0", - "@babel/plugin-syntax-object-rest-spread": "^7.2.0" + "@babel/plugin-syntax-object-rest-spread": "^7.7.4" } }, - "@babel/plugin-transform-classes": { - "version": "7.4.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.4.3.tgz", - "integrity": "sha512-PUaIKyFUDtG6jF5DUJOfkBdwAS/kFFV3XFk7Nn0a6vR7ZT8jYw5cGtIlat77wcnd0C6ViGqo/wyNf4ZHytF/nQ==", + "@babel/plugin-proposal-optional-chaining": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.7.4.tgz", + "integrity": "sha512-JmgaS+ygAWDR/STPe3/7y0lNlHgS+19qZ9aC06nYLwQ/XB7c0q5Xs+ksFU3EDnp9EiEsO0dnRAOKeyLHTZuW3A==", "requires": { - "@babel/helper-annotate-as-pure": "^7.0.0", - "@babel/helper-define-map": "^7.4.0", - "@babel/helper-function-name": "^7.1.0", - "@babel/helper-optimise-call-expression": "^7.0.0", "@babel/helper-plugin-utils": "^7.0.0", - "@babel/helper-replace-supers": "^7.4.0", - "@babel/helper-split-export-declaration": "^7.4.0", - "globals": "^11.1.0" + "@babel/plugin-syntax-optional-chaining": "^7.7.4" } }, - "@babel/plugin-transform-destructuring": { - "version": "7.4.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.4.3.tgz", - "integrity": "sha512-rVTLLZpydDFDyN4qnXdzwoVpk1oaXHIvPEOkOLyr88o7oHxVc/LyrnDx+amuBWGOwUb7D1s/uLsKBNTx08htZg==", + "@babel/plugin-syntax-dynamic-import": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.7.4.tgz", + "integrity": "sha512-jHQW0vbRGvwQNgyVxwDh4yuXu4bH1f5/EICJLAhl1SblLs2CDhrsmCk+v5XLdE9wxtAFRyxx+P//Iw+a5L/tTg==", "requires": { "@babel/helper-plugin-utils": "^7.0.0" } }, - "@babel/plugin-transform-react-constant-elements": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.2.0.tgz", - "integrity": "sha512-YYQFg6giRFMsZPKUM9v+VcHOdfSQdz9jHCx3akAi3UYgyjndmdYGSXylQ/V+HswQt4fL8IklchD9HTsaOCrWQQ==", + "@babel/plugin-transform-destructuring": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.7.4.tgz", + "integrity": "sha512-4jFMXI1Cu2aXbcXXl8Lr6YubCn6Oc7k9lLsu8v61TZh+1jny2BWmdtvY9zSUlLdGUvcy9DMAWyZEOqjsbeg/wA==", + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-react-display-name": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.7.4.tgz", + "integrity": "sha512-sBbIvqYkthai0X0vkD2xsAwluBp+LtNHH+/V4a5ydifmTtb8KOVOlrMIk/MYmIc4uTYDnjZUHQildYNo36SRJw==", "requires": { - "@babel/helper-annotate-as-pure": "^7.0.0", "@babel/helper-plugin-utils": "^7.0.0" } }, "@babel/preset-env": { - "version": "7.4.3", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.4.3.tgz", - "integrity": "sha512-FYbZdV12yHdJU5Z70cEg0f6lvtpZ8jFSDakTm7WXeJbLXh4R0ztGEu/SW7G1nJ2ZvKwDhz8YrbA84eYyprmGqw==", + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.7.4.tgz", + "integrity": "sha512-Dg+ciGJjwvC1NIe/DGblMbcGq1HOtKbw8RLl4nIjlfcILKEOkWT/vRqPpumswABEBVudii6dnVwrBtzD7ibm4g==", "requires": { - "@babel/helper-module-imports": "^7.0.0", + "@babel/helper-module-imports": "^7.7.4", "@babel/helper-plugin-utils": "^7.0.0", - "@babel/plugin-proposal-async-generator-functions": "^7.2.0", - "@babel/plugin-proposal-json-strings": "^7.2.0", - "@babel/plugin-proposal-object-rest-spread": "^7.4.3", - "@babel/plugin-proposal-optional-catch-binding": "^7.2.0", - "@babel/plugin-proposal-unicode-property-regex": "^7.4.0", - "@babel/plugin-syntax-async-generators": "^7.2.0", - "@babel/plugin-syntax-json-strings": "^7.2.0", - "@babel/plugin-syntax-object-rest-spread": "^7.2.0", - "@babel/plugin-syntax-optional-catch-binding": "^7.2.0", - "@babel/plugin-transform-arrow-functions": "^7.2.0", - "@babel/plugin-transform-async-to-generator": "^7.4.0", - "@babel/plugin-transform-block-scoped-functions": "^7.2.0", - "@babel/plugin-transform-block-scoping": "^7.4.0", - "@babel/plugin-transform-classes": "^7.4.3", - "@babel/plugin-transform-computed-properties": "^7.2.0", - "@babel/plugin-transform-destructuring": "^7.4.3", - "@babel/plugin-transform-dotall-regex": "^7.4.3", - "@babel/plugin-transform-duplicate-keys": "^7.2.0", - "@babel/plugin-transform-exponentiation-operator": "^7.2.0", - "@babel/plugin-transform-for-of": "^7.4.3", - "@babel/plugin-transform-function-name": "^7.4.3", - "@babel/plugin-transform-literals": "^7.2.0", - "@babel/plugin-transform-member-expression-literals": "^7.2.0", - "@babel/plugin-transform-modules-amd": "^7.2.0", - "@babel/plugin-transform-modules-commonjs": "^7.4.3", - "@babel/plugin-transform-modules-systemjs": "^7.4.0", - "@babel/plugin-transform-modules-umd": "^7.2.0", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.4.2", - "@babel/plugin-transform-new-target": "^7.4.0", - "@babel/plugin-transform-object-super": "^7.2.0", - "@babel/plugin-transform-parameters": "^7.4.3", - "@babel/plugin-transform-property-literals": "^7.2.0", - "@babel/plugin-transform-regenerator": "^7.4.3", - "@babel/plugin-transform-reserved-words": "^7.2.0", - "@babel/plugin-transform-shorthand-properties": "^7.2.0", - "@babel/plugin-transform-spread": "^7.2.0", - "@babel/plugin-transform-sticky-regex": "^7.2.0", - "@babel/plugin-transform-template-literals": "^7.2.0", - "@babel/plugin-transform-typeof-symbol": "^7.2.0", - "@babel/plugin-transform-unicode-regex": "^7.4.3", - "@babel/types": "^7.4.0", - "browserslist": "^4.5.2", - "core-js-compat": "^3.0.0", + "@babel/plugin-proposal-async-generator-functions": "^7.7.4", + "@babel/plugin-proposal-dynamic-import": "^7.7.4", + "@babel/plugin-proposal-json-strings": "^7.7.4", + "@babel/plugin-proposal-object-rest-spread": "^7.7.4", + "@babel/plugin-proposal-optional-catch-binding": "^7.7.4", + "@babel/plugin-proposal-unicode-property-regex": "^7.7.4", + "@babel/plugin-syntax-async-generators": "^7.7.4", + "@babel/plugin-syntax-dynamic-import": "^7.7.4", + "@babel/plugin-syntax-json-strings": "^7.7.4", + "@babel/plugin-syntax-object-rest-spread": "^7.7.4", + "@babel/plugin-syntax-optional-catch-binding": "^7.7.4", + "@babel/plugin-syntax-top-level-await": "^7.7.4", + "@babel/plugin-transform-arrow-functions": "^7.7.4", + "@babel/plugin-transform-async-to-generator": "^7.7.4", + "@babel/plugin-transform-block-scoped-functions": "^7.7.4", + "@babel/plugin-transform-block-scoping": "^7.7.4", + "@babel/plugin-transform-classes": "^7.7.4", + "@babel/plugin-transform-computed-properties": "^7.7.4", + "@babel/plugin-transform-destructuring": "^7.7.4", + "@babel/plugin-transform-dotall-regex": "^7.7.4", + "@babel/plugin-transform-duplicate-keys": "^7.7.4", + "@babel/plugin-transform-exponentiation-operator": "^7.7.4", + "@babel/plugin-transform-for-of": "^7.7.4", + "@babel/plugin-transform-function-name": "^7.7.4", + "@babel/plugin-transform-literals": "^7.7.4", + "@babel/plugin-transform-member-expression-literals": "^7.7.4", + "@babel/plugin-transform-modules-amd": "^7.7.4", + "@babel/plugin-transform-modules-commonjs": "^7.7.4", + "@babel/plugin-transform-modules-systemjs": "^7.7.4", + "@babel/plugin-transform-modules-umd": "^7.7.4", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.7.4", + "@babel/plugin-transform-new-target": "^7.7.4", + "@babel/plugin-transform-object-super": "^7.7.4", + "@babel/plugin-transform-parameters": "^7.7.4", + "@babel/plugin-transform-property-literals": "^7.7.4", + "@babel/plugin-transform-regenerator": "^7.7.4", + "@babel/plugin-transform-reserved-words": "^7.7.4", + "@babel/plugin-transform-shorthand-properties": "^7.7.4", + "@babel/plugin-transform-spread": "^7.7.4", + "@babel/plugin-transform-sticky-regex": "^7.7.4", + "@babel/plugin-transform-template-literals": "^7.7.4", + "@babel/plugin-transform-typeof-symbol": "^7.7.4", + "@babel/plugin-transform-unicode-regex": "^7.7.4", + "@babel/types": "^7.7.4", + "browserslist": "^4.6.0", + "core-js-compat": "^3.1.1", "invariant": "^2.2.2", "js-levenshtein": "^1.1.3", "semver": "^5.5.0" } }, - "@babel/runtime": { - "version": "7.4.3", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.4.3.tgz", - "integrity": "sha512-9lsJwJLxDh/T3Q3SZszfWOTkk3pHbkmH+3KY+zwIDmsNlxsumuhS2TH3NIpktU4kNvfzy+k3eLT7aTJSPTo0OA==", + "@babel/preset-react": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.7.4.tgz", + "integrity": "sha512-j+vZtg0/8pQr1H8wKoaJyGL2IEk3rG/GIvua7Sec7meXVIvGycihlGMx5xcU00kqCJbwzHs18xTu3YfREOqQ+g==", "requires": { - "regenerator-runtime": "^0.13.2" + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/plugin-transform-react-display-name": "^7.7.4", + "@babel/plugin-transform-react-jsx": "^7.7.4", + "@babel/plugin-transform-react-jsx-self": "^7.7.4", + "@babel/plugin-transform-react-jsx-source": "^7.7.4" } }, - "babel-plugin-dynamic-import-node": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.2.0.tgz", - "integrity": "sha512-fP899ELUnTaBcIzmrW7nniyqqdYWrWuJUyPWHxFa/c7r7hS6KC8FscNfLlBNIoPSc55kYMGEEKjPjJGCLbE1qA==", + "@babel/runtime": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.7.4.tgz", + "integrity": "sha512-r24eVUUr0QqNZa+qrImUk8fn5SPhHq+IfYvIoIMg0do3GdK9sMdiLKP3GYVVaxpPKORgm8KRKaNTEhAjgIpLMw==", "requires": { - "object.assign": "^4.1.0" + "regenerator-runtime": "^0.13.2" } }, "regenerator-runtime": { @@ -2398,9 +2588,9 @@ "integrity": "sha512-naKIZz2GQ8JWh///G7L3X6LaQUAMp2lvb1rvwwsURe/VXwD6VMfr+/1NuNw3ag8v2kY1aQ/go5SNn79O9JU7yw==" }, "semver": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz", - "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==" + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" } } }, @@ -2484,9 +2674,9 @@ "integrity": "sha1-4pf2DX7BAUp6lxo568ipjAtoHnA=" }, "base64-js": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.0.tgz", - "integrity": "sha512-ccav/yGvoa80BQDljCxsmmQ3Xvx60/UpBIij5QN21W3wBi/hhIC9OoO+KLpu9IJTS9j4DRVJ3aDDF9cMSoa2lw==" + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.1.tgz", + "integrity": "sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g==" }, "batch": { "version": "0.6.1", @@ -2511,10 +2701,27 @@ "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==" }, + "bindings": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", + "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", + "optional": true, + "requires": { + "file-uri-to-path": "1.0.0" + } + }, + "block-stream": { + "version": "0.0.9", + "resolved": "https://registry.npmjs.org/block-stream/-/block-stream-0.0.9.tgz", + "integrity": "sha1-E+v+d4oDIFz+A3UUgeu0szAMEmo=", + "requires": { + "inherits": "~2.0.0" + } + }, "bluebird": { - "version": "3.5.5", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.5.tgz", - "integrity": "sha512-5am6HnnfN+urzt4yfg7IgTbotDjIT/u8AJpEt0sIU9FtXfVeezXAPKswrG+xKUCOYAINpSdgZVDU6QFh+cuH3w==" + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", + "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==" }, "bn.js": { "version": "4.11.8", @@ -2582,9 +2789,9 @@ "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24=" }, "bootstrap": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-4.3.1.tgz", - "integrity": "sha512-rXqOmH1VilAt2DyPzluTi2blhk17bO7ef+zLLPlWvG494pDxcM234pJ8wTc/6R40UWizAIIMgxjvxZg5kmsbag==" + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-4.4.1.tgz", + "integrity": "sha512-tbx5cHubwE6e2ZG7nqM3g/FZ5PQEDMWmMGNrCUBVRPHXTJaH7CBDdsLeu3eCh3B1tzAxTnAbtmrzvWEvT2NNEA==" }, "brace-expansion": { "version": "1.1.11", @@ -2713,27 +2920,27 @@ } }, "browserslist": { - "version": "4.6.6", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.6.6.tgz", - "integrity": "sha512-D2Nk3W9JL9Fp/gIcWei8LrERCS+eXu9AM5cfXA8WEZ84lFks+ARnZ0q/R69m2SV3Wjma83QDDPxsNKXUwdIsyA==", + "version": "4.8.3", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.8.3.tgz", + "integrity": "sha512-iU43cMMknxG1ClEZ2MDKeonKE1CCrFVkQK2AqO2YWFmvIrx4JWrvQ4w4hQez6EpVI8rHTtqh/ruHHDHSOKxvUg==", "requires": { - "caniuse-lite": "^1.0.30000984", - "electron-to-chromium": "^1.3.191", - "node-releases": "^1.1.25" + "caniuse-lite": "^1.0.30001017", + "electron-to-chromium": "^1.3.322", + "node-releases": "^1.1.44" } }, "bser": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.0.tgz", - "integrity": "sha512-8zsjWrQkkBoLK6uxASk1nJ2SKv97ltiGDo6A3wA0/yRPz+CwmEyDo0hUrhIuukG2JHpAl3bvFIixw2/3Hi0DOg==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", + "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", "requires": { "node-int64": "^0.4.0" } }, "buffer": { - "version": "4.9.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.1.tgz", - "integrity": "sha1-bRu2AbB6TvztlwlBMgkwJ8lbwpg=", + "version": "4.9.2", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.2.tgz", + "integrity": "sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg==", "requires": { "base64-js": "^1.0.2", "ieee754": "^1.1.4", @@ -2766,24 +2973,38 @@ "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=" }, "cacache": { - "version": "11.3.3", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-11.3.3.tgz", - "integrity": "sha512-p8WcneCytvzPxhDvYp31PD039vi77I12W+/KfR9S8AZbaiARFBCpsPJS+9uhWfeBfeAtW7o/4vt3MUqLkbY6nA==", + "version": "13.0.1", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-13.0.1.tgz", + "integrity": "sha512-5ZvAxd05HDDU+y9BVvcqYu2LLXmPnQ0hW62h32g4xBTgL/MppR4/04NHfj/ycM2y6lmTnbw6HVi+1eN0Psba6w==", "requires": { - "bluebird": "^3.5.5", - "chownr": "^1.1.1", + "chownr": "^1.1.2", "figgy-pudding": "^3.5.1", + "fs-minipass": "^2.0.0", "glob": "^7.1.4", - "graceful-fs": "^4.1.15", + "graceful-fs": "^4.2.2", + "infer-owner": "^1.0.4", "lru-cache": "^5.1.1", - "mississippi": "^3.0.0", + "minipass": "^3.0.0", + "minipass-collect": "^1.0.2", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.2", "mkdirp": "^0.5.1", "move-concurrently": "^1.0.1", + "p-map": "^3.0.0", "promise-inflight": "^1.0.1", - "rimraf": "^2.6.3", - "ssri": "^6.0.1", - "unique-filename": "^1.1.1", - "y18n": "^4.0.0" + "rimraf": "^2.7.1", + "ssri": "^7.0.0", + "unique-filename": "^1.1.1" + }, + "dependencies": { + "rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "requires": { + "glob": "^7.1.3" + } + } } }, "cache-base": { @@ -2842,6 +3063,22 @@ "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==" }, + "camelcase-keys": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz", + "integrity": "sha1-MIvur/3ygRkFHvodkyITyRuPkuc=", + "requires": { + "camelcase": "^2.0.0", + "map-obj": "^1.0.0" + }, + "dependencies": { + "camelcase": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz", + "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=" + } + } + }, "caniuse-api": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-3.0.0.tgz", @@ -2854,9 +3091,9 @@ } }, "caniuse-lite": { - "version": "1.0.30000985", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30000985.tgz", - "integrity": "sha512-1ngiwkgqAYPG0JSSUp3PUDGPKKY59EK7NrGGX+VOxaKCNzRbNc7uXMny+c3VJfZxtoK3wSImTvG9T9sXiTw2+w==" + "version": "1.0.30001020", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001020.tgz", + "integrity": "sha512-yWIvwA68wRHKanAVS1GjN8vajAv7MBFshullKCeq/eKpK7pJBVDgFFEqvgWTkcP2+wIDeQGYFRXECjKZnLkUjA==" }, "capture-exit": { "version": "2.0.0", @@ -2912,9 +3149,9 @@ "dev": true }, "chokidar": { - "version": "2.1.6", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.6.tgz", - "integrity": "sha512-V2jUo67OKkc6ySiRpJrjlpJKl9kDuG+Xb8VgsGzb+aEouhgS1D0weyPU4lEzdAcsCAvrih2J2BqyXqHWvVLw5g==", + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", + "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==", "requires": { "anymatch": "^2.0.0", "async-each": "^1.0.1", @@ -2931,13 +3168,14 @@ }, "dependencies": { "fsevents": { - "version": "1.2.9", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.9.tgz", - "integrity": "sha512-oeyj2H3EjjonWcFjD5NvZNE9Rqe4UW+nQBU2HNeKw0koVLEFIhtyETyAakeAM3de7Z/SW5kcA+fZUait9EApnw==", + "version": "1.2.11", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.11.tgz", + "integrity": "sha512-+ux3lx6peh0BpvY0JebGyZoiR4D+oYzdPZMKJwkZ+sFkNJzpL7tXc/wehS49gUAxg3tmMHPHZkA8JU2rhhgDHw==", "optional": true, "requires": { + "bindings": "^1.5.0", "nan": "^2.12.1", - "node-pre-gyp": "^0.12.0" + "node-pre-gyp": "*" }, "dependencies": { "abbrev": { @@ -2979,7 +3217,7 @@ } }, "chownr": { - "version": "1.1.1", + "version": "1.1.3", "bundled": true, "optional": true }, @@ -3004,7 +3242,7 @@ "optional": true }, "debug": { - "version": "4.1.1", + "version": "3.2.6", "bundled": true, "optional": true, "requires": { @@ -3027,11 +3265,11 @@ "optional": true }, "fs-minipass": { - "version": "1.2.5", + "version": "1.2.7", "bundled": true, "optional": true, "requires": { - "minipass": "^2.2.1" + "minipass": "^2.6.0" } }, "fs.realpath": { @@ -3055,7 +3293,7 @@ } }, "glob": { - "version": "7.1.3", + "version": "7.1.6", "bundled": true, "optional": true, "requires": { @@ -3081,7 +3319,7 @@ } }, "ignore-walk": { - "version": "3.0.1", + "version": "3.0.3", "bundled": true, "optional": true, "requires": { @@ -3098,7 +3336,7 @@ } }, "inherits": { - "version": "2.0.3", + "version": "2.0.4", "bundled": true, "optional": true }, @@ -3134,7 +3372,7 @@ "optional": true }, "minipass": { - "version": "2.3.5", + "version": "2.9.0", "bundled": true, "optional": true, "requires": { @@ -3143,11 +3381,11 @@ } }, "minizlib": { - "version": "1.2.1", + "version": "1.3.3", "bundled": true, "optional": true, "requires": { - "minipass": "^2.2.1" + "minipass": "^2.9.0" } }, "mkdirp": { @@ -3159,22 +3397,22 @@ } }, "ms": { - "version": "2.1.1", + "version": "2.1.2", "bundled": true, "optional": true }, "needle": { - "version": "2.3.0", + "version": "2.4.0", "bundled": true, "optional": true, "requires": { - "debug": "^4.1.0", + "debug": "^3.2.6", "iconv-lite": "^0.4.4", "sax": "^1.2.4" } }, "node-pre-gyp": { - "version": "0.12.0", + "version": "0.14.0", "bundled": true, "optional": true, "requires": { @@ -3187,7 +3425,7 @@ "rc": "^1.2.7", "rimraf": "^2.6.1", "semver": "^5.3.0", - "tar": "^4" + "tar": "^4.4.2" } }, "nopt": { @@ -3200,12 +3438,20 @@ } }, "npm-bundled": { - "version": "1.0.6", + "version": "1.1.1", + "bundled": true, + "optional": true, + "requires": { + "npm-normalize-package-bin": "^1.0.1" + } + }, + "npm-normalize-package-bin": { + "version": "1.0.1", "bundled": true, "optional": true }, "npm-packlist": { - "version": "1.4.1", + "version": "1.4.7", "bundled": true, "optional": true, "requires": { @@ -3267,7 +3513,7 @@ "optional": true }, "process-nextick-args": { - "version": "2.0.0", + "version": "2.0.1", "bundled": true, "optional": true }, @@ -3304,7 +3550,7 @@ } }, "rimraf": { - "version": "2.6.3", + "version": "2.7.1", "bundled": true, "optional": true, "requires": { @@ -3327,7 +3573,7 @@ "optional": true }, "semver": { - "version": "5.7.0", + "version": "5.7.1", "bundled": true, "optional": true }, @@ -3373,17 +3619,17 @@ "optional": true }, "tar": { - "version": "4.4.8", + "version": "4.4.13", "bundled": true, "optional": true, "requires": { "chownr": "^1.1.1", "fs-minipass": "^1.2.5", - "minipass": "^2.3.4", - "minizlib": "^1.1.1", + "minipass": "^2.8.6", + "minizlib": "^1.2.1", "mkdirp": "^0.5.0", "safe-buffer": "^5.1.2", - "yallist": "^3.0.2" + "yallist": "^3.0.3" } }, "util-deprecate": { @@ -3405,12 +3651,31 @@ "optional": true }, "yallist": { - "version": "3.0.3", + "version": "3.1.1", "bundled": true, "optional": true } } }, + "glob-parent": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", + "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", + "requires": { + "is-glob": "^3.1.0", + "path-dirname": "^1.0.0" + }, + "dependencies": { + "is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "requires": { + "is-extglob": "^2.1.0" + } + } + } + }, "normalize-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", @@ -3419,9 +3684,9 @@ } }, "chownr": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.2.tgz", - "integrity": "sha512-GkfeAQh+QNy3wquu9oIZr6SS5x7wGdSgNQvD10X3r+AZr1Oys22HW8kAmDMvNg2+Dm0TeGaEuO8gFwdBXxwO8A==" + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.3.tgz", + "integrity": "sha512-i70fVHhmV3DtTl6nqvZOnIjbY0Pe4kAUjwHj8z0zAdgBtYrJyYwLKCCuRBQ5ppkyL0AkN7HKRnETdmdp1zqNXw==" }, "chrome-trace-event": { "version": "1.0.2", @@ -3479,12 +3744,17 @@ "source-map": "~0.6.0" } }, + "clean-stack": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", + "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==" + }, "cli-cursor": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", - "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", + "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", "requires": { - "restore-cursor": "^2.0.0" + "restore-cursor": "^3.1.0" } }, "cli-width": { @@ -3493,13 +3763,35 @@ "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=" }, "cliui": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-4.1.0.tgz", - "integrity": "sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", + "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", "requires": { - "string-width": "^2.1.1", - "strip-ansi": "^4.0.0", - "wrap-ansi": "^2.0.0" + "string-width": "^3.1.0", + "strip-ansi": "^5.2.0", + "wrap-ansi": "^5.1.0" + }, + "dependencies": { + "emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==" + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" + }, + "string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "requires": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + } + } } }, "clone-deep": { @@ -3588,9 +3880,9 @@ } }, "commander": { - "version": "2.20.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.0.tgz", - "integrity": "sha512-7j2y+40w61zy6YC2iRNpUe/NwhNyoXrYpHMrSunaMG64nRnaf96zO/KMQR4OyN/UnE5KLyEBnKHd4aG3rskjpQ==" + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" }, "common-tags": { "version": "1.8.0", @@ -3620,12 +3912,20 @@ "resolved": "https://registry.npmjs.org/component-indexof/-/component-indexof-0.0.3.tgz", "integrity": "sha1-EdCRMSI5648yyPJa6csAL/6NPCQ=" }, - "compressible": { - "version": "2.0.17", - "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.17.tgz", - "integrity": "sha512-BGHeLCK1GV7j1bSmQQAi26X+GgWcTjLr/0tzSvMCl3LH1w1IJ4PFSPoV5316b30cneTziC+B1a+3OjoSUcQYmw==", + "compose-function": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/compose-function/-/compose-function-3.0.3.tgz", + "integrity": "sha1-ntZ18TzFRQHTCVCkhv9qe6OrGF8=", "requires": { - "mime-db": ">= 1.40.0 < 2" + "arity-n": "^1.0.4" + } + }, + "compressible": { + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", + "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", + "requires": { + "mime-db": ">= 1.43.0 < 2" } }, "compression": { @@ -3674,9 +3974,9 @@ } }, "confusing-browser-globals": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/confusing-browser-globals/-/confusing-browser-globals-1.0.7.tgz", - "integrity": "sha512-cgHI1azax5ATrZ8rJ+ODDML9Fvu67PimB6aNxBrc/QwSaDaM9eTfIEUHx3bBLJJ82ioSb+/5zfsMCCEJax3ByQ==" + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/confusing-browser-globals/-/confusing-browser-globals-1.0.9.tgz", + "integrity": "sha512-KbS1Y0jMtyPgIxjO7ZzMAuUpAKMt1SzCL9fsrKsX6b0zJPTaT0SiSPmewwVZg9UAO83HVIlEhZF84LIjZ0lmAw==" }, "connect-history-api-fallback": { "version": "1.6.0", @@ -3684,12 +3984,14 @@ "integrity": "sha512-e54B99q/OUoH64zYYRf3HBP5z24G38h5D3qXu23JGRoigpX5Ss4r9ZnDk3g0Z8uQC2x2lPaJ+UlWBc1ZWBWdLg==" }, "console-browserify": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.2.0.tgz", + "integrity": "sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==" + }, + "console-control-strings": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.1.0.tgz", - "integrity": "sha1-8CQcRXMKn8YyOyBtvzjtx0HQuxA=", - "requires": { - "date-now": "^0.1.4" - } + "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", + "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=" }, "constants-browserify": { "version": "1.0.0", @@ -3715,9 +4017,9 @@ "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==" }, "convert-source-map": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.6.0.tgz", - "integrity": "sha512-eFu7XigvxdZ1ETfbgPBohgyQ/Z++C0eEhTor0qRwBw9unw+L0/6V8wkSuGgzdThkiS5lSpdptOQPD8Ak40a+7A==", + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz", + "integrity": "sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==", "requires": { "safe-buffer": "~5.1.1" } @@ -3761,26 +4063,25 @@ "integrity": "sha512-HOpZf6eXmnl7la+cUdMnLvUxKNqLUzJvgIziQ0DiF3JwSImNphIqdGqzj6hIKyX04MmV0poclQ7+wjWvxQyR2A==" }, "core-js-compat": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.1.4.tgz", - "integrity": "sha512-Z5zbO9f1d0YrJdoaQhphVAnKPimX92D6z8lCGphH89MNRxlL1prI9ExJPqVwP0/kgkQCv8c4GJGT8X16yUncOg==", + "version": "3.6.3", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.6.3.tgz", + "integrity": "sha512-Y3YNGU3bU1yrnzVodop23ghArbKv4IqkZg9MMOWv/h7KT6NRk1/SzHhWDDlubg2+tlcUzAqgj1/GyeJ9fUKMeg==", "requires": { - "browserslist": "^4.6.2", - "core-js-pure": "3.1.4", - "semver": "^6.1.1" + "browserslist": "^4.8.3", + "semver": "7.0.0" }, "dependencies": { "semver": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.2.0.tgz", - "integrity": "sha512-jdFC1VdUGT/2Scgbimf7FSx9iJLXoqfglSF+gJeuNWVpiE37OIbc1jywR/GJyFdz3mnkz2/id0L0J/cr0izR5A==" + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz", + "integrity": "sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==" } } }, "core-js-pure": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.1.4.tgz", - "integrity": "sha512-uJ4Z7iPNwiu1foygbcZYJsJs1jiXrTTCvxfLDXNhI/I+NHbSIEyr548y4fcsCEyWY0XgfAG/qqaunJ1SThHenA==" + "version": "3.6.3", + "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.6.3.tgz", + "integrity": "sha512-4LhJ4fw0sC4/8X5krM9hI5oQ3cgYHYojWwwWnQKjC6k6vf/qIVS9d0r3+Bdn+FUADgRpD0xzPFQ9P7cOeuIwlA==" }, "core-util-is": { "version": "1.0.2", @@ -3842,15 +4143,6 @@ "object-assign": "^4.1.1" } }, - "create-react-context": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/create-react-context/-/create-react-context-0.2.3.tgz", - "integrity": "sha512-CQBmD0+QGgTaxDL3OX1IDXYqjkp2It4RIbcb99jS6AEg27Ga+a9G3JtK6SIu0HBwPLZlmwt9F7UwWA4Bn92Rag==", - "requires": { - "fbjs": "^0.8.0", - "gud": "^1.0.0" - } - }, "cross-spawn": { "version": "6.0.5", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", @@ -3864,9 +4156,9 @@ }, "dependencies": { "semver": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz", - "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==" + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" } } }, @@ -3888,10 +4180,21 @@ "randomfill": "^1.0.3" } }, + "css": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/css/-/css-2.2.4.tgz", + "integrity": "sha512-oUnjmWpy0niI3x/mPL8dVEI1l7MnG3+HHyRPHf+YFSbK+svOhXpmSOcDURUh2aOCgl2grzrOPt1nHLuCVFULLw==", + "requires": { + "inherits": "^2.0.3", + "source-map": "^0.6.1", + "source-map-resolve": "^0.5.2", + "urix": "^0.1.0" + } + }, "css-animation": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/css-animation/-/css-animation-1.5.0.tgz", - "integrity": "sha512-hWYoWiOZ7Vr20etzLh3kpWgtC454tW5vn4I6rLANDgpzNSkO7UfOqyCEeaoBSG9CYWQpRkFWTWbWW8o3uZrNLw==", + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/css-animation/-/css-animation-1.6.1.tgz", + "integrity": "sha512-/48+/BaEaHRY6kNQ2OIPzKf9A6g8WjZYjhiNDNuIVbsm5tXCGIAsHDjB4Xu1C4vXJtUWZo26O68OQkDpNBaPog==", "requires": { "babel-runtime": "6.x", "component-classes": "^1.2.5" @@ -3946,21 +4249,22 @@ } }, "css-loader": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-2.1.1.tgz", - "integrity": "sha512-OcKJU/lt232vl1P9EEDamhoO9iKY3tIjY5GU+XDLblAykTdgs6Ux9P1hTHve8nFKy5KPpOXOsVI/hIwi3841+w==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-3.2.0.tgz", + "integrity": "sha512-QTF3Ud5H7DaZotgdcJjGMvyDj5F3Pn1j/sC6VBEOVp94cbwqyIBdcs/quzj4MC1BKQSrTpQznegH/5giYbhnCQ==", "requires": { - "camelcase": "^5.2.0", - "icss-utils": "^4.1.0", + "camelcase": "^5.3.1", + "cssesc": "^3.0.0", + "icss-utils": "^4.1.1", "loader-utils": "^1.2.3", "normalize-path": "^3.0.0", - "postcss": "^7.0.14", + "postcss": "^7.0.17", "postcss-modules-extract-imports": "^2.0.0", - "postcss-modules-local-by-default": "^2.0.6", + "postcss-modules-local-by-default": "^3.0.2", "postcss-modules-scope": "^2.1.0", - "postcss-modules-values": "^2.0.0", - "postcss-value-parser": "^3.3.0", - "schema-utils": "^1.0.0" + "postcss-modules-values": "^3.0.0", + "postcss-value-parser": "^4.0.0", + "schema-utils": "^2.0.0" }, "dependencies": { "normalize-path": { @@ -3979,12 +4283,12 @@ } }, "css-select": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-2.0.2.tgz", - "integrity": "sha512-dSpYaDVoWaELjvZ3mS6IKZM/y2PMPa/XYoEfYNZePL4U/XgyxZNroHEHReDx/d+VgXh9VbCTtFqLkFbmeqeaRQ==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-2.1.0.tgz", + "integrity": "sha512-Dqk7LQKpwLoH3VovzZnkzegqNSuAziQyNZUcrdDM401iY+R5NkGBXGmtO05/yaXQziALuPogeG0b7UAgjnTJTQ==", "requires": { "boolbase": "^1.0.0", - "css-what": "^2.1.2", + "css-what": "^3.2.1", "domutils": "^1.7.0", "nth-check": "^1.0.2" } @@ -3995,19 +4299,12 @@ "integrity": "sha512-jQVeeRG70QI08vSTwf1jHxp74JoZsr2XSgETae8/xC8ovSnL2WF87GTLO86Sbwdt2lK4Umg4HnnwMO4YF3Ce7w==" }, "css-tree": { - "version": "1.0.0-alpha.33", - "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.0.0-alpha.33.tgz", - "integrity": "sha512-SPt57bh5nQnpsTBsx/IXbO14sRc9xXu5MtMAVuo0BaQQmyf0NupNPPSoMaqiAF5tDFafYsTkfeH4Q/HCKXkg4w==", + "version": "1.0.0-alpha.37", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.0.0-alpha.37.tgz", + "integrity": "sha512-DMxWJg0rnz7UgxKT0Q1HU/L9BeJI0M6ksor0OgqOnF+aRCDWg/N2641HmVyU9KVIu0OVVWOb2IpC9A+BJRnejg==", "requires": { "mdn-data": "2.0.4", - "source-map": "^0.5.3" - }, - "dependencies": { - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" - } + "source-map": "^0.6.1" } }, "css-unit-converter": { @@ -4016,9 +4313,9 @@ "integrity": "sha1-2bkoGtz9jO2TW9urqDeGiX9k6ZY=" }, "css-what": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/css-what/-/css-what-2.1.3.tgz", - "integrity": "sha512-a+EPoD+uZiNfh+5fxw2nO9QwFa6nJe2Or35fGY6Ipw1R3R4AGz1d1TEZrCegvw2YTmZ0jXirGYlzxxpYSHwpEg==" + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-3.2.1.tgz", + "integrity": "sha512-WwOrosiQTvyms+Ti5ZC5vGEK0Vod3FTt1ca+payZqvKuGJF+dq7bG63DstxtN0dpm6FxY27a/zS3Wten+gEtGw==" }, "cssdb": { "version": "4.4.0", @@ -4102,32 +4399,11 @@ "integrity": "sha512-WcKx5OY+KoSIAxBW6UBBRay1U6vkYheCdjyVNDm85zt5K9mHoGOfsOsqIszfAqrQQFIIKgjh2+FDgIj/zsl21Q==" }, "csso": { - "version": "3.5.1", - "resolved": "https://registry.npmjs.org/csso/-/csso-3.5.1.tgz", - "integrity": "sha512-vrqULLffYU1Q2tLdJvaCYbONStnfkfimRxXNaGjxMldI0C7JPBC4rB1RyjhfdZ4m1frm8pM9uRPKH3d2knZ8gg==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/csso/-/csso-4.0.2.tgz", + "integrity": "sha512-kS7/oeNVXkHWxby5tHVxlhjizRCSv8QdU7hB2FpdAibDU8FjTAolhNjKNTiLzXtUrKT6HwClE81yXwEk1309wg==", "requires": { - "css-tree": "1.0.0-alpha.29" - }, - "dependencies": { - "css-tree": { - "version": "1.0.0-alpha.29", - "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.0.0-alpha.29.tgz", - "integrity": "sha512-sRNb1XydwkW9IOci6iB2xmy8IGCj6r/fr+JWitvJ2JxQRPzN3T4AGGVWCMlVmVwM1gtgALJRmGIlWv5ppnGGkg==", - "requires": { - "mdn-data": "~1.1.0", - "source-map": "^0.5.3" - } - }, - "mdn-data": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-1.1.4.tgz", - "integrity": "sha512-FSYbp3lyKjyj3E7fMl6rYvUdX0FBXaluGqlFoYESWQlyUTq8R+wp0rkFxoYFqZlHCvsUXGjyJmLQSnXToYhOSA==" - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" - } + "css-tree": "1.0.0-alpha.37" } }, "cssom": { @@ -4144,14 +4420,31 @@ } }, "csstype": { - "version": "2.6.6", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-2.6.6.tgz", - "integrity": "sha512-RpFbQGUE74iyPgvr46U9t1xoQBM8T4BL8SxrN66Le2xYAPSaDJJKeztV3awugusb3g3G9iL8StmkBBXhcbbXhg==" + "version": "2.6.8", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-2.6.8.tgz", + "integrity": "sha512-msVS9qTuMT5zwAGCVm4mxfrZ18BNc6Csd0oJAtiFMZ1FAx1CCvy2+5MDmYoix63LM/6NDbNtodCiGYGmFgO0dA==" + }, + "currently-unhandled": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz", + "integrity": "sha1-mI3zP+qxke95mmE2nddsF635V+o=", + "requires": { + "array-find-index": "^1.0.1" + } }, "cyclist": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/cyclist/-/cyclist-0.2.2.tgz", - "integrity": "sha1-GzN5LhHpFKL9bW7WRHRkRE5fpkA=" + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cyclist/-/cyclist-1.0.1.tgz", + "integrity": "sha1-WW6WmP0MgOEgOMK4LW6xs1tiJNk=" + }, + "d": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/d/-/d-1.0.1.tgz", + "integrity": "sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==", + "requires": { + "es5-ext": "^0.10.50", + "type": "^1.0.1" + } }, "d3": { "version": "3.5.17", @@ -4159,9 +4452,9 @@ "integrity": "sha1-vEZ0gAQ3iyGjYMn8fPUjF5B2L7g=" }, "d3-array": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-2.2.0.tgz", - "integrity": "sha512-eE0QmSh6xToqM3sxHiJYg/QFdNn52ZEgmFE8A8abU8GsHvsIOolqH8B70/8+VGAKm5MlwaExhqR3DLIjOJMLPA==" + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-2.4.0.tgz", + "integrity": "sha512-KQ41bAF2BMakf/HdKT865ALd4cgND6VcIztVQZUTt0+BH3RWy6ZYnHghVXf6NFjt2ritLr8H1T8LreAAlfiNcw==" }, "d3-axis": { "version": "1.0.12", @@ -4169,71 +4462,71 @@ "integrity": "sha512-ejINPfPSNdGFKEOAtnBtdkpr24c4d4jsei6Lg98mxf424ivoDP2956/5HDpIAtmHo85lqT4pruy+zEgvRUBqaQ==" }, "d3-color": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-1.2.8.tgz", - "integrity": "sha512-yeANXzP37PHk0DbSTMNPhnJD+Nn4G//O5E825bR6fAfHH43hobSBpgB9G9oWVl9+XgUaQ4yCnsX1H+l8DoaL9A==" + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-1.4.0.tgz", + "integrity": "sha512-TzNPeJy2+iEepfiL92LAAB7fvnp/dV2YwANPVHdDWmYMm23qIJBYww3qT8I8C1wXrmrg4UWs7BKc2tKIgyjzHg==" }, "d3-format": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/d3-format/-/d3-format-1.3.2.tgz", - "integrity": "sha512-Z18Dprj96ExragQ0DeGi+SYPQ7pPfRMtUXtsg/ChVIKNBCzjO8XYJvRTC1usblx52lqge56V5ect+frYTQc8WQ==" + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/d3-format/-/d3-format-1.4.3.tgz", + "integrity": "sha512-mm/nE2Y9HgGyjP+rKIekeITVgBtX97o1nrvHCWX8F/yBYyevUTvu9vb5pUnKwrcSw7o7GuwMOWjS9gFDs4O+uQ==" }, "d3-interpolate": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-1.3.2.tgz", - "integrity": "sha512-NlNKGopqaz9qM1PXh9gBF1KSCVh+jSFErrSlD/4hybwoNX/gt1d8CDbDW+3i+5UOHhjC6s6nMvRxcuoMVNgL2w==", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-1.4.0.tgz", + "integrity": "sha512-V9znK0zc3jOPV4VD2zZn0sDhZU3WAE2bmlxdIwwQPPzPjvyLkd8B3JUVdS1IDUFDkWZ72c9qnv1GK2ZagTZ8EA==", "requires": { "d3-color": "1" } }, "d3-path": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-1.0.7.tgz", - "integrity": "sha512-q0cW1RpvA5c5ma2rch62mX8AYaiLX0+bdaSM2wxSU9tXjU4DNvkx9qiUvjkuWCj3p22UO/hlPivujqMiR9PDzA==" + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-1.0.9.tgz", + "integrity": "sha512-VLaYcn81dtHVTjEHd8B+pbe9yHWpXKZUC87PzoFmsFrJqgFwDe/qxfp5MlfsfM1V5E/iVt0MmEbWQ7FVIXh/bg==" }, "d3-scale": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-3.0.0.tgz", - "integrity": "sha512-ktic5HBFlAZj2CN8CCl/p/JyY8bMQluN7+fA6ICE6yyoMOnSQAZ1Bb8/5LcNpNKMBMJge+5Vv4pWJhARYlQYFw==", + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-3.2.1.tgz", + "integrity": "sha512-huz5byJO/6MPpz6Q8d4lg7GgSpTjIZW/l+1MQkzKfu2u8P6hjaXaStOpmyrD6ymKoW87d2QVFCKvSjLwjzx/rA==", "requires": { - "d3-array": "^1.2.0 || 2", + "d3-array": "1.2.0 - 2", "d3-format": "1", - "d3-interpolate": "1", + "d3-interpolate": "^1.2.0", "d3-time": "1", "d3-time-format": "2" } }, "d3-scale-chromatic": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/d3-scale-chromatic/-/d3-scale-chromatic-1.3.3.tgz", - "integrity": "sha512-BWTipif1CimXcYfT02LKjAyItX5gKiwxuPRgr4xM58JwlLocWbjPLI7aMEjkcoOQXMkYsmNsvv3d2yl/OKuHHw==", + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/d3-scale-chromatic/-/d3-scale-chromatic-1.5.0.tgz", + "integrity": "sha512-ACcL46DYImpRFMBcpk9HhtIyC7bTBR4fNOPxwVSl0LfulDAwyiHyPOTqcDG1+t5d4P9W7t/2NAuWu59aKko/cg==", "requires": { "d3-color": "1", "d3-interpolate": "1" } }, "d3-selection": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/d3-selection/-/d3-selection-1.4.0.tgz", - "integrity": "sha512-EYVwBxQGEjLCKF2pJ4+yrErskDnz5v403qvAid96cNdCMr8rmCYfY5RGzWz24mdIbxmDf6/4EAH+K9xperD5jg==" + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/d3-selection/-/d3-selection-1.4.1.tgz", + "integrity": "sha512-BTIbRjv/m5rcVTfBs4AMBLKs4x8XaaLkwm28KWu9S2vKNqXkXt2AH2Qf0sdPZHjFxcWg/YL53zcqAz+3g4/7PA==" }, "d3-shape": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-1.3.5.tgz", - "integrity": "sha512-VKazVR3phgD+MUCldapHD7P9kcrvPcexeX/PkMJmkUov4JM8IxsSg1DvbYoYich9AtdTsa5nNk2++ImPiDiSxg==", + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-1.3.7.tgz", + "integrity": "sha512-EUkvKjqPFUAZyOlhY5gzCxCeI0Aep04LwIRpsZ/mLFelJiUfnK56jo5JMDSE7yyP2kLSb6LtF+S5chMk7uqPqw==", "requires": { "d3-path": "1" } }, "d3-time": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/d3-time/-/d3-time-1.0.11.tgz", - "integrity": "sha512-Z3wpvhPLW4vEScGeIMUckDW7+3hWKOQfAWg/U7PlWBnQmeKQ00gCUsTtWSYulrKNA7ta8hJ+xXc6MHrMuITwEw==" + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/d3-time/-/d3-time-1.1.0.tgz", + "integrity": "sha512-Xh0isrZ5rPYYdqhAVk8VLnMEidhz5aP7htAADH6MfzgmmicPkTo8LhkLxci61/lCB7n7UmE3bN0leRt+qvkLxA==" }, "d3-time-format": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/d3-time-format/-/d3-time-format-2.1.3.tgz", - "integrity": "sha512-6k0a2rZryzGm5Ihx+aFMuO1GgelgIz+7HhB4PH4OEndD5q2zGn1mDfRdNrulspOfR6JXkb2sThhDK41CSK85QA==", + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/d3-time-format/-/d3-time-format-2.2.3.tgz", + "integrity": "sha512-RAHNnD8+XvC4Zc4d2A56Uw0yJoM7bsvOlJR33bclxq399Rak/b9bhvu/InjxdWhPtkgU53JJcleJTGkNRnN6IA==", "requires": { "d3-time": "1" } @@ -4262,9 +4555,9 @@ }, "dependencies": { "whatwg-url": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-7.0.0.tgz", - "integrity": "sha512-37GeVSIJ3kn1JgKyjiYNmSLP1yzbpb29jdmwBSgkD9h40/hyrR/OifpVUndji3tmwGgD8qpw7iQu3RSbCrBpsQ==", + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-7.1.0.tgz", + "integrity": "sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==", "requires": { "lodash.sortby": "^4.7.0", "tr46": "^1.0.1", @@ -4273,11 +4566,6 @@ } } }, - "date-now": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/date-now/-/date-now-0.1.4.tgz", - "integrity": "sha1-6vQ5/U1ISK105cx9vvIAZyueNFs=" - }, "debug": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", @@ -4306,9 +4594,17 @@ } }, "deep-equal": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.0.1.tgz", - "integrity": "sha1-9dJgKStmDghO/0zbyfCK0yR0SLU=" + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.1.1.tgz", + "integrity": "sha512-yd9c5AdiqVcR+JjcwUQb9DkhJc8ngNr0MahEBGvDiJw8puWab2yZlh+nkasOnZP+EGTAP6rRp2JzJhJZzvNF8g==", + "requires": { + "is-arguments": "^1.0.4", + "is-date-object": "^1.0.1", + "is-regex": "^1.0.4", + "object-is": "^1.0.1", + "object-keys": "^1.1.1", + "regexp.prototype.flags": "^1.2.0" + } }, "deep-is": { "version": "0.1.3", @@ -4375,16 +4671,17 @@ } }, "del": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/del/-/del-3.0.0.tgz", - "integrity": "sha1-U+z2mf/LyzljdpGrE7rxYIGXZuU=", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/del/-/del-4.1.1.tgz", + "integrity": "sha512-QwGuEUouP2kVwQenAsOof5Fv8K9t3D8Ca8NxcXKrIpEHjTXK5J2nXLdP+ALI1cgv8wj7KuwBhTwBkOZSJKM5XQ==", "requires": { + "@types/glob": "^7.1.1", "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" + "is-path-cwd": "^2.0.0", + "is-path-in-cwd": "^2.0.0", + "p-map": "^2.0.0", + "pify": "^4.0.1", + "rimraf": "^2.6.3" }, "dependencies": { "globby": { @@ -4405,6 +4702,16 @@ "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=" } } + }, + "p-map": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-2.1.0.tgz", + "integrity": "sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==" + }, + "pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==" } } }, @@ -4413,15 +4720,20 @@ "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" }, + "delegates": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", + "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=" + }, "depd": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=" }, "des.js": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.0.tgz", - "integrity": "sha1-wHTS4qpqipoH29YfmhXCzYPsjsw=", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.1.tgz", + "integrity": "sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA==", "requires": { "inherits": "^2.0.1", "minimalistic-assert": "^1.0.0" @@ -4432,6 +4744,11 @@ "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" }, + "detect-libc": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", + "integrity": "sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=" + }, "detect-newline": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-2.1.0.tgz", @@ -4467,9 +4784,9 @@ } }, "diff-sequences": { - "version": "24.3.0", - "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-24.3.0.tgz", - "integrity": "sha512-xLqpez+Zj9GKSnPWS0WZw1igGocZ+uua8+y+5dDNTT934N3QuY1sp2LkHzwiaYQGz60hMq0pjAshdeXm5VUOEw==" + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-24.9.0.tgz", + "integrity": "sha512-Dj6Wk3tWyTE+Fo1rW8v0Xhwk80um6yFYKbuAxc9c3EZxIHFDYwbi34Uk42u1CdnIiVorvt4RmlSDjIPyzGC2ew==" }, "diffie-hellman": { "version": "5.0.3", @@ -4491,15 +4808,15 @@ } }, "dnd-core": { - "version": "9.3.2", - "resolved": "https://registry.npmjs.org/dnd-core/-/dnd-core-9.3.2.tgz", - "integrity": "sha512-cc6aAFmLDYdXguC+YbKB+SCsXlNd+LS/+T22M4OpmehWI3wBqXBik3o+myjr19ie3K11S3ATTiwir7b0s3TAhw==", + "version": "9.5.1", + "resolved": "https://registry.npmjs.org/dnd-core/-/dnd-core-9.5.1.tgz", + "integrity": "sha512-/yEWFF2jg51yyB8uA2UbvBr9Qis0Oo/4p9cqHLEKZdxzHHVSPfq0a/ool8NG6dIS6Q4uN+oKGObY0rNWiopJDA==", "requires": { "@types/asap": "^2.0.0", "@types/invariant": "^2.2.30", "asap": "^2.0.6", "invariant": "^2.2.4", - "redux": "^4.0.1" + "redux": "^4.0.4" } }, "dns-equal": { @@ -4533,9 +4850,9 @@ } }, "dom-align": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/dom-align/-/dom-align-1.9.0.tgz", - "integrity": "sha512-HvPfXISxoU7dKrbqS4vIFa1hx88wD7VdKaZ7sHWeow8y76tuzsxXkiPGbeilemLXrTd9cWbPqR4MOl4y3dkcXA==" + "version": "1.10.4", + "resolved": "https://registry.npmjs.org/dom-align/-/dom-align-1.10.4.tgz", + "integrity": "sha512-wytDzaru67AmqFOY4B9GUb/hrwWagezoYYK97D/vpK+ezg+cnuZO0Q2gltUPa7KfNmIqfRIYVCF8UhRDEHAmgQ==" }, "dom-converter": { "version": "0.2.0", @@ -4546,20 +4863,28 @@ } }, "dom-helpers": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-3.4.0.tgz", - "integrity": "sha512-LnuPJ+dwqKDIyotW1VzmOZ5TONUN7CwkCR5hrgawTUbkBGYdeoNLZo6nNfGkCrjtE1nXXaj7iMMpDa8/d9WoIA==", + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-5.1.3.tgz", + "integrity": "sha512-nZD1OtwfWGRBWlpANxacBEZrEuLa16o1nh7YopFWeoF68Zt8GGEmzHu6Xv4F3XaFIC+YXtTLrzgqKxFgLEe4jw==", "requires": { - "@babel/runtime": "^7.1.2" + "@babel/runtime": "^7.6.3", + "csstype": "^2.6.7" } }, "dom-serializer": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.1.1.tgz", - "integrity": "sha512-l0IU0pPzLWSHBcieZbpOKgkIn3ts3vAh7ZuFyXNwJxJXk/c4Gwj9xaTJwIDVQCXawWD0qb3IzMGH5rglQaO0XA==", + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.2.2.tgz", + "integrity": "sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==", "requires": { - "domelementtype": "^1.3.0", - "entities": "^1.1.1" + "domelementtype": "^2.0.1", + "entities": "^2.0.0" + }, + "dependencies": { + "domelementtype": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.0.1.tgz", + "integrity": "sha512-5HOHUDsYZWV8FGWN0Njbr/Rn7f/eWSQi1v7+HsUVwXgn8nWWlL64zKDkS0n8ZmQ3mlWOMuXOnR+7Nx/5tMO5AQ==" + } } }, "domain-browser": { @@ -4606,14 +4931,14 @@ } }, "dotenv": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-6.2.0.tgz", - "integrity": "sha512-HygQCKUBSFl8wKQZBSemMywRWcEDNidvNbjGVyZu3nbZ8qq9ubiPoGLMdRDpfSrpkkm9BXYFkpKxxFX38o/76w==" + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-8.2.0.tgz", + "integrity": "sha512-8sJ78ElpbDJBHNeBzUbUVLsqKdccaa/BXF1uPTw3GrvQTBgrQrtObr2mUrE38vzYd8cEv+m/JBfDLioYcfXoaw==" }, "dotenv-expand": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-4.2.0.tgz", - "integrity": "sha1-3vHxyl1gWdJKdm5YeULCEQbOEnU=" + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-5.1.0.tgz", + "integrity": "sha512-YXQl1DSa4/PQyRfgrv6aoNjhasp/p4qs9FjJ4q4cQk+8m4r6k4ZSiEyytKG8f8W9gi8WsQtIObNmKd+tMzNTmA==" }, "duplexer": { "version": "0.1.1", @@ -4646,14 +4971,14 @@ "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" }, "electron-to-chromium": { - "version": "1.3.199", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.199.tgz", - "integrity": "sha512-gachlDdHSK47s0N2e58GH9HMC6Z4ip0SfmYUa5iEbE50AKaOUXysaJnXMfKj0xB245jWbYcyFSH+th3rqsF8hA==" + "version": "1.3.332", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.332.tgz", + "integrity": "sha512-AP2HkLhfSOIxP7gDjlyZ4ywGWIcxRMZoU9+JriuVkQe2pSLDdWBsE6+eI6BQOqun1dohLrUTOPHsQLLhhFA7Eg==" }, "elliptic": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.0.tgz", - "integrity": "sha512-eFOJTMyCYb7xtE/caJ6JJu+bhi67WCYNbkGSknu20pmM8Ke/bqOfdnZWxyoGN26JgfxTbXrsCkEw4KheCT/KGg==", + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.2.tgz", + "integrity": "sha512-f4x70okzZbIQl/NSRLkI/+tteV/9WqL98zx+SQ69KbXxmVrmjwsNUPn/gYJJ0sHvEak24cZgHIPegRePAtA/xw==", "requires": { "bn.js": "^4.4.0", "brorand": "^1.0.1", @@ -4665,9 +4990,9 @@ } }, "emoji-regex": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", - "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==" + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" }, "emojis-list": { "version": "2.1.0", @@ -4688,27 +5013,38 @@ } }, "end-of-stream": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.1.tgz", - "integrity": "sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q==", + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", "requires": { "once": "^1.4.0" } }, "enhanced-resolve": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.1.0.tgz", - "integrity": "sha512-F/7vkyTtyc/llOIn8oWclcB25KdRaiPBpZYDgJHgh/UHtpgT2p2eldQgtQnLtUvfMKPKxbRaQM/hHkvLHt1Vng==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.1.1.tgz", + "integrity": "sha512-98p2zE+rL7/g/DzMHMTF4zZlCgeVdJ7yr6xzEpJRYwFYrGi9ANdn5DnJURg6RpBkyk60XYDnWIv51VfIhfNGuA==", "requires": { "graceful-fs": "^4.1.2", - "memory-fs": "^0.4.0", + "memory-fs": "^0.5.0", "tapable": "^1.0.0" + }, + "dependencies": { + "memory-fs": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.5.0.tgz", + "integrity": "sha512-jA0rdU5KoQMC0e6ppoNRtpp6vjFq6+NY7r8hywnC7V+1Xj/MtHwGIbB1QaK/dunyjWteJzmkpd7ooeWg10T7GA==", + "requires": { + "errno": "^0.1.3", + "readable-stream": "^2.0.1" + } + } } }, "entities": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz", - "integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==" + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.0.0.tgz", + "integrity": "sha512-D9f7V0JSRwIxlRI2mjMqufDrRDnx8p+eEOz7aUM9SuvF8gsBzra0/6tbjl1m8eQHrZlYj6PxqE00hZ1SAIKPLw==" }, "errno": { "version": "0.1.7", @@ -4727,33 +5063,67 @@ } }, "es-abstract": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.13.0.tgz", - "integrity": "sha512-vDZfg/ykNxQVwup/8E1BZhVzFfBxs9NqMzGcvIJrqg5k2/5Za2bWo40dK2J1pgLngZ7c+Shh8lwYtLGyrwPutg==", + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.0.tgz", + "integrity": "sha512-yYkE07YF+6SIBmg1MsJ9dlub5L48Ek7X0qz+c/CPCHS9EBXfESorzng4cJQjJW5/pB6vDF41u7F8vUhLVDqIug==", "requires": { - "es-to-primitive": "^1.2.0", + "es-to-primitive": "^1.2.1", "function-bind": "^1.1.1", "has": "^1.0.3", - "is-callable": "^1.1.4", - "is-regex": "^1.0.4", - "object-keys": "^1.0.12" + "has-symbols": "^1.0.1", + "is-callable": "^1.1.5", + "is-regex": "^1.0.5", + "object-inspect": "^1.7.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.0", + "string.prototype.trimleft": "^2.1.1", + "string.prototype.trimright": "^2.1.1" } }, "es-to-primitive": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.0.tgz", - "integrity": "sha512-qZryBOJjV//LaxLTV6UC//WewneB3LcXOL9NP++ozKVXsIIIpm/2c13UDiD9Jp2eThsecw9m3jPqDwTyobcdbg==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", "requires": { "is-callable": "^1.1.4", "is-date-object": "^1.0.1", "is-symbol": "^1.0.2" } }, + "es5-ext": { + "version": "0.10.53", + "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.53.tgz", + "integrity": "sha512-Xs2Stw6NiNHWypzRTY1MtaG/uJlwCk8kH81920ma8mvN8Xq1gsfhZvpkImLQArw8AHnv8MT2I45J3c0R8slE+Q==", + "requires": { + "es6-iterator": "~2.0.3", + "es6-symbol": "~3.1.3", + "next-tick": "~1.0.0" + } + }, + "es6-iterator": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", + "integrity": "sha1-p96IkUGgWpSwhUQDstCg+/qY87c=", + "requires": { + "d": "1", + "es5-ext": "^0.10.35", + "es6-symbol": "^3.1.1" + } + }, "es6-promise": { "version": "4.2.8", "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.8.tgz", "integrity": "sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==" }, + "es6-symbol": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.3.tgz", + "integrity": "sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==", + "requires": { + "d": "^1.0.1", + "ext": "^1.1.2" + } + }, "escape-html": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", @@ -4765,9 +5135,9 @@ "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" }, "escodegen": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.11.1.tgz", - "integrity": "sha512-JwiqFD9KdGVVpeuRa68yU3zZnBEOcPs0nKW7wZzXky8Z7tffdYUHbe11bPCV5jYlK6DVdKLWLm0f5I/QlL0Kmw==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.12.1.tgz", + "integrity": "sha512-Q8t2YZ+0e0pc7NRVj3B4tSQ9rim1oi4Fh46k2xhJ2qOiEwhQfdjyEQddWdj7ZFaKmU+5104vn1qrcjEPWq+bgQ==", "requires": { "esprima": "^3.1.3", "estraverse": "^4.2.0", @@ -4784,84 +5154,93 @@ } }, "eslint": { - "version": "5.16.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-5.16.0.tgz", - "integrity": "sha512-S3Rz11i7c8AA5JPv7xAH+dOyq/Cu/VXHiHXBPOU1k/JAM5dXqQPt3qcrhpHSorXmrpu2g0gkIBVXAqCpzfoZIg==", + "version": "6.8.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-6.8.0.tgz", + "integrity": "sha512-K+Iayyo2LtyYhDSYwz5D5QdWw0hCacNzyq1Y821Xna2xSJj7cijoLLYmLxTQgcgZ9mC61nryMy9S7GRbYpI5Ig==", "requires": { "@babel/code-frame": "^7.0.0", - "ajv": "^6.9.1", + "ajv": "^6.10.0", "chalk": "^2.1.0", "cross-spawn": "^6.0.5", "debug": "^4.0.1", "doctrine": "^3.0.0", - "eslint-scope": "^4.0.3", - "eslint-utils": "^1.3.1", - "eslint-visitor-keys": "^1.0.0", - "espree": "^5.0.1", + "eslint-scope": "^5.0.0", + "eslint-utils": "^1.4.3", + "eslint-visitor-keys": "^1.1.0", + "espree": "^6.1.2", "esquery": "^1.0.1", "esutils": "^2.0.2", "file-entry-cache": "^5.0.1", "functional-red-black-tree": "^1.0.1", - "glob": "^7.1.2", - "globals": "^11.7.0", + "glob-parent": "^5.0.0", + "globals": "^12.1.0", "ignore": "^4.0.6", "import-fresh": "^3.0.0", "imurmurhash": "^0.1.4", - "inquirer": "^6.2.2", - "js-yaml": "^3.13.0", + "inquirer": "^7.0.0", + "is-glob": "^4.0.0", + "js-yaml": "^3.13.1", "json-stable-stringify-without-jsonify": "^1.0.1", "levn": "^0.3.0", - "lodash": "^4.17.11", + "lodash": "^4.17.14", "minimatch": "^3.0.4", "mkdirp": "^0.5.1", "natural-compare": "^1.4.0", - "optionator": "^0.8.2", - "path-is-inside": "^1.0.2", + "optionator": "^0.8.3", "progress": "^2.0.0", "regexpp": "^2.0.1", - "semver": "^5.5.1", - "strip-ansi": "^4.0.0", - "strip-json-comments": "^2.0.1", + "semver": "^6.1.2", + "strip-ansi": "^5.2.0", + "strip-json-comments": "^3.0.1", "table": "^5.2.3", - "text-table": "^0.2.0" + "text-table": "^0.2.0", + "v8-compile-cache": "^2.0.3" }, "dependencies": { + "globals": { + "version": "12.3.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-12.3.0.tgz", + "integrity": "sha512-wAfjdLgFsPZsklLJvOBUBmzYE8/CwhEqSBEMRXA3qxIiNtyqvjYurAtIfDh6chlEPUfmTY3MnZh5Hfh4q0UlIw==", + "requires": { + "type-fest": "^0.8.1" + } + }, "import-fresh": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.1.0.tgz", - "integrity": "sha512-PpuksHKGt8rXfWEr9m9EHIpgyyaltBy8+eF6GJM0QCAxMgxCfucMF3mjecK2QsJr0amJW7gTqh5/wht0z2UhEQ==", + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.2.1.tgz", + "integrity": "sha512-6e1q1cnWP2RXD9/keSkxHScg508CdXqXWgWBaETNhyuBFz+kUZlKboh+ISK+bU++DmbHimVBrOz/zzPe0sZ3sQ==", "requires": { "parent-module": "^1.0.0", "resolve-from": "^4.0.0" } }, + "regexpp": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-2.0.1.tgz", + "integrity": "sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw==" + }, "resolve-from": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==" - }, - "semver": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz", - "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==" } } }, "eslint-config-react-app": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/eslint-config-react-app/-/eslint-config-react-app-4.0.1.tgz", - "integrity": "sha512-ZsaoXUIGsK8FCi/x4lT2bZR5mMkL/Kgj+Lnw690rbvvUr/uiwgFiD8FcfAhkCycm7Xte6O5lYz4EqMx2vX7jgw==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/eslint-config-react-app/-/eslint-config-react-app-5.1.0.tgz", + "integrity": "sha512-hBaxisHC6HXRVvxX+/t1n8mOdmCVIKgkXsf2WoUkJi7upHJTwYTsdCmx01QPOjKNT34QMQQ9sL0tVBlbiMFjxA==", "requires": { - "confusing-browser-globals": "^1.0.7" + "confusing-browser-globals": "^1.0.9" } }, "eslint-import-resolver-node": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.2.tgz", - "integrity": "sha512-sfmTqJfPSizWu4aymbPr4Iidp5yKm8yDkHp+Ir3YiTHiiDfxh69mOUsmiqW6RZ9zRXFaF64GtYmN7e+8GHBv6Q==", + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.3.tgz", + "integrity": "sha512-b8crLDo0M5RSe5YG8Pu2DYBj71tSB6OvXkfzwbJU2w7y8P4/yo0MyF8jU26IEuEuHF2K5/gcAJE3LhQGqBBbVg==", "requires": { "debug": "^2.6.9", - "resolve": "^1.5.0" + "resolve": "^1.13.1" }, "dependencies": { "debug": { @@ -4876,27 +5255,35 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "resolve": { + "version": "1.14.2", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.14.2.tgz", + "integrity": "sha512-EjlOBLBO1kxsUxsKjLt7TAECyKW6fOh1VRkykQkKGzcBbjjPIxBqGh0jf7GJ3k/f5mxMqW3htMD3WdTUVtW8HQ==", + "requires": { + "path-parse": "^1.0.6" + } } } }, "eslint-loader": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/eslint-loader/-/eslint-loader-2.1.2.tgz", - "integrity": "sha512-rA9XiXEOilLYPOIInvVH5S/hYfyTPyxag6DZhoQOduM+3TkghAEQ3VcFO8VnX4J4qg/UIBzp72aOf/xvYmpmsg==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/eslint-loader/-/eslint-loader-3.0.2.tgz", + "integrity": "sha512-S5VnD+UpVY1PyYRqeBd/4pgsmkvSokbHqTXAQMpvCyRr3XN2tvSLo9spm2nEpqQqh9dezw3os/0zWihLeOg2Rw==", "requires": { - "loader-fs-cache": "^1.0.0", - "loader-utils": "^1.0.2", - "object-assign": "^4.0.1", - "object-hash": "^1.1.4", - "rimraf": "^2.6.1" + "fs-extra": "^8.1.0", + "loader-fs-cache": "^1.0.2", + "loader-utils": "^1.2.3", + "object-hash": "^1.3.1", + "schema-utils": "^2.2.0" } }, "eslint-module-utils": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.4.1.tgz", - "integrity": "sha512-H6DOj+ejw7Tesdgbfs4jeS4YMFrT8uI8xwd1gtQqXssaR0EQ26L+2O/w6wkYFy2MymON0fTwHmXBvvfLNZVZEw==", + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.5.2.tgz", + "integrity": "sha512-LGScZ/JSlqGKiT8OC+cYRxseMjyqt6QO54nl281CK93unD89ijSeRV6An8Ci/2nvWVKe8K/Tqdm75RQoIOCr+Q==", "requires": { - "debug": "^2.6.8", + "debug": "^2.6.9", "pkg-dir": "^2.0.0" }, "dependencies": { @@ -4962,28 +5349,29 @@ } }, "eslint-plugin-flowtype": { - "version": "2.50.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-flowtype/-/eslint-plugin-flowtype-2.50.1.tgz", - "integrity": "sha512-9kRxF9hfM/O6WGZcZPszOVPd2W0TLHBtceulLTsGfwMPtiCCLnCW0ssRiOOiXyqrCA20pm1iXdXm7gQeN306zQ==", + "version": "3.13.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-flowtype/-/eslint-plugin-flowtype-3.13.0.tgz", + "integrity": "sha512-bhewp36P+t7cEV0b6OdmoRWJCBYRiHFlqPZAG1oS3SF+Y0LQkeDvFSM4oxoxvczD1OdONCXMlJfQFiWLcV9urw==", "requires": { - "lodash": "^4.17.10" + "lodash": "^4.17.15" } }, "eslint-plugin-import": { - "version": "2.16.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.16.0.tgz", - "integrity": "sha512-z6oqWlf1x5GkHIFgrSvtmudnqM6Q60KM4KvpWi5ubonMjycLjndvd5+8VAZIsTlHC03djdgJuyKG6XO577px6A==", + "version": "2.18.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.18.2.tgz", + "integrity": "sha512-5ohpsHAiUBRNaBWAF08izwUGlbrJoJJ+W9/TBwsGoR1MnlgfwMIKrFeSjWbt6moabiXW9xNvtFz+97KHRfI4HQ==", "requires": { + "array-includes": "^3.0.3", "contains-path": "^0.1.0", "debug": "^2.6.9", "doctrine": "1.5.0", "eslint-import-resolver-node": "^0.3.2", - "eslint-module-utils": "^2.3.0", + "eslint-module-utils": "^2.4.0", "has": "^1.0.3", - "lodash": "^4.17.11", "minimatch": "^3.0.4", + "object.values": "^1.1.0", "read-pkg-up": "^2.0.0", - "resolve": "^1.9.0" + "resolve": "^1.11.0" }, "dependencies": { "debug": { @@ -5100,10 +5488,11 @@ } }, "eslint-plugin-jsx-a11y": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.2.1.tgz", - "integrity": "sha512-cjN2ObWrRz0TTw7vEcGQrx+YltMvZoOEx4hWU8eEERDnBIU00OTq7Vr+jA7DFKxiwLNv4tTh5Pq2GUNEa8b6+w==", + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.2.3.tgz", + "integrity": "sha512-CawzfGt9w83tyuVekn0GDPU9ytYtxyxyFZ3aSWROmnRRFQFT2BiPJd7jvRdzNDi6oLWaS2asMeYSNMjWTV4eNg==", "requires": { + "@babel/runtime": "^7.4.5", "aria-query": "^3.0.0", "array-includes": "^3.0.3", "ast-types-flow": "^0.0.7", @@ -5111,21 +5500,30 @@ "damerau-levenshtein": "^1.0.4", "emoji-regex": "^7.0.2", "has": "^1.0.3", - "jsx-ast-utils": "^2.0.1" + "jsx-ast-utils": "^2.2.1" + }, + "dependencies": { + "emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==" + } } }, "eslint-plugin-react": { - "version": "7.12.4", - "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.12.4.tgz", - "integrity": "sha512-1puHJkXJY+oS1t467MjbqjvX53uQ05HXwjqDgdbGBqf5j9eeydI54G3KwiJmWciQ0HTBacIKw2jgwSBSH3yfgQ==", + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.16.0.tgz", + "integrity": "sha512-GacBAATewhhptbK3/vTP09CbFrgUJmBSaaRcWdbQLFvUZy9yVcQxigBNHGPU/KE2AyHpzj3AWXpxoMTsIDiHug==", "requires": { "array-includes": "^3.0.3", "doctrine": "^2.1.0", "has": "^1.0.3", - "jsx-ast-utils": "^2.0.1", + "jsx-ast-utils": "^2.2.1", + "object.entries": "^1.1.0", "object.fromentries": "^2.0.0", - "prop-types": "^15.6.2", - "resolve": "^1.9.0" + "object.values": "^1.1.0", + "prop-types": "^15.7.2", + "resolve": "^1.12.0" }, "dependencies": { "doctrine": { @@ -5139,14 +5537,14 @@ } }, "eslint-plugin-react-hooks": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-1.6.1.tgz", - "integrity": "sha512-wHhmGJyVuijnYIJXZJHDUF2WM+rJYTjulUTqF9k61d3BTk8etydz+M4dXUVH7M76ZRS85rqBTCx0Es/lLsrjnA==" + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-1.7.0.tgz", + "integrity": "sha512-iXTCFcOmlWvw4+TOE8CLWj6yX1GwzT0Y6cUfHHZqWnSk144VmVIRcVGtUAzrLES7C798lmvnt02C7rxaOX1HNA==" }, "eslint-scope": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.3.tgz", - "integrity": "sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.0.0.tgz", + "integrity": "sha512-oYrhJW7S0bxAFDvWqzvMPRm6pcgcnWc4QnofCAqRTRfQC0JcwenzGglTtsLyIuuWFfkqDG9vz67cnttSd53djw==", "requires": { "esrecurse": "^4.1.0", "estraverse": "^4.1.1" @@ -5158,28 +5556,21 @@ "integrity": "sha512-fbBN5W2xdY45KulGXmLHZ3c3FHfVYmKg0IrAKGOkT/464PQsx2UeIzfz1RmEci+KLm1bBaAzZAh8+/E+XAeZ8Q==", "requires": { "eslint-visitor-keys": "^1.1.0" - }, - "dependencies": { - "eslint-visitor-keys": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.1.0.tgz", - "integrity": "sha512-8y9YjtM1JBJU/A9Kc+SbaOV4y29sSWckBwMHa+FGtVj5gN/sbnKDf6xJUl+8g7FAij9LVaP8C24DUiH/f/2Z9A==" - } } }, "eslint-visitor-keys": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz", - "integrity": "sha512-qzm/XxIbxm/FHyH341ZrbnMUpe+5Bocte9xkmFMzPMjRaZMcXww+MpBptFvtU+79L362nqiLhekCxCxDPaUMBQ==" + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.1.0.tgz", + "integrity": "sha512-8y9YjtM1JBJU/A9Kc+SbaOV4y29sSWckBwMHa+FGtVj5gN/sbnKDf6xJUl+8g7FAij9LVaP8C24DUiH/f/2Z9A==" }, "espree": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-5.0.1.tgz", - "integrity": "sha512-qWAZcWh4XE/RwzLJejfcofscgMc9CamR6Tn1+XRXNzrvUSSbiAjGOI/fggztjIi7y9VLPqnICMIPiGyr8JaZ0A==", + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/espree/-/espree-6.1.2.tgz", + "integrity": "sha512-2iUPuuPP+yW1PZaMSDM9eyVf8D5P0Hi8h83YtZ5bPc/zHYjII5khoixIUTMO794NOY8F/ThF1Bo8ncZILarUTA==", "requires": { - "acorn": "^6.0.7", - "acorn-jsx": "^5.0.0", - "eslint-visitor-keys": "^1.0.0" + "acorn": "^7.1.0", + "acorn-jsx": "^5.1.0", + "eslint-visitor-keys": "^1.1.0" } }, "esprima": { @@ -5204,14 +5595,14 @@ } }, "estraverse": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz", - "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=" + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==" }, "esutils": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", - "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=" + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==" }, "etag": { "version": "1.8.1", @@ -5219,14 +5610,14 @@ "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=" }, "eventemitter3": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-3.1.2.tgz", - "integrity": "sha512-tvtQIeLVHjDkJYnzf2dgVMxfuSGJeM/7UCG17TT4EumTfNtF+0nebF/4zWOIkCreAbtNqhGEboB6BWrwqNaw4Q==" + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.0.tgz", + "integrity": "sha512-qerSRB0p+UDEssxTtm6EDKcE7W4OaoisfIMl4CngyEhjpYglocpNg6UEqCvemdGhosAsg4sO2dXJOdyBifPGCg==" }, "events": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/events/-/events-3.0.0.tgz", - "integrity": "sha512-Dc381HFWJzEOhQ+d8pkNon++bk9h6cdAoAj4iE6Q4y6xgTzySWXlKn05/TVNpjnfRqi/X0EpJEJohPjNI3zpVA==" + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.1.0.tgz", + "integrity": "sha512-Rv+u8MLHNOdMjTAFeT3nCjHn2aGlx435FP/sDHNaRhDEMwyI/aB22Kj2qIN8R0cw3z28psEQLYwxVKLsKrMgWg==" }, "eventsource": { "version": "1.0.7", @@ -5246,9 +5637,9 @@ } }, "exec-sh": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/exec-sh/-/exec-sh-0.3.2.tgz", - "integrity": "sha512-9sLAvzhI5nc8TpuQUh4ahMdCrWT00wPWz7j47/emR5+2qEfoZP5zzUXvx+vdx+H6ohhnsYC31iX04QLYJK8zTg==" + "version": "0.3.4", + "resolved": "https://registry.npmjs.org/exec-sh/-/exec-sh-0.3.4.tgz", + "integrity": "sha512-sEFIkc61v75sWeOe72qyrqg2Qg0OuLESziUDk/O/z2qgS15y2gWVFrI6f2Qn/qw/0/NCfCEsmNA4zOjkwEZT1A==" }, "execa": { "version": "1.0.0", @@ -5315,16 +5706,16 @@ } }, "expect": { - "version": "24.8.0", - "resolved": "https://registry.npmjs.org/expect/-/expect-24.8.0.tgz", - "integrity": "sha512-/zYvP8iMDrzaaxHVa724eJBCKqSHmO0FA7EDkBiRHxg6OipmMn1fN+C8T9L9K8yr7UONkOifu6+LLH+z76CnaA==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/expect/-/expect-24.9.0.tgz", + "integrity": "sha512-wvVAx8XIol3Z5m9zvZXiyZOQ+sRJqNTIm6sGjdWlaZIeupQGO3WbYI+15D/AmEwZywL6wtJkbAbJtzkOfBuR0Q==", "requires": { - "@jest/types": "^24.8.0", + "@jest/types": "^24.9.0", "ansi-styles": "^3.2.0", - "jest-get-type": "^24.8.0", - "jest-matcher-utils": "^24.8.0", - "jest-message-util": "^24.8.0", - "jest-regex-util": "^24.3.0" + "jest-get-type": "^24.9.0", + "jest-matcher-utils": "^24.9.0", + "jest-message-util": "^24.9.0", + "jest-regex-util": "^24.9.0" } }, "express": { @@ -5394,6 +5785,21 @@ } } }, + "ext": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/ext/-/ext-1.4.0.tgz", + "integrity": "sha512-Key5NIsUxdqKg3vIsdw9dSuXpPCQ297y6wBjL30edxwPgt2E44WcWBZey/ZvUc6sERLTxKdyCu4gZFmUbk1Q7A==", + "requires": { + "type": "^2.0.0" + }, + "dependencies": { + "type": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/type/-/type-2.0.0.tgz", + "integrity": "sha512-KBt58xCHry4Cejnc2ISQAF7QY+ORngsWfxezO68+12hKV6lQY8P/psIkcbjeHWn7MqcgciWJyCCevFMJdIXpow==" + } + } + }, "extend": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", @@ -5513,12 +5919,33 @@ "is-glob": "^4.0.0", "merge2": "^1.2.3", "micromatch": "^3.1.10" + }, + "dependencies": { + "glob-parent": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", + "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", + "requires": { + "is-glob": "^3.1.0", + "path-dirname": "^1.0.0" + }, + "dependencies": { + "is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "requires": { + "is-extglob": "^2.1.0" + } + } + } + } } }, "fast-json-stable-stringify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", - "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=" + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" }, "fast-levenshtein": { "version": "2.0.6", @@ -5531,24 +5958,24 @@ "integrity": "sha512-xdmw296PCL01tMOXx9mdJSmWY29jQgxyuZdq0rEHMu+Tpe1eOEtCycoG6chzlcrWsNgpZP7oL8RiQr7+G6Bl6g==" }, "fast-safe-stringify": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.0.6.tgz", - "integrity": "sha512-q8BZ89jjc+mz08rSxROs8VsrBBcn1SIw1kq9NjolL509tkABRk9io01RAjSaEv1Xb2uFLt8VtRiZbGp5H8iDtg==" + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.0.7.tgz", + "integrity": "sha512-Utm6CdzT+6xsDk2m8S6uL8VHxNwI6Jub+e9NYTcAms28T84pTa25GJQV9j0CY0N1rM8hK4x6grpF2BQf+2qwVA==" }, "faye-websocket": { - "version": "0.11.3", - "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.3.tgz", - "integrity": "sha512-D2y4bovYpzziGgbHYtGCMjlJM36vAl/y+xUyn1C+FVx8szd1E+86KwVw6XvYSzOP8iMpm1X0I4xJD+QtUb36OA==", + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.10.0.tgz", + "integrity": "sha1-TkkvjQTftviQA1B/btvy1QHnxvQ=", "requires": { "websocket-driver": ">=0.5.1" } }, "fb-watchman": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.0.tgz", - "integrity": "sha1-VOmr99+i8mzZsWNsWIwa/AXeXVg=", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.1.tgz", + "integrity": "sha512-DkPJKQeY6kKwmuMretBhr7G6Vodr7bFwDYTXIkfG1gjvNpaxBTQV3PbXg6bR1c1UP4jPOX0jHUbbHANL9vRjVg==", "requires": { - "bser": "^2.0.0" + "bser": "2.1.1" } }, "fbemitter": { @@ -5580,15 +6007,23 @@ } } }, + "fibers": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/fibers/-/fibers-4.0.2.tgz", + "integrity": "sha512-FhICi1K4WZh9D6NC18fh2ODF3EWy1z0gzIdV9P7+s2pRjfRBnCkMDJ6x3bV1DkVymKH8HGrQa/FNOBjYvnJ/tQ==", + "requires": { + "detect-libc": "^1.0.3" + } + }, "figgy-pudding": { "version": "3.5.1", "resolved": "https://registry.npmjs.org/figgy-pudding/-/figgy-pudding-3.5.1.tgz", "integrity": "sha512-vNKxJHTEKNThjfrdJwHc7brvM6eVevuO5nTj6ez8ZQ1qbXTvGthucRF7S4vf2cr71QVnT70V34v0S1DyQsti0w==" }, "figures": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", - "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-3.1.0.tgz", + "integrity": "sha512-ravh8VRXqHuMvZt/d8GblBeqDMkdJMBdv/2KntFH+ra5MXkO7nxNKpzQ3n6QD/2da1kH0aWmNISdvhM7gl2gVg==", "requires": { "escape-string-regexp": "^1.0.5" } @@ -5602,12 +6037,12 @@ } }, "file-loader": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-3.0.1.tgz", - "integrity": "sha512-4sNIOXgtH/9WZq4NvlfU3Opn5ynUsqBwSLyM+I7UOwdGigTBYfVVQEwe/msZNX/j4pCJTIM14Fsw66Svo1oVrw==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-4.3.0.tgz", + "integrity": "sha512-aKrYPYjF1yG3oX0kWRrqrSMfgftm7oJW5M+m4owoldH5C51C0RkIwB++JbRvEW3IU6/ZG5n8UvEcdgwOt2UOWA==", "requires": { - "loader-utils": "^1.0.2", - "schema-utils": "^1.0.0" + "loader-utils": "^1.2.3", + "schema-utils": "^2.5.0" } }, "file-saver": { @@ -5615,6 +6050,12 @@ "resolved": "https://registry.npmjs.org/file-saver/-/file-saver-2.0.2.tgz", "integrity": "sha512-Wz3c3XQ5xroCxd1G8b7yL0Ehkf0TC9oYC6buPFkNnU9EnaPlifeAFCyCh+iewXTyFRcg0a6j3J7FmJsIhlhBdw==" }, + "file-uri-to-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", + "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==", + "optional": true + }, "filesize": { "version": "3.6.1", "resolved": "https://registry.npmjs.org/filesize/-/filesize-3.6.1.tgz", @@ -5704,9 +6145,9 @@ "integrity": "sha512-a1hQMktqW9Nmqr5aktAux3JMNqaucxGcjtjWnZLHX7yyPCmlSV3M54nGYbqT8K+0GhF3NBgmJCc3ma+WOgX8Jg==" }, "flatten": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/flatten/-/flatten-1.0.2.tgz", - "integrity": "sha1-2uRqnXj74lKSJYzB54CkHZXAN4I=" + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/flatten/-/flatten-1.0.3.tgz", + "integrity": "sha512-dVsPA/UwQ8+2uoFe5GHtiBMu48dWLTdsuEd7CKGlZlD78r1TTWBvDuFaFGKCo/ZfEr95Uk56vZoX86OsHkUeIg==" }, "flush-write-stream": { "version": "1.1.1", @@ -5727,11 +6168,11 @@ } }, "follow-redirects": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.7.0.tgz", - "integrity": "sha512-m/pZQy4Gj287eNy94nivy5wchN3Kp+Q5WgUPNy5lJSZ3sgkVKSYV/ZChMAQVIgx1SqfZ2zBZtPA2YlXIWxxJOQ==", + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.9.0.tgz", + "integrity": "sha512-CRcPzsSIbXyVDl0QI01muNDu69S8trU4jArW9LpOt2WtC6LyUJetcIrmfHsRBx7/Jb6GHJUiuqyYxPooFfNt6A==", "requires": { - "debug": "^3.2.6" + "debug": "^3.0.0" }, "dependencies": { "debug": { @@ -5763,9 +6204,9 @@ "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=" }, "fork-ts-checker-webpack-plugin": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-1.1.1.tgz", - "integrity": "sha512-gqWAEMLlae/oeVnN6RWCAhesOJMswAN1MaKNqhhjXHV5O0/rTUjWI4UbgQHdlrVbCnb+xLotXmJbBlC66QmpFw==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-3.1.0.tgz", + "integrity": "sha512-6OkRfjuNMNqb14f01xokcWcKV5Ekknc2FvziNpcTYru+kxIYFA2MtuuBI19MHThZnjSBhoi35Dcq+I0oUkFjmQ==", "requires": { "babel-code-frame": "^6.22.0", "chalk": "^2.4.1", @@ -5778,9 +6219,9 @@ }, "dependencies": { "semver": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz", - "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==" + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" } } }, @@ -5841,15 +6282,23 @@ } }, "fs-extra": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", - "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", + "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", "requires": { - "graceful-fs": "^4.1.2", + "graceful-fs": "^4.2.0", "jsonfile": "^4.0.0", "universalify": "^0.1.0" } }, + "fs-minipass": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.0.0.tgz", + "integrity": "sha512-40Qz+LFXmd9tzYVnnBmZvFfvAADfUA14TXPK1s7IfElJTIZ97rA8w4Kin7Wt5JBrC3ShnnFJO/5vPjPEeJIq9A==", + "requires": { + "minipass": "^3.0.0" + } + }, "fs-write-stream-atomic": { "version": "1.0.10", "resolved": "https://registry.npmjs.org/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz", @@ -5867,11 +6316,22 @@ "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" }, "fsevents": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.0.6.tgz", - "integrity": "sha512-vfmKZp3XPM36DNF0qhW+Cdxk7xm7gTEHY1clv1Xq1arwRQuKZgAhw+NZNWbJBtuaNxzNXwhfdPYRrvIbjfS33A==", + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.2.tgz", + "integrity": "sha512-R4wDiBwZ0KzpgOWetKDug1FZcYhqYnUYKtfZYt4mD5SBz76q0KR4Q9o7GIPamsVPGmW3EYPPJ0dOOjvx32ldZA==", "optional": true }, + "fstream": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.12.tgz", + "integrity": "sha512-WvJ193OHa0GHPEL+AycEJgxvBEwyfRkN1vhjca23OaPVMCaLCXTd5qAu82AjTcgP1UJmytkOKb63Ypde7raDIg==", + "requires": { + "graceful-fs": "^4.1.2", + "inherits": "~2.0.0", + "mkdirp": ">=0.5 0", + "rimraf": "2" + } + }, "fullscreen": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/fullscreen/-/fullscreen-1.1.1.tgz", @@ -5890,15 +6350,71 @@ "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=" }, + "gauge": { + "version": "2.7.4", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", + "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", + "requires": { + "aproba": "^1.0.3", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.0", + "object-assign": "^4.1.0", + "signal-exit": "^3.0.0", + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wide-align": "^1.1.0" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "requires": { + "ansi-regex": "^2.0.0" + } + } + } + }, "gaugeJS": { "version": "1.3.7", "resolved": "https://registry.npmjs.org/gaugeJS/-/gaugeJS-1.3.7.tgz", "integrity": "sha512-te8IYMlgZOSbDmiecCwI+IOEUvEhYbniC+2qicPz7Bco5XV05QMtUr8ILqPuR+txtPC5855dZZojUHi0r15oWQ==" }, + "gaze": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/gaze/-/gaze-1.1.3.tgz", + "integrity": "sha512-BRdNm8hbWzFzWHERTrejLqwHDfS4GibPoq5wjTPIoJHoBtKGPg3xAFfxmM+9ztbXelxcf2hwQcaz1PtmFeue8g==", + "requires": { + "globule": "^1.0.0" + } + }, "get-caller-file": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz", - "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==" + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==" }, "get-func-name": { "version": "2.0.0", @@ -5907,9 +6423,14 @@ "dev": true }, "get-own-enumerable-property-symbols": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.0.tgz", - "integrity": "sha512-CIJYJC4GGF06TakLg8z4GQKvDsx9EMspVxOYih7LerEL/WosUnFIww45CGfxfeKHqlg3twgUrYRT1O3WQqjGCg==" + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.2.tgz", + "integrity": "sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g==" + }, + "get-stdin": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz", + "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=" }, "get-stream": { "version": "4.1.0", @@ -5933,9 +6454,9 @@ } }, "glob": { - "version": "7.1.4", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.4.tgz", - "integrity": "sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A==", + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", "requires": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -5946,22 +6467,11 @@ } }, "glob-parent": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", - "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.0.tgz", + "integrity": "sha512-qjtRgnIVmOfnKUE3NJAQEdk+lKrxfw8t5ke7SXtfMTHcjsBfOfWXCQfdb30zfDoZQ2IRSIiidmjtbHZPZ++Ihw==", "requires": { - "is-glob": "^3.1.0", - "path-dirname": "^1.0.0" - }, - "dependencies": { - "is-glob": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", - "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", - "requires": { - "is-extglob": "^2.1.0" - } - } + "is-glob": "^4.0.1" } }, "glob-to-regexp": { @@ -6025,10 +6535,20 @@ } } }, + "globule": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/globule/-/globule-1.3.0.tgz", + "integrity": "sha512-YlD4kdMqRCQHrhVdonet4TdRtv1/sZKepvoxNT4Nrhrp5HI8XFfc8kFlGlBn2myBo80aGp8Eft259mbcUJhgSg==", + "requires": { + "glob": "~7.1.1", + "lodash": "~4.17.10", + "minimatch": "~3.0.2" + } + }, "graceful-fs": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.0.tgz", - "integrity": "sha512-jpSvDPV4Cq/bgtpndIWbI5hmYxhQGHPC4d4cqBPb4DLniCfhJokdXhwhaDuLBGLQdvvRum/UiX6ECVIPvDXqdg==" + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.3.tgz", + "integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==" }, "growly": { "version": "1.3.0", @@ -6041,12 +6561,19 @@ "integrity": "sha512-zGEOVKFM5sVPPrYs7J5/hYEw2Pof8KCyOwyhG8sAF26mCAeUFAcYPu1mwB7hhpIP29zOIBaDqwuHdLp0jvZXjw==" }, "gzip-size": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-5.0.0.tgz", - "integrity": "sha512-5iI7omclyqrnWw4XbXAmGhPsABkSIDQonv2K0h61lybgofWa6iZyvrI3r2zsJH4P8Nb64fFVzlvfhs0g7BBxAA==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-5.1.1.tgz", + "integrity": "sha512-FNHi6mmoHvs1mxZAds4PpdCS6QG8B4C1krxJsMutgxl5t3+GlRTzzI3NEkifXx2pVsOvJdOGSmIgDhQ55FwdPA==", "requires": { "duplexer": "^0.1.1", - "pify": "^3.0.0" + "pify": "^4.0.1" + }, + "dependencies": { + "pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==" + } } }, "handle-thing": { @@ -6055,9 +6582,9 @@ "integrity": "sha512-d4sze1JNC454Wdo2fkuyzCr6aHcbL6PGGuFAz0Li/NcOm1tCHGnWDRmJP85dh9IhQErTc2svWFEX5xHIOo//kQ==" }, "handlebars": { - "version": "4.5.1", - "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.5.1.tgz", - "integrity": "sha512-C29UoFzHe9yM61lOsIlCE5/mQVGrnIOrOq7maQl76L7tYPCgC1og0Ajt6uWnX4ZTxBPnjw+CUvawphwCfJgUnA==", + "version": "4.7.1", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.1.tgz", + "integrity": "sha512-2dd6soo60cwKNJ90VewNLIzdZPR/E2YhszOTgHpN9V0YuwZk7x33/iZoIBnASwDFVHMY7iJ6NPL8d9f/DWYCTA==", "requires": { "neo-async": "^2.6.0", "optimist": "^0.6.1", @@ -6113,9 +6640,14 @@ "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" }, "has-symbols": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.0.tgz", - "integrity": "sha1-uhqPGvKg/DllD1yFA2dwQSIGO0Q=" + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz", + "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==" + }, + "has-unicode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", + "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=" }, "has-value": { "version": "1.0.0", @@ -6175,16 +6707,16 @@ "integrity": "sha512-l9sfDFsuqtOqKDsQdqrMRk0U85RZc0RtOR9yPI7mRVOa4FsR/BVnZ0shmQRM96Ji99kYZP/7hn1cedc1+ApsTQ==" }, "history": { - "version": "4.9.0", - "resolved": "https://registry.npmjs.org/history/-/history-4.9.0.tgz", - "integrity": "sha512-H2DkjCjXf0Op9OAr6nJ56fcRkTSNrUiv41vNJ6IswJjif6wlpZK0BTfFbi7qK9dXLSYZxkq5lBsj3vUjlYBYZA==", + "version": "4.10.1", + "resolved": "https://registry.npmjs.org/history/-/history-4.10.1.tgz", + "integrity": "sha512-36nwAD620w12kuzPAsyINPWJqlNbij+hpK1k9XRloDtym8mxzGYl2c17LnV6IAGB2Dmg4tEa7G7DlawS0+qjew==", "requires": { "@babel/runtime": "^7.1.2", "loose-envify": "^1.2.0", - "resolve-pathname": "^2.2.0", + "resolve-pathname": "^3.0.0", "tiny-invariant": "^1.0.2", "tiny-warning": "^1.0.0", - "value-equal": "^0.4.0" + "value-equal": "^1.0.1" } }, "hmac-drbg": { @@ -6206,9 +6738,9 @@ } }, "hosted-git-info": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.7.1.tgz", - "integrity": "sha512-7T/BxH19zbcCTa8XkMlbK5lTo1WtgkFi3GvdWEyNuc4Vex7/9Dqbnpsf4JMydcfj9HCg4zUWFTL3Za6lapg5/w==" + "version": "2.8.5", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.5.tgz", + "integrity": "sha512-kssjab8CvdXfcXMXVcvsXum4Hwdq9XGtRD3TteMEvEbq0LXyiNQr6AprqKqfeaDXze7SxWvRxdpwE6ku7ikLkg==" }, "hpack.js": { "version": "2.1.6", @@ -6249,6 +6781,11 @@ "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-1.2.1.tgz", "integrity": "sha1-DfKTUfByEWNRXfueVUPl9u7VFi8=" }, + "html-escaper": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.0.tgz", + "integrity": "sha512-a4u9BeERWGu/S8JiWEAQcdrg9v4QArtP9keViQjGMdff20fBdd8waotXaNmODqBe6uZ3Nafi7K/ho4gCQHV3Ig==" + }, "html-minifier": { "version": "3.5.21", "resolved": "https://registry.npmjs.org/html-minifier/-/html-minifier-3.5.21.tgz", @@ -6312,6 +6849,11 @@ "readable-stream": "^3.1.1" }, "dependencies": { + "entities": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz", + "integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==" + }, "readable-stream": { "version": "3.4.0", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.4.0.tgz", @@ -6354,11 +6896,11 @@ "integrity": "sha1-ksnBN0w1CF912zWexWzCV8u5P6Q=" }, "http-proxy": { - "version": "1.17.0", - "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.17.0.tgz", - "integrity": "sha512-Taqn+3nNvYRfJ3bGvKfBSRwy1v6eePlm3oc/aWVxZp57DQr5Eq3xhKJi7Z4hZpS8PC3H4qI+Yly5EmFacGuA/g==", + "version": "1.18.0", + "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.0.tgz", + "integrity": "sha512-84I2iJM/n1d4Hdgc6y2+qY5mDaz2PUVjlg9znE9byl+q0uC3DeByqBGReQu5tpLK0TAqTIXScRUV+dg7+bUPpQ==", "requires": { - "eventemitter3": "^3.0.0", + "eventemitter3": "^4.0.0", "follow-redirects": "^1.0.0", "requires-port": "^1.0.0" } @@ -6389,11 +6931,6 @@ "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=" }, - "humps": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/humps/-/humps-2.0.1.tgz", - "integrity": "sha1-3QLqYIG9BWjcXQcxhEY5V7qe+ao=" - }, "iconv-lite": { "version": "0.4.24", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", @@ -6402,11 +6939,6 @@ "safer-buffer": ">= 2.1.2 < 3" } }, - "icss-replace-symbols": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/icss-replace-symbols/-/icss-replace-symbols-1.1.0.tgz", - "integrity": "sha1-Bupvg2ead0njhs/h/oEq5dsiPe0=" - }, "icss-utils": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-4.1.1.tgz", @@ -6492,11 +7024,26 @@ "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=" }, + "in-publish": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/in-publish/-/in-publish-2.0.0.tgz", + "integrity": "sha1-4g/146KvwmkDILbcVSaCqcf631E=" + }, + "indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==" + }, "indexes-of": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/indexes-of/-/indexes-of-1.0.1.tgz", "integrity": "sha1-8w9xbI4r00bHtn0985FVZqfAVgc=" }, + "infer-owner": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz", + "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==" + }, "inflight": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", @@ -6517,38 +7064,23 @@ "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==" }, "inquirer": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-6.5.0.tgz", - "integrity": "sha512-scfHejeG/lVZSpvCXpsB4j/wQNPM5JC8kiElOI0OUTwmc1RTpXr4H32/HOlQHcZiYl2z2VElwuCVDRG8vFmbnA==", + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-7.0.3.tgz", + "integrity": "sha512-+OiOVeVydu4hnCGLCSX+wedovR/Yzskv9BFqUNNKq9uU2qg7LCcCo3R86S2E7WLo0y/x2pnEZfZe1CoYnORUAw==", "requires": { - "ansi-escapes": "^3.2.0", + "ansi-escapes": "^4.2.1", "chalk": "^2.4.2", - "cli-cursor": "^2.1.0", + "cli-cursor": "^3.1.0", "cli-width": "^2.0.0", "external-editor": "^3.0.3", - "figures": "^2.0.0", - "lodash": "^4.17.12", - "mute-stream": "0.0.7", + "figures": "^3.0.0", + "lodash": "^4.17.15", + "mute-stream": "0.0.8", "run-async": "^2.2.0", - "rxjs": "^6.4.0", - "string-width": "^2.1.0", + "rxjs": "^6.5.3", + "string-width": "^4.1.0", "strip-ansi": "^5.1.0", "through": "^2.3.6" - }, - "dependencies": { - "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==" - }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "requires": { - "ansi-regex": "^4.1.0" - } - } } }, "internal-ip": { @@ -6601,6 +7133,11 @@ "kind-of": "^3.0.2" } }, + "is-arguments": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.0.4.tgz", + "integrity": "sha512-xPh0Rmt8NE65sNzvyUmWgI1tz3mKq74lGA0mL8LYZcoIzKOzDh6HmrYm3d18k60nHerC8A9Km8kYu87zfSFnLA==" + }, "is-arrayish": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", @@ -6620,9 +7157,9 @@ "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" }, "is-callable": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.4.tgz", - "integrity": "sha512-r5p9sxJjYnArLjObpjA4xu5EKI3CuKHkJXMhT7kwbpUyIFD1n5PMAsoPvWnvtZiNz7LjkYDRZhd7FlI0eMijEA==" + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.5.tgz", + "integrity": "sha512-ESKv5sMCJB2jnHTWZ3O5itG+O128Hsus4K4Qh1h2/cgn2vbgnLSVqfV46AeJA9D5EeeLa9w81KUXMtn34zhX+Q==" }, "is-ci": { "version": "2.0.0", @@ -6654,9 +7191,9 @@ } }, "is-date-object": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.1.tgz", - "integrity": "sha1-mqIOtq7rv/d/vTPnTKAbM1gdOhY=" + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.2.tgz", + "integrity": "sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g==" }, "is-descriptor": { "version": "0.1.6", @@ -6690,10 +7227,18 @@ "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=" }, + "is-finite": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz", + "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=", + "requires": { + "number-is-nan": "^1.0.0" + } + }, "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" }, "is-generator-fn": { "version": "2.1.0", @@ -6722,26 +7267,31 @@ "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=" }, "is-path-cwd": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-1.0.0.tgz", - "integrity": "sha1-0iXsIxMuie3Tj9p2dHLmLmXxEG0=" + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-2.2.0.tgz", + "integrity": "sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==" }, "is-path-in-cwd": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-1.0.1.tgz", - "integrity": "sha512-FjV1RTW48E7CWM7eE/J2NJvAEEVektecDBVBE5Hh3nM1Jd0kvhHtX68Pr3xsDf857xt3Y4AkwVULK1Vku62aaQ==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-2.1.0.tgz", + "integrity": "sha512-rNocXHgipO+rvnP6dk3zI20RpOtrAM/kzbB258Uw5BWr3TpXi861yzjo16Dn4hUox07iw5AyeMLHWsujkjzvRQ==", "requires": { - "is-path-inside": "^1.0.0" + "is-path-inside": "^2.1.0" } }, "is-path-inside": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.1.tgz", - "integrity": "sha1-jvW33lBDej/cprToZe96pVy0gDY=", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-2.1.0.tgz", + "integrity": "sha512-wiyhTzfDWsvwAW53OBWF5zuvaOGlZ6PwYxAbPVDhpm+gM09xKQGjBq/8uYN12aDvMxnAnq3dxTyoSoRNmg5YFg==", "requires": { - "path-is-inside": "^1.0.1" + "path-is-inside": "^1.0.2" } }, + "is-plain-obj": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", + "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=" + }, "is-plain-object": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", @@ -6756,11 +7306,11 @@ "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=" }, "is-regex": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.4.tgz", - "integrity": "sha1-VRdIm1RwkbCTDglWVM7SXul+lJE=", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.5.tgz", + "integrity": "sha512-vlKW17SNq44owv5AQR3Cq0bQPEb8+kF3UKZ2fiZNOWtztYE5i0CzCZxFDwO58qAOWtxdBRVO/V5Qin1wjCqFYQ==", "requires": { - "has": "^1.0.1" + "has": "^1.0.3" } }, "is-regexp": { @@ -6774,15 +7324,20 @@ "integrity": "sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg==" }, "is-root": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-root/-/is-root-2.0.0.tgz", - "integrity": "sha512-F/pJIk8QD6OX5DNhRB7hWamLsUilmkDGho48KbgZ6xg/lmAZXHxzXQ91jzB3yRSw5kdQGGGc4yz8HYhTYIMWPg==" + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-root/-/is-root-2.1.0.tgz", + "integrity": "sha512-AGOriNp96vNBd3HtU+RzFEc75FfR5ymiYv8E553I71SCeXBiMsVDUtdio1OEFvrPyLIQ9tVR5RxXIFe5PUFjMg==" }, "is-stream": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=" }, + "is-string": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.5.tgz", + "integrity": "sha512-buY6VNRjhQMiF1qWDouloZlQbRhDPCebwxSjxMjxgemYT46YMd2NR0/H+fBhEfWX4A/w9TBJ+ol+okqJKFE6vQ==" + }, "is-svg": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-svg/-/is-svg-3.0.0.tgz", @@ -6792,11 +7347,11 @@ } }, "is-symbol": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.2.tgz", - "integrity": "sha512-HS8bZ9ox60yCJLH9snBpIwv9pYUAkcuLhSA1oero1UB5y9aiQpRA8y2ex945AOtCZL1lJDeIk3G5LthswI46Lw==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.3.tgz", + "integrity": "sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ==", "requires": { - "has-symbols": "^1.0.0" + "has-symbols": "^1.0.1" } }, "is-typedarray": { @@ -6804,6 +7359,11 @@ "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" }, + "is-utf8": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", + "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=" + }, "is-windows": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", @@ -6895,133 +7455,119 @@ } }, "istanbul-reports": { - "version": "2.2.6", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-2.2.6.tgz", - "integrity": "sha512-SKi4rnMyLBKe0Jy2uUdx28h8oG7ph2PPuQPvIAh31d+Ci+lSiEu4C+h3oBPuJ9+mPKhOyW0M8gY4U5NM1WLeXA==", + "version": "2.2.7", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-2.2.7.tgz", + "integrity": "sha512-uu1F/L1o5Y6LzPVSVZXNOoD/KXpJue9aeLRd0sM9uMXfZvzomB0WxVamWb5ue8kA2vVWEmW7EG+A5n3f1kqHKg==", "requires": { - "handlebars": "^4.1.2" + "html-escaper": "^2.0.0" } }, "jest": { - "version": "24.7.1", - "resolved": "https://registry.npmjs.org/jest/-/jest-24.7.1.tgz", - "integrity": "sha512-AbvRar5r++izmqo5gdbAjTeA6uNRGoNRuj5vHB0OnDXo2DXWZJVuaObiGgtlvhKb+cWy2oYbQSfxv7Q7GjnAtA==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest/-/jest-24.9.0.tgz", + "integrity": "sha512-YvkBL1Zm7d2B1+h5fHEOdyjCG+sGMz4f8D86/0HiqJ6MB4MnDc8FgP5vdWsGnemOQro7lnYo8UakZ3+5A0jxGw==", "requires": { "import-local": "^2.0.0", - "jest-cli": "^24.7.1" + "jest-cli": "^24.9.0" }, "dependencies": { "jest-cli": { - "version": "24.8.0", - "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-24.8.0.tgz", - "integrity": "sha512-+p6J00jSMPQ116ZLlHJJvdf8wbjNbZdeSX9ptfHX06/MSNaXmKihQzx5vQcw0q2G6JsdVkUIdWbOWtSnaYs3yA==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-24.9.0.tgz", + "integrity": "sha512-+VLRKyitT3BWoMeSUIHRxV/2g8y9gw91Jh5z2UmXZzkZKpbC08CSehVxgHUwTpy+HwGcns/tqafQDJW7imYvGg==", "requires": { - "@jest/core": "^24.8.0", - "@jest/test-result": "^24.8.0", - "@jest/types": "^24.8.0", + "@jest/core": "^24.9.0", + "@jest/test-result": "^24.9.0", + "@jest/types": "^24.9.0", "chalk": "^2.0.1", "exit": "^0.1.2", "import-local": "^2.0.0", "is-ci": "^2.0.0", - "jest-config": "^24.8.0", - "jest-util": "^24.8.0", - "jest-validate": "^24.8.0", + "jest-config": "^24.9.0", + "jest-util": "^24.9.0", + "jest-validate": "^24.9.0", "prompts": "^2.0.1", "realpath-native": "^1.1.0", - "yargs": "^12.0.2" + "yargs": "^13.3.0" } } } }, "jest-changed-files": { - "version": "24.8.0", - "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-24.8.0.tgz", - "integrity": "sha512-qgANC1Yrivsq+UrLXsvJefBKVoCsKB0Hv+mBb6NMjjZ90wwxCDmU3hsCXBya30cH+LnPYjwgcU65i6yJ5Nfuug==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-24.9.0.tgz", + "integrity": "sha512-6aTWpe2mHF0DhL28WjdkO8LyGjs3zItPET4bMSeXU6T3ub4FPMw+mcOcbdGXQOAfmLcxofD23/5Bl9Z4AkFwqg==", "requires": { - "@jest/types": "^24.8.0", + "@jest/types": "^24.9.0", "execa": "^1.0.0", "throat": "^4.0.0" } }, "jest-config": { - "version": "24.8.0", - "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-24.8.0.tgz", - "integrity": "sha512-Czl3Nn2uEzVGsOeaewGWoDPD8GStxCpAe0zOYs2x2l0fZAgPbCr3uwUkgNKV3LwE13VXythM946cd5rdGkkBZw==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-24.9.0.tgz", + "integrity": "sha512-RATtQJtVYQrp7fvWg6f5y3pEFj9I+H8sWw4aKxnDZ96mob5i5SD6ZEGWgMLXQ4LE8UurrjbdlLWdUeo+28QpfQ==", "requires": { "@babel/core": "^7.1.0", - "@jest/test-sequencer": "^24.8.0", - "@jest/types": "^24.8.0", - "babel-jest": "^24.8.0", + "@jest/test-sequencer": "^24.9.0", + "@jest/types": "^24.9.0", + "babel-jest": "^24.9.0", "chalk": "^2.0.1", "glob": "^7.1.1", - "jest-environment-jsdom": "^24.8.0", - "jest-environment-node": "^24.8.0", - "jest-get-type": "^24.8.0", - "jest-jasmine2": "^24.8.0", + "jest-environment-jsdom": "^24.9.0", + "jest-environment-node": "^24.9.0", + "jest-get-type": "^24.9.0", + "jest-jasmine2": "^24.9.0", "jest-regex-util": "^24.3.0", - "jest-resolve": "^24.8.0", - "jest-util": "^24.8.0", - "jest-validate": "^24.8.0", + "jest-resolve": "^24.9.0", + "jest-util": "^24.9.0", + "jest-validate": "^24.9.0", "micromatch": "^3.1.10", - "pretty-format": "^24.8.0", + "pretty-format": "^24.9.0", "realpath-native": "^1.1.0" - }, - "dependencies": { - "jest-resolve": { - "version": "24.8.0", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-24.8.0.tgz", - "integrity": "sha512-+hjSzi1PoRvnuOICoYd5V/KpIQmkAsfjFO71458hQ2Whi/yf1GDeBOFj8Gxw4LrApHsVJvn5fmjcPdmoUHaVKw==", - "requires": { - "@jest/types": "^24.8.0", - "browser-resolve": "^1.11.3", - "chalk": "^2.0.1", - "jest-pnp-resolver": "^1.2.1", - "realpath-native": "^1.1.0" - } - } } }, "jest-diff": { - "version": "24.8.0", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-24.8.0.tgz", - "integrity": "sha512-wxetCEl49zUpJ/bvUmIFjd/o52J+yWcoc5ZyPq4/W1LUKGEhRYDIbP1KcF6t+PvqNrGAFk4/JhtxDq/Nnzs66g==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-24.9.0.tgz", + "integrity": "sha512-qMfrTs8AdJE2iqrTp0hzh7kTd2PQWrsFyj9tORoKmu32xjPjeE4NyjVRDz8ybYwqS2ik8N4hsIpiVTyFeo2lBQ==", "requires": { "chalk": "^2.0.1", - "diff-sequences": "^24.3.0", - "jest-get-type": "^24.8.0", - "pretty-format": "^24.8.0" + "diff-sequences": "^24.9.0", + "jest-get-type": "^24.9.0", + "pretty-format": "^24.9.0" } }, "jest-docblock": { - "version": "24.3.0", - "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-24.3.0.tgz", - "integrity": "sha512-nlANmF9Yq1dufhFlKG9rasfQlrY7wINJbo3q01tu56Jv5eBU5jirylhF2O5ZBnLxzOVBGRDz/9NAwNyBtG4Nyg==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-24.9.0.tgz", + "integrity": "sha512-F1DjdpDMJMA1cN6He0FNYNZlo3yYmOtRUnktrT9Q37njYzC5WEaDdmbynIgy0L/IvXvvgsG8OsqhLPXTpfmZAA==", "requires": { "detect-newline": "^2.1.0" } }, "jest-each": { - "version": "24.8.0", - "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-24.8.0.tgz", - "integrity": "sha512-NrwK9gaL5+XgrgoCsd9svsoWdVkK4gnvyhcpzd6m487tXHqIdYeykgq3MKI1u4I+5Zf0tofr70at9dWJDeb+BA==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-24.9.0.tgz", + "integrity": "sha512-ONi0R4BvW45cw8s2Lrx8YgbeXL1oCQ/wIDwmsM3CqM/nlblNCPmnC3IPQlMbRFZu3wKdQ2U8BqM6lh3LJ5Bsog==", "requires": { - "@jest/types": "^24.8.0", + "@jest/types": "^24.9.0", "chalk": "^2.0.1", - "jest-get-type": "^24.8.0", - "jest-util": "^24.8.0", - "pretty-format": "^24.8.0" + "jest-get-type": "^24.9.0", + "jest-util": "^24.9.0", + "pretty-format": "^24.9.0" } }, "jest-environment-jsdom": { - "version": "24.8.0", - "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-24.8.0.tgz", - "integrity": "sha512-qbvgLmR7PpwjoFjM/sbuqHJt/NCkviuq9vus9NBn/76hhSidO+Z6Bn9tU8friecegbJL8gzZQEMZBQlFWDCwAQ==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-24.9.0.tgz", + "integrity": "sha512-Zv9FV9NBRzLuALXjvRijO2351DRQeLYXtpD4xNvfoVFw21IOKNhZAEUKcbiEtjTkm2GsJ3boMVgkaR7rN8qetA==", "requires": { - "@jest/environment": "^24.8.0", - "@jest/fake-timers": "^24.8.0", - "@jest/types": "^24.8.0", - "jest-mock": "^24.8.0", - "jest-util": "^24.8.0", + "@jest/environment": "^24.9.0", + "@jest/fake-timers": "^24.9.0", + "@jest/types": "^24.9.0", + "jest-mock": "^24.9.0", + "jest-util": "^24.9.0", "jsdom": "^11.5.1" } }, @@ -7035,6 +7581,11 @@ "jsdom": "^14.0.0" }, "dependencies": { + "acorn": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.0.tgz", + "integrity": "sha512-gac8OEcQ2Li1dxIEWGZzsp2BitJxwkwcOm0zHAJLcPJaVvm58FRnk6RkuLRpU1EujipU2ZFODv2P9DLMfnV8mw==" + }, "jsdom": { "version": "14.1.0", "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-14.1.0.tgz", @@ -7074,9 +7625,9 @@ "integrity": "sha512-fxNG2sQjHvlVAYmzBZS9YlDp6PTSSDwa98vkD4QgVDDCAo84z5X1t5XyJQ62ImdLXx5NdIIfihey6xpum9/gRQ==" }, "whatwg-url": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-7.0.0.tgz", - "integrity": "sha512-37GeVSIJ3kn1JgKyjiYNmSLP1yzbpb29jdmwBSgkD9h40/hyrR/OifpVUndji3tmwGgD8qpw7iQu3RSbCrBpsQ==", + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-7.1.0.tgz", + "integrity": "sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==", "requires": { "lodash.sortby": "^4.7.0", "tr46": "^1.0.1", @@ -7094,49 +7645,50 @@ } }, "jest-environment-node": { - "version": "24.8.0", - "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-24.8.0.tgz", - "integrity": "sha512-vIGUEScd1cdDgR6sqn2M08sJTRLQp6Dk/eIkCeO4PFHxZMOgy+uYLPMC4ix3PEfM5Au/x3uQ/5Tl0DpXXZsJ/Q==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-24.9.0.tgz", + "integrity": "sha512-6d4V2f4nxzIzwendo27Tr0aFm+IXWa0XEUnaH6nU0FMaozxovt+sfRvh4J47wL1OvF83I3SSTu0XK+i4Bqe7uA==", "requires": { - "@jest/environment": "^24.8.0", - "@jest/fake-timers": "^24.8.0", - "@jest/types": "^24.8.0", - "jest-mock": "^24.8.0", - "jest-util": "^24.8.0" + "@jest/environment": "^24.9.0", + "@jest/fake-timers": "^24.9.0", + "@jest/types": "^24.9.0", + "jest-mock": "^24.9.0", + "jest-util": "^24.9.0" } }, "jest-get-type": { - "version": "24.8.0", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-24.8.0.tgz", - "integrity": "sha512-RR4fo8jEmMD9zSz2nLbs2j0zvPpk/KCEz3a62jJWbd2ayNo0cb+KFRxPHVhE4ZmgGJEQp0fosmNz84IfqM8cMQ==" + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-24.9.0.tgz", + "integrity": "sha512-lUseMzAley4LhIcpSP9Jf+fTrQ4a1yHQwLNeeVa2cEmbCGeoZAtYPOIv8JaxLD/sUpKxetKGP+gsHl8f8TSj8Q==" }, "jest-haste-map": { - "version": "24.8.1", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-24.8.1.tgz", - "integrity": "sha512-SwaxMGVdAZk3ernAx2Uv2sorA7jm3Kx+lR0grp6rMmnY06Kn/urtKx1LPN2mGTea4fCT38impYT28FfcLUhX0g==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-24.9.0.tgz", + "integrity": "sha512-kfVFmsuWui2Sj1Rp1AJ4D9HqJwE4uwTlS/vO+eRUaMmd54BFpli2XhMQnPC2k4cHFVbB2Q2C+jtI1AGLgEnCjQ==", "requires": { - "@jest/types": "^24.8.0", + "@jest/types": "^24.9.0", "anymatch": "^2.0.0", "fb-watchman": "^2.0.0", "fsevents": "^1.2.7", "graceful-fs": "^4.1.15", "invariant": "^2.2.4", - "jest-serializer": "^24.4.0", - "jest-util": "^24.8.0", - "jest-worker": "^24.6.0", + "jest-serializer": "^24.9.0", + "jest-util": "^24.9.0", + "jest-worker": "^24.9.0", "micromatch": "^3.1.10", "sane": "^4.0.3", "walker": "^1.0.7" }, "dependencies": { "fsevents": { - "version": "1.2.9", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.9.tgz", - "integrity": "sha512-oeyj2H3EjjonWcFjD5NvZNE9Rqe4UW+nQBU2HNeKw0koVLEFIhtyETyAakeAM3de7Z/SW5kcA+fZUait9EApnw==", + "version": "1.2.11", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.11.tgz", + "integrity": "sha512-+ux3lx6peh0BpvY0JebGyZoiR4D+oYzdPZMKJwkZ+sFkNJzpL7tXc/wehS49gUAxg3tmMHPHZkA8JU2rhhgDHw==", "optional": true, "requires": { + "bindings": "^1.5.0", "nan": "^2.12.1", - "node-pre-gyp": "^0.12.0" + "node-pre-gyp": "*" }, "dependencies": { "abbrev": { @@ -7178,7 +7730,7 @@ } }, "chownr": { - "version": "1.1.1", + "version": "1.1.3", "bundled": true, "optional": true }, @@ -7203,7 +7755,7 @@ "optional": true }, "debug": { - "version": "4.1.1", + "version": "3.2.6", "bundled": true, "optional": true, "requires": { @@ -7226,11 +7778,11 @@ "optional": true }, "fs-minipass": { - "version": "1.2.5", + "version": "1.2.7", "bundled": true, "optional": true, "requires": { - "minipass": "^2.2.1" + "minipass": "^2.6.0" } }, "fs.realpath": { @@ -7254,7 +7806,7 @@ } }, "glob": { - "version": "7.1.3", + "version": "7.1.6", "bundled": true, "optional": true, "requires": { @@ -7280,7 +7832,7 @@ } }, "ignore-walk": { - "version": "3.0.1", + "version": "3.0.3", "bundled": true, "optional": true, "requires": { @@ -7297,7 +7849,7 @@ } }, "inherits": { - "version": "2.0.3", + "version": "2.0.4", "bundled": true, "optional": true }, @@ -7333,7 +7885,7 @@ "optional": true }, "minipass": { - "version": "2.3.5", + "version": "2.9.0", "bundled": true, "optional": true, "requires": { @@ -7342,11 +7894,11 @@ } }, "minizlib": { - "version": "1.2.1", + "version": "1.3.3", "bundled": true, "optional": true, "requires": { - "minipass": "^2.2.1" + "minipass": "^2.9.0" } }, "mkdirp": { @@ -7358,22 +7910,22 @@ } }, "ms": { - "version": "2.1.1", + "version": "2.1.2", "bundled": true, "optional": true }, "needle": { - "version": "2.3.0", + "version": "2.4.0", "bundled": true, "optional": true, "requires": { - "debug": "^4.1.0", + "debug": "^3.2.6", "iconv-lite": "^0.4.4", "sax": "^1.2.4" } }, "node-pre-gyp": { - "version": "0.12.0", + "version": "0.14.0", "bundled": true, "optional": true, "requires": { @@ -7386,7 +7938,7 @@ "rc": "^1.2.7", "rimraf": "^2.6.1", "semver": "^5.3.0", - "tar": "^4" + "tar": "^4.4.2" } }, "nopt": { @@ -7399,12 +7951,20 @@ } }, "npm-bundled": { - "version": "1.0.6", + "version": "1.1.1", + "bundled": true, + "optional": true, + "requires": { + "npm-normalize-package-bin": "^1.0.1" + } + }, + "npm-normalize-package-bin": { + "version": "1.0.1", "bundled": true, "optional": true }, "npm-packlist": { - "version": "1.4.1", + "version": "1.4.7", "bundled": true, "optional": true, "requires": { @@ -7466,7 +8026,7 @@ "optional": true }, "process-nextick-args": { - "version": "2.0.0", + "version": "2.0.1", "bundled": true, "optional": true }, @@ -7503,7 +8063,7 @@ } }, "rimraf": { - "version": "2.6.3", + "version": "2.7.1", "bundled": true, "optional": true, "requires": { @@ -7526,7 +8086,7 @@ "optional": true }, "semver": { - "version": "5.7.0", + "version": "5.7.1", "bundled": true, "optional": true }, @@ -7572,17 +8132,17 @@ "optional": true }, "tar": { - "version": "4.4.8", + "version": "4.4.13", "bundled": true, "optional": true, "requires": { "chownr": "^1.1.1", "fs-minipass": "^1.2.5", - "minipass": "^2.3.4", - "minizlib": "^1.1.1", + "minipass": "^2.8.6", + "minizlib": "^1.2.1", "mkdirp": "^0.5.0", "safe-buffer": "^5.1.2", - "yallist": "^3.0.2" + "yallist": "^3.0.3" } }, "util-deprecate": { @@ -7604,7 +8164,7 @@ "optional": true }, "yallist": { - "version": "3.0.3", + "version": "3.1.1", "bundled": true, "optional": true } @@ -7613,55 +8173,56 @@ } }, "jest-jasmine2": { - "version": "24.8.0", - "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-24.8.0.tgz", - "integrity": "sha512-cEky88npEE5LKd5jPpTdDCLvKkdyklnaRycBXL6GNmpxe41F0WN44+i7lpQKa/hcbXaQ+rc9RMaM4dsebrYong==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-24.9.0.tgz", + "integrity": "sha512-Cq7vkAgaYKp+PsX+2/JbTarrk0DmNhsEtqBXNwUHkdlbrTBLtMJINADf2mf5FkowNsq8evbPc07/qFO0AdKTzw==", "requires": { "@babel/traverse": "^7.1.0", - "@jest/environment": "^24.8.0", - "@jest/test-result": "^24.8.0", - "@jest/types": "^24.8.0", + "@jest/environment": "^24.9.0", + "@jest/test-result": "^24.9.0", + "@jest/types": "^24.9.0", "chalk": "^2.0.1", "co": "^4.6.0", - "expect": "^24.8.0", + "expect": "^24.9.0", "is-generator-fn": "^2.0.0", - "jest-each": "^24.8.0", - "jest-matcher-utils": "^24.8.0", - "jest-message-util": "^24.8.0", - "jest-runtime": "^24.8.0", - "jest-snapshot": "^24.8.0", - "jest-util": "^24.8.0", - "pretty-format": "^24.8.0", + "jest-each": "^24.9.0", + "jest-matcher-utils": "^24.9.0", + "jest-message-util": "^24.9.0", + "jest-runtime": "^24.9.0", + "jest-snapshot": "^24.9.0", + "jest-util": "^24.9.0", + "pretty-format": "^24.9.0", "throat": "^4.0.0" } }, "jest-leak-detector": { - "version": "24.8.0", - "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-24.8.0.tgz", - "integrity": "sha512-cG0yRSK8A831LN8lIHxI3AblB40uhv0z+SsQdW3GoMMVcK+sJwrIIyax5tu3eHHNJ8Fu6IMDpnLda2jhn2pD/g==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-24.9.0.tgz", + "integrity": "sha512-tYkFIDsiKTGwb2FG1w8hX9V0aUb2ot8zY/2nFg087dUageonw1zrLMP4W6zsRO59dPkTSKie+D4rhMuP9nRmrA==", "requires": { - "pretty-format": "^24.8.0" + "jest-get-type": "^24.9.0", + "pretty-format": "^24.9.0" } }, "jest-matcher-utils": { - "version": "24.8.0", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-24.8.0.tgz", - "integrity": "sha512-lex1yASY51FvUuHgm0GOVj7DCYEouWSlIYmCW7APSqB9v8mXmKSn5+sWVF0MhuASG0bnYY106/49JU1FZNl5hw==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-24.9.0.tgz", + "integrity": "sha512-OZz2IXsu6eaiMAwe67c1T+5tUAtQyQx27/EMEkbFAGiw52tB9em+uGbzpcgYVpA8wl0hlxKPZxrly4CXU/GjHA==", "requires": { "chalk": "^2.0.1", - "jest-diff": "^24.8.0", - "jest-get-type": "^24.8.0", - "pretty-format": "^24.8.0" + "jest-diff": "^24.9.0", + "jest-get-type": "^24.9.0", + "pretty-format": "^24.9.0" } }, "jest-message-util": { - "version": "24.8.0", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-24.8.0.tgz", - "integrity": "sha512-p2k71rf/b6ns8btdB0uVdljWo9h0ovpnEe05ZKWceQGfXYr4KkzgKo3PBi8wdnd9OtNh46VpNIJynUn/3MKm1g==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-24.9.0.tgz", + "integrity": "sha512-oCj8FiZ3U0hTP4aSui87P4L4jC37BtQwUMqk+zk/b11FR19BJDeZsZAvIHutWnmtw7r85UmR3CEWZ0HWU2mAlw==", "requires": { "@babel/code-frame": "^7.0.0", - "@jest/test-result": "^24.8.0", - "@jest/types": "^24.8.0", + "@jest/test-result": "^24.9.0", + "@jest/types": "^24.9.0", "@types/stack-utils": "^1.0.1", "chalk": "^2.0.1", "micromatch": "^3.1.10", @@ -7670,11 +8231,11 @@ } }, "jest-mock": { - "version": "24.8.0", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-24.8.0.tgz", - "integrity": "sha512-6kWugwjGjJw+ZkK4mDa0Df3sDlUTsV47MSrT0nGQ0RBWJbpODDQ8MHDVtGtUYBne3IwZUhtB7elxHspU79WH3A==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-24.9.0.tgz", + "integrity": "sha512-3BEYN5WbSq9wd+SyLDES7AHnjH9A/ROBwmz7l2y+ol+NtSFO8DYiEBzoO1CeFc9a8DYy10EO4dDFVv/wN3zl1w==", "requires": { - "@jest/types": "^24.8.0" + "@jest/types": "^24.9.0" } }, "jest-pnp-resolver": { @@ -7683,16 +8244,16 @@ "integrity": "sha512-pgFw2tm54fzgYvc/OHrnysABEObZCUNFnhjoRjaVOCN8NYc032/gVjPaHD4Aq6ApkSieWtfKAFQtmDKAmhupnQ==" }, "jest-regex-util": { - "version": "24.3.0", - "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-24.3.0.tgz", - "integrity": "sha512-tXQR1NEOyGlfylyEjg1ImtScwMq8Oh3iJbGTjN7p0J23EuVX1MA8rwU69K4sLbCmwzgCUbVkm0FkSF9TdzOhtg==" + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-24.9.0.tgz", + "integrity": "sha512-05Cmb6CuxaA+Ys6fjr3PhvV3bGQmO+2p2La4hFbU+W5uOc479f7FdLXUWXw4pYMAhhSZIuKHwSXSu6CsSBAXQA==" }, "jest-resolve": { - "version": "24.7.1", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-24.7.1.tgz", - "integrity": "sha512-Bgrc+/UUZpGJ4323sQyj85hV9d+ANyPNu6XfRDUcyFNX1QrZpSoM0kE4Mb2vZMAYTJZsBFzYe8X1UaOkOELSbw==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-24.9.0.tgz", + "integrity": "sha512-TaLeLVL1l08YFZAt3zaPtjiVvyy4oSA6CRe+0AFPPVX3Q/VI0giIWWoAvoS5L96vj9Dqxj4fB5p2qrHCmTU/MQ==", "requires": { - "@jest/types": "^24.7.0", + "@jest/types": "^24.9.0", "browser-resolve": "^1.11.3", "chalk": "^2.0.1", "jest-pnp-resolver": "^1.2.1", @@ -7700,152 +8261,106 @@ } }, "jest-resolve-dependencies": { - "version": "24.8.0", - "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-24.8.0.tgz", - "integrity": "sha512-hyK1qfIf/krV+fSNyhyJeq3elVMhK9Eijlwy+j5jqmZ9QsxwKBiP6qukQxaHtK8k6zql/KYWwCTQ+fDGTIJauw==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-24.9.0.tgz", + "integrity": "sha512-Fm7b6AlWnYhT0BXy4hXpactHIqER7erNgIsIozDXWl5dVm+k8XdGVe1oTg1JyaFnOxarMEbax3wyRJqGP2Pq+g==", "requires": { - "@jest/types": "^24.8.0", + "@jest/types": "^24.9.0", "jest-regex-util": "^24.3.0", - "jest-snapshot": "^24.8.0" + "jest-snapshot": "^24.9.0" } }, "jest-runner": { - "version": "24.8.0", - "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-24.8.0.tgz", - "integrity": "sha512-utFqC5BaA3JmznbissSs95X1ZF+d+4WuOWwpM9+Ak356YtMhHE/GXUondZdcyAAOTBEsRGAgH/0TwLzfI9h7ow==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-24.9.0.tgz", + "integrity": "sha512-KksJQyI3/0mhcfspnxxEOBueGrd5E4vV7ADQLT9ESaCzz02WnbdbKWIf5Mkaucoaj7obQckYPVX6JJhgUcoWWg==", "requires": { "@jest/console": "^24.7.1", - "@jest/environment": "^24.8.0", - "@jest/test-result": "^24.8.0", - "@jest/types": "^24.8.0", + "@jest/environment": "^24.9.0", + "@jest/test-result": "^24.9.0", + "@jest/types": "^24.9.0", "chalk": "^2.4.2", "exit": "^0.1.2", "graceful-fs": "^4.1.15", - "jest-config": "^24.8.0", + "jest-config": "^24.9.0", "jest-docblock": "^24.3.0", - "jest-haste-map": "^24.8.0", - "jest-jasmine2": "^24.8.0", - "jest-leak-detector": "^24.8.0", - "jest-message-util": "^24.8.0", - "jest-resolve": "^24.8.0", - "jest-runtime": "^24.8.0", - "jest-util": "^24.8.0", + "jest-haste-map": "^24.9.0", + "jest-jasmine2": "^24.9.0", + "jest-leak-detector": "^24.9.0", + "jest-message-util": "^24.9.0", + "jest-resolve": "^24.9.0", + "jest-runtime": "^24.9.0", + "jest-util": "^24.9.0", "jest-worker": "^24.6.0", "source-map-support": "^0.5.6", "throat": "^4.0.0" - }, - "dependencies": { - "jest-resolve": { - "version": "24.8.0", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-24.8.0.tgz", - "integrity": "sha512-+hjSzi1PoRvnuOICoYd5V/KpIQmkAsfjFO71458hQ2Whi/yf1GDeBOFj8Gxw4LrApHsVJvn5fmjcPdmoUHaVKw==", - "requires": { - "@jest/types": "^24.8.0", - "browser-resolve": "^1.11.3", - "chalk": "^2.0.1", - "jest-pnp-resolver": "^1.2.1", - "realpath-native": "^1.1.0" - } - } } }, "jest-runtime": { - "version": "24.8.0", - "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-24.8.0.tgz", - "integrity": "sha512-Mq0aIXhvO/3bX44ccT+czU1/57IgOMyy80oM0XR/nyD5zgBcesF84BPabZi39pJVA6UXw+fY2Q1N+4BiVUBWOA==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-24.9.0.tgz", + "integrity": "sha512-8oNqgnmF3v2J6PVRM2Jfuj8oX3syKmaynlDMMKQ4iyzbQzIG6th5ub/lM2bCMTmoTKM3ykcUYI2Pw9xwNtjMnw==", "requires": { "@jest/console": "^24.7.1", - "@jest/environment": "^24.8.0", + "@jest/environment": "^24.9.0", "@jest/source-map": "^24.3.0", - "@jest/transform": "^24.8.0", - "@jest/types": "^24.8.0", - "@types/yargs": "^12.0.2", + "@jest/transform": "^24.9.0", + "@jest/types": "^24.9.0", + "@types/yargs": "^13.0.0", "chalk": "^2.0.1", "exit": "^0.1.2", "glob": "^7.1.3", "graceful-fs": "^4.1.15", - "jest-config": "^24.8.0", - "jest-haste-map": "^24.8.0", - "jest-message-util": "^24.8.0", - "jest-mock": "^24.8.0", + "jest-config": "^24.9.0", + "jest-haste-map": "^24.9.0", + "jest-message-util": "^24.9.0", + "jest-mock": "^24.9.0", "jest-regex-util": "^24.3.0", - "jest-resolve": "^24.8.0", - "jest-snapshot": "^24.8.0", - "jest-util": "^24.8.0", - "jest-validate": "^24.8.0", + "jest-resolve": "^24.9.0", + "jest-snapshot": "^24.9.0", + "jest-util": "^24.9.0", + "jest-validate": "^24.9.0", "realpath-native": "^1.1.0", "slash": "^2.0.0", "strip-bom": "^3.0.0", - "yargs": "^12.0.2" - }, - "dependencies": { - "jest-resolve": { - "version": "24.8.0", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-24.8.0.tgz", - "integrity": "sha512-+hjSzi1PoRvnuOICoYd5V/KpIQmkAsfjFO71458hQ2Whi/yf1GDeBOFj8Gxw4LrApHsVJvn5fmjcPdmoUHaVKw==", - "requires": { - "@jest/types": "^24.8.0", - "browser-resolve": "^1.11.3", - "chalk": "^2.0.1", - "jest-pnp-resolver": "^1.2.1", - "realpath-native": "^1.1.0" - } - } + "yargs": "^13.3.0" } }, "jest-serializer": { - "version": "24.4.0", - "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-24.4.0.tgz", - "integrity": "sha512-k//0DtglVstc1fv+GY/VHDIjrtNjdYvYjMlbLUed4kxrE92sIUewOi5Hj3vrpB8CXfkJntRPDRjCrCvUhBdL8Q==" + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-24.9.0.tgz", + "integrity": "sha512-DxYipDr8OvfrKH3Kel6NdED3OXxjvxXZ1uIY2I9OFbGg+vUkkg7AGvi65qbhbWNPvDckXmzMPbK3u3HaDO49bQ==" }, "jest-snapshot": { - "version": "24.8.0", - "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-24.8.0.tgz", - "integrity": "sha512-5ehtWoc8oU9/cAPe6fez6QofVJLBKyqkY2+TlKTOf0VllBB/mqUNdARdcjlZrs9F1Cv+/HKoCS/BknT0+tmfPg==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-24.9.0.tgz", + "integrity": "sha512-uI/rszGSs73xCM0l+up7O7a40o90cnrk429LOiK3aeTvfC0HHmldbd81/B7Ix81KSFe1lwkbl7GnBGG4UfuDew==", "requires": { "@babel/types": "^7.0.0", - "@jest/types": "^24.8.0", + "@jest/types": "^24.9.0", "chalk": "^2.0.1", - "expect": "^24.8.0", - "jest-diff": "^24.8.0", - "jest-matcher-utils": "^24.8.0", - "jest-message-util": "^24.8.0", - "jest-resolve": "^24.8.0", + "expect": "^24.9.0", + "jest-diff": "^24.9.0", + "jest-get-type": "^24.9.0", + "jest-matcher-utils": "^24.9.0", + "jest-message-util": "^24.9.0", + "jest-resolve": "^24.9.0", "mkdirp": "^0.5.1", "natural-compare": "^1.4.0", - "pretty-format": "^24.8.0", - "semver": "^5.5.0" - }, - "dependencies": { - "jest-resolve": { - "version": "24.8.0", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-24.8.0.tgz", - "integrity": "sha512-+hjSzi1PoRvnuOICoYd5V/KpIQmkAsfjFO71458hQ2Whi/yf1GDeBOFj8Gxw4LrApHsVJvn5fmjcPdmoUHaVKw==", - "requires": { - "@jest/types": "^24.8.0", - "browser-resolve": "^1.11.3", - "chalk": "^2.0.1", - "jest-pnp-resolver": "^1.2.1", - "realpath-native": "^1.1.0" - } - }, - "semver": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz", - "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==" - } + "pretty-format": "^24.9.0", + "semver": "^6.2.0" } }, "jest-util": { - "version": "24.8.0", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-24.8.0.tgz", - "integrity": "sha512-DYZeE+XyAnbNt0BG1OQqKy/4GVLPtzwGx5tsnDrFcax36rVE3lTA5fbvgmbVPUZf9w77AJ8otqR4VBbfFJkUZA==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-24.9.0.tgz", + "integrity": "sha512-x+cZU8VRmOJxbA1K5oDBdxQmdq0OIdADarLxk0Mq+3XS4jgvhG/oKGWcIDCtPG0HgjxOYvF+ilPJQsAyXfbNOg==", "requires": { - "@jest/console": "^24.7.1", - "@jest/fake-timers": "^24.8.0", - "@jest/source-map": "^24.3.0", - "@jest/test-result": "^24.8.0", - "@jest/types": "^24.8.0", + "@jest/console": "^24.9.0", + "@jest/fake-timers": "^24.9.0", + "@jest/source-map": "^24.9.0", + "@jest/test-result": "^24.9.0", + "@jest/types": "^24.9.0", "callsites": "^3.0.0", "chalk": "^2.0.1", "graceful-fs": "^4.1.15", @@ -7863,66 +8378,75 @@ } }, "jest-validate": { - "version": "24.8.0", - "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-24.8.0.tgz", - "integrity": "sha512-+/N7VOEMW1Vzsrk3UWBDYTExTPwf68tavEPKDnJzrC6UlHtUDU/fuEdXqFoHzv9XnQ+zW6X3qMZhJ3YexfeLDA==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-24.9.0.tgz", + "integrity": "sha512-HPIt6C5ACwiqSiwi+OfSSHbK8sG7akG8eATl+IPKaeIjtPOeBUd/g3J7DghugzxrGjI93qS/+RPKe1H6PqvhRQ==", "requires": { - "@jest/types": "^24.8.0", - "camelcase": "^5.0.0", + "@jest/types": "^24.9.0", + "camelcase": "^5.3.1", "chalk": "^2.0.1", - "jest-get-type": "^24.8.0", - "leven": "^2.1.0", - "pretty-format": "^24.8.0" + "jest-get-type": "^24.9.0", + "leven": "^3.1.0", + "pretty-format": "^24.9.0" } }, "jest-watch-typeahead": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/jest-watch-typeahead/-/jest-watch-typeahead-0.3.0.tgz", - "integrity": "sha512-+uOtlppt9ysST6k6ZTqsPI0WNz2HLa8bowiZylZoQCQaAVn7XsVmHhZREkz73FhKelrFrpne4hQQjdq42nFEmA==", + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/jest-watch-typeahead/-/jest-watch-typeahead-0.4.2.tgz", + "integrity": "sha512-f7VpLebTdaXs81rg/oj4Vg/ObZy2QtGzAmGLNsqUS5G5KtSN68tFcIsbvNODfNyQxU78g7D8x77o3bgfBTR+2Q==", "requires": { - "ansi-escapes": "^3.0.0", + "ansi-escapes": "^4.2.1", "chalk": "^2.4.1", + "jest-regex-util": "^24.9.0", "jest-watcher": "^24.3.0", - "slash": "^2.0.0", - "string-length": "^2.0.0", + "slash": "^3.0.0", + "string-length": "^3.1.0", "strip-ansi": "^5.0.0" }, "dependencies": { - "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==" + "slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==" }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "string-length": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-length/-/string-length-3.1.0.tgz", + "integrity": "sha512-Ttp5YvkGm5v9Ijagtaz1BnN+k9ObpvS0eIBblPMp2YWL8FBmi9qblQ9fexc2k/CXFgrTIteU3jAw3payCnwSTA==", "requires": { - "ansi-regex": "^4.1.0" + "astral-regex": "^1.0.0", + "strip-ansi": "^5.2.0" } } } }, "jest-watcher": { - "version": "24.8.0", - "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-24.8.0.tgz", - "integrity": "sha512-SBjwHt5NedQoVu54M5GEx7cl7IGEFFznvd/HNT8ier7cCAx/Qgu9ZMlaTQkvK22G1YOpcWBLQPFSImmxdn3DAw==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-24.9.0.tgz", + "integrity": "sha512-+/fLOfKPXXYJDYlks62/4R4GoT+GU1tYZed99JSCOsmzkkF7727RqKrjNAxtfO4YpGv11wybgRvCjR73lK2GZw==", "requires": { - "@jest/test-result": "^24.8.0", - "@jest/types": "^24.8.0", - "@types/yargs": "^12.0.9", + "@jest/test-result": "^24.9.0", + "@jest/types": "^24.9.0", + "@types/yargs": "^13.0.0", "ansi-escapes": "^3.0.0", "chalk": "^2.0.1", - "jest-util": "^24.8.0", + "jest-util": "^24.9.0", "string-length": "^2.0.0" + }, + "dependencies": { + "ansi-escapes": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz", + "integrity": "sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==" + } } }, "jest-worker": { - "version": "24.6.0", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-24.6.0.tgz", - "integrity": "sha512-jDwgW5W9qGNvpI1tNnvajh0a5IE/PuGLFmHk6aR/BZFz8tSgGw17GsDPXAJ6p91IvYDjOw8GpFbvvZGAK+DPQQ==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-24.9.0.tgz", + "integrity": "sha512-51PE4haMSXcHohnSMdM42anbvZANYTqMrr52tVKPqqsPJMzoP6FYYDVqahX/HrAoKEKz3uUPzSvKs9A3qR4iVw==", "requires": { - "merge-stream": "^1.0.1", + "merge-stream": "^2.0.0", "supports-color": "^6.1.0" }, "dependencies": { @@ -7941,6 +8465,11 @@ "resolved": "https://registry.npmjs.org/jquery/-/jquery-3.4.1.tgz", "integrity": "sha512-36+AdBzCL+y6qjw5Tx7HgzeGCzC81MDDgaUP8ld2zhx58HdqXGoBd+tHdrBMiyjGQs0Hxs/MLZTu/eHNJJuWPw==" }, + "js-base64": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-2.5.1.tgz", + "integrity": "sha512-M7kLczedRMYX4L8Mdh4MzyAMM9O5osx+4FcOQuTvr3A9F2D9S5JXheN0ewNbrvK2UatkTRhL5ejGmGSjNMiZuw==" + }, "js-levenshtein": { "version": "1.1.6", "resolved": "https://registry.npmjs.org/js-levenshtein/-/js-levenshtein-1.1.6.tgz", @@ -8049,9 +8578,9 @@ "integrity": "sha512-c7/8mbUsKigAbLkD5B010BK4D9LZm7A1pNItkEwiUZRpIN66exu/e7YQWysGun+TRKaJp8MhemM+VkfWv42aCA==" }, "json5": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.0.tgz", - "integrity": "sha512-8Mh9h6xViijj36g7Dxi+Y4S6hNGV96vcJZr/SrlHh1LR/pEn/8j/+qIBbs44YKl69Lrfctp4QD+AdWLTMqEZAQ==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.1.tgz", + "integrity": "sha512-l+3HXD0GEI3huGq1njuqtzYK8OYJyXMkOLtQ53pjWh89tvWS2h6l+1zMkYWqlb57+SiQodKZyvMEFb2X+KrFhQ==", "requires": { "minimist": "^1.2.0" }, @@ -8088,9 +8617,9 @@ } }, "jsx-ast-utils": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-2.2.1.tgz", - "integrity": "sha512-v3FxCcAf20DayI+uxnCuw795+oOIkVu6EnJ1+kSzhqqTZHNkTZ7B66ZgLp4oLJ/gbA64cI0B7WRoHZMSRdyVRQ==", + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-2.2.3.tgz", + "integrity": "sha512-EdIHFMm+1BPynpKOpdPqiOsvnIrInRGJD7bzPZdPkjitQEqpdpUuFpq4T0npZFKTiB3RhWFdGN+oqOJIdhDhQA==", "requires": { "array-includes": "^3.0.3", "object.assign": "^4.1.0" @@ -8158,9 +8687,17 @@ "integrity": "sha512-XI5MPzVNApjAyhQzphX8BkmKsKUxD4LdyK24iZeQGinBN9yTQT3bFlCBy/aVx2HrNcqQGsdot8ghrjyrvMCoEA==" }, "leven": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/leven/-/leven-2.1.0.tgz", - "integrity": "sha1-wuep93IJTe6dNCAq6KzORoeHVYA=" + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", + "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==" + }, + "levenary": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/levenary/-/levenary-1.1.0.tgz", + "integrity": "sha512-VHcwhO0UTpUW7rLPN2/OiWJdgA1e9BqEDALhrgCe/F+uUJnep6CoUsTzMeP8Rh0NGr9uKquXxqe7lwLZo509nQ==", + "requires": { + "leven": "^3.1.0" + } }, "levn": { "version": "0.3.0", @@ -8183,10 +8720,10 @@ "immediate": "~3.0.5" } }, - "linear-layout-vector": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/linear-layout-vector/-/linear-layout-vector-0.0.1.tgz", - "integrity": "sha1-OYEU1zA7bsx/1rJzr3uEAdi6nHA=" + "lines-and-columns": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.1.6.tgz", + "integrity": "sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA=" }, "load-json-file": { "version": "4.0.0", @@ -8289,11 +8826,6 @@ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==" }, - "lodash._getnative": { - "version": "3.9.1", - "resolved": "https://registry.npmjs.org/lodash._getnative/-/lodash._getnative-3.9.1.tgz", - "integrity": "sha1-VwvH3t5G1hzc3mh9ZdPuy6o6r/U=" - }, "lodash._reinterpolate": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz", @@ -8309,31 +8841,11 @@ "resolved": "https://registry.npmjs.org/lodash.flow/-/lodash.flow-3.5.0.tgz", "integrity": "sha1-h79AKSuM+D5OjOGjrkIJ4gBxZ1o=" }, - "lodash.isarguments": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz", - "integrity": "sha1-L1c9hcaiQon/AGY7SRwdM4/zRYo=" - }, - "lodash.isarray": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/lodash.isarray/-/lodash.isarray-3.0.4.tgz", - "integrity": "sha1-eeTriMNqgSKvhvhEqpvNhRtfu1U=" - }, "lodash.isequal": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz", "integrity": "sha1-QVxEePK8wwEgwizhDtMib30+GOA=" }, - "lodash.keys": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-3.1.2.tgz", - "integrity": "sha1-TbwEcrFWvlCgsoaFXRvQsMZWCYo=", - "requires": { - "lodash._getnative": "^3.0.0", - "lodash.isarguments": "^3.0.0", - "lodash.isarray": "^3.0.0" - } - }, "lodash.memoize": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", @@ -8344,11 +8856,6 @@ "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz", "integrity": "sha1-7dFMgk4sycHgsKG0K7UhBRakJDg=" }, - "lodash.tail": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/lodash.tail/-/lodash.tail-4.1.1.tgz", - "integrity": "sha1-0jM6NtnncXyK0vfKyv7HwytERmQ=" - }, "lodash.template": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-4.5.0.tgz", @@ -8382,9 +8889,9 @@ "integrity": "sha1-0CJTc662Uq3BvILklFM5qEJ1R3M=" }, "loglevel": { - "version": "1.6.3", - "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.6.3.tgz", - "integrity": "sha512-LoEDv5pgpvWgPF4kNYuIp0qqSJVWak/dML0RY74xlzMZiT9w77teNAwKYKWBTYjlokMirg+o3jBwp+vlLrcfAA==" + "version": "1.6.6", + "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.6.6.tgz", + "integrity": "sha512-Sgr5lbboAUBo3eXCSPL4/KoVz3ROKquOjcctxmHIt+vol2DrqTQe3SwkKKuYhEiWB5kYa13YyopJ69deJ1irzQ==" }, "loose-envify": { "version": "1.4.0", @@ -8394,6 +8901,15 @@ "js-tokens": "^3.0.0 || ^4.0.0" } }, + "loud-rejection": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz", + "integrity": "sha1-W0b4AUft7leIcPCG0Eghz5mOVR8=", + "requires": { + "currently-unhandled": "^0.4.1", + "signal-exit": "^3.0.0" + } + }, "lower-case": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-1.1.4.tgz", @@ -8405,6 +8921,13 @@ "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", "requires": { "yallist": "^3.0.2" + }, + "dependencies": { + "yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" + } } }, "make-dir": { @@ -8422,9 +8945,9 @@ "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==" }, "semver": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz", - "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==" + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" } } }, @@ -8454,6 +8977,11 @@ "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=" }, + "map-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", + "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=" + }, "map-visit": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", @@ -8490,13 +9018,6 @@ "map-age-cleaner": "^0.1.1", "mimic-fn": "^2.0.0", "p-is-promise": "^2.0.0" - }, - "dependencies": { - "mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==" - } } }, "memory-fs": { @@ -8508,6 +9029,109 @@ "readable-stream": "^2.0.1" } }, + "meow": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz", + "integrity": "sha1-cstmi0JSKCkKu/qFaJJYcwioAfs=", + "requires": { + "camelcase-keys": "^2.0.0", + "decamelize": "^1.1.2", + "loud-rejection": "^1.0.0", + "map-obj": "^1.0.1", + "minimist": "^1.1.3", + "normalize-package-data": "^2.3.4", + "object-assign": "^4.0.1", + "read-pkg-up": "^1.0.1", + "redent": "^1.0.0", + "trim-newlines": "^1.0.0" + }, + "dependencies": { + "find-up": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", + "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", + "requires": { + "path-exists": "^2.0.0", + "pinkie-promise": "^2.0.0" + } + }, + "load-json-file": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", + "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", + "requires": { + "graceful-fs": "^4.1.2", + "parse-json": "^2.2.0", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0", + "strip-bom": "^2.0.0" + } + }, + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" + }, + "parse-json": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", + "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", + "requires": { + "error-ex": "^1.2.0" + } + }, + "path-exists": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", + "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", + "requires": { + "pinkie-promise": "^2.0.0" + } + }, + "path-type": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", + "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", + "requires": { + "graceful-fs": "^4.1.2", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" + } + }, + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=" + }, + "read-pkg": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", + "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", + "requires": { + "load-json-file": "^1.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^1.0.0" + } + }, + "read-pkg-up": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", + "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", + "requires": { + "find-up": "^1.0.0", + "read-pkg": "^1.0.0" + } + }, + "strip-bom": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", + "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", + "requires": { + "is-utf8": "^0.2.0" + } + } + } + }, "merge-deep": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/merge-deep/-/merge-deep-3.0.2.tgz", @@ -8524,17 +9148,14 @@ "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=" }, "merge-stream": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-1.0.1.tgz", - "integrity": "sha1-QEEgLVCKNCugAXQAjfDCUbjBNeE=", - "requires": { - "readable-stream": "^2.0.1" - } + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==" }, "merge2": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.2.3.tgz", - "integrity": "sha512-gdUU1Fwj5ep4kplwcmftruWofEFt6lfpkkr3h860CXbAB9c3hGb55EOL2ali0Td5oebvW0E1+3Sr+Ur7XfKpRA==" + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.3.0.tgz", + "integrity": "sha512-2j4DAdlBOkiSZIsaXk4mTE3sRS02yBHAtfy127xRV3bQUFqXkjHCHLW6Scv7DwNRbIWNHH8zpnz9zMaKXIdvYw==" }, "methods": { "version": "1.1.2", @@ -8588,22 +9209,22 @@ "integrity": "sha512-LRxmNwziLPT828z+4YkNzloCFC2YM4wrB99k+AV5ZbEyfGNWfG8SO1FUXLmLDBSo89NrJZ4DIWeLjy1CHGhMGA==" }, "mime-db": { - "version": "1.40.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.40.0.tgz", - "integrity": "sha512-jYdeOMPy9vnxEqFRRo6ZvTZ8d9oPb+k18PKoYNYUe2stVEBPPwsln/qWzdbmaIvnhZ9v2P+CuecK+fpUfsV2mA==" + "version": "1.43.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.43.0.tgz", + "integrity": "sha512-+5dsGEEovYbT8UY9yD7eE4XTc4UwJ1jBYlgaQQF38ENsKR3wj/8q8RFZrF9WIZpB2V1ArTVFUva8sAul1NzRzQ==" }, "mime-types": { - "version": "2.1.24", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.24.tgz", - "integrity": "sha512-WaFHS3MCl5fapm3oLxU4eYDw77IQM2ACcxQ9RIxfaC3ooc6PFuBMGZZsYpvoXS5D5QTWPieo1jjLdAm3TBP3cQ==", + "version": "2.1.26", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.26.tgz", + "integrity": "sha512-01paPWYgLrkqAyrlDorC1uDwl2p3qZT7yl806vW7DvDoxwXi46jsjFbg+WdwotBIk6/MbEhO/dh5aZ5sNj/dWQ==", "requires": { - "mime-db": "1.40.0" + "mime-db": "1.43.0" } }, "mimic-fn": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", - "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==" + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==" }, "mini-create-react-context": { "version": "0.3.2", @@ -8616,13 +9237,26 @@ } }, "mini-css-extract-plugin": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-0.5.0.tgz", - "integrity": "sha512-IuaLjruM0vMKhUUT51fQdQzBYTX49dLj8w68ALEAe2A4iYNpIC4eMac67mt3NzycvjOlf07/kYxJDc0RTl1Wqw==", + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-0.8.0.tgz", + "integrity": "sha512-MNpRGbNA52q6U92i0qbVpQNsgk7LExy41MdAlG84FeytfDOtRIf/mCHdEgG8rpTKOaNKiqUnZdlptF469hxqOw==", "requires": { "loader-utils": "^1.1.0", + "normalize-url": "1.9.1", "schema-utils": "^1.0.0", "webpack-sources": "^1.1.0" + }, + "dependencies": { + "schema-utils": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", + "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", + "requires": { + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" + } + } } }, "minimalistic-assert": { @@ -8648,6 +9282,38 @@ "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.10.tgz", "integrity": "sha1-3j+YVD2/lggr5IrRoMfNqDYwHc8=" }, + "minipass": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.1.tgz", + "integrity": "sha512-UFqVihv6PQgwj8/yTGvl9kPz7xIAY+R5z6XYjRInD3Gk3qx6QGSD6zEcpeG4Dy/lQnv1J6zv8ejV90hyYIKf3w==", + "requires": { + "yallist": "^4.0.0" + } + }, + "minipass-collect": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-1.0.2.tgz", + "integrity": "sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==", + "requires": { + "minipass": "^3.0.0" + } + }, + "minipass-flush": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.5.tgz", + "integrity": "sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==", + "requires": { + "minipass": "^3.0.0" + } + }, + "minipass-pipeline": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.2.tgz", + "integrity": "sha512-3JS5A2DKhD2g0Gg8x3yamO0pj7YeKGwVlDS90pF++kxptwx/F+B//roxf9SqYil5tQo65bijy+dAuAFZmYOouA==", + "requires": { + "minipass": "^3.0.0" + } + }, "mississippi": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/mississippi/-/mississippi-3.0.0.tgz", @@ -8748,15 +9414,14 @@ "integrity": "sha1-iZ8R2WhuXgXLkbNdXw5jt3PPyQE=" }, "mute-stream": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz", - "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=" + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", + "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==" }, "nan": { "version": "2.14.0", "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.0.tgz", - "integrity": "sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg==", - "optional": true + "integrity": "sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg==" }, "nanomatch": { "version": "1.2.13", @@ -8798,6 +9463,11 @@ "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.1.tgz", "integrity": "sha512-iyam8fBuCUpWeKPGpaNMetEocMt364qkCsfL9JuhjXX6dRnguRVOfk2GZaDpPjcOKiiXCPINZC1GczQ7iTq3Zw==" }, + "next-tick": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.0.0.tgz", + "integrity": "sha1-yobR/ogoFpsBICCOPchCS524NCw=" + }, "nice-try": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", @@ -8821,9 +9491,35 @@ } }, "node-forge": { - "version": "0.7.5", - "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.7.5.tgz", - "integrity": "sha512-MmbQJ2MTESTjt3Gi/3yG1wGpIMhUfcIypUCGtTizFR9IiccFwxSpfp0vtIZlkFclEqERemxfnSdZEMR9VqqEFQ==" + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.9.0.tgz", + "integrity": "sha512-7ASaDa3pD+lJ3WvXFsxekJQelBKRpne+GOVbLbtHYdd7pFspyeuJHnWfLplGf3SwKGbfs/aYl5V/JCIaHVUKKQ==" + }, + "node-gyp": { + "version": "3.8.0", + "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-3.8.0.tgz", + "integrity": "sha512-3g8lYefrRRzvGeSowdJKAKyks8oUpLEd/DyPV4eMhVlhJ0aNaZqIrNUIPuEWWTAoPqyFkfGrM67MC69baqn6vA==", + "requires": { + "fstream": "^1.0.0", + "glob": "^7.0.3", + "graceful-fs": "^4.1.2", + "mkdirp": "^0.5.0", + "nopt": "2 || 3", + "npmlog": "0 || 1 || 2 || 3 || 4", + "osenv": "0", + "request": "^2.87.0", + "rimraf": "2", + "semver": "~5.3.0", + "tar": "^2.0.0", + "which": "1" + }, + "dependencies": { + "semver": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.3.0.tgz", + "integrity": "sha1-myzl094C0XxgEq0yaqa00M9U+U8=" + } + } }, "node-int64": { "version": "0.4.0", @@ -8860,10 +9556,23 @@ "vm-browserify": "^1.0.1" }, "dependencies": { + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + }, "punycode": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=" + }, + "util": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/util/-/util-0.11.1.tgz", + "integrity": "sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ==", + "requires": { + "inherits": "2.0.3" + } } } }, @@ -8873,9 +9582,9 @@ "integrity": "sha1-jZ2+KJZKSsVxLpExZCEHxx6Q7EA=" }, "node-notifier": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/node-notifier/-/node-notifier-5.4.0.tgz", - "integrity": "sha512-SUDEb+o71XR5lXSTyivXd9J7fCloE3SyP4lSgt3lU2oSANiox+SxlNRGPjDKrwU1YN3ix2KN/VGGCg0t01rttQ==", + "version": "5.4.3", + "resolved": "https://registry.npmjs.org/node-notifier/-/node-notifier-5.4.3.tgz", + "integrity": "sha512-M4UBGcs4jeOK9CjTsYwkvH6/MzuUmGCyTW+kCY7uO+1ZVr0+FHGdPdIf5CCLqAaxnRrWidyoQlNkMIIVwbKB8Q==", "requires": { "growly": "^1.3.0", "is-wsl": "^1.1.0", @@ -8885,27 +9594,112 @@ }, "dependencies": { "semver": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz", - "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==" + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" } } }, "node-releases": { - "version": "1.1.25", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.25.tgz", - "integrity": "sha512-fI5BXuk83lKEoZDdH3gRhtsNgh05/wZacuXkgbiYkceE7+QIMXOg98n9ZV7mz27B+kFHnqHcUpscZZlGRSmTpQ==", + "version": "1.1.45", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.45.tgz", + "integrity": "sha512-cXvGSfhITKI8qsV116u2FTzH5EWZJfgG7d4cpqwF8I8+1tWpD6AsvvGRKq2onR0DNj1jfqsjkXZsm14JMS7Cyg==", "requires": { - "semver": "^5.3.0" + "semver": "^6.3.0" + } + }, + "node-sass": { + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/node-sass/-/node-sass-4.13.0.tgz", + "integrity": "sha512-W1XBrvoJ1dy7VsvTAS5q1V45lREbTlZQqFbiHb3R3OTTCma0XBtuG6xZ6Z4506nR4lmHPTqVRwxT6KgtWC97CA==", + "requires": { + "async-foreach": "^0.1.3", + "chalk": "^1.1.1", + "cross-spawn": "^3.0.0", + "gaze": "^1.0.0", + "get-stdin": "^4.0.1", + "glob": "^7.0.3", + "in-publish": "^2.0.0", + "lodash": "^4.17.15", + "meow": "^3.7.0", + "mkdirp": "^0.5.1", + "nan": "^2.13.2", + "node-gyp": "^3.8.0", + "npmlog": "^4.0.0", + "request": "^2.88.0", + "sass-graph": "^2.2.4", + "stdout-stream": "^1.4.0", + "true-case-path": "^1.0.2" }, "dependencies": { - "semver": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz", - "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==" + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" + }, + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=" + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "requires": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + } + }, + "cross-spawn": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-3.0.1.tgz", + "integrity": "sha1-ElYDfsufDF9549bvE14wdwGEuYI=", + "requires": { + "lru-cache": "^4.0.1", + "which": "^1.2.9" + } + }, + "lru-cache": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", + "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", + "requires": { + "pseudomap": "^1.0.2", + "yallist": "^2.1.2" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=" + }, + "yallist": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", + "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=" } } }, + "nopt": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz", + "integrity": "sha1-xkZdvwirzU2zWTF/eaxopkayj/k=", + "requires": { + "abbrev": "1" + } + }, "normalize-package-data": { "version": "2.5.0", "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", @@ -8918,9 +9712,9 @@ }, "dependencies": { "semver": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz", - "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==" + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" } } }, @@ -8938,9 +9732,15 @@ "integrity": "sha1-LRDAa9/TEuqXd2laTShDlFa3WUI=" }, "normalize-url": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-3.3.0.tgz", - "integrity": "sha512-U+JJi7duF1o+u2pynbp2zXDW2/PADgC30f0GsHZtRh+HOcXHnw137TrNlyxxRvWW5fjKd3bcLHPxofWuCjaeZg==" + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-1.9.1.tgz", + "integrity": "sha1-LMDWazHqIwNkWENuNiDYWVTGbDw=", + "requires": { + "object-assign": "^4.0.1", + "prepend-http": "^1.0.0", + "query-string": "^4.1.0", + "sort-keys": "^1.0.0" + } }, "npm-run-path": { "version": "2.0.2", @@ -8950,6 +9750,17 @@ "path-key": "^2.0.0" } }, + "npmlog": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz", + "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", + "requires": { + "are-we-there-yet": "~1.1.2", + "console-control-strings": "~1.1.0", + "gauge": "~2.7.3", + "set-blocking": "~2.0.0" + } + }, "nth-check": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.2.tgz", @@ -8969,9 +9780,9 @@ "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=" }, "nwsapi": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.1.4.tgz", - "integrity": "sha512-iGfd9Y6SFdTNldEy2L0GUhcarIutFmk+MPWIn9dmj8NMIup03G08uUF2KGbbmv/Ux4RT0VZJoP/sVbWA6d/VIw==" + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.0.tgz", + "integrity": "sha512-h2AatdwYH+JHiZpv7pt/gSX1XoRGb7L/qSIeuqA6GwYoF9w1vP1cw42TO0aI2pNyshRK5893hNSl+1//vHK7hQ==" }, "oauth-sign": { "version": "0.9.0", @@ -9008,11 +9819,26 @@ "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-1.3.1.tgz", "integrity": "sha512-OSuu/pU4ENM9kmREg0BdNrUDIl1heYa4mBZacJc+vVWz4GtAwu7jO8s4AIt2aGRUTqxykpWzI3Oqnsm13tTMDA==" }, + "object-inspect": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.7.0.tgz", + "integrity": "sha512-a7pEHdh1xKIAgTySUGgLMx/xwDZskN1Ud6egYYN3EdRW4ZMPNEDUTF+hwy2LUC+Bl+SyLXANnwz/jyh/qutKUw==" + }, + "object-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.0.2.tgz", + "integrity": "sha512-Epah+btZd5wrrfjkJZq1AOB9O6OxUQto45hzFd7lXGrpHPGE0W1k+426yrZV+k6NJOzLNNW/nVsmZdIWsAqoOQ==" + }, "object-keys": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==" }, + "object-path": { + "version": "0.11.4", + "resolved": "https://registry.npmjs.org/object-path/-/object-path-0.11.4.tgz", + "integrity": "sha1-NwrnUvvzfePqcKhhwju6iRVpGUk=" + }, "object-visit": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", @@ -9032,24 +9858,35 @@ "object-keys": "^1.0.11" } }, - "object.fromentries": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.0.tgz", - "integrity": "sha512-9iLiI6H083uiqUuvzyY6qrlmc/Gz8hLQFOcb/Ri/0xXFkSNS3ctV+CbE6yM2+AnkYfOB3dGjdzC0wrMLIhQICA==", + "object.entries": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.1.tgz", + "integrity": "sha512-ilqR7BgdyZetJutmDPfXCDffGa0/Yzl2ivVNpbx/g4UeWrCdRnFDUBrKJGLhGieRHDATnyZXWBeCb29k9CJysQ==", "requires": { - "define-properties": "^1.1.2", - "es-abstract": "^1.11.0", + "define-properties": "^1.1.3", + "es-abstract": "^1.17.0-next.1", "function-bind": "^1.1.1", - "has": "^1.0.1" + "has": "^1.0.3" + } + }, + "object.fromentries": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.2.tgz", + "integrity": "sha512-r3ZiBH7MQppDJVLx6fhD618GKNG40CZYH9wgwdhKxBDDbQgjeWGGd4AtkZad84d291YxvWe7bJGuE65Anh0dxQ==", + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.0-next.1", + "function-bind": "^1.1.1", + "has": "^1.0.3" } }, "object.getownpropertydescriptors": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.0.3.tgz", - "integrity": "sha1-h1jIRvW0B62rDyNuCYbxSwUcqhY=", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.0.tgz", + "integrity": "sha512-Z53Oah9A3TdLoblT7VKJaTDdXdT+lQO+cNpKVnya5JDe9uLvzu1YyY1yFDFrcxrlRgWrEFH0jJtD/IbuwjcEVg==", "requires": { - "define-properties": "^1.1.2", - "es-abstract": "^1.5.1" + "define-properties": "^1.1.3", + "es-abstract": "^1.17.0-next.1" } }, "object.pick": { @@ -9061,12 +9898,12 @@ } }, "object.values": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.0.tgz", - "integrity": "sha512-8mf0nKLAoFX6VlNVdhGj31SVYpaNFtUnuoOXWyFEstsWRgU837AK+JYM0iAxwkSzGRbwn8cbFmgbyxj1j4VbXg==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.1.tgz", + "integrity": "sha512-WTa54g2K8iu0kmS/us18jEmdv1a4Wi//BZ/DTVYEcH0XhLM5NYdpDHja3gt57VrZLcNAO2WGA+KpWsDBaHt6eA==", "requires": { "define-properties": "^1.1.3", - "es-abstract": "^1.12.0", + "es-abstract": "^1.17.0-next.1", "function-bind": "^1.1.1", "has": "^1.0.3" } @@ -9098,17 +9935,32 @@ } }, "onetime": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", - "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.0.tgz", + "integrity": "sha512-5NcSkPHhwTVFIQN+TUqXoS5+dlElHXdpAWu9I0HP20YOtIi+aZ0Ct82jdlILDxjLEAWwvm+qj1m6aEtsDVmm6Q==", "requires": { - "mimic-fn": "^1.0.0" + "mimic-fn": "^2.1.0" + } + }, + "open": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/open/-/open-7.0.0.tgz", + "integrity": "sha512-K6EKzYqnwQzk+/dzJAQSBORub3xlBTxMz+ntpZpH/LyCa1o6KjXhuN+2npAaI9jaSmU3R1Q8NWf4KUWcyytGsQ==", + "requires": { + "is-wsl": "^2.1.0" + }, + "dependencies": { + "is-wsl": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.1.1.tgz", + "integrity": "sha512-umZHcSrwlDHo2TGMXv0DZ8dIUGunZ2Iv68YZnrmCiBPkZ4aaOhtv7pXJKeki9k3qJ3RJr0cDyitcl5wEH3AYog==" + } } }, "opn": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/opn/-/opn-5.4.0.tgz", - "integrity": "sha512-YF9MNdVy/0qvJvDtunAOzFw9iasOQHpVthTCvGzxt61Il64AYSGdK+rYwld7NAfk9qJ7dt+hymBNSc9LNYS+Sw==", + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/opn/-/opn-5.5.0.tgz", + "integrity": "sha512-PqHpggC9bLV0VeWcdKhkpxY+3JTzetLSqTCWL/z/tFIbI6G8JCjondXklT1JinczLz2Xib62sSp0T/gKT4KksA==", "requires": { "is-wsl": "^1.1.0" } @@ -9123,32 +9975,25 @@ } }, "optimize-css-assets-webpack-plugin": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/optimize-css-assets-webpack-plugin/-/optimize-css-assets-webpack-plugin-5.0.1.tgz", - "integrity": "sha512-Rqm6sSjWtx9FchdP0uzTQDc7GXDKnwVEGoSxjezPkzMewx7gEWE9IMUYKmigTRC4U3RaNSwYVnUDLuIdtTpm0A==", + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/optimize-css-assets-webpack-plugin/-/optimize-css-assets-webpack-plugin-5.0.3.tgz", + "integrity": "sha512-q9fbvCRS6EYtUKKSwI87qm2IxlyJK5b4dygW1rKUBT6mMDhdG5e5bZT63v6tnJR9F9FB/H5a0HTmtw+laUBxKA==", "requires": { - "cssnano": "^4.1.0", + "cssnano": "^4.1.10", "last-call-webpack-plugin": "^3.0.0" } }, "optionator": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz", - "integrity": "sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=", + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", + "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", "requires": { "deep-is": "~0.1.3", - "fast-levenshtein": "~2.0.4", + "fast-levenshtein": "~2.0.6", "levn": "~0.3.0", "prelude-ls": "~1.1.2", "type-check": "~0.3.2", - "wordwrap": "~1.0.0" - }, - "dependencies": { - "wordwrap": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", - "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=" - } + "word-wrap": "~1.2.3" } }, "original": { @@ -9164,6 +10009,11 @@ "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz", "integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=" }, + "os-homedir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", + "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=" + }, "os-locale": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-3.1.0.tgz", @@ -9179,6 +10029,15 @@ "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=" }, + "osenv": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz", + "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==", + "requires": { + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.0" + } + }, "p-defer": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-1.0.0.tgz", @@ -9203,9 +10062,9 @@ "integrity": "sha512-Y3W0wlRPK8ZMRbNq97l4M5otioeA5lm1z7bkNkxCka8HSPjR0xRWmpCmc9utiaLP9Jb1eD8BgeIxTW4AIF45Pg==" }, "p-limit": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.0.tgz", - "integrity": "sha512-pZbTJpoUsCzV48Mc9Nh51VbwO0X9cuPFE8gYwx9BTCt9SF8/b7Zljd2fVgOxhIF/HDTKgpVzs+GPhyKfjLLFRQ==", + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.2.tgz", + "integrity": "sha512-WGR+xHecKTr7EbUEhyLSh5Dube9JtdiG78ufaeLxTgpudf/20KqyMioIUZJAezlTIi6evxuoUs9YXc11cU+yzQ==", "requires": { "p-try": "^2.0.0" } @@ -9219,15 +10078,26 @@ } }, "p-map": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-1.2.0.tgz", - "integrity": "sha512-r6zKACMNhjPJMTl8KcFH4li//gkrXWfbD6feV8l6doRHlzljFWGJ2AP6iKaCJXyZmAUMOPtvbW7EXkbWO/pLEA==" + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-3.0.0.tgz", + "integrity": "sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ==", + "requires": { + "aggregate-error": "^3.0.0" + } }, "p-reduce": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/p-reduce/-/p-reduce-1.0.0.tgz", "integrity": "sha1-GMKw3ZNqRpClKfgjH1ig/bakffo=" }, + "p-retry": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-3.0.1.tgz", + "integrity": "sha512-XE6G4+YTTkT2a0UWb2kjZe8xNwf8bIbnqpc/IS/idOBVhyves0mK5OJgeocjx7q5pvX/6m23xuzVPYT1uGM73w==", + "requires": { + "retry": "^0.12.0" + } + }, "p-try": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", @@ -9239,11 +10109,11 @@ "integrity": "sha512-0DTvPVU3ed8+HNXOu5Bs+o//Mbdj9VNQMUOe9oKCwh8l0GNwpTDMKCWbRjgtD291AWnkAgkqA/LOnQS8AmS1tw==" }, "parallel-transform": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/parallel-transform/-/parallel-transform-1.1.0.tgz", - "integrity": "sha1-1BDwZbBdojCB/NEPKIVMKb2jOwY=", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/parallel-transform/-/parallel-transform-1.2.0.tgz", + "integrity": "sha512-P2vSmIu38uIlvdcU7fDkyrxj33gTUy/ABO5ZUbGowxNCopBq/OoD42bP4UmMrJoPyk4Uqf0mu3mtWBhHCZD8yg==", "requires": { - "cyclist": "~0.2.2", + "cyclist": "^1.0.1", "inherits": "^2.0.3", "readable-stream": "^2.1.5" } @@ -9272,9 +10142,9 @@ } }, "parse-asn1": { - "version": "5.1.4", - "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.4.tgz", - "integrity": "sha512-Qs5duJcuvNExRfFZ99HDD3z4mAi3r9Wl/FOjEOijlxwCZs7E7mW2vjTpgQ4J8LpTF8x5v+1Vn5UQFejmWT11aw==", + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.5.tgz", + "integrity": "sha512-jkMYn1dcJqF6d5CpU689bq7w/b5ALS9ROVSpQDPrZsqqesUJii9qutvoT5ltGedNXMO2e16YUWIghG9KxaViTQ==", "requires": { "asn1.js": "^4.0.0", "browserify-aes": "^1.0.0", @@ -9344,9 +10214,9 @@ "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==" }, "path-to-regexp": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.7.0.tgz", - "integrity": "sha1-Wf3g9DW62suhA6hOnTvGTpa5k30=", + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.8.0.tgz", + "integrity": "sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA==", "requires": { "isarray": "0.0.1" }, @@ -9477,40 +10347,35 @@ "integrity": "sha512-2qHaIQr2VLRFoxe2nASzsV6ef4yOOH+Fi9FBOVH6cqeSgUnoyySPZkxzLuzd+RYOQTRpROA0ztTMqxROKSb/nA==" }, "pnp-webpack-plugin": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/pnp-webpack-plugin/-/pnp-webpack-plugin-1.2.1.tgz", - "integrity": "sha512-W6GctK7K2qQiVR+gYSv/Gyt6jwwIH4vwdviFqx+Y2jAtVf5eZyYIDf5Ac2NCDMBiX5yWscBLZElPTsyA1UtVVA==", + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/pnp-webpack-plugin/-/pnp-webpack-plugin-1.5.0.tgz", + "integrity": "sha512-jd9olUr9D7do+RN8Wspzhpxhgp1n6Vd0NtQ4SFkmIACZoEL1nkyAdW9Ygrinjec0vgDcWjscFQQ1gDW8rsfKTg==", "requires": { - "ts-pnp": "^1.0.0" + "ts-pnp": "^1.1.2" } }, "popper.js": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/popper.js/-/popper.js-1.15.0.tgz", - "integrity": "sha512-w010cY1oCUmI+9KwwlWki+r5jxKfTFDVoadl7MSrIujHU5MJ5OR6HTDj6Xo8aoR/QsA56x8jKjA59qGH4ELtrA==" + "version": "1.16.0", + "resolved": "https://registry.npmjs.org/popper.js/-/popper.js-1.16.0.tgz", + "integrity": "sha512-+G+EkOPoE5S/zChTpmBSSDYmhXJ5PsW8eMhH8cP/CQHMFPBG/kC9Y5IIw6qNYgdJ+/COf0ddY2li28iHaZRSjw==" }, "portfinder": { - "version": "1.0.21", - "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.21.tgz", - "integrity": "sha512-ESabpDCzmBS3ekHbmpAIiESq3udRsCBGiBZLsC+HgBKv2ezb0R4oG+7RnYEVZ/ZCfhel5Tx3UzdNWA0Lox2QCA==", + "version": "1.0.25", + "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.25.tgz", + "integrity": "sha512-6ElJnHBbxVA1XSLgBp7G1FiCkQdlqGzuF7DswL5tcea+E8UpuvPU7beVAjjRwCioTS9ZluNbu+ZyRvgTsmqEBg==", "requires": { - "async": "^1.5.2", - "debug": "^2.2.0", - "mkdirp": "0.5.x" + "async": "^2.6.2", + "debug": "^3.1.1", + "mkdirp": "^0.5.1" }, "dependencies": { "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", "requires": { - "ms": "2.0.0" + "ms": "^2.1.1" } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" } } }, @@ -9520,9 +10385,9 @@ "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=" }, "postcss": { - "version": "7.0.17", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.17.tgz", - "integrity": "sha512-546ZowA+KZ3OasvQZHsbuEpysvwTZNGJv9EfyCQdsIDltPSWHAeTQ5fQy/Npi2ZDtLI3zs7Ps/p6wThErhm9fQ==", + "version": "7.0.26", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.26.tgz", + "integrity": "sha512-IY4oRjpXWYshuTDFxMVkJDtWIk2LhsTlu8bZnbEJA4+bYT16Lvpo8Qv6EvDumhYRgzjZl489pmsY3qVgJQ08nA==", "requires": { "chalk": "^2.4.2", "source-map": "^0.6.1", @@ -9566,11 +10431,11 @@ } }, "postcss-browser-comments": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/postcss-browser-comments/-/postcss-browser-comments-2.0.0.tgz", - "integrity": "sha512-xGG0UvoxwBc4Yx4JX3gc0RuDl1kc4bVihCzzk6UC72YPfq5fu3c717Nu8Un3nvnq1BJ31gBnFXIG/OaUTnpHgA==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postcss-browser-comments/-/postcss-browser-comments-3.0.0.tgz", + "integrity": "sha512-qfVjLfq7HFd2e0HW4s1dvU8X080OZdG46fFbIBFjW7US7YPDcWfRvdElvwMJr2LI6hMmD+7LnH2HcmXTs+uOig==", "requires": { - "postcss": "^7.0.2" + "postcss": "^7" } }, "postcss-calc": { @@ -9598,6 +10463,11 @@ "indexes-of": "^1.0.1", "uniq": "^1.0.1" } + }, + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" } } }, @@ -9658,6 +10528,13 @@ "has": "^1.0.0", "postcss": "^7.0.0", "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" + } } }, "postcss-convert-values": { @@ -9667,6 +10544,13 @@ "requires": { "postcss": "^7.0.0", "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" + } } }, "postcss-custom-media": { @@ -9838,9 +10722,9 @@ } }, "postcss-initial": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/postcss-initial/-/postcss-initial-3.0.1.tgz", - "integrity": "sha512-I2Sz83ZSHybMNh02xQDK609lZ1/QOyYeuizCjzEhlMgeV/HcDJapQiH4yTqLjZss0X6/6VvKFXUeObaHpJoINw==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/postcss-initial/-/postcss-initial-3.0.2.tgz", + "integrity": "sha512-ugA2wKonC0xeNHgirR4D3VWHs2JcU08WAi1KFLVcnb7IN89phID6Qtg2RIctWbnvp1TM2BOmDtX8GGLCKdR8YA==", "requires": { "lodash.template": "^4.5.0", "postcss": "^7.0.2" @@ -9874,6 +10758,18 @@ "postcss": "^7.0.0", "postcss-load-config": "^2.0.0", "schema-utils": "^1.0.0" + }, + "dependencies": { + "schema-utils": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", + "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", + "requires": { + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" + } + } } }, "postcss-logical": { @@ -9901,6 +10797,13 @@ "postcss": "^7.0.0", "postcss-value-parser": "^3.0.0", "stylehacks": "^4.0.0" + }, + "dependencies": { + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" + } } }, "postcss-merge-rules": { @@ -9935,6 +10838,13 @@ "requires": { "postcss": "^7.0.0", "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" + } } }, "postcss-minify-gradients": { @@ -9946,6 +10856,13 @@ "is-color-stop": "^1.0.0", "postcss": "^7.0.0", "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" + } } }, "postcss-minify-params": { @@ -9959,6 +10876,13 @@ "postcss": "^7.0.0", "postcss-value-parser": "^3.0.0", "uniqs": "^2.0.0" + }, + "dependencies": { + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" + } } }, "postcss-minify-selectors": { @@ -9993,50 +10917,52 @@ } }, "postcss-modules-local-by-default": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-2.0.6.tgz", - "integrity": "sha512-oLUV5YNkeIBa0yQl7EYnxMgy4N6noxmiwZStaEJUSe2xPMcdNc8WmBQuQCx18H5psYbVxz8zoHk0RAAYZXP9gA==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-3.0.2.tgz", + "integrity": "sha512-jM/V8eqM4oJ/22j0gx4jrp63GSvDH6v86OqyTHHUvk4/k1vceipZsaymiZ5PvocqZOl5SFHiFJqjs3la0wnfIQ==", "requires": { - "postcss": "^7.0.6", - "postcss-selector-parser": "^6.0.0", - "postcss-value-parser": "^3.3.1" + "icss-utils": "^4.1.1", + "postcss": "^7.0.16", + "postcss-selector-parser": "^6.0.2", + "postcss-value-parser": "^4.0.0" } }, "postcss-modules-scope": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-2.1.0.tgz", - "integrity": "sha512-91Rjps0JnmtUB0cujlc8KIKCsJXWjzuxGeT/+Q2i2HXKZ7nBUeF9YQTZZTNvHVoNYj1AthsjnGLtqDUE0Op79A==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-2.1.1.tgz", + "integrity": "sha512-OXRUPecnHCg8b9xWvldG/jUpRIGPNRka0r4D4j0ESUU2/5IOnpsjfPPmDprM3Ih8CgZ8FXjWqaniK5v4rWt3oQ==", "requires": { "postcss": "^7.0.6", "postcss-selector-parser": "^6.0.0" } }, "postcss-modules-values": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-2.0.0.tgz", - "integrity": "sha512-Ki7JZa7ff1N3EIMlPnGTZfUMe69FFwiQPnVSXC9mnn3jozCRBYIxiZd44yJOV2AmabOo4qFf8s0dC/+lweG7+w==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-3.0.0.tgz", + "integrity": "sha512-1//E5jCBrZ9DmRX+zCtmQtRSV6PV42Ix7Bzj9GbwJceduuf7IqP8MgeTXuRDHOWj2m0VzZD5+roFWDuU8RQjcg==", "requires": { - "icss-replace-symbols": "^1.1.0", + "icss-utils": "^4.0.0", "postcss": "^7.0.6" } }, "postcss-nesting": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/postcss-nesting/-/postcss-nesting-7.0.0.tgz", - "integrity": "sha512-WSsbVd5Ampi3Y0nk/SKr5+K34n52PqMqEfswu6RtU4r7wA8vSD+gM8/D9qq4aJkHImwn1+9iEFTbjoWsQeqtaQ==", + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/postcss-nesting/-/postcss-nesting-7.0.1.tgz", + "integrity": "sha512-FrorPb0H3nuVq0Sff7W2rnc3SmIcruVC6YwpcS+k687VxyxO33iE1amna7wHuRVzM8vfiYofXSBHNAZ3QhLvYg==", "requires": { "postcss": "^7.0.2" } }, "postcss-normalize": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/postcss-normalize/-/postcss-normalize-7.0.1.tgz", - "integrity": "sha512-NOp1fwrG+6kVXWo7P9SizCHX6QvioxFD/hZcI2MLxPmVnFJFC0j0DDpIuNw2tUDeCFMni59gCVgeJ1/hYhj2OQ==", + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/postcss-normalize/-/postcss-normalize-8.0.1.tgz", + "integrity": "sha512-rt9JMS/m9FHIRroDDBGSMsyW1c0fkvOJPy62ggxSHUldJO7B195TqFMqIf+lY5ezpDcYOV4j86aUp3/XbxzCCQ==", "requires": { - "@csstools/normalize.css": "^9.0.1", - "browserslist": "^4.1.1", - "postcss": "^7.0.2", - "postcss-browser-comments": "^2.0.0" + "@csstools/normalize.css": "^10.1.0", + "browserslist": "^4.6.2", + "postcss": "^7.0.17", + "postcss-browser-comments": "^3.0.0", + "sanitize.css": "^10.0.0" } }, "postcss-normalize-charset": { @@ -10055,6 +10981,13 @@ "cssnano-util-get-match": "^4.0.0", "postcss": "^7.0.0", "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" + } } }, "postcss-normalize-positions": { @@ -10066,6 +10999,13 @@ "has": "^1.0.0", "postcss": "^7.0.0", "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" + } } }, "postcss-normalize-repeat-style": { @@ -10077,6 +11017,13 @@ "cssnano-util-get-match": "^4.0.0", "postcss": "^7.0.0", "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" + } } }, "postcss-normalize-string": { @@ -10087,6 +11034,13 @@ "has": "^1.0.0", "postcss": "^7.0.0", "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" + } } }, "postcss-normalize-timing-functions": { @@ -10097,6 +11051,13 @@ "cssnano-util-get-match": "^4.0.0", "postcss": "^7.0.0", "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" + } } }, "postcss-normalize-unicode": { @@ -10107,6 +11068,13 @@ "browserslist": "^4.0.0", "postcss": "^7.0.0", "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" + } } }, "postcss-normalize-url": { @@ -10118,6 +11086,18 @@ "normalize-url": "^3.0.0", "postcss": "^7.0.0", "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "normalize-url": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-3.3.0.tgz", + "integrity": "sha512-U+JJi7duF1o+u2pynbp2zXDW2/PADgC30f0GsHZtRh+HOcXHnw137TrNlyxxRvWW5fjKd3bcLHPxofWuCjaeZg==" + }, + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" + } } }, "postcss-normalize-whitespace": { @@ -10127,6 +11107,13 @@ "requires": { "postcss": "^7.0.0", "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" + } } }, "postcss-ordered-values": { @@ -10137,6 +11124,13 @@ "cssnano-util-get-arguments": "^4.0.0", "postcss": "^7.0.0", "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" + } } }, "postcss-overflow-shorthand": { @@ -10165,26 +11159,26 @@ } }, "postcss-preset-env": { - "version": "6.6.0", - "resolved": "https://registry.npmjs.org/postcss-preset-env/-/postcss-preset-env-6.6.0.tgz", - "integrity": "sha512-I3zAiycfqXpPIFD6HXhLfWXIewAWO8emOKz+QSsxaUZb9Dp8HbF5kUf+4Wy/AxR33o+LRoO8blEWCHth0ZsCLA==", + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/postcss-preset-env/-/postcss-preset-env-6.7.0.tgz", + "integrity": "sha512-eU4/K5xzSFwUFJ8hTdTQzo2RBLbDVt83QZrAvI07TULOkmyQlnYlpwep+2yIK+K+0KlZO4BvFcleOCCcUtwchg==", "requires": { - "autoprefixer": "^9.4.9", - "browserslist": "^4.4.2", - "caniuse-lite": "^1.0.30000939", + "autoprefixer": "^9.6.1", + "browserslist": "^4.6.4", + "caniuse-lite": "^1.0.30000981", "css-blank-pseudo": "^0.1.4", "css-has-pseudo": "^0.10.0", "css-prefers-color-scheme": "^3.1.1", - "cssdb": "^4.3.0", - "postcss": "^7.0.14", + "cssdb": "^4.4.0", + "postcss": "^7.0.17", "postcss-attribute-case-insensitive": "^4.0.1", "postcss-color-functional-notation": "^2.0.1", "postcss-color-gray": "^5.0.0", - "postcss-color-hex-alpha": "^5.0.2", + "postcss-color-hex-alpha": "^5.0.3", "postcss-color-mod-function": "^3.0.3", "postcss-color-rebeccapurple": "^4.0.1", - "postcss-custom-media": "^7.0.7", - "postcss-custom-properties": "^8.0.9", + "postcss-custom-media": "^7.0.8", + "postcss-custom-properties": "^8.0.11", "postcss-custom-selectors": "^5.1.2", "postcss-dir-pseudo-class": "^5.0.0", "postcss-double-position-gradients": "^1.0.0", @@ -10254,6 +11248,13 @@ "has": "^1.0.0", "postcss": "^7.0.0", "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" + } } }, "postcss-replace-overflow-wrap": { @@ -10309,6 +11310,13 @@ "postcss": "^7.0.0", "postcss-value-parser": "^3.0.0", "svgo": "^1.0.0" + }, + "dependencies": { + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" + } } }, "postcss-unique-selectors": { @@ -10322,9 +11330,9 @@ } }, "postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.0.2.tgz", + "integrity": "sha512-LmeoohTpp/K4UiyQCwuGWlONxXamGzCMtFxLq4W1nZVGIQLYvMCJx3yAF9qyyuFpflABI9yVdtJAqbihOsCsJQ==" }, "postcss-values-parser": { "version": "2.0.1", @@ -10341,10 +11349,15 @@ "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=" }, + "prepend-http": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz", + "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=" + }, "pretty-bytes": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-5.2.0.tgz", - "integrity": "sha512-ujANBhiUsl9AhREUDUEY1GPOharMGm8x8juS7qOHybcLi7XsKfrYQ88hSly1l2i0klXHTDYrlL8ihMCG55Dc3w==" + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-5.3.0.tgz", + "integrity": "sha512-hjGrh+P926p4R4WbaB6OckyRtO0F0/lQBiT+0gnxjV+5kjPBrfVBFCsCLbMqVQeydvIoouYTCmmEURiH3R1Bdg==" }, "pretty-error": { "version": "2.1.1", @@ -10356,11 +11369,11 @@ } }, "pretty-format": { - "version": "24.8.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-24.8.0.tgz", - "integrity": "sha512-P952T7dkrDEplsR+TuY7q3VXDae5Sr7zmQb12JU/NDQa/3CH7/QW0yvqLcGN6jL+zQFKaoJcPc+yJxMTGmosqw==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-24.9.0.tgz", + "integrity": "sha512-00ZMZUiHaJrNfk33guavqgvfJS30sLYf0f8+Srklv0AMPodGGHcoHgksZ3OThYnIvOd+8yMCn0YiEOogjlgsnA==", "requires": { - "@jest/types": "^24.8.0", + "@jest/types": "^24.9.0", "ansi-regex": "^4.0.0", "ansi-styles": "^3.2.0", "react-is": "^16.8.4" @@ -10407,12 +11420,12 @@ "integrity": "sha1-mEcocL8igTL8vdhoEputEsPAKeM=" }, "prompts": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.1.0.tgz", - "integrity": "sha512-+x5TozgqYdOwWsQFZizE/Tra3fKvAoy037kOyU6cgz84n8f6zxngLOV4O32kTwt9FcLCxAqw0P/c8rOr9y+Gfg==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.3.0.tgz", + "integrity": "sha512-NfbbPPg/74fT7wk2XYQ7hAIp9zJyZp5Fu19iRbORqqy1BhtrkZ0fPafBU+7bmn8ie69DpT0R6QpJIN2oisYjJg==", "requires": { - "kleur": "^3.0.2", - "sisteransi": "^1.0.0" + "kleur": "^3.0.3", + "sisteransi": "^1.0.3" } }, "prop-types": { @@ -10458,10 +11471,15 @@ "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=" }, + "pseudomap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", + "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=" + }, "psl": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.2.0.tgz", - "integrity": "sha512-GEn74ZffufCmkDDLNcl3uuyF/aSD6exEyh1v/ZSdAomB82t6G9hzJVRx0jBmLDW+VfZqks3aScmMw9DszwUalA==" + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.7.0.tgz", + "integrity": "sha512-5NsSEDv8zY70ScRnOTn7bK7eanl2MvFrOrS/R6x+dBt5g1ghnj9Zv90kO8GwT8gxcu2ANyFprnFYB85IogIJOQ==" }, "public-encrypt": { "version": "4.0.3", @@ -10526,6 +11544,15 @@ "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==" }, + "query-string": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/query-string/-/query-string-4.3.4.tgz", + "integrity": "sha1-u7aTucqRXCMlFbIosaArYJBD2+s=", + "requires": { + "object-assign": "^4.1.0", + "strict-uri-encode": "^1.0.0" + } + }, "querystring": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", @@ -10601,30 +11628,31 @@ } }, "rc-animate": { - "version": "2.9.2", - "resolved": "https://registry.npmjs.org/rc-animate/-/rc-animate-2.9.2.tgz", - "integrity": "sha512-rkJjeJgfbDqVjVX1/QTRfS7PiCq3AnmeYo840cVcuC4pXq4k4yAQMsC2v5BPXXdawC04vnyO4/qHQdbx9ANaiw==", + "version": "2.10.2", + "resolved": "https://registry.npmjs.org/rc-animate/-/rc-animate-2.10.2.tgz", + "integrity": "sha512-cE/A7piAzoWFSgUD69NmmMraqCeqVBa51UErod8NS3LUEqWfppSVagHfa0qHAlwPVPiIBg3emRONyny3eiH0Dg==", "requires": { "babel-runtime": "6.x", "classnames": "^2.2.6", "css-animation": "^1.3.2", "prop-types": "15.x", "raf": "^3.4.0", - "rc-util": "^4.8.0", + "rc-util": "^4.15.3", "react-lifecycles-compat": "^3.0.4" } }, "rc-slider": { - "version": "8.6.13", - "resolved": "https://registry.npmjs.org/rc-slider/-/rc-slider-8.6.13.tgz", - "integrity": "sha512-fCUe8pPn8n9pq1ARX44nN2nzJoATtna4x/PdskUrxIvZXN8ja7HuceN/hq6kokZjo3FBD2B1yMZvZh6oi68l6Q==", + "version": "8.7.1", + "resolved": "https://registry.npmjs.org/rc-slider/-/rc-slider-8.7.1.tgz", + "integrity": "sha512-WMT5mRFUEcrLWwTxsyS8jYmlaMsTVCZIGENLikHsNv+tE8ThU2lCoPfi/xFNUfJFNFSBFP3MwPez9ZsJmNp13g==", "requires": { "babel-runtime": "6.x", "classnames": "^2.2.5", "prop-types": "^15.5.4", "rc-tooltip": "^3.7.0", "rc-util": "^4.0.4", - "shallowequal": "^1.0.1", + "react-lifecycles-compat": "^3.0.4", + "shallowequal": "^1.1.0", "warning": "^4.0.3" } }, @@ -10653,76 +11681,65 @@ } }, "rc-util": { - "version": "4.8.2", - "resolved": "https://registry.npmjs.org/rc-util/-/rc-util-4.8.2.tgz", - "integrity": "sha512-EXKOIvhMYABd4Ww1NQF++YKgzyMPz6VWvD/FIVqTUJR+3AGTuXDEzOPZ9/jMRkQcNS9aqpuRXc3Ad8cPVIMMQA==", + "version": "4.18.1", + "resolved": "https://registry.npmjs.org/rc-util/-/rc-util-4.18.1.tgz", + "integrity": "sha512-3aRHG32ZvqBymtJUGoQnbZS+XANzO6XTiFEFAYI3BfuxESEazopAy0kBwcAI6BlLHsW1oLiy3ysE9uYwylh2ag==", "requires": { "add-dom-event-listener": "^1.1.0", "babel-runtime": "6.x", "prop-types": "^15.5.10", "react-lifecycles-compat": "^3.0.4", - "shallowequal": "^0.2.2" - }, - "dependencies": { - "shallowequal": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/shallowequal/-/shallowequal-0.2.2.tgz", - "integrity": "sha1-HjL9W8q2rWiKSBLLDMBO/HXHAU4=", - "requires": { - "lodash.keys": "^3.1.2" - } - } + "shallowequal": "^1.1.0" } }, "re-resizable": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/re-resizable/-/re-resizable-5.0.1.tgz", - "integrity": "sha512-Iy8v5li7bhNBDxCN1DbA4l6G2Hk8NCZtcExoI1D+5pfvKyQcH8LH2P5h3DGoEfHhs0uyyRC1Qx8bHBomfrmxgA==", + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/re-resizable/-/re-resizable-6.1.1.tgz", + "integrity": "sha512-ngzX5xbXi9LlIghJUYZaBDkJUIMLYqO3tQ2cJZoNprCRGhfHnbyufKm51MZRIOBlLigLzPPFKBxQE8ZLezKGfA==", "requires": { "fast-memoize": "^2.5.1" } }, "react": { - "version": "16.8.6", - "resolved": "https://registry.npmjs.org/react/-/react-16.8.6.tgz", - "integrity": "sha512-pC0uMkhLaHm11ZSJULfOBqV4tIZkx87ZLvbbQYunNixAAvjnC+snJCg0XQXn9VIsttVsbZP/H/ewzgsd5fxKXw==", + "version": "16.12.0", + "resolved": "https://registry.npmjs.org/react/-/react-16.12.0.tgz", + "integrity": "sha512-fglqy3k5E+81pA8s+7K0/T3DBCF0ZDOher1elBFzF7O6arXJgzyu/FW+COxFvAWXJoJN9KIZbT2LXlukwphYTA==", "requires": { "loose-envify": "^1.1.0", "object-assign": "^4.1.1", - "prop-types": "^15.6.2", - "scheduler": "^0.13.6" + "prop-types": "^15.6.2" } }, "react-app-polyfill": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/react-app-polyfill/-/react-app-polyfill-1.0.1.tgz", - "integrity": "sha512-LbVpT1NdzTdDDs7xEZdebjDrqsvKi5UyVKUQqtTYYNyC1JJYVAwNQWe4ybWvoT2V2WW9PGVO2u5Y6aVj4ER/Ow==", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/react-app-polyfill/-/react-app-polyfill-1.0.5.tgz", + "integrity": "sha512-RcbV6+msbvZJZUIK/LX3UafPtoaDSJgUWu4sqBxHKTVmBsnlU2QWCKJRBRmgjxu+ivW/GPINbPWRM4Ppa6Lbgw==", "requires": { - "core-js": "3.0.1", - "object-assign": "4.1.1", - "promise": "8.0.2", - "raf": "3.4.1", - "regenerator-runtime": "0.13.2", - "whatwg-fetch": "3.0.0" + "core-js": "^3.4.1", + "object-assign": "^4.1.1", + "promise": "^8.0.3", + "raf": "^3.4.1", + "regenerator-runtime": "^0.13.3", + "whatwg-fetch": "^3.0.0" }, "dependencies": { "core-js": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.0.1.tgz", - "integrity": "sha512-sco40rF+2KlE0ROMvydjkrVMMG1vYilP2ALoRXcYR4obqbYIuV3Bg+51GEDW+HF8n7NRA+iaA4qD0nD9lo9mew==" + "version": "3.6.3", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.6.3.tgz", + "integrity": "sha512-DOO9b18YHR+Wk5kJ/c5YFbXuUETreD4TrvXb6edzqZE3aAEd0eJIAWghZ9HttMuiON8SVCnU3fqA4rPxRDD1HQ==" }, "promise": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/promise/-/promise-8.0.2.tgz", - "integrity": "sha512-EIyzM39FpVOMbqgzEHhxdrEhtOSDOtjMZQ0M6iVfCE+kWNgCkAyOdnuCWqfmflylftfadU6FkiMgHZA2kUzwRw==", + "version": "8.0.3", + "resolved": "https://registry.npmjs.org/promise/-/promise-8.0.3.tgz", + "integrity": "sha512-HeRDUL1RJiLhyA0/grn+PTShlBAcLuh/1BJGtrvjwbvRDCTLLMEz9rOGCV+R3vHY4MixIuoMEd9Yq/XvsTPcjw==", "requires": { "asap": "~2.0.6" } }, "regenerator-runtime": { - "version": "0.13.2", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.2.tgz", - "integrity": "sha512-S/TQAZJO+D3m9xeN1WTI8dLKBBiRgXBlTJvbWjCThHWZj9EvHK70Ff50/tYj2J/fvBY6JtFVwRuazHN2E7M9BA==" + "version": "0.13.3", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.3.tgz", + "integrity": "sha512-naKIZz2GQ8JWh///G7L3X6LaQUAMp2lvb1rvwwsURe/VXwD6VMfr+/1NuNw3ag8v2kY1aQ/go5SNn79O9JU7yw==" } } }, @@ -10738,24 +11755,24 @@ } }, "react-bootstrap": { - "version": "1.0.0-beta.9", - "resolved": "https://registry.npmjs.org/react-bootstrap/-/react-bootstrap-1.0.0-beta.9.tgz", - "integrity": "sha512-M0BYLuuUdMITJ16+DDDb1p4vWV87csEBi/uOxZYODuDZh7hvbrJVahfvPXcqeqq4eEpNL+PKSlqb9fNaY0HZyA==", + "version": "1.0.0-beta.16", + "resolved": "https://registry.npmjs.org/react-bootstrap/-/react-bootstrap-1.0.0-beta.16.tgz", + "integrity": "sha512-wjb+3CwviDWAaz4O3gQpd2XMDNqbOiqOOzpLm5aLPcp1wTsQsVRhyM+rTPmO3hYU8auA2eNpTYLz08/fAcMqDA==", "requires": { "@babel/runtime": "^7.4.2", - "@react-bootstrap/react-popper": "1.2.1", "@restart/context": "^2.1.4", - "@restart/hooks": "^0.3.0", + "@restart/hooks": "^0.3.11", + "@types/react": "^16.8.23", "classnames": "^2.2.6", - "dom-helpers": "^3.4.0", + "dom-helpers": "^5.1.2", "invariant": "^2.2.4", "keycode": "^2.2.0", - "popper.js": "^1.14.7", + "popper.js": "^1.16.0", "prop-types": "^15.7.2", "prop-types-extra": "^1.1.0", - "react-overlays": "^1.2.0", + "react-overlays": "^2.1.0", "react-transition-group": "^4.0.0", - "uncontrollable": "^6.1.0", + "uncontrollable": "^7.0.0", "warning": "^4.0.3" } }, @@ -10768,11 +11785,6 @@ "prop-types": "^15.6.2" } }, - "react-context-toolbox": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/react-context-toolbox/-/react-context-toolbox-2.0.2.tgz", - "integrity": "sha512-tY4j0imkYC3n5ZlYSgFkaw7fmlCp3IoQQ6DxpqeNHzcD0hf+6V+/HeJxviLUZ1Rv1Yn3N3xyO2EhkkZwHn0m1A==" - }, "react-d3": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/react-d3/-/react-d3-0.4.0.tgz", @@ -10783,64 +11795,84 @@ } }, "react-dev-utils": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/react-dev-utils/-/react-dev-utils-9.0.1.tgz", - "integrity": "sha512-pnaeMo/Pxel8aZpxk1WwxT3uXxM3tEwYvsjCYn5R7gNxjhN1auowdcLDzFB8kr7rafAj2rxmvfic/fbac5CzwQ==", + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/react-dev-utils/-/react-dev-utils-10.0.0.tgz", + "integrity": "sha512-8OKSJvl8ccXJDNf0YGw377L9v1OnT16skD/EuZWm0M/yr255etP4x4kuUCT1EfFfJ7Rhc4ZTpPTfPrvgiXa50Q==", "requires": { - "@babel/code-frame": "7.0.0", - "address": "1.0.3", - "browserslist": "4.5.4", + "@babel/code-frame": "7.5.5", + "address": "1.1.2", + "browserslist": "4.7.3", "chalk": "2.4.2", "cross-spawn": "6.0.5", "detect-port-alt": "1.1.6", "escape-string-regexp": "1.0.5", "filesize": "3.6.1", "find-up": "3.0.0", - "fork-ts-checker-webpack-plugin": "1.1.1", + "fork-ts-checker-webpack-plugin": "3.1.0", "global-modules": "2.0.0", "globby": "8.0.2", - "gzip-size": "5.0.0", + "gzip-size": "5.1.1", "immer": "1.10.0", - "inquirer": "6.2.2", - "is-root": "2.0.0", + "inquirer": "6.5.0", + "is-root": "2.1.0", "loader-utils": "1.2.3", - "opn": "5.4.0", + "open": "^7.0.0", "pkg-up": "2.0.0", - "react-error-overlay": "^5.1.6", + "react-error-overlay": "^6.0.4", "recursive-readdir": "2.2.2", - "shell-quote": "1.6.1", - "sockjs-client": "1.3.0", + "shell-quote": "1.7.2", "strip-ansi": "5.2.0", "text-table": "0.2.0" }, "dependencies": { "@babel/code-frame": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.0.0.tgz", - "integrity": "sha512-OfC2uemaknXr87bdLUkWog7nYuliM9Ij5HUcajsVcMCpQrcLmtxRbVFTIqmcSkSeYRBFBRxs2FiUqFJDLdiebA==", + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.5.5.tgz", + "integrity": "sha512-27d4lZoomVyo51VegxI20xZPuSHusqbQag/ztrBC7wegWoQ1nLREPVSKSW8byhTlzTKyNE4ifaTA6lCp7JjpFw==", "requires": { "@babel/highlight": "^7.0.0" } }, + "ansi-escapes": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz", + "integrity": "sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==" + }, "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==" + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" }, "browserslist": { - "version": "4.5.4", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.5.4.tgz", - "integrity": "sha512-rAjx494LMjqKnMPhFkuLmLp8JWEX0o8ADTGeAbOqaF+XCvYLreZrG5uVjnPBlAQ8REZK4pzXGvp0bWgrFtKaag==", + "version": "4.7.3", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.7.3.tgz", + "integrity": "sha512-jWvmhqYpx+9EZm/FxcZSbUZyDEvDTLDi3nSAKbzEkyWvtI0mNSmUosey+5awDW1RUlrgXbQb5A6qY1xQH9U6MQ==", "requires": { - "caniuse-lite": "^1.0.30000955", - "electron-to-chromium": "^1.3.122", - "node-releases": "^1.1.13" + "caniuse-lite": "^1.0.30001010", + "electron-to-chromium": "^1.3.306", + "node-releases": "^1.1.40" + } + }, + "cli-cursor": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", + "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=", + "requires": { + "restore-cursor": "^2.0.0" + } + }, + "figures": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", + "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=", + "requires": { + "escape-string-regexp": "^1.0.5" } }, "inquirer": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-6.2.2.tgz", - "integrity": "sha512-Z2rREiXA6cHRR9KBOarR3WuLlFzlIfAEIiB45ll5SSadMg7WqOh1MKEjjndfuH5ewXdixWCxqnVfGOQzPeiztA==", + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-6.5.0.tgz", + "integrity": "sha512-scfHejeG/lVZSpvCXpsB4j/wQNPM5JC8kiElOI0OUTwmc1RTpXr4H32/HOlQHcZiYl2z2VElwuCVDRG8vFmbnA==", "requires": { "ansi-escapes": "^3.2.0", "chalk": "^2.4.2", @@ -10848,21 +11880,64 @@ "cli-width": "^2.0.0", "external-editor": "^3.0.3", "figures": "^2.0.0", - "lodash": "^4.17.11", + "lodash": "^4.17.12", "mute-stream": "0.0.7", "run-async": "^2.2.0", "rxjs": "^6.4.0", "string-width": "^2.1.0", - "strip-ansi": "^5.0.0", + "strip-ansi": "^5.1.0", "through": "^2.3.6" } }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" + }, + "mimic-fn": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", + "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==" + }, + "mute-stream": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz", + "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=" + }, + "onetime": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", + "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", "requires": { - "ansi-regex": "^4.1.0" + "mimic-fn": "^1.0.0" + } + }, + "restore-cursor": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", + "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=", + "requires": { + "onetime": "^2.0.0", + "signal-exit": "^3.0.2" + } + }, + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "requires": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + }, + "dependencies": { + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "requires": { + "ansi-regex": "^3.0.0" + } + } } } } @@ -10873,49 +11948,49 @@ "integrity": "sha512-zvU6iouW+SWwHTyThwxGICjJYCMZFk/6r/+jmOdC7ntQoPlS/Pqb81MkxaMf2bHTSq9TN3K3zX2/ayMW/jCtyA==" }, "react-dnd": { - "version": "9.3.2", - "resolved": "https://registry.npmjs.org/react-dnd/-/react-dnd-9.3.2.tgz", - "integrity": "sha512-3xwrd+z25CplNmO1j6BmvFlL72fK0IjW0WqCV7NCYLvKCjomZLhf3ZPAfCyCOSP9riTglnh53OV47M3ydo25ZA==", + "version": "9.5.1", + "resolved": "https://registry.npmjs.org/react-dnd/-/react-dnd-9.5.1.tgz", + "integrity": "sha512-j2MvziPNLsxXkb3kIJzLvvOv/TQ4sysp6U4CmxAXd4C884dXm/9UGdB7K1wkTW3ZxVpI1K7XhKbX0JgNlPfLcA==", "requires": { "@types/hoist-non-react-statics": "^3.3.1", "@types/shallowequal": "^1.1.1", - "dnd-core": "^9.3.2", + "dnd-core": "^9.5.1", "hoist-non-react-statics": "^3.3.0", "shallowequal": "^1.1.0" } }, "react-dnd-html5-backend": { - "version": "9.3.2", - "resolved": "https://registry.npmjs.org/react-dnd-html5-backend/-/react-dnd-html5-backend-9.3.2.tgz", - "integrity": "sha512-EsQLA3fikHxkkvs6COnEdo3McJg2Q82z6EQxo7s3yqez4LAutrcp7pf5/eyW1nFDcdN3JNx2p+TrkjVjEd5exw==", + "version": "9.5.1", + "resolved": "https://registry.npmjs.org/react-dnd-html5-backend/-/react-dnd-html5-backend-9.5.1.tgz", + "integrity": "sha512-wUdzjREwLqHxFkA6E+XDVL5IFjRDbBI3SHVKil9n3qrGT5dm2tA2oi1aIALdfMKsu00c+OXA9lz/LuKZCE9KXg==", "requires": { - "dnd-core": "^9.3.2" + "dnd-core": "^9.5.1" } }, "react-dom": { - "version": "16.8.6", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-16.8.6.tgz", - "integrity": "sha512-1nL7PIq9LTL3fthPqwkvr2zY7phIPjYrT0jp4HjyEQrEROnw4dG41VVwi/wfoCneoleqrNX7iAD+pXebJZwrwA==", + "version": "16.12.0", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-16.12.0.tgz", + "integrity": "sha512-LMxFfAGrcS3kETtQaCkTKjMiifahaMySFDn71fZUNpPHZQEzmk/GiAeIT8JSOrHB23fnuCOMruL2a8NYlw+8Gw==", "requires": { "loose-envify": "^1.1.0", "object-assign": "^4.1.1", "prop-types": "^15.6.2", - "scheduler": "^0.13.6" + "scheduler": "^0.18.0" } }, "react-draggable": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/react-draggable/-/react-draggable-3.3.0.tgz", - "integrity": "sha512-U7/jD0tAW4T0S7DCPK0kkKLyL0z61sC/eqU+NUfDjnq+JtBKaYKDHpsK2wazctiA4alEzCXUnzkREoxppOySVw==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/react-draggable/-/react-draggable-4.2.0.tgz", + "integrity": "sha512-5wFq//gEoeTYprnd4ze8GrFc+Rbnx+9RkOMR3vk4EbWxj02U6L6T3yrlKeiw4X5CtjD2ma2+b3WujghcXNRzkw==", "requires": { "classnames": "^2.2.5", "prop-types": "^15.6.0" } }, "react-error-overlay": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/react-error-overlay/-/react-error-overlay-5.1.6.tgz", - "integrity": "sha512-X1Y+0jR47ImDVr54Ab6V9eGk0Hnu7fVWGeHQSOXHf/C2pF9c6uy3gef8QUeuUiWlNb0i08InPSE5a/KJzNzw1Q==" + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/react-error-overlay/-/react-error-overlay-6.0.4.tgz", + "integrity": "sha512-ueZzLmHltszTshDMwyfELDq8zOA803wQ1ZuzCccXa1m57k1PxSHfflPD5W9YIiTXLs0JTLzoj6o1LuM5N6zzNA==" }, "react-fullscreenable": { "version": "2.5.1-0", @@ -10928,9 +12003,9 @@ } }, "react-grid-system": { - "version": "4.4.10", - "resolved": "https://registry.npmjs.org/react-grid-system/-/react-grid-system-4.4.10.tgz", - "integrity": "sha512-ZSmQ+284QOYqDKkb5kbaFUWsuczLMQmlkAYNVv2UorG1z177UxQPYcCwmzKXpuGascksImuLpitpMpnn0UacXg==", + "version": "4.4.11", + "resolved": "https://registry.npmjs.org/react-grid-system/-/react-grid-system-4.4.11.tgz", + "integrity": "sha512-ehaQLEi4WyX/DfjD6bUf2Y6I60T28YpJUJhcEoM+YcTeXqgNqVyp3Prq4cYryV9bYKzK046d6dff2VwnopojNg==", "requires": { "prop-types": "^15.7.2" } @@ -10967,63 +12042,33 @@ } }, "react-overlays": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/react-overlays/-/react-overlays-1.2.0.tgz", - "integrity": "sha512-i/FCV8wR6aRaI+Kz/dpJhOdyx+ah2tN1RhT9InPrexyC4uzf3N4bNayFTGtUeQVacj57j1Mqh1CwV60/5153Iw==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/react-overlays/-/react-overlays-2.1.0.tgz", + "integrity": "sha512-tHPGTZosbQSo82yb9x4YCsmJJtspKvAPL5kXVnyoB2Z5UoAU3VetIuh2VblfVT408us5nLJd9uDtwI3xWDHS6w==", "requires": { - "classnames": "^2.2.6", - "dom-helpers": "^3.4.0", - "prop-types": "^15.6.2", - "prop-types-extra": "^1.1.0", - "react-context-toolbox": "^2.0.2", - "react-popper": "^1.3.2", - "uncontrollable": "^6.0.0", - "warning": "^4.0.2" - } - }, - "react-popper": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/react-popper/-/react-popper-1.3.3.tgz", - "integrity": "sha512-ynMZBPkXONPc5K4P5yFWgZx5JGAUIP3pGGLNs58cfAPgK67olx7fmLp+AdpZ0+GoQ+ieFDa/z4cdV6u7sioH6w==", - "requires": { - "@babel/runtime": "^7.1.2", - "create-react-context": "<=0.2.2", - "popper.js": "^1.14.4", - "prop-types": "^15.6.1", - "typed-styles": "^0.0.7", - "warning": "^4.0.2" - }, - "dependencies": { - "create-react-context": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/create-react-context/-/create-react-context-0.2.2.tgz", - "integrity": "sha512-KkpaLARMhsTsgp0d2NA/R94F/eDLbhXERdIq3LvX2biCAXcDvHYoOqHfWCHf1+OLj+HKBotLG3KqaOOf+C1C+A==", - "requires": { - "fbjs": "^0.8.0", - "gud": "^1.0.0" - } - }, - "typed-styles": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/typed-styles/-/typed-styles-0.0.7.tgz", - "integrity": "sha512-pzP0PWoZUhsECYjABgCGQlRGL1n7tOHsgwYv3oIiEpJwGhFTuty/YNeduxQYzXXa3Ge5BdT6sHYIQYpl4uJ+5Q==" - } + "@babel/runtime": "^7.4.5", + "@restart/hooks": "^0.3.12", + "dom-helpers": "^5.1.0", + "popper.js": "^1.15.0", + "prop-types": "^15.7.2", + "uncontrollable": "^7.0.0", + "warning": "^4.0.3" } }, "react-rnd": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/react-rnd/-/react-rnd-10.0.0.tgz", - "integrity": "sha512-JLN5f17dvp8niAvNPSiPgbdXyOgMXz/0ADs8feBtE7C+lkvsfrvvzvudhGJnpe7Rd9kXW/MWEJHvkEmKkdN8aQ==", + "version": "10.1.4", + "resolved": "https://registry.npmjs.org/react-rnd/-/react-rnd-10.1.4.tgz", + "integrity": "sha512-m2k5jYNcqhxUfUqnzp0Dj4hfqCnGgkMrCsCDAl+jspNrkz/u3Kpj/GyKFYhPdI3CCaY+25lwfTEP3rAMbb9IxA==", "requires": { - "re-resizable": "5.0.1", - "react-draggable": "3.3.0", + "re-resizable": "6.1.1", + "react-draggable": "4.2.0", "tslib": "1.10.0" } }, "react-router": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/react-router/-/react-router-5.0.1.tgz", - "integrity": "sha512-EM7suCPNKb1NxcTZ2LEOWFtQBQRQXecLxVpdsP4DW4PbbqYWeRiLyV/Tt1SdCrvT2jcyXAXmVTmzvSzrPR63Bg==", + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-5.1.2.tgz", + "integrity": "sha512-yjEuMFy1ONK246B+rsa0cUam5OeAQ8pyclRDgpxuSCrAlJ1qN9uZ5IgyKC7gQg0w8OM50NXHEegPh/ks9YuR2A==", "requires": { "@babel/runtime": "^7.1.2", "history": "^4.9.0", @@ -11038,133 +12083,101 @@ } }, "react-router-dom": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-5.0.1.tgz", - "integrity": "sha512-zaVHSy7NN0G91/Bz9GD4owex5+eop+KvgbxXsP/O+iW1/Ln+BrJ8QiIR5a6xNPtrdTvLkxqlDClx13QO1uB8CA==", + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-5.1.2.tgz", + "integrity": "sha512-7BPHAaIwWpZS074UKaw1FjVdZBSVWEk8IuDXdB+OkLb8vd/WRQIpA4ag9WQk61aEfQs47wHyjWUoUGGZxpQXew==", "requires": { "@babel/runtime": "^7.1.2", "history": "^4.9.0", "loose-envify": "^1.3.1", "prop-types": "^15.6.2", - "react-router": "5.0.1", + "react-router": "5.1.2", "tiny-invariant": "^1.0.2", "tiny-warning": "^1.0.0" } }, "react-scripts": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/react-scripts/-/react-scripts-3.0.1.tgz", - "integrity": "sha512-LKEjBhVpEB+c312NeJhzF+NATxF7JkHNr5GhtwMeRS1cMeLElMeIu8Ye7WGHtDP7iz7ra4ryy48Zpo6G/cwWUw==", + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/react-scripts/-/react-scripts-3.3.0.tgz", + "integrity": "sha512-hzPc6bxCc9GnsspWqk494c2Gpd0dRbk/C8q76BNQIENi9GMwoxFljOEcZoZcpFpJgQ45alxFR6QaLt+51qie7g==", "requires": { - "@babel/core": "7.4.3", - "@svgr/webpack": "4.1.0", - "@typescript-eslint/eslint-plugin": "1.6.0", - "@typescript-eslint/parser": "1.6.0", - "babel-eslint": "10.0.1", - "babel-jest": "^24.8.0", - "babel-loader": "8.0.5", - "babel-plugin-named-asset-import": "^0.3.2", - "babel-preset-react-app": "^9.0.0", - "camelcase": "^5.2.0", + "@babel/core": "7.7.4", + "@svgr/webpack": "4.3.3", + "@typescript-eslint/eslint-plugin": "^2.8.0", + "@typescript-eslint/parser": "^2.8.0", + "babel-eslint": "10.0.3", + "babel-jest": "^24.9.0", + "babel-loader": "8.0.6", + "babel-plugin-named-asset-import": "^0.3.5", + "babel-preset-react-app": "^9.1.0", + "camelcase": "^5.3.1", "case-sensitive-paths-webpack-plugin": "2.2.0", - "css-loader": "2.1.1", - "dotenv": "6.2.0", - "dotenv-expand": "4.2.0", - "eslint": "^5.16.0", - "eslint-config-react-app": "^4.0.1", - "eslint-loader": "2.1.2", - "eslint-plugin-flowtype": "2.50.1", - "eslint-plugin-import": "2.16.0", - "eslint-plugin-jsx-a11y": "6.2.1", - "eslint-plugin-react": "7.12.4", - "eslint-plugin-react-hooks": "^1.5.0", - "file-loader": "3.0.1", - "fs-extra": "7.0.1", - "fsevents": "2.0.6", + "css-loader": "3.2.0", + "dotenv": "8.2.0", + "dotenv-expand": "5.1.0", + "eslint": "^6.6.0", + "eslint-config-react-app": "^5.1.0", + "eslint-loader": "3.0.2", + "eslint-plugin-flowtype": "3.13.0", + "eslint-plugin-import": "2.18.2", + "eslint-plugin-jsx-a11y": "6.2.3", + "eslint-plugin-react": "7.16.0", + "eslint-plugin-react-hooks": "^1.6.1", + "file-loader": "4.3.0", + "fs-extra": "^8.1.0", + "fsevents": "2.1.2", "html-webpack-plugin": "4.0.0-beta.5", "identity-obj-proxy": "3.0.0", - "is-wsl": "^1.1.0", - "jest": "24.7.1", + "jest": "24.9.0", "jest-environment-jsdom-fourteen": "0.1.0", - "jest-resolve": "24.7.1", - "jest-watch-typeahead": "0.3.0", - "mini-css-extract-plugin": "0.5.0", - "optimize-css-assets-webpack-plugin": "5.0.1", - "pnp-webpack-plugin": "1.2.1", + "jest-resolve": "24.9.0", + "jest-watch-typeahead": "0.4.2", + "mini-css-extract-plugin": "0.8.0", + "optimize-css-assets-webpack-plugin": "5.0.3", + "pnp-webpack-plugin": "1.5.0", "postcss-flexbugs-fixes": "4.1.0", "postcss-loader": "3.0.0", - "postcss-normalize": "7.0.1", - "postcss-preset-env": "6.6.0", + "postcss-normalize": "8.0.1", + "postcss-preset-env": "6.7.0", "postcss-safe-parser": "4.0.1", - "react-app-polyfill": "^1.0.1", - "react-dev-utils": "^9.0.1", - "resolve": "1.10.0", - "sass-loader": "7.1.0", - "semver": "6.0.0", - "style-loader": "0.23.1", - "terser-webpack-plugin": "1.2.3", - "ts-pnp": "1.1.2", - "url-loader": "1.1.2", - "webpack": "4.29.6", - "webpack-dev-server": "3.2.1", - "webpack-manifest-plugin": "2.0.4", - "workbox-webpack-plugin": "4.2.0" + "react-app-polyfill": "^1.0.5", + "react-dev-utils": "^10.0.0", + "resolve": "1.12.2", + "resolve-url-loader": "3.1.1", + "sass-loader": "8.0.0", + "semver": "6.3.0", + "style-loader": "1.0.0", + "terser-webpack-plugin": "2.2.1", + "ts-pnp": "1.1.5", + "url-loader": "2.3.0", + "webpack": "4.41.2", + "webpack-dev-server": "3.9.0", + "webpack-manifest-plugin": "2.2.0", + "workbox-webpack-plugin": "4.3.1" } }, "react-sortable-tree": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/react-sortable-tree/-/react-sortable-tree-2.6.2.tgz", - "integrity": "sha512-mYX6ByTs7fywPqTEWpEUMgtvLDVyVrkm1Tw/pOPteiLwwMnOqh1LxBwJPUJBmhU2E0P2Zvw3dhnBFL14Fe4EkA==", + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/react-sortable-tree/-/react-sortable-tree-2.7.1.tgz", + "integrity": "sha512-J78/6AXv9RN0XxoBAIDz8a7aNFdi/Mezcv/9lKNYTYzqAWxEyOTMeqZjpmvwLhM2HRpChTn0yYLHTdRSNHRACw==", "requires": { "frontend-collective-react-dnd-scrollzone": "^1.0.2", "lodash.isequal": "^4.5.0", "prop-types": "^15.6.1", - "react-dnd": "^7.3.0", - "react-dnd-html5-backend": "^7.0.1", + "react-dnd": "^9.3.4", + "react-dnd-html5-backend": "^9.3.4", "react-lifecycles-compat": "^3.0.4", "react-sortable-tree": "^2.6.0", "react-virtualized": "^9.19.1" - }, - "dependencies": { - "dnd-core": { - "version": "7.7.0", - "resolved": "https://registry.npmjs.org/dnd-core/-/dnd-core-7.7.0.tgz", - "integrity": "sha512-+YqwflWEY1MEAEl2QiEiRaglYkCwIZryyQwximQGuTOm/ns7fS6Lg/i7OCkrtjM10D5FhArf/VUHIL4ZaRBK0g==", - "requires": { - "asap": "^2.0.6", - "invariant": "^2.2.4", - "redux": "^4.0.1" - } - }, - "react-dnd": { - "version": "7.7.0", - "resolved": "https://registry.npmjs.org/react-dnd/-/react-dnd-7.7.0.tgz", - "integrity": "sha512-anpJDKMgdXE6kXvtBFmIAe1fuaexpVy7meUyNjiTfCnjQ1mRvnttGTVvcW9fMKijsUQYadiyvzd3BRxteFuVXg==", - "requires": { - "@types/hoist-non-react-statics": "^3.3.1", - "dnd-core": "^7.7.0", - "hoist-non-react-statics": "^3.3.0", - "invariant": "^2.1.0", - "shallowequal": "^1.1.0" - } - }, - "react-dnd-html5-backend": { - "version": "7.7.0", - "resolved": "https://registry.npmjs.org/react-dnd-html5-backend/-/react-dnd-html5-backend-7.7.0.tgz", - "integrity": "sha512-JgKmWOxqorFyfGPeWV+SAPhVGFe6+LrOR24jETE9rrYZU5hCppzwK9ujjS508kWibeDvbfEgi9j5qC2wB1/MoQ==", - "requires": { - "dnd-core": "^7.7.0" - } - } } }, "react-svg-pan-zoom": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/react-svg-pan-zoom/-/react-svg-pan-zoom-3.1.0.tgz", - "integrity": "sha512-hmDUarqhNnCwuZumV9Pw7o5inW7lda4sX2U1vDK2B2slrSfNu1jbelOp6aaOEyUF7WzMA1xrpH6NBWvk4UeUTQ==", + "version": "3.8.0", + "resolved": "https://registry.npmjs.org/react-svg-pan-zoom/-/react-svg-pan-zoom-3.8.0.tgz", + "integrity": "sha512-s92QDFJuRrp784aQZKX8qxukMY/85IpOXO5Bjbn1G/CoNapdHCRVAHynPP6Ea9cyMmycSmu6paPqUIAW3i5s9Q==", "requires": { "prop-types": "^15.7.2", - "transformation-matrix": "^2.0.0" + "transformation-matrix": "^2.2.0" } }, "react-textarea-autosize": { @@ -11176,25 +12189,24 @@ } }, "react-transition-group": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-4.2.1.tgz", - "integrity": "sha512-IXrPr93VzCPupwm2O6n6C2kJIofJ/Rp5Ltihhm9UfE8lkuVX2ng/SUUl/oWjblybK9Fq2Io7LGa6maVqPB762Q==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-4.3.0.tgz", + "integrity": "sha512-1qRV1ZuVSdxPlPf4O8t7inxUGpdyO5zG9IoNfJxSO0ImU2A1YWkEQvFPuIPZmMLkg5hYs7vv5mMOyfgSkvAwvw==", "requires": { - "@babel/runtime": "^7.4.5", - "dom-helpers": "^3.4.0", + "@babel/runtime": "^7.5.5", + "dom-helpers": "^5.0.1", "loose-envify": "^1.4.0", "prop-types": "^15.6.2" } }, "react-virtualized": { - "version": "9.21.1", - "resolved": "https://registry.npmjs.org/react-virtualized/-/react-virtualized-9.21.1.tgz", - "integrity": "sha512-E53vFjRRMCyUTEKuDLuGH1ld/9TFzjf/fFW816PE4HFXWZorESbSTYtiZz1oAjra0MminaUU1EnvUxoGuEFFPA==", + "version": "9.21.2", + "resolved": "https://registry.npmjs.org/react-virtualized/-/react-virtualized-9.21.2.tgz", + "integrity": "sha512-oX7I7KYiUM7lVXQzmhtF4Xg/4UA5duSA+/ZcAvdWlTLFCoFYq1SbauJT5gZK9cZS/wdYR6TPGpX/dqzvTqQeBA==", "requires": { "babel-runtime": "^6.26.0", "clsx": "^1.0.1", - "dom-helpers": "^2.4.0 || ^3.0.0", - "linear-layout-vector": "0.0.1", + "dom-helpers": "^5.0.0", "loose-envify": "^1.3.0", "prop-types": "^15.6.0", "react-lifecycles-compat": "^3.0.4" @@ -11259,10 +12271,29 @@ "minimatch": "3.0.4" } }, + "redent": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz", + "integrity": "sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94=", + "requires": { + "indent-string": "^2.1.0", + "strip-indent": "^1.0.1" + }, + "dependencies": { + "indent-string": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz", + "integrity": "sha1-ji1INIdCEhtKghi3oTfppSBJ3IA=", + "requires": { + "repeating": "^2.0.0" + } + } + } + }, "redux": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/redux/-/redux-4.0.4.tgz", - "integrity": "sha512-vKv4WdiJxOWKxK0yRoaK3Y4pxxB0ilzVx6dszU2W8wLxlb2yikRph4iV/ymtdJ6ZxpBLFbyrxklnT5yBbQSl3Q==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/redux/-/redux-4.0.5.tgz", + "integrity": "sha512-VSz1uMAH24DM6MF72vcojpYPtrTUu3ByVWfPL1nPfVRb5mZVTve5GnNCUV53QM/BZ66xfWrm0CTWoM+Xlz8V1w==", "requires": { "loose-envify": "^1.4.0", "symbol-observable": "^1.2.0" @@ -11303,23 +12334,32 @@ "safe-regex": "^1.1.0" } }, - "regexp-tree": { - "version": "0.1.11", - "resolved": "https://registry.npmjs.org/regexp-tree/-/regexp-tree-0.1.11.tgz", - "integrity": "sha512-7/l/DgapVVDzZobwMCCgMlqiqyLFJ0cduo/j+3BcDJIB+yJdsYCfKuI3l/04NV+H/rfNRdPIDbXNZHM9XvQatg==" + "regex-parser": { + "version": "2.2.10", + "resolved": "https://registry.npmjs.org/regex-parser/-/regex-parser-2.2.10.tgz", + "integrity": "sha512-8t6074A68gHfU8Neftl0Le6KTDwfGAj7IyjPIMSfikI2wJUTHDMaIq42bUsfVnj8mhx0R+45rdUXHGpN164avA==" + }, + "regexp.prototype.flags": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.3.0.tgz", + "integrity": "sha512-2+Q0C5g951OlYlJz6yu5/M33IcsESLlLfsyIaLJaG4FA2r4yP8MvVMJUUP/fVBkSpbbbZlS5gynbEWLipiiXiQ==", + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.0-next.1" + } }, "regexpp": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-2.0.1.tgz", - "integrity": "sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw==" + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.0.0.tgz", + "integrity": "sha512-Z+hNr7RAVWxznLPuA7DIh8UNX1j9CDrUQxskw9IrBE1Dxue2lyXT+shqEIeLUjrokxIP8CMy1WkjgG3rTsd5/g==" }, "regexpu-core": { - "version": "4.5.4", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.5.4.tgz", - "integrity": "sha512-BtizvGtFQKGPUcTy56o3nk1bGRp4SZOTYrDtGNlqCQufptV5IkkLN6Emw+yunAJjzf+C9FQFtvq7IoA3+oMYHQ==", + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.6.0.tgz", + "integrity": "sha512-YlVaefl8P5BnFYOITTNzDvan1ulLOiXJzCNZxduTIosN17b87h3bvG9yHMoHaRuo88H4mQ06Aodj5VtYGGGiTg==", "requires": { "regenerate": "^1.4.0", - "regenerate-unicode-properties": "^8.0.2", + "regenerate-unicode-properties": "^8.1.0", "regjsgen": "^0.5.0", "regjsparser": "^0.6.0", "unicode-match-property-ecmascript": "^1.0.4", @@ -11327,14 +12367,14 @@ } }, "regjsgen": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.5.0.tgz", - "integrity": "sha512-RnIrLhrXCX5ow/E5/Mh2O4e/oa1/jW0eaBKTSy3LaCj+M3Bqvm97GWDp2yUtzIs4LEn65zR2yiYGFqb2ApnzDA==" + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.5.1.tgz", + "integrity": "sha512-5qxzGZjDs9w4tzT3TPhCJqWdCc3RLYwy9J2NB0nm5Lz+S273lvWcpjaTGHsT1dc6Hhfq41uSEOw8wBmxrKOuyg==" }, "regjsparser": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.6.0.tgz", - "integrity": "sha512-RQ7YyokLiQBomUJuUG8iGVvkgOLxwyZM8k6d3q5SAXpg4r5TZJZigKFvC6PpD+qQ98bCDC5YelPeA3EucDoNeQ==", + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.6.2.tgz", + "integrity": "sha512-E9ghzUtoLwDekPT0DYCp+c4h+bvuUpe6rRHCTYn6eGoqj1LgKXxT6I0Il4WbjhQkOghzi/V+y03bPKvbllL93Q==", "requires": { "jsesc": "~0.5.0" }, @@ -11384,6 +12424,11 @@ "nth-check": "~1.0.1" } }, + "css-what": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-2.1.3.tgz", + "integrity": "sha512-a+EPoD+uZiNfh+5fxw2nO9QwFa6nJe2Or35fGY6Ipw1R3R4AGz1d1TEZrCegvw2YTmZ0jXirGYlzxxpYSHwpEg==" + }, "domutils": { "version": "1.5.1", "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.5.1.tgz", @@ -11413,6 +12458,14 @@ "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=" }, + "repeating": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", + "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=", + "requires": { + "is-finite": "^1.0.0" + } + }, "request": { "version": "2.88.0", "resolved": "https://registry.npmjs.org/request/-/request-2.88.0.tgz", @@ -11457,19 +12510,19 @@ } }, "request-promise-core": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/request-promise-core/-/request-promise-core-1.1.2.tgz", - "integrity": "sha512-UHYyq1MO8GsefGEt7EprS8UrXsm1TxEvFUX1IMTuSLU2Rh7fTIdFtl8xD7JiEYiWU2dl+NYAjCTksTehQUxPag==", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/request-promise-core/-/request-promise-core-1.1.3.tgz", + "integrity": "sha512-QIs2+ArIGQVp5ZYbWD5ZLCY29D5CfWizP8eWnm8FoGD1TX61veauETVQbrV60662V0oFBkrDOuaBI8XgtuyYAQ==", "requires": { - "lodash": "^4.17.11" + "lodash": "^4.17.15" } }, "request-promise-native": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/request-promise-native/-/request-promise-native-1.0.7.tgz", - "integrity": "sha512-rIMnbBdgNViL37nZ1b3L/VfPOpSi0TqVDQPAvO6U14lMzOLrt5nilxCQqtDKhZeDiW0/hkCXGoQjhgJd/tCh6w==", + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/request-promise-native/-/request-promise-native-1.0.8.tgz", + "integrity": "sha512-dapwLGqkHtwL5AEbfenuzjTYg35Jd6KPytsC2/TLkVMz8rm+tNt72MGUWT1RP/aYawMpN6HqbNGBQaRcBtjQMQ==", "requires": { - "request-promise-core": "1.1.2", + "request-promise-core": "1.1.3", "stealthy-require": "^1.1.1", "tough-cookie": "^2.3.3" } @@ -11484,20 +12537,15 @@ "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==" }, - "requireindex": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/requireindex/-/requireindex-1.2.0.tgz", - "integrity": "sha512-L9jEkOi3ASd9PYit2cwRfyppc9NoABujTP8/5gFcbERmo5jUoAKovIC3fsF17pkTnGsrByysqX+Kxd2OTNI1ww==" - }, "requires-port": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=" }, "resolve": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.10.0.tgz", - "integrity": "sha512-3sUr9aq5OfSg2S9pNtPA9hL1FVEAjvfOC4leW0SNf/mpnaakz2a9femSd6LqAww2RaFctwyf1lCqnTHuF1rxDg==", + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.12.2.tgz", + "integrity": "sha512-cAVTI2VLHWYsGOirfeYVVQ7ZDejtQ9fp4YhYckWDEkFfqbVjaT11iM8k6xSAfGFMM+gDpZjMnFssPu8we+mqFw==", "requires": { "path-parse": "^1.0.6" } @@ -11516,21 +12564,58 @@ "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=" }, "resolve-pathname": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/resolve-pathname/-/resolve-pathname-2.2.0.tgz", - "integrity": "sha512-bAFz9ld18RzJfddgrO2e/0S2O81710++chRMUxHjXOYKF6jTAMrUNZrEZ1PvV0zlhfjidm08iRPdTLPno1FuRg==" + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-pathname/-/resolve-pathname-3.0.0.tgz", + "integrity": "sha512-C7rARubxI8bXFNB/hqcp/4iUeIXJhJZvFPFPiSPRnhU5UPxzMFIl+2E6yY6c4k9giDJAhtV+enfA+G89N6Csng==" }, "resolve-url": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=" }, - "restore-cursor": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", - "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=", + "resolve-url-loader": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/resolve-url-loader/-/resolve-url-loader-3.1.1.tgz", + "integrity": "sha512-K1N5xUjj7v0l2j/3Sgs5b8CjrrgtC70SmdCuZiJ8tSyb5J+uk3FoeZ4b7yTnH6j7ngI+Bc5bldHJIa8hYdu2gQ==", "requires": { - "onetime": "^2.0.0", + "adjust-sourcemap-loader": "2.0.0", + "camelcase": "5.3.1", + "compose-function": "3.0.3", + "convert-source-map": "1.7.0", + "es6-iterator": "2.0.3", + "loader-utils": "1.2.3", + "postcss": "7.0.21", + "rework": "1.0.1", + "rework-visit": "1.0.0", + "source-map": "0.6.1" + }, + "dependencies": { + "postcss": { + "version": "7.0.21", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.21.tgz", + "integrity": "sha512-uIFtJElxJo29QC753JzhidoAhvp/e/Exezkdhfmt8AymWT6/5B7W1WmponYWkHk2eg6sONyTch0A3nkMPun3SQ==", + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "restore-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", + "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", + "requires": { + "onetime": "^5.1.0", "signal-exit": "^3.0.2" } }, @@ -11539,6 +12624,32 @@ "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==" }, + "retry": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", + "integrity": "sha1-G0KmJmoh8HQh0bC1S33BZ7AcATs=" + }, + "rework": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/rework/-/rework-1.0.1.tgz", + "integrity": "sha1-MIBqhBNCtUUQqkEQhQzUhTQUSqc=", + "requires": { + "convert-source-map": "^0.3.3", + "css": "^2.0.0" + }, + "dependencies": { + "convert-source-map": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-0.3.5.tgz", + "integrity": "sha1-8dgClQr33SYxof6+BZZVDIarMZA=" + } + } + }, + "rework-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/rework-visit/-/rework-visit-1.0.0.tgz", + "integrity": "sha1-mUWygD8hni96ygCtuLyfZA+ELJo=" + }, "rgb-regex": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/rgb-regex/-/rgb-regex-1.0.1.tgz", @@ -11588,9 +12699,9 @@ } }, "rxjs": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.2.tgz", - "integrity": "sha512-HUb7j3kvb7p7eCUHE3FqjoDsC1xfZQ4AHFWfTKSpZ+sAhhz5X1WX0ZuUqWbzB2QhSLp3DoLUG+hMdEDKqWo2Zg==", + "version": "6.5.4", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.4.tgz", + "integrity": "sha512-naMQXcgEo3csAEGvw/NydRA0fuS2nDZJiw1YUWFKU7aPPAPGZEsD4Iimit96qwCieH6y614MCLYwdkrWx7z/7Q==", "requires": { "tslib": "^1.9.0" } @@ -11636,36 +12747,255 @@ } } }, - "sass-loader": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-7.1.0.tgz", - "integrity": "sha512-+G+BKGglmZM2GUSfT9TLuEp6tzehHPjAMoRRItOojWIqIGPloVCMhNIQuG639eJ+y033PaGTSjLaTHts8Kw79w==", + "sanitize.css": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/sanitize.css/-/sanitize.css-10.0.0.tgz", + "integrity": "sha512-vTxrZz4dX5W86M6oVWVdOVe72ZiPs41Oi7Z6Km4W5Turyz28mrXSJhhEBZoRtzJWIv3833WKVwLSDWWkEfupMg==" + }, + "sass": { + "version": "1.24.4", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.24.4.tgz", + "integrity": "sha512-SqizkIEEcVPzmK1tYdlNRl/RSXMEwGcifL9GD+S2p9rEPdj6ycRbk4PWZs0jwlajNSyBPo/SXRB81i22SG0jmw==", "requires": { - "clone-deep": "^2.0.1", - "loader-utils": "^1.0.1", - "lodash.tail": "^4.1.1", - "neo-async": "^2.5.0", - "pify": "^3.0.0", - "semver": "^5.5.0" + "chokidar": ">=2.0.0 <4.0.0" + } + }, + "sass-graph": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/sass-graph/-/sass-graph-2.2.4.tgz", + "integrity": "sha1-E/vWPNHK8JCLn9k0dq1DpR0eC0k=", + "requires": { + "glob": "^7.0.0", + "lodash": "^4.0.0", + "scss-tokenizer": "^0.2.3", + "yargs": "^7.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" + }, + "camelcase": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", + "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=" + }, + "cliui": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", + "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", + "requires": { + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wrap-ansi": "^2.0.0" + } + }, + "find-up": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", + "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", + "requires": { + "path-exists": "^2.0.0", + "pinkie-promise": "^2.0.0" + } + }, + "get-caller-file": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz", + "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==" + }, + "invert-kv": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", + "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=" + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "lcid": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", + "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", + "requires": { + "invert-kv": "^1.0.0" + } + }, + "load-json-file": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", + "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", + "requires": { + "graceful-fs": "^4.1.2", + "parse-json": "^2.2.0", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0", + "strip-bom": "^2.0.0" + } + }, + "os-locale": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", + "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=", + "requires": { + "lcid": "^1.0.0" + } + }, + "parse-json": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", + "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", + "requires": { + "error-ex": "^1.2.0" + } + }, + "path-exists": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", + "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", + "requires": { + "pinkie-promise": "^2.0.0" + } + }, + "path-type": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", + "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", + "requires": { + "graceful-fs": "^4.1.2", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" + } + }, + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=" + }, + "read-pkg": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", + "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", + "requires": { + "load-json-file": "^1.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^1.0.0" + } + }, + "read-pkg-up": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", + "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", + "requires": { + "find-up": "^1.0.0", + "read-pkg": "^1.0.0" + } + }, + "require-main-filename": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", + "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=" + }, + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "strip-bom": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", + "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", + "requires": { + "is-utf8": "^0.2.0" + } + }, + "which-module": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-1.0.0.tgz", + "integrity": "sha1-u6Y8qGGUiZT/MHc2CJ47lgJsKk8=" + }, + "wrap-ansi": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", + "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", + "requires": { + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1" + } + }, + "y18n": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz", + "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=" + }, + "yargs": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-7.1.0.tgz", + "integrity": "sha1-a6MY6xaWFyf10oT46gA+jWFU0Mg=", + "requires": { + "camelcase": "^3.0.0", + "cliui": "^3.2.0", + "decamelize": "^1.1.1", + "get-caller-file": "^1.0.1", + "os-locale": "^1.4.0", + "read-pkg-up": "^1.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^1.0.1", + "set-blocking": "^2.0.0", + "string-width": "^1.0.2", + "which-module": "^1.0.0", + "y18n": "^3.2.1", + "yargs-parser": "^5.0.0" + } + }, + "yargs-parser": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-5.0.0.tgz", + "integrity": "sha1-J17PDX/+Bcd+ZOfIbkzZS/DhIoo=", + "requires": { + "camelcase": "^3.0.0" + } + } + } + }, + "sass-loader": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-8.0.0.tgz", + "integrity": "sha512-+qeMu563PN7rPdit2+n5uuYVR0SSVwm0JsOUsaJXzgYcClWSlmX0iHDnmeOobPkf5kUglVot3QS6SyLyaQoJ4w==", + "requires": { + "clone-deep": "^4.0.1", + "loader-utils": "^1.2.3", + "neo-async": "^2.6.1", + "schema-utils": "^2.1.0", + "semver": "^6.3.0" }, "dependencies": { "clone-deep": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-2.0.2.tgz", - "integrity": "sha512-SZegPTKjCgpQH63E+eN6mVEEPdQBOUzjyJm5Pora4lrwWRFS8I0QAxV/KD6vV/i0WuijHZWQC1fMsPEdxfdVCQ==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", + "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", "requires": { - "for-own": "^1.0.0", "is-plain-object": "^2.0.4", - "kind-of": "^6.0.0", - "shallow-clone": "^1.0.0" - } - }, - "for-own": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/for-own/-/for-own-1.0.0.tgz", - "integrity": "sha1-xjMy9BXO3EsE2/5wz4NklMU8tEs=", - "requires": { - "for-in": "^1.0.1" + "kind-of": "^6.0.2", + "shallow-clone": "^3.0.0" } }, "kind-of": { @@ -11673,26 +13003,12 @@ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==" }, - "semver": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz", - "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==" - }, "shallow-clone": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-1.0.0.tgz", - "integrity": "sha512-oeXreoKR/SyNJtRJMAKPDSvd28OqEwG4eR/xc856cRGBII7gX9lvAqDxusPm0846z/w/hWYjI1NpKwJ00NHzRA==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", + "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==", "requires": { - "is-extendable": "^0.1.1", - "kind-of": "^5.0.0", - "mixin-object": "^2.0.1" - }, - "dependencies": { - "kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==" - } + "kind-of": "^6.0.2" } } } @@ -11711,22 +13027,40 @@ } }, "scheduler": { - "version": "0.13.6", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.13.6.tgz", - "integrity": "sha512-IWnObHt413ucAYKsD9J1QShUKkbKLQQHdxRyw73sw4FN26iWr3DY/H34xGPe4nmL1DwXyWmSWmMrA9TfQbE/XQ==", + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.18.0.tgz", + "integrity": "sha512-agTSHR1Nbfi6ulI0kYNK0203joW2Y5W4po4l+v03tOoiJKpTBbxpNhWDvqc/4IcOw+KLmSiQLTasZ4cab2/UWQ==", "requires": { "loose-envify": "^1.1.0", "object-assign": "^4.1.1" } }, "schema-utils": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", - "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.6.1.tgz", + "integrity": "sha512-0WXHDs1VDJyo+Zqs9TKLKyD/h7yDpHUhEFsM2CzkICFdoX1av+GBq/J2xRTFfsQO5kBfhZzANf2VcIm84jqDbg==", "requires": { - "ajv": "^6.1.0", - "ajv-errors": "^1.0.0", - "ajv-keywords": "^3.1.0" + "ajv": "^6.10.2", + "ajv-keywords": "^3.4.1" + } + }, + "scss-tokenizer": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/scss-tokenizer/-/scss-tokenizer-0.2.3.tgz", + "integrity": "sha1-jrBtualyMzOCTT9VMGQRSYR85dE=", + "requires": { + "js-base64": "^2.1.8", + "source-map": "^0.4.2" + }, + "dependencies": { + "source-map": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz", + "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=", + "requires": { + "amdefine": ">=0.0.4" + } + } } }, "select-hose": { @@ -11735,17 +13069,17 @@ "integrity": "sha1-Yl2GWPhlr0Psliv8N2o3NZpJlMo=" }, "selfsigned": { - "version": "1.10.4", - "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-1.10.4.tgz", - "integrity": "sha512-9AukTiDmHXGXWtWjembZ5NDmVvP2695EtpgbCsxCa68w3c88B+alqbmZ4O3hZ4VWGXeGWzEVdvqgAJD8DQPCDw==", + "version": "1.10.7", + "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-1.10.7.tgz", + "integrity": "sha512-8M3wBCzeWIJnQfl43IKwOmC4H/RAp50S8DF60znzjW5GVqTcSe2vWclt7hmYVPkKPlHWOu5EaWOMZ2Y6W8ZXTA==", "requires": { - "node-forge": "0.7.5" + "node-forge": "0.9.0" } }, "semver": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.0.0.tgz", - "integrity": "sha512-0UewU+9rFapKFnlbirLi3byoOuhrSsli/z/ihNnvM24vgF+8sNBiI1LZPBSH9wJKUwaUbw+s3hToDLCXkrghrQ==" + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" }, "send": { "version": "0.17.1", @@ -11795,9 +13129,9 @@ } }, "serialize-javascript": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-1.7.0.tgz", - "integrity": "sha512-ke8UG8ulpFOxO8f8gRYabHQe/ZntKlcig2Mp+8+URDP1D8vJZ0KUt7LYo07q25Z/+JVSgpr/cui9PIp5H6/+nA==" + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-2.1.2.tgz", + "integrity": "sha512-rs9OggEUF0V4jUSecXazOYsLfu7OGK2qIn3c7IPBiffz32XniEp/TX9Xmc9LQfK2nQ2QKHvZ2oygKUGU0lG4jQ==" }, "serve-index": { "version": "1.9.1", @@ -11955,15 +13289,9 @@ "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=" }, "shell-quote": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.6.1.tgz", - "integrity": "sha1-9HgZSczkAmlxJ0MOo7PFR29IF2c=", - "requires": { - "array-filter": "~0.0.0", - "array-map": "~0.0.0", - "array-reduce": "~0.0.0", - "jsonify": "~0.0.0" - } + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.7.2.tgz", + "integrity": "sha512-mRz/m/JVscCrkMyPqHc/bczi3OQHkLTqXHEFu0zDhK/qfv3UcOA4SVmRCLmos4bhjr9ekVQubj/R7waKapmiQg==" }, "shellwords": { "version": "0.1.1", @@ -11991,9 +13319,9 @@ } }, "sisteransi": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.2.tgz", - "integrity": "sha512-ZcYcZcT69nSLAR2oLN2JwNmLkJEKGooFMCdvOkFrToUt/WfcRWqhIg4P4KwY4dmLbuyXIx4o4YmPsvMRJYJd/w==" + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.4.tgz", + "integrity": "sha512-/ekMoM4NJ59ivGSfKapeG+FWtrmWvA1p6FBZwXrqojw90vJu8lBmrTxCMuBCydKtkaUe2zt4PlxeTKpjwMbyig==" }, "slash": { "version": "2.0.0", @@ -12008,6 +13336,13 @@ "ansi-styles": "^3.2.0", "astral-regex": "^1.0.0", "is-fullwidth-code-point": "^2.0.0" + }, + "dependencies": { + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" + } } }, "snapdragon": { @@ -12127,22 +13462,12 @@ "requires": { "faye-websocket": "^0.10.0", "uuid": "^3.0.1" - }, - "dependencies": { - "faye-websocket": { - "version": "0.10.0", - "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.10.0.tgz", - "integrity": "sha1-TkkvjQTftviQA1B/btvy1QHnxvQ=", - "requires": { - "websocket-driver": ">=0.5.1" - } - } } }, "sockjs-client": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/sockjs-client/-/sockjs-client-1.3.0.tgz", - "integrity": "sha512-R9jxEzhnnrdxLCNln0xg5uGHqMnkhPSTzUZH2eXcR03S/On9Yvoq2wyUZILRUhZCNVu2PmwWVoyuiPz8th8zbg==", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/sockjs-client/-/sockjs-client-1.4.0.tgz", + "integrity": "sha512-5zaLyO8/nri5cua0VtOrFXBPK1jbL4+1cebT/mmKA1E1ZXOvJrII75bPu0l0k843G/+iAbhEqzyKr0w/eCCj7g==", "requires": { "debug": "^3.2.5", "eventsource": "^1.0.7", @@ -12159,9 +13484,25 @@ "requires": { "ms": "^2.1.1" } + }, + "faye-websocket": { + "version": "0.11.3", + "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.3.tgz", + "integrity": "sha512-D2y4bovYpzziGgbHYtGCMjlJM36vAl/y+xUyn1C+FVx8szd1E+86KwVw6XvYSzOP8iMpm1X0I4xJD+QtUb36OA==", + "requires": { + "websocket-driver": ">=0.5.1" + } } } }, + "sort-keys": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-1.1.2.tgz", + "integrity": "sha1-RBttTTRnmPG05J6JIK37oOVD+a0=", + "requires": { + "is-plain-obj": "^1.0.0" + } + }, "source-list-map": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz", @@ -12173,11 +13514,11 @@ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" }, "source-map-resolve": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.2.tgz", - "integrity": "sha512-MjqsvNwyz1s0k81Goz/9vRBe9SZdB09Bdw+/zYyO+3CuPk6fouTaxscHkgtE8jKvf01kVfl8riHzERQ/kefaSA==", + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz", + "integrity": "sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==", "requires": { - "atob": "^2.1.1", + "atob": "^2.1.2", "decode-uri-component": "^0.2.0", "resolve-url": "^0.2.1", "source-map-url": "^0.4.0", @@ -12185,9 +13526,9 @@ } }, "source-map-support": { - "version": "0.5.12", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.12.tgz", - "integrity": "sha512-4h2Pbvyy15EE02G+JOZpUCmqWJuqrs+sEkzewTm++BPi7Hvn/HwcqLAcNxYAyI0x13CpPPn+kMjl+hplXMHITQ==", + "version": "0.5.16", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.16.tgz", + "integrity": "sha512-efyLRJDr68D9hBBNIPWFjhpFzURh+KJykQwvMyW5UiZzYwoF6l4YMMDIJJEyFWxWCqfyxLzz6tSfUFR+kXXsVQ==", "requires": { "buffer-from": "^1.0.0", "source-map": "^0.6.0" @@ -12227,9 +13568,9 @@ "integrity": "sha512-J+FWzZoynJEXGphVIS+XEh3kFSjZX/1i9gFBaWQcB+/tmpe2qUsSBABpcxqxnAxFdiUFEgAX1bjYGQvIZmoz9Q==" }, "spdy": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.0.tgz", - "integrity": "sha512-ot0oEGT/PGUpzf/6uk4AWLqkq+irlqHXkrdbk51oWONh3bxQmBuljxPNl66zlRRcIJStWq0QkLUCPOPjgjvU0Q==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.1.tgz", + "integrity": "sha512-HeZS3PBdMA+sZSu0qwpCxl3DeALD5ASx8pAX0jZdKXSpPWbQ6SYGnlg3BBmYLx5LtiZrmkAZfErCm2oECBcioA==", "requires": { "debug": "^4.1.0", "handle-thing": "^2.0.0", @@ -12293,11 +13634,12 @@ } }, "ssri": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ssri/-/ssri-6.0.1.tgz", - "integrity": "sha512-3Wge10hNcT1Kur4PDFwEieXSCMCJs/7WvSACcrMYrNp+b8kDL1/0wJch5Ni2WrtwEa2IO8OsVfeKIciKCDx/QA==", + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-7.1.0.tgz", + "integrity": "sha512-77/WrDZUWocK0mvA5NTRQyveUf+wsrIc6vyrxpS8tVvYBcX215QbafrJR3KtkpskIzoFLqqNuuYQvxaMjXJ/0g==", "requires": { - "figgy-pudding": "^3.5.1" + "figgy-pudding": "^3.5.1", + "minipass": "^3.1.1" } }, "stable": { @@ -12334,6 +13676,14 @@ "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=" }, + "stdout-stream": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/stdout-stream/-/stdout-stream-1.4.1.tgz", + "integrity": "sha512-j4emi03KXqJWcIeF8eIXkjMFN1Cmb8gUlDYGeBALLPo5qdyTfA9bOtl8m33lRoC+vFMkP3gl0WsDr6+gzxbbTA==", + "requires": { + "readable-stream": "^2.0.1" + } + }, "stealthy-require": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/stealthy-require/-/stealthy-require-1.1.1.tgz", @@ -12370,9 +13720,14 @@ } }, "stream-shift": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.0.tgz", - "integrity": "sha1-1cdSgl5TZ+eG944Y5EXqIjoVWVI=" + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.1.tgz", + "integrity": "sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==" + }, + "strict-uri-encode": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz", + "integrity": "sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM=" }, "string-length": { "version": "2.0.0", @@ -12381,15 +13736,59 @@ "requires": { "astral-regex": "^1.0.0", "strip-ansi": "^4.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "requires": { + "ansi-regex": "^3.0.0" + } + } } }, "string-width": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", + "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==", "requires": { - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^4.0.0" + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.0" + }, + "dependencies": { + "strip-ansi": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "requires": { + "ansi-regex": "^5.0.0" + } + } + } + }, + "string.prototype.trimleft": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string.prototype.trimleft/-/string.prototype.trimleft-2.1.1.tgz", + "integrity": "sha512-iu2AGd3PuP5Rp7x2kEZCrB2Nf41ehzh+goo8TV7z8/XDBbsvc6HQIlUl9RjkZ4oyrW1XM5UwlGl1oVEaDjg6Ag==", + "requires": { + "define-properties": "^1.1.3", + "function-bind": "^1.1.1" + } + }, + "string.prototype.trimright": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string.prototype.trimright/-/string.prototype.trimright-2.1.1.tgz", + "integrity": "sha512-qFvWL3/+QIgZXVmJBfpHmxLB7xsUXz6HsUmP8+5dRaC3Q7oKUv9Vo6aMCRZC1smrtyECFsIT30PqBJ1gTjAs+g==", + "requires": { + "define-properties": "^1.1.3", + "function-bind": "^1.1.1" } }, "string_decoder": { @@ -12411,11 +13810,18 @@ } }, "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", "requires": { - "ansi-regex": "^3.0.0" + "ansi-regex": "^4.1.0" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==" + } } }, "strip-bom": { @@ -12437,18 +13843,26 @@ "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=" }, + "strip-indent": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz", + "integrity": "sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI=", + "requires": { + "get-stdin": "^4.0.1" + } + }, "strip-json-comments": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=" + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.0.1.tgz", + "integrity": "sha512-VTyMAUfdm047mwKl+u79WIdrZxtFtn+nBxHeb844XBQ9uMNTuTHdx2hc5RiAJYqwTj3wc/xe5HLSdJSkJ+WfZw==" }, "style-loader": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-0.23.1.tgz", - "integrity": "sha512-XK+uv9kWwhZMZ1y7mysB+zoihsEj4wneFWAS5qoiLwzW0WzSqMrrsIy+a3zkQJq0ipFtBpX5W3MqyRIBF/WFGg==", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-1.0.0.tgz", + "integrity": "sha512-B0dOCFwv7/eY31a5PCieNwMgMhVGFe9w+rh7s/Bx8kfFkrth9zfTZquoYvdw8URgiqxObQKcpW51Ugz1HjfdZw==", "requires": { - "loader-utils": "^1.1.0", - "schema-utils": "^1.0.0" + "loader-utils": "^1.2.3", + "schema-utils": "^2.0.1" } }, "stylehacks": { @@ -12474,27 +13888,37 @@ } }, "superagent": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/superagent/-/superagent-5.1.0.tgz", - "integrity": "sha512-7V6JVx5N+eTL1MMqRBX0v0bG04UjrjAvvZJTF/VDH/SH2GjSLqlrcYepFlpTrXpm37aSY6h3GGVWGxXl/98TKA==", + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/superagent/-/superagent-5.2.1.tgz", + "integrity": "sha512-46b4Lkwnlz7Ebdv2FBbfuqb3kVkG1jV/SK3EW6NnwL9a3T4h5hHtegNEQfbXvTFbDoUZXId4W3dMgap2f6ic1g==", "requires": { "component-emitter": "^1.3.0", "cookiejar": "^2.1.2", "debug": "^4.1.1", - "fast-safe-stringify": "^2.0.6", - "form-data": "^2.3.3", + "fast-safe-stringify": "^2.0.7", + "form-data": "^3.0.0", "formidable": "^1.2.1", "methods": "^1.1.2", "mime": "^2.4.4", - "qs": "^6.7.0", + "qs": "^6.9.1", "readable-stream": "^3.4.0", - "semver": "^6.1.1" + "semver": "^6.3.0" }, "dependencies": { + "form-data": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.0.tgz", + "integrity": "sha512-CKMFDglpbMi6PyN+brwB9Q/GOw0eAnsrEZDgcsH5Krhz5Od/haKHAX0NmQfha2zPPz0JpWzA7GJHGSnvCRLWsg==", + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + } + }, "qs": { - "version": "6.7.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", - "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==" + "version": "6.9.1", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.9.1.tgz", + "integrity": "sha512-Cxm7/SS/y/Z3MHWSxXb8lIFqgqBowP5JMlTUFyJN88y0SGQhVmZnqFK/PeuMX9LzUyWsqqhNxIyg0jlzq946yA==" }, "readable-stream": { "version": "3.4.0", @@ -12505,11 +13929,6 @@ "string_decoder": "^1.1.1", "util-deprecate": "^1.0.1" } - }, - "semver": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.2.0.tgz", - "integrity": "sha512-jdFC1VdUGT/2Scgbimf7FSx9iJLXoqfglSF+gJeuNWVpiE37OIbc1jywR/GJyFdz3mnkz2/id0L0J/cr0izR5A==" } } }, @@ -12522,21 +13941,21 @@ } }, "svg-parser": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/svg-parser/-/svg-parser-2.0.1.tgz", - "integrity": "sha512-8eUnCsU2sc2hyfvjK++zi5u24a2UQIB2DK9GY/cprGlaDr7SIhm9F0m9CkGYOnOgrK3iTUSnJ7M1DTLqqZt96g==" + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/svg-parser/-/svg-parser-2.0.2.tgz", + "integrity": "sha512-1gtApepKFweigFZj3sGO8KT8LvVZK8io146EzXrpVuWCDAbISz/yMucco3hWTkpZNoPabM+dnMOpy6Swue68Zg==" }, "svgo": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/svgo/-/svgo-1.3.0.tgz", - "integrity": "sha512-MLfUA6O+qauLDbym+mMZgtXCGRfIxyQoeH6IKVcFslyODEe/ElJNwr0FohQ3xG4C6HK6bk3KYPPXwHVJk3V5NQ==", + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/svgo/-/svgo-1.3.2.tgz", + "integrity": "sha512-yhy/sQYxR5BkC98CY7o31VGsg014AKLEPxdfhora76l36hD9Rdy5NZA/Ocn6yayNPgSamYdtX2rFJdcv07AYVw==", "requires": { "chalk": "^2.4.1", "coa": "^2.0.2", "css-select": "^2.0.0", "css-select-base-adapter": "^0.1.1", - "css-tree": "1.0.0-alpha.33", - "csso": "^3.5.1", + "css-tree": "1.0.0-alpha.37", + "csso": "^4.0.2", "js-yaml": "^3.13.1", "mkdirp": "~0.5.1", "object.values": "^1.1.0", @@ -12557,9 +13976,9 @@ "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==" }, "table": { - "version": "5.4.4", - "resolved": "https://registry.npmjs.org/table/-/table-5.4.4.tgz", - "integrity": "sha512-IIfEAUx5QlODLblLrGTTLJA7Tk0iLSGBvgY8essPRVNGHAzThujww1YqHLs6h3HfTg55h++RzLHH5Xw/rfv+mg==", + "version": "5.4.6", + "resolved": "https://registry.npmjs.org/table/-/table-5.4.6.tgz", + "integrity": "sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug==", "requires": { "ajv": "^6.10.2", "lodash": "^4.17.14", @@ -12567,10 +13986,15 @@ "string-width": "^3.0.0" }, "dependencies": { - "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==" + "emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==" + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" }, "string-width": { "version": "3.1.0", @@ -12581,14 +14005,6 @@ "is-fullwidth-code-point": "^2.0.0", "strip-ansi": "^5.1.0" } - }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "requires": { - "ansi-regex": "^4.1.0" - } } } }, @@ -12597,29 +14013,97 @@ "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz", "integrity": "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==" }, - "terser": { - "version": "3.17.0", - "resolved": "https://registry.npmjs.org/terser/-/terser-3.17.0.tgz", - "integrity": "sha512-/FQzzPJmCpjAH9Xvk2paiWrFq+5M6aVOf+2KRbwhByISDX/EujxsK+BAvrhb6H+2rtrLCHK9N01wO014vrIwVQ==", + "tar": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/tar/-/tar-2.2.2.tgz", + "integrity": "sha512-FCEhQ/4rE1zYv9rYXJw/msRqsnmlje5jHP6huWeBZ704jUTy02c5AZyWujpMR1ax6mVw9NyJMfuK2CMDWVIfgA==", "requires": { - "commander": "^2.19.0", + "block-stream": "*", + "fstream": "^1.0.12", + "inherits": "2" + } + }, + "terser": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/terser/-/terser-4.6.2.tgz", + "integrity": "sha512-6FUjJdY2i3WZAtYBtnV06OOcOfzl+4hSKYE9wgac8rkLRBToPDDrBB2AcHwQD/OKDxbnvhVy2YgOPWO2SsKWqg==", + "requires": { + "commander": "^2.20.0", "source-map": "~0.6.1", - "source-map-support": "~0.5.10" + "source-map-support": "~0.5.12" } }, "terser-webpack-plugin": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-1.2.3.tgz", - "integrity": "sha512-GOK7q85oAb/5kE12fMuLdn2btOS9OBZn4VsecpHDywoUC/jLhSAKOiYo0ezx7ss2EXPMzyEWFoE0s1WLE+4+oA==", + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-2.2.1.tgz", + "integrity": "sha512-jwdauV5Al7zopR6OAYvIIRcxXCSvLjZjr7uZE8l2tIWb/ryrGN48sJftqGf5k9z09tWhajx53ldp0XPI080YnA==", "requires": { - "cacache": "^11.0.2", - "find-cache-dir": "^2.0.0", - "schema-utils": "^1.0.0", - "serialize-javascript": "^1.4.0", + "cacache": "^13.0.1", + "find-cache-dir": "^3.0.0", + "jest-worker": "^24.9.0", + "schema-utils": "^2.5.0", + "serialize-javascript": "^2.1.0", "source-map": "^0.6.1", - "terser": "^3.16.1", - "webpack-sources": "^1.1.0", - "worker-farm": "^1.5.2" + "terser": "^4.3.9", + "webpack-sources": "^1.4.3" + }, + "dependencies": { + "find-cache-dir": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.2.0.tgz", + "integrity": "sha512-1JKclkYYsf1q9WIJKLZa9S9muC+08RIjzAlLrK4QcYLJMS6mk9yombQ9qf+zJ7H9LS800k0s44L4sDq9VYzqyg==", + "requires": { + "commondir": "^1.0.1", + "make-dir": "^3.0.0", + "pkg-dir": "^4.1.0" + } + }, + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "requires": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + } + }, + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "requires": { + "p-locate": "^4.1.0" + } + }, + "make-dir": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.0.0.tgz", + "integrity": "sha512-grNJDhb8b1Jm1qeqW5R/O63wUo4UXo2v2HMic6YT9i/HBlF93S8jkMgH7yugvY9ABDShH4VZMn8I+U8+fCNegw==", + "requires": { + "semver": "^6.0.0" + } + }, + "p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "requires": { + "p-limit": "^2.2.0" + } + }, + "path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==" + }, + "pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "requires": { + "find-up": "^4.0.0" + } + } } }, "test-exclude": { @@ -12658,14 +14142,14 @@ } }, "thunky": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.0.3.tgz", - "integrity": "sha512-YwT8pjmNcAXBZqrubu22P4FYsh2D4dxRmnWBOL8Jk8bUcRUtc5326kx32tuTmFDAZtLOGEVNl8POAR8j896Iow==" + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz", + "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==" }, "timers-browserify": { - "version": "2.0.10", - "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.10.tgz", - "integrity": "sha512-YvC1SV1XdOUaL6gx5CoGroT3Gu49pK9+TZ38ErPldOWW4j49GI1HKs9DV+KGq/w6y+LZ72W1c8cKz2vzY+qpzg==", + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.11.tgz", + "integrity": "sha512-60aV6sgJ5YEbzUdn9c8kYGIqOubPoUdqQCul3SBAsRCZ40s6Y5cMcrW4dt3/k/EsbLVJNl9n6Vz3fTc+k2GeKQ==", "requires": { "setimmediate": "^1.0.4" } @@ -12759,19 +14243,27 @@ } }, "transformation-matrix": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/transformation-matrix/-/transformation-matrix-2.0.5.tgz", - "integrity": "sha512-S6L67Z8V3WEyPm2/zDh3I3bO0OQwv88dh7IY2dIOVBfIZJ4WQGdEKOsh7phTgYkvfAmHRxfOPNt1ixN/zR6D/A==" + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/transformation-matrix/-/transformation-matrix-2.2.0.tgz", + "integrity": "sha512-cxs7k1YT05BgY03PZg8P4MJUcLCqYdG+web+rXdTpyCYfyu6u6CS+X0hSMkHHdFrWpe5gsIQwwPAik+K6UnuMw==" }, - "trim-right": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz", - "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=" + "trim-newlines": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz", + "integrity": "sha1-WIeWa7WCpFA6QetST301ARgVphM=" + }, + "true-case-path": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/true-case-path/-/true-case-path-1.0.3.tgz", + "integrity": "sha512-m6s2OdQe5wgpFMC+pAJ+q9djG82O2jcHPOI6RNg1yy9rCYR+WD6Nbpl32fDpfC56nirdRy+opFa/Vk7HYhqaew==", + "requires": { + "glob": "^7.1.2" + } }, "ts-pnp": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/ts-pnp/-/ts-pnp-1.1.2.tgz", - "integrity": "sha512-f5Knjh7XCyRIzoC/z1Su1yLLRrPrFCgtUAh/9fCSP6NKbATwpOL1+idQVXQokK9GRFURn/jYPGPfegIctwunoA==" + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/ts-pnp/-/ts-pnp-1.1.5.tgz", + "integrity": "sha512-ti7OGMOUOzo66wLF3liskw6YQIaSsBgc4GOAlWRnIEj8htCxJUxskanMUoJOD6MDCRAXo36goXJZch+nOS0VMA==" }, "tslib": { "version": "1.10.0", @@ -12779,9 +14271,9 @@ "integrity": "sha512-qOebF53frne81cf0S9B41ByenJ3/IuH8yJKngAX35CmiZySA0khhkovshKK+jGCaMnVomla7gVlIcc3EvKPbTQ==" }, "tsutils": { - "version": "3.14.0", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.14.0.tgz", - "integrity": "sha512-SmzGbB0l+8I0QwsPgjooFRaRvHLBLNYM8SeQ0k6rtNDru5sCGeLJcZdwilNndN+GysuFjF5EIYgN8GfFG6UeUw==", + "version": "3.17.1", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.17.1.tgz", + "integrity": "sha512-kzeQ5B8H3w60nFY2g8cJIuH7JDpsALXySGtwGJ0p2LSjLgay3NdIpqq5SoOBe46bKDW2iq25irHCr8wjomUS2g==", "requires": { "tslib": "^1.8.1" } @@ -12804,6 +14296,11 @@ "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=" }, + "type": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/type/-/type-1.2.0.tgz", + "integrity": "sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==" + }, "type-check": { "version": "0.3.2", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", @@ -12818,6 +14315,11 @@ "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", "dev": true }, + "type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==" + }, "type-is": { "version": "1.6.18", "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", @@ -12827,20 +14329,15 @@ "mime-types": "~2.1.24" } }, - "typed-styles": { - "version": "0.0.5", - "resolved": "https://registry.npmjs.org/typed-styles/-/typed-styles-0.0.5.tgz", - "integrity": "sha512-ht+rEe5UsdEBAa3gr64+QjUOqjOLJfWLvl5HZR5Ev9uo/OnD3p43wPeFSB1hNFc13GXQF/JU1Bn0YHLUqBRIlw==" - }, "typedarray": { "version": "0.0.6", "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=" }, "typescript": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.5.3.tgz", - "integrity": "sha512-ACzBtm/PhXBDId6a6sDJfroT2pOWt/oOnk4/dElG5G33ZL776N3Y6/6bKZJBFpd+b05F3Ct9qDjMeJmRWtE2/g==" + "version": "3.7.4", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.7.4.tgz", + "integrity": "sha512-A25xv5XCtarLwXpcDNZzCGvW2D1S3/bACratYBx2sax8PefsFhlYmkQicKHvpYflFS8if4zne5zT5kpJ7pzuvw==" }, "ua-parser-js": { "version": "0.7.20", @@ -12848,30 +14345,24 @@ "integrity": "sha512-8OaIKfzL5cpx8eCMAhhvTlft8GYF8b2eQr6JkCyVdrgjcytyOmPCXrqXFcUnhonRpLlh5yxEZVohm6mzaowUOw==" }, "uglify-js": { - "version": "3.6.7", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.6.7.tgz", - "integrity": "sha512-4sXQDzmdnoXiO+xvmTzQsfIiwrjUCSA95rSP4SEd8tDb51W2TiDOlL76Hl+Kw0Ie42PSItCW8/t6pBNCF2R48A==", + "version": "3.7.5", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.7.5.tgz", + "integrity": "sha512-GFZ3EXRptKGvb/C1Sq6nO1iI7AGcjyqmIyOw0DrD0675e+NNbGO72xmMM2iEBdFbxaTLo70NbjM/Wy54uZIlsg==", "optional": true, "requires": { "commander": "~2.20.3", "source-map": "~0.6.1" - }, - "dependencies": { - "commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", - "optional": true - } } }, "uncontrollable": { - "version": "6.2.3", - "resolved": "https://registry.npmjs.org/uncontrollable/-/uncontrollable-6.2.3.tgz", - "integrity": "sha512-VgOAoBU2ptCL2bfTG2Mra0I8i1u6Aq84AFonD5tmCAYSfs3hWvr2Rlw0q2ntoxXTHjcQOmZOh3FKaN+UZVyREQ==", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/uncontrollable/-/uncontrollable-7.1.1.tgz", + "integrity": "sha512-EcPYhot3uWTS3w00R32R2+vS8Vr53tttrvMj/yA1uYRhf8hbTG2GyugGqWDY0qIskxn0uTTojVd6wPYW9ZEf8Q==", "requires": { - "@babel/runtime": "^7.4.5", - "invariant": "^2.2.4" + "@babel/runtime": "^7.6.3", + "@types/react": "^16.9.11", + "invariant": "^2.2.4", + "react-lifecycles-compat": "^3.0.4" } }, "unicode-canonical-property-names-ecmascript": { @@ -12987,9 +14478,9 @@ } }, "upath": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/upath/-/upath-1.1.2.tgz", - "integrity": "sha512-kXpym8nmDmlCBr7nKdIx8P2jNBa+pBpIUFRnKJ4dr8htyYGJFokkr2ZvERRtUN+9SY+JqXouNgUPtv6JQva/2Q==" + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz", + "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==" }, "upper-case": { "version": "1.1.3", @@ -13026,13 +14517,13 @@ } }, "url-loader": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/url-loader/-/url-loader-1.1.2.tgz", - "integrity": "sha512-dXHkKmw8FhPqu8asTc1puBfe3TehOCo2+RmOOev5suNCIYBcT626kxiWg1NBVkwc4rO8BGa7gP70W7VXuqHrjg==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/url-loader/-/url-loader-2.3.0.tgz", + "integrity": "sha512-goSdg8VY+7nPZKUEChZSEtW5gjbS66USIGCeSJ1OVOJ7Yfuh/36YxCwMi5HVEJh6mqUYOoy3NJ0vlOMrWsSHog==", "requires": { - "loader-utils": "^1.1.0", - "mime": "^2.0.3", - "schema-utils": "^1.0.0" + "loader-utils": "^1.2.3", + "mime": "^2.4.4", + "schema-utils": "^2.5.0" } }, "url-parse": { @@ -13050,17 +14541,17 @@ "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==" }, "util": { - "version": "0.11.1", - "resolved": "https://registry.npmjs.org/util/-/util-0.11.1.tgz", - "integrity": "sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ==", + "version": "0.10.3", + "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", + "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=", "requires": { - "inherits": "2.0.3" + "inherits": "2.0.1" }, "dependencies": { "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", + "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=" } } }, @@ -13089,9 +14580,14 @@ "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=" }, "uuid": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz", - "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==" + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.3.tgz", + "integrity": "sha512-pW0No1RGHgzlpHJO1nsVrHKpOEIxkGg1xB+v0ZmdNH5OAeAwzAVrCnI2/6Mtx+Uys6iaylxa+D3g4j63IKKjSQ==" + }, + "v8-compile-cache": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.1.0.tgz", + "integrity": "sha512-usZBT3PW+LOjM25wbqIlZwPeJV+3OSz3M1k1Ws8snlW39dZyYL9lOGC5FgPVHfk0jKmjiDV8Z0mIbVQPiwFs7g==" }, "validate-npm-package-license": { "version": "3.0.4", @@ -13108,9 +14604,9 @@ "integrity": "sha512-qiQ5ktdO7CD6C/5/mYV4jku/7qnqzjrxb3C/Q5wR3vGGinHTgJZN/TdFT3ZX4vXhX2R1PXx42fB1cn5W+uJ4lg==" }, "value-equal": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/value-equal/-/value-equal-0.4.0.tgz", - "integrity": "sha512-x+cYdNnaA3CxvMaTX0INdTCN8m8aF2uY9BvEqmxuYp8bL09cs/kWVQPVGcA35fMktdOsP69IgU7wFj/61dJHEw==" + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/value-equal/-/value-equal-1.0.1.tgz", + "integrity": "sha512-NOJ6JZCAWr0zlxZt+xqCHNTEKOsrks2HQd4MqhP1qy4z1SkbEP467eNx6TgDKXMvUOb+OENfJCZwM+16n7fRfw==" }, "vary": { "version": "1.1.2", @@ -13133,9 +14629,9 @@ } }, "vm-browserify": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.0.tgz", - "integrity": "sha512-iq+S7vZJE60yejDYM0ek6zg308+UZsdtPExWP9VZoCFCz1zkJoXFnAX7aZfd/ZwrkidzdUZL0C/ryW+JwAiIGw==" + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.2.tgz", + "integrity": "sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==" }, "w3c-hr-time": { "version": "1.0.1", @@ -13195,82 +14691,157 @@ "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==" }, "webpack": { - "version": "4.29.6", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.29.6.tgz", - "integrity": "sha512-MwBwpiE1BQpMDkbnUUaW6K8RFZjljJHArC6tWQJoFm0oQtfoSebtg4Y7/QHnJ/SddtjYLHaKGX64CFjG5rehJw==", + "version": "4.41.2", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.41.2.tgz", + "integrity": "sha512-Zhw69edTGfbz9/8JJoyRQ/pq8FYUoY0diOXqW0T6yhgdhCv6wr0hra5DwwWexNRns2Z2+gsnrNcbe9hbGBgk/A==", "requires": { "@webassemblyjs/ast": "1.8.5", "@webassemblyjs/helper-module-context": "1.8.5", "@webassemblyjs/wasm-edit": "1.8.5", "@webassemblyjs/wasm-parser": "1.8.5", - "acorn": "^6.0.5", - "acorn-dynamic-import": "^4.0.0", - "ajv": "^6.1.0", - "ajv-keywords": "^3.1.0", - "chrome-trace-event": "^1.0.0", + "acorn": "^6.2.1", + "ajv": "^6.10.2", + "ajv-keywords": "^3.4.1", + "chrome-trace-event": "^1.0.2", "enhanced-resolve": "^4.1.0", - "eslint-scope": "^4.0.0", + "eslint-scope": "^4.0.3", "json-parse-better-errors": "^1.0.2", - "loader-runner": "^2.3.0", - "loader-utils": "^1.1.0", - "memory-fs": "~0.4.1", - "micromatch": "^3.1.8", - "mkdirp": "~0.5.0", - "neo-async": "^2.5.0", - "node-libs-browser": "^2.0.0", + "loader-runner": "^2.4.0", + "loader-utils": "^1.2.3", + "memory-fs": "^0.4.1", + "micromatch": "^3.1.10", + "mkdirp": "^0.5.1", + "neo-async": "^2.6.1", + "node-libs-browser": "^2.2.1", "schema-utils": "^1.0.0", - "tapable": "^1.1.0", - "terser-webpack-plugin": "^1.1.0", - "watchpack": "^1.5.0", - "webpack-sources": "^1.3.0" + "tapable": "^1.1.3", + "terser-webpack-plugin": "^1.4.1", + "watchpack": "^1.6.0", + "webpack-sources": "^1.4.1" + }, + "dependencies": { + "acorn": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.0.tgz", + "integrity": "sha512-gac8OEcQ2Li1dxIEWGZzsp2BitJxwkwcOm0zHAJLcPJaVvm58FRnk6RkuLRpU1EujipU2ZFODv2P9DLMfnV8mw==" + }, + "cacache": { + "version": "12.0.3", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-12.0.3.tgz", + "integrity": "sha512-kqdmfXEGFepesTuROHMs3MpFLWrPkSSpRqOw80RCflZXy/khxaArvFrQ7uJxSUduzAufc6G0g1VUCOZXxWavPw==", + "requires": { + "bluebird": "^3.5.5", + "chownr": "^1.1.1", + "figgy-pudding": "^3.5.1", + "glob": "^7.1.4", + "graceful-fs": "^4.1.15", + "infer-owner": "^1.0.3", + "lru-cache": "^5.1.1", + "mississippi": "^3.0.0", + "mkdirp": "^0.5.1", + "move-concurrently": "^1.0.1", + "promise-inflight": "^1.0.1", + "rimraf": "^2.6.3", + "ssri": "^6.0.1", + "unique-filename": "^1.1.1", + "y18n": "^4.0.0" + } + }, + "eslint-scope": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.3.tgz", + "integrity": "sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg==", + "requires": { + "esrecurse": "^4.1.0", + "estraverse": "^4.1.1" + } + }, + "schema-utils": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", + "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", + "requires": { + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" + } + }, + "ssri": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-6.0.1.tgz", + "integrity": "sha512-3Wge10hNcT1Kur4PDFwEieXSCMCJs/7WvSACcrMYrNp+b8kDL1/0wJch5Ni2WrtwEa2IO8OsVfeKIciKCDx/QA==", + "requires": { + "figgy-pudding": "^3.5.1" + } + }, + "terser-webpack-plugin": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-1.4.3.tgz", + "integrity": "sha512-QMxecFz/gHQwteWwSo5nTc6UaICqN1bMedC5sMtUc7y3Ha3Q8y6ZO0iCR8pq4RJC8Hjf0FEPEHZqcMB/+DFCrA==", + "requires": { + "cacache": "^12.0.2", + "find-cache-dir": "^2.1.0", + "is-wsl": "^1.1.0", + "schema-utils": "^1.0.0", + "serialize-javascript": "^2.1.2", + "source-map": "^0.6.1", + "terser": "^4.1.2", + "webpack-sources": "^1.4.0", + "worker-farm": "^1.7.0" + } + } } }, "webpack-dev-middleware": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-3.7.0.tgz", - "integrity": "sha512-qvDesR1QZRIAZHOE3iQ4CXLZZSQ1lAUsSpnQmlB1PBfoN/xdRjmge3Dok0W4IdaVLJOGJy3sGI4sZHwjRU0PCA==", + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-3.7.2.tgz", + "integrity": "sha512-1xC42LxbYoqLNAhV6YzTYacicgMZQTqRd27Sim9wn5hJrX3I5nxYy1SxSd4+gjUFsz1dQFj+yEe6zEVmSkeJjw==", "requires": { "memory-fs": "^0.4.1", - "mime": "^2.4.2", + "mime": "^2.4.4", + "mkdirp": "^0.5.1", "range-parser": "^1.2.1", "webpack-log": "^2.0.0" } }, "webpack-dev-server": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-3.2.1.tgz", - "integrity": "sha512-sjuE4mnmx6JOh9kvSbPYw3u/6uxCLHNWfhWaIPwcXWsvWOPN+nc5baq4i9jui3oOBRXGonK9+OI0jVkaz6/rCw==", + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-3.9.0.tgz", + "integrity": "sha512-E6uQ4kRrTX9URN9s/lIbqTAztwEPdvzVrcmHE8EQ9YnuT9J8Es5Wrd8n9BKg1a0oZ5EgEke/EQFgUsp18dSTBw==", "requires": { "ansi-html": "0.0.7", "bonjour": "^3.5.0", - "chokidar": "^2.0.0", - "compression": "^1.5.2", - "connect-history-api-fallback": "^1.3.0", + "chokidar": "^2.1.8", + "compression": "^1.7.4", + "connect-history-api-fallback": "^1.6.0", "debug": "^4.1.1", - "del": "^3.0.0", - "express": "^4.16.2", - "html-entities": "^1.2.0", - "http-proxy-middleware": "^0.19.1", + "del": "^4.1.1", + "express": "^4.17.1", + "html-entities": "^1.2.1", + "http-proxy-middleware": "0.19.1", "import-local": "^2.0.0", - "internal-ip": "^4.2.0", + "internal-ip": "^4.3.0", "ip": "^1.1.5", - "killable": "^1.0.0", - "loglevel": "^1.4.1", - "opn": "^5.1.0", - "portfinder": "^1.0.9", + "is-absolute-url": "^3.0.3", + "killable": "^1.0.1", + "loglevel": "^1.6.4", + "opn": "^5.5.0", + "p-retry": "^3.0.1", + "portfinder": "^1.0.25", "schema-utils": "^1.0.0", - "selfsigned": "^1.9.1", - "semver": "^5.6.0", - "serve-index": "^1.7.2", + "selfsigned": "^1.10.7", + "semver": "^6.3.0", + "serve-index": "^1.9.1", "sockjs": "0.3.19", - "sockjs-client": "1.3.0", - "spdy": "^4.0.0", - "strip-ansi": "^3.0.0", + "sockjs-client": "1.4.0", + "spdy": "^4.0.1", + "strip-ansi": "^3.0.1", "supports-color": "^6.1.0", "url": "^0.11.0", - "webpack-dev-middleware": "^3.5.1", + "webpack-dev-middleware": "^3.7.2", "webpack-log": "^2.0.0", - "yargs": "12.0.2" + "ws": "^6.2.1", + "yargs": "12.0.5" }, "dependencies": { "ansi-regex": { @@ -13278,28 +14849,84 @@ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" }, - "camelcase": { + "cliui": { "version": "4.1.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", - "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=" - }, - "decamelize": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-2.0.0.tgz", - "integrity": "sha512-Ikpp5scV3MSYxY39ymh45ZLEecsTdv/Xj2CaQfI8RLMuwi7XvjX9H/fhraiSuU+C5w5NTDu4ZU72xNiZnurBPg==", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-4.1.0.tgz", + "integrity": "sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ==", "requires": { - "xregexp": "4.0.0" + "string-width": "^2.1.1", + "strip-ansi": "^4.0.0", + "wrap-ansi": "^2.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "requires": { + "ansi-regex": "^3.0.0" + } + } } }, + "get-caller-file": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz", + "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==" + }, + "is-absolute-url": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-3.0.3.tgz", + "integrity": "sha512-opmNIX7uFnS96NtPmhWQgQx6/NYFgsUXYMllcfzwWKUMwfo8kku1TvE6hkNcH+Q1ts5cMVrsY7j0bxXQDciu9Q==" + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" + }, "require-main-filename": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=" }, - "semver": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz", - "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==" + "schema-utils": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", + "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", + "requires": { + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" + } + }, + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "requires": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "requires": { + "ansi-regex": "^3.0.0" + } + } + } }, "strip-ansi": { "version": "3.0.1", @@ -13317,13 +14944,50 @@ "has-flag": "^3.0.0" } }, + "wrap-ansi": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", + "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", + "requires": { + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1" + }, + "dependencies": { + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + } + } + }, + "ws": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.1.tgz", + "integrity": "sha512-GIyAXC2cB7LjvpgMt9EKS2ldqr0MTrORaleiOno6TweZ6r3TKtoFQWay/2PceJ3RuBasOHzXNn5Lrw1X0bEjqA==", + "requires": { + "async-limiter": "~1.0.0" + } + }, "yargs": { - "version": "12.0.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-12.0.2.tgz", - "integrity": "sha512-e7SkEx6N6SIZ5c5H22RTZae61qtn3PYUE8JYbBFlK9sYmh3DMQ6E5ygtaG/2BW0JZi4WGgTR2IV5ChqlqrDGVQ==", + "version": "12.0.5", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-12.0.5.tgz", + "integrity": "sha512-Lhz8TLaYnxq/2ObqHDql8dX8CJi97oHxrjUcYtzKbbykPtVW9WB+poxI+NM2UIzsMgNCZTIf0AQwsjK5yMAqZw==", "requires": { "cliui": "^4.0.0", - "decamelize": "^2.0.0", + "decamelize": "^1.2.0", "find-up": "^3.0.0", "get-caller-file": "^1.0.1", "os-locale": "^3.0.0", @@ -13333,15 +14997,16 @@ "string-width": "^2.0.0", "which-module": "^2.0.0", "y18n": "^3.2.1 || ^4.0.0", - "yargs-parser": "^10.1.0" + "yargs-parser": "^11.1.1" } }, "yargs-parser": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-10.1.0.tgz", - "integrity": "sha512-VCIyR1wJoEBZUqk5PA+oOBF6ypbwh5aNB3I50guxAL/quggdfs4TtNHQrSazFA3fYZ+tEqfs0zIGlv0c/rgjbQ==", + "version": "11.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-11.1.1.tgz", + "integrity": "sha512-C6kB/WJDiaxONLJQnF8ccx9SEeoTTLek8RVbaOIsrAUS8VrBEXfmeSnCZxygc+XC2sNMBIwOOnfcxiynjHsVSQ==", "requires": { - "camelcase": "^4.1.0" + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" } } } @@ -13356,19 +15021,32 @@ } }, "webpack-manifest-plugin": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/webpack-manifest-plugin/-/webpack-manifest-plugin-2.0.4.tgz", - "integrity": "sha512-nejhOHexXDBKQOj/5v5IZSfCeTO3x1Dt1RZEcGfBSul891X/eLIcIVH31gwxPDdsi2Z8LKKFGpM4w9+oTBOSCg==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/webpack-manifest-plugin/-/webpack-manifest-plugin-2.2.0.tgz", + "integrity": "sha512-9S6YyKKKh/Oz/eryM1RyLVDVmy3NSPV0JXMRhZ18fJsq+AwGxUY34X54VNwkzYcEmEkDwNxuEOboCZEebJXBAQ==", "requires": { "fs-extra": "^7.0.0", "lodash": ">=3.5 <5", + "object.entries": "^1.1.0", "tapable": "^1.0.0" + }, + "dependencies": { + "fs-extra": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", + "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", + "requires": { + "graceful-fs": "^4.1.2", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + } + } } }, "webpack-sources": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.3.0.tgz", - "integrity": "sha512-OiVgSrbGu7NEnEvQJJgdSFPl2qWKkWq5lHMhgiToIiN9w34EBnjYzSYs+VbL5KoYiLNtFFa7BZIKxRED3I32pA==", + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.4.3.tgz", + "integrity": "sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==", "requires": { "source-list-map": "^2.0.0", "source-map": "~0.6.1" @@ -13430,6 +15108,48 @@ "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=" }, + "wide-align": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", + "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", + "requires": { + "string-width": "^1.0.2 || 2" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" + }, + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "requires": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + } + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "requires": { + "ansi-regex": "^3.0.0" + } + } + } + }, + "word-wrap": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", + "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==" + }, "wordwrap": { "version": "0.0.3", "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz", @@ -13579,13 +15299,13 @@ "integrity": "sha512-0jXdusCL2uC5gM3yYFT6QMBzKfBr2XTk0g5TPAV4y8IZDyVNDyj1a8uSXy3/XrvkVTmQvLN4O5k3JawGReXr9w==" }, "workbox-webpack-plugin": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/workbox-webpack-plugin/-/workbox-webpack-plugin-4.2.0.tgz", - "integrity": "sha512-YZsiA+y/ns/GdWRaBsfYv8dln1ebWtGnJcTOg1ppO0pO1tScAHX0yGtHIjndxz3L/UUhE8b0NQE9KeLNwJwA5A==", + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/workbox-webpack-plugin/-/workbox-webpack-plugin-4.3.1.tgz", + "integrity": "sha512-gJ9jd8Mb8wHLbRz9ZvGN57IAmknOipD3W4XNE/Lk/4lqs5Htw4WOQgakQy/o/4CoXQlMCYldaqUg+EJ35l9MEQ==", "requires": { "@babel/runtime": "^7.0.0", "json-stable-stringify": "^1.0.1", - "workbox-build": "^4.2.0" + "workbox-build": "^4.3.1" } }, "workbox-window": { @@ -13613,43 +15333,33 @@ } }, "wrap-ansi": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", - "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", + "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", "requires": { - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1" + "ansi-styles": "^3.2.0", + "string-width": "^3.0.0", + "strip-ansi": "^5.0.0" }, "dependencies": { - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" + "emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==" }, "is-fullwidth-code-point": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", - "requires": { - "number-is-nan": "^1.0.0" - } + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" }, "string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" - } - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "requires": { - "ansi-regex": "^2.0.0" + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" } } } @@ -13691,14 +15401,9 @@ "integrity": "sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==" }, "xmlchars": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.1.1.tgz", - "integrity": "sha512-7hew1RPJ1iIuje/Y01bGD/mXokXxegAgVS+e+E0wSi2ILHQkYAH1+JXARwTjZSM4Z4Z+c73aKspEcqj+zPPL/w==" - }, - "xregexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/xregexp/-/xregexp-4.0.0.tgz", - "integrity": "sha512-PHyM+sQouu7xspQQwELlGwwd05mXUFqwFYfqPO0cC7x4fxyHnnuetmQr6CjJiafIDoH4MogHb9dOoJzR/Y4rFg==" + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", + "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==" }, "xtend": { "version": "4.0.2", @@ -13711,40 +15416,61 @@ "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==" }, "yallist": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.0.3.tgz", - "integrity": "sha512-S+Zk8DEWE6oKpV+vI3qWkaK+jSbIK86pCwe2IF/xwIpQ8jEuxpw9NyaGjmp9+BoJv5FV2piqCDcoCtStppiq2A==" + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, + "yaml": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.7.2.tgz", + "integrity": "sha512-qXROVp90sb83XtAoqE8bP9RwAkTTZbugRUTm5YeFCBfNRPEp2YzTeqWiz7m5OORHzEvrA/qcGS8hp/E+MMROYw==", + "requires": { + "@babel/runtime": "^7.6.3" + } }, "yargs": { - "version": "12.0.5", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-12.0.5.tgz", - "integrity": "sha512-Lhz8TLaYnxq/2ObqHDql8dX8CJi97oHxrjUcYtzKbbykPtVW9WB+poxI+NM2UIzsMgNCZTIf0AQwsjK5yMAqZw==", + "version": "13.3.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.0.tgz", + "integrity": "sha512-2eehun/8ALW8TLoIl7MVaRUrg+yCnenu8B4kBlRxj3GJGDKU1Og7sMXPNm1BYyM1DOJmTZ4YeN/Nwxv+8XJsUA==", "requires": { - "cliui": "^4.0.0", - "decamelize": "^1.2.0", + "cliui": "^5.0.0", "find-up": "^3.0.0", - "get-caller-file": "^1.0.1", - "os-locale": "^3.0.0", + "get-caller-file": "^2.0.1", "require-directory": "^2.1.1", - "require-main-filename": "^1.0.1", + "require-main-filename": "^2.0.0", "set-blocking": "^2.0.0", - "string-width": "^2.0.0", + "string-width": "^3.0.0", "which-module": "^2.0.0", - "y18n": "^3.2.1 || ^4.0.0", - "yargs-parser": "^11.1.1" + "y18n": "^4.0.0", + "yargs-parser": "^13.1.1" }, "dependencies": { - "require-main-filename": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", - "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=" + "emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==" + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" + }, + "string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "requires": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + } } } }, "yargs-parser": { - "version": "11.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-11.1.1.tgz", - "integrity": "sha512-C6kB/WJDiaxONLJQnF8ccx9SEeoTTLek8RVbaOIsrAUS8VrBEXfmeSnCZxygc+XC2sNMBIwOOnfcxiynjHsVSQ==", + "version": "13.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.1.tgz", + "integrity": "sha512-oVAVsHz6uFrg3XQheFII8ESO2ssAf9luWuAd6Wexsu4F3OtIW0o8IribPXYrD4WC24LWtPrJlGy87y5udK+dxQ==", "requires": { "camelcase": "^5.0.0", "decamelize": "^1.2.0" diff --git a/package.json b/package.json index 9ce2493..c559618 100644 --- a/package.json +++ b/package.json @@ -3,51 +3,54 @@ "version": "0.1.0", "private": true, "dependencies": { - "@fortawesome/fontawesome-svg-core": "^1.2.19", - "@fortawesome/free-solid-svg-icons": "^5.9.0", - "@fortawesome/react-fontawesome": "^0.1.4", + "@fortawesome/fontawesome-svg-core": "^1.2.26", + "@fortawesome/free-solid-svg-icons": "^5.12.0", + "@fortawesome/react-fontawesome": "^0.1.8", "babel-runtime": "^6.26.0", - "bootstrap": "^4.3.1", + "bootstrap": "^4.4.1", "classnames": "^2.2.6", - "d3-array": "^2.2.0", + "d3-array": "^2.4.0", "d3-axis": "^1.0.12", - "d3-scale": "^3.0.0", - "d3-scale-chromatic": "^1.3.3", - "d3-selection": "^1.4.0", - "d3-shape": "^1.3.5", - "d3-time-format": "^2.1.3", + "d3-scale": "^3.2.1", + "d3-scale-chromatic": "^1.5.0", + "d3-selection": "^1.4.1", + "d3-shape": "^1.3.7", + "d3-time-format": "^2.2.3", "es6-promise": "^4.2.8", + "fibers": "^4.0.2", "file-saver": "^2.0.2", "flux": "^3.1.3", "frontend-collective-react-dnd-scrollzone": "^1.0.2", "gaugeJS": "^1.3.7", - "handlebars": "^4.5.1", + "handlebars": "^4.7.1", "immutable": "^4.0.0-rc.12", "jquery": "^3.4.1", "jszip": "^3.2.2", "libcimsvg": "git+https://git.rwth-aachen.de/acs/public/cim/pintura-npm-package.git", "lodash": "^4.17.15", + "node-sass": "^4.13.0", "prop-types": "^15.7.2", - "rc-slider": "^8.6.13", - "react": "^16.8.6", - "react-bootstrap": "^1.0.0-beta.9", + "rc-slider": "^8.7.1", + "react": "^16.12.0", + "react-bootstrap": "^1.0.0-beta.16", "react-contexify": "^4.1.1", "react-d3": "^0.4.0", - "react-dnd": "^9.3.2", - "react-dnd-html5-backend": "^9.3.2", - "react-dom": "^16.8.6", + "react-dnd": "^9.5.1", + "react-dnd-html5-backend": "^9.5.1", + "react-dom": "^16.12.0", "react-fullscreenable": "^2.5.1-0", - "react-grid-system": "^4.4.10", + "react-grid-system": "^4.4.11", "react-json-view": "^1.19.1", "react-notification-system": "^0.2.17", - "react-rnd": "^10.0.0", - "react-router": "^5.0.1", - "react-router-dom": "^5.0.1", - "react-scripts": "^3.0.1", - "react-sortable-tree": "^2.6.2", - "react-svg-pan-zoom": "^3.1.0", - "superagent": "^5.1.0", - "typescript": "^3.5.3", + "react-rnd": "^10.1.4", + "react-router": "^5.1.2", + "react-router-dom": "^5.1.2", + "react-scripts": "^3.3.0", + "react-sortable-tree": "^2.7.1", + "react-svg-pan-zoom": "^3.8.0", + "sass": "^1.24.4", + "superagent": "^5.2.1", + "typescript": "^3.7.4", "validator": "^11.1.0" }, "devDependencies": { diff --git a/src/app.js b/src/app.js index 69084f5..5f0cadc 100644 --- a/src/app.js +++ b/src/app.js @@ -68,7 +68,9 @@ class App extends React.Component { }; } - componentWillMount() { + componentDidMount() { + NotificationsDataManager.setSystem(this.refs.notificationSystem); + // if token stored locally, request user let token = localStorage.getItem("token"); let currentUser = JSON.parse(localStorage.getItem("currentUser")); @@ -79,9 +81,7 @@ class App extends React.Component { currentUser: currentUser }); } - } - componentDidMount() { // load all simulators and scenarios to fetch data // AppDispatcher.dispatch({ // type: 'simulators/start-load', @@ -93,7 +93,7 @@ class App extends React.Component { // token: this.state.token // }); - NotificationsDataManager.setSystem(this.refs.notificationSystem); + } showSidebarMenu = () => { diff --git a/src/common/editable-header.js b/src/common/editable-header.js index ff15d11..90b5f59 100644 --- a/src/common/editable-header.js +++ b/src/common/editable-header.js @@ -36,8 +36,10 @@ class EditableHeader extends React.Component { }; } - componentWillReceiveProps(nextProps) { - this.setState({ title: nextProps.title }); + static getDerivedStateFromProps(props, state){ + return { + title: props.title + }; } edit = () => { diff --git a/src/common/home.js b/src/common/home.js index 4e889da..2ce515c 100644 --- a/src/common/home.js +++ b/src/common/home.js @@ -45,12 +45,6 @@ class Home extends React.Component { return '?'; } - componentWillMount() { - //RestAPI.get('/api/v1/counts').then(response => { - // this.setState({ counts: response }); - //}); - } - render() { return (
    diff --git a/src/common/table.js b/src/common/table.js index 8d2d33d..6ec492f 100644 --- a/src/common/table.js +++ b/src/common/table.js @@ -32,7 +32,7 @@ class CustomTable extends Component { this.activeInput = null; this.state = { - rows: this.getRows(props), + rows: CustomTable.getRows(props), editCell: [ -1, -1 ] }; } @@ -45,7 +45,7 @@ class CustomTable extends Component { this.setState({ editCell: [ column, row ]}); // x, y } - addCell(data, index, child) { + static addCell(data, index, child) { // add data to cell let content = null; @@ -112,7 +112,7 @@ class CustomTable extends Component { } if (child.props.checkbox) { - const checkboxKey = this.props.checkboxKey; + const checkboxKey = child.props.checkboxKey; cell.push( child.props.onChecked(index, e)} />); } @@ -122,12 +122,12 @@ class CustomTable extends Component { } return cell; - } + } // addCell - componentWillReceiveProps(nextProps) { - const rows = this.getRows(nextProps); + static getDerivedStateFromProps(props, state){ + const rows = CustomTable.getRows(props); - this.setState({ rows }); + return { rows }; } componentDidUpdate() { @@ -147,7 +147,7 @@ class CustomTable extends Component { this.setState({ editCell: [ -1, -1 ] }); } - getRows(props) { + static getRows(props) { if (props.data == null) { return []; } @@ -156,13 +156,13 @@ class CustomTable extends Component { // check if multiple columns if (Array.isArray(props.children) === false) { // table only has a single column - return [ this.addCell(data, index, props.children) ]; + return [ CustomTable.addCell(data, index, props.children) ]; } const row = []; for (let child of props.children) { - row.push(this.addCell(data, index, child)); + row.push(CustomTable.addCell(data, index, child)); } return row; diff --git a/src/file/select-file.js b/src/file/select-file.js index 8c05cac..dc94b98 100644 --- a/src/file/select-file.js +++ b/src/file/select-file.js @@ -29,123 +29,123 @@ import LoginStore from '../user/login-store'; import AppDispatcher from '../common/app-dispatcher'; class SelectFile extends React.Component { - static getStores() { - return [ FileStore, LoginStore ]; + static getStores() { + return [ FileStore, LoginStore ]; + } + + static calculateState() { + return { + files: FileStore.getState(), + sessionToken: LoginStore.getState().token, + selectedFile: '', + uploadFile: null, + uploadProgress: 0 + }; + } + + componentDidMount() { + AppDispatcher.dispatch({ + type: 'files/start-load', + token: this.state.sessionToken + }); + } + + static getDerivedStateFromProps(props, state){ + if (props.value === state.selectedSimulator) { + return null; } - static calculateState() { - return { - files: FileStore.getState(), - sessionToken: LoginStore.getState().token, - selectedFile: '', - uploadFile: null, - uploadProgress: 0 - }; + let selectedSimulator = props.value; + if (selectedSimulator == null) { + if (state.simulators.length > 0) { + selectedSimulator = state.simulators[0]._id; + } else { + selectedSimulator = ''; + } } - componentDidMount() { - AppDispatcher.dispatch({ - type: 'files/start-load', - token: this.state.sessionToken - }); - } + return {selectedSimulator}; + } - componentWillReceiveProps(nextProps) { - if (nextProps.value === this.state.selectedSimulator) { - return; - } + handleChange = event => { + this.setState({ selectedFile: event.target.value }); - let selectedSimulator = nextProps.value; - if (selectedSimulator == null) { - if (this.state.simulators.length > 0) { - selectedSimulator = this.state.simulators[0]._id; - } else { - selectedSimulator = ''; - } - } + // send file to callback + if (this.props.onChange != null) { + const file = this.state.files.find(f => f._id === event.target.value); - this.setState({ selectedSimulator }); - } + this.props.onChange(file); + } + }; - handleChange = event => { - this.setState({ selectedFile: event.target.value }); + selectUploadFile = event => { + this.setState({ uploadFile: event.target.files[0] }); + }; - // send file to callback - if (this.props.onChange != null) { - const file = this.state.files.find(f => f._id === event.target.value); + startFileUpload = () => { + // upload file + const formData = new FormData(); + formData.append(0, this.state.uploadFile); - this.props.onChange(file); - } - } + AppDispatcher.dispatch({ + type: 'files/start-upload', + data: formData, + token: this.state.sessionToken, + progressCallback: this.updateUploadProgress, + finishedCallback: this.clearProgress + }); + }; - selectUploadFile = event => { - this.setState({ uploadFile: event.target.files[0] }); - } + updateUploadProgress = event => { + this.setState({ uploadProgress: parseInt(event.percent.toFixed(), 10) }); + }; - startFileUpload = () => { - // upload file - const formData = new FormData(); - formData.append(0, this.state.uploadFile); + clearProgress = () => { + // select uploaded file + const selectedFile = this.state.files[this.state.files.length - 1]._id; + this.setState({ selectedFile, uploadProgress: 0 }); + }; - AppDispatcher.dispatch({ - type: 'files/start-upload', - data: formData, - token: this.state.sessionToken, - progressCallback: this.updateUploadProgress, - finishedCallback: this.clearProgress - }); - } + render() { + const fileOptions = this.state.files.map(f => + + ); - updateUploadProgress = event => { - this.setState({ uploadProgress: parseInt(event.percent.toFixed(), 10) }); - } + const progressBarStyle = { + marginLeft: '100px', + marginTop: '-25px' + }; - clearProgress = () => { - // select uploaded file - const selectedFile = this.state.files[this.state.files.length - 1]._id; - this.setState({ selectedFile, uploadProgress: 0 }); - } + return
    + +
    + {this.props.name} + - render() { - const fileOptions = this.state.files.map(f => - - ); + + + {fileOptions} + + + - const progressBarStyle = { - marginLeft: '100px', - marginTop: '-25px' - }; + + + + + - return
    - -
    - {this.props.name} - + + + - - - {fileOptions} - - - - - - - - - - - - - - - - - - ; - } + + + + ; + } } let fluxContainerConverter = require('../common/FluxContainerConverter'); diff --git a/src/simulationmodel/signal-mapping.js b/src/simulationmodel/signal-mapping.js index ca65eac..1cf170b 100644 --- a/src/simulationmodel/signal-mapping.js +++ b/src/simulationmodel/signal-mapping.js @@ -41,12 +41,15 @@ class SignalMapping extends React.Component { }; } - componentWillReceiveProps(nextProps) { - if (nextProps.length === this.state.length && nextProps.signals === this.state.signals) { - return; - } + static getDerivedStateFromProps(props, state){ + if (props.length === state.length && props.signals === state.signals) { + return null + } - this.setState({ length: nextProps.length, signals: nextProps.signals }); + return{ + length: props.length, + signals: props.signals + }; } validateLength(){ diff --git a/src/simulationmodel/simulation-model.js b/src/simulationmodel/simulation-model.js index 15ba7ea..1864531 100644 --- a/src/simulationmodel/simulation-model.js +++ b/src/simulationmodel/simulation-model.js @@ -47,7 +47,7 @@ class SimulationModel extends React.Component { }; } - componentWillMount() { + componentDidMount() { AppDispatcher.dispatch({ type: 'simulationModels/start-load', data: this.props.match.params.simulationModel, diff --git a/src/simulator/select-simulator.js b/src/simulator/select-simulator.js index 2061adf..c84ee58 100644 --- a/src/simulator/select-simulator.js +++ b/src/simulator/select-simulator.js @@ -38,21 +38,23 @@ class SelectSimulator extends React.Component { }; } - componentWillReceiveProps(nextProps) { - if (nextProps.value === this.state.selectedSimulator) { - return; - } + static getDerivedStateFromProps(props, state){ + if (props.value === state.selectedSimulator) { + return null; // no change + } - let selectedSimulator = nextProps.value; - if (selectedSimulator == null) { - if (this.state.simulators.length > 0) { - selectedSimulator = this.state.simulators[0].id; - } else { - selectedSimulator = ''; - } + let selectedSimulator = props.value; + if (selectedSimulator == null) { + if (state.simulators.length > 0) { + selectedSimulator = state.simulators[0].id; + } else { + selectedSimulator = ''; } + } - this.setState({ selectedSimulator }); + return { + selectedSimulator + }; } handleChange = event => { @@ -64,7 +66,7 @@ class SelectSimulator extends React.Component { this.props.onChange(simulator); } - } + }; render() { const simulatorOptions = this.state.simulators.map(s => diff --git a/src/simulator/simulator-action.js b/src/simulator/simulator-action.js index e4f52ed..9e29deb 100644 --- a/src/simulator/simulator-action.js +++ b/src/simulator/simulator-action.js @@ -31,12 +31,15 @@ class SimulatorAction extends React.Component { }; } - componentWillReceiveProps(nextProps) { - if (this.state.selectedAction == null) { - if (nextProps.actions != null && nextProps.actions.length > 0) { - this.setState({ selectedAction: nextProps.actions[0] }); - } + static getDerivedStateFromProps(props, state){ + if (state.selectedAction == null) { + if (props.actions != null && props.actions.length > 0) { + return{ + selectedAction: props.actions[0] + }; } + } + return null } setAction = id => { @@ -46,7 +49,7 @@ class SimulatorAction extends React.Component { this.setState({ selectedAction: action }); } } - } + }; render() { const actionList = this.props.actions.map(action => ( diff --git a/src/simulator/simulators.js b/src/simulator/simulators.js index 354979a..3ae1b6f 100644 --- a/src/simulator/simulators.js +++ b/src/simulator/simulators.js @@ -87,7 +87,7 @@ class Simulators extends Component { }; } - componentWillMount() { + componentDidMount() { AppDispatcher.dispatch({ type: 'simulators/start-load', token: this.state.sessionToken, diff --git a/src/user/login.js b/src/user/login.js index 09679b6..d02114f 100644 --- a/src/user/login.js +++ b/src/user/login.js @@ -50,13 +50,14 @@ class Login extends Component { NotificationsDataManager.setSystem(this.refs.notificationSystem); } - componentWillUpdate(nextProps, nextState) { + componentDidUpdate(prevProps: Readonly

    , prevState: Readonly, snapshot: SS): void { + // if token stored locally, request user - if (nextState.token == null) { + if (this.state.token == null) { const token = localStorage.getItem('token'); const currentUser = localStorage.getItem('currentUser'); - if (token != null && token !== '' && nextState.currentUser == null) { + if (token != null && token !== '' && this.state.currentUser == null) { AppDispatcher.dispatch({ type: 'users/logged-in', token: token, @@ -65,12 +66,13 @@ class Login extends Component { } } else { // check if logged in - if (nextState.currentUser != null) { + if (this.state.currentUser != null) { // save login in local storage - localStorage.setItem('token', nextState.token); - localStorage.setItem('currentUser', JSON.stringify(nextState.currentUser)); + localStorage.setItem('token', this.state.token); + localStorage.setItem('currentUser', JSON.stringify(this.state.currentUser)); } } + } render() { diff --git a/src/user/logout.js b/src/user/logout.js index 2e19b43..dd1eafc 100644 --- a/src/user/logout.js +++ b/src/user/logout.js @@ -25,7 +25,7 @@ import { Redirect } from 'react-router-dom'; import AppDispatcher from '../common/app-dispatcher'; class Logout extends React.Component { - componentWillMount() { + componentDidMount() { AppDispatcher.dispatch({ type: 'users/logout' }); diff --git a/src/widget/edit-widget-aspect-control.js b/src/widget/edit-widget-aspect-control.js index 59af823..4152dbb 100644 --- a/src/widget/edit-widget-aspect-control.js +++ b/src/widget/edit-widget-aspect-control.js @@ -35,8 +35,10 @@ class EditWidgetAspectControl extends React.Component { }; } - componentWillReceiveProps(nextProps) { - this.setState({ widget: nextProps.widget }); + static getDerivedStateFromProps(props, state){ + return{ + widget: props.widget + }; } render() { diff --git a/src/widget/edit-widget-checkbox-control.js b/src/widget/edit-widget-checkbox-control.js index 41c17c6..66c8c57 100644 --- a/src/widget/edit-widget-checkbox-control.js +++ b/src/widget/edit-widget-checkbox-control.js @@ -35,8 +35,10 @@ class EditWidgetCheckboxControl extends React.Component { }; } - componentWillReceiveProps(nextProps) { - this.setState({ widget: nextProps.widget }); + static getDerivedStateFromProps(props, state){ + return{ + widget: props.widget + }; } render() { diff --git a/src/widget/edit-widget-color-control.js b/src/widget/edit-widget-color-control.js index cadafa8..7b9443b 100644 --- a/src/widget/edit-widget-color-control.js +++ b/src/widget/edit-widget-color-control.js @@ -49,9 +49,10 @@ class EditWidgetColorControl extends Component { }; } - componentWillReceiveProps(nextProps) { - // Update state's widget with props - this.setState({ widget: nextProps.widget }); + static getDerivedStateFromProps(props, state){ + return { + widget: props.widget + }; } render() { diff --git a/src/widget/edit-widget-color-zones-control.js b/src/widget/edit-widget-color-zones-control.js index 3e64684..741d43f 100644 --- a/src/widget/edit-widget-color-zones-control.js +++ b/src/widget/edit-widget-color-zones-control.js @@ -41,8 +41,10 @@ class EditWidgetColorZonesControl extends React.Component { }; } - componentWillReceiveProps(nextProps) { - this.setState({ widget: nextProps.widget }); + static getDerivedStateFromProps(props, state){ + return { + widget: props.widget + }; } addZone = () => { diff --git a/src/widget/edit-widget-html-content.js b/src/widget/edit-widget-html-content.js index e11fd60..f931ba9 100644 --- a/src/widget/edit-widget-html-content.js +++ b/src/widget/edit-widget-html-content.js @@ -36,9 +36,10 @@ class EditWidgetHTMLContent extends React.Component { event.stopPropagation(); } - componentWillReceiveProps(nextProps) { - // Update state's widget with props - this.setState({ widget: nextProps.widget }); + static getDerivedStateFromProps(props, state){ + return { + widget: props.widget + }; } render() { diff --git a/src/widget/edit-widget-image-control.js b/src/widget/edit-widget-image-control.js index 501e5eb..fe0c433 100644 --- a/src/widget/edit-widget-image-control.js +++ b/src/widget/edit-widget-image-control.js @@ -39,8 +39,10 @@ class EditImageWidgetControl extends React.Component { }; } - componentWillReceiveProps(nextProps) { - this.setState({ widget: nextProps.widget }); + static getDerivedStateFromProps(props, state){ + return { + widget: props.widget + }; } startFileUpload = () => { diff --git a/src/widget/edit-widget-min-max-control.js b/src/widget/edit-widget-min-max-control.js index b45aac8..e21530f 100644 --- a/src/widget/edit-widget-min-max-control.js +++ b/src/widget/edit-widget-min-max-control.js @@ -35,8 +35,10 @@ class EditWidgetMinMaxControl extends React.Component { } } - componentWillReceiveProps(nextProps) { - this.setState({ widget: nextProps.widget }); + static getDerivedStateFromProps(props, state){ + return{ + widget: props.widget + }; } render() { diff --git a/src/widget/edit-widget-number-control.js b/src/widget/edit-widget-number-control.js index e937aa8..d86722f 100644 --- a/src/widget/edit-widget-number-control.js +++ b/src/widget/edit-widget-number-control.js @@ -33,9 +33,10 @@ class EditWidgetNumberControl extends Component { }; } - componentWillReceiveProps(nextProps) { - // Update state's widget with props - this.setState({ widget: nextProps.widget }); + static getDerivedStateFromProps(props, state){ + return{ + widget: props.widget + }; } render() { diff --git a/src/widget/edit-widget-orientation.js b/src/widget/edit-widget-orientation.js index 2da449d..248f1c7 100644 --- a/src/widget/edit-widget-orientation.js +++ b/src/widget/edit-widget-orientation.js @@ -35,9 +35,10 @@ class EditWidgetOrientation extends Component { }; } - componentWillReceiveProps(nextProps) { - // Update state's widget with props - this.setState({ widget: nextProps.widget }); + static getDerivedStateFromProps(props, state){ + return { + widget: props.widget + }; } handleOrientationChange(orientation) { diff --git a/src/widget/edit-widget-parameters-control.js b/src/widget/edit-widget-parameters-control.js index 1831a5c..8fc37f8 100644 --- a/src/widget/edit-widget-parameters-control.js +++ b/src/widget/edit-widget-parameters-control.js @@ -32,9 +32,10 @@ class EditWidgetParametersControl extends Component { }; } - componentWillReceiveProps(nextProps) { - // Update state's widget with props - this.setState({ widget: nextProps.widget }); + static getDerivedStateFromProps(props, state){ + return { + widget: props.widget + }; } handleChange(value) { diff --git a/src/widget/edit-widget-signal-control.js b/src/widget/edit-widget-signal-control.js index 18a180f..1f01bb7 100644 --- a/src/widget/edit-widget-signal-control.js +++ b/src/widget/edit-widget-signal-control.js @@ -33,9 +33,10 @@ class EditWidgetSignalControl extends Component { }; } - componentWillReceiveProps(nextProps) { - // Update state's widget with props - this.setState({ widget: nextProps.widget }); + static getDerivedStateFromProps(props, state){ + return { + widget: props.widget + }; } render() { diff --git a/src/widget/edit-widget-signals-control.js b/src/widget/edit-widget-signals-control.js index 19ca43b..947e8fc 100644 --- a/src/widget/edit-widget-signals-control.js +++ b/src/widget/edit-widget-signals-control.js @@ -33,9 +33,10 @@ class EditWidgetSignalsControl extends Component { }; } - componentWillReceiveProps(nextProps) { - // Update state's widget with props - this.setState({ widget: nextProps.widget }); + static getDerivedStateFromProps(props, state){ + return { + widget: props.widget + }; } handleSignalChange(checked, index) { diff --git a/src/widget/edit-widget-text-control.js b/src/widget/edit-widget-text-control.js index c94887f..c0fc069 100644 --- a/src/widget/edit-widget-text-control.js +++ b/src/widget/edit-widget-text-control.js @@ -31,9 +31,10 @@ class EditWidgetTextControl extends Component { }; } - componentWillReceiveProps(nextProps) { - // Update state's widget with props - this.setState({ widget: nextProps.widget }); + static getDerivedStateFromProps(props, state){ + return { + widget: props.widget + }; } render() { diff --git a/src/widget/edit-widget-time-control.js b/src/widget/edit-widget-time-control.js index cd3d372..736dc70 100644 --- a/src/widget/edit-widget-time-control.js +++ b/src/widget/edit-widget-time-control.js @@ -33,8 +33,10 @@ class EditWidgetTimeControl extends Component { }; } - componentWillReceiveProps(nextProps) { - this.setState({ widget: nextProps.widget }); + static getDerivedStateFromProps(props, state){ + return{ + widget: props.widget + }; } render() { diff --git a/src/widget/widget-plot/plot.js b/src/widget/widget-plot/plot.js index 044598d..299b8f9 100644 --- a/src/widget/widget-plot/plot.js +++ b/src/widget/widget-plot/plot.js @@ -77,26 +77,26 @@ class Plot extends React.Component { this.removeInterval(); } - componentWillReceiveProps(nextProps) { - if (nextProps.time !== this.props.time) { + componentDidUpdate(prevProps: Readonly

    , prevState: Readonly, snapshot: SS): void { + if (prevProps.time !== this.props.time) { this.createInterval(); } let labelMargin = 0; - if (nextProps.yLabel !== '') { + if (this.props.yLabel !== '') { labelMargin = 30; } // check if data is invalid - if (nextProps.data == null || nextProps.data.length === 0 || nextProps.data[0].length === 0) { + if (this.props.data == null || this.props.data.length === 0 || this.props.data[0].length === 0) { // create empty plot axes - const xScale = scaleTime().domain([Date.now() - nextProps.time * 1000, Date.now()]).range([0, nextProps.width - leftMargin - labelMargin - rightMargin]); + const xScale = scaleTime().domain([Date.now() - this.props.time * 1000, Date.now()]).range([0, this.props.width - leftMargin - labelMargin - rightMargin]); let yScale; - if (nextProps.yUseMinMax) { - yScale = scaleLinear().domain([nextProps.yMin, nextProps.yMax]).range([nextProps.height + topMargin - bottomMargin, topMargin]); + if (this.props.yUseMinMax) { + yScale = scaleLinear().domain([this.props.yMin, this.props.yMax]).range([this.props.height + topMargin - bottomMargin, topMargin]); } else { - yScale = scaleLinear().domain([0, 10]).range([nextProps.height + topMargin - bottomMargin, topMargin]); + yScale = scaleLinear().domain([0, 10]).range([this.props.height + topMargin - bottomMargin, topMargin]); } const xAxis = axisBottom().scale(xScale).ticks(5).tickFormat(timeFormat("%M:%S")); @@ -106,17 +106,20 @@ class Plot extends React.Component { return; } - // only show data in requested time - let data = nextProps.data; + // check if requested time frame has changed + if(this.props.time !== prevProps.time) { + // only show data in requested time + let data = this.props.data; - const firstTimestamp = data[0][data[0].length - 1].x - (nextProps.time + 1) * 1000; - if (data[0][0].x < firstTimestamp) { - // only show data in range (+100 ms) - const index = data[0].findIndex(value => value.x >= firstTimestamp - 100); - data = data.map(values => values.slice(index)); + const firstTimestamp = data[0][data[0].length - 1].x - (this.props.time + 1) * 1000; + if (data[0][0].x < firstTimestamp) { + // only show data in range (+100 ms) + const index = data[0].findIndex(value => value.x >= firstTimestamp - 100); + data = data.map(values => values.slice(index)); + } + + this.setState({data, labelMargin}); } - - this.setState({ data, labelMargin }); } createInterval() { diff --git a/src/widget/widget.js b/src/widget/widget.js index 41de002..b0a8ee5 100644 --- a/src/widget/widget.js +++ b/src/widget/widget.js @@ -78,7 +78,7 @@ class Widget extends React.Component { }; } - componentWillMount() { + componentDidMount() { if (this.state.sessionToken == null) { return; } @@ -125,7 +125,7 @@ class Widget extends React.Component { simulationModel = model; } - + if (widget.type === 'CustomAction') { return } else if (widget.type === 'Action') { @@ -162,7 +162,7 @@ class Widget extends React.Component { return null; } - rn + rn render() { const element = this.createWidget(this.props.data); diff --git a/src/widget/widgets/custom-action.js b/src/widget/widgets/custom-action.js index 63005f3..4a3c0ca 100644 --- a/src/widget/widgets/custom-action.js +++ b/src/widget/widgets/custom-action.js @@ -37,17 +37,17 @@ class WidgetCustomAction extends Component { } static getStores() { - return [ SimulatorStore ]; + return [ SimulatorStore, LoginStore ]; } - componentWillReceiveProps(props) { + static getDerivedStateFromProps(props, state){ if (props.simulationModel === null) - return; + return null; //no change - this.setState({ + return{ simulator: SimulatorStore.getState().find(s => s._id === props.simulationModel.simulator), sessionToken: LoginStore.getState().token - }); + }; } onClick() { diff --git a/src/widget/widgets/gauge.js b/src/widget/widgets/gauge.js index bd268d4..6d29e80 100644 --- a/src/widget/widgets/gauge.js +++ b/src/widget/widgets/gauge.js @@ -22,6 +22,7 @@ import React, { Component } from 'react'; import { Gauge } from 'gaugeJS'; +//import {update} from "immutable"; class WidgetGauge extends Component { constructor(props) { @@ -33,7 +34,7 @@ class WidgetGauge extends Component { this.state = { value: 0, minValue: null, - maxValue: null + maxValue: null, }; } @@ -47,99 +48,122 @@ class WidgetGauge extends Component { //this.updateLabels(this.state.minValue, this.state.maxValue); } - componentWillReceiveProps(nextProps) { - if (nextProps.simulationModel == null) { - this.setState({ value: 0 }); - return; + componentDidUpdate(prevProps: Readonly

    , prevState: Readonly, snapshot: SS): void { + if(prevState.minValue !== this.state.minValue){ + this.gauge.setMinValue(this.state.minValue); + } + if(prevState.maxValue !== this.state.maxValue){ + this.gauge.maxValue = this.state.maxValue } - const simulator = nextProps.simulationModel.simulator; + // update gauge's value + if(prevState.value !== this.state.value){ + this.gauge.set(this.state.value) + } + + // update labels + if(prevState.minValue !== this.state.minValue || prevState.maxValue !== this.state.maxValue){ + this.updateLabels(this.state.minValue, this.state.maxValue) + } + + } + + static getDerivedStateFromProps(props, state){ + if (props.simulationModel == null) { + return{value:0}; + } + + const simulator = props.simulationModel.simulator; // update value - if (nextProps.data == null || nextProps.data[simulator] == null - || nextProps.data[simulator].output == null - || nextProps.data[simulator].output.values == null - || nextProps.data[simulator].output.values.length === 0 - || nextProps.data[simulator].output.values[0].length === 0) { - this.setState({ value: 0 }); - return; + if (props.data == null + || props.data[simulator] == null + || props.data[simulator].output == null + || props.data[simulator].output.values == null + || props.data[simulator].output.values.length === 0 + || props.data[simulator].output.values[0].length === 0) { + return{value:0}; } + // memorize if min or max value is updated + let updateValue = false; + let updateMinValue = false; + let updateMaxValue = false; + // check if value has changed - const signal = nextProps.data[simulator].output.values[nextProps.widget.customProperties.signal]; + const signal = props.data[simulator].output.values[props.widget.customProperties.signal]; // Take just 3 decimal positions // Note: Favor this method over Number.toFixed(n) in order to avoid a type conversion, since it returns a String if (signal != null) { const value = Math.round(signal[signal.length - 1].y * 1e3) / 1e3; - if (this.state.value !== value && value != null) { - this.setState({ value }); + let minValue = null; + let maxValue = null; + if (state.value !== value && value != null) { + //value has changed + updateValue = true; // update min-max if needed let updateLabels = false; - let minValue = this.state.minValue; - let maxValue = this.state.maxValue; + + minValue = state.minValue; + maxValue = state.maxValue; if (minValue == null) { minValue = value - 0.5; updateLabels = true; - - this.setState({ minValue }); - this.gauge.setMinValue(minValue); + updateMinValue = true; } if (maxValue == null) { maxValue = value + 0.5; updateLabels = true; - - this.setState({ maxValue }); - this.gauge.maxValue = maxValue; + updateMaxValue = true; } - if (nextProps.widget.customProperties.valueUseMinMax) { - if (this.state.minValue > nextProps.widget.customProperties.valueMin) { - minValue = nextProps.widget.customProperties.valueMin; - - this.setState({ minValue }); - this.gauge.setMinValue(minValue); - + if (props.widget.customProperties.valueUseMinMax) { + if (state.minValue > props.widget.customProperties.valueMin) { + minValue = props.widget.customProperties.valueMin; + updateMinValue = true; updateLabels = true; } - if (this.state.maxValue < nextProps.widget.customProperties.valueMax) { - maxValue = nextProps.widget.customProperties.valueMax; - - this.setState({ maxValue }); - this.gauge.maxValue = maxValue; - + if (state.maxValue < props.widget.customProperties.valueMax) { + maxValue = props.widget.customProperties.valueMax; + updateMaxValue = true; updateLabels = true; } } if (updateLabels === false) { // check if min/max changed - if (minValue > this.gauge.minValue) { - minValue = this.gauge.minValue; - updateLabels = true; - - this.setState({ minValue }); + if (minValue > state.gauge.minValue) { + minValue = state.gauge.minValue; + updateMinValue = true; } - if (maxValue < this.gauge.maxValue) { - maxValue = this.gauge.maxValue; - updateLabels = true; - - this.setState({ maxValue }); + if (maxValue < state.gauge.maxValue) { + maxValue = state.gauge.maxValue; + updateMaxValue = true; } } - - if (updateLabels) { - this.updateLabels(minValue, maxValue); - } - - // update gauge's value - this.gauge.set(value); } - } + + // prepare returned state + let returnState = null; + if(updateValue === true){ + returnState["value"] = value; + } + if(updateMinValue === true){ + returnState["minValue"] = minValue; + } + if(updateMaxValue === true){ + returnState["maxValue"] = maxValue; + } + + return returnState + } // if there is a signal + + } updateLabels(minValue, maxValue, force) { diff --git a/src/widget/widgets/image.js b/src/widget/widgets/image.js index a38c0b7..2427084 100644 --- a/src/widget/widgets/image.js +++ b/src/widget/widgets/image.js @@ -25,14 +25,15 @@ import AppDispatcher from '../../common/app-dispatcher'; import config from '../../config'; class WidgetImage extends React.Component { - componentWillReceiveProps(nextProps) { + + componentDidMount() { // Query the image referenced by the widget - let widgetFile = nextProps.widget.customProperties.file; - if (widgetFile && !nextProps.files.find(file => file._id === widgetFile)) { + let widgetFile = this.props.widget.customProperties.file; + if (widgetFile && !this.props.files.find(file => file.id === widgetFile)) { AppDispatcher.dispatch({ type: 'files/start-load', data: widgetFile, - token: nextProps.token + token: this.props.token }); } } diff --git a/src/widget/widgets/input.js b/src/widget/widgets/input.js index 464f9b0..dfd1318 100644 --- a/src/widget/widgets/input.js +++ b/src/widget/widgets/input.js @@ -34,24 +34,25 @@ class WidgetInput extends Component { }; } - componentWillReceiveProps(nextProps) { - if (nextProps.simulationModel == null) { - return; + static getDerivedStateFromProps(props, state){ + if (props.simulationModel == null) { + return null; } + let returnState = null; // Update value - if (nextProps.widget.customProperties.default_value && this.state.value === undefined) { - this.setState({ - value: nextProps.widget.customProperties.default_value - }); + if (props.widget.customProperties.default_value && this.state.value === undefined) { + returnState["value"] = props.widget.customProperties.default_value; } // Update unit - if (nextProps.widget.customProperties.simulationModel && nextProps.simulationModel.inputMapping && this.state.unit !== nextProps.simulationModel.inputMapping[nextProps.widget.customProperties.signal].type) { - this.setState({ - unit: nextProps.simulationModel.inputMapping[nextProps.widget.customProperties.signal].type - }); + if (props.widget.customProperties.simulationModel + && props.simulationModel.inputMapping + && state.unit !== props.simulationModel.inputMapping[props.widget.customProperties.signal].type) { + returnState["unit"] = props.simulationModel.inputMapping[props.widget.customProperties.signal].type; } + + return returnState; } valueIsChanging(newValue) { diff --git a/src/widget/widgets/lamp.js b/src/widget/widgets/lamp.js index 8ca0bcc..88845cd 100644 --- a/src/widget/widgets/lamp.js +++ b/src/widget/widgets/lamp.js @@ -33,25 +33,28 @@ class WidgetLamp extends Component { }; } - componentWillReceiveProps(nextProps) { - if (nextProps.simulationModel == null) { - this.setState({ value: '' }); - return; + static getDerivedStateFromProps(props, state){ + if (props.simulationModel == null) { + return{ value: ''}; } - const simulator = nextProps.simulationModel.simulator; + const simulator = props.simulationModel.simulator; // update value - if (nextProps.data == null || nextProps.data[simulator] == null || nextProps.data[simulator].output == null || nextProps.data[simulator].output.values == null) { - this.setState({ value: '' }); - return; + if (props.data == null + || props.data[simulator] == null + || props.data[simulator].output == null + || props.data[simulator].output.values == null) { + return{value:''}; } // check if value has changed - const signal = nextProps.data[simulator].output.values[nextProps.widget.customProperties.signal]; - if (signal != null && this.state.value !== signal[signal.length - 1].y) { - this.setState({ value: signal[signal.length - 1].y }); + const signal = props.data[simulator].output.values[props.widget.customProperties.signal]; + if (signal != null && state.value !== signal[signal.length - 1].y) { + return { value: signal[signal.length - 1].y }; } + + return null; } render() { diff --git a/src/widget/widgets/plot-table.js b/src/widget/widgets/plot-table.js index 7cd0cbf..397189e 100644 --- a/src/widget/widgets/plot-table.js +++ b/src/widget/widgets/plot-table.js @@ -36,25 +36,25 @@ class WidgetPlotTable extends Component { }; } - componentWillReceiveProps(nextProps) { - if (nextProps.simulationModel == null) { + componentDidUpdate(prevProps: Readonly

    , prevState: Readonly, snapshot: SS): void { + if (this.props.simulationModel == null) { return; } // Update internal selected signals state with props (different array objects) - if (this.props.widget.customProperties.signals !== nextProps.widget.customProperties.signals) { - this.setState( {signals: nextProps.widget.customProperties.signals}); + if (prevProps.widget.customProperties.signals !== this.props.widget.customProperties.signals) { + this.setState( {signals: this.props.widget.customProperties.signals}); } // Identify if there was a change in the preselected signals - if (JSON.stringify(nextProps.widget.customProperties.preselectedSignals) !== JSON.stringify(this.props.widget.customProperties.preselectedSignals) || this.state.preselectedSignals.length === 0) { + if (JSON.stringify(prevProps.widget.customProperties.preselectedSignals) !== JSON.stringify(this.props.widget.customProperties.preselectedSignals) + || this.state.preselectedSignals.length === 0) { // Update the currently selected signals by intersecting with the preselected signalsWidget // Do the same with the plot values - var intersection = this.computeIntersection(nextProps.widget.customProperties.preselectedSignals, nextProps.widget.customProperties.signals); + var intersection = this.computeIntersection(this.props.widget.customProperties.preselectedSignals, this.props.widget.customProperties.signals); this.setState({ signals: intersection }); - this.updatePreselectedSignalsState(nextProps); - return; + this.updatePreselectedSignalsState(this.props); } } @@ -63,14 +63,14 @@ class WidgetPlotTable extends Component { return preselectedSignals.filter( s => selectedSignals.includes(s)); } - updatePreselectedSignalsState(nextProps) { + updatePreselectedSignalsState(props) { // Create checkboxes using the signal indices from simulation model - if(nextProps.simulationModel.outputMapping){ - const preselectedSignals = nextProps.simulationModel.outputMapping.reduce( + if(props.simulationModel.outputMapping){ + const preselectedSignals = props.simulationModel.outputMapping.reduce( // Loop through simulation model signals (accum, model_signal, signal_index) => { // Append them if they belong to the current selected type - if (nextProps.widget.customProperties.preselectedSignals.indexOf(signal_index) > -1) { + if (props.widget.customProperties.preselectedSignals.indexOf(signal_index) > -1) { accum.push( { index: signal_index, @@ -81,7 +81,7 @@ class WidgetPlotTable extends Component { } return accum; }, []); - + this.setState({ preselectedSignals }); } } diff --git a/src/widget/widgets/plot.js b/src/widget/widgets/plot.js index 7a2425d..08e023a 100644 --- a/src/widget/widgets/plot.js +++ b/src/widget/widgets/plot.js @@ -34,24 +34,28 @@ class WidgetPlot extends React.Component { }; } - componentWillReceiveProps(nextProps) { - if (nextProps.simulationModel == null) { - this.setState({ data: [], legend: [] }); - return; + + static getDerivedStateFromProps(props, state){ + + if (props.simulationModel == null) { + return{ + data: [], + legend: [], + }; } - const simulator = nextProps.simulationModel.simulator; + const simulator = props.simulationModel.simulator; // Proceed if a simulation with models and a simulator are available - if (simulator && nextProps.data[simulator] != null && nextProps.data[simulator] != null && nextProps.data[simulator].output != null && nextProps.data[simulator].output.values != null) { - const chosenSignals = nextProps.widget.customProperties.signals; + if (simulator && props.data[simulator] != null && props.data[simulator] != null && props.data[simulator].output != null && props.data[simulator].output.values != null) { + const chosenSignals = props.widget.customProperties.signals; - const data = nextProps.data[simulator].output.values.filter((values, index) => ( - nextProps.widget.customProperties.signals.findIndex(value => value === index) !== -1 + const data = props.data[simulator].output.values.filter((values, index) => ( + props.widget.customProperties.signals.findIndex(value => value === index) !== -1 )); // Query the signals that will be displayed in the legend - const legend = nextProps.simulationModel.outputMapping.reduce( (accum, model_signal, signal_index) => { + const legend = props.simulationModel.outputMapping.reduce( (accum, model_signal, signal_index) => { if (chosenSignals.includes(signal_index)) { accum.push({ index: signal_index, name: model_signal.name, type: model_signal.type }); } @@ -59,10 +63,17 @@ class WidgetPlot extends React.Component { return accum; }, []); - this.setState({ data, legend }); + return{ + data: data, + legend: legend, + }; } else { - this.setState({ data: [], legend: [] }); + return{ + data: [], + legend: [], + }; } + } render() { diff --git a/src/widget/widgets/slider.js b/src/widget/widgets/slider.js index b536edd..602ad92 100644 --- a/src/widget/widgets/slider.js +++ b/src/widget/widgets/slider.js @@ -40,32 +40,42 @@ class WidgetSlider extends Component { this.state = { unit: 'bla', - + }; } - componentWillReceiveProps(nextProps) { - if (nextProps.simulationModel == null) { - return; + static getDerivedStateFromProps(props, state){ + if (props.simulationModel == null) { + return null; } + let returnState = {}; + // Update value - if (nextProps.widget.customProperties.default_value && this.state.value === undefined) { - this.setState({ - value: nextProps.widget.customProperties.default_value, - }); + if (props.widget.customProperties.default_value && state.value === undefined) { + returnState["value"] = props.widget.customProperties.default_value; } // Update unit - if (nextProps.widget.customProperties.simulationModel && nextProps.simulationModel.inputMapping && this.state.unit !== nextProps.simulationModel.inputMapping[nextProps.widget.customProperties.signal].type) { - this.setState({ - unit: nextProps.simulationModel.inputMapping[nextProps.widget.customProperties.signal].type - }); + if (props.widget.customProperties.simulationModel + && props.simulationModel.inputMapping && + state.unit !== props.simulationModel.inputMapping[props.widget.customProperties.signal].type) { + returnState["unit"] = props.simulationModel.inputMapping[props.widget.customProperties.signal].type; } + if (returnState !== {}){ + return returnState; + } + else{ + return null; + } + + } + + componentDidUpdate(prevProps: Readonly

    , prevState: Readonly, snapshot: SS): void { // Check if the orientation changed, update the size if it did - if (this.props.widget.customProperties.orientation !== nextProps.widget.customProperties.orientation) { - let baseWidget = nextProps.widget; + if (this.props.widget.customProperties.orientation !== prevProps.widget.customProperties.orientation) { + let baseWidget = this.props.widget; // Exchange dimensions and constraints let newWidget = Object.assign({}, baseWidget, { @@ -77,8 +87,9 @@ class WidgetSlider extends Component { maxHeight: baseWidget.customProperties.maxWidth }); - nextProps.onWidgetChange(newWidget); + this.props.onWidgetChange(newWidget); } + } valueIsChanging(newValue) { @@ -141,4 +152,4 @@ export default WidgetSlider; { fields.value } { this.props.widget.customProperties.showUnit && fields.unit } -)*/ \ No newline at end of file +)*/ diff --git a/src/widget/widgets/table.js b/src/widget/widgets/table.js index c618000..2843c8e 100644 --- a/src/widget/widgets/table.js +++ b/src/widget/widgets/table.js @@ -36,45 +36,55 @@ class WidgetTable extends Component { }; } - componentWillReceiveProps(nextProps) { - if (nextProps.simulationModel == null) { - this.setState({ rows: [], sequence: null }); - return; + + static getDerivedStateFromProps(props, state){ + if (props.simulationModel == null) { + return{ + rows: [], + sequence: null, + }; } - const simulator = nextProps.simulationModel.simulator; + const simulator = props.simulationModel.simulator; // check data - if (nextProps.data == null - || nextProps.data[simulator] == null - || nextProps.data[simulator].output == null - || nextProps.data[simulator].output.values.length === 0 - || nextProps.data[simulator].output.values[0].length === 0) { + if (props.data == null + || props.data[simulator] == null + || props.data[simulator].output == null + || props.data[simulator].output.values.length === 0 + || props.data[simulator].output.values[0].length === 0) { // clear values - this.setState({ rows: [], sequence: null, showUnit: false }); - return; + return{ + rows: [], + sequence: null, + showUnit: false, + }; } // check if new data, otherwise skip - /*if (this.state.sequence >= nextProps.data[simulator.node][simulator.simulator].sequence) { + /*if (state.sequence >= props.data[simulator.node][simulator.simulator].sequence) { return; }*/ // get rows const rows = []; - nextProps.data[simulator].output.values.forEach((signal, index) => { - if (index < nextProps.simulationModel.outputMapping.length) { + props.data[simulator].output.values.forEach((signal, index) => { + if (index < props.simulationModel.outputMapping.length) { rows.push({ - name: nextProps.simulationModel.outputMapping[index].name, - unit: nextProps.simulationModel.outputMapping[index].type, + name: props.simulationModel.outputMapping[index].name, + unit: props.simulationModel.outputMapping[index].type, value: signal[signal.length - 1].y }); } }); - this.setState({ showUnit: nextProps.showUnit, rows: rows, sequence: nextProps.data[simulator].output.sequence }); + return { + showUnit: props.showUnit, + rows: rows, + sequence: props.data[simulator].output.sequence + }; } render() { diff --git a/src/widget/widgets/topology.js b/src/widget/widgets/topology.js index 00542a3..5c3ce7e 100644 --- a/src/widget/widgets/topology.js +++ b/src/widget/widgets/topology.js @@ -28,12 +28,12 @@ import { cimsvg } from 'libcimsvg'; // Do not show Pintura's grid const pinturaGridStyle = { display: 'none' -} +}; // Avoid another color in the frontend const pinturaBackingStyle = { fill: 'transparent' -} +}; // Center spinner const spinnerContainerStyle = { @@ -42,16 +42,16 @@ const spinnerContainerStyle = { display: 'flex', justifyContent: 'center', alignItems: 'center' -} +}; // Topology failed message const msgContainerStyle = Object.assign({ backgroundColor: '#ececec' -},spinnerContainerStyle) +},spinnerContainerStyle); const msgStyle = { fontWeight: 'bold' -} +}; // Initialize functions function attachComponentEvents() { @@ -105,10 +105,12 @@ class WidgetTopology extends React.Component { detachComponentEvents(); } - componentWillReceiveProps(nextProps) { - const file = nextProps.files.find(file => file._id === nextProps.widget.customProperties.file); + componentDidUpdate(prevProps: Readonly

    , prevState: Readonly, snapshot: SS): void { + const file = this.props.files.find(file => file._id === this.props.widget.customProperties.file); // Ensure model is requested only once or a different was selected - if (this.props.widget.customProperties.file !== nextProps.widget.customProperties.file || (this.state.dashboardState === 'initial' && file)) { + if (prevProps.widget.customProperties.file !== this.props.widget.customProperties.file + || (prevState.dashboardState === 'initial' && file)) { + this.setState({'dashboardState': 'loading' }); if (file) { fetch(new Request('/' + config.publicPathBase + file.path)) @@ -141,7 +143,7 @@ class WidgetTopology extends React.Component { } } else { // No file has been selected - if (!nextProps.widget.customProperties.file) { + if (!this.props.widget.customProperties.file) { this.setState({ 'dashboardState': 'show_message', 'message': 'Select a topology model first.'}); diff --git a/src/widget/widgets/value.js b/src/widget/widgets/value.js index 49393db..6c9d32b 100644 --- a/src/widget/widgets/value.js +++ b/src/widget/widgets/value.js @@ -32,28 +32,31 @@ class WidgetValue extends Component { }; } - componentWillReceiveProps(nextProps) { - if (nextProps.simulationModel == null) { - this.setState({ value: '' }); - return; + static getDerivedStateFromProps(props, state){ + if (props.simulationModel == null) { + return{ value: '' }; } - const simulator = nextProps.simulationModel.simulator; + const simulator = props.simulationModel.simulator; // update value - if (nextProps.data == null || nextProps.data[simulator] == null || nextProps.data[simulator].output == null || nextProps.data[simulator].output.values == null) { - this.setState({ value: '' }); - return; + if (props.data == null || props.data[simulator] == null || props.data[simulator].output == null || props.data[simulator].output.values == null) { + return{ value: '' }; } - //const unit = nextProps.simulationModel.outputMapping[nextProps.widget.customProperties.signal].type; + // TODO fixme (unit) + //const unit = props.simulationModel.outputMapping[props.widget.customProperties.signal].type; const unit = 42; // check if value has changed - const signal = nextProps.data[simulator].output.values[nextProps.widget.customProperties.signal]; - if (signal != null && this.state.value !== signal[signal.length - 1].y) { - this.setState({ value: signal[signal.length - 1].y, unit }); + const signal = props.data[simulator].output.values[props.widget.customProperties.signal]; + if (signal != null && state.value !== signal[signal.length - 1].y) { + return { + value: signal[signal.length - 1].y, + unit: unit, + }; } + } render() { From 251aec38d9b3ae1198179f029f96b7f5d0631a23 Mon Sep 17 00:00:00 2001 From: Sonja Happ Date: Thu, 16 Jan 2020 16:49:00 +0100 Subject: [PATCH 070/391] fix icons of dashboard button group --- src/dashboard/dashboard-button-group.js | 18 ++++++------------ 1 file changed, 6 insertions(+), 12 deletions(-) diff --git a/src/dashboard/dashboard-button-group.js b/src/dashboard/dashboard-button-group.js index 04163f0..35da165 100644 --- a/src/dashboard/dashboard-button-group.js +++ b/src/dashboard/dashboard-button-group.js @@ -40,20 +40,17 @@ class DashboardButtonGroup extends React.Component { if (this.props.editing) { buttons.push( , ); } else { if (this.props.fullscreen !== true) { buttons.push( ); } @@ -61,23 +58,20 @@ class DashboardButtonGroup extends React.Component { if (this.props.paused) { buttons.push( ); } else { buttons.push( ); } buttons.push( ); } From 9516ced50cd8cea7ca9675cbf0e5e42f6a2c68ae Mon Sep 17 00:00:00 2001 From: Laura Fuentes Grau Date: Tue, 21 Jan 2020 10:26:52 +0100 Subject: [PATCH 071/391] widgets are now rendered in edit mode --- src/dashboard/dashboard.js | 33 +++++++++++++------- src/dashboard/dropzone.js | 1 + src/dashboard/widget-area.js | 4 +-- src/dashboard/widget-context-menu.js | 1 - src/widget/edit-widget-control-creator.js | 2 +- src/widget/edit-widget-simulation-control.js | 3 -- src/widget/editable-widget-container.js | 26 +++++++-------- src/widget/widget.js | 2 +- src/widget/widgets/label.js | 3 +- 9 files changed, 40 insertions(+), 35 deletions(-) diff --git a/src/dashboard/dashboard.js b/src/dashboard/dashboard.js index a6b277f..899a355 100644 --- a/src/dashboard/dashboard.js +++ b/src/dashboard/dashboard.js @@ -322,17 +322,14 @@ class Dashboard extends Component { } widgetChange(widget, index, callback = null){ - const widgets = this.state.dashboard.get('widgets'); - widgets[index] = widget; + console.log("widget change was called (dashboard)"); - const dashboard = this.state.dashboard.set('widgets'); - - // Check if the height needs to be increased, the section may have shrunk if not - if (!this.increaseHeightWithWidget(widget)) { - this.computeHeightWithWidgets(dashboard.widgets); - } - - this.setState({ dashboard }, callback); + AppDispatcher.dispatch({ + type: 'widgets/start-edit', + token: this.state.sessionToken, + data: widget + }); + } @@ -495,8 +492,8 @@ class Dashboard extends Component { key={widgetKey} data={widgets[widgetKey]} simulation={this.state.simulation} - onWidgetChange={this.widgetChange} - onWidgetStatusChange={this.widgetStatusChange} + onWidgetChange={this.widgetChange.bind(this)} + onWidgetStatusChange={this.widgetStatusChange.bind(this)} editing={this.state.editing} index={parseInt(widgetKey,10)} grid={grid} @@ -518,6 +515,18 @@ class Dashboard extends Component { /* onWidgetChange={(w, k) => this.widgetChange(w, k)} onWidgetStatusChange={(w, k) => this.widgetStatusChange(w, k)} + +const widgets = this.state.dashboard.get('widgets'); + widgets[index] = widget; + + const dashboard = this.state.dashboard.set('widgets'); + + // Check if the height needs to be increased, the section may have shrunk if not + if (!this.increaseHeightWithWidget(widget)) { + this.computeHeightWithWidgets(dashboard.widgets); + } + + this.setState({ dashboard }, callback); */ let fluxContainerConverter = require('../common/FluxContainerConverter'); diff --git a/src/dashboard/dropzone.js b/src/dashboard/dropzone.js index d73a295..979a692 100644 --- a/src/dashboard/dropzone.js +++ b/src/dashboard/dropzone.js @@ -62,6 +62,7 @@ function collect(connect, monitor) { class Dropzone extends React.Component { render() { + var toolboxClass = classNames({ 'box-content': true, 'toolbox-dropzone': true, diff --git a/src/dashboard/widget-area.js b/src/dashboard/widget-area.js index f3e7c0f..8a06382 100644 --- a/src/dashboard/widget-area.js +++ b/src/dashboard/widget-area.js @@ -48,7 +48,7 @@ class WidgetArea extends React.Component { } render() { - const maxHeight = Object.values(this.props.widgets).reduce((currentHeight, widget) => { + const maxHeight = Object.values(this.props.widgets).reduce((currentHeight, widget) => { const absolutHeight = widget.y + widget.height; return absolutHeight > currentHeight ? absolutHeight : currentHeight; @@ -67,7 +67,7 @@ WidgetArea.propTypes = { editing: PropTypes.bool, grid: PropTypes.number, defaultSimulationModel: PropTypes.string, - widgets: PropTypes.array, + //widgets: PropTypes.array, onWidgetAdded: PropTypes.func }; diff --git a/src/dashboard/widget-context-menu.js b/src/dashboard/widget-context-menu.js index ee53b4a..ae8c40f 100644 --- a/src/dashboard/widget-context-menu.js +++ b/src/dashboard/widget-context-menu.js @@ -33,7 +33,6 @@ class WidgetContextMenu extends React.Component { deleteWidget = event => { if (this.props.onDelete != null) { - console.log("deleteWIget in wcm was called"); this.props.onDelete(this.props.widget, this.props.index); } }; diff --git a/src/widget/edit-widget-control-creator.js b/src/widget/edit-widget-control-creator.js index f435085..c0b853c 100644 --- a/src/widget/edit-widget-control-creator.js +++ b/src/widget/edit-widget-control-creator.js @@ -38,7 +38,7 @@ import EditWidgetMinMaxControl from './edit-widget-min-max-control'; import EditWidgetHTMLContent from './edit-widget-html-content'; import EditWidgetParametersControl from './edit-widget-parameters-control'; -export default function CreateControls(widgetType = null, widget = null, sessionToken = null, files = null, validateForm, simulationModels, handleChange) { +export default function CreateControls(widgetType = null, widget = null, sessionToken = null, files = null, validateForm, simulationModels = null, handleChange) { // Use a list to concatenate the controls according to the widget type var DialogControls = []; diff --git a/src/widget/edit-widget-simulation-control.js b/src/widget/edit-widget-simulation-control.js index 8862567..ffeb212 100644 --- a/src/widget/edit-widget-simulation-control.js +++ b/src/widget/edit-widget-simulation-control.js @@ -28,9 +28,6 @@ class EditWidgetSimulationControl extends Component { this.state = { widget: { - customProperties: { - simulationModel: '' - } } }; } diff --git a/src/widget/editable-widget-container.js b/src/widget/editable-widget-container.js index 27824b4..29140a0 100644 --- a/src/widget/editable-widget-container.js +++ b/src/widget/editable-widget-container.js @@ -90,21 +90,21 @@ class EditableWidgetContainer extends React.Component { const widget = this.props.widget; const resizing = { - bottom: !widget.locked, - bottomLeft: !widget.locked, - bottomRight: !widget.locked, - left: !widget.locked, - right: !widget.locked, - top: !widget.locked, - topLeft: !widget.locked, - topRight: !widget.locked + bottom: !widget.isLocked, + bottomLeft: !widget.isLocked, + bottomRight: !widget.isLocked, + left: !widget.isLocked, + right: !widget.idLocked, + top: !widget.isLocked, + topLeft: !widget.isLocked, + topRight: !widget.isLocked }; const gridArray = [ this.props.grid, this.props.grid ]; const widgetClasses = classNames({ 'editing-widget': true, - 'locked': widget.locked + 'locked': widget.isLocked }); return -

    + {this.props.children} - + ; } } diff --git a/src/widget/widget.js b/src/widget/widget.js index 41de002..b32f96f 100644 --- a/src/widget/widget.js +++ b/src/widget/widget.js @@ -168,7 +168,7 @@ class Widget extends React.Component { const element = this.createWidget(this.props.data); if (this.props.editing) { - return + return {element} ; } diff --git a/src/widget/widgets/label.js b/src/widget/widgets/label.js index 2ee131f..ed4400d 100644 --- a/src/widget/widgets/label.js +++ b/src/widget/widgets/label.js @@ -25,8 +25,7 @@ import EditWidgetColorControl from '../edit-widget-color-control'; class WidgetLabel extends Component { render() { - - const style = { + const style = { fontSize: this.props.widget.customProperties.textSize + 'px', color: EditWidgetColorControl.ColorPalette[this.props.widget.customProperties.fontColor] }; From 10bb5c263fdc9415c229f01944b2a60b392a8584 Mon Sep 17 00:00:00 2001 From: Laura Fuentes Grau Date: Tue, 21 Jan 2020 13:46:28 +0100 Subject: [PATCH 072/391] fixed edit bug --- src/dashboard/dashboard.js | 8 +++----- src/widget/edit-widget-control-creator.js | 2 +- src/widget/edit-widget-orientation.js | 2 +- src/widget/edit-widget-simulation-control.js | 8 +++++--- src/widget/edit-widget.js | 12 ------------ src/widget/editable-widget-container.js | 1 - 6 files changed, 10 insertions(+), 23 deletions(-) diff --git a/src/dashboard/dashboard.js b/src/dashboard/dashboard.js index 899a355..47b7602 100644 --- a/src/dashboard/dashboard.js +++ b/src/dashboard/dashboard.js @@ -322,13 +322,13 @@ class Dashboard extends Component { } widgetChange(widget, index, callback = null){ - console.log("widget change was called (dashboard)"); + AppDispatcher.dispatch({ type: 'widgets/start-edit', token: this.state.sessionToken, data: widget - }); + }); } @@ -358,8 +358,7 @@ class Dashboard extends Component { closeEdit(data){ - console.log("dashboard close edit was called: "); - console.log(data); + if (data == null) { this.setState({ editModal: false }); @@ -383,7 +382,6 @@ class Dashboard extends Component { const dashboard = this.state.dashboard.set('widgets'); this.setState({ dashboard });*/ - console.log("delete Widget in dashboard was called"); AppDispatcher.dispatch({ type: 'widgets/start-remove', data: widget, diff --git a/src/widget/edit-widget-control-creator.js b/src/widget/edit-widget-control-creator.js index c0b853c..f435085 100644 --- a/src/widget/edit-widget-control-creator.js +++ b/src/widget/edit-widget-control-creator.js @@ -38,7 +38,7 @@ import EditWidgetMinMaxControl from './edit-widget-min-max-control'; import EditWidgetHTMLContent from './edit-widget-html-content'; import EditWidgetParametersControl from './edit-widget-parameters-control'; -export default function CreateControls(widgetType = null, widget = null, sessionToken = null, files = null, validateForm, simulationModels = null, handleChange) { +export default function CreateControls(widgetType = null, widget = null, sessionToken = null, files = null, validateForm, simulationModels, handleChange) { // Use a list to concatenate the controls according to the widget type var DialogControls = []; diff --git a/src/widget/edit-widget-orientation.js b/src/widget/edit-widget-orientation.js index 2da449d..1cb612b 100644 --- a/src/widget/edit-widget-orientation.js +++ b/src/widget/edit-widget-orientation.js @@ -60,7 +60,7 @@ class EditWidgetOrientation extends Component { let name = WidgetSlider.OrientationTypes[type].name; return ( - this.handleOrientationChange(value)}> + this.handleOrientationChange(value)}> ) }) } diff --git a/src/widget/edit-widget-simulation-control.js b/src/widget/edit-widget-simulation-control.js index ffeb212..50ad8bf 100644 --- a/src/widget/edit-widget-simulation-control.js +++ b/src/widget/edit-widget-simulation-control.js @@ -28,18 +28,20 @@ class EditWidgetSimulationControl extends Component { this.state = { widget: { + customProperties: { + simulationModel: '' + } + } }; } - componentDidUpdate(nextProps) { + componentWillReceiveProps(nextProps) { // Update state's widget with props this.setState({ widget: nextProps.widget }); } render() { - console.log("editwidgetsimulationcontrol was called"); - console.log(this.state.widget); return ( Simulation Model diff --git a/src/widget/edit-widget.js b/src/widget/edit-widget.js index 021fcd7..621dc03 100644 --- a/src/widget/edit-widget.js +++ b/src/widget/edit-widget.js @@ -46,8 +46,6 @@ class EditWidgetDialog extends React.Component { onClose(canceled) { - console.log("in editWidget. the temporal state: "); - console.log(this.state.temporal); if (canceled === false) { if (this.valid) { this.props.onClose(this.state.temporal); @@ -72,11 +70,8 @@ class EditWidgetDialog extends React.Component { if (e.constructor === Array) { // Every property in the array will be updated - console.log("####its an array!"); let changes = e.reduce( (changesObject, event) => { changesObject[event.target.id] = event.target.value; - console.log("hier ist changes object: "); - console.log(changesObject); return changesObject; }, {}); @@ -110,13 +105,6 @@ class EditWidgetDialog extends React.Component { changeObject[e.target.id] = e.target.value; } - console.log("this.state.temporal is: "); - console.log(this.state.temporal); - console.log("the event target id: " + e.target.id); - console.log("this state target type is: " + e.target.type); - console.log("the value is: " + e.target.value) - console.log("change Object is: "); - console.log(changeObject); let finalChange = this.state.temporal; diff --git a/src/widget/editable-widget-container.js b/src/widget/editable-widget-container.js index 29140a0..9b4c3bf 100644 --- a/src/widget/editable-widget-container.js +++ b/src/widget/editable-widget-container.js @@ -23,7 +23,6 @@ import React from 'react'; import PropTypes from 'prop-types'; import classNames from 'classnames'; import { Rnd } from 'react-rnd'; -import { Menu } from 'react-contexify'; class EditableWidgetContainer extends React.Component { constructor(props) { From 0bfeb325cbab091683408c25026664553372d5aa Mon Sep 17 00:00:00 2001 From: Laura Fuentes Grau Date: Tue, 21 Jan 2020 21:33:41 +0100 Subject: [PATCH 073/391] widgets are now resizable --- src/dashboard/dashboard.js | 18 ++++++++++++------ src/widget/editable-widget-container.js | 3 ++- 2 files changed, 14 insertions(+), 7 deletions(-) diff --git a/src/dashboard/dashboard.js b/src/dashboard/dashboard.js index 47b7602..5b2e7bd 100644 --- a/src/dashboard/dashboard.js +++ b/src/dashboard/dashboard.js @@ -162,6 +162,7 @@ class Dashboard extends Component { editModal: false, modalData: null, modalIndex: null, + widgetChangeData: [], maxWidgetHeight: maxHeight || null, dropZoneHeight: maxHeight +80 || null, @@ -323,12 +324,10 @@ class Dashboard extends Component { widgetChange(widget, index, callback = null){ + let tempChanges = this.state.widgetChangeData; + tempChanges.push(widget); - AppDispatcher.dispatch({ - type: 'widgets/start-edit', - token: this.state.sessionToken, - data: widget - }); + this.setState({ widgetChangeData: tempChanges}) } @@ -397,6 +396,13 @@ class Dashboard extends Component { saveEditing() { // Provide the callback so it can be called when state change is applied // TODO: Check if callback is needed + this.state.widgetChangeData.forEach( widget => { + AppDispatcher.dispatch({ + type: 'widgets/start-edit', + token: this.state.sessionToken, + data: widget + }); + }); this.setState({ editing: false }); }; @@ -414,7 +420,7 @@ class Dashboard extends Component { } cancelEditing() { - this.setState({ editing: false }); + this.setState({ editing: false, widgetChangeData: [] }); }; diff --git a/src/widget/editable-widget-container.js b/src/widget/editable-widget-container.js index 9b4c3bf..572a1ea 100644 --- a/src/widget/editable-widget-container.js +++ b/src/widget/editable-widget-container.js @@ -65,7 +65,8 @@ class EditableWidgetContainer extends React.Component { } }; - resizeStop = (direction, delta, ref, event) => { + resizeStop = (event, direction, ref,delta, position) => { + const widget = this.props.widget; // resize depends on direction From 0dc1365a83adf8e91389c7e83eab7be48253f7e9 Mon Sep 17 00:00:00 2001 From: Laura Fuentes Grau Date: Sat, 25 Jan 2020 18:57:56 +0100 Subject: [PATCH 074/391] wip: Cancel restores old dashboard --- src/dashboard/dashboard.js | 26 ++++++++++++++++++++++++-- src/widget/widget.js | 5 +++-- 2 files changed, 27 insertions(+), 4 deletions(-) diff --git a/src/dashboard/dashboard.js b/src/dashboard/dashboard.js index 5b2e7bd..7180a81 100644 --- a/src/dashboard/dashboard.js +++ b/src/dashboard/dashboard.js @@ -62,7 +62,7 @@ class Dashboard extends Component { let dashboards = DashboardStore.getState() let rawDashboard = dashboards[props.match.params.dashboard - 1]; - + if (rawDashboard) { dashboard = Map(rawDashboard); @@ -163,6 +163,7 @@ class Dashboard extends Component { modalData: null, modalIndex: null, widgetChangeData: [], + widgetAddData:[], maxWidgetHeight: maxHeight || null, dropZoneHeight: maxHeight +80 || null, @@ -303,6 +304,11 @@ class Dashboard extends Component { token: this.state.sessionToken, data: widget }); + + let tempChanges = this.state.widgetAddData; + tempChanges.push(widget); + + this.setState({ widgetAddData: tempChanges}) /*let widgets = []; widgets = this.state.dashboard.get('widgets'); @@ -396,6 +402,8 @@ class Dashboard extends Component { saveEditing() { // Provide the callback so it can be called when state change is applied // TODO: Check if callback is needed + + this.state.widgetChangeData.forEach( widget => { AppDispatcher.dispatch({ type: 'widgets/start-edit', @@ -420,7 +428,21 @@ class Dashboard extends Component { } cancelEditing() { - this.setState({ editing: false, widgetChangeData: [] }); + console.log("cancelEditing the add data: "); + console.log(this.state.widgetAddData); + this.state.widgetAddData.forEach( widget => { + AppDispatcher.dispatch({ + type: 'widgets/start-remove', + data: widget, + token: this.state.sessionToken + }); + }); + AppDispatcher.dispatch({ + type: 'widgets/start-load', + token: this.state.sessionToken, + param: '?dashboardID=1' + }); + this.setState({ editing: false, widgetChangeData: [], widgetAddData: [] }); }; diff --git a/src/widget/widget.js b/src/widget/widget.js index b32f96f..0efb6dc 100644 --- a/src/widget/widget.js +++ b/src/widget/widget.js @@ -82,11 +82,12 @@ class Widget extends React.Component { if (this.state.sessionToken == null) { return; } - AppDispatcher.dispatch({ + + /*AppDispatcher.dispatch({ type: 'files/start-load', token: this.state.sessionToken, param: '?objectID=1&objectType=widget' - }); + });*/ AppDispatcher.dispatch({ type: 'simulationModels/start-load', From 95c7a8656195b9733be1466e34e3aea71a28d196 Mon Sep 17 00:00:00 2001 From: Sonja Happ Date: Mon, 27 Jan 2020 14:26:11 +0100 Subject: [PATCH 075/391] Remove one more componentWillUpdate #212 --- src/widget/edit-widget-simulation-control.js | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/widget/edit-widget-simulation-control.js b/src/widget/edit-widget-simulation-control.js index 50ad8bf..bb5059d 100644 --- a/src/widget/edit-widget-simulation-control.js +++ b/src/widget/edit-widget-simulation-control.js @@ -36,9 +36,10 @@ class EditWidgetSimulationControl extends Component { }; } - componentWillReceiveProps(nextProps) { - // Update state's widget with props - this.setState({ widget: nextProps.widget }); + static getDerivedStateFromProps(props, state){ + return{ + widget: props.widget + }; } render() { From d954941d9f6de7c39643dd9b768a42999a8ed160 Mon Sep 17 00:00:00 2001 From: Laura Fuentes Grau Date: Tue, 28 Jan 2020 12:31:36 +0100 Subject: [PATCH 076/391] most widgets now editable again --- src/dashboard/dashboard.js | 23 +++++++++++++++-------- src/dashboard/widget-context-menu.js | 2 +- src/widget/edit-widget-color-control.js | 2 +- src/widget/edit-widget-image-control.js | 6 +++--- src/widget/edit-widget.js | 6 ++++++ 5 files changed, 26 insertions(+), 13 deletions(-) diff --git a/src/dashboard/dashboard.js b/src/dashboard/dashboard.js index 7180a81..b0e0f6f 100644 --- a/src/dashboard/dashboard.js +++ b/src/dashboard/dashboard.js @@ -56,6 +56,7 @@ class Dashboard extends Component { if (prevState == null) { prevState = {}; } + const sessionToken = LoginStore.getState().token; let maxHeight = null; let dashboard = Map(); @@ -163,7 +164,7 @@ class Dashboard extends Component { modalData: null, modalIndex: null, widgetChangeData: [], - widgetAddData:[], + widgetAddData:prevState.widgetAddData || [], maxWidgetHeight: maxHeight || null, dropZoneHeight: maxHeight +80 || null, @@ -298,6 +299,12 @@ class Dashboard extends Component { handleDrop(widget) { widget.dashboardID = this.state.dashboard.get('id'); console.log(widget); + let tempChanges = this.state.widgetAddData; + tempChanges.push(widget); + console.log("handle drop. the temp changes: "); + console.log(tempChanges); + + this.setState({ widgetAddData: tempChanges}) AppDispatcher.dispatch({ type: 'widgets/start-add', @@ -305,10 +312,7 @@ class Dashboard extends Component { data: widget }); - let tempChanges = this.state.widgetAddData; - tempChanges.push(widget); - - this.setState({ widgetAddData: tempChanges}) + /*let widgets = []; widgets = this.state.dashboard.get('widgets'); @@ -428,15 +432,17 @@ class Dashboard extends Component { } cancelEditing() { - console.log("cancelEditing the add data: "); - console.log(this.state.widgetAddData); + //raw widget has no id -> cannot be deleted in its original form + /* this.state.widgetAddData.forEach( widget => { AppDispatcher.dispatch({ type: 'widgets/start-remove', data: widget, token: this.state.sessionToken }); - }); + }); */ + + AppDispatcher.dispatch({ type: 'widgets/start-load', token: this.state.sessionToken, @@ -462,6 +468,7 @@ class Dashboard extends Component { render() { + const widgets = this.state.dashboard.get('widgets'); const grid = this.state.dashboard.get('grid'); const boxClasses = classNames('section', 'box', { 'fullscreen-padding': this.props.isFullscreen }); diff --git a/src/dashboard/widget-context-menu.js b/src/dashboard/widget-context-menu.js index ae8c40f..1fa0967 100644 --- a/src/dashboard/widget-context-menu.js +++ b/src/dashboard/widget-context-menu.js @@ -113,7 +113,7 @@ class WidgetContextMenu extends React.Component { ); return
    - + Image - this.props.handleChange(e)}> + this.props.handleChange(e)}> {this.props.files.length === 0 ? ( ) : ( @@ -96,8 +96,8 @@ class EditImageWidgetControl extends React.Component { this.setState({ fileList: e.target.files }) } /> - - + +
    ; } } diff --git a/src/widget/edit-widget.js b/src/widget/edit-widget.js index 621dc03..d56dae3 100644 --- a/src/widget/edit-widget.js +++ b/src/widget/edit-widget.js @@ -43,6 +43,12 @@ class EditWidgetDialog extends React.Component { }; } + static getDerivedStateFromProps(props, state){ + return { + temporal: props.widget + }; + } + onClose(canceled) { From cfef3fb7e0faef7942f2b7832333e46d3b542893 Mon Sep 17 00:00:00 2001 From: Sonja Happ Date: Tue, 28 Jan 2020 14:03:20 +0100 Subject: [PATCH 077/391] fix issue with FluxContainerConverter workaround --- src/file/select-file.js | 5 ++--- src/scenario/scenarios.js | 5 ++--- src/simulationmodel/simulation-model.js | 5 ++--- src/simulator/select-simulator.js | 5 ++--- src/simulator/simulators.js | 5 ++--- src/user/login.js | 5 ++--- src/widget/widget.js | 5 ++--- 7 files changed, 14 insertions(+), 21 deletions(-) diff --git a/src/file/select-file.js b/src/file/select-file.js index a37912b..dc94b98 100644 --- a/src/file/select-file.js +++ b/src/file/select-file.js @@ -28,8 +28,6 @@ import LoginStore from '../user/login-store'; import AppDispatcher from '../common/app-dispatcher'; -import FluxContainerConverter from "../common/FluxContainerConverter"; - class SelectFile extends React.Component { static getStores() { return [ FileStore, LoginStore ]; @@ -150,4 +148,5 @@ class SelectFile extends React.Component { } } -export default Container.create(FluxContainerConverter.convert(SelectFile)); +let fluxContainerConverter = require('../common/FluxContainerConverter'); +export default Container.create(fluxContainerConverter.convert(SelectFile)); diff --git a/src/scenario/scenarios.js b/src/scenario/scenarios.js index 5873d6e..1cd1e04 100644 --- a/src/scenario/scenarios.js +++ b/src/scenario/scenarios.js @@ -37,8 +37,6 @@ import ImportScenarioDialog from './import-scenario'; import DeleteDialog from '../common/dialogs/delete-dialog'; -import FluxContainerConverter from "../common/FluxContainerConverter"; - class Scenarios extends Component { static getStores() { return [ ScenarioStore, LoginStore ]; @@ -209,4 +207,5 @@ class Scenarios extends Component { } } -export default Container.create(FluxContainerConverter.convert(Scenarios)); +let fluxContainerConverter = require('../common/FluxContainerConverter'); +export default Container.create(fluxContainerConverter.convert(Scenarios)); diff --git a/src/simulationmodel/simulation-model.js b/src/simulationmodel/simulation-model.js index 6430ddb..1864531 100644 --- a/src/simulationmodel/simulation-model.js +++ b/src/simulationmodel/simulation-model.js @@ -33,8 +33,6 @@ import SignalMapping from './signal-mapping'; import EditableHeader from '../common/editable-header'; import ParametersEditor from '../common/parameters-editor'; -import FluxContainerConverter from "../common/FluxContainerConverter"; - class SimulationModel extends React.Component { static getStores() { return [ SimulationModelStore, LoginStore ]; @@ -170,4 +168,5 @@ class SimulationModel extends React.Component { } } -export default Container.create(FluxContainerConverter.convert(SimulationModel), { withProps: true }); +let fluxContainerConverter = require('../common/FluxContainerConverter'); +export default Container.create(fluxContainerConverter.convert(SimulationModel), { withProps: true }); diff --git a/src/simulator/select-simulator.js b/src/simulator/select-simulator.js index 823750d..c84ee58 100644 --- a/src/simulator/select-simulator.js +++ b/src/simulator/select-simulator.js @@ -26,8 +26,6 @@ import _ from 'lodash'; import SimulatorStore from './simulator-store'; -import FluxContainerConverter from "../common/FluxContainerConverter"; - class SelectSimulator extends React.Component { static getStores() { return [ SimulatorStore ]; @@ -89,4 +87,5 @@ class SelectSimulator extends React.Component { } } -export default Container.create(FluxContainerConverter.convert(SelectSimulator)); +let fluxContainerConverter = require('../common/FluxContainerConverter'); +export default Container.create(fluxContainerConverter.convert(SelectSimulator)); diff --git a/src/simulator/simulators.js b/src/simulator/simulators.js index aa8fa25..3ae1b6f 100644 --- a/src/simulator/simulators.js +++ b/src/simulator/simulators.js @@ -39,8 +39,6 @@ import ImportSimulatorDialog from './import-simulator'; import SimulatorAction from './simulator-action'; import DeleteDialog from '../common/dialogs/delete-dialog'; -import FluxContainerConverter from "../common/FluxContainerConverter"; - class Simulators extends Component { static getStores() { return [ LoginStore, SimulatorStore ]; @@ -324,4 +322,5 @@ class Simulators extends Component { } } -export default Container.create(FluxContainerConverter.convert(Simulators)); +let fluxContainerConverter = require('../common/FluxContainerConverter'); +export default Container.create(fluxContainerConverter.convert(Simulators)); diff --git a/src/user/login.js b/src/user/login.js index 840b834..d02114f 100644 --- a/src/user/login.js +++ b/src/user/login.js @@ -33,8 +33,6 @@ import NotificationsDataManager from '../common/data-managers/notifications-data import AppDispatcher from '../common/app-dispatcher'; import LoginStore from './login-store'; -import FluxContainerConverter from "../common/FluxContainerConverter"; - class Login extends Component { static getStores() { return [ LoginStore ]; @@ -100,4 +98,5 @@ class Login extends Component { } } -export default Container.create(FluxContainerConverter.convert(Login)); +let fluxContainerConverter = require('../common/FluxContainerConverter'); +export default Container.create(fluxContainerConverter.convert(Login)); diff --git a/src/widget/widget.js b/src/widget/widget.js index 0d7a049..3d9ff33 100644 --- a/src/widget/widget.js +++ b/src/widget/widget.js @@ -48,8 +48,6 @@ import WidgetBox from './widgets/box'; import WidgetHTML from './widgets/html'; import WidgetTopology from './widgets/topology'; -import FluxContainerConverter from "../common/FluxContainerConverter"; - import '../styles/widgets.css'; class Widget extends React.Component { @@ -182,4 +180,5 @@ class Widget extends React.Component { } } -export default Container.create(FluxContainerConverter.convert(Widget), { withProps: true }); +let fluxContainerConverter = require('../common/FluxContainerConverter'); +export default Container.create(fluxContainerConverter.convert(Widget), { withProps: true }); From 925950fcbcc20d9e84df0a3f6708f8feaa797d28 Mon Sep 17 00:00:00 2001 From: Sonja Happ Date: Tue, 28 Jan 2020 14:10:11 +0100 Subject: [PATCH 078/391] remove a simulation item in the context menu --- src/dashboard/widget-context-menu.js | 1 - 1 file changed, 1 deletion(-) diff --git a/src/dashboard/widget-context-menu.js b/src/dashboard/widget-context-menu.js index ae8c40f..9e3ca2f 100644 --- a/src/dashboard/widget-context-menu.js +++ b/src/dashboard/widget-context-menu.js @@ -116,7 +116,6 @@ class WidgetContextMenu extends React.Component { Date: Tue, 28 Jan 2020 14:11:45 +0100 Subject: [PATCH 079/391] put widgets in the state of a dashboard and link them to WidgetStore, change the way widgets of a dashboard are aquired, remove unused function --- src/dashboard/dashboard.js | 223 ++++++------------------------------- 1 file changed, 37 insertions(+), 186 deletions(-) diff --git a/src/dashboard/dashboard.js b/src/dashboard/dashboard.js index aa43076..8fbbdee 100644 --- a/src/dashboard/dashboard.js +++ b/src/dashboard/dashboard.js @@ -23,9 +23,7 @@ import React, {Component} from 'react'; import { Container } from 'flux/utils'; import Fullscreenable from 'react-fullscreenable'; import classNames from 'classnames'; -import { Map } from 'immutable' -//import Icon from '../common/icon'; import Widget from '../widget/widget'; import EditWidget from '../widget/edit-widget'; @@ -57,86 +55,27 @@ class Dashboard extends Component { prevState = {}; } const sessionToken = LoginStore.getState().token; + + let dashboard = DashboardStore.getState().find(d => d.id === parseInt(props.match.params.dashboard, 10)); + if (dashboard == null){ + AppDispatcher.dispatch({ + type: 'dashboards/start-load', + data: props.match.params.dashboard, + token: sessionToken + }); + } + + // obtain all widgets of a dashboard + let widgets = WidgetStore.getState().filter(w => w.dashboardID === parseInt(props.match.params.dashboard, 10)); + + // compute max y coordinate let maxHeight = null; - let dashboard = Map(); - let dashboards = DashboardStore.getState() - let rawDashboard = dashboards[props.match.params.dashboard - 1]; - - - - if (rawDashboard) { - dashboard = Map(rawDashboard); - - // convert widgets list to a dictionary to be able to reference widgets - //let widgets = {}; - - let rawWidgets = WidgetStore.getState(); - - if(rawWidgets.length === 0){ - AppDispatcher.dispatch({ - type: 'widgets/start-load', - token: sessionToken, - param: '?dashboardID=1' - }); - } - - dashboard = dashboard.set('widgets', rawWidgets); - - /* for(let widget of dashboard.get('widgets')){ - console.log("load files got called") - console.log(widget); - AppDispatcher.dispatch({ - type: 'files/start-load', - token: sessionToken, - param: '?objectID=' + widget.id + '&objectType=widget' - }); - } - */ - - - - - /* if (this.state.dashboard.has('id') === false) { - AppDispatcher.dispatch({ - type: 'dashboards/start-load', - data: this.props.match.params.dashboard, - token: this.state.sessionToken - }); - } - */ - - - - /*if(Object.keys(widgets).length !== 0 ){ - this.computeHeightWithWidgets(widgets); - } - - let selectedDashboards = dashboard; - - /* this.setState({ dashboard: selectedDashboards, project: null }); - - AppDispatcher.dispatch({ - type: 'projects/start-load', - data: selectedDashboards.get('project'), - token: this.state.sessionToken - }); -*/ - - - let widgets = {}; - - for (let widget of dashboard.get('widgets')) { - widgets[Dashboard.lastWidgetKey] = widget; - Dashboard.lastWidgetKey++; - } - maxHeight = Object.keys(widgets).reduce( (maxHeightSoFar, widgetKey) => { + maxHeight = Object.keys(widgets).reduce( (maxHeightSoFar, widgetKey) => { let thisWidget = widgets[widgetKey]; let thisWidgetHeight = thisWidget.y + thisWidget.height; return thisWidgetHeight > maxHeightSoFar? thisWidgetHeight : maxHeightSoFar; - }, 0); - - } + }, 0); let simulationModels = []; //if (prevState.simulation != null) { @@ -144,18 +83,12 @@ class Dashboard extends Component { //} return { - rawDashboard, dashboard, - - + widgets, + simulationModels, sessionToken: sessionToken, - projects: null, //ProjectStore.getState(), - simulations: null, //SimulationStore.getState(), files: null, - project: null, - simulation: null, - simulationModels, editing: prevState.editing || false, paused: prevState.paused || false, @@ -171,6 +104,7 @@ class Dashboard extends Component { } + static getNewWidgetKey() { const widgetKey = this.lastWidgetKey; this.lastWidgetKey++; @@ -180,55 +114,17 @@ class Dashboard extends Component { //!!!won't work anymore componentDidMount() { - //document.addEventListener('keydown', this.handleKeydown.bind(this)); - if (this.state.dashboard.has('id') === false) { - AppDispatcher.dispatch({ - type: 'dashboards/start-load', - token: this.state.sessionToken, - param: '?scenarioID=1', - }); - } + // load widgets of dashboard + AppDispatcher.dispatch({ + type: 'widgets/start-load', + token: this.state.sessionToken, + param: '?dashboardID=' + this.state.dashboard.id + }); + } -/* - componentWillUnmount() { - //document.removeEventListener('keydown', this.handleKeydown.bind(this)); - } - - componentDidUpdate() { - if (this.state.dashboard._id !== this.props.match.params.dashboard) { - this.reloadDashboard(); - } - - // load depending project - if (this.state.project == null && this.state.projects) { - this.state.projects.forEach((project) => { - if (project._id === this.state.dashboard.project) { - this.setState({ project: project, simulation: null }); - - const token = localStorage.getItem('token'); - - AppDispatcher.dispatch({ - type: 'simulations/start-load', - data: project.simulation, - token - }); - } - }); - } - - // load depending simulation - if (this.state.simulation == null && this.state.simulations && this.state.project) { - this.state.simulations.forEach((simulation) => { - if (simulation._id === this.state.project.simulation) { - this.setState({ simulation: simulation }); - } - }); - } - } */ - handleKeydown(e) { switch (e.key) { case ' ': @@ -245,7 +141,6 @@ class Dashboard extends Component { } } - /* * Adapt the area's height with the position of the new widget. * Return true if the height increased, otherwise false. @@ -270,34 +165,8 @@ class Dashboard extends Component { return Object.keys(widgets).map( (key) => widgets[key]); } - reloadDashboard() { - // select dashboard by param id - this.state.dashboards.forEach((tempDashboard) => { - if (tempDashboard._id === this.props.match.params.dashboard) { - - // convert widgets list to a dictionary - var dashboard = Object.assign({}, tempDashboard, { - widgets: tempDashboard.widgets ? this.transformToWidgetsDict(tempDashboard.widgets) : {} - }); - - this.computeHeightWithWidgets(dashboard.widgets); - - this.setState({ dashboard: dashboard, project: null }); - - const token = localStorage.getItem('token'); - - AppDispatcher.dispatch({ - type: 'projects/start-load', - data: dashboard.project, - token - }); - } - }); - } - handleDrop(widget) { - widget.dashboardID = this.state.dashboard.get('id'); - console.log(widget); + widget.dashboardID = this.state.dashboard.id; AppDispatcher.dispatch({ type: 'widgets/start-add', @@ -417,7 +286,7 @@ class Dashboard extends Component { saveChanges() { // Transform to a list const dashboard = Object.assign({}, this.state.dashboard.toJS(), { - widgets: this.transformToWidgetsList(this.state.dashboard.get('widgets')) + widgets: this.transformToWidgetsList(this.state.widgets) }); AppDispatcher.dispatch({ @@ -462,14 +331,13 @@ class Dashboard extends Component { render() { - const widgets = this.state.dashboard.get('widgets'); - const grid = this.state.dashboard.get('grid'); + const grid = this.state.dashboard.grid; const boxClasses = classNames('section', 'box', { 'fullscreen-padding': this.props.isFullscreen }); let draggable = this.state.editing; return
    - {this.state.dashboard.get('name')} + {this.state.dashboard.name}
    e.preventDefault() }> {this.state.editing && - + } {!draggable?( - - {widgets != null && Object.keys(widgets).map(widgetKey => ( + + {this.state.widgets != null && Object.keys(this.state.widgets).map(widgetKey => ( ) : ( - - {widgets != null && Object.keys(widgets).map(widgetKey => ( + + {this.state.widgets != null && Object.keys(this.state.widgets).map(widgetKey => ( ; } } -/* -onWidgetChange={(w, k) => this.widgetChange(w, k)} -onWidgetStatusChange={(w, k) => this.widgetStatusChange(w, k)} -const widgets = this.state.dashboard.get('widgets'); - widgets[index] = widget; - - const dashboard = this.state.dashboard.set('widgets'); - - // Check if the height needs to be increased, the section may have shrunk if not - if (!this.increaseHeightWithWidget(widget)) { - this.computeHeightWithWidgets(dashboard.widgets); - } - - this.setState({ dashboard }, callback); -*/ let fluxContainerConverter = require('../common/FluxContainerConverter'); export default Fullscreenable()(Container.create(fluxContainerConverter.convert(Dashboard), { withProps: true })); From 6fa61d07f82b709a91e23fe146f4fcc7fa6b2811 Mon Sep 17 00:00:00 2001 From: Sonja Happ Date: Tue, 28 Jan 2020 14:18:02 +0100 Subject: [PATCH 080/391] initialize temporal widget as empty before it is overwritten with props widget --- src/widget/edit-widget.js | 24 ++++++++---------------- 1 file changed, 8 insertions(+), 16 deletions(-) diff --git a/src/widget/edit-widget.js b/src/widget/edit-widget.js index d56dae3..f039f48 100644 --- a/src/widget/edit-widget.js +++ b/src/widget/edit-widget.js @@ -28,18 +28,13 @@ import CreateControls from './edit-widget-control-creator'; class EditWidgetDialog extends React.Component { valid = true; - + constructor(props) { super(props); this.state = { - temporal: { - name: '', - simulationModel: '', - signal: 0 - - } + temporal: {}, }; } @@ -49,7 +44,7 @@ class EditWidgetDialog extends React.Component { }; } - + onClose(canceled) { if (canceled === false) { @@ -73,7 +68,7 @@ class EditWidgetDialog extends React.Component { } handleChange(e) { - + // TODO: check what we really need in this function. Can we reduce its complexity? if (e.constructor === Array) { // Every property in the array will be updated let changes = e.reduce( (changesObject, event) => { @@ -84,7 +79,7 @@ class EditWidgetDialog extends React.Component { this.setState({ temporal: Object.assign({}, this.state.temporal, changes ) }); } - + if(e.target.type !== 'text'){ let changeObject = {}; if (e.target.id === 'lockAspect') { @@ -106,28 +101,25 @@ class EditWidgetDialog extends React.Component { } else if (e.target.type === 'number') { changeObject[e.target.id] = Number(e.target.value); } - + else { changeObject[e.target.id] = e.target.value; } let finalChange = this.state.temporal; - + finalChange.customProperties[e.target.id] = changeObject[e.target.id]; this.setState({ temporal: finalChange}); } else{ if(this.state.temporal[e.target.id]){ let finalChange = this.state.temporal; - + finalChange[e.target.id] = e.target.value; this.setState({ temporal: finalChange}); - } } - - } resetState() { From 50cbcd3696d2b37c482af6a3df88f1170eb28447 Mon Sep 17 00:00:00 2001 From: Sonja Happ Date: Tue, 28 Jan 2020 16:50:23 +0100 Subject: [PATCH 081/391] progress with simulation model --- src/common/editable-header.js | 6 +-- src/file/select-file.js | 14 +++--- src/simulationmodel/signal-mapping.js | 2 +- src/simulationmodel/simulation-model.js | 66 ++++++++++++++++++++----- src/simulator/select-simulator.js | 12 +++-- 5 files changed, 73 insertions(+), 27 deletions(-) diff --git a/src/common/editable-header.js b/src/common/editable-header.js index 90b5f59..54411d2 100644 --- a/src/common/editable-header.js +++ b/src/common/editable-header.js @@ -87,8 +87,8 @@ class EditableHeader extends React.Component { - - + +
    ; } @@ -97,7 +97,7 @@ class EditableHeader extends React.Component { {this.state.title} - +
    ; } } diff --git a/src/file/select-file.js b/src/file/select-file.js index dc94b98..74403f1 100644 --- a/src/file/select-file.js +++ b/src/file/select-file.js @@ -118,30 +118,30 @@ class SelectFile extends React.Component { return
    -
    + {this.props.name} - + - + {fileOptions} - + - - + - + ; diff --git a/src/simulationmodel/signal-mapping.js b/src/simulationmodel/signal-mapping.js index 1cf170b..f2d8126 100644 --- a/src/simulationmodel/signal-mapping.js +++ b/src/simulationmodel/signal-mapping.js @@ -100,7 +100,7 @@ class SignalMapping extends React.Component { render() { return
    - + {this.props.name} Length diff --git a/src/simulationmodel/simulation-model.js b/src/simulationmodel/simulation-model.js index 1864531..1ef00aa 100644 --- a/src/simulationmodel/simulation-model.js +++ b/src/simulationmodel/simulation-model.js @@ -32,6 +32,10 @@ import SelectFile from '../file/select-file'; import SignalMapping from './signal-mapping'; import EditableHeader from '../common/editable-header'; import ParametersEditor from '../common/parameters-editor'; +import SimulatorStore from "../simulator/simulator-store"; +import SignalStore from "./signal-store"; +import FileStore from "../file/file-store" + class SimulationModel extends React.Component { static getStores() { @@ -39,20 +43,60 @@ class SimulationModel extends React.Component { } static calculateState(prevState, props) { - const simulationModel = SimulationModelStore.getState().find(m => m.id === props.match.params.simulationModel); + + // get selected simulation model + const sessionToken = LoginStore.getState().token; + + let simulationModel = SimulationModelStore.getState().find(m => m.id === parseInt(props.match.params.simulationModel, 10)); + if (simulationModel == null) { + AppDispatcher.dispatch({ + type: 'simulationModels/start-load', + data: props.match.params.simulationModel, + token: sessionToken + }); + } + + // signals and files of simulation model + let signals = SignalStore.getState().find(sig => sig.simulationModelID === parseInt(props.match.params.simulationModel, 10)); + let files = FileStore.getState().find(f => f.simulationModelID === parseInt(props.match.params.simulationModel, 10)); return { - simulationModel: simulationModel || {}, - sessionToken: LoginStore.getState().token + simulationModel, + signals, + files, + sessionToken, + simulators: SimulatorStore.getState() + }; } componentDidMount() { - AppDispatcher.dispatch({ - type: 'simulationModels/start-load', - data: this.props.match.params.simulationModel, - token: this.state.sessionToken - }); + //load selected simulationModel + AppDispatcher.dispatch({ + type: 'simulationModels/start-load', + data: this.state.simulationModel.id, + token: this.state.sessionToken + }); + + // load signals for selected simulation model + AppDispatcher.dispatch({ + type: 'signals/start-load', + token: this.state.sessionToken, + param: 'TODO', + }); + + // load files for selected simulation model + AppDispatcher.dispatch({ + type: 'files/start-load', + token: this.state.sessionToken, + param: 'TODO', + }); + + // load simulators + AppDispatcher.dispatch({ + type: 'simulators/start-load', + token: this.state.sessionToken, + }); } submitForm = event => { @@ -140,9 +184,9 @@ class SimulationModel extends React.Component {
    -
    + Start Parameters - + @@ -162,7 +206,7 @@ class SimulationModel extends React.Component {
    - + ; } diff --git a/src/simulator/select-simulator.js b/src/simulator/select-simulator.js index c84ee58..5986b4f 100644 --- a/src/simulator/select-simulator.js +++ b/src/simulator/select-simulator.js @@ -69,18 +69,20 @@ class SelectSimulator extends React.Component { }; render() { + const simulatorOptions = this.state.simulators.map(s => - + ); + console.log("simulator options: ", simulatorOptions); return -
    + Simulator - + - - {simulatorOptions} + this.handleChange(e)}> + {simulatorOptions} ; From 739aa3c073030f1eab2a02019ce0496533cc9361 Mon Sep 17 00:00:00 2001 From: Sonja Happ Date: Mon, 3 Feb 2020 13:24:41 +0100 Subject: [PATCH 082/391] add signal store and signal data manager --- src/simulationmodel/signal-store.js | 23 +++++++++++++++++++++ src/simulationmodel/signals-data-manager.js | 22 ++++++++++++++++++++ 2 files changed, 45 insertions(+) create mode 100644 src/simulationmodel/signal-store.js create mode 100644 src/simulationmodel/signals-data-manager.js diff --git a/src/simulationmodel/signal-store.js b/src/simulationmodel/signal-store.js new file mode 100644 index 0000000..2924824 --- /dev/null +++ b/src/simulationmodel/signal-store.js @@ -0,0 +1,23 @@ +/** + * File: signal-store.js + * + * This file is part of VILLASweb. + * + * VILLASweb is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * VILLASweb is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with VILLASweb. If not, see . + ******************************************************************************/ + +import ArrayStore from '../common/array-store'; +import SignalsDataManager from './signals-data-manager' + +export default new ArrayStore('signals', SignalsDataManager); diff --git a/src/simulationmodel/signals-data-manager.js b/src/simulationmodel/signals-data-manager.js new file mode 100644 index 0000000..cccf994 --- /dev/null +++ b/src/simulationmodel/signals-data-manager.js @@ -0,0 +1,22 @@ +/** + * File: signals-data-manager.js + * + * This file is part of VILLASweb. + * + * VILLASweb is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * VILLASweb is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with VILLASweb. If not, see . + ******************************************************************************/ + +import RestDataManager from '../common/data-managers/rest-data-manager'; + +export default new RestDataManager('signal', '/signals'); From 26781f7c11a5c84dd92f80737c0e6e901698568a Mon Sep 17 00:00:00 2001 From: Sonja Happ Date: Mon, 3 Feb 2020 17:24:03 +0100 Subject: [PATCH 083/391] simulation model frame finally showing, there are still a lot of errors to fix --- src/common/editable-header.js | 4 +- src/file/select-file.js | 36 ++++++++------- src/simulationmodel/signal-mapping.js | 2 +- src/simulationmodel/simulation-model.js | 59 ++++++++++++++++++------- src/simulator/select-simulator.js | 4 +- 5 files changed, 69 insertions(+), 36 deletions(-) diff --git a/src/common/editable-header.js b/src/common/editable-header.js index 54411d2..47aba96 100644 --- a/src/common/editable-header.js +++ b/src/common/editable-header.js @@ -68,7 +68,7 @@ class EditableHeader extends React.Component { }; const iconStyle = { - float: 'left', + float: 'right', marginLeft: '10px', marginTop: '25px', @@ -84,7 +84,7 @@ class EditableHeader extends React.Component { return
    - + diff --git a/src/file/select-file.js b/src/file/select-file.js index 74403f1..fbb9965 100644 --- a/src/file/select-file.js +++ b/src/file/select-file.js @@ -43,12 +43,12 @@ class SelectFile extends React.Component { }; } - componentDidMount() { + /*componentDidMount() { AppDispatcher.dispatch({ type: 'files/start-load', token: this.state.sessionToken }); - } + }*/ static getDerivedStateFromProps(props, state){ if (props.value === state.selectedSimulator) { @@ -107,10 +107,19 @@ class SelectFile extends React.Component { }; render() { - const fileOptions = this.state.files.map(f => - - ); + console.log("Files: ", this.state.files); + + let fileOptions; + if (this.state.files.length > 0){ + fileOptions = this.state.files.map(f => + + ); + } else { + fileOptions = + } + + console.log("FileOptions: ", fileOptions); const progressBarStyle = { marginLeft: '100px', marginTop: '-25px' @@ -122,27 +131,24 @@ class SelectFile extends React.Component { {this.props.name} -
    - + + this.handleChange(e)}> {fileOptions} - + - - + - - - + - + + - ; } diff --git a/src/simulationmodel/signal-mapping.js b/src/simulationmodel/signal-mapping.js index f2d8126..900360c 100644 --- a/src/simulationmodel/signal-mapping.js +++ b/src/simulationmodel/signal-mapping.js @@ -112,7 +112,7 @@ class SignalMapping extends React.Component {
    - Min: this.props.handleChange(e)} /> + Min: this.props.handleChange(e)} /> - Max: this.props.handleChange(e)} /> + Max: this.props.handleChange(e)} />
    - +
    ; diff --git a/src/simulationmodel/simulation-model.js b/src/simulationmodel/simulation-model.js index 1ef00aa..3cfd522 100644 --- a/src/simulationmodel/simulation-model.js +++ b/src/simulationmodel/simulation-model.js @@ -21,7 +21,7 @@ import React from 'react'; import { Container } from 'flux/utils'; -import { Button, Col, Form, FormLabel } from 'react-bootstrap'; +import { Button, Col, Form, FormLabel, FormGroup } from 'react-bootstrap'; import SimulationModelStore from './simulation-model-store'; import LoginStore from '../user/login-store'; @@ -57,15 +57,22 @@ class SimulationModel extends React.Component { } // signals and files of simulation model - let signals = SignalStore.getState().find(sig => sig.simulationModelID === parseInt(props.match.params.simulationModel, 10)); + // TODO add direction of signals to find operation + let inputSignals = SignalStore.getState().find(sig => sig.simulationModelID === parseInt(props.match.params.simulationModel, 10)); + let outputSignals = SignalStore.getState().find(sig => sig.simulationModelID === parseInt(props.match.params.simulationModel, 10)); + + let files = FileStore.getState().find(f => f.simulationModelID === parseInt(props.match.params.simulationModel, 10)); + return { simulationModel, - signals, + inputSignals, + outputSignals, files, sessionToken, - simulators: SimulatorStore.getState() + simulators: SimulatorStore.getState(), + selectedFile: null, }; } @@ -78,18 +85,25 @@ class SimulationModel extends React.Component { token: this.state.sessionToken }); - // load signals for selected simulation model + // load input signals for selected simulation model AppDispatcher.dispatch({ type: 'signals/start-load', token: this.state.sessionToken, - param: 'TODO', + param: '?direction=in&modelID=' + this.state.simulationModel.id, + }); + + // load output signals for selected simulation model + AppDispatcher.dispatch({ + type: 'signals/start-load', + token: this.state.sessionToken, + param: '?direction=out&modelID=' + this.state.simulationModel.id, }); // load files for selected simulation model AppDispatcher.dispatch({ type: 'files/start-load', token: this.state.sessionToken, - param: 'TODO', + param: '?objectType=model&objectID=' + this.state.simulationModel.id, }); // load simulators @@ -171,17 +185,30 @@ class SimulationModel extends React.Component { const buttonStyle = { marginRight: '10px' }; + console.log("OutputSignals: ", this.state.outputSignals); + let outputSignals = null; + if (this.state.outputSignals != null){ + outputSignals = Object.keys(this.state.outputSignals).map(key => {return this.state.outputSignals[key]}); + console.log("OutputSignals Array", outputSignals); + } + let inputSignals = null; + console.log("InputSignals: ", this.state.inputSignals); + if (this.state.inputSignals != null){ + inputSignals = Object.keys(this.state.inputSignals).map(key => {return this.state.inputSignals[key]}); + console.log("InputSignals Array", inputSignals); + } + return
    -
    - + + - + - +
    @@ -193,14 +220,14 @@ class SimulationModel extends React.Component {
    +
    + + + - - - - - +
    diff --git a/src/simulator/select-simulator.js b/src/simulator/select-simulator.js index 5986b4f..b91258c 100644 --- a/src/simulator/select-simulator.js +++ b/src/simulator/select-simulator.js @@ -80,11 +80,11 @@ class SelectSimulator extends React.Component { Simulator - + this.handleChange(e)}> {simulatorOptions} - + ; } } From a38dc4b953b4026d515b0f673113075cf9d65cdb Mon Sep 17 00:00:00 2001 From: Sonja Happ Date: Wed, 5 Feb 2020 11:38:16 +0100 Subject: [PATCH 084/391] minor edits --- src/file/select-file.js | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/src/file/select-file.js b/src/file/select-file.js index fbb9965..5e273dc 100644 --- a/src/file/select-file.js +++ b/src/file/select-file.js @@ -72,7 +72,7 @@ class SelectFile extends React.Component { // send file to callback if (this.props.onChange != null) { - const file = this.state.files.find(f => f._id === event.target.value); + const file = this.state.files.find(f => f.id === event.target.value); this.props.onChange(file); } @@ -108,8 +108,6 @@ class SelectFile extends React.Component { render() { - console.log("Files: ", this.state.files); - let fileOptions; if (this.state.files.length > 0){ fileOptions = this.state.files.map(f => @@ -119,7 +117,6 @@ class SelectFile extends React.Component { fileOptions = } - console.log("FileOptions: ", fileOptions); const progressBarStyle = { marginLeft: '100px', marginTop: '-25px' From d57cd81cb6faab937db760fc09c356cbb2eec380 Mon Sep 17 00:00:00 2001 From: Sonja Happ Date: Wed, 5 Feb 2020 11:38:54 +0100 Subject: [PATCH 085/391] remove some console output --- src/simulator/simulators.js | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/simulator/simulators.js b/src/simulator/simulators.js index 3ae1b6f..e9926b4 100644 --- a/src/simulator/simulators.js +++ b/src/simulator/simulators.js @@ -132,9 +132,6 @@ class Simulators extends Component { if (data) { let simulator = this.state.simulators[this.state.modalIndex]; - console.log("modalIndex: " + this.state.modalIndex); - console.log("Simulator Host:" + simulator.host); - console.log("Simulator at index 1: " + this.state.simulators[1].host) simulator.properties = data; this.setState({ simulator }); From ec01ba7d8fe8934ea48cf69534e600e1b46c3e56 Mon Sep 17 00:00:00 2001 From: Sonja Happ Date: Wed, 5 Feb 2020 11:42:07 +0100 Subject: [PATCH 086/391] remove a few lines from license header --- src/simulator/edit-simulator.js | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/simulator/edit-simulator.js b/src/simulator/edit-simulator.js index 17358ad..d88e192 100644 --- a/src/simulator/edit-simulator.js +++ b/src/simulator/edit-simulator.js @@ -1,7 +1,4 @@ /** - * File: new-simulator.js - * Author: Markus Grigull - * Date: 02.03.2017 * * This file is part of VILLASweb. * From aefd73c398f0da0c6f5ce71eef59b693e4ec0732 Mon Sep 17 00:00:00 2001 From: Sonja Happ Date: Wed, 5 Feb 2020 11:43:45 +0100 Subject: [PATCH 087/391] compatibility with new react version and ES6 --- src/simulationmodel/import-simulation-model.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/simulationmodel/import-simulation-model.js b/src/simulationmodel/import-simulation-model.js index 991c76a..dc79201 100644 --- a/src/simulationmodel/import-simulation-model.js +++ b/src/simulationmodel/import-simulation-model.js @@ -36,7 +36,7 @@ class ImportSimulationModelDialog extends React.Component { }; } - onClose = canceled => { + onClose(canceled){ if (canceled) { this.props.onClose(); @@ -88,7 +88,7 @@ class ImportSimulationModelDialog extends React.Component { render() { return ( - + this.onClose(c)} onReset={this.resetState} valid={this.imported}> Simulation Model File @@ -97,7 +97,7 @@ class ImportSimulationModelDialog extends React.Component { Simulator - + {this.props.simulators.map(simulator => ( ))} From c35acc8c2df96c906d3d1e16a9e31d5b8595d58a Mon Sep 17 00:00:00 2001 From: Sonja Happ Date: Wed, 5 Feb 2020 11:45:59 +0100 Subject: [PATCH 088/391] move editing of simulation model (except for signal mappings) into dialog instead of separate frame, exclude file selection and upload for now --- src/scenario/scenario.js | 58 ++++++--- src/simulationmodel/edit-simulation-model.js | 129 +++++++++++++++++++ 2 files changed, 169 insertions(+), 18 deletions(-) create mode 100644 src/simulationmodel/edit-simulation-model.js diff --git a/src/scenario/scenario.js b/src/scenario/scenario.js index 1ca36eb..c26e186 100644 --- a/src/scenario/scenario.js +++ b/src/scenario/scenario.js @@ -41,6 +41,7 @@ import NewDashboardDialog from "../dashboard/new-dashboard"; import SimulatorAction from '../simulator/simulator-action'; import DeleteDialog from '../common/dialogs/delete-dialog'; +import EditSimulationModelDialog from "../simulationmodel/edit-simulation-model"; class Scenario extends React.Component { static getStores() { @@ -75,6 +76,7 @@ class Scenario extends React.Component { deleteSimulationModelModal: false, importSimulationModelModal: false, + editSimulationModelModal: false, modalSimulationModelData: {}, selectedSimulationModels: [], @@ -115,15 +117,11 @@ class Scenario extends React.Component { }); } - addSimulationModel = () => { + addSimulationModel(){ const simulationModel = { - scenario: this.state.scenario.id, + scenarioID: this.state.scenario.id, name: 'New Simulation Model', - simulator: this.state.simulators.length > 0 ? this.state.simulators[0].id : null, - outputLength: 1, - outputMapping: [{ name: 'Signal', type: 'Type' }], - inputLength: 1, - inputMapping: [{ name: 'Signal', type: 'Type' }] + simulatorID: this.state.simulators.length > 0 ? this.state.simulators[0].id : null, }; AppDispatcher.dispatch({ @@ -141,7 +139,19 @@ class Scenario extends React.Component { }); } - closeDeleteSimulationModelModal = confirmDelete => { + closeEditSimulationModelModal(data){ + this.setState({ editSimulationModelModal : false }); + + if (data) { + AppDispatcher.dispatch({ + type: 'simulationModels/start-edit', + data: data, + token: this.state.sessionToken, + }); + } + } + + closeDeleteSimulationModelModal(confirmDelete) { this.setState({ deleteSimulationModelModal: false }); if (confirmDelete === false) { @@ -155,7 +165,7 @@ class Scenario extends React.Component { }); } - importSimulationModel = simulationModel => { + importSimulationModel(simulationModel){ this.setState({ importSimulationModelModal: false }); if (simulationModel == null) { @@ -313,15 +323,27 @@ class Scenario extends React.Component {

    Simulation Models

    this.onSimulationModelChecked(index, event)} width='30' /> - - this.getSimulatorName(simulatorID)} /> - - + this.setState({ editSimulationModelModal: true, modalSimulationModelData: this.state.simulationModels[index], modalIndex: index })} + /> + this.setState({ editSimulationModelModal: true, modalSimulationModelData: this.state.simulationModels[index], modalIndex: index })} + /> + this.getSimulatorName(simulatorID)} /> + this.setState({ editSimulationModelModal: true, modalSimulationModelData: this.state.simulationModels[index], modalIndex: index })} onDelete={(index) => this.setState({ deleteSimulationModelModal: true, modalSimulationModelData: this.state.simulationModels[index], modalSimulationModelIndex: index })} onExport={index => this.exportModel(index)} /> @@ -340,15 +362,15 @@ class Scenario extends React.Component {
    - +
    - - - + this.closeEditSimulationModelModal(data)} simulationModel={this.state.modalSimulationModelData} simulators={this.state.simulators} /> + this.importSimulationModel(data)} simulators={this.state.simulators} /> + this.closeDeleteSimulationModelModal(c)} /> {/*Dashboard table*/}

    Dashboards

    diff --git a/src/simulationmodel/edit-simulation-model.js b/src/simulationmodel/edit-simulation-model.js new file mode 100644 index 0000000..4b2ac0c --- /dev/null +++ b/src/simulationmodel/edit-simulation-model.js @@ -0,0 +1,129 @@ +/** + * This file is part of VILLASweb. + * + * VILLASweb is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * VILLASweb is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with VILLASweb. If not, see . + ******************************************************************************/ + +import React from 'react'; +import {FormGroup, FormControl, FormLabel} from 'react-bootstrap'; +import _ from 'lodash'; + +import Dialog from '../common/dialogs/dialog'; +import ParametersEditor from '../common/parameters-editor'; +//import SelectFile from "../file/select-file"; + +class EditSimulationModelDialog extends React.Component { + valid = false; + + constructor(props) { + super(props); + + this.state = { + selectedFile: null, + name: '', + simulatorID: '', + configuration: null, + startParameters: {}, + + }; + } + + + onClose(canceled) { + if (canceled === false) { + if (this.valid) { + let data = this.props.simulationModel; + if (this.state.name !== '' && this.props.simulationModel.name !== this.state.name) { + console.log("name update"); + data.name = this.state.name; + } + if (this.state.simulatorID !== '' && this.props.simulationModel.simulatorID !== parseInt(this.state.simulatorID)) { + console.log("SimulatorID update"); + data.simulatorID = parseInt(this.state.simulatorID, 10); + } + if(this.state.startParameters !== {} && this.props.simulationModel.startParameters !== this.state.startParameters){ + console.log("Start Parameters update"); + data.startParameters = this.state.startParameters; + } + // TODO selectedFile and configuration?! + + //forward modified simulation model to callback function + this.props.onClose(data) + } + } else { + this.props.onClose(); + } + } + + handleChange(e) { + this.setState({ [e.target.id]: e.target.value }); + + // input is valid if at least one element has changed from its initial value + this.valid = this.state.name !== '' || this.state.simulatorID !== ''|| this.state.startParameters !== {} || this.state.selectedFile != null || this.state.configuration != null; + } + + handleParameterChange(data) { + if (data) { + console.log("Start parameter change") + this.setState({startParameters: data}); + } + + // input is valid if at least one element has changed from its initial value + this.valid = this.state.name !== '' || this.state.simulatorID !== ''|| this.state.startParameters !== {} || this.state.selectedFile != null || this.state.configuration != null; + } + + resetState() { + //this.setState({}); + } + + render() { + const simulatorOptions = this.props.simulators.map(s => + + ); + + return ( + this.onClose(c)} onReset={() => this.resetState()} valid={this.valid}> + + + Name + this.handleChange(e)} /> + + + + + Simulator + this.handleChange(e)}> + {simulatorOptions} + + + + {/* + this.handleChange(e)} + value={this.state.selectedFile}/> + < SelectFile type='configuration' name='Configuration' onChange={(e) => this.handleChange(e)} value={this.state.configuration} /> + */} + + + + + Start Parameters + this.handleParameterChange(data)} /> + + + + ); + } +} + +export default EditSimulationModelDialog; From 7863bf47bad6d9d674a5857eca2d84f6748bdd60 Mon Sep 17 00:00:00 2001 From: Sonja Happ Date: Wed, 5 Feb 2020 11:46:36 +0100 Subject: [PATCH 089/391] move signal files to separate folder --- src/{simulationmodel => signal}/signal-store.js | 0 src/{simulationmodel => signal}/signals-data-manager.js | 0 2 files changed, 0 insertions(+), 0 deletions(-) rename src/{simulationmodel => signal}/signal-store.js (100%) rename src/{simulationmodel => signal}/signals-data-manager.js (100%) diff --git a/src/simulationmodel/signal-store.js b/src/signal/signal-store.js similarity index 100% rename from src/simulationmodel/signal-store.js rename to src/signal/signal-store.js diff --git a/src/simulationmodel/signals-data-manager.js b/src/signal/signals-data-manager.js similarity index 100% rename from src/simulationmodel/signals-data-manager.js rename to src/signal/signals-data-manager.js From c2b7593d79eee418b18226e93627fe64813e4ed3 Mon Sep 17 00:00:00 2001 From: Sonja Happ Date: Wed, 5 Feb 2020 11:50:48 +0100 Subject: [PATCH 090/391] rename signal-mapping to edit-signal-mapping as preparation for making this a separate dialog and removing simulation model frame --- .../edit-signal-mapping.js} | 9 +++------ src/simulationmodel/simulation-model.js | 10 ++++------ 2 files changed, 7 insertions(+), 12 deletions(-) rename src/{simulationmodel/signal-mapping.js => signal/edit-signal-mapping.js} (95%) diff --git a/src/simulationmodel/signal-mapping.js b/src/signal/edit-signal-mapping.js similarity index 95% rename from src/simulationmodel/signal-mapping.js rename to src/signal/edit-signal-mapping.js index 900360c..f22aa53 100644 --- a/src/simulationmodel/signal-mapping.js +++ b/src/signal/edit-signal-mapping.js @@ -1,7 +1,4 @@ /** - * File: signalMapping.js - * Author: Markus Grigull - * Date: 10.08.2018 * * This file is part of VILLASweb. * @@ -27,7 +24,7 @@ import validator from 'validator'; import Table from '../common/table'; import TableColumn from '../common/table-column'; -class SignalMapping extends React.Component { +class EditSignalMapping extends React.Component { constructor(props) { super(props); @@ -119,7 +116,7 @@ class SignalMapping extends React.Component { } } -SignalMapping.propTypes = { +EditSignalMapping.propTypes = { name: PropTypes.string, length: PropTypes.number, signals: PropTypes.arrayOf( @@ -131,4 +128,4 @@ SignalMapping.propTypes = { onChange: PropTypes.func }; -export default SignalMapping; +export default EditSignalMapping; diff --git a/src/simulationmodel/simulation-model.js b/src/simulationmodel/simulation-model.js index 3cfd522..003ab22 100644 --- a/src/simulationmodel/simulation-model.js +++ b/src/simulationmodel/simulation-model.js @@ -27,13 +27,12 @@ import SimulationModelStore from './simulation-model-store'; import LoginStore from '../user/login-store'; import AppDispatcher from '../common/app-dispatcher'; -import SelectSimulator from '../simulator/select-simulator'; import SelectFile from '../file/select-file'; -import SignalMapping from './signal-mapping'; +import EditSignalMapping from '../signal/edit-signal-mapping'; import EditableHeader from '../common/editable-header'; import ParametersEditor from '../common/parameters-editor'; import SimulatorStore from "../simulator/simulator-store"; -import SignalStore from "./signal-store"; +import SignalStore from "../signal/signal-store"; import FileStore from "../file/file-store" @@ -204,7 +203,6 @@ class SimulationModel extends React.Component {
    - @@ -223,11 +221,11 @@ class SimulationModel extends React.Component {
    - + - +
    From 6756ad7209b117ec866e5bd8c5eb54dcf00c431a Mon Sep 17 00:00:00 2001 From: Sonja Happ Date: Wed, 5 Feb 2020 11:51:13 +0100 Subject: [PATCH 091/391] remove obsolete select-simulator component --- src/simulator/select-simulator.js | 93 ------------------------------- 1 file changed, 93 deletions(-) delete mode 100644 src/simulator/select-simulator.js diff --git a/src/simulator/select-simulator.js b/src/simulator/select-simulator.js deleted file mode 100644 index b91258c..0000000 --- a/src/simulator/select-simulator.js +++ /dev/null @@ -1,93 +0,0 @@ -/** - * File: selectSimulator.js - * Author: Markus Grigull - * Date: 10.05.2018 - * - * This file is part of VILLASweb. - * - * VILLASweb is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * VILLASweb is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with VILLASweb. If not, see . - ******************************************************************************/ - -import React from 'react'; -import { Container } from 'flux/utils'; -import { FormGroup, FormControl, FormLabel, Col } from 'react-bootstrap'; -import _ from 'lodash'; - -import SimulatorStore from './simulator-store'; - -class SelectSimulator extends React.Component { - static getStores() { - return [ SimulatorStore ]; - } - - static calculateState() { - return { - simulators: SimulatorStore.getState(), - selectedSimulator: '' - }; - } - - static getDerivedStateFromProps(props, state){ - if (props.value === state.selectedSimulator) { - return null; // no change - } - - let selectedSimulator = props.value; - if (selectedSimulator == null) { - if (state.simulators.length > 0) { - selectedSimulator = state.simulators[0].id; - } else { - selectedSimulator = ''; - } - } - - return { - selectedSimulator - }; - } - - handleChange = event => { - this.setState({ selectedSimulator: event.target.value }); - - // send complete simulator to callback - if (this.props.onChange != null) { - const simulator = this.state.simulators.find(s => s.id === event.target.value); - - this.props.onChange(simulator); - } - }; - - render() { - - const simulatorOptions = this.state.simulators.map(s => - - ); - console.log("simulator options: ", simulatorOptions); - - return - - Simulator - - - - this.handleChange(e)}> - {simulatorOptions} - - - ; - } -} - -let fluxContainerConverter = require('../common/FluxContainerConverter'); -export default Container.create(fluxContainerConverter.convert(SelectSimulator)); From 73d2bd4bd3ba1dd251797398a08fb32083a5e9a7 Mon Sep 17 00:00:00 2001 From: Sonja Happ Date: Wed, 5 Feb 2020 11:58:45 +0100 Subject: [PATCH 092/391] remove project and simulation files since Project and Simulation are no longer part of the data model --- src/dashboard/dashboard.js | 4 +- src/project/edit-project.js | 101 ------- src/project/new-project.js | 103 ------- src/project/project-store.js | 25 -- src/project/project.js | 235 --------------- src/project/projects-data-manager.js | 24 -- src/project/projects.js | 160 ---------- src/simulation/edit-simulation.js | 103 ------- src/simulation/import-simulation.js | 155 ---------- src/simulation/new-simulation.js | 99 ------- src/simulation/simulation-store.js | 25 -- src/simulation/simulation.js | 289 ------------------ src/simulation/simulations-data-manager.js | 24 -- src/simulation/simulations.js | 329 --------------------- 14 files changed, 1 insertion(+), 1675 deletions(-) delete mode 100644 src/project/edit-project.js delete mode 100644 src/project/new-project.js delete mode 100644 src/project/project-store.js delete mode 100644 src/project/project.js delete mode 100644 src/project/projects-data-manager.js delete mode 100644 src/project/projects.js delete mode 100644 src/simulation/edit-simulation.js delete mode 100644 src/simulation/import-simulation.js delete mode 100644 src/simulation/new-simulation.js delete mode 100644 src/simulation/simulation-store.js delete mode 100644 src/simulation/simulation.js delete mode 100644 src/simulation/simulations-data-manager.js delete mode 100644 src/simulation/simulations.js diff --git a/src/dashboard/dashboard.js b/src/dashboard/dashboard.js index bb67b97..763b827 100644 --- a/src/dashboard/dashboard.js +++ b/src/dashboard/dashboard.js @@ -34,8 +34,6 @@ import DashboardButtonGroup from './dashboard-button-group'; import LoginStore from '../user/login-store'; import DashboardStore from './dashboard-store'; -import ProjectStore from '../project/project-store'; -import SimulationStore from '../simulation/simulation-store'; import SimulationModelStore from '../simulationmodel/simulation-model-store'; import FileStore from '../file/file-store'; import WidgetStore from '../widget/widget-store'; @@ -47,7 +45,7 @@ class Dashboard extends Component { static lastWidgetKey = 0; static getStores() { - return [ DashboardStore, ProjectStore, SimulationStore, SimulationModelStore, FileStore, LoginStore, WidgetStore ]; + return [ DashboardStore, SimulationModelStore, FileStore, LoginStore, WidgetStore ]; } static calculateState(prevState, props) { diff --git a/src/project/edit-project.js b/src/project/edit-project.js deleted file mode 100644 index 918633d..0000000 --- a/src/project/edit-project.js +++ /dev/null @@ -1,101 +0,0 @@ -/** - * File: edit-project.js - * Author: Markus Grigull - * Date: 07.03.2017 - * - * This file is part of VILLASweb. - * - * VILLASweb is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * VILLASweb is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with VILLASweb. If not, see . - ******************************************************************************/ - -import React from 'react'; -import { FormGroup, FormControl, FormLabel } from 'react-bootstrap'; - -import Dialog from '../common/dialogs/dialog'; - -class EditProjectDialog extends React.Component { - valid: true; - - constructor(props) { - super(props); - - this.state = { - name: '', - simulation: '', - _id: '' - } - } - - onClose(canceled) { - if (canceled === false) { - if (this.valid) { - this.props.onClose(this.state); - } - } else { - this.props.onClose(); - } - } - - handleChange(e) { - this.setState({ [e.target.id]: e.target.value }); - } - - resetState() { - this.setState({ - name: this.props.project.name, - simulation: this.props.project.simulation, - _id: this.props.project._id - }); - } - - validateForm(target) { - // check all controls - var name = true; - - if (this.state.name === '') { - name = false; - } - - this.valid = name; - - // return state to control - if (target === 'name') return name ? "success" : "error"; - - return "success"; - } - - render() { - return ( - this.onClose(c)} onReset={() => this.resetState()} valid={this.valid}> - - - Name - this.handleChange(e)} /> - - - - Simulation - this.handleChange(e)}> - {this.props.simulations.map(simulation => ( - - ))} - - - - - ); - } -} - -export default EditProjectDialog; diff --git a/src/project/new-project.js b/src/project/new-project.js deleted file mode 100644 index c18cd89..0000000 --- a/src/project/new-project.js +++ /dev/null @@ -1,103 +0,0 @@ -/** - * File: new-project.js - * Author: Markus Grigull - * Date: 07.03.2017 - * - * This file is part of VILLASweb. - * - * VILLASweb is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * VILLASweb is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with VILLASweb. If not, see . - ******************************************************************************/ - -import React from 'react'; -import { FormGroup, FormControl, FormLabel } from 'react-bootstrap'; - -import Dialog from '../common/dialogs/dialog'; - -class NewProjectDialog extends React.Component { - valid: false; - - constructor(props) { - super(props); - - this.state = { - name: '', - simulation: '' - }; - } - - onClose(canceled) { - if (canceled === false) { - if (this.valid) { - this.props.onClose(this.state); - } - } else { - this.props.onClose(); - } - } - - handleChange(e) { - this.setState({ [e.target.id]: e.target.value }); - } - - resetState() { - this.setState({ - name: '', - simulation: this.props.simulations[0] != null ? this.props.simulations[0]._id : '' - }); - } - - validateForm(target) { - // check all controls - var name = true; - var simulation = true; - - if (this.state.name === '') { - name = false; - } - - if (this.state.simulation === '') { - simulation = false; - } - - this.valid = name && simulation; - - // return state to control - if (target === 'name') return name ? "success" : "error"; - else if (target === 'simulation') return simulation ? "success" : "error"; - } - - render() { - return ( - this.onClose(c)} onReset={() => this.resetState()} valid={this.valid}> -
    - - Name - this.handleChange(e)} /> - - - - Simulation - this.handleChange(e)}> - {this.props.simulations.map(simulation => ( - - ))} - - - -
    - ); - } -} - -export default NewProjectDialog; diff --git a/src/project/project-store.js b/src/project/project-store.js deleted file mode 100644 index 99b9bba..0000000 --- a/src/project/project-store.js +++ /dev/null @@ -1,25 +0,0 @@ -/** - * File: project-store.js - * Author: Markus Grigull - * Date: 07.03.2017 - * - * This file is part of VILLASweb. - * - * VILLASweb is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * VILLASweb is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with VILLASweb. If not, see . - ******************************************************************************/ - -import ArrayStore from '../common/array-store'; -import ProjectsDataManager from './projects-data-manager'; - -export default new ArrayStore('projects', ProjectsDataManager); diff --git a/src/project/project.js b/src/project/project.js deleted file mode 100644 index 61bb390..0000000 --- a/src/project/project.js +++ /dev/null @@ -1,235 +0,0 @@ -/** - * File: project.js - * Author: Markus Grigull - * Date: 03.03.2017 - * - * This file is part of VILLASweb. - * - * VILLASweb is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * VILLASweb is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with VILLASweb. If not, see . - ******************************************************************************/ - -import React, { Component } from 'react'; -import { Container } from 'flux/utils'; -import { Button } from 'react-bootstrap'; -import FileSaver from 'file-saver'; - -import AppDispatcher from '../common/app-dispatcher'; -import ProjectStore from './project-store'; -import LoginStore from '../user/login-store'; -import DashboardStore from '../dashboard/dashboard-store'; -import SimulationStore from '../simulation/simulation-store'; - -import Icon from '../common/icon'; -import CustomTable from '../common/table'; -import TableColumn from '../common/table-column'; -import NewVisualzationDialog from '../dashboard/new-dashboard'; -import EditDashboardDialog from '../dashboard/edit-dashboard'; -import ImportDashboardDialog from '../dashboard/import-dashboard'; - -import DeleteDialog from '../common/dialogs/delete-dialog'; - -class Dashboards extends Component { - static getStores() { - return [ ProjectStore, DashboardStore, LoginStore, SimulationStore ]; - } - - static calculateState(prevState, props) { - prevState = prevState || {}; - - // load project - const sessionToken = LoginStore.getState().token; - - let project = ProjectStore.getState().find(project => project._id === props.match.params.project); - if (project == null) { - AppDispatcher.dispatch({ - type: 'projects/start-load', - data: props.match.params.project, - token: sessionToken - }); - - project = {}; - } - - // load simulation - let simulation = {}; - - if (project.simulation != null) { - simulation = SimulationStore.getState().find(simulation => simulation._id === project.simulation); - } - - // load dashboards - let dashboards = []; - - if (project.dashboards != null) { - dashboards = DashboardStore.getState().filter(dashboard => project.dashboards.includes(dashboard._id)); - } - - return { - dashboards, - project, - simulation, - sessionToken, - - newModal: prevState.newModal || false, - deleteModal: prevState.deleteModal || false, - editModal: prevState.editModal || false, - importModal: prevState.importModal || false, - modalData: prevState.modalData || {} - }; - } - - componentDidMount() { - AppDispatcher.dispatch({ - type: 'dashboards/start-load', - token: this.state.sessionToken - }); - - AppDispatcher.dispatch({ - type: 'simulations/start-load', - token: this.state.sessionToken - }); - } - - closeNewModal(data) { - this.setState({ newModal: false }); - - if (data) { - // add project to dashboard - data.project = this.state.project._id; - - AppDispatcher.dispatch({ - type: 'dashboards/start-add', - data: data, - token: this.state.sessionToken - }); - - this.setState({ project: {} }, () => { - AppDispatcher.dispatch({ - type: 'projects/start-load', - data: this.props.match.params.project, - token: this.state.sessionToken - }); - }); - } - } - - closeDeleteModal = confirmDelete => { - this.setState({ deleteModal: false }); - - if (confirmDelete === false) { - return; - } - - AppDispatcher.dispatch({ - type: 'dashboards/start-remove', - data: this.state.modalData, - token: this.state.sessionToken - }); - } - - closeEditModal(data) { - this.setState({ editModal : false }); - - if (data) { - AppDispatcher.dispatch({ - type: 'dashboards/start-edit', - data: data, - token: this.state.sessionToken - }); - } - } - - closeImportModal(data) { - this.setState({ importModal: false }); - - if (data) { - data.project = this.state.project._id; - - AppDispatcher.dispatch({ - type: 'dashboards/start-add', - data, - token: this.state.sessionToken - }); - - this.setState({ project: {} }, () => { - AppDispatcher.dispatch({ - type: 'projects/start-load', - data: this.props.match.params.project, - token: this.state.sessionToken - }); - }); - } - } - - exportDashboard(index) { - // filter properties - let dashboard = Object.assign({}, this.state.dashboards[index]); - delete dashboard._id; - delete dashboard.project; - delete dashboard.user; - - dashboard.widgets.forEach(widget => { - delete widget.simulator; - }); - - // show save dialog - const blob = new Blob([JSON.stringify(dashboard, null, 2)], { type: 'application/json' }); - FileSaver.saveAs(blob, 'dashboard - ' + dashboard.name + '.json'); - } - - onModalKeyPress = (event) => { - if (event.key === 'Enter') { - event.preventDefault(); - - this.confirmDeleteModal(); - } - } - - render() { - const buttonStyle = { - marginRight: '10px' - }; - - return ( -
    -

    {this.state.project.name}

    - - - - this.setState({ editModal: true, modalData: this.state.dashboards[index] })} - onDelete={(index) => this.setState({ deleteModal: true, modalData: this.state.dashboards[index] })} - onExport={index => this.exportDashboard(index)} - /> - - - - - - this.closeNewModal(data)} /> - this.closeEditModal(data)} dashboard={this.state.modalData} /> - this.closeImportModal(data)} simulation={this.state.simulation} /> - - -
    - ); - } -} - -let fluxContainerConverter = require('../common/FluxContainerConverter'); -export default Container.create(fluxContainerConverter.convert(Dashboards), {withProps: true}); diff --git a/src/project/projects-data-manager.js b/src/project/projects-data-manager.js deleted file mode 100644 index 669e58a..0000000 --- a/src/project/projects-data-manager.js +++ /dev/null @@ -1,24 +0,0 @@ -/** - * File: projects-data-manager.js - * Author: Markus Grigull - * Date: 07.03.2017 - * - * This file is part of VILLASweb. - * - * VILLASweb is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * VILLASweb is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with VILLASweb. If not, see . - ******************************************************************************/ - -import RestDataManager from '../common/data-managers/rest-data-manager'; - -export default new RestDataManager('project', '/projects'); diff --git a/src/project/projects.js b/src/project/projects.js deleted file mode 100644 index 0b50ecd..0000000 --- a/src/project/projects.js +++ /dev/null @@ -1,160 +0,0 @@ -/** - * File: projects.js - * Author: Markus Grigull - * Date: 02.03.2017 - * - * This file is part of VILLASweb. - * - * VILLASweb is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * VILLASweb is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with VILLASweb. If not, see . - ******************************************************************************/ - -import React from 'react'; -import { Container } from 'flux/utils'; -import { Button } from 'react-bootstrap'; - -import AppDispatcher from '../common/app-dispatcher'; -import ProjectStore from './project-store'; -import LoginStore from '../user/login-store'; -import SimulationStore from '../simulation/simulation-store'; - -import Icon from '../common/icon'; -import Table from '../common/table'; -import TableColumn from '../common/table-column'; -import NewProjectDialog from './new-project'; -import EditProjectDialog from './edit-project'; - -import DeleteDialog from '../common/dialogs/delete-dialog'; - -class Projects extends React.Component { - static getStores() { - return [ ProjectStore, SimulationStore, LoginStore ]; - } - - static calculateState() { - return { - projects: ProjectStore.getState(), - simulations: SimulationStore.getState(), - sessionToken: LoginStore.getState().token, - - newModal: false, - editModal: false, - deleteModal: false, - modalData: {} - }; - } - - componentDidMount() { - AppDispatcher.dispatch({ - type: 'projects/start-load', - token: this.state.sessionToken - }); - - AppDispatcher.dispatch({ - type: 'simulations/start-load', - token: this.state.sessionToken - }); - } - - closeNewModal(data) { - this.setState({ newModal: false }); - - if (data) { - AppDispatcher.dispatch({ - type: 'projects/start-add', - data, - token: this.state.sessionToken - }); - } - } - - closeDeleteModal = confirmDelete => { - this.setState({ deleteModal: false }); - - if (confirmDelete === false) { - return; - } - - AppDispatcher.dispatch({ - type: 'projects/start-remove', - data: this.state.modalData, - token: this.state.sessionToken - }); - } - - closeEditModal(data) { - this.setState({ editModal: false }); - - if (data) { - AppDispatcher.dispatch({ - type: 'projects/start-edit', - data: data, - token: this.state.sessionToken - }); - } - } - - getSimulationName(id) { - for (var i = 0; i < this.state.simulations.length; i++) { - if (this.state.simulations[i]._id === id) { - return this.state.simulations[i].name; - } - } - - return id; - } - - hasValidSimulation() { - const simulations = this.state.simulations.filter(simulation => { - return simulation.models.length > 0; - }); - - return simulations.length > 0; - } - - onModalKeyPress = (event) => { - if (event.key === 'Enter') { - event.preventDefault(); - - this.confirmDeleteModal(); - } - } - - render() { - return ( -
    -

    Projects

    - -
    - - this.getSimulationName(id)} /> - this.setState({ editModal: true, modalData: this.state.projects[index] })} onDelete={index => this.setState({ deleteModal: true, modalData: this.state.projects[index] })} /> -
    - - - - {!this.hasValidSimulation() && - Simulation with at least one simulation-model required! - } - - this.closeNewModal(data)} simulations={this.state.simulations} /> - this.closeEditModal(data)} project={this.state.modalData} simulations={this.state.simulations} /> - - -
    - ); - } -} - -let fluxContainerConverter = require('../common/FluxContainerConverter'); -export default Container.create(fluxContainerConverter.convert(Projects)); diff --git a/src/simulation/edit-simulation.js b/src/simulation/edit-simulation.js deleted file mode 100644 index 7a99ab6..0000000 --- a/src/simulation/edit-simulation.js +++ /dev/null @@ -1,103 +0,0 @@ -/** - * File: new-simulation.js - * Author: Markus Grigull - * Date: 04.03.2017 - * - * This file is part of VILLASweb. - * - * VILLASweb is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * VILLASweb is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with VILLASweb. If not, see . - ******************************************************************************/ - -import React from 'react'; -import { FormGroup, FormControl, FormLabel } from 'react-bootstrap'; - -import Dialog from '../common/dialogs/dialog'; -import ParametersEditor from '../common/parameters-editor'; - -class EditSimulationDialog extends React.Component { - valid = true; - - constructor(props) { - super(props); - - this.state = { - name: '', - _id: '', - startParameters: {} - }; - } - - onClose = canceled => { - if (canceled) { - if (this.props.onClose != null) { - this.props.onClose(); - } - - return; - } - - if (this.valid && this.props.onClose != null) { - this.props.onClose(this.state); - } - } - - handleChange = event => { - this.setState({ [event.target.id]: event.target.value }); - } - - resetState = () => { - this.setState({ - name: this.props.simulation.name, - _id: this.props.simulation._id, - startParameters: this.props.simulation.startParameters || {} - }); - } - - handleStartParametersChange = startParameters => { - this.setState({ startParameters }); - } - - validateForm(target) { - let name = true; - - if (this.state.name === '') { - name = false; - } - - this.valid = name; - - // return state to control - if (target === 'name') return name ? 'success' : 'error'; - } - - render() { - return -
    - - Name - - - - - - Start Parameters - - - -
    -
    ; - } -} - -export default EditSimulationDialog; diff --git a/src/simulation/import-simulation.js b/src/simulation/import-simulation.js deleted file mode 100644 index afb1438..0000000 --- a/src/simulation/import-simulation.js +++ /dev/null @@ -1,155 +0,0 @@ -/** - * File: import-simulation.js - * Author: Markus Grigull - * Date: 03.09.2017 - * - * This file is part of VILLASweb. - * - * VILLASweb is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * VILLASweb is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with VILLASweb. If not, see . - ******************************************************************************/ - -import React from 'react'; -import { FormGroup, FormControl, FormLabel } from 'react-bootstrap'; - -import Dialog from '../common/dialogs/dialog'; -import ParametersEditor from '../common/parameters-editor'; - -class ImportSimulationDialog extends React.Component { - valid = false; - imported = false; - - constructor(props) { - super(props); - - this.state = { - name: '', - models: [], - startParameters: {} - }; - } - - onClose = canceled => { - if (canceled) { - if (this.props.onClose != null) { - this.props.onClose(); - } - - return; - } - - if (this.valid && this.props.onClose != null) { - this.props.onClose(this.state); - } - } - - handleChange(e, index) { - if (e.target.id === 'simulator') { - const models = this.state.models; - models[index].simulator = JSON.parse(e.target.value); - - this.setState({ models }); - - return; - } - - this.setState({ [e.target.id]: e.target.value }); - } - - resetState = () => { - this.setState({ name: '', models: [], startParameters: {} }); - - this.imported = false; - } - - loadFile = event => { - const file = event.target.files[0]; - - if (!file.type.match('application/json')) { - return; - } - - // create file reader - const reader = new FileReader(); - const self = this; - - reader.onload = onloadEvent => { - const simulation = JSON.parse(onloadEvent.target.result); - - // simulation.models.forEach(model => { - // model.simulator = { - // node: self.props.nodes[0]._id, - // simulator: 0 - // }; - // }); - - self.imported = true; - self.valid = true; - self.setState({ name: simulation.name, models: simulation.models, startParameters: simulation.startParameters }); - }; - - reader.readAsText(file); - } - - validateForm(target) { - // check all controls - let name = true; - - if (this.state.name === '') { - name = false; - } - - this.valid = name; - - // return state to control - if (target === 'name') return name ? "success" : "error"; - } - - render() { - return -
    - - Simulation File - - - - - Name - this.handleChange(e)} /> - - - - - Start Parameters - - - - - {/* {this.state.models.map((model, index) => ( - - {model.name} - Simulator - this.handleChange(e, index)}> - {this.props.nodes.map(node => ( - node.simulators.map((simulator, index) => ( - - )) - ))} - - - ))} */} -
    -
    ; - } -} - -export default ImportSimulationDialog; diff --git a/src/simulation/new-simulation.js b/src/simulation/new-simulation.js deleted file mode 100644 index a6b1c8f..0000000 --- a/src/simulation/new-simulation.js +++ /dev/null @@ -1,99 +0,0 @@ -/** - * File: new-simulation.js - * Author: Markus Grigull - * Date: 04.03.2017 - * - * This file is part of VILLASweb. - * - * VILLASweb is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * VILLASweb is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with VILLASweb. If not, see . - ******************************************************************************/ - -import React from 'react'; -import { FormGroup, FormControl, FormLabel } from 'react-bootstrap'; - -import Dialog from '../common/dialogs/dialog'; -import ParametersEditor from '../common/parameters-editor'; - -class NewSimulationDialog extends React.Component { - valid = false; - - constructor(props) { - super(props); - - this.state = { - name: '', - startParameters: {} - }; - } - - onClose = canceled => { - if (canceled) { - if (this.props.onClose != null) { - this.props.onClose(); - } - - return; - } - - if (this.valid && this.props.onClose != null) { - this.props.onClose(this.state); - } - } - - handleChange = event => { - this.setState({ [event.target.id]: event.target.value }); - } - - resetState = () => { - this.setState({ name: '', startParameters: {} }); - } - - handleStartParametersChange = startParameters => { - this.setState({ startParameters }); - } - - validateForm(target) { - // check all controls - let name = true; - - if (this.state.name === '') { - name = false; - } - - this.valid = name; - - // return state to control - if (target === 'name') return name ? "success" : "error"; - } - - render() { - return -
    - - Name - - - - - - Start Parameters - - - -
    -
    ; - } -} - -export default NewSimulationDialog; diff --git a/src/simulation/simulation-store.js b/src/simulation/simulation-store.js deleted file mode 100644 index fbc63eb..0000000 --- a/src/simulation/simulation-store.js +++ /dev/null @@ -1,25 +0,0 @@ -/** - * File: simulation-store.js - * Author: Markus Grigull - * Date: 04.03.2017 - * - * This file is part of VILLASweb. - * - * VILLASweb is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * VILLASweb is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with VILLASweb. If not, see . - ******************************************************************************/ - -import ArrayStore from '../common/array-store'; -import SimulationsDataManager from './simulations-data-manager'; - -export default new ArrayStore('simulations', SimulationsDataManager); diff --git a/src/simulation/simulation.js b/src/simulation/simulation.js deleted file mode 100644 index 83900a9..0000000 --- a/src/simulation/simulation.js +++ /dev/null @@ -1,289 +0,0 @@ -/** - * File: simulation.js - * Author: Markus Grigull - * Date: 04.03.2017 - * - * This file is part of VILLASweb. - * - * VILLASweb is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * VILLASweb is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with VILLASweb. If not, see . - ******************************************************************************/ - -import React from 'react'; -import { Container } from 'flux/utils'; -import { Button } from 'react-bootstrap'; -import FileSaver from 'file-saver'; -import _ from 'lodash'; - -import SimulationStore from './simulation-store'; -import SimulatorStore from '../simulator/simulator-store'; -import SimulationModelStore from '../simulationmodel/simulation-model-store'; -import LoginStore from '../user/login-store'; -import AppDispatcher from '../common/app-dispatcher'; - -import Icon from '../common/icon'; -import Table from '../common/table'; -import TableColumn from '../common/table-column'; -import ImportSimulationModelDialog from '../simulationmodel/import-simulation-model'; - -import SimulatorAction from '../simulator/simulator-action'; -import DeleteDialog from '../common/dialogs/delete-dialog'; - -class Simulation extends React.Component { - static getStores() { - return [ SimulationStore, SimulatorStore, SimulationModelStore, LoginStore ]; - } - - static calculateState(prevState, props) { - // get selected simulation - const sessionToken = LoginStore.getState().token; - - let simulation = SimulationStore.getState().find(s => s._id === props.match.params.simulation); - if (simulation == null) { - AppDispatcher.dispatch({ - type: 'simulations/start-load', - data: props.match.params.simulation, - token: sessionToken - }); - - simulation = {}; - } - - // load models - let simulationModels = []; - if (simulation.models != null) { - simulationModels = SimulationModelStore.getState().filter(m => m != null && simulation.models.includes(m._id)); - } - - return { - simulationModels, - simulation, - - simulators: SimulatorStore.getState(), - sessionToken, - - deleteModal: false, - importModal: false, - modalData: {}, - - selectedSimulationModels: [] - } - } - - componentDidMount() { - AppDispatcher.dispatch({ - type: 'simulations/start-load', - token: this.state.sessionToken - }); - - AppDispatcher.dispatch({ - type: 'simulationModels/start-load', - token: this.state.sessionToken - }); - - AppDispatcher.dispatch({ - type: 'simulators/start-load', - token: this.state.sessionToken - }); - } - - addSimulationModel = () => { - const simulationModel = { - simulation: this.state.simulation._id, - name: 'New Simulation Model', - simulator: this.state.simulators.length > 0 ? this.state.simulators[0].id : null, - outputLength: 1, - outputMapping: [{ name: 'Signal', type: 'Type' }], - inputLength: 1, - inputMapping: [{ name: 'Signal', type: 'Type' }] - }; - - AppDispatcher.dispatch({ - type: 'simulationModels/start-add', - data: simulationModel, - token: this.state.sessionToken - }); - - this.setState({ simulation: {} }, () => { - AppDispatcher.dispatch({ - type: 'simulations/start-load', - data: this.props.match.params.simulation, - token: this.state.sessionToken - }); - }); - } - - closeDeleteModal = confirmDelete => { - this.setState({ deleteModal: false }); - - if (confirmDelete === false) { - return; - } - - AppDispatcher.dispatch({ - type: 'simulationModels/start-remove', - data: this.state.modalData, - token: this.state.sessionToken - }); - } - - importSimulationModel = simulationModel => { - this.setState({ importModal: false }); - - if (simulationModel == null) { - return; - } - - simulationModel.simulation = this.state.simulation._id; - - console.log(simulationModel); - - AppDispatcher.dispatch({ - type: 'simulationModels/start-add', - data: simulationModel, - token: this.state.sessionToken - }); - - this.setState({ simulation: {} }, () => { - AppDispatcher.dispatch({ - type: 'simulations/start-load', - data: this.props.match.params.simulation, - token: this.state.sessionToken - }); - }); - } - - getSimulatorName(simulatorId) { - for (let simulator of this.state.simulators) { - if (simulator.id === simulatorId) { - return _.get(simulator, 'properties.name') || _.get(simulator, 'rawProperties.name') || simulator.uuid; - } - } - } - - exportModel(index) { - // filter properties - const model = Object.assign({}, this.state.simulationModels[index]); - - delete model.simulator; - delete model.simulation; - - // show save dialog - const blob = new Blob([JSON.stringify(model, null, 2)], { type: 'application/json' }); - FileSaver.saveAs(blob, 'simulation model - ' + model.name + '.json'); - } - - onSimulationModelChecked(index, event) { - const selectedSimulationModels = Object.assign([], this.state.selectedSimulationModels); - for (let key in selectedSimulationModels) { - if (selectedSimulationModels[key] === index) { - // update existing entry - if (event.target.checked) { - return; - } - - selectedSimulationModels.splice(key, 1); - - this.setState({ selectedSimulationModels }); - return; - } - } - - // add new entry - if (event.target.checked === false) { - return; - } - - selectedSimulationModels.push(index); - this.setState({ selectedSimulationModels }); - } - - runAction = action => { - for (let index of this.state.selectedSimulationModels) { - // get simulator for model - let simulator = null; - for (let sim of this.state.simulators) { - if (sim._id === this.state.simulationModels[index].simulator) { - simulator = sim; - } - } - - if (simulator == null) { - continue; - } - - if (action.data.action === 'start') { - action.data.parameters = this.state.simulationModels[index].startParameters; - } - - AppDispatcher.dispatch({ - type: 'simulators/start-action', - simulator, - data: action.data, - token: this.state.sessionToken - }); - } - } - - render() { - const buttonStyle = { - marginLeft: '10px' - }; - - return
    -

    {this.state.simulation.name}

    - - - this.onSimulationModelChecked(index, event)} width='30' /> - - this.getSimulatorName(simulator)} /> - - - this.setState({ deleteModal: true, modalData: this.state.simulationModels[index], modalIndex: index })} - onExport={index => this.exportModel(index)} - /> -
    - -
    - -
    - -
    - - -
    - -
    - - - - -
    ; - } -} - -let fluxContainerConverter = require('../common/FluxContainerConverter'); -export default Container.create(fluxContainerConverter.convert(Simulation), { withProps: true }); diff --git a/src/simulation/simulations-data-manager.js b/src/simulation/simulations-data-manager.js deleted file mode 100644 index 3090820..0000000 --- a/src/simulation/simulations-data-manager.js +++ /dev/null @@ -1,24 +0,0 @@ -/** - * File: simulation-data-manager.js - * Author: Markus Grigull - * Date: 04.03.2017 - * - * This file is part of VILLASweb. - * - * VILLASweb is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * VILLASweb is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with VILLASweb. If not, see . - ******************************************************************************/ - -import RestDataManager from '../common/data-managers/rest-data-manager'; - -export default new RestDataManager('simulation', '/simulations', [ '_id', 'name', 'projects', 'models', 'startParameters' ]); diff --git a/src/simulation/simulations.js b/src/simulation/simulations.js deleted file mode 100644 index 6a8879d..0000000 --- a/src/simulation/simulations.js +++ /dev/null @@ -1,329 +0,0 @@ -/** - * File: simulations.js - * Author: Markus Grigull - * Date: 04.03.2017 - * - * This file is part of VILLASweb. - * - * VILLASweb is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * VILLASweb is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with VILLASweb. If not, see . - ******************************************************************************/ - -import React, { Component } from 'react'; -import { Container } from 'flux/utils'; -import { Button } from 'react-bootstrap'; -import FileSaver from 'file-saver'; - -import AppDispatcher from '../common/app-dispatcher'; -import SimulationStore from './simulation-store'; -import LoginStore from '../user/login-store'; -import SimulatorStore from '../simulator/simulator-store'; -import SimulationModelStore from '../simulationmodel/simulation-model-store'; - -import Icon from '../common/icon'; -import Table from '../common/table'; -import TableColumn from '../common/table-column'; -import NewSimulationDialog from './new-simulation'; -import EditSimulationDialog from './edit-simulation'; -import ImportSimulationDialog from './import-simulation'; - -import SimulatorAction from '../simulator/simulator-action'; -import DeleteDialog from '../common/dialogs/delete-dialog'; - -class Simulations extends Component { - static getStores() { - return [ SimulationStore, LoginStore, SimulatorStore, SimulationModelStore ]; - } - - static calculateState() { - const simulations = SimulationStore.getState(); - const simulationModels = SimulationModelStore.getState(); - const simulators = SimulatorStore.getState(); - - const sessionToken = LoginStore.getState().token; - - return { - simulations, - simulationModels, - simulators, - sessionToken, - - newModal: false, - deleteModal: false, - editModal: false, - importModal: false, - modalSimulation: {}, - - selectedSimulations: [] - }; - } - - componentDidMount() { - AppDispatcher.dispatch({ - type: 'simulations/start-load', - token: this.state.sessionToken - }); - } - - componentDidUpdate() { - const simulationModelIds = []; - const simulatorIds = []; - - for (let simulation of this.state.simulations) { - for (let modelId of simulation.models) { - const model = this.state.simulationModels.find(m => m != null && m._id === modelId); - - if (model == null) { - simulationModelIds.push(modelId); - - continue; - } - - if (this.state.simulators.includes(s => s._id === model.simulator) === false) { - simulatorIds.push(model.simulator); - } - } - } - - if (simulationModelIds.length > 0) { - AppDispatcher.dispatch({ - type: 'simulationModels/start-load', - data: simulationModelIds, - token: this.state.sessionToken - }); - } - - if (simulatorIds.length > 0) { - AppDispatcher.dispatch({ - type: 'simulators/start-load', - data: simulatorIds, - token: this.state.sessionToken - }); - } - } - - closeNewModal(data) { - this.setState({ newModal : false }); - - if (data) { - AppDispatcher.dispatch({ - type: 'simulations/start-add', - data, - token: this.state.sessionToken - }); - } - } - - showDeleteModal(id) { - // get simulation by id - var deleteSimulation; - - this.state.simulations.forEach((simulation) => { - if (simulation._id === id) { - deleteSimulation = simulation; - } - }); - - this.setState({ deleteModal: true, modalSimulation: deleteSimulation }); - } - - closeDeleteModal = confirmDelete => { - this.setState({ deleteModal: false }); - - if (confirmDelete === false) { - return; - } - - AppDispatcher.dispatch({ - type: 'simulations/start-remove', - data: this.state.modalSimulation, - token: this.state.sessionToken - }); - } - - showEditModal(id) { - // get simulation by id - var editSimulation; - - this.state.simulations.forEach((simulation) => { - if (simulation._id === id) { - editSimulation = simulation; - } - }); - - this.setState({ editModal: true, modalSimulation: editSimulation }); - } - - closeEditModal(data) { - this.setState({ editModal : false }); - - if (data != null) { - AppDispatcher.dispatch({ - type: 'simulations/start-edit', - data, - token: this.state.sessionToken - }); - } - } - - closeImportModal(data) { - this.setState({ importModal: false }); - - if (data) { - AppDispatcher.dispatch({ - type: 'simulations/start-add', - data, - token: this.state.sessionToken - }); - } - } - - onModalKeyPress = (event) => { - if (event.key === 'Enter') { - event.preventDefault(); - - this.confirmDeleteModal(); - } - } - - exportSimulation(index) { - // filter properties - let simulation = Object.assign({}, this.state.simulations[index]); - delete simulation._id; - delete simulation.projects; - delete simulation.running; - delete simulation.user; - - simulation.models.forEach(model => { - delete model.simulator; - }); - - // show save dialog - const blob = new Blob([JSON.stringify(simulation, null, 2)], { type: 'application/json' }); - FileSaver.saveAs(blob, 'simulation - ' + simulation.name + '.json'); - } - - onSimulationChecked(index, event) { - const selectedSimulations = Object.assign([], this.state.selectedSimulations); - for (let key in selectedSimulations) { - if (selectedSimulations[key] === index) { - // update existing entry - if (event.target.checked) { - return; - } - - selectedSimulations.splice(key, 1); - - this.setState({ selectedSimulations }); - return; - } - } - - // add new entry - if (event.target.checked === false) { - return; - } - - selectedSimulations.push(index); - this.setState({ selectedSimulations }); - } - - runAction = action => { - for (let index of this.state.selectedSimulations) { - for (let model of this.state.simulations[index].models) { - // get simulation model - const simulationModel = this.state.simulationModels.find(m => m != null && m._id === model); - if (simulationModel == null) { - continue; - } - - // get simulator for model - let simulator = null; - for (let sim of this.state.simulators) { - if (sim._id === simulationModel.simulator) { - simulator = sim; - } - } - - if (simulator == null) { - continue; - } - - if (action.data.action === 'start') { - action.data.parameters = Object.assign({}, this.state.simulations[index].startParameters, simulationModel.startParameters); - } - - AppDispatcher.dispatch({ - type: 'simulators/start-action', - simulator, - data: action.data, - token: this.state.sessionToken - }); - } - } - } - - render() { - const buttonStyle = { - marginLeft: '10px' - }; - - return ( -
    -

    Simulations

    - - - this.onSimulationChecked(index, event)} width='30' /> - - this.setState({ editModal: true, modalSimulation: this.state.simulations[index] })} - onDelete={index => this.setState({ deleteModal: true, modalSimulation: this.state.simulations[index] })} - onExport={index => this.exportSimulation(index)} - /> -
    - -
    - -
    - -
    - - -
    - -
    - - this.closeNewModal(data)} /> - this.closeEditModal(data)} simulation={this.state.modalSimulation} /> - this.closeImportModal(data)} nodes={this.state.nodes} /> - - -
    - ); - } -} - -let fluxContainerConverter = require('../common/FluxContainerConverter'); -export default Container.create(fluxContainerConverter.convert(Simulations)); From 366df81b5cddc1f2d225a5ab6bbd3a045475e21d Mon Sep 17 00:00:00 2001 From: Sonja Happ Date: Mon, 17 Feb 2020 16:01:20 +0100 Subject: [PATCH 093/391] progress with signal editing: correct signals are shown per simulation model (input and output), next step: make them editable --- src/common/data-managers/rest-data-manager.js | 6 +- src/scenario/scenario.js | 53 +++++- src/signal/edit-signal-mapping.js | 156 ++++++++++-------- src/simulationmodel/simulation-model-store.js | 23 ++- src/simulationmodel/simulation-model.js | 40 ++--- .../simulation-models-data-manager.js | 23 +++ 6 files changed, 202 insertions(+), 99 deletions(-) diff --git a/src/common/data-managers/rest-data-manager.js b/src/common/data-managers/rest-data-manager.js index 559d404..b60acbf 100644 --- a/src/common/data-managers/rest-data-manager.js +++ b/src/common/data-managers/rest-data-manager.js @@ -92,7 +92,8 @@ class RestDataManager { AppDispatcher.dispatch({ type: this.type + 's/loaded', - data: data + data: data, + token: token }); if (this.onLoad != null) { @@ -113,7 +114,8 @@ class RestDataManager { AppDispatcher.dispatch({ type: this.type + 's/loaded', - data: data + data: data, + token: token, }); if (this.onLoad != null) { diff --git a/src/scenario/scenario.js b/src/scenario/scenario.js index c26e186..5c1768c 100644 --- a/src/scenario/scenario.js +++ b/src/scenario/scenario.js @@ -30,6 +30,7 @@ import SimulatorStore from '../simulator/simulator-store'; import DashboardStore from '../dashboard/dashboard-store'; import SimulationModelStore from '../simulationmodel/simulation-model-store'; import LoginStore from '../user/login-store'; +import SignalStore from '../signal/signal-store' import AppDispatcher from '../common/app-dispatcher'; import Icon from '../common/icon'; @@ -42,10 +43,11 @@ import NewDashboardDialog from "../dashboard/new-dashboard"; import SimulatorAction from '../simulator/simulator-action'; import DeleteDialog from '../common/dialogs/delete-dialog'; import EditSimulationModelDialog from "../simulationmodel/edit-simulation-model"; +import EditSignalMapping from "../signal/edit-signal-mapping"; class Scenario extends React.Component { static getStores() { - return [ ScenarioStore, SimulationModelStore, DashboardStore, SimulatorStore, LoginStore]; + return [ ScenarioStore, SimulationModelStore, DashboardStore, SimulatorStore, LoginStore, SignalStore]; } static calculateState(prevState, props) { @@ -65,13 +67,17 @@ class Scenario extends React.Component { let dashboards = DashboardStore.getState().filter(dashb => dashb.scenarioID === parseInt(props.match.params.scenario, 10)); // obtain all simulation models of a scenario - let simulationmodels = SimulationModelStore.getState().filter(simmodel => simmodel.scenarioID === parseInt(props.match.params.scenario, 10)); + let simulationModels = SimulationModelStore.getState().filter(simmodel => simmodel.scenarioID === parseInt(props.match.params.scenario, 10)); + + let signals = SignalStore.getState(); + return { scenario, sessionToken, - simulationModels: simulationmodels, - dashboards: dashboards, + simulationModels, + dashboards, + signals, simulators: SimulatorStore.getState(), deleteSimulationModelModal: false, @@ -79,6 +85,10 @@ class Scenario extends React.Component { editSimulationModelModal: false, modalSimulationModelData: {}, selectedSimulationModels: [], + modalSimulationModelIndex: 0, + + editInputSignalsModal: false, + editOutputSignalsModal: false, newDashboardModal: false, deleteDashboardModal: false, @@ -115,6 +125,8 @@ class Scenario extends React.Component { type: 'simulators/start-load', token: this.state.sessionToken, }); + + } addSimulationModel(){ @@ -151,6 +163,27 @@ class Scenario extends React.Component { } } + closeEditOutputSignalsModal(data){ + this.setState({ editOutputSignalsModal : false }); + //data is an array of signals + + if (data){ + //TODO: dispatch changes to signals + //TODO: Check if new signal is added + } + + } + + closeEditInputSignalsModal(data){ + this.setState({ editInputSignalsModal : false }); + //data is an array of signals + if(data){ + //TODO: dispatch changes to signals + //TODO: Check if new signal is added + } + + } + closeDeleteSimulationModelModal(confirmDelete) { this.setState({ deleteSimulationModelModal: false }); @@ -316,6 +349,9 @@ class Scenario extends React.Component { marginLeft: '10px' }; + console.log("simulationmodel modal data: ", this.state.modalSimulationModelData) + console.log("simulation models: ", this.state.simulationModels) + return

    {this.state.scenario.name}

    @@ -328,13 +364,13 @@ class Scenario extends React.Component { title='# Outputs' dataKey='outputLength' editButton - onEdit={index => this.setState({ editSimulationModelModal: true, modalSimulationModelData: this.state.simulationModels[index], modalIndex: index })} + onEdit={index => this.setState({ editOutputSignalsModal: true, modalSimulationModelData: this.state.simulationModels[index], modalSimulationModelIndex: index })} /> this.setState({ editSimulationModelModal: true, modalSimulationModelData: this.state.simulationModels[index], modalIndex: index })} + onEdit={index => this.setState({ editInputSignalsModal: true, modalSimulationModelData: this.state.simulationModels[index], modalSimulationModelIndex: index })} /> this.getSimulatorName(simulatorID)} /> this.setState({ editSimulationModelModal: true, modalSimulationModelData: this.state.simulationModels[index], modalIndex: index })} + onEdit={index => this.setState({ editSimulationModelModal: true, modalSimulationModelData: this.state.simulationModels[index], modalSimulationModelIndex: index })} onDelete={(index) => this.setState({ deleteSimulationModelModal: true, modalSimulationModelData: this.state.simulationModels[index], modalSimulationModelIndex: index })} onExport={index => this.exportModel(index)} /> @@ -372,6 +408,9 @@ class Scenario extends React.Component { this.importSimulationModel(data)} simulators={this.state.simulators} /> this.closeDeleteSimulationModelModal(c)} /> + this.closeEditOutputSignalsModal(data)} direction="Output" signals={this.state.signals} simulationModelID={this.state.modalSimulationModelData.id} /> + this.closeEditInputSignalsModal(data)} direction="Input" signals={this.state.signals} simulationModelID={this.state.modalSimulationModelData.id}/> + {/*Dashboard table*/}

    Dashboards

    diff --git a/src/signal/edit-signal-mapping.js b/src/signal/edit-signal-mapping.js index f22aa53..1d1a32a 100644 --- a/src/signal/edit-signal-mapping.js +++ b/src/signal/edit-signal-mapping.js @@ -18,102 +18,114 @@ import React from 'react'; import PropTypes from 'prop-types'; -import { FormGroup, FormControl, FormLabel, FormText } from 'react-bootstrap'; -import validator from 'validator'; +import { FormGroup, FormLabel, FormText } from 'react-bootstrap'; import Table from '../common/table'; import TableColumn from '../common/table-column'; +import Dialog from "../common/dialogs/dialog"; + +import SignalStore from "./signal-store" +import LoginStore from "../user/login-store"; class EditSignalMapping extends React.Component { - constructor(props) { - super(props); - var length = props.length; - if (length === undefined) - length = 1; + static getStores() { + return [ SignalStore, LoginStore]; + } - this.state = { - length: length, - signals: props.signals - }; - } + constructor(props) { + super(props); - static getDerivedStateFromProps(props, state){ - if (props.length === state.length && props.signals === state.signals) { - return null + let dir = ""; + if ( this.props.direction === "Output"){ + dir = "out"; + } else if ( this.props.direction === "Input" ){ + dir = "in"; } - return{ - length: props.length, - signals: props.signals + this.state = { + sessionToken: LoginStore.getState().token, + dir }; + } + + componentDidMount(): void { + + } + + onClose(canceled) { + if (canceled === false) { + if (this.valid) { + // TODO + let data = null; + + //forward modified simulation model to callback function + this.props.onClose(data) + } + } else { + this.props.onClose(); + } } - validateLength(){ - const valid = validator.isInt(this.state.length + '', { min: 1, max: 100 }); - return valid ? 'success' : 'error'; - } + handleMappingChange = (event, row, column) => { + const signals = this.state.signals; - handleLengthChange = event => { - const length = event.target.value; + //const length = this.state.length; - // update signals to represent length - const signals = this.state.signals; + if (column === 1) { // Name change + signals[row].name = event.target.value; + } else if (column === 2) { // unit change + signals[row].unit = event.target.value; + } else if (column === 0) { //index change + signals[row].index = event.target.value; + } - if (this.state.length < length) { - while (signals.length < length) { - signals.push({ name: 'Signal', type: 'Type' }); - } - } else { - signals.splice(length, signals.length - length); - } + //this.setState({ length, signals }); + //TODO dispatch changes by calling API - // save updated state - this.setState({ length, signals }); + /*if (this.props.onChange != null) { + this.props.onChange(this.state.length, signals); + } + */ + } - if (this.props.onChange != null) { - this.props.onChange(length, signals); - } - } + resetState() { + //this.setState({}); + } - handleMappingChange = (event, row, column) => { - const signals = this.state.signals; + render() { - const length = this.state.length; + // filter all signals by Simulation Model ID and direction + let signals = this.props.signals.filter((sig) => { + return (sig.simulationModelID === this.props.simulationModelID) && (sig.direction === this.state.dir); + }); - if (column === 1) { - signals[row].name = event.target.value; - } else if (column === 2) { - signals[row].type = event.target.value; - } + return( - this.setState({ length, signals }); + this.onClose(c)} onReset={() => this.resetState()} valid={this.valid}> - if (this.props.onChange != null) { - this.props.onChange(this.state.length, signals); - } - } - - render() { - return
    + {/* - {this.props.name} Length - - + {this.props.name} Length + + + */} - - {this.props.name} Mapping - Click name or type cell to edit -
    - - - -
    - -
    ; - } + + {this.props.direction} Mapping + Click name or type cell to edit + + + + +
    +
    +
    + ); + } } EditSignalMapping.propTypes = { @@ -122,7 +134,11 @@ EditSignalMapping.propTypes = { signals: PropTypes.arrayOf( PropTypes.shape({ name: PropTypes.string.isRequired, - type: PropTypes.string.isRequired + unit: PropTypes.string.isRequired, + direction: PropTypes.string.isRequired, + simulationModelID: PropTypes.number.isRequired, + index: PropTypes.number.isRequired + }) ), onChange: PropTypes.func diff --git a/src/simulationmodel/simulation-model-store.js b/src/simulationmodel/simulation-model-store.js index 0f06101..5ef17a3 100644 --- a/src/simulationmodel/simulation-model-store.js +++ b/src/simulationmodel/simulation-model-store.js @@ -22,4 +22,25 @@ import ArrayStore from '../common/array-store'; import SimulationModelsDataManager from './simulation-models-data-manager'; -export default new ArrayStore('simulationModels', SimulationModelsDataManager); +class SimulationModelStore extends ArrayStore { + + constructor() { + super('simulationModels', SimulationModelsDataManager); + } + + reduce(state, action) { + switch (action.type) { + + case 'simulationModels/loaded': + + SimulationModelsDataManager.loadSignals(action.token, action.data); + return super.reduce(state, action); + + default: + return super.reduce(state, action); + + } + } +} + +export default new SimulationModelStore(); diff --git a/src/simulationmodel/simulation-model.js b/src/simulationmodel/simulation-model.js index 003ab22..b1e6fea 100644 --- a/src/simulationmodel/simulation-model.js +++ b/src/simulationmodel/simulation-model.js @@ -70,6 +70,7 @@ class SimulationModel extends React.Component { outputSignals, files, sessionToken, + signals: SignalStore.getState(), simulators: SimulatorStore.getState(), selectedFile: null, @@ -85,25 +86,25 @@ class SimulationModel extends React.Component { }); // load input signals for selected simulation model - AppDispatcher.dispatch({ - type: 'signals/start-load', - token: this.state.sessionToken, - param: '?direction=in&modelID=' + this.state.simulationModel.id, - }); - - // load output signals for selected simulation model - AppDispatcher.dispatch({ - type: 'signals/start-load', - token: this.state.sessionToken, - param: '?direction=out&modelID=' + this.state.simulationModel.id, - }); + // AppDispatcher.dispatch({ + // type: 'signals/start-load', + // token: this.state.sessionToken, + // param: '?direction=in&modelID=' + this.state.simulationModel.id, + // }); + // + // // load output signals for selected simulation model + // AppDispatcher.dispatch({ + // type: 'signals/start-load', + // token: this.state.sessionToken, + // param: '?direction=out&modelID=' + this.state.simulationModel.id, + // }); // load files for selected simulation model - AppDispatcher.dispatch({ - type: 'files/start-load', - token: this.state.sessionToken, - param: '?objectType=model&objectID=' + this.state.simulationModel.id, - }); + // AppDispatcher.dispatch({ + // type: 'files/start-load', + // token: this.state.sessionToken, + // param: '?objectType=model&objectID=' + this.state.simulationModel.id, + // }); // load simulators AppDispatcher.dispatch({ @@ -197,6 +198,7 @@ class SimulationModel extends React.Component { console.log("InputSignals Array", inputSignals); } + console.log("All SIGNALS: ", this.state.signals); return
    @@ -221,11 +223,11 @@ class SimulationModel extends React.Component { - + - +
    diff --git a/src/simulationmodel/simulation-models-data-manager.js b/src/simulationmodel/simulation-models-data-manager.js index cd41baf..b53c0d9 100644 --- a/src/simulationmodel/simulation-models-data-manager.js +++ b/src/simulationmodel/simulation-models-data-manager.js @@ -21,6 +21,7 @@ import RestDataManager from '../common/data-managers/rest-data-manager'; import AppDispatcher from '../common/app-dispatcher'; +import RestAPI from "../common/api/rest-api"; class SimulationModelDataManager extends RestDataManager { constructor() { @@ -45,6 +46,28 @@ class SimulationModelDataManager extends RestDataManager { id: model.simulator }); } + + loadSignals(token, models){ + + for (let model of models) { + // request in signals + RestAPI.get(this.makeURL('/signals?direction=in&modelID=' + model.id), token).then(response => { + AppDispatcher.dispatch({ + type: 'signals/loaded', + data: response.signals + }); + }); + + // request out signals + RestAPI.get(this.makeURL('/signals?direction=out&modelID=' + model.id), token).then(response => { + AppDispatcher.dispatch({ + type: 'signals/loaded', + data: response.signals + }); + }); + + } + } } export default new SimulationModelDataManager(); From 7c0615862c00b2db363938b8ad8f4ccc11780e3d Mon Sep 17 00:00:00 2001 From: Sonja Happ Date: Tue, 18 Feb 2020 11:43:33 +0100 Subject: [PATCH 094/391] signal mappings editable --- src/common/data-managers/rest-data-manager.js | 6 +- src/common/table.js | 2 +- src/scenario/scenario.js | 91 ++++++++++--- src/signal/edit-signal-mapping.js | 125 ++++++++++++------ src/signal/signal-store.js | 24 +++- src/signal/signals-data-manager.js | 24 +++- 6 files changed, 202 insertions(+), 70 deletions(-) diff --git a/src/common/data-managers/rest-data-manager.js b/src/common/data-managers/rest-data-manager.js index b60acbf..db4c610 100644 --- a/src/common/data-managers/rest-data-manager.js +++ b/src/common/data-managers/rest-data-manager.js @@ -138,7 +138,8 @@ class RestDataManager { RestAPI.post(this.requestURL('load/add',null,param), obj, token).then(response => { AppDispatcher.dispatch({ type: this.type + 's/added', - data: response[this.type] + data: response[this.type], + token: token }); }).catch(error => { AppDispatcher.dispatch({ @@ -153,7 +154,8 @@ class RestDataManager { AppDispatcher.dispatch({ type: this.type + 's/removed', data: response[this.type], - original: object + original: object, + token: token }); }).catch(error => { AppDispatcher.dispatch({ diff --git a/src/common/table.js b/src/common/table.js index 6ec492f..64d118d 100644 --- a/src/common/table.js +++ b/src/common/table.js @@ -206,7 +206,7 @@ class CustomTable extends Component { return ( {(this.state.editCell[0] === cellIndex && this.state.editCell[1] === rowIndex ) ? ( - children[cellIndex].props.onInlineChange(event, rowIndex, cellIndex)} inputRef={ref => { this.activeInput = ref; }} /> + children[cellIndex].props.onInlineChange(event, rowIndex, cellIndex)} ref={ref => { this.activeInput = ref; }} /> ) : ( {cell.map((element, elementIndex) => ( diff --git a/src/scenario/scenario.js b/src/scenario/scenario.js index 5c1768c..945d73a 100644 --- a/src/scenario/scenario.js +++ b/src/scenario/scenario.js @@ -87,8 +87,8 @@ class Scenario extends React.Component { selectedSimulationModels: [], modalSimulationModelIndex: 0, - editInputSignalsModal: false, editOutputSignalsModal: false, + editInputSignalsModal: false, newDashboardModal: false, deleteDashboardModal: false, @@ -129,6 +129,15 @@ class Scenario extends React.Component { } + static getDerivedStateFromProps(props, state){ + + let simulationModels = SimulationModelStore.getState().filter(simmodel => simmodel.scenarioID === parseInt(props.match.params.scenario, 10)); + + return { + simulationModels: simulationModels + }; + } + addSimulationModel(){ const simulationModel = { scenarioID: this.state.scenario.id, @@ -163,23 +172,52 @@ class Scenario extends React.Component { } } - closeEditOutputSignalsModal(data){ - this.setState({ editOutputSignalsModal : false }); - //data is an array of signals + closeDeleteSignalModal(data){ + // data contains the signal to be deleted + if (data){ - if (data){ - //TODO: dispatch changes to signals - //TODO: Check if new signal is added - } + AppDispatcher.dispatch({ + type: 'signals/start-remove', + data: data, + token: this.state.sessionToken + }); + } } - closeEditInputSignalsModal(data){ - this.setState({ editInputSignalsModal : false }); - //data is an array of signals - if(data){ - //TODO: dispatch changes to signals - //TODO: Check if new signal is added + closeNewSignalModal(data){ + //data contains the new signal incl. simulationModelID and direction + if (data) { + AppDispatcher.dispatch({ + type: 'signals/start-add', + data: data, + token: this.state.sessionToken + }); + } + } + + closeEditSignalsModal(data, direction){ + + if( direction === "in") { + this.setState({editInputSignalsModal: false}); + } else if( direction === "out"){ + this.setState({editOutputSignalsModal: false}); + } else { + return; // no valid direction + } + + if (data){ + //data is an array of signals + for (let sig of data) { + //TODO: Check if new signal is added by checking id set to -1? + + //dispatch changes to signals + AppDispatcher.dispatch({ + type: 'signals/start-edit', + data: sig, + token: this.state.sessionToken, + }); + } } } @@ -349,9 +387,6 @@ class Scenario extends React.Component { marginLeft: '10px' }; - console.log("simulationmodel modal data: ", this.state.modalSimulationModelData) - console.log("simulation models: ", this.state.simulationModels) - return

    {this.state.scenario.name}

    @@ -361,13 +396,13 @@ class Scenario extends React.Component { this.onSimulationModelChecked(index, event)} width='30' /> this.setState({ editOutputSignalsModal: true, modalSimulationModelData: this.state.simulationModels[index], modalSimulationModelIndex: index })} /> this.setState({ editInputSignalsModal: true, modalSimulationModelData: this.state.simulationModels[index], modalSimulationModelIndex: index })} @@ -408,8 +443,22 @@ class Scenario extends React.Component { this.importSimulationModel(data)} simulators={this.state.simulators} /> this.closeDeleteSimulationModelModal(c)} /> - this.closeEditOutputSignalsModal(data)} direction="Output" signals={this.state.signals} simulationModelID={this.state.modalSimulationModelData.id} /> - this.closeEditInputSignalsModal(data)} direction="Input" signals={this.state.signals} simulationModelID={this.state.modalSimulationModelData.id}/> + this.closeEditSignalsModal(data, direction)} + onAdd={(data) => this.closeNewSignalModal(data)} + onDelete={(data) => this.closeDeleteSignalModal(data)} + direction="Output" + signals={this.state.signals} + simulationModelID={this.state.modalSimulationModelData.id} /> + this.closeEditSignalsModal(data, direction)} + onAdd={(data) => this.closeNewSignalModal(data)} + onDelete={(data) => this.closeDeleteSignalModal(data)} + direction="Input" + signals={this.state.signals} + simulationModelID={this.state.modalSimulationModelData.id}/> {/*Dashboard table*/}

    Dashboards

    diff --git a/src/signal/edit-signal-mapping.js b/src/signal/edit-signal-mapping.js index 1d1a32a..2c31a68 100644 --- a/src/signal/edit-signal-mapping.js +++ b/src/signal/edit-signal-mapping.js @@ -18,19 +18,20 @@ import React from 'react'; import PropTypes from 'prop-types'; -import { FormGroup, FormLabel, FormText } from 'react-bootstrap'; +import {Button, FormGroup, FormLabel, FormText} from 'react-bootstrap'; import Table from '../common/table'; import TableColumn from '../common/table-column'; import Dialog from "../common/dialogs/dialog"; import SignalStore from "./signal-store" -import LoginStore from "../user/login-store"; +import Icon from "../common/icon"; class EditSignalMapping extends React.Component { + valid = false; static getStores() { - return [ SignalStore, LoginStore]; + return [ SignalStore]; } constructor(props) { @@ -44,84 +45,120 @@ class EditSignalMapping extends React.Component { } this.state = { - sessionToken: LoginStore.getState().token, - dir + dir, + signals: [], }; } - componentDidMount(): void { + static getDerivedStateFromProps(props, state){ + // filter all signals by Simulation Model ID and direction + let signals = props.signals.filter((sig) => { + return (sig.simulationModelID === props.simulationModelID) && (sig.direction === state.dir); + }); + + return { + signals: signals + }; } + onClose(canceled) { if (canceled === false) { if (this.valid) { - // TODO - let data = null; + let data = this.state.signals; - //forward modified simulation model to callback function - this.props.onClose(data) + //forward modified signals back to callback function + this.props.onCloseEdit(data, this.state.dir) } } else { - this.props.onClose(); + this.props.onCloseEdit(null, this.state.dir); } } + onDelete(e){ + console.log("On signal delete"); + } + handleMappingChange = (event, row, column) => { const signals = this.state.signals; - //const length = this.state.length; - if (column === 1) { // Name change - signals[row].name = event.target.value; + if (event.target.value !== '') { + signals[row].name = event.target.value; + this.setState({signals: signals}); + this.valid = true; + } } else if (column === 2) { // unit change - signals[row].unit = event.target.value; + if (event.target.value !== '') { + signals[row].unit = event.target.value; + this.setState({signals: signals}); + this.valid = true; + } } else if (column === 0) { //index change - signals[row].index = event.target.value; - } - //this.setState({ length, signals }); - //TODO dispatch changes by calling API - - /*if (this.props.onChange != null) { - this.props.onChange(this.state.length, signals); + signals[row].index = parseInt(event.target.value, 10); + this.setState({signals: signals}); + this.valid = true; } - */ - } + }; + + handleDelete = (index) => { + + let data = this.state.signals[index] + this.props.onDelete(data); + + }; + + handleAdd = () => { + console.log("add signal"); + + let newSignal = { + simulationModelID: this.props.simulationModelID, + direction: this.state.dir, + name: "PlaceholderName", + unit: "PlaceholderUnit", + index: 999 + }; + + this.props.onAdd(newSignal) + + }; resetState() { - //this.setState({}); - } + this.valid=false; - render() { - - // filter all signals by Simulation Model ID and direction let signals = this.props.signals.filter((sig) => { return (sig.simulationModelID === this.props.simulationModelID) && (sig.direction === this.state.dir); }); + this.setState({signals: signals}) + } + + render() { + + const buttonStyle = { + marginLeft: '10px' + }; + return( - this.onClose(c)} onReset={() => this.resetState()} valid={this.valid}> - - {/* - - {this.props.name} Length - - - - */} + this.onClose(c)} onReset={() => this.resetState()} valid={this.valid}> {this.props.direction} Mapping - Click name or type cell to edit - - - - + Click Index, Name or Unit cell to edit +
    + this.handleMappingChange(e, row, column)} /> + this.handleMappingChange(e, row, column)} /> + this.handleMappingChange(e, row, column)} /> + this.handleDelete(index)} />
    + +
    + +
    ); diff --git a/src/signal/signal-store.js b/src/signal/signal-store.js index 2924824..787a3db 100644 --- a/src/signal/signal-store.js +++ b/src/signal/signal-store.js @@ -20,4 +20,26 @@ import ArrayStore from '../common/array-store'; import SignalsDataManager from './signals-data-manager' -export default new ArrayStore('signals', SignalsDataManager); +class SignalStore extends ArrayStore{ + constructor() { + super('signals', SignalsDataManager); + } + + reduce(state, action) { + switch (action.type) { + case 'signals/added': + SignalsDataManager.reloadSimulationModel(action.token, action.data); + return super.reduce(state, action); + case 'signals/removed': + SignalsDataManager.reloadSimulationModel(action.token, action.data); + return super.reduce(state, action); + + default: + return super.reduce(state, action); + } + } + + +} + +export default new SignalStore(); diff --git a/src/signal/signals-data-manager.js b/src/signal/signals-data-manager.js index cccf994..e933f20 100644 --- a/src/signal/signals-data-manager.js +++ b/src/signal/signals-data-manager.js @@ -18,5 +18,27 @@ ******************************************************************************/ import RestDataManager from '../common/data-managers/rest-data-manager'; +import RestAPI from "../common/api/rest-api"; +import AppDispatcher from "../common/app-dispatcher"; -export default new RestDataManager('signal', '/signals'); +class SignalsDataManager extends RestDataManager{ + + constructor() { + super('signal', '/signals'); + } + + reloadSimulationModel(token, data){ + // request in signals + console.log("Reloading simulation model due to signal add/remove") + RestAPI.get(this.makeURL('/models/' + data.simulationModelID), token).then(response => { + AppDispatcher.dispatch({ + type: 'simulationModels/edited', + data: response.simulationModel + }); + }); + + } + +} + +export default new SignalsDataManager() From bd11dc79bb093a5c39951a434150cec818048f9a Mon Sep 17 00:00:00 2001 From: Sonja Happ Date: Tue, 18 Feb 2020 11:56:37 +0100 Subject: [PATCH 095/391] proper init of startParameters for new simulationModel --- src/scenario/scenario.js | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/scenario/scenario.js b/src/scenario/scenario.js index 945d73a..048643a 100644 --- a/src/scenario/scenario.js +++ b/src/scenario/scenario.js @@ -143,6 +143,7 @@ class Scenario extends React.Component { scenarioID: this.state.scenario.id, name: 'New Simulation Model', simulatorID: this.state.simulators.length > 0 ? this.state.simulators[0].id : null, + startParameters: {}, }; AppDispatcher.dispatch({ @@ -209,8 +210,6 @@ class Scenario extends React.Component { if (data){ //data is an array of signals for (let sig of data) { - //TODO: Check if new signal is added by checking id set to -1? - //dispatch changes to signals AppDispatcher.dispatch({ type: 'signals/start-edit', From e28fb4c352e60f8da529fb810e634aab79d6b28e Mon Sep 17 00:00:00 2001 From: Sonja Happ Date: Tue, 18 Feb 2020 12:14:05 +0100 Subject: [PATCH 096/391] package updates --- package-lock.json | 4296 +++++++++++++++++++++++++-------------------- package.json | 31 +- 2 files changed, 2407 insertions(+), 1920 deletions(-) diff --git a/package-lock.json b/package-lock.json index 917f5a1..42eea06 100644 --- a/package-lock.json +++ b/package-lock.json @@ -5,19 +5,19 @@ "requires": true, "dependencies": { "@babel/code-frame": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.0.tgz", - "integrity": "sha512-AN2IR/wCUYsM+PdErq6Bp3RFTXl8W0p9Nmymm7zkpsCmh+r/YYcckaCGpU8Q/mEKmST19kkGRaG42A/jxOWwBA==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.3.tgz", + "integrity": "sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g==", "requires": { - "@babel/highlight": "^7.8.0" + "@babel/highlight": "^7.8.3" } }, "@babel/compat-data": { - "version": "7.8.1", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.8.1.tgz", - "integrity": "sha512-Z+6ZOXvyOWYxJ50BwxzdhRnRsGST8Y3jaZgxYig575lTjVSs3KtJnmESwZegg6e2Dn0td1eDhoWlp1wI4BTCPw==", + "version": "7.8.5", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.8.5.tgz", + "integrity": "sha512-jWYUqQX/ObOhG1UiEkbH5SANsE/8oKXiQWjj7p7xgj9Zmnt//aUvyz4dBkK0HNsS8/cbyC5NmmH87VekW+mXFg==", "requires": { - "browserslist": "^4.8.2", + "browserslist": "^4.8.5", "invariant": "^2.2.4", "semver": "^5.5.0" }, @@ -30,19 +30,20 @@ } }, "@babel/core": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.7.4.tgz", - "integrity": "sha512-+bYbx56j4nYBmpsWtnPUsKW3NdnYxbqyfrP2w9wILBuHzdfIKz9prieZK0DFPyIzkjYVUe4QkusGL07r5pXznQ==", + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.8.4.tgz", + "integrity": "sha512-0LiLrB2PwrVI+a2/IEskBopDYSd8BCb3rOvH7D5tzoWd696TBEduBvuLVm4Nx6rltrLZqvI3MCalB2K2aVzQjA==", "requires": { - "@babel/code-frame": "^7.5.5", - "@babel/generator": "^7.7.4", - "@babel/helpers": "^7.7.4", - "@babel/parser": "^7.7.4", - "@babel/template": "^7.7.4", - "@babel/traverse": "^7.7.4", - "@babel/types": "^7.7.4", + "@babel/code-frame": "^7.8.3", + "@babel/generator": "^7.8.4", + "@babel/helpers": "^7.8.4", + "@babel/parser": "^7.8.4", + "@babel/template": "^7.8.3", + "@babel/traverse": "^7.8.4", + "@babel/types": "^7.8.3", "convert-source-map": "^1.7.0", "debug": "^4.1.0", + "gensync": "^1.0.0-beta.1", "json5": "^2.1.0", "lodash": "^4.17.13", "resolve": "^1.3.2", @@ -63,11 +64,11 @@ } }, "@babel/generator": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.8.0.tgz", - "integrity": "sha512-2Lp2e02CV2C7j/H4n4D9YvsvdhPVVg9GDIamr6Tu4tU35mL3mzOrzl1lZ8ZJtysfZXh+y+AGORc2rPS7yHxBUg==", + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.8.4.tgz", + "integrity": "sha512-PwhclGdRpNAf3IxZb0YVuITPZmmrXz9zf6fH8lT4XbrmfQKr6ryBzhv593P5C6poJRciFCL/eHGW2NuGrgEyxA==", "requires": { - "@babel/types": "^7.8.0", + "@babel/types": "^7.8.3", "jsesc": "^2.5.1", "lodash": "^4.17.13", "source-map": "^0.5.0" @@ -81,50 +82,50 @@ } }, "@babel/helper-annotate-as-pure": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.8.0.tgz", - "integrity": "sha512-WWj+1amBdowU2g18p3/KUc1Y5kWnaNm1paohq2tT4/RreeMNssYkv6ul9wkE2iIqjwLBwNMZGH4pTGlMSUqMMg==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.8.3.tgz", + "integrity": "sha512-6o+mJrZBxOoEX77Ezv9zwW7WV8DdluouRKNY/IR5u/YTMuKHgugHOzYWlYvYLpLA9nPsQCAAASpCIbjI9Mv+Uw==", "requires": { - "@babel/types": "^7.8.0" + "@babel/types": "^7.8.3" } }, "@babel/helper-builder-binary-assignment-operator-visitor": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.8.0.tgz", - "integrity": "sha512-KbBloNiBHM3ZyHg1ViDRs4QcnAunwMJ+rLpAEA8l3cWb3Z1xof7ag1iHvX16EwhUfaTG3+YSvTRPv4xHIrseUQ==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.8.3.tgz", + "integrity": "sha512-5eFOm2SyFPK4Rh3XMMRDjN7lBH0orh3ss0g3rTYZnBQ+r6YPj7lgDyCvPphynHvUrobJmeMignBr6Acw9mAPlw==", "requires": { - "@babel/helper-explode-assignable-expression": "^7.8.0", - "@babel/types": "^7.8.0" + "@babel/helper-explode-assignable-expression": "^7.8.3", + "@babel/types": "^7.8.3" } }, "@babel/helper-builder-react-jsx": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/helper-builder-react-jsx/-/helper-builder-react-jsx-7.8.0.tgz", - "integrity": "sha512-Zg7VLtZzcAHoQ13S0pEIGKo8OAG3s5kjsk/4keGmUeNuc810T9fVp6izIaL8ZVeAErRFWJdvqFItY3QMTHMsSg==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-react-jsx/-/helper-builder-react-jsx-7.8.3.tgz", + "integrity": "sha512-JT8mfnpTkKNCboTqZsQTdGo3l3Ik3l7QIt9hh0O9DYiwVel37VoJpILKM4YFbP2euF32nkQSb+F9cUk9b7DDXQ==", "requires": { - "@babel/types": "^7.8.0", + "@babel/types": "^7.8.3", "esutils": "^2.0.0" } }, "@babel/helper-call-delegate": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/helper-call-delegate/-/helper-call-delegate-7.8.0.tgz", - "integrity": "sha512-Vi8K1LScr8ZgLicfuCNSE7JWUPG/H/9Bw9zn+3vQyy4vA54FEGTCuUTOXCFwmBM93OD6jHfjrQ6ZnivM5U+bHg==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-call-delegate/-/helper-call-delegate-7.8.3.tgz", + "integrity": "sha512-6Q05px0Eb+N4/GTyKPPvnkig7Lylw+QzihMpws9iiZQv7ZImf84ZsZpQH7QoWN4n4tm81SnSzPgHw2qtO0Zf3A==", "requires": { - "@babel/helper-hoist-variables": "^7.8.0", - "@babel/traverse": "^7.8.0", - "@babel/types": "^7.8.0" + "@babel/helper-hoist-variables": "^7.8.3", + "@babel/traverse": "^7.8.3", + "@babel/types": "^7.8.3" } }, "@babel/helper-compilation-targets": { - "version": "7.8.1", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.8.1.tgz", - "integrity": "sha512-Fsrljg8DHSdnKSzC0YFopX7lseRpVfWMYuC1Dnvf7tw972E2KDjZ4XEaqjO9aJL0sLcG4KNRXxowDxHYIcZ+Cw==", + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.8.4.tgz", + "integrity": "sha512-3k3BsKMvPp5bjxgMdrFyq0UaEO48HciVrOVF0+lon8pp95cyJ2ujAh0TrBHNMnJGT2rr0iKOJPFFbSqjDyf/Pg==", "requires": { - "@babel/compat-data": "^7.8.1", - "browserslist": "^4.8.2", + "@babel/compat-data": "^7.8.4", + "browserslist": "^4.8.5", "invariant": "^2.2.4", - "levenary": "^1.1.0", + "levenary": "^1.1.1", "semver": "^5.5.0" }, "dependencies": { @@ -136,187 +137,187 @@ } }, "@babel/helper-create-class-features-plugin": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.8.0.tgz", - "integrity": "sha512-ctCvqYBTlwEl2uF4hCxE0cd/sSw71Zfag0jKa39y4HDLh0BQ4PVBX1384Ye8GqrEZ69xgLp9fwPbv3GgIDDF2Q==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.8.3.tgz", + "integrity": "sha512-qmp4pD7zeTxsv0JNecSBsEmG1ei2MqwJq4YQcK3ZWm/0t07QstWfvuV/vm3Qt5xNMFETn2SZqpMx2MQzbtq+KA==", "requires": { - "@babel/helper-function-name": "^7.8.0", - "@babel/helper-member-expression-to-functions": "^7.8.0", - "@babel/helper-optimise-call-expression": "^7.8.0", - "@babel/helper-plugin-utils": "^7.8.0", - "@babel/helper-replace-supers": "^7.8.0", - "@babel/helper-split-export-declaration": "^7.8.0" + "@babel/helper-function-name": "^7.8.3", + "@babel/helper-member-expression-to-functions": "^7.8.3", + "@babel/helper-optimise-call-expression": "^7.8.3", + "@babel/helper-plugin-utils": "^7.8.3", + "@babel/helper-replace-supers": "^7.8.3", + "@babel/helper-split-export-declaration": "^7.8.3" } }, "@babel/helper-create-regexp-features-plugin": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.8.0.tgz", - "integrity": "sha512-vJj2hPbxxLUWJEV86iZiac5curAnC3ZVc+rFmFeWZigUOcuCPpbF+KxoEmxrkmuCGylHFF9t4lkpcDUcxnhQ5g==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.8.3.tgz", + "integrity": "sha512-Gcsm1OHCUr9o9TcJln57xhWHtdXbA2pgQ58S0Lxlks0WMGNXuki4+GLfX0p+L2ZkINUGZvfkz8rzoqJQSthI+Q==", "requires": { - "@babel/helper-regex": "^7.8.0", + "@babel/helper-regex": "^7.8.3", "regexpu-core": "^4.6.0" } }, "@babel/helper-define-map": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/helper-define-map/-/helper-define-map-7.8.0.tgz", - "integrity": "sha512-Go06lUlZ4YImNEmdyAH5iO38yh5mbpOPSwA2PtV1vyczFhTZfX0OtzkiIL2pACo6AOYf89pLh42nhhDrqgzC3A==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-define-map/-/helper-define-map-7.8.3.tgz", + "integrity": "sha512-PoeBYtxoZGtct3md6xZOCWPcKuMuk3IHhgxsRRNtnNShebf4C8YonTSblsK4tvDbm+eJAw2HAPOfCr+Q/YRG/g==", "requires": { - "@babel/helper-function-name": "^7.8.0", - "@babel/types": "^7.8.0", + "@babel/helper-function-name": "^7.8.3", + "@babel/types": "^7.8.3", "lodash": "^4.17.13" } }, "@babel/helper-explode-assignable-expression": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.8.0.tgz", - "integrity": "sha512-w4mRQqKAh4M7BSLwvDMm8jYFroEzpqMCtXDhFHP+kNjMIQWpbC6b0Q/RUQsJNSf54rIx6XMdci1Stf60DWw+og==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.8.3.tgz", + "integrity": "sha512-N+8eW86/Kj147bO9G2uclsg5pwfs/fqqY5rwgIL7eTBklgXjcOJ3btzS5iM6AitJcftnY7pm2lGsrJVYLGjzIw==", "requires": { - "@babel/traverse": "^7.8.0", - "@babel/types": "^7.8.0" + "@babel/traverse": "^7.8.3", + "@babel/types": "^7.8.3" } }, "@babel/helper-function-name": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.8.0.tgz", - "integrity": "sha512-x9psucuU0Xalw+0Vpr2FYJMLB7/KnPSLZhlkUyOGbYAWRDfmtZBrguYpJYiaNCRV7vGkYjO/gF6/J6yMvdWTDw==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.8.3.tgz", + "integrity": "sha512-BCxgX1BC2hD/oBlIFUgOCQDOPV8nSINxCwM3o93xP4P9Fq6aV5sgv2cOOITDMtCfQ+3PvHp3l689XZvAM9QyOA==", "requires": { - "@babel/helper-get-function-arity": "^7.8.0", - "@babel/template": "^7.8.0", - "@babel/types": "^7.8.0" + "@babel/helper-get-function-arity": "^7.8.3", + "@babel/template": "^7.8.3", + "@babel/types": "^7.8.3" } }, "@babel/helper-get-function-arity": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.8.0.tgz", - "integrity": "sha512-eUP5grliToMapQiTaYS2AAO/WwaCG7cuJztR1v/a1aPzUzUeGt+AaI9OvLATc/AfFkF8SLJ10d5ugGt/AQ9d6w==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.8.3.tgz", + "integrity": "sha512-FVDR+Gd9iLjUMY1fzE2SR0IuaJToR4RkCDARVfsBBPSP53GEqSFjD8gNyxg246VUyc/ALRxFaAK8rVG7UT7xRA==", "requires": { - "@babel/types": "^7.8.0" + "@babel/types": "^7.8.3" } }, "@babel/helper-hoist-variables": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.8.0.tgz", - "integrity": "sha512-jDl66KvuklTXUADcoXDMur1jDtAZUZZkzLIaQ54+z38ih8C0V0hC56hMaoVoyoxN60MwQmmrHctBwcLqP0c/Lw==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.8.3.tgz", + "integrity": "sha512-ky1JLOjcDUtSc+xkt0xhYff7Z6ILTAHKmZLHPxAhOP0Nd77O+3nCsd6uSVYur6nJnCI029CrNbYlc0LoPfAPQg==", "requires": { - "@babel/types": "^7.8.0" + "@babel/types": "^7.8.3" } }, "@babel/helper-member-expression-to-functions": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.8.0.tgz", - "integrity": "sha512-0m1QabGrdXuoxX/g+KOAGndoHwskC70WweqHRQyCsaO67KOEELYh4ECcGw6ZGKjDKa5Y7SW4Qbhw6ly4Fah/jQ==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.8.3.tgz", + "integrity": "sha512-fO4Egq88utkQFjbPrSHGmGLFqmrshs11d46WI+WZDESt7Wu7wN2G2Iu+NMMZJFDOVRHAMIkB5SNh30NtwCA7RA==", "requires": { - "@babel/types": "^7.8.0" + "@babel/types": "^7.8.3" } }, "@babel/helper-module-imports": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.8.0.tgz", - "integrity": "sha512-ylY9J6ZxEcjmJaJ4P6aVs/fZdrZVctCGnxxfYXwCnSMapqd544zT8lWK2qI/vBPjE5gS0o2jILnH+AkpsPauEQ==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.8.3.tgz", + "integrity": "sha512-R0Bx3jippsbAEtzkpZ/6FIiuzOURPcMjHp+Z6xPe6DtApDJx+w7UYyOLanZqO8+wKR9G10s/FmHXvxaMd9s6Kg==", "requires": { - "@babel/types": "^7.8.0" + "@babel/types": "^7.8.3" } }, "@babel/helper-module-transforms": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.8.0.tgz", - "integrity": "sha512-fvGhX4FY7YwRdWW/zfddNaKpYl8TaA8hvwONIYhv1/a1ZbgxbTrjsmH6IGWUgUNki7QzbpZ27OEh88sZdft3YA==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.8.3.tgz", + "integrity": "sha512-C7NG6B7vfBa/pwCOshpMbOYUmrYQDfCpVL/JCRu0ek8B5p8kue1+BCXpg2vOYs7w5ACB9GTOBYQ5U6NwrMg+3Q==", "requires": { - "@babel/helper-module-imports": "^7.8.0", - "@babel/helper-simple-access": "^7.8.0", - "@babel/helper-split-export-declaration": "^7.8.0", - "@babel/template": "^7.8.0", - "@babel/types": "^7.8.0", + "@babel/helper-module-imports": "^7.8.3", + "@babel/helper-simple-access": "^7.8.3", + "@babel/helper-split-export-declaration": "^7.8.3", + "@babel/template": "^7.8.3", + "@babel/types": "^7.8.3", "lodash": "^4.17.13" } }, "@babel/helper-optimise-call-expression": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.8.0.tgz", - "integrity": "sha512-aiJt1m+K57y0n10fTw+QXcCXzmpkG+o+NoQmAZqlZPstkTE0PZT+Z27QSd/6Gf00nuXJQO4NiJ0/YagSW5kC2A==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.8.3.tgz", + "integrity": "sha512-Kag20n86cbO2AvHca6EJsvqAd82gc6VMGule4HwebwMlwkpXuVqrNRj6CkCV2sKxgi9MyAUnZVnZ6lJ1/vKhHQ==", "requires": { - "@babel/types": "^7.8.0" + "@babel/types": "^7.8.3" } }, "@babel/helper-plugin-utils": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.0.tgz", - "integrity": "sha512-+hAlRGdf8fHQAyNnDBqTHQhwdLURLdrCROoWaEQYiQhk2sV9Rhs+GoFZZfMJExTq9HG8o2NX3uN2G90bFtmFdA==" + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz", + "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==" }, "@babel/helper-regex": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/helper-regex/-/helper-regex-7.8.0.tgz", - "integrity": "sha512-haD8fRsPtyFZkbtxBIaGBBHRtbn0YsyecdYrxNgO0Bl6SlGokJPQX9M2tDuVbeQBYHZVLUPMSwGQn4obHevsMQ==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-regex/-/helper-regex-7.8.3.tgz", + "integrity": "sha512-BWt0QtYv/cg/NecOAZMdcn/waj/5P26DR4mVLXfFtDokSR6fyuG0Pj+e2FqtSME+MqED1khnSMulkmGl8qWiUQ==", "requires": { "lodash": "^4.17.13" } }, "@babel/helper-remap-async-to-generator": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.8.0.tgz", - "integrity": "sha512-+aKyBd4oHAaIZgOLq/uLjkUz7ExZ0ppdNBc8Qr72BmtKNAy3A6EJa/ifjj0//CIzQtUDPs3E6HjKM2cV6bnXsQ==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.8.3.tgz", + "integrity": "sha512-kgwDmw4fCg7AVgS4DukQR/roGp+jP+XluJE5hsRZwxCYGg+Rv9wSGErDWhlI90FODdYfd4xG4AQRiMDjjN0GzA==", "requires": { - "@babel/helper-annotate-as-pure": "^7.8.0", - "@babel/helper-wrap-function": "^7.8.0", - "@babel/template": "^7.8.0", - "@babel/traverse": "^7.8.0", - "@babel/types": "^7.8.0" + "@babel/helper-annotate-as-pure": "^7.8.3", + "@babel/helper-wrap-function": "^7.8.3", + "@babel/template": "^7.8.3", + "@babel/traverse": "^7.8.3", + "@babel/types": "^7.8.3" } }, "@babel/helper-replace-supers": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.8.0.tgz", - "integrity": "sha512-R2CyorW4tcO3YzdkClLpt6MS84G+tPkOi0MmiCn1bvYVnmDpdl9R15XOi3NQW2mhOAEeBnuQ4g1Bh7pT2sX8fg==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.8.3.tgz", + "integrity": "sha512-xOUssL6ho41U81etpLoT2RTdvdus4VfHamCuAm4AHxGr+0it5fnwoVdwUJ7GFEqCsQYzJUhcbsN9wB9apcYKFA==", "requires": { - "@babel/helper-member-expression-to-functions": "^7.8.0", - "@babel/helper-optimise-call-expression": "^7.8.0", - "@babel/traverse": "^7.8.0", - "@babel/types": "^7.8.0" + "@babel/helper-member-expression-to-functions": "^7.8.3", + "@babel/helper-optimise-call-expression": "^7.8.3", + "@babel/traverse": "^7.8.3", + "@babel/types": "^7.8.3" } }, "@babel/helper-simple-access": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.8.0.tgz", - "integrity": "sha512-I+7yKZJnxp7VIC2UFzXfVjLiJuU16rYFF59x27c+boINkO/pLETgZcoesCryg9jmU4jxEa0foFueW+2wjc9Gsw==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.8.3.tgz", + "integrity": "sha512-VNGUDjx5cCWg4vvCTR8qQ7YJYZ+HBjxOgXEl7ounz+4Sn7+LMD3CFrCTEU6/qXKbA2nKg21CwhhBzO0RpRbdCw==", "requires": { - "@babel/template": "^7.8.0", - "@babel/types": "^7.8.0" + "@babel/template": "^7.8.3", + "@babel/types": "^7.8.3" } }, "@babel/helper-split-export-declaration": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.8.0.tgz", - "integrity": "sha512-YhYFhH4T6DlbT6CPtVgLfC1Jp2gbCawU/ml7WJvUpBg01bCrXSzTYMZZXbbIGjq/kHmK8YUATxTppcRGzj31pA==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.8.3.tgz", + "integrity": "sha512-3x3yOeyBhW851hroze7ElzdkeRXQYQbFIb7gLK1WQYsw2GWDay5gAJNw1sWJ0VFP6z5J1whqeXH/WCdCjZv6dA==", "requires": { - "@babel/types": "^7.8.0" + "@babel/types": "^7.8.3" } }, "@babel/helper-wrap-function": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.8.0.tgz", - "integrity": "sha512-2j6idN2jt8Y+8nJ4UPN/6AZa53DAkcETMVmroJQh50qZc59PuQKVjgOIIqmrLoQf6Ia9bs90MHRcID1OW5tfag==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.8.3.tgz", + "integrity": "sha512-LACJrbUET9cQDzb6kG7EeD7+7doC3JNvUgTEQOx2qaO1fKlzE/Bf05qs9w1oXQMmXlPO65lC3Tq9S6gZpTErEQ==", "requires": { - "@babel/helper-function-name": "^7.8.0", - "@babel/template": "^7.8.0", - "@babel/traverse": "^7.8.0", - "@babel/types": "^7.8.0" + "@babel/helper-function-name": "^7.8.3", + "@babel/template": "^7.8.3", + "@babel/traverse": "^7.8.3", + "@babel/types": "^7.8.3" } }, "@babel/helpers": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.8.0.tgz", - "integrity": "sha512-srWKpjAFbiut5JoCReZJ098hLqoZ9HufOnKZPggc7j74XaPuQ+9b3RYPV1M/HfjL63lCNd8uI1O487qIWxAFNA==", + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.8.4.tgz", + "integrity": "sha512-VPbe7wcQ4chu4TDQjimHv/5tj73qz88o12EPkO2ValS2QiQS/1F2SsjyIGNnAD0vF/nZS6Cf9i+vW6HIlnaR8w==", "requires": { - "@babel/template": "^7.8.0", - "@babel/traverse": "^7.8.0", - "@babel/types": "^7.8.0" + "@babel/template": "^7.8.3", + "@babel/traverse": "^7.8.4", + "@babel/types": "^7.8.3" } }, "@babel/highlight": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.8.0.tgz", - "integrity": "sha512-OsdTJbHlPtIk2mmtwXItYrdmalJ8T0zpVzNAbKSkHshuywj7zb29Y09McV/jQsQunc/nEyHiPV2oy9llYMLqxw==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.8.3.tgz", + "integrity": "sha512-PX4y5xQUvy0fnEVHrYOarRPXVWafSjTW9T0Hab8gVIawpl2Sj0ORyrygANq+KjcNlSSTw0YCLSNA8OyZ1I4yEg==", "requires": { "chalk": "^2.0.0", "esutils": "^2.0.2", @@ -324,501 +325,501 @@ } }, "@babel/parser": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.8.0.tgz", - "integrity": "sha512-VVtsnUYbd1+2A2vOVhm4P2qNXQE8L/W859GpUHfUcdhX8d3pEKThZuIr6fztocWx9HbK+00/CR0tXnhAggJ4CA==" + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.8.4.tgz", + "integrity": "sha512-0fKu/QqildpXmPVaRBoXOlyBb3MC+J0A66x97qEfLOMkn3u6nfY5esWogQwi/K0BjASYy4DbnsEWnpNL6qT5Mw==" }, "@babel/plugin-proposal-async-generator-functions": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.8.0.tgz", - "integrity": "sha512-8vIQf8JYced7gCeKDsGETNGKE+zdD/JmP1LBlRn+w3UXc1aSpZv2Y330bB/fnOEbUgPbuFv+IEi+gopg+Fu0kQ==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.8.3.tgz", + "integrity": "sha512-NZ9zLv848JsV3hs8ryEh7Uaz/0KsmPLqv0+PdkDJL1cJy0K4kOCFa8zc1E3mp+RHPQcpdfb/6GovEsW4VDrOMw==", "requires": { - "@babel/helper-plugin-utils": "^7.8.0", - "@babel/helper-remap-async-to-generator": "^7.8.0", + "@babel/helper-plugin-utils": "^7.8.3", + "@babel/helper-remap-async-to-generator": "^7.8.3", "@babel/plugin-syntax-async-generators": "^7.8.0" } }, "@babel/plugin-proposal-class-properties": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.7.4.tgz", - "integrity": "sha512-EcuXeV4Hv1X3+Q1TsuOmyyxeTRiSqurGJ26+I/FW1WbymmRRapVORm6x1Zl3iDIHyRxEs+VXWp6qnlcfcJSbbw==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.8.3.tgz", + "integrity": "sha512-EqFhbo7IosdgPgZggHaNObkmO1kNUe3slaKu54d5OWvy+p9QIKOzK1GAEpAIsZtWVtPXUHSMcT4smvDrCfY4AA==", "requires": { - "@babel/helper-create-class-features-plugin": "^7.7.4", - "@babel/helper-plugin-utils": "^7.0.0" + "@babel/helper-create-class-features-plugin": "^7.8.3", + "@babel/helper-plugin-utils": "^7.8.3" } }, "@babel/plugin-proposal-decorators": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.7.4.tgz", - "integrity": "sha512-GftcVDcLCwVdzKmwOBDjATd548+IE+mBo7ttgatqNDR7VG7GqIuZPtRWlMLHbhTXhcnFZiGER8iIYl1n/imtsg==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.8.3.tgz", + "integrity": "sha512-e3RvdvS4qPJVTe288DlXjwKflpfy1hr0j5dz5WpIYYeP7vQZg2WfAEIp8k5/Lwis/m5REXEteIz6rrcDtXXG7w==", "requires": { - "@babel/helper-create-class-features-plugin": "^7.7.4", - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/plugin-syntax-decorators": "^7.7.4" + "@babel/helper-create-class-features-plugin": "^7.8.3", + "@babel/helper-plugin-utils": "^7.8.3", + "@babel/plugin-syntax-decorators": "^7.8.3" } }, "@babel/plugin-proposal-dynamic-import": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.8.0.tgz", - "integrity": "sha512-YzMq0AqeTR4Mh2pz3GrCWqhcEV38HgUMMR/56/YR5GPc4Y2p1KJ4Le6j92vMnW8TJqVj+qJz/KDNglpMeww9Yg==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.8.3.tgz", + "integrity": "sha512-NyaBbyLFXFLT9FP+zk0kYlUlA8XtCUbehs67F0nnEg7KICgMc2mNkIeu9TYhKzyXMkrapZFwAhXLdnt4IYHy1w==", "requires": { - "@babel/helper-plugin-utils": "^7.8.0", + "@babel/helper-plugin-utils": "^7.8.3", "@babel/plugin-syntax-dynamic-import": "^7.8.0" } }, "@babel/plugin-proposal-json-strings": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.8.0.tgz", - "integrity": "sha512-pSpuhwn926vtNeUH2FHx1OzIXaUMgklG0MzlFZJVEg37fB904gOxN572NgBae+KDwFyZDpkLMyEkVA011lBJrQ==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.8.3.tgz", + "integrity": "sha512-KGhQNZ3TVCQG/MjRbAUwuH+14y9q0tpxs1nWWs3pbSleRdDro9SAMMDyye8HhY1gqZ7/NqIc8SKhya0wRDgP1Q==", "requires": { - "@babel/helper-plugin-utils": "^7.8.0", + "@babel/helper-plugin-utils": "^7.8.3", "@babel/plugin-syntax-json-strings": "^7.8.0" } }, "@babel/plugin-proposal-nullish-coalescing-operator": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.8.0.tgz", - "integrity": "sha512-cQMI+RQdcK2IyMm13NKKFCYfOSBUtFxEeRBOdFCi2Pubv/CpkrCubc/ikdeKMT6Lu+uQ+lNSDEJvDCOQZkUy0g==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.8.3.tgz", + "integrity": "sha512-TS9MlfzXpXKt6YYomudb/KU7nQI6/xnapG6in1uZxoxDghuSMZsPb6D2fyUwNYSAp4l1iR7QtFOjkqcRYcUsfw==", "requires": { - "@babel/helper-plugin-utils": "^7.8.0", + "@babel/helper-plugin-utils": "^7.8.3", "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.0" } }, "@babel/plugin-proposal-numeric-separator": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.7.4.tgz", - "integrity": "sha512-CG605v7lLpVgVldSY6kxsN9ui1DxFOyepBfuX2AzU2TNriMAYApoU55mrGw9Jr4TlrTzPCG10CL8YXyi+E/iPw==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.8.3.tgz", + "integrity": "sha512-jWioO1s6R/R+wEHizfaScNsAx+xKgwTLNXSh7tTC4Usj3ItsPEhYkEpU4h+lpnBwq7NBVOJXfO6cRFYcX69JUQ==", "requires": { - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/plugin-syntax-numeric-separator": "^7.7.4" + "@babel/helper-plugin-utils": "^7.8.3", + "@babel/plugin-syntax-numeric-separator": "^7.8.3" } }, "@babel/plugin-proposal-object-rest-spread": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.8.0.tgz", - "integrity": "sha512-SjJ2ZXCylpWC+5DTES0/pbpNmw/FnjU/3dF068xF0DU9aN+oOKah+3MCSFcb4pnZ9IwmxfOy4KnbGJSQR+hAZA==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.8.3.tgz", + "integrity": "sha512-8qvuPwU/xxUCt78HocNlv0mXXo0wdh9VT1R04WU8HGOfaOob26pF+9P5/lYjN/q7DHOX1bvX60hnhOvuQUJdbA==", "requires": { - "@babel/helper-plugin-utils": "^7.8.0", + "@babel/helper-plugin-utils": "^7.8.3", "@babel/plugin-syntax-object-rest-spread": "^7.8.0" } }, "@babel/plugin-proposal-optional-catch-binding": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.8.0.tgz", - "integrity": "sha512-tHP3eez6TrpPJYttBZ/6uItRbIuXUIDpQ9xwvzKwR+RboWGMJ7WzFC5dDJ3vjLuCx0/DG1tM0MVkmgcBybth9w==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.8.3.tgz", + "integrity": "sha512-0gkX7J7E+AtAw9fcwlVQj8peP61qhdg/89D5swOkjYbkboA2CVckn3kiyum1DE0wskGb7KJJxBdyEBApDLLVdw==", "requires": { - "@babel/helper-plugin-utils": "^7.8.0", + "@babel/helper-plugin-utils": "^7.8.3", "@babel/plugin-syntax-optional-catch-binding": "^7.8.0" } }, "@babel/plugin-proposal-optional-chaining": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.8.0.tgz", - "integrity": "sha512-PNBHxPHE91m+LLOdGwlvyGicWfrMgiVwng5WdB3CMjd61+vn3vPw0GbgECIAUCZnyi7Jqs5htUIZRztGuV8/5g==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.8.3.tgz", + "integrity": "sha512-QIoIR9abkVn+seDE3OjA08jWcs3eZ9+wJCKSRgo3WdEU2csFYgdScb+8qHB3+WXsGJD55u+5hWCISI7ejXS+kg==", "requires": { - "@babel/helper-plugin-utils": "^7.8.0", + "@babel/helper-plugin-utils": "^7.8.3", "@babel/plugin-syntax-optional-chaining": "^7.8.0" } }, "@babel/plugin-proposal-unicode-property-regex": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.8.0.tgz", - "integrity": "sha512-3oK0Qt5w4arb+es3rWBribDbtc0TYJP7dFZ1dXcYul3cXderqfIOoSx9YUC1oD208nJwJO/++fvrgLmkYSbe8A==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.8.3.tgz", + "integrity": "sha512-1/1/rEZv2XGweRwwSkLpY+s60za9OZ1hJs4YDqFHCw0kYWYwL5IFljVY1MYBL+weT1l9pokDO2uhSTLVxzoHkQ==", "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.8.0", - "@babel/helper-plugin-utils": "^7.8.0" + "@babel/helper-create-regexp-features-plugin": "^7.8.3", + "@babel/helper-plugin-utils": "^7.8.3" } }, "@babel/plugin-syntax-async-generators": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.0.tgz", - "integrity": "sha512-a8w8k7pK8nYhem07rXdAq03T+DlTX8LFojUptrh9JEx80AgLqGiuoFIyQOGTWif39kFnDOQqbzl1s6KQqrfV+A==", + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", + "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", "requires": { "@babel/helper-plugin-utils": "^7.8.0" } }, "@babel/plugin-syntax-decorators": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.8.0.tgz", - "integrity": "sha512-Qz68qh9jJqQePGWqbNW9PA7vkE2gvnWkYtx32jgPOszpE7u+xObPkRGm3B80oXAjQlBdTa4ktqjkOIRiKRuapw==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.8.3.tgz", + "integrity": "sha512-8Hg4dNNT9/LcA1zQlfwuKR8BUc/if7Q7NkTam9sGTcJphLwpf2g4S42uhspQrIrR+dpzE0dtTqBVFoHl8GtnnQ==", "requires": { - "@babel/helper-plugin-utils": "^7.8.0" + "@babel/helper-plugin-utils": "^7.8.3" } }, "@babel/plugin-syntax-dynamic-import": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.0.tgz", - "integrity": "sha512-Mx2RzpCHJaBfmFdA2abXDKRHVJdzJ6R0Wqwb6TxCgM7NRR5wcC4cyiAsRL7Ga+lwG8GG1cKvb+4ENjic8y15jA==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", + "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", "requires": { "@babel/helper-plugin-utils": "^7.8.0" } }, "@babel/plugin-syntax-flow": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.8.0.tgz", - "integrity": "sha512-MDK9WdjDccrxzz+4sthpSDnqdf5McJwTtfBYGitOweC/j0Zg6e8wHmP4RGLTeyGYe/IySoRgKC5hvSm6ddrNRw==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.8.3.tgz", + "integrity": "sha512-innAx3bUbA0KSYj2E2MNFSn9hiCeowOFLxlsuhXzw8hMQnzkDomUr9QCD7E9VF60NmnG1sNTuuv6Qf4f8INYsg==", "requires": { - "@babel/helper-plugin-utils": "^7.8.0" + "@babel/helper-plugin-utils": "^7.8.3" } }, "@babel/plugin-syntax-json-strings": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.0.tgz", - "integrity": "sha512-LPykaAbH86L5NnDfCRSpNxtEHZk+6GaFzXfWEFU/6R4v69EXQr6GOp7hwH+Uw0QlYVN++s6TukTJ3flFcspahA==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", + "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", "requires": { "@babel/helper-plugin-utils": "^7.8.0" } }, "@babel/plugin-syntax-jsx": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.8.0.tgz", - "integrity": "sha512-zLDUckAuKeOtxJhfNE0TlR7iEApb2u7EYRlh5cxKzq6A5VzUbYEdyJGJlug41jDbjRbHTtsLKZUnUcy/8V3xZw==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.8.3.tgz", + "integrity": "sha512-WxdW9xyLgBdefoo0Ynn3MRSkhe5tFVxxKNVdnZSh318WrG2e2jH+E9wd/++JsqcLJZPfz87njQJ8j2Upjm0M0A==", "requires": { - "@babel/helper-plugin-utils": "^7.8.0" + "@babel/helper-plugin-utils": "^7.8.3" } }, "@babel/plugin-syntax-nullish-coalescing-operator": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.0.tgz", - "integrity": "sha512-Rv2hnBToN6rbA9hO2a4vtwXZLzNa+TWkoSIMMvUezFz5+D9NPeX7SFrArwtFzzbwndmWiqboTr5rNpzAz0MPpA==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", + "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", "requires": { "@babel/helper-plugin-utils": "^7.8.0" } }, "@babel/plugin-syntax-numeric-separator": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.8.0.tgz", - "integrity": "sha512-GEYjlQAr/zXMVuce0Nq/boG4wNjJxdIOc4RKcgBEo/r/J3LrghZz8+ZYo8k+OuLJKvvV22k84tBuw1YunnLgCQ==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.8.3.tgz", + "integrity": "sha512-H7dCMAdN83PcCmqmkHB5dtp+Xa9a6LKSvA2hiFBC/5alSHxM5VgWZXFqDi0YFe8XNGT6iCa+z4V4zSt/PdZ7Dw==", "requires": { - "@babel/helper-plugin-utils": "^7.8.0" + "@babel/helper-plugin-utils": "^7.8.3" } }, "@babel/plugin-syntax-object-rest-spread": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.0.tgz", - "integrity": "sha512-dt89fDlkfkTrQcy5KavMQPyF2A6tR0kYp8HAnIoQv5hO34iAUffHghP/hMGd7Gf/+uYTmLQO0ar7peX1SUWyIA==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", + "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", "requires": { "@babel/helper-plugin-utils": "^7.8.0" } }, "@babel/plugin-syntax-optional-catch-binding": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.0.tgz", - "integrity": "sha512-EIgJVy+u1RvR2gJfX4ReLwAupO/twllUue1wPrRxhu18+eC3bGTEcOSXLQdaE9ya9NG1rE0eQs0GSiloUGFEwg==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", + "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", "requires": { "@babel/helper-plugin-utils": "^7.8.0" } }, "@babel/plugin-syntax-optional-chaining": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.0.tgz", - "integrity": "sha512-LV1c+TTAO8Vawe3t+WXBHYWbS7endP8MSlqKPKEZOyWPEJX2akl3jfvFG828/OE7RpyoC3JXfLJDFj/jN7A8hg==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", + "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", "requires": { "@babel/helper-plugin-utils": "^7.8.0" } }, "@babel/plugin-syntax-top-level-await": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.8.0.tgz", - "integrity": "sha512-iXR/Cw32fMfWlD1sK2zD/nXtuLStkalRv+xee6VrX84CFrn2LKwb/EOs/4UaDNUpUsws8YZYKeQjPagacFquug==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.8.3.tgz", + "integrity": "sha512-kwj1j9lL/6Wd0hROD3b/OZZ7MSrZLqqn9RAZ5+cYYsflQ9HZBIKCUkr3+uL1MEJ1NePiUbf98jjiMQSv0NMR9g==", "requires": { - "@babel/helper-plugin-utils": "^7.8.0" + "@babel/helper-plugin-utils": "^7.8.3" } }, "@babel/plugin-syntax-typescript": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.8.0.tgz", - "integrity": "sha512-LrvVrabb993Ve5fzXsyEkfYCuhpXBwsUFjlvgD8UmXXg3r/8/ceooSdRvjdmtPXXz+lHaqZHZooV1jMWer2qkA==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.8.3.tgz", + "integrity": "sha512-GO1MQ/SGGGoiEXY0e0bSpHimJvxqB7lktLLIq2pv8xG7WZ8IMEle74jIe1FhprHBWjwjZtXHkycDLZXIWM5Wfg==", "requires": { - "@babel/helper-plugin-utils": "^7.8.0" + "@babel/helper-plugin-utils": "^7.8.3" } }, "@babel/plugin-transform-arrow-functions": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.8.0.tgz", - "integrity": "sha512-9KfteDp9d8cF388dxFMOh3Dum41qpOVUPVjQhXGd1kPyQBE05FJgYndiAriML2yhMIbZ2bjgweh2nnvBXDH2MQ==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.8.3.tgz", + "integrity": "sha512-0MRF+KC8EqH4dbuITCWwPSzsyO3HIWWlm30v8BbbpOrS1B++isGxPnnuq/IZvOX5J2D/p7DQalQm+/2PnlKGxg==", "requires": { - "@babel/helper-plugin-utils": "^7.8.0" + "@babel/helper-plugin-utils": "^7.8.3" } }, "@babel/plugin-transform-async-to-generator": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.8.0.tgz", - "integrity": "sha512-9dvBvJnEdsDWYMrykoMyLNVRPGoub6SFlARtsYgSQ1riTjnyBjhctihSME4XsSku86F59PDeFpC9PCU+9I154w==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.8.3.tgz", + "integrity": "sha512-imt9tFLD9ogt56Dd5CI/6XgpukMwd/fLGSrix2httihVe7LOGVPhyhMh1BU5kDM7iHD08i8uUtmV2sWaBFlHVQ==", "requires": { - "@babel/helper-module-imports": "^7.8.0", - "@babel/helper-plugin-utils": "^7.8.0", - "@babel/helper-remap-async-to-generator": "^7.8.0" + "@babel/helper-module-imports": "^7.8.3", + "@babel/helper-plugin-utils": "^7.8.3", + "@babel/helper-remap-async-to-generator": "^7.8.3" } }, "@babel/plugin-transform-block-scoped-functions": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.8.0.tgz", - "integrity": "sha512-bim6gUfHq2kPN+aQst33ZEMeglpaUXAo6PWTZvOA8BOnWpNKgZcUzBvpZhh2ofL6YhZgzGoRwVVfzwynDEf47g==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.8.3.tgz", + "integrity": "sha512-vo4F2OewqjbB1+yaJ7k2EJFHlTP3jR634Z9Cj9itpqNjuLXvhlVxgnjsHsdRgASR8xYDrx6onw4vW5H6We0Jmg==", "requires": { - "@babel/helper-plugin-utils": "^7.8.0" + "@babel/helper-plugin-utils": "^7.8.3" } }, "@babel/plugin-transform-block-scoping": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.8.0.tgz", - "integrity": "sha512-FKTK4hzg7W950Yu9iqMl12WBixCmusMc5HBt3/ErvpFLnvr3/6mu/EBTZoCEJ0mw/lQUDfU01vTcZY9oEahlMg==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.8.3.tgz", + "integrity": "sha512-pGnYfm7RNRgYRi7bids5bHluENHqJhrV4bCZRwc5GamaWIIs07N4rZECcmJL6ZClwjDz1GbdMZFtPs27hTB06w==", "requires": { - "@babel/helper-plugin-utils": "^7.8.0", + "@babel/helper-plugin-utils": "^7.8.3", "lodash": "^4.17.13" } }, "@babel/plugin-transform-classes": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.8.0.tgz", - "integrity": "sha512-18RLDwKtGXCLLbf5V03GojebPH7dKYCmIBqQGhgfZDoYsyEzR9kMZ6IxlJP72K5ROC9ADa4KPI6ywuh7NfQOgQ==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.8.3.tgz", + "integrity": "sha512-SjT0cwFJ+7Rbr1vQsvphAHwUHvSUPmMjMU/0P59G8U2HLFqSa082JO7zkbDNWs9kH/IUqpHI6xWNesGf8haF1w==", "requires": { - "@babel/helper-annotate-as-pure": "^7.8.0", - "@babel/helper-define-map": "^7.8.0", - "@babel/helper-function-name": "^7.8.0", - "@babel/helper-optimise-call-expression": "^7.8.0", - "@babel/helper-plugin-utils": "^7.8.0", - "@babel/helper-replace-supers": "^7.8.0", - "@babel/helper-split-export-declaration": "^7.8.0", + "@babel/helper-annotate-as-pure": "^7.8.3", + "@babel/helper-define-map": "^7.8.3", + "@babel/helper-function-name": "^7.8.3", + "@babel/helper-optimise-call-expression": "^7.8.3", + "@babel/helper-plugin-utils": "^7.8.3", + "@babel/helper-replace-supers": "^7.8.3", + "@babel/helper-split-export-declaration": "^7.8.3", "globals": "^11.1.0" } }, "@babel/plugin-transform-computed-properties": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.8.0.tgz", - "integrity": "sha512-FaODHuQRdnWFVwxLPlTN85Lk/aitfvQBHTXahf58FnatCynfhkeNUO8ID+AqAxY4IJsZjeH6OnKDzcGfgKJcVw==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.8.3.tgz", + "integrity": "sha512-O5hiIpSyOGdrQZRQ2ccwtTVkgUDBBiCuK//4RJ6UfePllUTCENOzKxfh6ulckXKc0DixTFLCfb2HVkNA7aDpzA==", "requires": { - "@babel/helper-plugin-utils": "^7.8.0" + "@babel/helper-plugin-utils": "^7.8.3" } }, "@babel/plugin-transform-destructuring": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.8.0.tgz", - "integrity": "sha512-D+69HT//cE86aBTLULzSBFLC5A7HcPQzJPiny6P4SLHkDF750MylRKO3iWvdgvb+OSp5dOrOxwXajvaxk1ZfYA==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.8.3.tgz", + "integrity": "sha512-H4X646nCkiEcHZUZaRkhE2XVsoz0J/1x3VVujnn96pSoGCtKPA99ZZA+va+gK+92Zycd6OBKCD8tDb/731bhgQ==", "requires": { - "@babel/helper-plugin-utils": "^7.8.0" + "@babel/helper-plugin-utils": "^7.8.3" } }, "@babel/plugin-transform-dotall-regex": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.8.0.tgz", - "integrity": "sha512-pq/XLkDB4MPvTe9ktHJInfWksalXogrIGRZJUG7RiDXhEfdNrlducoMPbACZQuCFtelVgVpD0VyreiY0l38G7g==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.8.3.tgz", + "integrity": "sha512-kLs1j9Nn4MQoBYdRXH6AeaXMbEJFaFu/v1nQkvib6QzTj8MZI5OQzqmD83/2jEM1z0DLilra5aWO5YpyC0ALIw==", "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.8.0", - "@babel/helper-plugin-utils": "^7.8.0" + "@babel/helper-create-regexp-features-plugin": "^7.8.3", + "@babel/helper-plugin-utils": "^7.8.3" } }, "@babel/plugin-transform-duplicate-keys": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.8.0.tgz", - "integrity": "sha512-REtYWvpP4TDw4oVeP01vQJcAeewjgk8/i7tPFP11vUjvarUGGyxJLeq79WEnIdnKPQJirZaoDRT4kEWEdSWkDw==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.8.3.tgz", + "integrity": "sha512-s8dHiBUbcbSgipS4SMFuWGqCvyge5V2ZeAWzR6INTVC3Ltjig/Vw1G2Gztv0vU/hRG9X8IvKvYdoksnUfgXOEQ==", "requires": { - "@babel/helper-plugin-utils": "^7.8.0" + "@babel/helper-plugin-utils": "^7.8.3" } }, "@babel/plugin-transform-exponentiation-operator": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.8.0.tgz", - "integrity": "sha512-vaDgF3gPLzVcoe3UZqnra6FA7O797sZc+UCHPd9eQTI34cPtpCA270LzopIXS3Fhc3UmFrijLmre9mHTmUKVgg==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.8.3.tgz", + "integrity": "sha512-zwIpuIymb3ACcInbksHaNcR12S++0MDLKkiqXHl3AzpgdKlFNhog+z/K0+TGW+b0w5pgTq4H6IwV/WhxbGYSjQ==", "requires": { - "@babel/helper-builder-binary-assignment-operator-visitor": "^7.8.0", - "@babel/helper-plugin-utils": "^7.8.0" + "@babel/helper-builder-binary-assignment-operator-visitor": "^7.8.3", + "@babel/helper-plugin-utils": "^7.8.3" } }, "@babel/plugin-transform-flow-strip-types": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.7.4.tgz", - "integrity": "sha512-w9dRNlHY5ElNimyMYy0oQowvQpwt/PRHI0QS98ZJCTZU2bvSnKXo5zEiD5u76FBPigTm8TkqzmnUTg16T7qbkA==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.8.3.tgz", + "integrity": "sha512-g/6WTWG/xbdd2exBBzMfygjX/zw4eyNC4X8pRaq7aRHRoDUCzAIu3kGYIXviOv8BjCuWm8vDBwjHcjiRNgXrPA==", "requires": { - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/plugin-syntax-flow": "^7.7.4" + "@babel/helper-plugin-utils": "^7.8.3", + "@babel/plugin-syntax-flow": "^7.8.3" } }, "@babel/plugin-transform-for-of": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.8.0.tgz", - "integrity": "sha512-9j9g0qViCAo8E5qCBSaQdghymn7A9bRXSfS9jU7oLpYccYFZg9A+1KO8X+HV7fhJYH6mZ+e7MRg4p3sLo+RG6Q==", + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.8.4.tgz", + "integrity": "sha512-iAXNlOWvcYUYoV8YIxwS7TxGRJcxyl8eQCfT+A5j8sKUzRFvJdcyjp97jL2IghWSRDaL2PU2O2tX8Cu9dTBq5A==", "requires": { - "@babel/helper-plugin-utils": "^7.8.0" + "@babel/helper-plugin-utils": "^7.8.3" } }, "@babel/plugin-transform-function-name": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.8.0.tgz", - "integrity": "sha512-YL8Ol54UKeIyY1uUGfry+B9ppXAB3aVBB1gG9gxqhg/OBCPpV2QUNswmjvfmyXEdaWv8qODssBgX7on792h44w==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.8.3.tgz", + "integrity": "sha512-rO/OnDS78Eifbjn5Py9v8y0aR+aSYhDhqAwVfsTl0ERuMZyr05L1aFSCJnbv2mmsLkit/4ReeQ9N2BgLnOcPCQ==", "requires": { - "@babel/helper-function-name": "^7.8.0", - "@babel/helper-plugin-utils": "^7.8.0" + "@babel/helper-function-name": "^7.8.3", + "@babel/helper-plugin-utils": "^7.8.3" } }, "@babel/plugin-transform-literals": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.8.0.tgz", - "integrity": "sha512-7UDPKG+uVltsZt98Hw+rMbLg772r8fQC6YJ2fNDckcpAXgIWqQbMCmCpfYo0hBNhdhqocM73auk4P/zziQshQw==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.8.3.tgz", + "integrity": "sha512-3Tqf8JJ/qB7TeldGl+TT55+uQei9JfYaregDcEAyBZ7akutriFrt6C/wLYIer6OYhleVQvH/ntEhjE/xMmy10A==", "requires": { - "@babel/helper-plugin-utils": "^7.8.0" + "@babel/helper-plugin-utils": "^7.8.3" } }, "@babel/plugin-transform-member-expression-literals": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.8.0.tgz", - "integrity": "sha512-lJSdaWR56wmrosCiyqKFRVnLrFYoVAk2mtZAyegt7akeJky/gguv0Rukx9GV3XwHGuM1ZPE06cZMjNlcLp8LrQ==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.8.3.tgz", + "integrity": "sha512-3Wk2EXhnw+rP+IDkK6BdtPKsUE5IeZ6QOGrPYvw52NwBStw9V1ZVzxgK6fSKSxqUvH9eQPR3tm3cOq79HlsKYA==", "requires": { - "@babel/helper-plugin-utils": "^7.8.0" + "@babel/helper-plugin-utils": "^7.8.3" } }, "@babel/plugin-transform-modules-amd": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.8.0.tgz", - "integrity": "sha512-mFr1O3TaDL4XozM3AzNPz9AsxzzjTxwn4aOShYP5TlO+4rufvjagV2KKDTPMZTQm1ZA/C/PxJDsDekEnnUGz5A==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.8.3.tgz", + "integrity": "sha512-MadJiU3rLKclzT5kBH4yxdry96odTUwuqrZM+GllFI/VhxfPz+k9MshJM+MwhfkCdxxclSbSBbUGciBngR+kEQ==", "requires": { - "@babel/helper-module-transforms": "^7.8.0", - "@babel/helper-plugin-utils": "^7.8.0", + "@babel/helper-module-transforms": "^7.8.3", + "@babel/helper-plugin-utils": "^7.8.3", "babel-plugin-dynamic-import-node": "^2.3.0" } }, "@babel/plugin-transform-modules-commonjs": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.8.0.tgz", - "integrity": "sha512-w2g8tmL7NgBYt6alc8YawMcmPiYqnVvvI0kLB++VOUOssqdJMAkfQOMGV+2M8H5uhJYDaAghAVMUYps3s+jMrw==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.8.3.tgz", + "integrity": "sha512-JpdMEfA15HZ/1gNuB9XEDlZM1h/gF/YOH7zaZzQu2xCFRfwc01NXBMHHSTT6hRjlXJJs5x/bfODM3LiCk94Sxg==", "requires": { - "@babel/helper-module-transforms": "^7.8.0", - "@babel/helper-plugin-utils": "^7.8.0", - "@babel/helper-simple-access": "^7.8.0", + "@babel/helper-module-transforms": "^7.8.3", + "@babel/helper-plugin-utils": "^7.8.3", + "@babel/helper-simple-access": "^7.8.3", "babel-plugin-dynamic-import-node": "^2.3.0" } }, "@babel/plugin-transform-modules-systemjs": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.8.0.tgz", - "integrity": "sha512-tKF9KLiIsiKyWTVU0yo+NcNAylGn7euggYwXw63/tMxGtDTPsB9Y7Ecqv4EoXEwtoJOJ0Lewf17oaWQtindxIA==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.8.3.tgz", + "integrity": "sha512-8cESMCJjmArMYqa9AO5YuMEkE4ds28tMpZcGZB/jl3n0ZzlsxOAi3mC+SKypTfT8gjMupCnd3YiXCkMjj2jfOg==", "requires": { - "@babel/helper-hoist-variables": "^7.8.0", - "@babel/helper-module-transforms": "^7.8.0", - "@babel/helper-plugin-utils": "^7.8.0", + "@babel/helper-hoist-variables": "^7.8.3", + "@babel/helper-module-transforms": "^7.8.3", + "@babel/helper-plugin-utils": "^7.8.3", "babel-plugin-dynamic-import-node": "^2.3.0" } }, "@babel/plugin-transform-modules-umd": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.8.0.tgz", - "integrity": "sha512-lAwNfXwmfTy7fl2XOyoVpMXnLkJANgH0vdSYNFcS4RuJPBtHfunGA+Y0L7wsHmfPzyVYt8sUglLjaWtdZMNJNg==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.8.3.tgz", + "integrity": "sha512-evhTyWhbwbI3/U6dZAnx/ePoV7H6OUG+OjiJFHmhr9FPn0VShjwC2kdxqIuQ/+1P50TMrneGzMeyMTFOjKSnAw==", "requires": { - "@babel/helper-module-transforms": "^7.8.0", - "@babel/helper-plugin-utils": "^7.8.0" + "@babel/helper-module-transforms": "^7.8.3", + "@babel/helper-plugin-utils": "^7.8.3" } }, "@babel/plugin-transform-named-capturing-groups-regex": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.8.0.tgz", - "integrity": "sha512-kq1rxQ1HviCP13SMGZ4WjBBpdogTGK7yn/g/+p+g1AQledgHOWKVeMY1DwKYGlGJ/grDGTOqpJLF1v3Sb7ghKA==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.8.3.tgz", + "integrity": "sha512-f+tF/8UVPU86TrCb06JoPWIdDpTNSGGcAtaD9mLP0aYGA0OS0j7j7DHJR0GTFrUZPUU6loZhbsVZgTh0N+Qdnw==", "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.8.0" + "@babel/helper-create-regexp-features-plugin": "^7.8.3" } }, "@babel/plugin-transform-new-target": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.8.0.tgz", - "integrity": "sha512-hH1Afz9Xy/wkcxhoI0vYw48kTBJqYUhMmhp3SLI1p817iByM6ItH4LS8tZatDAIKmAQAXj8d3Ups1BgVJECDrA==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.8.3.tgz", + "integrity": "sha512-QuSGysibQpyxexRyui2vca+Cmbljo8bcRckgzYV4kRIsHpVeyeC3JDO63pY+xFZ6bWOBn7pfKZTqV4o/ix9sFw==", "requires": { - "@babel/helper-plugin-utils": "^7.8.0" + "@babel/helper-plugin-utils": "^7.8.3" } }, "@babel/plugin-transform-object-super": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.8.0.tgz", - "integrity": "sha512-2DYqQ811nRlFVlni6iqfxBVVGqkBgfvEv/lcvmdNu2CaG+EA7zSP1hqYUsqamR+uCdDbsrV7uY6/0rkXbJo5YQ==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.8.3.tgz", + "integrity": "sha512-57FXk+gItG/GejofIyLIgBKTas4+pEU47IXKDBWFTxdPd7F80H8zybyAY7UoblVfBhBGs2EKM+bJUu2+iUYPDQ==", "requires": { - "@babel/helper-plugin-utils": "^7.8.0", - "@babel/helper-replace-supers": "^7.8.0" + "@babel/helper-plugin-utils": "^7.8.3", + "@babel/helper-replace-supers": "^7.8.3" } }, "@babel/plugin-transform-parameters": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.8.0.tgz", - "integrity": "sha512-9R2yykk7H92rntETO0fq52vJ4OFaTcDA49K9s8bQPyoD4o3/SkWEklukArCsQC6fowEuraPkH/umopr9uO539g==", + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.8.4.tgz", + "integrity": "sha512-IsS3oTxeTsZlE5KqzTbcC2sV0P9pXdec53SU+Yxv7o/6dvGM5AkTotQKhoSffhNgZ/dftsSiOoxy7evCYJXzVA==", "requires": { - "@babel/helper-call-delegate": "^7.8.0", - "@babel/helper-get-function-arity": "^7.8.0", - "@babel/helper-plugin-utils": "^7.8.0" + "@babel/helper-call-delegate": "^7.8.3", + "@babel/helper-get-function-arity": "^7.8.3", + "@babel/helper-plugin-utils": "^7.8.3" } }, "@babel/plugin-transform-property-literals": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.8.0.tgz", - "integrity": "sha512-vjZaQlojnZIahu5ofEW+hPJfDI5A6r2Sbi5C0RuCaAOFj7viDIR5kOR7ul3Fz5US8V1sVk5Zd2yuPaz7iBeysg==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.8.3.tgz", + "integrity": "sha512-uGiiXAZMqEoQhRWMK17VospMZh5sXWg+dlh2soffpkAl96KAm+WZuJfa6lcELotSRmooLqg0MWdH6UUq85nmmg==", "requires": { - "@babel/helper-plugin-utils": "^7.8.0" + "@babel/helper-plugin-utils": "^7.8.3" } }, "@babel/plugin-transform-react-constant-elements": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.8.0.tgz", - "integrity": "sha512-Rv1xUzuQK1tC66/4FxaG750bDr/Nv5AiSBmIwAK4bhksGUsl8XHPznASFchvsM7JMjI50gZvXMKmDJiKbyAfLw==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.8.3.tgz", + "integrity": "sha512-glrzN2U+egwRfkNFtL34xIBYTxbbUF2qJTP8HD3qETBBqzAWSeNB821X0GjU06+dNpq/UyCIjI72FmGE5NNkQQ==", "requires": { - "@babel/helper-annotate-as-pure": "^7.8.0", - "@babel/helper-plugin-utils": "^7.8.0" + "@babel/helper-annotate-as-pure": "^7.8.3", + "@babel/helper-plugin-utils": "^7.8.3" } }, "@babel/plugin-transform-react-display-name": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.8.0.tgz", - "integrity": "sha512-oozdOhU2hZ6Tb9LS9BceGqDSmiUrlZX8lmRqnxQuiGzqWlhflIRQ1oFBHdV+hv+Zi9e5BhRkfSYtMLRLEkuOVA==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.8.3.tgz", + "integrity": "sha512-3Jy/PCw8Fe6uBKtEgz3M82ljt+lTg+xJaM4og+eyu83qLT87ZUSckn0wy7r31jflURWLO83TW6Ylf7lyXj3m5A==", "requires": { - "@babel/helper-plugin-utils": "^7.8.0" + "@babel/helper-plugin-utils": "^7.8.3" } }, "@babel/plugin-transform-react-jsx": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.8.0.tgz", - "integrity": "sha512-r5DgP2ZblaGmW/azRS9rlaf3oY4r/ByXRDA5Lcr3iHUkx3cCfL9RM10gU7AQmzwKymoq8LZ55sHyq9VeQFHwyQ==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.8.3.tgz", + "integrity": "sha512-r0h+mUiyL595ikykci+fbwm9YzmuOrUBi0b+FDIKmi3fPQyFokWVEMJnRWHJPPQEjyFJyna9WZC6Viv6UHSv1g==", "requires": { - "@babel/helper-builder-react-jsx": "^7.8.0", - "@babel/helper-plugin-utils": "^7.8.0", - "@babel/plugin-syntax-jsx": "^7.8.0" + "@babel/helper-builder-react-jsx": "^7.8.3", + "@babel/helper-plugin-utils": "^7.8.3", + "@babel/plugin-syntax-jsx": "^7.8.3" } }, "@babel/plugin-transform-react-jsx-self": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.8.0.tgz", - "integrity": "sha512-hJXfJdLDDlJoxW/rAjkuIpGUUTizQ6fN9tIciW1M8KIqFsmpEf9psBPNTXYRCOLYLEsra+/WgVq+sc+1z05nQw==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.8.3.tgz", + "integrity": "sha512-01OT7s5oa0XTLf2I8XGsL8+KqV9lx3EZV+jxn/L2LQ97CGKila2YMroTkCEIE0HV/FF7CMSRsIAybopdN9NTdg==", "requires": { - "@babel/helper-plugin-utils": "^7.8.0", - "@babel/plugin-syntax-jsx": "^7.8.0" + "@babel/helper-plugin-utils": "^7.8.3", + "@babel/plugin-syntax-jsx": "^7.8.3" } }, "@babel/plugin-transform-react-jsx-source": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.8.0.tgz", - "integrity": "sha512-W+0VXOhMRdUTL7brjKXND+BiXbsxczfMdZongQ/Jtti0JVMtcTxWo66NMxNNtbPYvbc4aUXmgjl3eMms41sYtg==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.8.3.tgz", + "integrity": "sha512-PLMgdMGuVDtRS/SzjNEQYUT8f4z1xb2BAT54vM1X5efkVuYBf5WyGUMbpmARcfq3NaglIwz08UVQK4HHHbC6ag==", "requires": { - "@babel/helper-plugin-utils": "^7.8.0", - "@babel/plugin-syntax-jsx": "^7.8.0" + "@babel/helper-plugin-utils": "^7.8.3", + "@babel/plugin-syntax-jsx": "^7.8.3" } }, "@babel/plugin-transform-regenerator": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.8.0.tgz", - "integrity": "sha512-n88GT8PZuOHWxqxCJORW3g1QaYzQhHu5sEslxYeQkHVoewfnfuWN37t7YGaRLaNUdaZUlRPXhDcLGT7zBa/u0g==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.8.3.tgz", + "integrity": "sha512-qt/kcur/FxrQrzFR432FGZznkVAjiyFtCOANjkAKwCbt465L6ZCiUQh2oMYGU3Wo8LRFJxNDFwWn106S5wVUNA==", "requires": { "regenerator-transform": "^0.14.0" } }, "@babel/plugin-transform-reserved-words": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.8.0.tgz", - "integrity": "sha512-DnshRyDTXZhmAgO2c1QKZI4CfZjoP2t3fSwRsnbCP9P/FSBpf9I7ovnAELswklw5OeY+/D/JIiaGLoUt2II3LA==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.8.3.tgz", + "integrity": "sha512-mwMxcycN3omKFDjDQUl+8zyMsBfjRFr0Zn/64I41pmjv4NJuqcYlEtezwYtw9TFd9WR1vN5kiM+O0gMZzO6L0A==", "requires": { - "@babel/helper-plugin-utils": "^7.8.0" + "@babel/helper-plugin-utils": "^7.8.3" } }, "@babel/plugin-transform-runtime": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.7.4.tgz", - "integrity": "sha512-O8kSkS5fP74Ad/8pfsCMGa8sBRdLxYoSReaARRNSz3FbFQj3z/QUvoUmJ28gn9BO93YfnXc3j+Xyaqe8cKDNBQ==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.8.3.tgz", + "integrity": "sha512-/vqUt5Yh+cgPZXXjmaG9NT8aVfThKk7G4OqkVhrXqwsC5soMn/qTCxs36rZ2QFhpfTJcjw4SNDIZ4RUb8OL4jQ==", "requires": { - "@babel/helper-module-imports": "^7.7.4", - "@babel/helper-plugin-utils": "^7.0.0", + "@babel/helper-module-imports": "^7.8.3", + "@babel/helper-plugin-utils": "^7.8.3", "resolve": "^1.8.1", "semver": "^5.5.1" }, @@ -831,83 +832,83 @@ } }, "@babel/plugin-transform-shorthand-properties": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.8.0.tgz", - "integrity": "sha512-sExhzq63Gl2PMbl7ETpN7Z1A38rLD6GeCT6EEEIIKjTVt9u6dRqJ6nHhaquL7QgR3egj/8fcvq23UvzfPqGAYA==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.8.3.tgz", + "integrity": "sha512-I9DI6Odg0JJwxCHzbzW08ggMdCezoWcuQRz3ptdudgwaHxTjxw5HgdFJmZIkIMlRymL6YiZcped4TTCB0JcC8w==", "requires": { - "@babel/helper-plugin-utils": "^7.8.0" + "@babel/helper-plugin-utils": "^7.8.3" } }, "@babel/plugin-transform-spread": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.8.0.tgz", - "integrity": "sha512-6Zjl0pv6x10YmFVRI0VhwJ/rE++geVHNJ9xwd+UIt3ON2VMRO7qI2lPsyLnzidR5HYNd/JXj47kdU9Rrn4YcnQ==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.8.3.tgz", + "integrity": "sha512-CkuTU9mbmAoFOI1tklFWYYbzX5qCIZVXPVy0jpXgGwkplCndQAa58s2jr66fTeQnA64bDox0HL4U56CFYoyC7g==", "requires": { - "@babel/helper-plugin-utils": "^7.8.0" + "@babel/helper-plugin-utils": "^7.8.3" } }, "@babel/plugin-transform-sticky-regex": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.8.0.tgz", - "integrity": "sha512-uksok0Bqox8YeIRFhr6RRtlBXeGpN1ogiEVjEd7A7rVLPZBXKGbL7kODpE7MQ+avjDLv5EEKtDCeYuWZK7FF7g==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.8.3.tgz", + "integrity": "sha512-9Spq0vGCD5Bb4Z/ZXXSK5wbbLFMG085qd2vhL1JYu1WcQ5bXqZBAYRzU1d+p79GcHs2szYv5pVQCX13QgldaWw==", "requires": { - "@babel/helper-plugin-utils": "^7.8.0", - "@babel/helper-regex": "^7.8.0" + "@babel/helper-plugin-utils": "^7.8.3", + "@babel/helper-regex": "^7.8.3" } }, "@babel/plugin-transform-template-literals": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.8.0.tgz", - "integrity": "sha512-EF7Q7LEgeMpogHcvmHMNXBWdLWG1tpA1ErXH3i8zTu3+UEKo6aBn+FldPAJ16UbbbOwSCUCiDP6oZxvVRPhwnQ==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.8.3.tgz", + "integrity": "sha512-820QBtykIQOLFT8NZOcTRJ1UNuztIELe4p9DCgvj4NK+PwluSJ49we7s9FB1HIGNIYT7wFUJ0ar2QpCDj0escQ==", "requires": { - "@babel/helper-annotate-as-pure": "^7.8.0", - "@babel/helper-plugin-utils": "^7.8.0" + "@babel/helper-annotate-as-pure": "^7.8.3", + "@babel/helper-plugin-utils": "^7.8.3" } }, "@babel/plugin-transform-typeof-symbol": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.8.0.tgz", - "integrity": "sha512-rEUBEFzsA9mCS2r7EtXFlM/6GqtzgLdC4WVYM9fIgJX+HcSJ8oMmj8LinfKhbo0ipRauvUM2teE2iNDNqDwO1g==", + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.8.4.tgz", + "integrity": "sha512-2QKyfjGdvuNfHsb7qnBBlKclbD4CfshH2KvDabiijLMGXPHJXGxtDzwIF7bQP+T0ysw8fYTtxPafgfs/c1Lrqg==", "requires": { - "@babel/helper-plugin-utils": "^7.8.0" + "@babel/helper-plugin-utils": "^7.8.3" } }, "@babel/plugin-transform-typescript": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.8.0.tgz", - "integrity": "sha512-RhMZnNWcyvX+rM6mk888MaeoVl5pGfmYP3as709n4+0d15SRedz4r+LPRg2a9s4z+t+DM+gy8uz/rmM3Cb8JBw==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.8.3.tgz", + "integrity": "sha512-Ebj230AxcrKGZPKIp4g4TdQLrqX95TobLUWKd/CwG7X1XHUH1ZpkpFvXuXqWbtGRWb7uuEWNlrl681wsOArAdQ==", "requires": { - "@babel/helper-create-class-features-plugin": "^7.8.0", - "@babel/helper-plugin-utils": "^7.8.0", - "@babel/plugin-syntax-typescript": "^7.8.0" + "@babel/helper-create-class-features-plugin": "^7.8.3", + "@babel/helper-plugin-utils": "^7.8.3", + "@babel/plugin-syntax-typescript": "^7.8.3" } }, "@babel/plugin-transform-unicode-regex": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.8.0.tgz", - "integrity": "sha512-qDg8wsnE47B/Sj8ZtOndPHrGBxJMssZJ71SzXrItum9n++iVFN7kYuJO+OHhjom7+/or0zzYqvJNzCkUjyNKqg==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.8.3.tgz", + "integrity": "sha512-+ufgJjYdmWfSQ+6NS9VGUR2ns8cjJjYbrbi11mZBTaWm+Fui/ncTLFF28Ei1okavY+xkojGr1eJxNsWYeA5aZw==", "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.8.0", - "@babel/helper-plugin-utils": "^7.8.0" + "@babel/helper-create-regexp-features-plugin": "^7.8.3", + "@babel/helper-plugin-utils": "^7.8.3" } }, "@babel/preset-env": { - "version": "7.8.2", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.8.2.tgz", - "integrity": "sha512-AF2YUl2bGsLWTtFL68upTTB7nDo05aEcKjHmXJE+aXRvsx5K+9yRsHQP3MjnTrLOWe/eFyUr93dfILROsKC4eg==", + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.8.4.tgz", + "integrity": "sha512-HihCgpr45AnSOHRbS5cWNTINs0TwaR8BS8xIIH+QwiW8cKL0llV91njQMpeMReEPVs+1Ao0x3RLEBLtt1hOq4w==", "requires": { - "@babel/compat-data": "^7.8.0", - "@babel/helper-compilation-targets": "^7.8.0", - "@babel/helper-module-imports": "^7.8.0", - "@babel/helper-plugin-utils": "^7.8.0", - "@babel/plugin-proposal-async-generator-functions": "^7.8.0", - "@babel/plugin-proposal-dynamic-import": "^7.8.0", - "@babel/plugin-proposal-json-strings": "^7.8.0", - "@babel/plugin-proposal-nullish-coalescing-operator": "^7.8.0", - "@babel/plugin-proposal-object-rest-spread": "^7.8.0", - "@babel/plugin-proposal-optional-catch-binding": "^7.8.0", - "@babel/plugin-proposal-optional-chaining": "^7.8.0", - "@babel/plugin-proposal-unicode-property-regex": "^7.8.0", + "@babel/compat-data": "^7.8.4", + "@babel/helper-compilation-targets": "^7.8.4", + "@babel/helper-module-imports": "^7.8.3", + "@babel/helper-plugin-utils": "^7.8.3", + "@babel/plugin-proposal-async-generator-functions": "^7.8.3", + "@babel/plugin-proposal-dynamic-import": "^7.8.3", + "@babel/plugin-proposal-json-strings": "^7.8.3", + "@babel/plugin-proposal-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-proposal-object-rest-spread": "^7.8.3", + "@babel/plugin-proposal-optional-catch-binding": "^7.8.3", + "@babel/plugin-proposal-optional-chaining": "^7.8.3", + "@babel/plugin-proposal-unicode-property-regex": "^7.8.3", "@babel/plugin-syntax-async-generators": "^7.8.0", "@babel/plugin-syntax-dynamic-import": "^7.8.0", "@babel/plugin-syntax-json-strings": "^7.8.0", @@ -915,43 +916,43 @@ "@babel/plugin-syntax-object-rest-spread": "^7.8.0", "@babel/plugin-syntax-optional-catch-binding": "^7.8.0", "@babel/plugin-syntax-optional-chaining": "^7.8.0", - "@babel/plugin-syntax-top-level-await": "^7.8.0", - "@babel/plugin-transform-arrow-functions": "^7.8.0", - "@babel/plugin-transform-async-to-generator": "^7.8.0", - "@babel/plugin-transform-block-scoped-functions": "^7.8.0", - "@babel/plugin-transform-block-scoping": "^7.8.0", - "@babel/plugin-transform-classes": "^7.8.0", - "@babel/plugin-transform-computed-properties": "^7.8.0", - "@babel/plugin-transform-destructuring": "^7.8.0", - "@babel/plugin-transform-dotall-regex": "^7.8.0", - "@babel/plugin-transform-duplicate-keys": "^7.8.0", - "@babel/plugin-transform-exponentiation-operator": "^7.8.0", - "@babel/plugin-transform-for-of": "^7.8.0", - "@babel/plugin-transform-function-name": "^7.8.0", - "@babel/plugin-transform-literals": "^7.8.0", - "@babel/plugin-transform-member-expression-literals": "^7.8.0", - "@babel/plugin-transform-modules-amd": "^7.8.0", - "@babel/plugin-transform-modules-commonjs": "^7.8.0", - "@babel/plugin-transform-modules-systemjs": "^7.8.0", - "@babel/plugin-transform-modules-umd": "^7.8.0", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.8.0", - "@babel/plugin-transform-new-target": "^7.8.0", - "@babel/plugin-transform-object-super": "^7.8.0", - "@babel/plugin-transform-parameters": "^7.8.0", - "@babel/plugin-transform-property-literals": "^7.8.0", - "@babel/plugin-transform-regenerator": "^7.8.0", - "@babel/plugin-transform-reserved-words": "^7.8.0", - "@babel/plugin-transform-shorthand-properties": "^7.8.0", - "@babel/plugin-transform-spread": "^7.8.0", - "@babel/plugin-transform-sticky-regex": "^7.8.0", - "@babel/plugin-transform-template-literals": "^7.8.0", - "@babel/plugin-transform-typeof-symbol": "^7.8.0", - "@babel/plugin-transform-unicode-regex": "^7.8.0", - "@babel/types": "^7.8.0", - "browserslist": "^4.8.2", + "@babel/plugin-syntax-top-level-await": "^7.8.3", + "@babel/plugin-transform-arrow-functions": "^7.8.3", + "@babel/plugin-transform-async-to-generator": "^7.8.3", + "@babel/plugin-transform-block-scoped-functions": "^7.8.3", + "@babel/plugin-transform-block-scoping": "^7.8.3", + "@babel/plugin-transform-classes": "^7.8.3", + "@babel/plugin-transform-computed-properties": "^7.8.3", + "@babel/plugin-transform-destructuring": "^7.8.3", + "@babel/plugin-transform-dotall-regex": "^7.8.3", + "@babel/plugin-transform-duplicate-keys": "^7.8.3", + "@babel/plugin-transform-exponentiation-operator": "^7.8.3", + "@babel/plugin-transform-for-of": "^7.8.4", + "@babel/plugin-transform-function-name": "^7.8.3", + "@babel/plugin-transform-literals": "^7.8.3", + "@babel/plugin-transform-member-expression-literals": "^7.8.3", + "@babel/plugin-transform-modules-amd": "^7.8.3", + "@babel/plugin-transform-modules-commonjs": "^7.8.3", + "@babel/plugin-transform-modules-systemjs": "^7.8.3", + "@babel/plugin-transform-modules-umd": "^7.8.3", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.8.3", + "@babel/plugin-transform-new-target": "^7.8.3", + "@babel/plugin-transform-object-super": "^7.8.3", + "@babel/plugin-transform-parameters": "^7.8.4", + "@babel/plugin-transform-property-literals": "^7.8.3", + "@babel/plugin-transform-regenerator": "^7.8.3", + "@babel/plugin-transform-reserved-words": "^7.8.3", + "@babel/plugin-transform-shorthand-properties": "^7.8.3", + "@babel/plugin-transform-spread": "^7.8.3", + "@babel/plugin-transform-sticky-regex": "^7.8.3", + "@babel/plugin-transform-template-literals": "^7.8.3", + "@babel/plugin-transform-typeof-symbol": "^7.8.4", + "@babel/plugin-transform-unicode-regex": "^7.8.3", + "@babel/types": "^7.8.3", + "browserslist": "^4.8.5", "core-js-compat": "^3.6.2", "invariant": "^2.2.2", - "levenary": "^1.1.0", + "levenary": "^1.1.1", "semver": "^5.5.0" }, "dependencies": { @@ -963,24 +964,24 @@ } }, "@babel/preset-react": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.8.0.tgz", - "integrity": "sha512-GP9t18RjtH67ea3DA2k71VqtMnTOupYJx34Z+KUEBRoRxvdETaucmtMWH5uoGHWzAD4qxbuV5ckxpewm39NXkA==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.8.3.tgz", + "integrity": "sha512-9hx0CwZg92jGb7iHYQVgi0tOEHP/kM60CtWJQnmbATSPIQQ2xYzfoCI3EdqAhFBeeJwYMdWQuDUHMsuDbH9hyQ==", "requires": { - "@babel/helper-plugin-utils": "^7.8.0", - "@babel/plugin-transform-react-display-name": "^7.8.0", - "@babel/plugin-transform-react-jsx": "^7.8.0", - "@babel/plugin-transform-react-jsx-self": "^7.8.0", - "@babel/plugin-transform-react-jsx-source": "^7.8.0" + "@babel/helper-plugin-utils": "^7.8.3", + "@babel/plugin-transform-react-display-name": "^7.8.3", + "@babel/plugin-transform-react-jsx": "^7.8.3", + "@babel/plugin-transform-react-jsx-self": "^7.8.3", + "@babel/plugin-transform-react-jsx-source": "^7.8.3" } }, "@babel/preset-typescript": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.7.4.tgz", - "integrity": "sha512-rqrjxfdiHPsnuPur0jKrIIGQCIgoTWMTjlbWE69G4QJ6TIOVnnRnIJhUxNTL/VwDmEAVX08Tq3B1nirer5341w==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.8.3.tgz", + "integrity": "sha512-qee5LgPGui9zQ0jR1TeU5/fP9L+ovoArklEqY12ek8P/wV5ZeM/VYSQYwICeoT6FfpJTekG9Ilay5PhwsOpMHA==", "requires": { - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/plugin-transform-typescript": "^7.7.4" + "@babel/helper-plugin-utils": "^7.8.3", + "@babel/plugin-transform-typescript": "^7.8.3" } }, "@babel/runtime": { @@ -998,52 +999,36 @@ } } }, - "@babel/runtime-corejs3": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.8.0.tgz", - "integrity": "sha512-5XaME/D4hTkUclw4BW+FeDyfUcxN5/Fox/+9UiWUqdyU33zsLxDAE74IexAmLccuHSQyFbIzF5+Yb4E6obVOSg==", - "requires": { - "core-js-pure": "^3.0.0", - "regenerator-runtime": "^0.13.2" - }, - "dependencies": { - "regenerator-runtime": { - "version": "0.13.3", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.3.tgz", - "integrity": "sha512-naKIZz2GQ8JWh///G7L3X6LaQUAMp2lvb1rvwwsURe/VXwD6VMfr+/1NuNw3ag8v2kY1aQ/go5SNn79O9JU7yw==" - } - } - }, "@babel/template": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.8.0.tgz", - "integrity": "sha512-0NNMDsY2t3ltAVVK1WHNiaePo3tXPUeJpCX4I3xSKFoEl852wJHG8mrgHVADf8Lz1y+8al9cF7cSSfzSnFSYiw==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.8.3.tgz", + "integrity": "sha512-04m87AcQgAFdvuoyiQ2kgELr2tV8B4fP/xJAVUL3Yb3bkNdMedD3d0rlSQr3PegP0cms3eHjl1F7PWlvWbU8FQ==", "requires": { - "@babel/code-frame": "^7.8.0", - "@babel/parser": "^7.8.0", - "@babel/types": "^7.8.0" + "@babel/code-frame": "^7.8.3", + "@babel/parser": "^7.8.3", + "@babel/types": "^7.8.3" } }, "@babel/traverse": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.8.0.tgz", - "integrity": "sha512-d/6sPXFLGlJHZO/zWDtgFaKyalCOHLedzxpVJn6el1cw+f2TZa7xZEszeXdOw6EUemqRFBAn106BWBvtSck9Qw==", + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.8.4.tgz", + "integrity": "sha512-NGLJPZwnVEyBPLI+bl9y9aSnxMhsKz42so7ApAv9D+b4vAFPpY013FTS9LdKxcABoIYFU52HcYga1pPlx454mg==", "requires": { - "@babel/code-frame": "^7.8.0", - "@babel/generator": "^7.8.0", - "@babel/helper-function-name": "^7.8.0", - "@babel/helper-split-export-declaration": "^7.8.0", - "@babel/parser": "^7.8.0", - "@babel/types": "^7.8.0", + "@babel/code-frame": "^7.8.3", + "@babel/generator": "^7.8.4", + "@babel/helper-function-name": "^7.8.3", + "@babel/helper-split-export-declaration": "^7.8.3", + "@babel/parser": "^7.8.4", + "@babel/types": "^7.8.3", "debug": "^4.1.0", "globals": "^11.1.0", "lodash": "^4.17.13" } }, "@babel/types": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.0.tgz", - "integrity": "sha512-1RF84ehyx9HH09dMMwGWl3UTWlVoCPtqqJPjGuC4JzMe1ZIVDJ2DT8mv3cPv/A7veLD6sgR7vi95lJqm+ZayIg==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.3.tgz", + "integrity": "sha512-jBD+G8+LWpMBBWvVcdr4QysjUE4mU/syrhN17o1u3gx0/WzJB1kwiVZAXRtWbsIPOwW8pF/YJV5+nmetPzepXg==", "requires": { "esutils": "^2.0.2", "lodash": "^4.17.13", @@ -1051,9 +1036,9 @@ } }, "@cnakazawa/watch": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@cnakazawa/watch/-/watch-1.0.3.tgz", - "integrity": "sha512-r5160ogAvGyHsal38Kux7YYtodEKOj89RGb28ht1jh3SJb08VwRwAKKJL0bGb04Zd/3r9FL3BFIc3bBidYffCA==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@cnakazawa/watch/-/watch-1.0.4.tgz", + "integrity": "sha512-v9kIhKwjeZThiWrLmj0y17CWoyddASLj9O2yvbZkbvw/N3rWOYy9zkV66ursAoVr0mV15bL8g0c4QZUE6cdDoQ==", "requires": { "exec-sh": "^0.3.2", "minimist": "^1.2.0" @@ -1077,24 +1062,24 @@ "integrity": "sha512-ij4wRiunFfaJxjB0BdrYHIH8FxBJpOwNPhhAcunlmPdXudL1WQV1qoP9un6JsEBAgQH+7UXyyjh0g7jTxXK6tg==" }, "@fortawesome/fontawesome-common-types": { - "version": "0.2.26", - "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-common-types/-/fontawesome-common-types-0.2.26.tgz", - "integrity": "sha512-CcM/fIFwZlRdiWG/25xE/wHbtyUuCtqoCTrr6BsWw7hH072fR++n4L56KPydAr3ANgMJMjT8v83ZFIsDc7kE+A==" + "version": "0.2.27", + "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-common-types/-/fontawesome-common-types-0.2.27.tgz", + "integrity": "sha512-97GaByGaXDGMkzcJX7VmR/jRJd8h1mfhtA7RsxDBN61GnWE/PPCZhOdwG/8OZYktiRUF0CvFOr+VgRkJrt6TWg==" }, "@fortawesome/fontawesome-svg-core": { - "version": "1.2.26", - "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-svg-core/-/fontawesome-svg-core-1.2.26.tgz", - "integrity": "sha512-3Dfd/v2IztP1TxKOxZiB5+4kaOZK9mNy0KU1vVK7nFlPWz3gzxrCWB+AloQhQUoJ8HhGqbzjliK89Vl7PExGbw==", + "version": "1.2.27", + "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-svg-core/-/fontawesome-svg-core-1.2.27.tgz", + "integrity": "sha512-sOD3DKynocnHYpuw2sLPnTunDj7rLk91LYhi2axUYwuGe9cPCw7Bsu9EWtVdNJP+IYgTCZIbyARKXuy5K/nv+Q==", "requires": { - "@fortawesome/fontawesome-common-types": "^0.2.26" + "@fortawesome/fontawesome-common-types": "^0.2.27" } }, "@fortawesome/free-solid-svg-icons": { - "version": "5.12.0", - "resolved": "https://registry.npmjs.org/@fortawesome/free-solid-svg-icons/-/free-solid-svg-icons-5.12.0.tgz", - "integrity": "sha512-CnpsWs6GhTs9ekNB3d8rcO5HYqRkXbYKf2YNiAlTWbj5eVlPqsd/XH1F9If8jkcR1aegryAbln/qYeKVZzpM0g==", + "version": "5.12.1", + "resolved": "https://registry.npmjs.org/@fortawesome/free-solid-svg-icons/-/free-solid-svg-icons-5.12.1.tgz", + "integrity": "sha512-k3MwRFFUhyL4cuCJSaHDA0YNYMELDXX0h8JKtWYxO5XD3Dn+maXOMrVAAiNGooUyM2v/wz/TOaM0jxYVKeXX7g==", "requires": { - "@fortawesome/fontawesome-common-types": "^0.2.26" + "@fortawesome/fontawesome-common-types": "^0.2.27" } }, "@fortawesome/react-fontawesome": { @@ -1116,9 +1101,9 @@ "integrity": "sha512-1dVNHT76Uu5N3eJNTYcvxee+jzX4Z9lfciqRRHCU27ihbUcYi+iSc2iml5Ke1LXe1SyJCLA0+14Jh4tXJgOppA==" }, "@hapi/hoek": { - "version": "8.5.0", - "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-8.5.0.tgz", - "integrity": "sha512-7XYT10CZfPsH7j9F1Jmg1+d0ezOux2oM2GfArAzLwWe4mE2Dr3hVjsAL6+TFY49RRJlCdJDMw3nJsLFroTc8Kw==" + "version": "8.5.1", + "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-8.5.1.tgz", + "integrity": "sha512-yN7kbciD87WzLGc5539Tn0sApjyiGHAJgKvG9W8C7O+6c7qmoQMfVs0W4bX17eqz6C78QJqqFrtgdK5EWf6Qow==" }, "@hapi/joi": { "version": "15.1.1", @@ -1325,6 +1310,21 @@ "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-1.1.3.tgz", "integrity": "sha512-shAmDyaQC4H92APFoIaVDHCx5bStIocgvbwQyxPRrbUY20V1EYTbSDchWbuwlMG3V17cprZhA6+78JfB+3DTPw==" }, + "@react-dnd/asap": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@react-dnd/asap/-/asap-4.0.0.tgz", + "integrity": "sha512-0XhqJSc6pPoNnf8DhdsPHtUhRzZALVzYMTzRwV4VI6DJNJ/5xxfL9OQUwb8IH5/2x7lSf7nAZrnzUD+16VyOVQ==" + }, + "@react-dnd/invariant": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@react-dnd/invariant/-/invariant-2.0.0.tgz", + "integrity": "sha512-xL4RCQBCBDJ+GRwKTFhGUW8GXa4yoDfJrPbLblc3U09ciS+9ZJXJ3Qrcs/x2IODOdIE5kQxvMmE2UKyqUictUw==" + }, + "@react-dnd/shallowequal": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@react-dnd/shallowequal/-/shallowequal-2.0.0.tgz", + "integrity": "sha512-Pc/AFTdwZwEKJxFJvlxrSmGe/di+aAOBn60sremrpLo6VI/6cmiUYNNwlI5KNYttg7uypzA3ILPMPgxB2GYZEg==" + }, "@restart/context": { "version": "2.1.4", "resolved": "https://registry.npmjs.org/@restart/context/-/context-2.1.4.tgz", @@ -1450,9 +1450,9 @@ "integrity": "sha512-upIS0Gt9Mc8eEpCbYMZ1K8rhNosfKUtimNcINce+zLwJF5UpM3Vv7yz3S5l/1IX+DxTa8lTkUjqynvjRXyJzsg==" }, "@types/babel__core": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.3.tgz", - "integrity": "sha512-8fBo0UR2CcwWxeX7WIIgJ7lXjasFxoYgRnFHUj+hRvKkpiBJbxhdAPTCY6/ZKM0uxANFVzt4yObSLuTiTnazDA==", + "version": "7.1.4", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.4.tgz", + "integrity": "sha512-c/5MuRz5HM4aizqL5ViYfW4iEnmfPcfbH4Xa6GgLT21dMc1NGeNnuS6egHheOmP+kCJ9CAzC4pv4SDCWTnRkbg==", "requires": { "@babel/parser": "^7.1.0", "@babel/types": "^7.0.0", @@ -1526,9 +1526,9 @@ "integrity": "sha512-hRJD2ahnnpLgsj6KWMYSrmXkM3rm2Dl1qkx6IOFD5FnuNPXJIG5L0dhgKXCYTRMGzU4n0wImQ/xfmRc4POUFlg==" }, "@types/istanbul-lib-report": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-1.1.1.tgz", - "integrity": "sha512-3BUTyMzbZa2DtDI2BkERNC6jJw2Mr2Y0oGI7mRxYNBPxppbtEK1F66u3bKwU2g+wxwWI7PAoRpJnOY1grJqzHg==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", + "integrity": "sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==", "requires": { "@types/istanbul-lib-coverage": "*" } @@ -1553,9 +1553,9 @@ "integrity": "sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA==" }, "@types/node": { - "version": "13.1.6", - "resolved": "https://registry.npmjs.org/@types/node/-/node-13.1.6.tgz", - "integrity": "sha512-Jg1F+bmxcpENHP23sVKkNuU3uaxPnsBMW0cLjleiikFKomJQbsn0Cqk2yDvQArqzZN6ABfBkZ0To7pQ8sLdWDg==" + "version": "13.7.1", + "resolved": "https://registry.npmjs.org/@types/node/-/node-13.7.1.tgz", + "integrity": "sha512-Zq8gcQGmn4txQEJeiXo/KiLpon8TzAl0kmKH4zdWctPj05nWwp1ClMdAVEloqrQKfaC48PNLdgN/aVaLqUrluA==" }, "@types/parse-json": { "version": "4.0.0", @@ -1592,24 +1592,24 @@ "integrity": "sha512-l42BggppR6zLmpfU6fq9HEa2oGPEI8yrSPL3GITjfRInppYFahObbIQOQK3UGxEnyQpltZLaPe75046NOZQikw==" }, "@types/yargs": { - "version": "13.0.5", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-13.0.5.tgz", - "integrity": "sha512-CF/+sxTO7FOwbIRL4wMv0ZYLCRfMid2HQpzDRyViH7kSpfoAFiMdGqKIxb1PxWfjtQXQhnQuD33lvRHNwr809Q==", + "version": "13.0.8", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-13.0.8.tgz", + "integrity": "sha512-XAvHLwG7UQ+8M4caKIH0ZozIOYay5fQkAgyIXegXT9jPtdIGdhga+sUEdAr1CiG46aB+c64xQEYyEzlwWVTNzA==", "requires": { "@types/yargs-parser": "*" } }, "@types/yargs-parser": { - "version": "13.1.0", - "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-13.1.0.tgz", - "integrity": "sha512-gCubfBUZ6KxzoibJ+SCUc/57Ms1jz5NjHe4+dI2krNmU5zCPAphyLJYyTOg06ueIyfj+SaCUqmzun7ImlxDcKg==" + "version": "15.0.0", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-15.0.0.tgz", + "integrity": "sha512-FA/BWv8t8ZWJ+gEOnLLd8ygxH/2UFbAvgEonyfN6yWGLKc7zVjbpl2Y4CTjid9h2RfgPP6SEt6uHwEOply00yw==" }, "@typescript-eslint/eslint-plugin": { - "version": "2.15.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-2.15.0.tgz", - "integrity": "sha512-XRJFznI5v4K1WvIrWmjFjBAdQWaUTz4xJEdqR7+wAFsv6Q9dP3mOlE6BMNT3pdlp9eF1+bC5m5LZTmLMqffCVw==", + "version": "2.20.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-2.20.0.tgz", + "integrity": "sha512-cimIdVDV3MakiGJqMXw51Xci6oEDEoPkvh8ggJe2IIzcc0fYqAxOXN6Vbeanahz6dLZq64W+40iUEc9g32FLDQ==", "requires": { - "@typescript-eslint/experimental-utils": "2.15.0", + "@typescript-eslint/experimental-utils": "2.20.0", "eslint-utils": "^1.4.3", "functional-red-black-tree": "^1.0.1", "regexpp": "^3.0.0", @@ -1617,36 +1617,36 @@ } }, "@typescript-eslint/experimental-utils": { - "version": "2.15.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-2.15.0.tgz", - "integrity": "sha512-Qkxu5zndY5hqlcQkmA88gfLvqQulMpX/TN91XC7OuXsRf4XG5xLGie0sbpX97o/oeccjeZYRMipIsjKk/tjDHA==", + "version": "2.20.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-2.20.0.tgz", + "integrity": "sha512-fEBy9xYrwG9hfBLFEwGW2lKwDRTmYzH3DwTmYbT+SMycmxAoPl0eGretnBFj/s+NfYBG63w/5c3lsvqqz5mYag==", "requires": { "@types/json-schema": "^7.0.3", - "@typescript-eslint/typescript-estree": "2.15.0", + "@typescript-eslint/typescript-estree": "2.20.0", "eslint-scope": "^5.0.0" } }, "@typescript-eslint/parser": { - "version": "2.15.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-2.15.0.tgz", - "integrity": "sha512-6iSgQsqAYTaHw59t0tdjzZJluRAjswdGltzKEdLtcJOxR2UVTPHYvZRqkAVGCkaMVb6Fpa60NnuozNCvsSpA9g==", + "version": "2.20.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-2.20.0.tgz", + "integrity": "sha512-o8qsKaosLh2qhMZiHNtaHKTHyCHc3Triq6aMnwnWj7budm3xAY9owSZzV1uon5T9cWmJRJGzTFa90aex4m77Lw==", "requires": { "@types/eslint-visitor-keys": "^1.0.0", - "@typescript-eslint/experimental-utils": "2.15.0", - "@typescript-eslint/typescript-estree": "2.15.0", + "@typescript-eslint/experimental-utils": "2.20.0", + "@typescript-eslint/typescript-estree": "2.20.0", "eslint-visitor-keys": "^1.1.0" } }, "@typescript-eslint/typescript-estree": { - "version": "2.15.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-2.15.0.tgz", - "integrity": "sha512-L6Pog+w3VZzXkAdyqA0VlwybF8WcwZX+mufso86CMxSdWmcizJ38lgBdpqTbc9bo92iyi0rOvmATKiwl+amjxg==", + "version": "2.20.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-2.20.0.tgz", + "integrity": "sha512-WlFk8QtI8pPaE7JGQGxU7nGcnk1ccKAJkhbVookv94ZcAef3m6oCE/jEDL6dGte3JcD7reKrA0o55XhBRiVT3A==", "requires": { "debug": "^4.1.1", "eslint-visitor-keys": "^1.1.0", "glob": "^7.1.6", "is-glob": "^4.0.1", - "lodash.unescape": "4.0.1", + "lodash": "^4.17.15", "semver": "^6.3.0", "tsutils": "^3.17.1" } @@ -2080,6 +2080,15 @@ "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=" }, + "array.prototype.flat": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.2.3.tgz", + "integrity": "sha512-gBlRZV0VSmfPIeWfuuy56XZMvbVfbEUnOXUvt3F/eUUUSyzlgLxhEX4YAEpxNAogRGehPSnfXyPtYyKAhkzQhQ==", + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.0-next.1" + } + }, "arrify": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", @@ -2176,16 +2185,16 @@ "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==" }, "autoprefixer": { - "version": "9.7.3", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-9.7.3.tgz", - "integrity": "sha512-8T5Y1C5Iyj6PgkPSFd0ODvK9DIleuPKUPYniNxybS47g2k2wFgLZ46lGQHlBuGKIAEV8fbCDfKCCRS1tvOgc3Q==", + "version": "9.7.4", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-9.7.4.tgz", + "integrity": "sha512-g0Ya30YrMBAEZk60lp+qfX5YQllG+S5W3GYCFvyHTvhOki0AEQJLPEcIuGRsqVwLi8FvXPVtwTGhfr38hVpm0g==", "requires": { - "browserslist": "^4.8.0", - "caniuse-lite": "^1.0.30001012", + "browserslist": "^4.8.3", + "caniuse-lite": "^1.0.30001020", "chalk": "^2.4.2", "normalize-range": "^0.1.2", "num2fraction": "^1.2.2", - "postcss": "^7.0.23", + "postcss": "^7.0.26", "postcss-value-parser": "^4.0.2" } }, @@ -2200,13 +2209,9 @@ "integrity": "sha512-Uvq6hVe90D0B2WEnUqtdgY1bATGz3mw33nH9Y+dmA+w5DHvUmBgkr5rM/KCHpCsiFNRUfokW/szpPPgMK2hm4A==" }, "axobject-query": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-2.1.1.tgz", - "integrity": "sha512-lF98xa/yvy6j3fBHAgQXIYl+J4eZadOSqsPojemUqClzNbBV38wWGpUbQbVEyf4eUF5yF7eHmGgGA2JiHyjeqw==", - "requires": { - "@babel/runtime": "^7.7.4", - "@babel/runtime-corejs3": "^7.7.4" - } + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-2.1.2.tgz", + "integrity": "sha512-ICt34ZmrVt8UQnvPl6TVyDTkmhXmAyAT4Jh5ugfGUX4MOrZ+U/ZY6/sdylRw3qGNr9Ub5AJsaHeDMzNLehRdOQ==" }, "babel-code-frame": { "version": "6.26.0", @@ -2341,9 +2346,9 @@ } }, "babel-plugin-macros": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-2.7.1.tgz", - "integrity": "sha512-HNM284amlKSQ6FddI4jLXD+XTqF0cTYOe5uemOIZxHJHnamC+OhFQ57rMF9sgnYhkJQptVl9U1SKVZsV9/GLQQ==", + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-2.8.0.tgz", + "integrity": "sha512-SEP5kJpfGYqYKpBrj5XU3ahw5p5GOHJ0U5ssOSQ/WBVdwkD2Dzlce95exQTs3jOVWPPKLBN2rlEWkCK7dSmLvg==", "requires": { "@babel/runtime": "^7.7.2", "cosmiconfig": "^6.0.0", @@ -2395,9 +2400,9 @@ } }, "babel-plugin-named-asset-import": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/babel-plugin-named-asset-import/-/babel-plugin-named-asset-import-0.3.5.tgz", - "integrity": "sha512-sGhfINU+AuMw9oFAdIn/nD5sem3pn/WgxAfDZ//Q3CnF+5uaho7C7shh2rKLk6sKE/XkfmyibghocwKdVjLIKg==" + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/babel-plugin-named-asset-import/-/babel-plugin-named-asset-import-0.3.6.tgz", + "integrity": "sha512-1aGDUfL1qOOIoqk9QKGIo2lANk+C7ko/fqH0uIyC71x3PEGz0uVP8ISgfEsFuG+FKmjHTvFK/nNM8dowpmUxLA==" }, "babel-plugin-syntax-object-rest-spread": { "version": "6.13.0", @@ -2428,156 +2433,29 @@ } }, "babel-preset-react-app": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/babel-preset-react-app/-/babel-preset-react-app-9.1.0.tgz", - "integrity": "sha512-0qMOv/pCcCQWxX1eNyKD9GlzZTdzZIK/Pq3O6TGe65tZSJTSplw1pFlaPujm0GjBj4g3GeCQbP08vvzlH7OGHg==", + "version": "9.1.1", + "resolved": "https://registry.npmjs.org/babel-preset-react-app/-/babel-preset-react-app-9.1.1.tgz", + "integrity": "sha512-YkWP2UwY//TLltNlEBRngDOrYhvSLb+CA330G7T9M5UhGEMWe+JK/8IXJc5p2fDTSfSiETf+PY0+PYXFMix81Q==", "requires": { - "@babel/core": "7.7.4", - "@babel/plugin-proposal-class-properties": "7.7.4", - "@babel/plugin-proposal-decorators": "7.7.4", - "@babel/plugin-proposal-nullish-coalescing-operator": "7.7.4", - "@babel/plugin-proposal-numeric-separator": "7.7.4", - "@babel/plugin-proposal-object-rest-spread": "7.7.4", - "@babel/plugin-proposal-optional-chaining": "7.7.4", - "@babel/plugin-syntax-dynamic-import": "7.7.4", - "@babel/plugin-transform-destructuring": "7.7.4", - "@babel/plugin-transform-flow-strip-types": "7.7.4", - "@babel/plugin-transform-react-display-name": "7.7.4", - "@babel/plugin-transform-runtime": "7.7.4", - "@babel/preset-env": "7.7.4", - "@babel/preset-react": "7.7.4", - "@babel/preset-typescript": "7.7.4", - "@babel/runtime": "7.7.4", - "babel-plugin-dynamic-import-node": "2.3.0", - "babel-plugin-macros": "2.7.1", + "@babel/core": "7.8.4", + "@babel/plugin-proposal-class-properties": "7.8.3", + "@babel/plugin-proposal-decorators": "7.8.3", + "@babel/plugin-proposal-numeric-separator": "7.8.3", + "@babel/plugin-transform-flow-strip-types": "7.8.3", + "@babel/plugin-transform-react-display-name": "7.8.3", + "@babel/plugin-transform-runtime": "7.8.3", + "@babel/preset-env": "7.8.4", + "@babel/preset-react": "7.8.3", + "@babel/preset-typescript": "7.8.3", + "@babel/runtime": "7.8.4", + "babel-plugin-macros": "2.8.0", "babel-plugin-transform-react-remove-prop-types": "0.4.24" }, "dependencies": { - "@babel/plugin-proposal-nullish-coalescing-operator": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.7.4.tgz", - "integrity": "sha512-TbYHmr1Gl1UC7Vo2HVuj/Naci5BEGNZ0AJhzqD2Vpr6QPFWpUmBRLrIDjedzx7/CShq0bRDS2gI4FIs77VHLVQ==", - "requires": { - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.7.4" - } - }, - "@babel/plugin-proposal-object-rest-spread": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.7.4.tgz", - "integrity": "sha512-rnpnZR3/iWKmiQyJ3LKJpSwLDcX/nSXhdLk4Aq/tXOApIvyu7qoabrige0ylsAJffaUC51WiBu209Q0U+86OWQ==", - "requires": { - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/plugin-syntax-object-rest-spread": "^7.7.4" - } - }, - "@babel/plugin-proposal-optional-chaining": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.7.4.tgz", - "integrity": "sha512-JmgaS+ygAWDR/STPe3/7y0lNlHgS+19qZ9aC06nYLwQ/XB7c0q5Xs+ksFU3EDnp9EiEsO0dnRAOKeyLHTZuW3A==", - "requires": { - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/plugin-syntax-optional-chaining": "^7.7.4" - } - }, - "@babel/plugin-syntax-dynamic-import": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.7.4.tgz", - "integrity": "sha512-jHQW0vbRGvwQNgyVxwDh4yuXu4bH1f5/EICJLAhl1SblLs2CDhrsmCk+v5XLdE9wxtAFRyxx+P//Iw+a5L/tTg==", - "requires": { - "@babel/helper-plugin-utils": "^7.0.0" - } - }, - "@babel/plugin-transform-destructuring": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.7.4.tgz", - "integrity": "sha512-4jFMXI1Cu2aXbcXXl8Lr6YubCn6Oc7k9lLsu8v61TZh+1jny2BWmdtvY9zSUlLdGUvcy9DMAWyZEOqjsbeg/wA==", - "requires": { - "@babel/helper-plugin-utils": "^7.0.0" - } - }, - "@babel/plugin-transform-react-display-name": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.7.4.tgz", - "integrity": "sha512-sBbIvqYkthai0X0vkD2xsAwluBp+LtNHH+/V4a5ydifmTtb8KOVOlrMIk/MYmIc4uTYDnjZUHQildYNo36SRJw==", - "requires": { - "@babel/helper-plugin-utils": "^7.0.0" - } - }, - "@babel/preset-env": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.7.4.tgz", - "integrity": "sha512-Dg+ciGJjwvC1NIe/DGblMbcGq1HOtKbw8RLl4nIjlfcILKEOkWT/vRqPpumswABEBVudii6dnVwrBtzD7ibm4g==", - "requires": { - "@babel/helper-module-imports": "^7.7.4", - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/plugin-proposal-async-generator-functions": "^7.7.4", - "@babel/plugin-proposal-dynamic-import": "^7.7.4", - "@babel/plugin-proposal-json-strings": "^7.7.4", - "@babel/plugin-proposal-object-rest-spread": "^7.7.4", - "@babel/plugin-proposal-optional-catch-binding": "^7.7.4", - "@babel/plugin-proposal-unicode-property-regex": "^7.7.4", - "@babel/plugin-syntax-async-generators": "^7.7.4", - "@babel/plugin-syntax-dynamic-import": "^7.7.4", - "@babel/plugin-syntax-json-strings": "^7.7.4", - "@babel/plugin-syntax-object-rest-spread": "^7.7.4", - "@babel/plugin-syntax-optional-catch-binding": "^7.7.4", - "@babel/plugin-syntax-top-level-await": "^7.7.4", - "@babel/plugin-transform-arrow-functions": "^7.7.4", - "@babel/plugin-transform-async-to-generator": "^7.7.4", - "@babel/plugin-transform-block-scoped-functions": "^7.7.4", - "@babel/plugin-transform-block-scoping": "^7.7.4", - "@babel/plugin-transform-classes": "^7.7.4", - "@babel/plugin-transform-computed-properties": "^7.7.4", - "@babel/plugin-transform-destructuring": "^7.7.4", - "@babel/plugin-transform-dotall-regex": "^7.7.4", - "@babel/plugin-transform-duplicate-keys": "^7.7.4", - "@babel/plugin-transform-exponentiation-operator": "^7.7.4", - "@babel/plugin-transform-for-of": "^7.7.4", - "@babel/plugin-transform-function-name": "^7.7.4", - "@babel/plugin-transform-literals": "^7.7.4", - "@babel/plugin-transform-member-expression-literals": "^7.7.4", - "@babel/plugin-transform-modules-amd": "^7.7.4", - "@babel/plugin-transform-modules-commonjs": "^7.7.4", - "@babel/plugin-transform-modules-systemjs": "^7.7.4", - "@babel/plugin-transform-modules-umd": "^7.7.4", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.7.4", - "@babel/plugin-transform-new-target": "^7.7.4", - "@babel/plugin-transform-object-super": "^7.7.4", - "@babel/plugin-transform-parameters": "^7.7.4", - "@babel/plugin-transform-property-literals": "^7.7.4", - "@babel/plugin-transform-regenerator": "^7.7.4", - "@babel/plugin-transform-reserved-words": "^7.7.4", - "@babel/plugin-transform-shorthand-properties": "^7.7.4", - "@babel/plugin-transform-spread": "^7.7.4", - "@babel/plugin-transform-sticky-regex": "^7.7.4", - "@babel/plugin-transform-template-literals": "^7.7.4", - "@babel/plugin-transform-typeof-symbol": "^7.7.4", - "@babel/plugin-transform-unicode-regex": "^7.7.4", - "@babel/types": "^7.7.4", - "browserslist": "^4.6.0", - "core-js-compat": "^3.1.1", - "invariant": "^2.2.2", - "js-levenshtein": "^1.1.3", - "semver": "^5.5.0" - } - }, - "@babel/preset-react": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.7.4.tgz", - "integrity": "sha512-j+vZtg0/8pQr1H8wKoaJyGL2IEk3rG/GIvua7Sec7meXVIvGycihlGMx5xcU00kqCJbwzHs18xTu3YfREOqQ+g==", - "requires": { - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/plugin-transform-react-display-name": "^7.7.4", - "@babel/plugin-transform-react-jsx": "^7.7.4", - "@babel/plugin-transform-react-jsx-self": "^7.7.4", - "@babel/plugin-transform-react-jsx-source": "^7.7.4" - } - }, "@babel/runtime": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.7.4.tgz", - "integrity": "sha512-r24eVUUr0QqNZa+qrImUk8fn5SPhHq+IfYvIoIMg0do3GdK9sMdiLKP3GYVVaxpPKORgm8KRKaNTEhAjgIpLMw==", + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.8.4.tgz", + "integrity": "sha512-neAp3zt80trRVBI1x0azq6c57aNBqYZH8KhMm3TaB7wEI5Q4A2SHfBHE8w9gOhI/lrqxtEbXZgQIrHP+wvSGwQ==", "requires": { "regenerator-runtime": "^0.13.2" } @@ -2586,11 +2464,6 @@ "version": "0.13.3", "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.3.tgz", "integrity": "sha512-naKIZz2GQ8JWh///G7L3X6LaQUAMp2lvb1rvwwsURe/VXwD6VMfr+/1NuNw3ag8v2kY1aQ/go5SNn79O9JU7yw==" - }, - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" } } }, @@ -2662,9 +2535,9 @@ } }, "kind-of": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", - "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==" + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==" } } }, @@ -2697,9 +2570,9 @@ "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==" }, "binary-extensions": { - "version": "1.13.1", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", - "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==" + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.0.0.tgz", + "integrity": "sha512-Phlt0plgpIIBOGTT/ehfFnbNlfsDEiqmzE2KRXoX1bLIlir4X/MR+zSyBEkL05ffWgnRSf/DXv+WrUAVr93/ow==" }, "bindings": { "version": "1.5.0", @@ -2920,13 +2793,13 @@ } }, "browserslist": { - "version": "4.8.3", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.8.3.tgz", - "integrity": "sha512-iU43cMMknxG1ClEZ2MDKeonKE1CCrFVkQK2AqO2YWFmvIrx4JWrvQ4w4hQez6EpVI8rHTtqh/ruHHDHSOKxvUg==", + "version": "4.8.7", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.8.7.tgz", + "integrity": "sha512-gFOnZNYBHrEyUML0xr5NJ6edFaaKbTFX9S9kQHlYfCP0Rit/boRIz4G+Avq6/4haEKJXdGGUnoolx+5MWW2BoA==", "requires": { - "caniuse-lite": "^1.0.30001017", - "electron-to-chromium": "^1.3.322", - "node-releases": "^1.1.44" + "caniuse-lite": "^1.0.30001027", + "electron-to-chromium": "^1.3.349", + "node-releases": "^1.1.49" } }, "bser": { @@ -3091,9 +2964,9 @@ } }, "caniuse-lite": { - "version": "1.0.30001020", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001020.tgz", - "integrity": "sha512-yWIvwA68wRHKanAVS1GjN8vajAv7MBFshullKCeq/eKpK7pJBVDgFFEqvgWTkcP2+wIDeQGYFRXECjKZnLkUjA==" + "version": "1.0.30001028", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001028.tgz", + "integrity": "sha512-Vnrq+XMSHpT7E+LWoIYhs3Sne8h9lx9YJV3acH3THNCwU/9zV93/ta4xVfzTtnqd3rvnuVpVjE3DFqf56tr3aQ==" }, "capture-exit": { "version": "2.0.0", @@ -3104,9 +2977,9 @@ } }, "case-sensitive-paths-webpack-plugin": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/case-sensitive-paths-webpack-plugin/-/case-sensitive-paths-webpack-plugin-2.2.0.tgz", - "integrity": "sha512-u5ElzokS8A1pm9vM3/iDgTcI3xqHxuCao94Oz8etI3cf0Tio0p8izkDYbTIn09uP3yUUr6+veaE6IkjnTYS46g==" + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/case-sensitive-paths-webpack-plugin/-/case-sensitive-paths-webpack-plugin-2.3.0.tgz", + "integrity": "sha512-/4YgnZS8y1UXXmC02xD5rRrBEu6T5ub+mQHLNRj0fzTRbgdBYhsNo2V5EqwgqrExjxsjtF/OpAKAMkKsxbD5XQ==" }, "caseless": { "version": "0.12.0", @@ -3149,544 +3022,69 @@ "dev": true }, "chokidar": { - "version": "2.1.8", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", - "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==", + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.3.1.tgz", + "integrity": "sha512-4QYCEWOcK3OJrxwvyyAOxFuhpvOVCYkr33LPfFNBjAD/w3sEzWsp2BUOkI4l9bHvWioAd0rc6NlHUOEaWkTeqg==", "requires": { - "anymatch": "^2.0.0", - "async-each": "^1.0.1", - "braces": "^2.3.2", - "fsevents": "^1.2.7", - "glob-parent": "^3.1.0", - "inherits": "^2.0.3", - "is-binary-path": "^1.0.0", - "is-glob": "^4.0.0", - "normalize-path": "^3.0.0", - "path-is-absolute": "^1.0.0", - "readdirp": "^2.2.1", - "upath": "^1.1.1" + "anymatch": "~3.1.1", + "braces": "~3.0.2", + "fsevents": "~2.1.2", + "glob-parent": "~5.1.0", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.3.0" }, "dependencies": { - "fsevents": { - "version": "1.2.11", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.11.tgz", - "integrity": "sha512-+ux3lx6peh0BpvY0JebGyZoiR4D+oYzdPZMKJwkZ+sFkNJzpL7tXc/wehS49gUAxg3tmMHPHZkA8JU2rhhgDHw==", - "optional": true, + "anymatch": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz", + "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==", "requires": { - "bindings": "^1.5.0", - "nan": "^2.12.1", - "node-pre-gyp": "*" - }, - "dependencies": { - "abbrev": { - "version": "1.1.1", - "bundled": true, - "optional": true - }, - "ansi-regex": { - "version": "2.1.1", - "bundled": true, - "optional": true - }, - "aproba": { - "version": "1.2.0", - "bundled": true, - "optional": true - }, - "are-we-there-yet": { - "version": "1.1.5", - "bundled": true, - "optional": true, - "requires": { - "delegates": "^1.0.0", - "readable-stream": "^2.0.6" - } - }, - "balanced-match": { - "version": "1.0.0", - "bundled": true, - "optional": true - }, - "brace-expansion": { - "version": "1.1.11", - "bundled": true, - "optional": true, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "chownr": { - "version": "1.1.3", - "bundled": true, - "optional": true - }, - "code-point-at": { - "version": "1.1.0", - "bundled": true, - "optional": true - }, - "concat-map": { - "version": "0.0.1", - "bundled": true, - "optional": true - }, - "console-control-strings": { - "version": "1.1.0", - "bundled": true, - "optional": true - }, - "core-util-is": { - "version": "1.0.2", - "bundled": true, - "optional": true - }, - "debug": { - "version": "3.2.6", - "bundled": true, - "optional": true, - "requires": { - "ms": "^2.1.1" - } - }, - "deep-extend": { - "version": "0.6.0", - "bundled": true, - "optional": true - }, - "delegates": { - "version": "1.0.0", - "bundled": true, - "optional": true - }, - "detect-libc": { - "version": "1.0.3", - "bundled": true, - "optional": true - }, - "fs-minipass": { - "version": "1.2.7", - "bundled": true, - "optional": true, - "requires": { - "minipass": "^2.6.0" - } - }, - "fs.realpath": { - "version": "1.0.0", - "bundled": true, - "optional": true - }, - "gauge": { - "version": "2.7.4", - "bundled": true, - "optional": true, - "requires": { - "aproba": "^1.0.3", - "console-control-strings": "^1.0.0", - "has-unicode": "^2.0.0", - "object-assign": "^4.1.0", - "signal-exit": "^3.0.0", - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1", - "wide-align": "^1.1.0" - } - }, - "glob": { - "version": "7.1.6", - "bundled": true, - "optional": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "has-unicode": { - "version": "2.0.1", - "bundled": true, - "optional": true - }, - "iconv-lite": { - "version": "0.4.24", - "bundled": true, - "optional": true, - "requires": { - "safer-buffer": ">= 2.1.2 < 3" - } - }, - "ignore-walk": { - "version": "3.0.3", - "bundled": true, - "optional": true, - "requires": { - "minimatch": "^3.0.4" - } - }, - "inflight": { - "version": "1.0.6", - "bundled": true, - "optional": true, - "requires": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "inherits": { - "version": "2.0.4", - "bundled": true, - "optional": true - }, - "ini": { - "version": "1.3.5", - "bundled": true, - "optional": true - }, - "is-fullwidth-code-point": { - "version": "1.0.0", - "bundled": true, - "optional": true, - "requires": { - "number-is-nan": "^1.0.0" - } - }, - "isarray": { - "version": "1.0.0", - "bundled": true, - "optional": true - }, - "minimatch": { - "version": "3.0.4", - "bundled": true, - "optional": true, - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "minimist": { - "version": "0.0.8", - "bundled": true, - "optional": true - }, - "minipass": { - "version": "2.9.0", - "bundled": true, - "optional": true, - "requires": { - "safe-buffer": "^5.1.2", - "yallist": "^3.0.0" - } - }, - "minizlib": { - "version": "1.3.3", - "bundled": true, - "optional": true, - "requires": { - "minipass": "^2.9.0" - } - }, - "mkdirp": { - "version": "0.5.1", - "bundled": true, - "optional": true, - "requires": { - "minimist": "0.0.8" - } - }, - "ms": { - "version": "2.1.2", - "bundled": true, - "optional": true - }, - "needle": { - "version": "2.4.0", - "bundled": true, - "optional": true, - "requires": { - "debug": "^3.2.6", - "iconv-lite": "^0.4.4", - "sax": "^1.2.4" - } - }, - "node-pre-gyp": { - "version": "0.14.0", - "bundled": true, - "optional": true, - "requires": { - "detect-libc": "^1.0.2", - "mkdirp": "^0.5.1", - "needle": "^2.2.1", - "nopt": "^4.0.1", - "npm-packlist": "^1.1.6", - "npmlog": "^4.0.2", - "rc": "^1.2.7", - "rimraf": "^2.6.1", - "semver": "^5.3.0", - "tar": "^4.4.2" - } - }, - "nopt": { - "version": "4.0.1", - "bundled": true, - "optional": true, - "requires": { - "abbrev": "1", - "osenv": "^0.1.4" - } - }, - "npm-bundled": { - "version": "1.1.1", - "bundled": true, - "optional": true, - "requires": { - "npm-normalize-package-bin": "^1.0.1" - } - }, - "npm-normalize-package-bin": { - "version": "1.0.1", - "bundled": true, - "optional": true - }, - "npm-packlist": { - "version": "1.4.7", - "bundled": true, - "optional": true, - "requires": { - "ignore-walk": "^3.0.1", - "npm-bundled": "^1.0.1" - } - }, - "npmlog": { - "version": "4.1.2", - "bundled": true, - "optional": true, - "requires": { - "are-we-there-yet": "~1.1.2", - "console-control-strings": "~1.1.0", - "gauge": "~2.7.3", - "set-blocking": "~2.0.0" - } - }, - "number-is-nan": { - "version": "1.0.1", - "bundled": true, - "optional": true - }, - "object-assign": { - "version": "4.1.1", - "bundled": true, - "optional": true - }, - "once": { - "version": "1.4.0", - "bundled": true, - "optional": true, - "requires": { - "wrappy": "1" - } - }, - "os-homedir": { - "version": "1.0.2", - "bundled": true, - "optional": true - }, - "os-tmpdir": { - "version": "1.0.2", - "bundled": true, - "optional": true - }, - "osenv": { - "version": "0.1.5", - "bundled": true, - "optional": true, - "requires": { - "os-homedir": "^1.0.0", - "os-tmpdir": "^1.0.0" - } - }, - "path-is-absolute": { - "version": "1.0.1", - "bundled": true, - "optional": true - }, - "process-nextick-args": { - "version": "2.0.1", - "bundled": true, - "optional": true - }, - "rc": { - "version": "1.2.8", - "bundled": true, - "optional": true, - "requires": { - "deep-extend": "^0.6.0", - "ini": "~1.3.0", - "minimist": "^1.2.0", - "strip-json-comments": "~2.0.1" - }, - "dependencies": { - "minimist": { - "version": "1.2.0", - "bundled": true, - "optional": true - } - } - }, - "readable-stream": { - "version": "2.3.6", - "bundled": true, - "optional": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "rimraf": { - "version": "2.7.1", - "bundled": true, - "optional": true, - "requires": { - "glob": "^7.1.3" - } - }, - "safe-buffer": { - "version": "5.1.2", - "bundled": true, - "optional": true - }, - "safer-buffer": { - "version": "2.1.2", - "bundled": true, - "optional": true - }, - "sax": { - "version": "1.2.4", - "bundled": true, - "optional": true - }, - "semver": { - "version": "5.7.1", - "bundled": true, - "optional": true - }, - "set-blocking": { - "version": "2.0.0", - "bundled": true, - "optional": true - }, - "signal-exit": { - "version": "3.0.2", - "bundled": true, - "optional": true - }, - "string-width": { - "version": "1.0.2", - "bundled": true, - "optional": true, - "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" - } - }, - "string_decoder": { - "version": "1.1.1", - "bundled": true, - "optional": true, - "requires": { - "safe-buffer": "~5.1.0" - } - }, - "strip-ansi": { - "version": "3.0.1", - "bundled": true, - "optional": true, - "requires": { - "ansi-regex": "^2.0.0" - } - }, - "strip-json-comments": { - "version": "2.0.1", - "bundled": true, - "optional": true - }, - "tar": { - "version": "4.4.13", - "bundled": true, - "optional": true, - "requires": { - "chownr": "^1.1.1", - "fs-minipass": "^1.2.5", - "minipass": "^2.8.6", - "minizlib": "^1.2.1", - "mkdirp": "^0.5.0", - "safe-buffer": "^5.1.2", - "yallist": "^3.0.3" - } - }, - "util-deprecate": { - "version": "1.0.2", - "bundled": true, - "optional": true - }, - "wide-align": { - "version": "1.1.3", - "bundled": true, - "optional": true, - "requires": { - "string-width": "^1.0.2 || 2" - } - }, - "wrappy": { - "version": "1.0.2", - "bundled": true, - "optional": true - }, - "yallist": { - "version": "3.1.1", - "bundled": true, - "optional": true - } + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" } }, - "glob-parent": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", - "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", "requires": { - "is-glob": "^3.1.0", - "path-dirname": "^1.0.0" - }, - "dependencies": { - "is-glob": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", - "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", - "requires": { - "is-extglob": "^2.1.0" - } - } + "fill-range": "^7.0.1" } }, + "fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "requires": { + "to-regex-range": "^5.0.1" + } + }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" + }, "normalize-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==" + }, + "to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "requires": { + "is-number": "^7.0.0" + } } } }, "chownr": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.3.tgz", - "integrity": "sha512-i70fVHhmV3DtTl6nqvZOnIjbY0Pe4kAUjwHj8z0zAdgBtYrJyYwLKCCuRBQ5ppkyL0AkN7HKRnETdmdp1zqNXw==" + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", + "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==" }, "chrome-trace-event": { "version": "1.0.2", @@ -3737,9 +3135,9 @@ "integrity": "sha512-JR/iSQOSt+LQIWwrwEzJ9uk0xfN3mTVYMwt1Ir5mUcSN6pU+V4zQFFaJsclJbPuAUQH+yfWef6tm7l1quW3C8Q==" }, "clean-css": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-4.2.1.tgz", - "integrity": "sha512-4ZxI6dy4lrY6FHzfiy1aEOXgu4LIsW2MhwG0VBKdcoGoH/XLFgaHSdLTGr4O8Be6A8r3MOphEiI8Gc1n0ecf3g==", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-4.2.3.tgz", + "integrity": "sha512-VcMWDN54ZN/DS+g58HYL5/n4Zrqe8vHJpGA8KdgUXFU4fuP/aHNw8eld9SyEIyabIMJX/0RaY/fplOo5hYLSFA==", "requires": { "source-map": "~0.6.0" } @@ -4063,9 +3461,9 @@ "integrity": "sha512-HOpZf6eXmnl7la+cUdMnLvUxKNqLUzJvgIziQ0DiF3JwSImNphIqdGqzj6hIKyX04MmV0poclQ7+wjWvxQyR2A==" }, "core-js-compat": { - "version": "3.6.3", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.6.3.tgz", - "integrity": "sha512-Y3YNGU3bU1yrnzVodop23ghArbKv4IqkZg9MMOWv/h7KT6NRk1/SzHhWDDlubg2+tlcUzAqgj1/GyeJ9fUKMeg==", + "version": "3.6.4", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.6.4.tgz", + "integrity": "sha512-zAa3IZPvsJ0slViBQ2z+vgyyTuhd3MFn1rBQjZSKVEgB0UMYhUkCj9jJUVPgGTGqWvsBVmfnruXgTcNyTlEiSA==", "requires": { "browserslist": "^4.8.3", "semver": "7.0.0" @@ -4078,11 +3476,6 @@ } } }, - "core-js-pure": { - "version": "3.6.3", - "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.6.3.tgz", - "integrity": "sha512-4LhJ4fw0sC4/8X5krM9hI5oQ3cgYHYojWwwWnQKjC6k6vf/qIVS9d0r3+Bdn+FUADgRpD0xzPFQ9P7cOeuIwlA==" - }, "core-util-is": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", @@ -4133,16 +3526,6 @@ "sha.js": "^2.4.8" } }, - "create-react-class": { - "version": "15.6.3", - "resolved": "https://registry.npmjs.org/create-react-class/-/create-react-class-15.6.3.tgz", - "integrity": "sha512-M+/3Q6E6DLO6Yx3OwrWjwHBnvfXXYA7W+dFjt/ZDBemHO1DDZhsalX/NUtnTYclN6GfnBDRh4qRHjcDHmlJBJg==", - "requires": { - "fbjs": "^0.8.9", - "loose-envify": "^1.3.1", - "object-assign": "^4.1.1" - } - }, "cross-spawn": { "version": "6.0.5", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", @@ -4249,22 +3632,22 @@ } }, "css-loader": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-3.2.0.tgz", - "integrity": "sha512-QTF3Ud5H7DaZotgdcJjGMvyDj5F3Pn1j/sC6VBEOVp94cbwqyIBdcs/quzj4MC1BKQSrTpQznegH/5giYbhnCQ==", + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-3.4.2.tgz", + "integrity": "sha512-jYq4zdZT0oS0Iykt+fqnzVLRIeiPWhka+7BqPn+oSIpWJAHak5tmB/WZrJ2a21JhCeFyNnnlroSl8c+MtVndzA==", "requires": { "camelcase": "^5.3.1", "cssesc": "^3.0.0", "icss-utils": "^4.1.1", "loader-utils": "^1.2.3", "normalize-path": "^3.0.0", - "postcss": "^7.0.17", + "postcss": "^7.0.23", "postcss-modules-extract-imports": "^2.0.0", "postcss-modules-local-by-default": "^3.0.2", - "postcss-modules-scope": "^2.1.0", + "postcss-modules-scope": "^2.1.1", "postcss-modules-values": "^3.0.0", - "postcss-value-parser": "^4.0.0", - "schema-utils": "^2.0.0" + "postcss-value-parser": "^4.0.2", + "schema-utils": "^2.6.0" }, "dependencies": { "normalize-path": { @@ -4307,11 +3690,6 @@ "source-map": "^0.6.1" } }, - "css-unit-converter": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/css-unit-converter/-/css-unit-converter-1.1.1.tgz", - "integrity": "sha1-2bkoGtz9jO2TW9urqDeGiX9k6ZY=" - }, "css-what": { "version": "3.2.1", "resolved": "https://registry.npmjs.org/css-what/-/css-what-3.2.1.tgz", @@ -4532,9 +3910,9 @@ } }, "damerau-levenshtein": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.5.tgz", - "integrity": "sha512-CBCRqFnpu715iPmw1KrdOrzRqbdFwQTwAWyyyYS42+iAgHCuXZ+/TdMgQkUENPomxEz9z1BEzuQU2Xw0kUuAgA==" + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.6.tgz", + "integrity": "sha512-JVrozIeElnj3QzfUIt8tB8YMluBJom4Vw9qTPpjGYQ9fYlB3D/rb6OordUxf3xeFB35LKWs0xqcO5U6ySvBtug==" }, "dashdash": { "version": "1.14.1", @@ -4664,9 +4042,9 @@ } }, "kind-of": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", - "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==" + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==" } } }, @@ -4923,11 +4301,11 @@ } }, "dot-prop": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-4.2.0.tgz", - "integrity": "sha512-tUMXrxlExSW6U2EXiiKGSBVdYgtV8qlHL+C10TsW4PURY/ic+eaysnSkwB4kA/mBlCyy/IKDJ+Lc3wbWeaXtuQ==", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.2.0.tgz", + "integrity": "sha512-uEUyaDKoSQ1M4Oq8l45hSE26SnTxL6snNnqvK/VWx5wJhmff5z0FUVJDKDanor/6w3kzE3i7XZOk+7wC0EXr1A==", "requires": { - "is-obj": "^1.0.0" + "is-obj": "^2.0.0" } }, "dotenv": { @@ -4971,9 +4349,9 @@ "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" }, "electron-to-chromium": { - "version": "1.3.332", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.332.tgz", - "integrity": "sha512-AP2HkLhfSOIxP7gDjlyZ4ywGWIcxRMZoU9+JriuVkQe2pSLDdWBsE6+eI6BQOqun1dohLrUTOPHsQLLhhFA7Eg==" + "version": "1.3.354", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.354.tgz", + "integrity": "sha512-24YMkNiZWOUeF6YeoscWfIGP0oMx+lJpU/miwI+lcu7plIDpyZn8Gx0lx0qTDlzGoz7hx+lpyD8QkbkX5L2Pqw==" }, "elliptic": { "version": "6.5.2", @@ -5063,9 +4441,9 @@ } }, "es-abstract": { - "version": "1.17.0", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.0.tgz", - "integrity": "sha512-yYkE07YF+6SIBmg1MsJ9dlub5L48Ek7X0qz+c/CPCHS9EBXfESorzng4cJQjJW5/pB6vDF41u7F8vUhLVDqIug==", + "version": "1.17.4", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.4.tgz", + "integrity": "sha512-Ae3um/gb8F0mui/jPL+QiqmglkUsaQf7FwBEHYIFkztkneosu9imhqHpBzQ3h1vit8t5iQ74t6PEVvphBZiuiQ==", "requires": { "es-to-primitive": "^1.2.1", "function-bind": "^1.1.1", @@ -5135,22 +4513,15 @@ "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" }, "escodegen": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.12.1.tgz", - "integrity": "sha512-Q8t2YZ+0e0pc7NRVj3B4tSQ9rim1oi4Fh46k2xhJ2qOiEwhQfdjyEQddWdj7ZFaKmU+5104vn1qrcjEPWq+bgQ==", + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.14.1.tgz", + "integrity": "sha512-Bmt7NcRySdIfNPfU2ZoXDrrXsG9ZjvDxcAlMfDUgRBjLOWTuIACXPBFJH7Z+cLb40JeQco5toikyc9t9P8E9SQ==", "requires": { - "esprima": "^3.1.3", + "esprima": "^4.0.1", "estraverse": "^4.2.0", "esutils": "^2.0.2", "optionator": "^0.8.1", "source-map": "~0.6.1" - }, - "dependencies": { - "esprima": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-3.1.3.tgz", - "integrity": "sha1-/cpRzuYTOJXjyI1TXOSdv/YqRjM=" - } } }, "eslint": { @@ -5227,9 +4598,9 @@ } }, "eslint-config-react-app": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/eslint-config-react-app/-/eslint-config-react-app-5.1.0.tgz", - "integrity": "sha512-hBaxisHC6HXRVvxX+/t1n8mOdmCVIKgkXsf2WoUkJi7upHJTwYTsdCmx01QPOjKNT34QMQQ9sL0tVBlbiMFjxA==", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/eslint-config-react-app/-/eslint-config-react-app-5.2.0.tgz", + "integrity": "sha512-WrHjoGpKr1kLLiWDD81tme9jMM0hk5cMxasLSdyno6DdPt+IfLOrDJBVo6jN7tn4y1nzhs43TmUaZWO6Sf0blw==", "requires": { "confusing-browser-globals": "^1.0.9" } @@ -5257,9 +4628,9 @@ "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" }, "resolve": { - "version": "1.14.2", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.14.2.tgz", - "integrity": "sha512-EjlOBLBO1kxsUxsKjLt7TAECyKW6fOh1VRkykQkKGzcBbjjPIxBqGh0jf7GJ3k/f5mxMqW3htMD3WdTUVtW8HQ==", + "version": "1.15.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.15.1.tgz", + "integrity": "sha512-84oo6ZTtoTUpjgNEr5SJyzQhzL72gaRodsSfyxC/AXRvwu0Yse9H8eF9IpGo7b8YetZhlI6v7ZQ6bKBFV/6S7w==", "requires": { "path-parse": "^1.0.6" } @@ -5267,15 +4638,15 @@ } }, "eslint-loader": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/eslint-loader/-/eslint-loader-3.0.2.tgz", - "integrity": "sha512-S5VnD+UpVY1PyYRqeBd/4pgsmkvSokbHqTXAQMpvCyRr3XN2tvSLo9spm2nEpqQqh9dezw3os/0zWihLeOg2Rw==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/eslint-loader/-/eslint-loader-3.0.3.tgz", + "integrity": "sha512-+YRqB95PnNvxNp1HEjQmvf9KNvCin5HXYYseOXVC2U0KEcw4IkQ2IQEBG46j7+gW39bMzeu0GsUhVbBY3Votpw==", "requires": { "fs-extra": "^8.1.0", "loader-fs-cache": "^1.0.2", "loader-utils": "^1.2.3", - "object-hash": "^1.3.1", - "schema-utils": "^2.2.0" + "object-hash": "^2.0.1", + "schema-utils": "^2.6.1" } }, "eslint-module-utils": { @@ -5349,29 +4720,30 @@ } }, "eslint-plugin-flowtype": { - "version": "3.13.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-flowtype/-/eslint-plugin-flowtype-3.13.0.tgz", - "integrity": "sha512-bhewp36P+t7cEV0b6OdmoRWJCBYRiHFlqPZAG1oS3SF+Y0LQkeDvFSM4oxoxvczD1OdONCXMlJfQFiWLcV9urw==", + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-flowtype/-/eslint-plugin-flowtype-4.6.0.tgz", + "integrity": "sha512-W5hLjpFfZyZsXfo5anlu7HM970JBDqbEshAJUkeczP6BFCIfJXuiIBQXyberLRtOStT0OGPF8efeTbxlHk4LpQ==", "requires": { "lodash": "^4.17.15" } }, "eslint-plugin-import": { - "version": "2.18.2", - "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.18.2.tgz", - "integrity": "sha512-5ohpsHAiUBRNaBWAF08izwUGlbrJoJJ+W9/TBwsGoR1MnlgfwMIKrFeSjWbt6moabiXW9xNvtFz+97KHRfI4HQ==", + "version": "2.20.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.20.0.tgz", + "integrity": "sha512-NK42oA0mUc8Ngn4kONOPsPB1XhbUvNHqF+g307dPV28aknPoiNnKLFd9em4nkswwepdF5ouieqv5Th/63U7YJQ==", "requires": { "array-includes": "^3.0.3", + "array.prototype.flat": "^1.2.1", "contains-path": "^0.1.0", "debug": "^2.6.9", "doctrine": "1.5.0", "eslint-import-resolver-node": "^0.3.2", - "eslint-module-utils": "^2.4.0", + "eslint-module-utils": "^2.4.1", "has": "^1.0.3", "minimatch": "^3.0.4", "object.values": "^1.1.0", "read-pkg-up": "^2.0.0", - "resolve": "^1.11.0" + "resolve": "^1.12.0" }, "dependencies": { "debug": { @@ -5511,19 +4883,19 @@ } }, "eslint-plugin-react": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.16.0.tgz", - "integrity": "sha512-GacBAATewhhptbK3/vTP09CbFrgUJmBSaaRcWdbQLFvUZy9yVcQxigBNHGPU/KE2AyHpzj3AWXpxoMTsIDiHug==", + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.18.0.tgz", + "integrity": "sha512-p+PGoGeV4SaZRDsXqdj9OWcOrOpZn8gXoGPcIQTzo2IDMbAKhNDnME9myZWqO3Ic4R3YmwAZ1lDjWl2R2hMUVQ==", "requires": { - "array-includes": "^3.0.3", + "array-includes": "^3.1.1", "doctrine": "^2.1.0", "has": "^1.0.3", - "jsx-ast-utils": "^2.2.1", - "object.entries": "^1.1.0", - "object.fromentries": "^2.0.0", - "object.values": "^1.1.0", + "jsx-ast-utils": "^2.2.3", + "object.entries": "^1.1.1", + "object.fromentries": "^2.0.2", + "object.values": "^1.1.1", "prop-types": "^15.7.2", - "resolve": "^1.12.0" + "resolve": "^1.14.2" }, "dependencies": { "doctrine": { @@ -5533,6 +4905,14 @@ "requires": { "esutils": "^2.0.2" } + }, + "resolve": { + "version": "1.15.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.15.1.tgz", + "integrity": "sha512-84oo6ZTtoTUpjgNEr5SJyzQhzL72gaRodsSfyxC/AXRvwu0Yse9H8eF9IpGo7b8YetZhlI6v7ZQ6bKBFV/6S7w==", + "requires": { + "path-parse": "^1.0.6" + } } } }, @@ -5579,9 +4959,9 @@ "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==" }, "esquery": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.0.1.tgz", - "integrity": "sha512-SmiyZ5zIWH9VM+SRUReLS5Q8a7GxtRdxEBVZpm98rJM7Sb+A9DVCndXfkeFUd3byderg+EbDkfnevfCwynWaNA==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.1.0.tgz", + "integrity": "sha512-MxYW9xKmROWF672KqjO75sszsA8Mxhw06YFeS5VHlB98KDHbOSurm3ArsjO60Eaf3QmGMCP1yn+0JQkNLo/97Q==", "requires": { "estraverse": "^4.0.0" } @@ -5892,9 +5272,9 @@ } }, "kind-of": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", - "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==" + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==" } } }, @@ -6021,9 +5401,9 @@ "integrity": "sha512-vNKxJHTEKNThjfrdJwHc7brvM6eVevuO5nTj6ez8ZQ1qbXTvGthucRF7S4vf2cr71QVnT70V34v0S1DyQsti0w==" }, "figures": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-3.1.0.tgz", - "integrity": "sha512-ravh8VRXqHuMvZt/d8GblBeqDMkdJMBdv/2KntFH+ra5MXkO7nxNKpzQ3n6QD/2da1kH0aWmNISdvhM7gl2gVg==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", + "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", "requires": { "escape-string-regexp": "^1.0.5" } @@ -6057,9 +5437,9 @@ "optional": true }, "filesize": { - "version": "3.6.1", - "resolved": "https://registry.npmjs.org/filesize/-/filesize-3.6.1.tgz", - "integrity": "sha512-7KjR1vv6qnicaPMi1iiTcI85CyYwRO/PSFCu6SvqL8jN2Wjt/NIYQTFtFs7fSDCYOstUkEWIQGFUg5YZQfjlcg==" + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/filesize/-/filesize-6.0.1.tgz", + "integrity": "sha512-u4AYWPgbI5GBhs6id1KdImZWn5yfyFrrQ8OWZdN7ZMfA8Bf4HcO0BGo9bmUIEV8yrp8I1xVfJ/dn90GtFNNJcg==" }, "fill-range": { "version": "4.0.0", @@ -6168,9 +5548,9 @@ } }, "follow-redirects": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.9.0.tgz", - "integrity": "sha512-CRcPzsSIbXyVDl0QI01muNDu69S8trU4jArW9LpOt2WtC6LyUJetcIrmfHsRBx7/Jb6GHJUiuqyYxPooFfNt6A==", + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.10.0.tgz", + "integrity": "sha512-4eyLK6s6lH32nOvLLwlIOnr9zrL8Sm+OvW4pVTJNoXeGzYIkHVf+pADQi+OJ0E67hiuSLezPVPyBcIZO50TmmQ==", "requires": { "debug": "^3.0.0" }, @@ -6204,13 +5584,13 @@ "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=" }, "fork-ts-checker-webpack-plugin": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-3.1.0.tgz", - "integrity": "sha512-6OkRfjuNMNqb14f01xokcWcKV5Ekknc2FvziNpcTYru+kxIYFA2MtuuBI19MHThZnjSBhoi35Dcq+I0oUkFjmQ==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-3.1.1.tgz", + "integrity": "sha512-DuVkPNrM12jR41KM2e+N+styka0EgLkTnXmNcXdgOM37vtGeY+oCBK/Jx0hzSeEU6memFCtWb4htrHPMDfwwUQ==", "requires": { "babel-code-frame": "^6.22.0", "chalk": "^2.4.1", - "chokidar": "^2.0.4", + "chokidar": "^3.3.0", "micromatch": "^3.1.10", "minimatch": "^3.0.4", "semver": "^5.6.0", @@ -6292,9 +5672,9 @@ } }, "fs-minipass": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.0.0.tgz", - "integrity": "sha512-40Qz+LFXmd9tzYVnnBmZvFfvAADfUA14TXPK1s7IfElJTIZ97rA8w4Kin7Wt5JBrC3ShnnFJO/5vPjPEeJIq9A==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", + "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", "requires": { "minipass": "^3.0.0" } @@ -6411,6 +5791,11 @@ "globule": "^1.0.0" } }, + "gensync": { + "version": "1.0.0-beta.1", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.1.tgz", + "integrity": "sha512-r8EC6NO1sngH/zdD9fiRDLdcgnbayXah+mLgManTaIZJqEC1MZstmnox8KpnI2/fxQwrp5OpCOYWLp4rBl4Jcg==" + }, "get-caller-file": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", @@ -6498,9 +5883,9 @@ }, "dependencies": { "kind-of": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", - "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==" + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==" } } }, @@ -6536,12 +5921,12 @@ } }, "globule": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/globule/-/globule-1.3.0.tgz", - "integrity": "sha512-YlD4kdMqRCQHrhVdonet4TdRtv1/sZKepvoxNT4Nrhrp5HI8XFfc8kFlGlBn2myBo80aGp8Eft259mbcUJhgSg==", + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/globule/-/globule-1.3.1.tgz", + "integrity": "sha512-OVyWOHgw29yosRHCHo7NncwR1hW5ew0W/UrvtwvjefVJeQ26q4/8r8FmPsSF1hJ93IgWkyv16pCTz6WblMzm/g==", "requires": { "glob": "~7.1.1", - "lodash": "~4.17.10", + "lodash": "~4.17.12", "minimatch": "~3.0.2" } }, @@ -6582,9 +5967,9 @@ "integrity": "sha512-d4sze1JNC454Wdo2fkuyzCr6aHcbL6PGGuFAz0Li/NcOm1tCHGnWDRmJP85dh9IhQErTc2svWFEX5xHIOo//kQ==" }, "handlebars": { - "version": "4.7.1", - "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.1.tgz", - "integrity": "sha512-2dd6soo60cwKNJ90VewNLIzdZPR/E2YhszOTgHpN9V0YuwZk7x33/iZoIBnASwDFVHMY7iJ6NPL8d9f/DWYCTA==", + "version": "4.7.3", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.3.tgz", + "integrity": "sha512-SRGwSYuNfx8DwHD/6InAPzD6RgeruWLT+B8e8a7gGs8FWgHzlExpTFMEq2IA6QpAfOClpKHy6+8IqTjeBCu6Kg==", "requires": { "neo-async": "^2.6.0", "optimist": "^0.6.1", @@ -6786,54 +6171,49 @@ "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.0.tgz", "integrity": "sha512-a4u9BeERWGu/S8JiWEAQcdrg9v4QArtP9keViQjGMdff20fBdd8waotXaNmODqBe6uZ3Nafi7K/ho4gCQHV3Ig==" }, - "html-minifier": { - "version": "3.5.21", - "resolved": "https://registry.npmjs.org/html-minifier/-/html-minifier-3.5.21.tgz", - "integrity": "sha512-LKUKwuJDhxNa3uf/LPR/KVjm/l3rBqtYeCOAekvG8F1vItxMUpueGd94i/asDDr8/1u7InxzFA5EeGjhhG5mMA==", + "html-minifier-terser": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/html-minifier-terser/-/html-minifier-terser-5.0.3.tgz", + "integrity": "sha512-It4No3H1V3Dhd/O0MePFdo0oX/M6u6YZTMw4My/010mT6vxdbqge7+0RoxGAmeSbKok6gjYZoP0p4rpZ2+J2yw==", "requires": { - "camel-case": "3.0.x", - "clean-css": "4.2.x", - "commander": "2.17.x", - "he": "1.2.x", - "param-case": "2.1.x", - "relateurl": "0.2.x", - "uglify-js": "3.4.x" + "camel-case": "^3.0.0", + "clean-css": "^4.2.1", + "commander": "^4.0.0", + "he": "^1.2.0", + "param-case": "^2.1.1", + "relateurl": "^0.2.7", + "terser": "^4.3.9" }, "dependencies": { "commander": { - "version": "2.17.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.17.1.tgz", - "integrity": "sha512-wPMUt6FnH2yzG95SA6mzjQOEKUU3aLaDEmzs1ti+1E9h+CsrZghRlqEM/EJ4KscsQVG8uNN4uVreUeT8+drlgg==" - }, - "uglify-js": { - "version": "3.4.10", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.4.10.tgz", - "integrity": "sha512-Y2VsbPVs0FIshJztycsO2SfPk7/KAF/T72qzv9u5EpQ4kB2hQoHlhNQTsNyy6ul7lQtqJN/AoWeS23OzEiEFxw==", - "requires": { - "commander": "~2.19.0", - "source-map": "~0.6.1" - }, - "dependencies": { - "commander": { - "version": "2.19.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.19.0.tgz", - "integrity": "sha512-6tvAOO+D6OENvRAh524Dh9jcfKTYDQAqvqezbCW82xj5X0pSrcpxtvRKHLG0yBY6SD7PSDrJaj+0AiOcKVd1Xg==" - } - } + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", + "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==" } } }, "html-webpack-plugin": { - "version": "4.0.0-beta.5", - "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-4.0.0-beta.5.tgz", - "integrity": "sha512-y5l4lGxOW3pz3xBTFdfB9rnnrWRPVxlAhX6nrBYIcW+2k2zC3mSp/3DxlWVCMBfnO6UAnoF8OcFn0IMy6kaKAQ==", + "version": "4.0.0-beta.11", + "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-4.0.0-beta.11.tgz", + "integrity": "sha512-4Xzepf0qWxf8CGg7/WQM5qBB2Lc/NFI7MhU59eUDTkuQp3skZczH4UA1d6oQyDEIoMDgERVhRyTdtUPZ5s5HBg==", "requires": { - "html-minifier": "^3.5.20", - "loader-utils": "^1.1.0", - "lodash": "^4.17.11", + "html-minifier-terser": "^5.0.1", + "loader-utils": "^1.2.3", + "lodash": "^4.17.15", "pretty-error": "^2.1.1", - "tapable": "^1.1.0", + "tapable": "^1.1.3", "util.promisify": "1.0.0" + }, + "dependencies": { + "util.promisify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.0.tgz", + "integrity": "sha512-i+6qA2MPhvoKLuxnJNpXAGhg7HphQOSUq2LKMZD0m15EiskXUkMvKdF4Uui0WYeCUGea+o2cw/ZuwehtfsrNkA==", + "requires": { + "define-properties": "^1.1.2", + "object.getownpropertydescriptors": "^2.0.3" + } + } } }, "htmlparser2": { @@ -6855,9 +6235,9 @@ "integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==" }, "readable-stream": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.4.0.tgz", - "integrity": "sha512-jItXPLmrSR8jmTRmRWJXCnGJsfy85mB3Wd/uINMXA65yrnFo0cPClFIUWzo2najVNSl+mx7/4W8ttlLWJe99pQ==", + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", "requires": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", @@ -7064,9 +6444,9 @@ "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==" }, "inquirer": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-7.0.3.tgz", - "integrity": "sha512-+OiOVeVydu4hnCGLCSX+wedovR/Yzskv9BFqUNNKq9uU2qg7LCcCo3R86S2E7WLo0y/x2pnEZfZe1CoYnORUAw==", + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-7.0.4.tgz", + "integrity": "sha512-Bu5Td5+j11sCkqfqmUTiwv+tWisMtP0L7Q8WrqA2C/BbBhy1YTdFrvjjlrKq8oagA/tLQBski2Gcx/Sqyi2qSQ==", "requires": { "ansi-escapes": "^4.2.1", "chalk": "^2.4.2", @@ -7144,11 +6524,11 @@ "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=" }, "is-binary-path": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", - "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", "requires": { - "binary-extensions": "^1.0.0" + "binary-extensions": "^2.0.0" } }, "is-buffer": { @@ -7217,6 +6597,11 @@ "resolved": "https://registry.npmjs.org/is-directory/-/is-directory-0.3.1.tgz", "integrity": "sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE=" }, + "is-docker": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.0.0.tgz", + "integrity": "sha512-pJEdRugimx4fBMra5z2/5iRdZ63OhYV0vr0Dwm5+xtW4D1FvRkB8hamMIhnWfyJeDdyr/aa7BDyNbtG38VxgoQ==" + }, "is-extendable": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", @@ -7228,12 +6613,9 @@ "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=" }, "is-finite": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz", - "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=", - "requires": { - "number-is-nan": "^1.0.0" - } + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.1.0.tgz", + "integrity": "sha512-cdyMtqX/BOqqNBBiKlIVkytNHm49MtMlYyn1zxzvJKWmFMlGzm+ry5BBfYyeY9YmNKbRSo/o7OX9w9ale0wg3w==" }, "is-fullwidth-code-point": { "version": "3.0.0", @@ -7262,9 +6644,9 @@ } }, "is-obj": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", - "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=" + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", + "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==" }, "is-path-cwd": { "version": "2.2.0", @@ -7572,13 +6954,16 @@ } }, "jest-environment-jsdom-fourteen": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/jest-environment-jsdom-fourteen/-/jest-environment-jsdom-fourteen-0.1.0.tgz", - "integrity": "sha512-4vtoRMg7jAstitRzL4nbw83VmGH8Rs13wrND3Ud2o1fczDhMUF32iIrNKwYGgeOPUdfvZU4oy8Bbv+ni1fgVCA==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/jest-environment-jsdom-fourteen/-/jest-environment-jsdom-fourteen-1.0.1.tgz", + "integrity": "sha512-DojMX1sY+at5Ep+O9yME34CdidZnO3/zfPh8UW+918C5fIZET5vCjfkegixmsi7AtdYfkr4bPlIzmWnlvQkP7Q==", "requires": { - "jest-mock": "^24.5.0", - "jest-util": "^24.5.0", - "jsdom": "^14.0.0" + "@jest/environment": "^24.3.0", + "@jest/fake-timers": "^24.3.0", + "@jest/types": "^24.3.0", + "jest-mock": "^24.0.0", + "jest-util": "^24.0.0", + "jsdom": "^14.1.0" }, "dependencies": { "acorn": { @@ -8466,14 +7851,9 @@ "integrity": "sha512-36+AdBzCL+y6qjw5Tx7HgzeGCzC81MDDgaUP8ld2zhx58HdqXGoBd+tHdrBMiyjGQs0Hxs/MLZTu/eHNJJuWPw==" }, "js-base64": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-2.5.1.tgz", - "integrity": "sha512-M7kLczedRMYX4L8Mdh4MzyAMM9O5osx+4FcOQuTvr3A9F2D9S5JXheN0ewNbrvK2UatkTRhL5ejGmGSjNMiZuw==" - }, - "js-levenshtein": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/js-levenshtein/-/js-levenshtein-1.1.6.tgz", - "integrity": "sha512-X2BB11YZtrRqY4EnQcLX5Rh373zbK4alC1FW7D7MBhL2gtcC17cTnr6DmfHZeS0s2rTHjUTMMHfG7gO8SSdw+g==" + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-2.5.2.tgz", + "integrity": "sha512-Vg8czh0Q7sFBSUMWWArX/miJeBWYBPpdU/3M/DKSaekLMqrqVPaedp+5mZhie/r0lgrcaYBfwXatEew6gwgiQQ==" }, "js-tokens": { "version": "4.0.0", @@ -8692,9 +8072,9 @@ "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==" }, "levenary": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/levenary/-/levenary-1.1.0.tgz", - "integrity": "sha512-VHcwhO0UTpUW7rLPN2/OiWJdgA1e9BqEDALhrgCe/F+uUJnep6CoUsTzMeP8Rh0NGr9uKquXxqe7lwLZo509nQ==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/levenary/-/levenary-1.1.1.tgz", + "integrity": "sha512-mkAdOIt79FD6irqjYSs4rdbnlT5vRonMEvBVPVb3XmevfS8kgRXwfes0dhPdEtzTWD/1eNE/Bm/G1iRt6DcnQQ==", "requires": { "leven": "^3.1.0" } @@ -8878,20 +8258,15 @@ "resolved": "https://registry.npmjs.org/lodash.throttle/-/lodash.throttle-4.1.1.tgz", "integrity": "sha1-wj6RtxAkKscMN/HhzaknTMOb8vQ=" }, - "lodash.unescape": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/lodash.unescape/-/lodash.unescape-4.0.1.tgz", - "integrity": "sha1-vyJJiGzlFM2hEvrpIYzcBlIR/Jw=" - }, "lodash.uniq": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", "integrity": "sha1-0CJTc662Uq3BvILklFM5qEJ1R3M=" }, "loglevel": { - "version": "1.6.6", - "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.6.6.tgz", - "integrity": "sha512-Sgr5lbboAUBo3eXCSPL4/KoVz3ROKquOjcctxmHIt+vol2DrqTQe3SwkKKuYhEiWB5kYa13YyopJ69deJ1irzQ==" + "version": "1.6.7", + "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.6.7.tgz", + "integrity": "sha512-cY2eLFrQSAfVPhCgH1s7JI73tMbg9YC3v3+ZHVW67sBS7UxWzNEk/ZBbSfLykBWHp33dqqtOv82gjhKEi81T/A==" }, "loose-envify": { "version": "1.4.0", @@ -9188,9 +8563,9 @@ }, "dependencies": { "kind-of": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", - "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==" + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==" } } }, @@ -9237,9 +8612,9 @@ } }, "mini-css-extract-plugin": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-0.8.0.tgz", - "integrity": "sha512-MNpRGbNA52q6U92i0qbVpQNsgk7LExy41MdAlG84FeytfDOtRIf/mCHdEgG8rpTKOaNKiqUnZdlptF469hxqOw==", + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-0.9.0.tgz", + "integrity": "sha512-lp3GeY7ygcgAmVIcRPBVhIkf8Us7FZjA+ILpal44qLdSu11wmjKQ3d9k15lfD7pO4esu9eUIAW7qiYIBppv40A==", "requires": { "loader-utils": "^1.1.0", "normalize-url": "1.9.1", @@ -9442,9 +8817,9 @@ }, "dependencies": { "kind-of": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", - "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==" + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==" } } }, @@ -9601,17 +8976,17 @@ } }, "node-releases": { - "version": "1.1.45", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.45.tgz", - "integrity": "sha512-cXvGSfhITKI8qsV116u2FTzH5EWZJfgG7d4cpqwF8I8+1tWpD6AsvvGRKq2onR0DNj1jfqsjkXZsm14JMS7Cyg==", + "version": "1.1.49", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.49.tgz", + "integrity": "sha512-xH8t0LS0disN0mtRCh+eByxFPie+msJUBL/lJDBuap53QGiYPa9joh83K4pCZgWJ+2L4b9h88vCVdXQ60NO2bg==", "requires": { "semver": "^6.3.0" } }, "node-sass": { - "version": "4.13.0", - "resolved": "https://registry.npmjs.org/node-sass/-/node-sass-4.13.0.tgz", - "integrity": "sha512-W1XBrvoJ1dy7VsvTAS5q1V45lREbTlZQqFbiHb3R3OTTCma0XBtuG6xZ6Z4506nR4lmHPTqVRwxT6KgtWC97CA==", + "version": "4.13.1", + "resolved": "https://registry.npmjs.org/node-sass/-/node-sass-4.13.1.tgz", + "integrity": "sha512-TTWFx+ZhyDx1Biiez2nB0L3YrCZ/8oHagaDalbuBSlqXgUPsdkUSzJsVxeDO9LtPB49+Fh3WQl3slABo6AotNw==", "requires": { "async-foreach": "^0.1.3", "chalk": "^1.1.1", @@ -9815,9 +9190,9 @@ } }, "object-hash": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-1.3.1.tgz", - "integrity": "sha512-OSuu/pU4ENM9kmREg0BdNrUDIl1heYa4mBZacJc+vVWz4GtAwu7jO8s4AIt2aGRUTqxykpWzI3Oqnsm13tTMDA==" + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-2.0.3.tgz", + "integrity": "sha512-JPKn0GMu+Fa3zt3Bmr66JhokJU5BaNBIh4ZeTlaCBzrBsOeXzwcKKAK1tbLiPKgvwmPXsDvvLHoWh5Bm7ofIYg==" }, "object-inspect": { "version": "1.7.0", @@ -9943,11 +9318,12 @@ } }, "open": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/open/-/open-7.0.0.tgz", - "integrity": "sha512-K6EKzYqnwQzk+/dzJAQSBORub3xlBTxMz+ntpZpH/LyCa1o6KjXhuN+2npAaI9jaSmU3R1Q8NWf4KUWcyytGsQ==", + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/open/-/open-7.0.2.tgz", + "integrity": "sha512-70E/pFTPr7nZ9nLDPNTcj3IVqnNvKuP4VsBmoKV9YGTnChe0mlS3C4qM7qKarhZ8rGaHKLfo+vBTHXDp6ZSyLQ==", "requires": { - "is-wsl": "^2.1.0" + "is-docker": "^2.0.0", + "is-wsl": "^2.1.1" }, "dependencies": { "is-wsl": { @@ -10259,6 +9635,11 @@ "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=" }, + "picomatch": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.1.tgz", + "integrity": "sha512-ISBaA8xQNmwELC7eOjqFKMESB2VIqt4PPDD0nsS95b/9dZXvVKOlz9keMSnoGGKcOHXfTvDD6WMaRoSc9UuhRA==" + }, "pify": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", @@ -10294,51 +9675,11 @@ } }, "pkg-up": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-2.0.0.tgz", - "integrity": "sha1-yBmscoBZpGHKscOImivjxJoATX8=", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-3.1.0.tgz", + "integrity": "sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA==", "requires": { - "find-up": "^2.1.0" - }, - "dependencies": { - "find-up": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", - "requires": { - "locate-path": "^2.0.0" - } - }, - "locate-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", - "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", - "requires": { - "p-locate": "^2.0.0", - "path-exists": "^3.0.0" - } - }, - "p-limit": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", - "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", - "requires": { - "p-try": "^1.0.0" - } - }, - "p-locate": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", - "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", - "requires": { - "p-limit": "^1.1.0" - } - }, - "p-try": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", - "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=" - } + "find-up": "^3.0.0" } }, "pn": { @@ -10347,9 +9688,9 @@ "integrity": "sha512-2qHaIQr2VLRFoxe2nASzsV6ef4yOOH+Fi9FBOVH6cqeSgUnoyySPZkxzLuzd+RYOQTRpROA0ztTMqxROKSb/nA==" }, "pnp-webpack-plugin": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/pnp-webpack-plugin/-/pnp-webpack-plugin-1.5.0.tgz", - "integrity": "sha512-jd9olUr9D7do+RN8Wspzhpxhgp1n6Vd0NtQ4SFkmIACZoEL1nkyAdW9Ygrinjec0vgDcWjscFQQ1gDW8rsfKTg==", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/pnp-webpack-plugin/-/pnp-webpack-plugin-1.6.0.tgz", + "integrity": "sha512-ZcMGn/xF/fCOq+9kWMP9vVVxjIkMCja72oy3lziR7UHy0hHFZ57iVpQ71OtveVbmzeCmphBg8pxNdk/hlK99aQ==", "requires": { "ts-pnp": "^1.1.2" } @@ -10385,9 +9726,9 @@ "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=" }, "postcss": { - "version": "7.0.26", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.26.tgz", - "integrity": "sha512-IY4oRjpXWYshuTDFxMVkJDtWIk2LhsTlu8bZnbEJA4+bYT16Lvpo8Qv6EvDumhYRgzjZl489pmsY3qVgJQ08nA==", + "version": "7.0.27", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", + "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", "requires": { "chalk": "^2.4.2", "source-map": "^0.6.1", @@ -10405,29 +9746,12 @@ } }, "postcss-attribute-case-insensitive": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-attribute-case-insensitive/-/postcss-attribute-case-insensitive-4.0.1.tgz", - "integrity": "sha512-L2YKB3vF4PetdTIthQVeT+7YiSzMoNMLLYxPXXppOOP7NoazEAy45sh2LvJ8leCQjfBcfkYQs8TtCcQjeZTp8A==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-attribute-case-insensitive/-/postcss-attribute-case-insensitive-4.0.2.tgz", + "integrity": "sha512-clkFxk/9pcdb4Vkn0hAHq3YnxBQ2p0CGD1dy24jN+reBck+EWxMbxSUqN4Yj7t0w8csl87K6p0gxBe1utkJsYA==", "requires": { "postcss": "^7.0.2", - "postcss-selector-parser": "^5.0.0" - }, - "dependencies": { - "cssesc": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-2.0.0.tgz", - "integrity": "sha512-MsCAG1z9lPdoO/IUMLSBWBSVxVtJ1395VGIQ+Fc2gNdkQ1hNDnQdw3YhA71WJCBW1vdwA0cAnk/DnW6bqoEUYg==" - }, - "postcss-selector-parser": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-5.0.0.tgz", - "integrity": "sha512-w+zLE5Jhg6Liz8+rQOWEAwtwkyqpfnmsinXjXg6cY7YIONZZtgvE0v2O0uhQBs0peNomOJwWRKt6JBfTdTd3OQ==", - "requires": { - "cssesc": "^2.0.0", - "indexes-of": "^1.0.1", - "uniq": "^1.0.1" - } - } + "postcss-selector-parser": "^6.0.2" } }, "postcss-browser-comments": { @@ -10439,36 +9763,13 @@ } }, "postcss-calc": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-7.0.1.tgz", - "integrity": "sha512-oXqx0m6tb4N3JGdmeMSc/i91KppbYsFZKdH0xMOqK8V1rJlzrKlTdokz8ozUXLVejydRN6u2IddxpcijRj2FqQ==", + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-7.0.2.tgz", + "integrity": "sha512-rofZFHUg6ZIrvRwPeFktv06GdbDYLcGqh9EwiMutZg+a0oePCCw1zHOEiji6LCpyRcjTREtPASuUqeAvYlEVvQ==", "requires": { - "css-unit-converter": "^1.1.1", - "postcss": "^7.0.5", - "postcss-selector-parser": "^5.0.0-rc.4", - "postcss-value-parser": "^3.3.1" - }, - "dependencies": { - "cssesc": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-2.0.0.tgz", - "integrity": "sha512-MsCAG1z9lPdoO/IUMLSBWBSVxVtJ1395VGIQ+Fc2gNdkQ1hNDnQdw3YhA71WJCBW1vdwA0cAnk/DnW6bqoEUYg==" - }, - "postcss-selector-parser": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-5.0.0.tgz", - "integrity": "sha512-w+zLE5Jhg6Liz8+rQOWEAwtwkyqpfnmsinXjXg6cY7YIONZZtgvE0v2O0uhQBs0peNomOJwWRKt6JBfTdTd3OQ==", - "requires": { - "cssesc": "^2.0.0", - "indexes-of": "^1.0.1", - "uniq": "^1.0.1" - } - }, - "postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" - } + "postcss": "^7.0.27", + "postcss-selector-parser": "^6.0.2", + "postcss-value-parser": "^4.0.2" } }, "postcss-color-functional-notation": { @@ -10820,11 +10121,11 @@ }, "dependencies": { "postcss-selector-parser": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-3.1.1.tgz", - "integrity": "sha1-T4dfSvsMllc9XPTXQBGu4lCn6GU=", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-3.1.2.tgz", + "integrity": "sha512-h7fJ/5uWuRVyOtkO45pnt1Ih40CEleeyCHzipqAZO2e5H20g25Y48uYnFUiShvY4rZWNJ/Bib/KVPmanaCtOhA==", "requires": { - "dot-prop": "^4.1.1", + "dot-prop": "^5.2.0", "indexes-of": "^1.0.1", "uniq": "^1.0.1" } @@ -10897,11 +10198,11 @@ }, "dependencies": { "postcss-selector-parser": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-3.1.1.tgz", - "integrity": "sha1-T4dfSvsMllc9XPTXQBGu4lCn6GU=", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-3.1.2.tgz", + "integrity": "sha512-h7fJ/5uWuRVyOtkO45pnt1Ih40CEleeyCHzipqAZO2e5H20g25Y48uYnFUiShvY4rZWNJ/Bib/KVPmanaCtOhA==", "requires": { - "dot-prop": "^4.1.1", + "dot-prop": "^5.2.0", "indexes-of": "^1.0.1", "uniq": "^1.0.1" } @@ -11420,12 +10721,12 @@ "integrity": "sha1-mEcocL8igTL8vdhoEputEsPAKeM=" }, "prompts": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.3.0.tgz", - "integrity": "sha512-NfbbPPg/74fT7wk2XYQ7hAIp9zJyZp5Fu19iRbORqqy1BhtrkZ0fPafBU+7bmn8ie69DpT0R6QpJIN2oisYjJg==", + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.3.1.tgz", + "integrity": "sha512-qIP2lQyCwYbdzcqHIUi2HAxiWixhoM9OdLCWf8txXsapC/X9YdsCoeyRIXE/GP+Q0J37Q7+XN/MFqbUa7IzXNA==", "requires": { "kleur": "^3.0.3", - "sisteransi": "^1.0.3" + "sisteransi": "^1.0.4" } }, "prop-types": { @@ -11617,14 +10918,14 @@ } }, "rc-align": { - "version": "2.4.5", - "resolved": "https://registry.npmjs.org/rc-align/-/rc-align-2.4.5.tgz", - "integrity": "sha512-nv9wYUYdfyfK+qskThf4BQUSIadeI/dCsfaMZfNEoxm9HwOIioQ+LyqmMK6jWHAZQgOzMLaqawhuBXlF63vgjw==", + "version": "3.0.0-rc.1", + "resolved": "https://registry.npmjs.org/rc-align/-/rc-align-3.0.0-rc.1.tgz", + "integrity": "sha512-GbofumhCUb7SxP410j/fbtR2M9Zml+eoZSdaliZh6R3NhfEj5zP4jcO3HG3S9C9KIcXQQtd/cwVHkb9Y0KU7Hg==", "requires": { - "babel-runtime": "^6.26.0", + "classnames": "2.x", "dom-align": "^1.7.0", - "prop-types": "^15.5.8", - "rc-util": "^4.0.4" + "rc-util": "^4.12.0", + "resize-observer-polyfill": "^1.5.1" } }, "rc-animate": { @@ -11642,48 +10943,44 @@ } }, "rc-slider": { - "version": "8.7.1", - "resolved": "https://registry.npmjs.org/rc-slider/-/rc-slider-8.7.1.tgz", - "integrity": "sha512-WMT5mRFUEcrLWwTxsyS8jYmlaMsTVCZIGENLikHsNv+tE8ThU2lCoPfi/xFNUfJFNFSBFP3MwPez9ZsJmNp13g==", + "version": "9.2.1", + "resolved": "https://registry.npmjs.org/rc-slider/-/rc-slider-9.2.1.tgz", + "integrity": "sha512-nmnga8EhCvcjwXp51Yc6S6QALXppZZd0fcV91m9fHhJdUY0hz5B4MVWy+rKaawJmXeV+8ghABmQbTjUP39GXlw==", "requires": { "babel-runtime": "6.x", "classnames": "^2.2.5", "prop-types": "^15.5.4", - "rc-tooltip": "^3.7.0", + "rc-tooltip": "^4.0.0-alpha.3", "rc-util": "^4.0.4", - "react-lifecycles-compat": "^3.0.4", "shallowequal": "^1.1.0", "warning": "^4.0.3" } }, "rc-tooltip": { - "version": "3.7.3", - "resolved": "https://registry.npmjs.org/rc-tooltip/-/rc-tooltip-3.7.3.tgz", - "integrity": "sha512-dE2ibukxxkrde7wH9W8ozHKUO4aQnPZ6qBHtrTH9LoO836PjDdiaWO73fgPB05VfJs9FbZdmGPVEbXCeOP99Ww==", + "version": "4.0.0-alpha.3", + "resolved": "https://registry.npmjs.org/rc-tooltip/-/rc-tooltip-4.0.0-alpha.3.tgz", + "integrity": "sha512-QSw6H2MMkNsRDJn0pCVARQVy+OCgVB65dPHuW/7UbJHDZTcOuTLwNtY4MbY2tMages7RVB31I7WT0KwhCslqwg==", "requires": { - "babel-runtime": "6.x", - "prop-types": "^15.5.8", - "rc-trigger": "^2.2.2" + "rc-trigger": "^4.0.0-alpha.5" } }, "rc-trigger": { - "version": "2.6.5", - "resolved": "https://registry.npmjs.org/rc-trigger/-/rc-trigger-2.6.5.tgz", - "integrity": "sha512-m6Cts9hLeZWsTvWnuMm7oElhf+03GOjOLfTuU0QmdB9ZrW7jR2IpI5rpNM7i9MvAAlMAmTx5Zr7g3uu/aMvZAw==", + "version": "4.0.0-rc.5", + "resolved": "https://registry.npmjs.org/rc-trigger/-/rc-trigger-4.0.0-rc.5.tgz", + "integrity": "sha512-CUimlGKduOzBJxMEib3MzWhFpSq0wFk/iXxonaIIth/zVMZ4at+Wf3yxh8apY6UuYZlrJiA8S58/BfePpT+g0Q==", "requires": { - "babel-runtime": "6.x", "classnames": "^2.2.6", "prop-types": "15.x", - "rc-align": "^2.4.0", - "rc-animate": "2.x", - "rc-util": "^4.4.0", - "react-lifecycles-compat": "^3.0.4" + "raf": "^3.4.1", + "rc-align": "^3.0.0-rc.0", + "rc-animate": "^2.10.2", + "rc-util": "^4.15.2" } }, "rc-util": { - "version": "4.18.1", - "resolved": "https://registry.npmjs.org/rc-util/-/rc-util-4.18.1.tgz", - "integrity": "sha512-3aRHG32ZvqBymtJUGoQnbZS+XANzO6XTiFEFAYI3BfuxESEazopAy0kBwcAI6BlLHsW1oLiy3ysE9uYwylh2ag==", + "version": "4.19.0", + "resolved": "https://registry.npmjs.org/rc-util/-/rc-util-4.19.0.tgz", + "integrity": "sha512-mptALlLwpeczS3nrv83DbwJNeupolbuvlIEjcvimSiWI8NUBjpF0HgG3kWp1RymiuiRCNm9yhaXqDz0a99dpgQ==", "requires": { "add-dom-event-listener": "^1.1.0", "babel-runtime": "6.x", @@ -11693,9 +10990,9 @@ } }, "re-resizable": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/re-resizable/-/re-resizable-6.1.1.tgz", - "integrity": "sha512-ngzX5xbXi9LlIghJUYZaBDkJUIMLYqO3tQ2cJZoNprCRGhfHnbyufKm51MZRIOBlLigLzPPFKBxQE8ZLezKGfA==", + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/re-resizable/-/re-resizable-6.2.0.tgz", + "integrity": "sha512-3bi0yTzub/obnqoTPs9C8A1ecrgt5OSWlKdHDJ6gBPiEiEIG5LO0PqbwWTpABfzAzdE4kldOG2MQDQEaJJNYkQ==", "requires": { "fast-memoize": "^2.5.1" } @@ -11711,11 +11008,11 @@ } }, "react-app-polyfill": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/react-app-polyfill/-/react-app-polyfill-1.0.5.tgz", - "integrity": "sha512-RcbV6+msbvZJZUIK/LX3UafPtoaDSJgUWu4sqBxHKTVmBsnlU2QWCKJRBRmgjxu+ivW/GPINbPWRM4Ppa6Lbgw==", + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/react-app-polyfill/-/react-app-polyfill-1.0.6.tgz", + "integrity": "sha512-OfBnObtnGgLGfweORmdZbyEz+3dgVePQBb3zipiaDsMHV1NpWm0rDFYIVXFV/AK+x4VIIfWHhrdMIeoTLyRr2g==", "requires": { - "core-js": "^3.4.1", + "core-js": "^3.5.0", "object-assign": "^4.1.1", "promise": "^8.0.3", "raf": "^3.4.1", @@ -11724,9 +11021,9 @@ }, "dependencies": { "core-js": { - "version": "3.6.3", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.6.3.tgz", - "integrity": "sha512-DOO9b18YHR+Wk5kJ/c5YFbXuUETreD4TrvXb6edzqZE3aAEd0eJIAWghZ9HttMuiON8SVCnU3fqA4rPxRDD1HQ==" + "version": "3.6.4", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.6.4.tgz", + "integrity": "sha512-4paDGScNgZP2IXXilaffL9X7968RuvwlkK3xWtZRVqgd8SYNiVKRJvkFd1aqqEuPfN7E68ZHEp9hDj6lHj4Hyw==" }, "promise": { "version": "8.0.3", @@ -11795,149 +11092,123 @@ } }, "react-dev-utils": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/react-dev-utils/-/react-dev-utils-10.0.0.tgz", - "integrity": "sha512-8OKSJvl8ccXJDNf0YGw377L9v1OnT16skD/EuZWm0M/yr255etP4x4kuUCT1EfFfJ7Rhc4ZTpPTfPrvgiXa50Q==", + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/react-dev-utils/-/react-dev-utils-10.2.0.tgz", + "integrity": "sha512-MwrvQW2TFjLblhqpDNeqCXHBkz3G5vc7k4wntgutAJZX4ia3o07eGKo6uYGhUOeJ0hfOxcpJFNFk7+4XCc1S8g==", "requires": { - "@babel/code-frame": "7.5.5", + "@babel/code-frame": "7.8.3", "address": "1.1.2", - "browserslist": "4.7.3", + "browserslist": "4.8.6", "chalk": "2.4.2", - "cross-spawn": "6.0.5", + "cross-spawn": "7.0.1", "detect-port-alt": "1.1.6", - "escape-string-regexp": "1.0.5", - "filesize": "3.6.1", - "find-up": "3.0.0", - "fork-ts-checker-webpack-plugin": "3.1.0", + "escape-string-regexp": "2.0.0", + "filesize": "6.0.1", + "find-up": "4.1.0", + "fork-ts-checker-webpack-plugin": "3.1.1", "global-modules": "2.0.0", "globby": "8.0.2", "gzip-size": "5.1.1", "immer": "1.10.0", - "inquirer": "6.5.0", + "inquirer": "7.0.4", "is-root": "2.1.0", "loader-utils": "1.2.3", - "open": "^7.0.0", - "pkg-up": "2.0.0", - "react-error-overlay": "^6.0.4", + "open": "^7.0.2", + "pkg-up": "3.1.0", + "react-error-overlay": "^6.0.6", "recursive-readdir": "2.2.2", "shell-quote": "1.7.2", - "strip-ansi": "5.2.0", + "strip-ansi": "6.0.0", "text-table": "0.2.0" }, "dependencies": { - "@babel/code-frame": { - "version": "7.5.5", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.5.5.tgz", - "integrity": "sha512-27d4lZoomVyo51VegxI20xZPuSHusqbQag/ztrBC7wegWoQ1nLREPVSKSW8byhTlzTKyNE4ifaTA6lCp7JjpFw==", - "requires": { - "@babel/highlight": "^7.0.0" - } - }, - "ansi-escapes": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz", - "integrity": "sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==" - }, - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" - }, "browserslist": { - "version": "4.7.3", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.7.3.tgz", - "integrity": "sha512-jWvmhqYpx+9EZm/FxcZSbUZyDEvDTLDi3nSAKbzEkyWvtI0mNSmUosey+5awDW1RUlrgXbQb5A6qY1xQH9U6MQ==", + "version": "4.8.6", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.8.6.tgz", + "integrity": "sha512-ZHao85gf0eZ0ESxLfCp73GG9O/VTytYDIkIiZDlURppLTI9wErSM/5yAKEq6rcUdxBLjMELmrYUJGg5sxGKMHg==", "requires": { - "caniuse-lite": "^1.0.30001010", - "electron-to-chromium": "^1.3.306", - "node-releases": "^1.1.40" + "caniuse-lite": "^1.0.30001023", + "electron-to-chromium": "^1.3.341", + "node-releases": "^1.1.47" } }, - "cli-cursor": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", - "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=", + "cross-spawn": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.1.tgz", + "integrity": "sha512-u7v4o84SwFpD32Z8IIcPZ6z1/ie24O6RU3RbtL5Y316l3KuHVPx9ItBgWQ6VlfAFnRnTtMUrsQ9MUUTuEZjogg==", "requires": { - "restore-cursor": "^2.0.0" + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" } }, - "figures": { + "escape-string-regexp": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", - "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", + "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==" + }, + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", "requires": { - "escape-string-regexp": "^1.0.5" + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" } }, - "inquirer": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-6.5.0.tgz", - "integrity": "sha512-scfHejeG/lVZSpvCXpsB4j/wQNPM5JC8kiElOI0OUTwmc1RTpXr4H32/HOlQHcZiYl2z2VElwuCVDRG8vFmbnA==", + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", "requires": { - "ansi-escapes": "^3.2.0", - "chalk": "^2.4.2", - "cli-cursor": "^2.1.0", - "cli-width": "^2.0.0", - "external-editor": "^3.0.3", - "figures": "^2.0.0", - "lodash": "^4.17.12", - "mute-stream": "0.0.7", - "run-async": "^2.2.0", - "rxjs": "^6.4.0", - "string-width": "^2.1.0", - "strip-ansi": "^5.1.0", - "through": "^2.3.6" + "p-locate": "^4.1.0" } }, - "is-fullwidth-code-point": { + "p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "requires": { + "p-limit": "^2.2.0" + } + }, + "path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==" + }, + "path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==" + }, + "shebang-command": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" - }, - "mimic-fn": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", - "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==" - }, - "mute-stream": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz", - "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=" - }, - "onetime": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", - "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", "requires": { - "mimic-fn": "^1.0.0" + "shebang-regex": "^3.0.0" } }, - "restore-cursor": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", - "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=", + "shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==" + }, + "strip-ansi": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", "requires": { - "onetime": "^2.0.0", - "signal-exit": "^3.0.2" + "ansi-regex": "^5.0.0" } }, - "string-width": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", "requires": { - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^4.0.0" - }, - "dependencies": { - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "requires": { - "ansi-regex": "^3.0.0" - } - } + "isexe": "^2.0.0" } } } @@ -11948,23 +11219,46 @@ "integrity": "sha512-zvU6iouW+SWwHTyThwxGICjJYCMZFk/6r/+jmOdC7ntQoPlS/Pqb81MkxaMf2bHTSq9TN3K3zX2/ayMW/jCtyA==" }, "react-dnd": { - "version": "9.5.1", - "resolved": "https://registry.npmjs.org/react-dnd/-/react-dnd-9.5.1.tgz", - "integrity": "sha512-j2MvziPNLsxXkb3kIJzLvvOv/TQ4sysp6U4CmxAXd4C884dXm/9UGdB7K1wkTW3ZxVpI1K7XhKbX0JgNlPfLcA==", + "version": "10.0.2", + "resolved": "https://registry.npmjs.org/react-dnd/-/react-dnd-10.0.2.tgz", + "integrity": "sha512-SC2Ymvntynhoqtf5zaFhZscm9xenCoMofilxPdlwUlaelAzmbl9fw82C4ZJ//+lNm3kWAKXjGDZg2/aWjKEAtg==", "requires": { + "@react-dnd/shallowequal": "^2.0.0", "@types/hoist-non-react-statics": "^3.3.1", - "@types/shallowequal": "^1.1.1", - "dnd-core": "^9.5.1", - "hoist-non-react-statics": "^3.3.0", - "shallowequal": "^1.1.0" + "dnd-core": "^10.0.2", + "hoist-non-react-statics": "^3.3.0" + }, + "dependencies": { + "dnd-core": { + "version": "10.0.2", + "resolved": "https://registry.npmjs.org/dnd-core/-/dnd-core-10.0.2.tgz", + "integrity": "sha512-PrxEjxF0+6Y1n1n1Z9hSWZ1tvnDXv9syL+BccV1r1RC08uWNsyetf8AnWmUF3NgYPwy0HKQJwTqGkZK+1NlaFA==", + "requires": { + "@react-dnd/asap": "^4.0.0", + "@react-dnd/invariant": "^2.0.0", + "redux": "^4.0.4" + } + } } }, "react-dnd-html5-backend": { - "version": "9.5.1", - "resolved": "https://registry.npmjs.org/react-dnd-html5-backend/-/react-dnd-html5-backend-9.5.1.tgz", - "integrity": "sha512-wUdzjREwLqHxFkA6E+XDVL5IFjRDbBI3SHVKil9n3qrGT5dm2tA2oi1aIALdfMKsu00c+OXA9lz/LuKZCE9KXg==", + "version": "10.0.2", + "resolved": "https://registry.npmjs.org/react-dnd-html5-backend/-/react-dnd-html5-backend-10.0.2.tgz", + "integrity": "sha512-ny17gUdInZ6PIGXdzfwPhoztRdNVVvjoJMdG80hkDBamJBeUPuNF2Wv4D3uoQJLjXssX1+i9PhBqc7EpogClwQ==", "requires": { - "dnd-core": "^9.5.1" + "dnd-core": "^10.0.2" + }, + "dependencies": { + "dnd-core": { + "version": "10.0.2", + "resolved": "https://registry.npmjs.org/dnd-core/-/dnd-core-10.0.2.tgz", + "integrity": "sha512-PrxEjxF0+6Y1n1n1Z9hSWZ1tvnDXv9syL+BccV1r1RC08uWNsyetf8AnWmUF3NgYPwy0HKQJwTqGkZK+1NlaFA==", + "requires": { + "@react-dnd/asap": "^4.0.0", + "@react-dnd/invariant": "^2.0.0", + "redux": "^4.0.4" + } + } } }, "react-dom": { @@ -11988,9 +11282,9 @@ } }, "react-error-overlay": { - "version": "6.0.4", - "resolved": "https://registry.npmjs.org/react-error-overlay/-/react-error-overlay-6.0.4.tgz", - "integrity": "sha512-ueZzLmHltszTshDMwyfELDq8zOA803wQ1ZuzCccXa1m57k1PxSHfflPD5W9YIiTXLs0JTLzoj6o1LuM5N6zzNA==" + "version": "6.0.6", + "resolved": "https://registry.npmjs.org/react-error-overlay/-/react-error-overlay-6.0.6.tgz", + "integrity": "sha512-Yzpno3enVzSrSCnnljmr4b/2KUQSMZaPuqmS26t9k4nW7uwJk6STWmH9heNjPuvqUTO3jOSPkHoKgO4+Dw7uIw==" }, "react-fullscreenable": { "version": "2.5.1-0", @@ -12003,9 +11297,9 @@ } }, "react-grid-system": { - "version": "4.4.11", - "resolved": "https://registry.npmjs.org/react-grid-system/-/react-grid-system-4.4.11.tgz", - "integrity": "sha512-ehaQLEi4WyX/DfjD6bUf2Y6I60T28YpJUJhcEoM+YcTeXqgNqVyp3Prq4cYryV9bYKzK046d6dff2VwnopojNg==", + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/react-grid-system/-/react-grid-system-6.2.1.tgz", + "integrity": "sha512-3yDWhrXrUvb5iZbAk0aPoNomTnSXB9u9paBIyOTzj9bzYceHceLego3g9ib7D9iAxRQ+E1j+affgvREtjZVKlA==", "requires": { "prop-types": "^15.7.2" } @@ -12032,11 +11326,10 @@ "integrity": "sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA==" }, "react-notification-system": { - "version": "0.2.17", - "resolved": "https://registry.npmjs.org/react-notification-system/-/react-notification-system-0.2.17.tgz", - "integrity": "sha1-pg7du2IiWtj5/F14N1Rr9s2zaBg=", + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/react-notification-system/-/react-notification-system-0.3.0.tgz", + "integrity": "sha512-4+3Z0I/5/gi9ZOQUOeFaKy2Uw2i3d3S4kWu0x+dUvGRuvezY+WuF21fDg3B2FL0Hx+bJPy/qn6CwMQwc0g0wdA==", "requires": { - "create-react-class": "^15.5.1", "object-assign": "^4.0.1", "prop-types": "^15.5.6" } @@ -12056,11 +11349,11 @@ } }, "react-rnd": { - "version": "10.1.4", - "resolved": "https://registry.npmjs.org/react-rnd/-/react-rnd-10.1.4.tgz", - "integrity": "sha512-m2k5jYNcqhxUfUqnzp0Dj4hfqCnGgkMrCsCDAl+jspNrkz/u3Kpj/GyKFYhPdI3CCaY+25lwfTEP3rAMbb9IxA==", + "version": "10.1.6", + "resolved": "https://registry.npmjs.org/react-rnd/-/react-rnd-10.1.6.tgz", + "integrity": "sha512-g03X7wKXvLRBPLj2sSMy7QlSG24iE5TbdGRykgmySGQiefOK4m5BGALTr390CaKaIwt7CVzr2qYI2aeMCdMEdg==", "requires": { - "re-resizable": "6.1.1", + "re-resizable": "6.2.0", "react-draggable": "4.2.0", "tslib": "1.10.0" } @@ -12097,63 +11390,73 @@ } }, "react-scripts": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/react-scripts/-/react-scripts-3.3.0.tgz", - "integrity": "sha512-hzPc6bxCc9GnsspWqk494c2Gpd0dRbk/C8q76BNQIENi9GMwoxFljOEcZoZcpFpJgQ45alxFR6QaLt+51qie7g==", + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/react-scripts/-/react-scripts-3.4.0.tgz", + "integrity": "sha512-pBqaAroFoHnFAkuX+uSK9Th1uEh2GYdGY2IG1I9/7HmuEf+ls3lLCk1p2GFYRSrLMz6ieQR/SyN6TLIGK3hKRg==", "requires": { - "@babel/core": "7.7.4", + "@babel/core": "7.8.4", "@svgr/webpack": "4.3.3", - "@typescript-eslint/eslint-plugin": "^2.8.0", - "@typescript-eslint/parser": "^2.8.0", + "@typescript-eslint/eslint-plugin": "^2.10.0", + "@typescript-eslint/parser": "^2.10.0", "babel-eslint": "10.0.3", "babel-jest": "^24.9.0", "babel-loader": "8.0.6", - "babel-plugin-named-asset-import": "^0.3.5", - "babel-preset-react-app": "^9.1.0", + "babel-plugin-named-asset-import": "^0.3.6", + "babel-preset-react-app": "^9.1.1", "camelcase": "^5.3.1", - "case-sensitive-paths-webpack-plugin": "2.2.0", - "css-loader": "3.2.0", + "case-sensitive-paths-webpack-plugin": "2.3.0", + "css-loader": "3.4.2", "dotenv": "8.2.0", "dotenv-expand": "5.1.0", "eslint": "^6.6.0", - "eslint-config-react-app": "^5.1.0", - "eslint-loader": "3.0.2", - "eslint-plugin-flowtype": "3.13.0", - "eslint-plugin-import": "2.18.2", + "eslint-config-react-app": "^5.2.0", + "eslint-loader": "3.0.3", + "eslint-plugin-flowtype": "4.6.0", + "eslint-plugin-import": "2.20.0", "eslint-plugin-jsx-a11y": "6.2.3", - "eslint-plugin-react": "7.16.0", + "eslint-plugin-react": "7.18.0", "eslint-plugin-react-hooks": "^1.6.1", "file-loader": "4.3.0", "fs-extra": "^8.1.0", "fsevents": "2.1.2", - "html-webpack-plugin": "4.0.0-beta.5", + "html-webpack-plugin": "4.0.0-beta.11", "identity-obj-proxy": "3.0.0", "jest": "24.9.0", - "jest-environment-jsdom-fourteen": "0.1.0", + "jest-environment-jsdom-fourteen": "1.0.1", "jest-resolve": "24.9.0", "jest-watch-typeahead": "0.4.2", - "mini-css-extract-plugin": "0.8.0", + "mini-css-extract-plugin": "0.9.0", "optimize-css-assets-webpack-plugin": "5.0.3", - "pnp-webpack-plugin": "1.5.0", + "pnp-webpack-plugin": "1.6.0", "postcss-flexbugs-fixes": "4.1.0", "postcss-loader": "3.0.0", "postcss-normalize": "8.0.1", "postcss-preset-env": "6.7.0", "postcss-safe-parser": "4.0.1", - "react-app-polyfill": "^1.0.5", - "react-dev-utils": "^10.0.0", - "resolve": "1.12.2", + "react-app-polyfill": "^1.0.6", + "react-dev-utils": "^10.2.0", + "resolve": "1.15.0", "resolve-url-loader": "3.1.1", - "sass-loader": "8.0.0", + "sass-loader": "8.0.2", "semver": "6.3.0", - "style-loader": "1.0.0", - "terser-webpack-plugin": "2.2.1", + "style-loader": "0.23.1", + "terser-webpack-plugin": "2.3.4", "ts-pnp": "1.1.5", "url-loader": "2.3.0", - "webpack": "4.41.2", - "webpack-dev-server": "3.9.0", + "webpack": "4.41.5", + "webpack-dev-server": "3.10.2", "webpack-manifest-plugin": "2.2.0", "workbox-webpack-plugin": "4.3.1" + }, + "dependencies": { + "resolve": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.15.0.tgz", + "integrity": "sha512-+hTmAldEGE80U2wJJDC1lebb5jWqvTYAfm3YZ1ckk1gBr0MnCqUKlwK1e+anaFljIl+F5tR5IoZcm4ZDA1zMQw==", + "requires": { + "path-parse": "^1.0.6" + } + } } }, "react-sortable-tree": { @@ -12169,6 +11472,28 @@ "react-lifecycles-compat": "^3.0.4", "react-sortable-tree": "^2.6.0", "react-virtualized": "^9.19.1" + }, + "dependencies": { + "react-dnd": { + "version": "9.5.1", + "resolved": "https://registry.npmjs.org/react-dnd/-/react-dnd-9.5.1.tgz", + "integrity": "sha512-j2MvziPNLsxXkb3kIJzLvvOv/TQ4sysp6U4CmxAXd4C884dXm/9UGdB7K1wkTW3ZxVpI1K7XhKbX0JgNlPfLcA==", + "requires": { + "@types/hoist-non-react-statics": "^3.3.1", + "@types/shallowequal": "^1.1.1", + "dnd-core": "^9.5.1", + "hoist-non-react-statics": "^3.3.0", + "shallowequal": "^1.1.0" + } + }, + "react-dnd-html5-backend": { + "version": "9.5.1", + "resolved": "https://registry.npmjs.org/react-dnd-html5-backend/-/react-dnd-html5-backend-9.5.1.tgz", + "integrity": "sha512-wUdzjREwLqHxFkA6E+XDVL5IFjRDbBI3SHVKil9n3qrGT5dm2tA2oi1aIALdfMKsu00c+OXA9lz/LuKZCE9KXg==", + "requires": { + "dnd-core": "^9.5.1" + } + } } }, "react-svg-pan-zoom": { @@ -12246,13 +11571,11 @@ } }, "readdirp": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", - "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.3.0.tgz", + "integrity": "sha512-zz0pAkSPOXXm1viEwygWIPSPkcBYjW1xU5j/JBh5t9bGCJwa6f9+BJa6VaB2g+b55yVrmXzqkyLf4xaWYM0IkQ==", "requires": { - "graceful-fs": "^4.1.11", - "micromatch": "^3.1.10", - "readable-stream": "^2.0.2" + "picomatch": "^2.0.7" } }, "realpath-native": { @@ -12372,9 +11695,9 @@ "integrity": "sha512-5qxzGZjDs9w4tzT3TPhCJqWdCc3RLYwy9J2NB0nm5Lz+S273lvWcpjaTGHsT1dc6Hhfq41uSEOw8wBmxrKOuyg==" }, "regjsparser": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.6.2.tgz", - "integrity": "sha512-E9ghzUtoLwDekPT0DYCp+c4h+bvuUpe6rRHCTYn6eGoqj1LgKXxT6I0Il4WbjhQkOghzi/V+y03bPKvbllL93Q==", + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.6.3.tgz", + "integrity": "sha512-8uZvYbnfAtEm9Ab8NTb3hdLwL4g/LQzEYP7Xs27T96abJCCE2d6r3cPZPQEsLKy0vRSGVNG+/zVGtLr86HQduA==", "requires": { "jsesc": "~0.5.0" }, @@ -12542,6 +11865,11 @@ "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=" }, + "resize-observer-polyfill": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/resize-observer-polyfill/-/resize-observer-polyfill-1.5.1.tgz", + "integrity": "sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg==" + }, "resolve": { "version": "1.12.2", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.12.2.tgz", @@ -12753,9 +12081,9 @@ "integrity": "sha512-vTxrZz4dX5W86M6oVWVdOVe72ZiPs41Oi7Z6Km4W5Turyz28mrXSJhhEBZoRtzJWIv3833WKVwLSDWWkEfupMg==" }, "sass": { - "version": "1.24.4", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.24.4.tgz", - "integrity": "sha512-SqizkIEEcVPzmK1tYdlNRl/RSXMEwGcifL9GD+S2p9rEPdj6ycRbk4PWZs0jwlajNSyBPo/SXRB81i22SG0jmw==", + "version": "1.25.0", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.25.0.tgz", + "integrity": "sha512-uQMjye0Y70SEDGO56n0j91tauqS9E1BmpKHtiYNQScXDHeaE9uHwNEqQNFf4Bes/3DHMNinB6u79JsG10XWNyw==", "requires": { "chokidar": ">=2.0.0 <4.0.0" } @@ -12977,14 +12305,14 @@ } }, "sass-loader": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-8.0.0.tgz", - "integrity": "sha512-+qeMu563PN7rPdit2+n5uuYVR0SSVwm0JsOUsaJXzgYcClWSlmX0iHDnmeOobPkf5kUglVot3QS6SyLyaQoJ4w==", + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-8.0.2.tgz", + "integrity": "sha512-7o4dbSK8/Ol2KflEmSco4jTjQoV988bM82P9CZdmo9hR3RLnvNc0ufMNdMrB0caq38JQ/FgF4/7RcbcfKzxoFQ==", "requires": { "clone-deep": "^4.0.1", "loader-utils": "^1.2.3", "neo-async": "^2.6.1", - "schema-utils": "^2.1.0", + "schema-utils": "^2.6.1", "semver": "^6.3.0" }, "dependencies": { @@ -12999,9 +12327,9 @@ } }, "kind-of": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", - "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==" + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==" }, "shallow-clone": { "version": "3.0.1", @@ -13036,9 +12364,9 @@ } }, "schema-utils": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.6.1.tgz", - "integrity": "sha512-0WXHDs1VDJyo+Zqs9TKLKyD/h7yDpHUhEFsM2CzkICFdoX1av+GBq/J2xRTFfsQO5kBfhZzANf2VcIm84jqDbg==", + "version": "2.6.4", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.6.4.tgz", + "integrity": "sha512-VNjcaUxVnEeun6B2fiiUDjXXBtD4ZSH7pdbfIu1pOFwgptDPLMo/z9jr4sUfsjFVPqDCEin/F7IYlq7/E6yDbQ==", "requires": { "ajv": "^6.10.2", "ajv-keywords": "^3.4.1" @@ -13441,9 +12769,9 @@ } }, "kind-of": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", - "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==" + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==" } } }, @@ -13593,9 +12921,9 @@ }, "dependencies": { "readable-stream": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.4.0.tgz", - "integrity": "sha512-jItXPLmrSR8jmTRmRWJXCnGJsfy85mB3Wd/uINMXA65yrnFo0cPClFIUWzo2najVNSl+mx7/4W8ttlLWJe99pQ==", + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", "requires": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", @@ -13807,6 +13135,13 @@ "get-own-enumerable-property-symbols": "^3.0.0", "is-obj": "^1.0.1", "is-regexp": "^1.0.0" + }, + "dependencies": { + "is-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", + "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=" + } } }, "strip-ansi": { @@ -13857,12 +13192,24 @@ "integrity": "sha512-VTyMAUfdm047mwKl+u79WIdrZxtFtn+nBxHeb844XBQ9uMNTuTHdx2hc5RiAJYqwTj3wc/xe5HLSdJSkJ+WfZw==" }, "style-loader": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-1.0.0.tgz", - "integrity": "sha512-B0dOCFwv7/eY31a5PCieNwMgMhVGFe9w+rh7s/Bx8kfFkrth9zfTZquoYvdw8URgiqxObQKcpW51Ugz1HjfdZw==", + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-0.23.1.tgz", + "integrity": "sha512-XK+uv9kWwhZMZ1y7mysB+zoihsEj4wneFWAS5qoiLwzW0WzSqMrrsIy+a3zkQJq0ipFtBpX5W3MqyRIBF/WFGg==", "requires": { - "loader-utils": "^1.2.3", - "schema-utils": "^2.0.1" + "loader-utils": "^1.1.0", + "schema-utils": "^1.0.0" + }, + "dependencies": { + "schema-utils": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", + "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", + "requires": { + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" + } + } } }, "stylehacks": { @@ -13876,11 +13223,11 @@ }, "dependencies": { "postcss-selector-parser": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-3.1.1.tgz", - "integrity": "sha1-T4dfSvsMllc9XPTXQBGu4lCn6GU=", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-3.1.2.tgz", + "integrity": "sha512-h7fJ/5uWuRVyOtkO45pnt1Ih40CEleeyCHzipqAZO2e5H20g25Y48uYnFUiShvY4rZWNJ/Bib/KVPmanaCtOhA==", "requires": { - "dot-prop": "^4.1.1", + "dot-prop": "^5.2.0", "indexes-of": "^1.0.1", "uniq": "^1.0.1" } @@ -13888,9 +13235,9 @@ } }, "superagent": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/superagent/-/superagent-5.2.1.tgz", - "integrity": "sha512-46b4Lkwnlz7Ebdv2FBbfuqb3kVkG1jV/SK3EW6NnwL9a3T4h5hHtegNEQfbXvTFbDoUZXId4W3dMgap2f6ic1g==", + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/superagent/-/superagent-5.2.2.tgz", + "integrity": "sha512-pMWBUnIllK4ZTw7p/UaobiQPwAO5w/1NRRTDpV0FTVNmECztsxKspj3ZWEordVEaqpZtmOQJJna4yTLyC/q7PQ==", "requires": { "component-emitter": "^1.3.0", "cookiejar": "^2.1.2", @@ -13921,9 +13268,9 @@ "integrity": "sha512-Cxm7/SS/y/Z3MHWSxXb8lIFqgqBowP5JMlTUFyJN88y0SGQhVmZnqFK/PeuMX9LzUyWsqqhNxIyg0jlzq946yA==" }, "readable-stream": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.4.0.tgz", - "integrity": "sha512-jItXPLmrSR8jmTRmRWJXCnGJsfy85mB3Wd/uINMXA65yrnFo0cPClFIUWzo2najVNSl+mx7/4W8ttlLWJe99pQ==", + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", "requires": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", @@ -13941,9 +13288,9 @@ } }, "svg-parser": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/svg-parser/-/svg-parser-2.0.2.tgz", - "integrity": "sha512-1gtApepKFweigFZj3sGO8KT8LvVZK8io146EzXrpVuWCDAbISz/yMucco3hWTkpZNoPabM+dnMOpy6Swue68Zg==" + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/svg-parser/-/svg-parser-2.0.3.tgz", + "integrity": "sha512-fnCWiifNhK8i2Z7b9R5tbNahpxrRdAaQbnoxKlT2KrSCj9Kq/yBSgulCRgBJRhy1dPnSY5slg5ehPUnzpEcHlg==" }, "svgo": { "version": "1.3.2", @@ -14024,9 +13371,9 @@ } }, "terser": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/terser/-/terser-4.6.2.tgz", - "integrity": "sha512-6FUjJdY2i3WZAtYBtnV06OOcOfzl+4hSKYE9wgac8rkLRBToPDDrBB2AcHwQD/OKDxbnvhVy2YgOPWO2SsKWqg==", + "version": "4.6.3", + "resolved": "https://registry.npmjs.org/terser/-/terser-4.6.3.tgz", + "integrity": "sha512-Lw+ieAXmY69d09IIc/yqeBqXpEQIpDGZqT34ui1QWXIUpR2RjbqEkT8X7Lgex19hslSqcWM5iMN2kM11eMsESQ==", "requires": { "commander": "^2.20.0", "source-map": "~0.6.1", @@ -14034,17 +13381,18 @@ } }, "terser-webpack-plugin": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-2.2.1.tgz", - "integrity": "sha512-jwdauV5Al7zopR6OAYvIIRcxXCSvLjZjr7uZE8l2tIWb/ryrGN48sJftqGf5k9z09tWhajx53ldp0XPI080YnA==", + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-2.3.4.tgz", + "integrity": "sha512-Nv96Nws2R2nrFOpbzF6IxRDpIkkIfmhvOws+IqMvYdFLO7o6wAILWFKONFgaYy8+T4LVz77DQW0f7wOeDEAjrg==", "requires": { "cacache": "^13.0.1", - "find-cache-dir": "^3.0.0", - "jest-worker": "^24.9.0", - "schema-utils": "^2.5.0", - "serialize-javascript": "^2.1.0", + "find-cache-dir": "^3.2.0", + "jest-worker": "^25.1.0", + "p-limit": "^2.2.2", + "schema-utils": "^2.6.4", + "serialize-javascript": "^2.1.2", "source-map": "^0.6.1", - "terser": "^4.3.9", + "terser": "^4.4.3", "webpack-sources": "^1.4.3" }, "dependencies": { @@ -14067,6 +13415,20 @@ "path-exists": "^4.0.0" } }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "jest-worker": { + "version": "25.1.0", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-25.1.0.tgz", + "integrity": "sha512-ZHhHtlxOWSxCoNOKHGbiLzXnl42ga9CxDr27H36Qn+15pQZd3R/F24jrmjDelw9j/iHUIWMWs08/u2QN50HHOg==", + "requires": { + "merge-stream": "^2.0.0", + "supports-color": "^7.0.0" + } + }, "locate-path": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", @@ -14076,9 +13438,9 @@ } }, "make-dir": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.0.0.tgz", - "integrity": "sha512-grNJDhb8b1Jm1qeqW5R/O63wUo4UXo2v2HMic6YT9i/HBlF93S8jkMgH7yugvY9ABDShH4VZMn8I+U8+fCNegw==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.0.2.tgz", + "integrity": "sha512-rYKABKutXa6vXTXhoV18cBE7PaewPXHe/Bdq4v+ZLMhxbWApkFFplT0LcbMW+6BbjnQXzZ/sAvSE/JdguApG5w==", "requires": { "semver": "^6.0.0" } @@ -14103,6 +13465,14 @@ "requires": { "find-up": "^4.0.0" } + }, + "supports-color": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "requires": { + "has-flag": "^4.0.0" + } } } }, @@ -14335,9 +13705,9 @@ "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=" }, "typescript": { - "version": "3.7.4", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.7.4.tgz", - "integrity": "sha512-A25xv5XCtarLwXpcDNZzCGvW2D1S3/bACratYBx2sax8PefsFhlYmkQicKHvpYflFS8if4zne5zT5kpJ7pzuvw==" + "version": "3.7.5", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.7.5.tgz", + "integrity": "sha512-/P5lkRXkWHNAbcJIiHPfRoKqyd7bsyCma1hZNUGfn20qm64T6ZBlrzprymeu918H+mB/0rIg2gGK/BXkhhYgBw==" }, "ua-parser-js": { "version": "0.7.20", @@ -14345,9 +13715,9 @@ "integrity": "sha512-8OaIKfzL5cpx8eCMAhhvTlft8GYF8b2eQr6JkCyVdrgjcytyOmPCXrqXFcUnhonRpLlh5yxEZVohm6mzaowUOw==" }, "uglify-js": { - "version": "3.7.5", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.7.5.tgz", - "integrity": "sha512-GFZ3EXRptKGvb/C1Sq6nO1iI7AGcjyqmIyOw0DrD0675e+NNbGO72xmMM2iEBdFbxaTLo70NbjM/Wy54uZIlsg==", + "version": "3.7.7", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.7.7.tgz", + "integrity": "sha512-FeSU+hi7ULYy6mn8PKio/tXsdSXN35lm4KgV2asx00kzrLU9Pi3oAslcJT70Jdj7PHX29gGUPOT6+lXGBbemhA==", "optional": true, "requires": { "commander": "~2.20.3", @@ -14561,12 +13931,14 @@ "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" }, "util.promisify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.0.tgz", - "integrity": "sha512-i+6qA2MPhvoKLuxnJNpXAGhg7HphQOSUq2LKMZD0m15EiskXUkMvKdF4Uui0WYeCUGea+o2cw/ZuwehtfsrNkA==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.1.tgz", + "integrity": "sha512-g9JpC/3He3bm38zsLupWryXHoEcS22YHthuPQSJdMy6KNrzIRzWqcsHzD/WUnqe45whVou4VIsPew37DoXWNrA==", "requires": { - "define-properties": "^1.1.2", - "object.getownpropertydescriptors": "^2.0.3" + "define-properties": "^1.1.3", + "es-abstract": "^1.17.2", + "has-symbols": "^1.0.1", + "object.getownpropertydescriptors": "^2.1.0" } }, "utila": { @@ -14599,9 +13971,9 @@ } }, "validator": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/validator/-/validator-11.1.0.tgz", - "integrity": "sha512-qiQ5ktdO7CD6C/5/mYV4jku/7qnqzjrxb3C/Q5wR3vGGinHTgJZN/TdFT3ZX4vXhX2R1PXx42fB1cn5W+uJ4lg==" + "version": "12.2.0", + "resolved": "https://registry.npmjs.org/validator/-/validator-12.2.0.tgz", + "integrity": "sha512-jJfE/DW6tIK1Ek8nCfNFqt8Wb3nzMoAbocBF6/Icgg1ZFSBpObdnwVY2jQj6qUqzhx5jc71fpvBWyLGO7Xl+nQ==" }, "value-equal": { "version": "1.0.1", @@ -14614,9 +13986,9 @@ "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=" }, "vendors": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/vendors/-/vendors-1.0.3.tgz", - "integrity": "sha512-fOi47nsJP5Wqefa43kyWSg80qF+Q3XA6MUkgi7Hp1HQaKDQW4cQrK2D0P7mmbFtsV1N89am55Yru/nyEwRubcw==" + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/vendors/-/vendors-1.0.4.tgz", + "integrity": "sha512-/juG65kTL4Cy2su4P8HjtkTxk6VmJDiOPBufWniqQ6wknac6jNiXS9vU+hO3wgusiyqWlzTbVHi0dyJqRONg3w==" }, "verror": { "version": "1.10.0", @@ -14675,6 +14047,564 @@ "chokidar": "^2.0.2", "graceful-fs": "^4.1.2", "neo-async": "^2.5.0" + }, + "dependencies": { + "binary-extensions": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", + "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==" + }, + "chokidar": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", + "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==", + "requires": { + "anymatch": "^2.0.0", + "async-each": "^1.0.1", + "braces": "^2.3.2", + "fsevents": "^1.2.7", + "glob-parent": "^3.1.0", + "inherits": "^2.0.3", + "is-binary-path": "^1.0.0", + "is-glob": "^4.0.0", + "normalize-path": "^3.0.0", + "path-is-absolute": "^1.0.0", + "readdirp": "^2.2.1", + "upath": "^1.1.1" + } + }, + "fsevents": { + "version": "1.2.11", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.11.tgz", + "integrity": "sha512-+ux3lx6peh0BpvY0JebGyZoiR4D+oYzdPZMKJwkZ+sFkNJzpL7tXc/wehS49gUAxg3tmMHPHZkA8JU2rhhgDHw==", + "optional": true, + "requires": { + "bindings": "^1.5.0", + "nan": "^2.12.1", + "node-pre-gyp": "*" + }, + "dependencies": { + "abbrev": { + "version": "1.1.1", + "bundled": true, + "optional": true + }, + "ansi-regex": { + "version": "2.1.1", + "bundled": true, + "optional": true + }, + "aproba": { + "version": "1.2.0", + "bundled": true, + "optional": true + }, + "are-we-there-yet": { + "version": "1.1.5", + "bundled": true, + "optional": true, + "requires": { + "delegates": "^1.0.0", + "readable-stream": "^2.0.6" + } + }, + "balanced-match": { + "version": "1.0.0", + "bundled": true, + "optional": true + }, + "brace-expansion": { + "version": "1.1.11", + "bundled": true, + "optional": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "chownr": { + "version": "1.1.3", + "bundled": true, + "optional": true + }, + "code-point-at": { + "version": "1.1.0", + "bundled": true, + "optional": true + }, + "concat-map": { + "version": "0.0.1", + "bundled": true, + "optional": true + }, + "console-control-strings": { + "version": "1.1.0", + "bundled": true, + "optional": true + }, + "core-util-is": { + "version": "1.0.2", + "bundled": true, + "optional": true + }, + "debug": { + "version": "3.2.6", + "bundled": true, + "optional": true, + "requires": { + "ms": "^2.1.1" + } + }, + "deep-extend": { + "version": "0.6.0", + "bundled": true, + "optional": true + }, + "delegates": { + "version": "1.0.0", + "bundled": true, + "optional": true + }, + "detect-libc": { + "version": "1.0.3", + "bundled": true, + "optional": true + }, + "fs-minipass": { + "version": "1.2.7", + "bundled": true, + "optional": true, + "requires": { + "minipass": "^2.6.0" + } + }, + "fs.realpath": { + "version": "1.0.0", + "bundled": true, + "optional": true + }, + "gauge": { + "version": "2.7.4", + "bundled": true, + "optional": true, + "requires": { + "aproba": "^1.0.3", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.0", + "object-assign": "^4.1.0", + "signal-exit": "^3.0.0", + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wide-align": "^1.1.0" + } + }, + "glob": { + "version": "7.1.6", + "bundled": true, + "optional": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "has-unicode": { + "version": "2.0.1", + "bundled": true, + "optional": true + }, + "iconv-lite": { + "version": "0.4.24", + "bundled": true, + "optional": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "ignore-walk": { + "version": "3.0.3", + "bundled": true, + "optional": true, + "requires": { + "minimatch": "^3.0.4" + } + }, + "inflight": { + "version": "1.0.6", + "bundled": true, + "optional": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4", + "bundled": true, + "optional": true + }, + "ini": { + "version": "1.3.5", + "bundled": true, + "optional": true + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "bundled": true, + "optional": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "isarray": { + "version": "1.0.0", + "bundled": true, + "optional": true + }, + "minimatch": { + "version": "3.0.4", + "bundled": true, + "optional": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "0.0.8", + "bundled": true, + "optional": true + }, + "minipass": { + "version": "2.9.0", + "bundled": true, + "optional": true, + "requires": { + "safe-buffer": "^5.1.2", + "yallist": "^3.0.0" + } + }, + "minizlib": { + "version": "1.3.3", + "bundled": true, + "optional": true, + "requires": { + "minipass": "^2.9.0" + } + }, + "mkdirp": { + "version": "0.5.1", + "bundled": true, + "optional": true, + "requires": { + "minimist": "0.0.8" + } + }, + "ms": { + "version": "2.1.2", + "bundled": true, + "optional": true + }, + "needle": { + "version": "2.4.0", + "bundled": true, + "optional": true, + "requires": { + "debug": "^3.2.6", + "iconv-lite": "^0.4.4", + "sax": "^1.2.4" + } + }, + "node-pre-gyp": { + "version": "0.14.0", + "bundled": true, + "optional": true, + "requires": { + "detect-libc": "^1.0.2", + "mkdirp": "^0.5.1", + "needle": "^2.2.1", + "nopt": "^4.0.1", + "npm-packlist": "^1.1.6", + "npmlog": "^4.0.2", + "rc": "^1.2.7", + "rimraf": "^2.6.1", + "semver": "^5.3.0", + "tar": "^4.4.2" + } + }, + "nopt": { + "version": "4.0.1", + "bundled": true, + "optional": true, + "requires": { + "abbrev": "1", + "osenv": "^0.1.4" + } + }, + "npm-bundled": { + "version": "1.1.1", + "bundled": true, + "optional": true, + "requires": { + "npm-normalize-package-bin": "^1.0.1" + } + }, + "npm-normalize-package-bin": { + "version": "1.0.1", + "bundled": true, + "optional": true + }, + "npm-packlist": { + "version": "1.4.7", + "bundled": true, + "optional": true, + "requires": { + "ignore-walk": "^3.0.1", + "npm-bundled": "^1.0.1" + } + }, + "npmlog": { + "version": "4.1.2", + "bundled": true, + "optional": true, + "requires": { + "are-we-there-yet": "~1.1.2", + "console-control-strings": "~1.1.0", + "gauge": "~2.7.3", + "set-blocking": "~2.0.0" + } + }, + "number-is-nan": { + "version": "1.0.1", + "bundled": true, + "optional": true + }, + "object-assign": { + "version": "4.1.1", + "bundled": true, + "optional": true + }, + "once": { + "version": "1.4.0", + "bundled": true, + "optional": true, + "requires": { + "wrappy": "1" + } + }, + "os-homedir": { + "version": "1.0.2", + "bundled": true, + "optional": true + }, + "os-tmpdir": { + "version": "1.0.2", + "bundled": true, + "optional": true + }, + "osenv": { + "version": "0.1.5", + "bundled": true, + "optional": true, + "requires": { + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.0" + } + }, + "path-is-absolute": { + "version": "1.0.1", + "bundled": true, + "optional": true + }, + "process-nextick-args": { + "version": "2.0.1", + "bundled": true, + "optional": true + }, + "rc": { + "version": "1.2.8", + "bundled": true, + "optional": true, + "requires": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + }, + "dependencies": { + "minimist": { + "version": "1.2.0", + "bundled": true, + "optional": true + } + } + }, + "readable-stream": { + "version": "2.3.6", + "bundled": true, + "optional": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "rimraf": { + "version": "2.7.1", + "bundled": true, + "optional": true, + "requires": { + "glob": "^7.1.3" + } + }, + "safe-buffer": { + "version": "5.1.2", + "bundled": true, + "optional": true + }, + "safer-buffer": { + "version": "2.1.2", + "bundled": true, + "optional": true + }, + "sax": { + "version": "1.2.4", + "bundled": true, + "optional": true + }, + "semver": { + "version": "5.7.1", + "bundled": true, + "optional": true + }, + "set-blocking": { + "version": "2.0.0", + "bundled": true, + "optional": true + }, + "signal-exit": { + "version": "3.0.2", + "bundled": true, + "optional": true + }, + "string-width": { + "version": "1.0.2", + "bundled": true, + "optional": true, + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + }, + "string_decoder": { + "version": "1.1.1", + "bundled": true, + "optional": true, + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "bundled": true, + "optional": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "strip-json-comments": { + "version": "2.0.1", + "bundled": true, + "optional": true + }, + "tar": { + "version": "4.4.13", + "bundled": true, + "optional": true, + "requires": { + "chownr": "^1.1.1", + "fs-minipass": "^1.2.5", + "minipass": "^2.8.6", + "minizlib": "^1.2.1", + "mkdirp": "^0.5.0", + "safe-buffer": "^5.1.2", + "yallist": "^3.0.3" + } + }, + "util-deprecate": { + "version": "1.0.2", + "bundled": true, + "optional": true + }, + "wide-align": { + "version": "1.1.3", + "bundled": true, + "optional": true, + "requires": { + "string-width": "^1.0.2 || 2" + } + }, + "wrappy": { + "version": "1.0.2", + "bundled": true, + "optional": true + }, + "yallist": { + "version": "3.1.1", + "bundled": true, + "optional": true + } + } + }, + "glob-parent": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", + "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", + "requires": { + "is-glob": "^3.1.0", + "path-dirname": "^1.0.0" + }, + "dependencies": { + "is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "requires": { + "is-extglob": "^2.1.0" + } + } + } + }, + "is-binary-path": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", + "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", + "requires": { + "binary-extensions": "^1.0.0" + } + }, + "normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==" + }, + "readdirp": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", + "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", + "requires": { + "graceful-fs": "^4.1.11", + "micromatch": "^3.1.10", + "readable-stream": "^2.0.2" + } + } } }, "wbuf": { @@ -14691,9 +14621,9 @@ "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==" }, "webpack": { - "version": "4.41.2", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.41.2.tgz", - "integrity": "sha512-Zhw69edTGfbz9/8JJoyRQ/pq8FYUoY0diOXqW0T6yhgdhCv6wr0hra5DwwWexNRns2Z2+gsnrNcbe9hbGBgk/A==", + "version": "4.41.5", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.41.5.tgz", + "integrity": "sha512-wp0Co4vpyumnp3KlkmpM5LWuzvZYayDwM2n17EHFr4qxBBbRokC7DJawPJC7TfSFZ9HZ6GsdH40EBj4UV0nmpw==", "requires": { "@webassemblyjs/ast": "1.8.5", "@webassemblyjs/helper-module-context": "1.8.5", @@ -14715,7 +14645,7 @@ "node-libs-browser": "^2.2.1", "schema-utils": "^1.0.0", "tapable": "^1.1.3", - "terser-webpack-plugin": "^1.4.1", + "terser-webpack-plugin": "^1.4.3", "watchpack": "^1.6.0", "webpack-sources": "^1.4.1" }, @@ -14805,9 +14735,9 @@ } }, "webpack-dev-server": { - "version": "3.9.0", - "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-3.9.0.tgz", - "integrity": "sha512-E6uQ4kRrTX9URN9s/lIbqTAztwEPdvzVrcmHE8EQ9YnuT9J8Es5Wrd8n9BKg1a0oZ5EgEke/EQFgUsp18dSTBw==", + "version": "3.10.2", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-3.10.2.tgz", + "integrity": "sha512-pxZKPYb+n77UN8u9YxXT4IaIrGcNtijh/mi8TXbErHmczw0DtPnMTTjHj+eNjkqLOaAZM/qD7V59j/qJsEiaZA==", "requires": { "ansi-html": "0.0.7", "bonjour": "^3.5.0", @@ -14824,7 +14754,7 @@ "ip": "^1.1.5", "is-absolute-url": "^3.0.3", "killable": "^1.0.1", - "loglevel": "^1.6.4", + "loglevel": "^1.6.6", "opn": "^5.5.0", "p-retry": "^3.0.1", "portfinder": "^1.0.25", @@ -14849,6 +14779,30 @@ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" }, + "binary-extensions": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", + "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==" + }, + "chokidar": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", + "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==", + "requires": { + "anymatch": "^2.0.0", + "async-each": "^1.0.1", + "braces": "^2.3.2", + "fsevents": "^1.2.7", + "glob-parent": "^3.1.0", + "inherits": "^2.0.3", + "is-binary-path": "^1.0.0", + "is-glob": "^4.0.0", + "normalize-path": "^3.0.0", + "path-is-absolute": "^1.0.0", + "readdirp": "^2.2.1", + "upath": "^1.1.1" + } + }, "cliui": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/cliui/-/cliui-4.1.0.tgz", @@ -14874,21 +14828,553 @@ } } }, + "fsevents": { + "version": "1.2.11", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.11.tgz", + "integrity": "sha512-+ux3lx6peh0BpvY0JebGyZoiR4D+oYzdPZMKJwkZ+sFkNJzpL7tXc/wehS49gUAxg3tmMHPHZkA8JU2rhhgDHw==", + "optional": true, + "requires": { + "bindings": "^1.5.0", + "nan": "^2.12.1", + "node-pre-gyp": "*" + }, + "dependencies": { + "abbrev": { + "version": "1.1.1", + "bundled": true, + "optional": true + }, + "ansi-regex": { + "version": "2.1.1", + "bundled": true, + "optional": true + }, + "aproba": { + "version": "1.2.0", + "bundled": true, + "optional": true + }, + "are-we-there-yet": { + "version": "1.1.5", + "bundled": true, + "optional": true, + "requires": { + "delegates": "^1.0.0", + "readable-stream": "^2.0.6" + } + }, + "balanced-match": { + "version": "1.0.0", + "bundled": true, + "optional": true + }, + "brace-expansion": { + "version": "1.1.11", + "bundled": true, + "optional": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "chownr": { + "version": "1.1.3", + "bundled": true, + "optional": true + }, + "code-point-at": { + "version": "1.1.0", + "bundled": true, + "optional": true + }, + "concat-map": { + "version": "0.0.1", + "bundled": true, + "optional": true + }, + "console-control-strings": { + "version": "1.1.0", + "bundled": true, + "optional": true + }, + "core-util-is": { + "version": "1.0.2", + "bundled": true, + "optional": true + }, + "debug": { + "version": "3.2.6", + "bundled": true, + "optional": true, + "requires": { + "ms": "^2.1.1" + } + }, + "deep-extend": { + "version": "0.6.0", + "bundled": true, + "optional": true + }, + "delegates": { + "version": "1.0.0", + "bundled": true, + "optional": true + }, + "detect-libc": { + "version": "1.0.3", + "bundled": true, + "optional": true + }, + "fs-minipass": { + "version": "1.2.7", + "bundled": true, + "optional": true, + "requires": { + "minipass": "^2.6.0" + } + }, + "fs.realpath": { + "version": "1.0.0", + "bundled": true, + "optional": true + }, + "gauge": { + "version": "2.7.4", + "bundled": true, + "optional": true, + "requires": { + "aproba": "^1.0.3", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.0", + "object-assign": "^4.1.0", + "signal-exit": "^3.0.0", + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wide-align": "^1.1.0" + } + }, + "glob": { + "version": "7.1.6", + "bundled": true, + "optional": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "has-unicode": { + "version": "2.0.1", + "bundled": true, + "optional": true + }, + "iconv-lite": { + "version": "0.4.24", + "bundled": true, + "optional": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "ignore-walk": { + "version": "3.0.3", + "bundled": true, + "optional": true, + "requires": { + "minimatch": "^3.0.4" + } + }, + "inflight": { + "version": "1.0.6", + "bundled": true, + "optional": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4", + "bundled": true, + "optional": true + }, + "ini": { + "version": "1.3.5", + "bundled": true, + "optional": true + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "bundled": true, + "optional": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "isarray": { + "version": "1.0.0", + "bundled": true, + "optional": true + }, + "minimatch": { + "version": "3.0.4", + "bundled": true, + "optional": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "0.0.8", + "bundled": true, + "optional": true + }, + "minipass": { + "version": "2.9.0", + "bundled": true, + "optional": true, + "requires": { + "safe-buffer": "^5.1.2", + "yallist": "^3.0.0" + } + }, + "minizlib": { + "version": "1.3.3", + "bundled": true, + "optional": true, + "requires": { + "minipass": "^2.9.0" + } + }, + "mkdirp": { + "version": "0.5.1", + "bundled": true, + "optional": true, + "requires": { + "minimist": "0.0.8" + } + }, + "ms": { + "version": "2.1.2", + "bundled": true, + "optional": true + }, + "needle": { + "version": "2.4.0", + "bundled": true, + "optional": true, + "requires": { + "debug": "^3.2.6", + "iconv-lite": "^0.4.4", + "sax": "^1.2.4" + } + }, + "node-pre-gyp": { + "version": "0.14.0", + "bundled": true, + "optional": true, + "requires": { + "detect-libc": "^1.0.2", + "mkdirp": "^0.5.1", + "needle": "^2.2.1", + "nopt": "^4.0.1", + "npm-packlist": "^1.1.6", + "npmlog": "^4.0.2", + "rc": "^1.2.7", + "rimraf": "^2.6.1", + "semver": "^5.3.0", + "tar": "^4.4.2" + } + }, + "nopt": { + "version": "4.0.1", + "bundled": true, + "optional": true, + "requires": { + "abbrev": "1", + "osenv": "^0.1.4" + } + }, + "npm-bundled": { + "version": "1.1.1", + "bundled": true, + "optional": true, + "requires": { + "npm-normalize-package-bin": "^1.0.1" + } + }, + "npm-normalize-package-bin": { + "version": "1.0.1", + "bundled": true, + "optional": true + }, + "npm-packlist": { + "version": "1.4.7", + "bundled": true, + "optional": true, + "requires": { + "ignore-walk": "^3.0.1", + "npm-bundled": "^1.0.1" + } + }, + "npmlog": { + "version": "4.1.2", + "bundled": true, + "optional": true, + "requires": { + "are-we-there-yet": "~1.1.2", + "console-control-strings": "~1.1.0", + "gauge": "~2.7.3", + "set-blocking": "~2.0.0" + } + }, + "number-is-nan": { + "version": "1.0.1", + "bundled": true, + "optional": true + }, + "object-assign": { + "version": "4.1.1", + "bundled": true, + "optional": true + }, + "once": { + "version": "1.4.0", + "bundled": true, + "optional": true, + "requires": { + "wrappy": "1" + } + }, + "os-homedir": { + "version": "1.0.2", + "bundled": true, + "optional": true + }, + "os-tmpdir": { + "version": "1.0.2", + "bundled": true, + "optional": true + }, + "osenv": { + "version": "0.1.5", + "bundled": true, + "optional": true, + "requires": { + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.0" + } + }, + "path-is-absolute": { + "version": "1.0.1", + "bundled": true, + "optional": true + }, + "process-nextick-args": { + "version": "2.0.1", + "bundled": true, + "optional": true + }, + "rc": { + "version": "1.2.8", + "bundled": true, + "optional": true, + "requires": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + }, + "dependencies": { + "minimist": { + "version": "1.2.0", + "bundled": true, + "optional": true + } + } + }, + "readable-stream": { + "version": "2.3.6", + "bundled": true, + "optional": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "rimraf": { + "version": "2.7.1", + "bundled": true, + "optional": true, + "requires": { + "glob": "^7.1.3" + } + }, + "safe-buffer": { + "version": "5.1.2", + "bundled": true, + "optional": true + }, + "safer-buffer": { + "version": "2.1.2", + "bundled": true, + "optional": true + }, + "sax": { + "version": "1.2.4", + "bundled": true, + "optional": true + }, + "semver": { + "version": "5.7.1", + "bundled": true, + "optional": true + }, + "set-blocking": { + "version": "2.0.0", + "bundled": true, + "optional": true + }, + "signal-exit": { + "version": "3.0.2", + "bundled": true, + "optional": true + }, + "string-width": { + "version": "1.0.2", + "bundled": true, + "optional": true, + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + }, + "string_decoder": { + "version": "1.1.1", + "bundled": true, + "optional": true, + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "bundled": true, + "optional": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "strip-json-comments": { + "version": "2.0.1", + "bundled": true, + "optional": true + }, + "tar": { + "version": "4.4.13", + "bundled": true, + "optional": true, + "requires": { + "chownr": "^1.1.1", + "fs-minipass": "^1.2.5", + "minipass": "^2.8.6", + "minizlib": "^1.2.1", + "mkdirp": "^0.5.0", + "safe-buffer": "^5.1.2", + "yallist": "^3.0.3" + } + }, + "util-deprecate": { + "version": "1.0.2", + "bundled": true, + "optional": true + }, + "wide-align": { + "version": "1.1.3", + "bundled": true, + "optional": true, + "requires": { + "string-width": "^1.0.2 || 2" + } + }, + "wrappy": { + "version": "1.0.2", + "bundled": true, + "optional": true + }, + "yallist": { + "version": "3.1.1", + "bundled": true, + "optional": true + } + } + }, "get-caller-file": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz", "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==" }, + "glob-parent": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", + "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", + "requires": { + "is-glob": "^3.1.0", + "path-dirname": "^1.0.0" + }, + "dependencies": { + "is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "requires": { + "is-extglob": "^2.1.0" + } + } + } + }, "is-absolute-url": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-3.0.3.tgz", "integrity": "sha512-opmNIX7uFnS96NtPmhWQgQx6/NYFgsUXYMllcfzwWKUMwfo8kku1TvE6hkNcH+Q1ts5cMVrsY7j0bxXQDciu9Q==" }, + "is-binary-path": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", + "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", + "requires": { + "binary-extensions": "^1.0.0" + } + }, "is-fullwidth-code-point": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" }, + "normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==" + }, + "readdirp": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", + "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", + "requires": { + "graceful-fs": "^4.1.11", + "micromatch": "^3.1.10", + "readable-stream": "^2.0.2" + } + }, "require-main-filename": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", diff --git a/package.json b/package.json index c559618..516dd92 100644 --- a/package.json +++ b/package.json @@ -3,8 +3,8 @@ "version": "0.1.0", "private": true, "dependencies": { - "@fortawesome/fontawesome-svg-core": "^1.2.26", - "@fortawesome/free-solid-svg-icons": "^5.12.0", + "@fortawesome/fontawesome-svg-core": "^1.2.27", + "@fortawesome/free-solid-svg-icons": "^5.12.1", "@fortawesome/react-fontawesome": "^0.1.8", "babel-runtime": "^6.26.0", "bootstrap": "^4.4.1", @@ -17,41 +17,42 @@ "d3-shape": "^1.3.7", "d3-time-format": "^2.2.3", "es6-promise": "^4.2.8", + "eslint-plugin-flowtype": "^4.6.0", "fibers": "^4.0.2", "file-saver": "^2.0.2", "flux": "^3.1.3", "frontend-collective-react-dnd-scrollzone": "^1.0.2", "gaugeJS": "^1.3.7", - "handlebars": "^4.7.1", + "handlebars": "^4.7.3", "immutable": "^4.0.0-rc.12", "jquery": "^3.4.1", "jszip": "^3.2.2", "libcimsvg": "git+https://git.rwth-aachen.de/acs/public/cim/pintura-npm-package.git", "lodash": "^4.17.15", - "node-sass": "^4.13.0", + "node-sass": "^4.13.1", "prop-types": "^15.7.2", - "rc-slider": "^8.7.1", + "rc-slider": "^9.2.1", "react": "^16.12.0", "react-bootstrap": "^1.0.0-beta.16", "react-contexify": "^4.1.1", "react-d3": "^0.4.0", - "react-dnd": "^9.5.1", - "react-dnd-html5-backend": "^9.5.1", + "react-dnd": "^10.0.2", + "react-dnd-html5-backend": "^10.0.2", "react-dom": "^16.12.0", "react-fullscreenable": "^2.5.1-0", - "react-grid-system": "^4.4.11", + "react-grid-system": "^6.2.1", "react-json-view": "^1.19.1", - "react-notification-system": "^0.2.17", - "react-rnd": "^10.1.4", + "react-notification-system": "^0.3.0", + "react-rnd": "^10.1.6", "react-router": "^5.1.2", "react-router-dom": "^5.1.2", - "react-scripts": "^3.3.0", + "react-scripts": "^3.4.0", "react-sortable-tree": "^2.7.1", "react-svg-pan-zoom": "^3.8.0", - "sass": "^1.24.4", - "superagent": "^5.2.1", - "typescript": "^3.7.4", - "validator": "^11.1.0" + "sass": "^1.25.0", + "superagent": "^5.2.2", + "typescript": "^3.7.5", + "validator": "^12.2.0" }, "devDependencies": { "chai": "^4.2.0" From 53ebdf2de81095d46b87300a7de58d1776198b34 Mon Sep 17 00:00:00 2001 From: Sonja Happ Date: Tue, 18 Feb 2020 12:57:27 +0100 Subject: [PATCH 097/391] dependency cleanup --- package-lock.json | 124 ---------------------------------------------- package.json | 5 -- 2 files changed, 129 deletions(-) diff --git a/package-lock.json b/package-lock.json index 42eea06..6aedb3f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1444,11 +1444,6 @@ "loader-utils": "^1.2.3" } }, - "@types/asap": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@types/asap/-/asap-2.0.0.tgz", - "integrity": "sha512-upIS0Gt9Mc8eEpCbYMZ1K8rhNosfKUtimNcINce+zLwJF5UpM3Vv7yz3S5l/1IX+DxTa8lTkUjqynvjRXyJzsg==" - }, "@types/babel__core": { "version": "7.1.4", "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.4.tgz", @@ -1515,11 +1510,6 @@ "hoist-non-react-statics": "^3.3.0" } }, - "@types/invariant": { - "version": "2.2.31", - "resolved": "https://registry.npmjs.org/@types/invariant/-/invariant-2.2.31.tgz", - "integrity": "sha512-jMlgg9pIURvy9jgBHCjQp/CyBjYHUwj91etVcDdXkFl2CwTFiQlB+8tcsMeXpXf2PFE5X2pjk4Gm43hQSMHAdA==" - }, "@types/istanbul-lib-coverage": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.1.tgz", @@ -1581,11 +1571,6 @@ "csstype": "^2.2.0" } }, - "@types/shallowequal": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@types/shallowequal/-/shallowequal-1.1.1.tgz", - "integrity": "sha512-Lhni3aX80zbpdxRuWhnuYPm8j8UQaa571lHP/xI4W+7BAFhSIhRReXnqjEgT/XzPoXZTJkCqstFMJ8CZTK6IlQ==" - }, "@types/stack-utils": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-1.0.1.tgz", @@ -3204,11 +3189,6 @@ "shallow-clone": "^0.1.2" } }, - "clsx": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/clsx/-/clsx-1.0.4.tgz", - "integrity": "sha512-1mQ557MIZTrL/140j+JVdRM6e31/OA4vTYxXgqIIZlndyfjHpyawKZia1Im05Vp9BWmImkcNrNtFYQMyFcgJDg==" - }, "co": { "version": "4.6.0", "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", @@ -4122,11 +4102,6 @@ "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" }, - "detect-libc": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", - "integrity": "sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=" - }, "detect-newline": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-2.1.0.tgz", @@ -4185,18 +4160,6 @@ "path-type": "^3.0.0" } }, - "dnd-core": { - "version": "9.5.1", - "resolved": "https://registry.npmjs.org/dnd-core/-/dnd-core-9.5.1.tgz", - "integrity": "sha512-/yEWFF2jg51yyB8uA2UbvBr9Qis0Oo/4p9cqHLEKZdxzHHVSPfq0a/ool8NG6dIS6Q4uN+oKGObY0rNWiopJDA==", - "requires": { - "@types/asap": "^2.0.0", - "@types/invariant": "^2.2.30", - "asap": "^2.0.6", - "invariant": "^2.2.4", - "redux": "^4.0.4" - } - }, "dns-equal": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/dns-equal/-/dns-equal-1.0.0.tgz", @@ -5387,14 +5350,6 @@ } } }, - "fibers": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/fibers/-/fibers-4.0.2.tgz", - "integrity": "sha512-FhICi1K4WZh9D6NC18fh2ODF3EWy1z0gzIdV9P7+s2pRjfRBnCkMDJ6x3bV1DkVymKH8HGrQa/FNOBjYvnJ/tQ==", - "requires": { - "detect-libc": "^1.0.3" - } - }, "figgy-pudding": { "version": "3.5.1", "resolved": "https://registry.npmjs.org/figgy-pudding/-/figgy-pudding-3.5.1.tgz", @@ -5647,20 +5602,6 @@ "readable-stream": "^2.0.0" } }, - "frontend-collective-react-dnd-scrollzone": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/frontend-collective-react-dnd-scrollzone/-/frontend-collective-react-dnd-scrollzone-1.0.2.tgz", - "integrity": "sha512-me/D9PZJq9j/sjEjs/OPmm6V6nbaHbhgeQiwrWu0t35lhwAOKWc+QBzzKKcZQeboYTkgE8UvCD9el+5ANp+g5Q==", - "requires": { - "hoist-non-react-statics": "^3.1.0", - "lodash.throttle": "^4.0.1", - "prop-types": "^15.5.9", - "raf": "^3.2.0", - "react": "^16.3.0", - "react-display-name": "^0.2.0", - "react-dom": "^16.3.0" - } - }, "fs-extra": { "version": "8.1.0", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", @@ -6360,11 +6301,6 @@ "resolved": "https://registry.npmjs.org/immer/-/immer-1.10.0.tgz", "integrity": "sha512-O3sR1/opvCDGLEVcvrGTMtLac8GJ5IwZC4puPrLuRj3l7ICKvkmA0vGuU9OW8mV9WIBRnaxp5GJh9IEAaNOoYg==" }, - "immutable": { - "version": "4.0.0-rc.12", - "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.0.0-rc.12.tgz", - "integrity": "sha512-0M2XxkZLx/mi3t8NVwIm1g8nHoEmM9p9UBl/G9k4+hm0kBgOVdMV/B3CY5dQ8qG8qc80NN4gDV4HQv6FTJ5q7A==" - }, "import-cwd": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/import-cwd/-/import-cwd-2.1.0.tgz", @@ -8221,11 +8157,6 @@ "resolved": "https://registry.npmjs.org/lodash.flow/-/lodash.flow-3.5.0.tgz", "integrity": "sha1-h79AKSuM+D5OjOGjrkIJ4gBxZ1o=" }, - "lodash.isequal": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz", - "integrity": "sha1-QVxEePK8wwEgwizhDtMib30+GOA=" - }, "lodash.memoize": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", @@ -8253,11 +8184,6 @@ "lodash._reinterpolate": "^3.0.0" } }, - "lodash.throttle": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/lodash.throttle/-/lodash.throttle-4.1.1.tgz", - "integrity": "sha1-wj6RtxAkKscMN/HhzaknTMOb8vQ=" - }, "lodash.uniq": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", @@ -11459,43 +11385,6 @@ } } }, - "react-sortable-tree": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/react-sortable-tree/-/react-sortable-tree-2.7.1.tgz", - "integrity": "sha512-J78/6AXv9RN0XxoBAIDz8a7aNFdi/Mezcv/9lKNYTYzqAWxEyOTMeqZjpmvwLhM2HRpChTn0yYLHTdRSNHRACw==", - "requires": { - "frontend-collective-react-dnd-scrollzone": "^1.0.2", - "lodash.isequal": "^4.5.0", - "prop-types": "^15.6.1", - "react-dnd": "^9.3.4", - "react-dnd-html5-backend": "^9.3.4", - "react-lifecycles-compat": "^3.0.4", - "react-sortable-tree": "^2.6.0", - "react-virtualized": "^9.19.1" - }, - "dependencies": { - "react-dnd": { - "version": "9.5.1", - "resolved": "https://registry.npmjs.org/react-dnd/-/react-dnd-9.5.1.tgz", - "integrity": "sha512-j2MvziPNLsxXkb3kIJzLvvOv/TQ4sysp6U4CmxAXd4C884dXm/9UGdB7K1wkTW3ZxVpI1K7XhKbX0JgNlPfLcA==", - "requires": { - "@types/hoist-non-react-statics": "^3.3.1", - "@types/shallowequal": "^1.1.1", - "dnd-core": "^9.5.1", - "hoist-non-react-statics": "^3.3.0", - "shallowequal": "^1.1.0" - } - }, - "react-dnd-html5-backend": { - "version": "9.5.1", - "resolved": "https://registry.npmjs.org/react-dnd-html5-backend/-/react-dnd-html5-backend-9.5.1.tgz", - "integrity": "sha512-wUdzjREwLqHxFkA6E+XDVL5IFjRDbBI3SHVKil9n3qrGT5dm2tA2oi1aIALdfMKsu00c+OXA9lz/LuKZCE9KXg==", - "requires": { - "dnd-core": "^9.5.1" - } - } - } - }, "react-svg-pan-zoom": { "version": "3.8.0", "resolved": "https://registry.npmjs.org/react-svg-pan-zoom/-/react-svg-pan-zoom-3.8.0.tgz", @@ -11524,19 +11413,6 @@ "prop-types": "^15.6.2" } }, - "react-virtualized": { - "version": "9.21.2", - "resolved": "https://registry.npmjs.org/react-virtualized/-/react-virtualized-9.21.2.tgz", - "integrity": "sha512-oX7I7KYiUM7lVXQzmhtF4Xg/4UA5duSA+/ZcAvdWlTLFCoFYq1SbauJT5gZK9cZS/wdYR6TPGpX/dqzvTqQeBA==", - "requires": { - "babel-runtime": "^6.26.0", - "clsx": "^1.0.1", - "dom-helpers": "^5.0.0", - "loose-envify": "^1.3.0", - "prop-types": "^15.6.0", - "react-lifecycles-compat": "^3.0.4" - } - }, "read-pkg": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", diff --git a/package.json b/package.json index 516dd92..7cc45c6 100644 --- a/package.json +++ b/package.json @@ -17,14 +17,10 @@ "d3-shape": "^1.3.7", "d3-time-format": "^2.2.3", "es6-promise": "^4.2.8", - "eslint-plugin-flowtype": "^4.6.0", - "fibers": "^4.0.2", "file-saver": "^2.0.2", "flux": "^3.1.3", - "frontend-collective-react-dnd-scrollzone": "^1.0.2", "gaugeJS": "^1.3.7", "handlebars": "^4.7.3", - "immutable": "^4.0.0-rc.12", "jquery": "^3.4.1", "jszip": "^3.2.2", "libcimsvg": "git+https://git.rwth-aachen.de/acs/public/cim/pintura-npm-package.git", @@ -47,7 +43,6 @@ "react-router": "^5.1.2", "react-router-dom": "^5.1.2", "react-scripts": "^3.4.0", - "react-sortable-tree": "^2.7.1", "react-svg-pan-zoom": "^3.8.0", "sass": "^1.25.0", "superagent": "^5.2.2", From 5409e485375123052f1bde66c883e9f73e7cfdcf Mon Sep 17 00:00:00 2001 From: Sonja Happ Date: Tue, 18 Feb 2020 16:29:11 +0100 Subject: [PATCH 098/391] file upload works for simulation model edit dialog (for now without progress bar) --- src/common/api/rest-api.js | 4 +- src/file/file-store.js | 2 +- src/file/files-data-manager.js | 11 +- src/file/select-file.js | 75 +++-- src/scenario/scenario.js | 256 ++++++++++-------- src/simulationmodel/edit-simulation-model.js | 47 +++- src/simulationmodel/simulation-model-store.js | 1 + .../simulation-models-data-manager.js | 12 + 8 files changed, 229 insertions(+), 179 deletions(-) diff --git a/src/common/api/rest-api.js b/src/common/api/rest-api.js index bb92e10..33c30ac 100644 --- a/src/common/api/rest-api.js +++ b/src/common/api/rest-api.js @@ -129,9 +129,9 @@ class RestAPI { }); } - upload(url, data, token, progressCallback) { + upload(url, data, token, progressCallback, objectType, objectID) { return new Promise(function (resolve, reject) { - const req = request.post(url).send(data).on('progress', progressCallback); + const req = request.post(url + "?objectType=" + objectType + "&objectID=" + objectID).send(data); //.on('progress', progressCallback); if (token != null) { req.set('Authorization', "Bearer " + token); diff --git a/src/file/file-store.js b/src/file/file-store.js index f2d3a07..4336ebc 100644 --- a/src/file/file-store.js +++ b/src/file/file-store.js @@ -30,7 +30,7 @@ class FileStore extends ArrayStore { reduce(state, action) { switch (action.type) { case 'files/start-upload': - FilesDataManager.upload(action.data, action.token, action.progressCallback, action.finishedCallback); + FilesDataManager.upload(action.data, action.token, action.progressCallback, action.finishedCallback, action.objectType, action.objectID); return state; case 'files/uploaded': diff --git a/src/file/files-data-manager.js b/src/file/files-data-manager.js index e92aeff..91fb4a6 100644 --- a/src/file/files-data-manager.js +++ b/src/file/files-data-manager.js @@ -28,8 +28,8 @@ class FilesDataManager extends RestDataManager { super('file', '/files'); } - upload(file, token = null, progressCallback = null, finishedCallback = null) { - RestAPI.upload(this.makeURL('/upload'), file, token, progressCallback).then(response => { + upload(file, token = null, progressCallback = null, finishedCallback = null, objectType, objectID) { + RestAPI.upload(this.makeURL(this.url), file, token, progressCallback, objectType, objectID).then(response => { AppDispatcher.dispatch({ type: 'files/uploaded', @@ -38,12 +38,13 @@ class FilesDataManager extends RestDataManager { // Trigger a files reload AppDispatcher.dispatch({ type: 'files/start-load', - token + param: '?objectType=' + objectType + '&objectID=' + objectID, + token: token }); - if (finishedCallback) { + /*if (finishedCallback) { finishedCallback(); - } + }*/ }).catch(error => { AppDispatcher.dispatch({ type: 'files/upload-error', diff --git a/src/file/select-file.js b/src/file/select-file.js index 5e273dc..9602f80 100644 --- a/src/file/select-file.js +++ b/src/file/select-file.js @@ -27,15 +27,24 @@ import FileStore from './file-store'; import LoginStore from '../user/login-store'; import AppDispatcher from '../common/app-dispatcher'; +import Icon from "../common/icon"; class SelectFile extends React.Component { static getStores() { return [ FileStore, LoginStore ]; } - static calculateState() { + + static calculateState(prevState, props) { + + let files = FileStore.getState().filter((file) => { + return (file.simulationModelID === props.objectID) + }); + + console.log("props.objectID=", props.objectID) + return { - files: FileStore.getState(), + files: files, sessionToken: LoginStore.getState().token, selectedFile: '', uploadFile: null, @@ -51,59 +60,47 @@ class SelectFile extends React.Component { }*/ static getDerivedStateFromProps(props, state){ - if (props.value === state.selectedSimulator) { - return null; - } - let selectedSimulator = props.value; - if (selectedSimulator == null) { - if (state.simulators.length > 0) { - selectedSimulator = state.simulators[0]._id; - } else { - selectedSimulator = ''; - } - } - return {selectedSimulator}; } - handleChange = event => { - this.setState({ selectedFile: event.target.value }); + handleChange(event) { - // send file to callback + // send file ID to callback if (this.props.onChange != null) { - const file = this.state.files.find(f => f.id === event.target.value); - - this.props.onChange(file); + this.props.onChange(event.target.value); } }; - selectUploadFile = event => { + selectUploadFile(event) { this.setState({ uploadFile: event.target.files[0] }); }; - startFileUpload = () => { + startFileUpload(){ // upload file const formData = new FormData(); - formData.append(0, this.state.uploadFile); + formData.append("file", this.state.uploadFile); AppDispatcher.dispatch({ type: 'files/start-upload', data: formData, token: this.state.sessionToken, - progressCallback: this.updateUploadProgress, - finishedCallback: this.clearProgress + //progressCallback: this.updateUploadProgress, + //finishedCallback: this.clearProgress, + objectType: this.props.type, + objectID: this.props.objectID, }); }; - updateUploadProgress = event => { + updateUploadProgress = (event) => {// TODO: this callback does not work properly (access to setState) this.setState({ uploadProgress: parseInt(event.percent.toFixed(), 10) }); }; - clearProgress = () => { - // select uploaded file - const selectedFile = this.state.files[this.state.files.length - 1]._id; - this.setState({ selectedFile, uploadProgress: 0 }); + clearProgress = () => { // TODO this callback does not work properly (access to setState) + if (this.props.onChange != null) { + this.props.onChange(this.state.files[this.state.files.length - 1].id); + } + this.setState({ uploadProgress: 0 }); }; render() { @@ -129,27 +126,29 @@ class SelectFile extends React.Component { - this.handleChange(e)}> + this.handleChange(event)}> {fileOptions} - + this.selectUploadFile(event)} /> - - - - + {/* + + + */}
    ; } } let fluxContainerConverter = require('../common/FluxContainerConverter'); -export default Container.create(fluxContainerConverter.convert(SelectFile)); +export default Container.create(fluxContainerConverter.convert(SelectFile), { withProps: true }); diff --git a/src/scenario/scenario.js b/src/scenario/scenario.js index 048643a..fd6171f 100644 --- a/src/scenario/scenario.js +++ b/src/scenario/scenario.js @@ -44,10 +44,11 @@ import SimulatorAction from '../simulator/simulator-action'; import DeleteDialog from '../common/dialogs/delete-dialog'; import EditSimulationModelDialog from "../simulationmodel/edit-simulation-model"; import EditSignalMapping from "../signal/edit-signal-mapping"; +import FileStore from "../file/file-store" class Scenario extends React.Component { static getStores() { - return [ ScenarioStore, SimulationModelStore, DashboardStore, SimulatorStore, LoginStore, SignalStore]; + return [ ScenarioStore, SimulationModelStore, DashboardStore, SimulatorStore, LoginStore, SignalStore, FileStore]; } static calculateState(prevState, props) { @@ -70,6 +71,7 @@ class Scenario extends React.Component { let simulationModels = SimulationModelStore.getState().filter(simmodel => simmodel.scenarioID === parseInt(props.match.params.scenario, 10)); let signals = SignalStore.getState(); + let files = FileStore.getState(); return { @@ -78,6 +80,7 @@ class Scenario extends React.Component { simulationModels, dashboards, signals, + files, simulators: SimulatorStore.getState(), deleteSimulationModelModal: false, @@ -129,14 +132,9 @@ class Scenario extends React.Component { } - static getDerivedStateFromProps(props, state){ - - let simulationModels = SimulationModelStore.getState().filter(simmodel => simmodel.scenarioID === parseInt(props.match.params.scenario, 10)); - - return { - simulationModels: simulationModels - }; - } + /* ############################################## + * Simulation Model modification methods + ############################################## */ addSimulationModel(){ const simulationModel = { @@ -173,54 +171,6 @@ class Scenario extends React.Component { } } - closeDeleteSignalModal(data){ - // data contains the signal to be deleted - if (data){ - - AppDispatcher.dispatch({ - type: 'signals/start-remove', - data: data, - token: this.state.sessionToken - }); - - } - } - - closeNewSignalModal(data){ - //data contains the new signal incl. simulationModelID and direction - if (data) { - AppDispatcher.dispatch({ - type: 'signals/start-add', - data: data, - token: this.state.sessionToken - }); - } - } - - closeEditSignalsModal(data, direction){ - - if( direction === "in") { - this.setState({editInputSignalsModal: false}); - } else if( direction === "out"){ - this.setState({editOutputSignalsModal: false}); - } else { - return; // no valid direction - } - - if (data){ - //data is an array of signals - for (let sig of data) { - //dispatch changes to signals - AppDispatcher.dispatch({ - type: 'signals/start-edit', - data: sig, - token: this.state.sessionToken, - }); - } - } - - } - closeDeleteSimulationModelModal(confirmDelete) { this.setState({ deleteSimulationModelModal: false }); @@ -259,76 +209,15 @@ class Scenario extends React.Component { }); } - closeNewDashboardModal(data) { - this.setState({ newDashboardModal : false }); - - if (data) { - AppDispatcher.dispatch({ - type: 'dashboards/start-add', - data, - token: this.state.sessionToken, - }); - } - } - - closeDeleteDashboardModal(confirmDelete){ - this.setState({ deleteDashboardModal: false }); - - if (confirmDelete === false) { - return; - } - - AppDispatcher.dispatch({ - type: 'dashboards/start-remove', - data: this.state.modalDashboardData, - token: this.state.sessionToken, - }); - } - - closeImportDashboardModal(data) { - this.setState({ importDashboardModal: false }); - - if (data) { - AppDispatcher.dispatch({ - type: 'dashboards/start-add', - data, - token: this.state.sessionToken, - }); - } - } - - getSimulatorName(simulatorId) { - for (let simulator of this.state.simulators) { - if (simulator.id === simulatorId) { - return _.get(simulator, 'properties.name') || _.get(simulator, 'rawProperties.name') || simulator.uuid; - } - } - } - exportModel(index) { // filter properties const model = Object.assign({}, this.state.simulationModels[index]); - //delete model.simulator; - //delete model.scenario; - // TODO get elements recursively - // show save dialog const blob = new Blob([JSON.stringify(model, null, 2)], { type: 'application/json' }); FileSaver.saveAs(blob, 'simulation model - ' + model.name + '.json'); } - exportDashboard(index) { - // filter properties - const dashboard = Object.assign({}, this.state.dashboards[index]); - - // TODO get elements recursively - - // show save dialog - const blob = new Blob([JSON.stringify(dashboard, null, 2)], { type: 'application/json' }); - FileSaver.saveAs(blob, 'dashboard - ' + dashboard.name + '.json'); - } - onSimulationModelChecked(index, event) { const selectedSimulationModels = Object.assign([], this.state.selectedSimulationModels); for (let key in selectedSimulationModels) { @@ -379,9 +268,139 @@ class Scenario extends React.Component { token: this.state.sessionToken }); } + }; + + getSimulatorName(simulatorId) { + for (let simulator of this.state.simulators) { + if (simulator.id === simulatorId) { + return _.get(simulator, 'properties.name') || _.get(simulator, 'rawProperties.name') || simulator.uuid; + } + } } + /* ############################################## + * Dashboard modification methods + ############################################## */ + + closeNewDashboardModal(data) { + this.setState({ newDashboardModal : false }); + + if (data) { + AppDispatcher.dispatch({ + type: 'dashboards/start-add', + data, + token: this.state.sessionToken, + }); + } + } + + closeDeleteDashboardModal(confirmDelete){ + this.setState({ deleteDashboardModal: false }); + + if (confirmDelete === false) { + return; + } + + AppDispatcher.dispatch({ + type: 'dashboards/start-remove', + data: this.state.modalDashboardData, + token: this.state.sessionToken, + }); + } + + closeImportDashboardModal(data) { + this.setState({ importDashboardModal: false }); + + if (data) { + AppDispatcher.dispatch({ + type: 'dashboards/start-add', + data, + token: this.state.sessionToken, + }); + } + } + + exportDashboard(index) { + // filter properties + const dashboard = Object.assign({}, this.state.dashboards[index]); + + // TODO get elements recursively + + // show save dialog + const blob = new Blob([JSON.stringify(dashboard, null, 2)], { type: 'application/json' }); + FileSaver.saveAs(blob, 'dashboard - ' + dashboard.name + '.json'); + } + + /* ############################################## + * Signal modification methods + ############################################## */ + + closeDeleteSignalModal(data){ + // data contains the signal to be deleted + if (data){ + + AppDispatcher.dispatch({ + type: 'signals/start-remove', + data: data, + token: this.state.sessionToken + }); + + } + } + + closeNewSignalModal(data){ + //data contains the new signal incl. simulationModelID and direction + if (data) { + AppDispatcher.dispatch({ + type: 'signals/start-add', + data: data, + token: this.state.sessionToken + }); + } + } + + closeEditSignalsModal(data, direction){ + + if( direction === "in") { + this.setState({editInputSignalsModal: false}); + } else if( direction === "out"){ + this.setState({editOutputSignalsModal: false}); + } else { + return; // no valid direction + } + + if (data){ + //data is an array of signals + for (let sig of data) { + //dispatch changes to signals + AppDispatcher.dispatch({ + type: 'signals/start-edit', + data: sig, + token: this.state.sessionToken, + }); + } + } + + } + + /* ############################################## + * File modification methods + ############################################## */ + + getFileName(id){ + for (let file of this.state.files) { + if (file.id === id) { + return file.name; + } + } + } + + /* ############################################## + * Render method + ############################################## */ + render() { + const buttonStyle = { marginLeft: '10px' }; @@ -394,6 +413,7 @@ class Scenario extends React.Component { this.onSimulationModelChecked(index, event)} width='30' /> + this.getFileName(selectedModelFileID)}/> - {/* - this.handleChange(e)} - value={this.state.selectedFile}/> - < SelectFile type='configuration' name='Configuration' onChange={(e) => this.handleChange(e)} value={this.state.configuration} /> - */} + + this.handleSelectedModelFileChange(e)} value={this.state.selectedModelFileID} objectID={this.props.simulationModel.id}/> + + + {/* this.handleChange(e)} value={this.state.configuration} />*/} + + diff --git a/src/simulationmodel/simulation-model-store.js b/src/simulationmodel/simulation-model-store.js index 5ef17a3..fe90662 100644 --- a/src/simulationmodel/simulation-model-store.js +++ b/src/simulationmodel/simulation-model-store.js @@ -34,6 +34,7 @@ class SimulationModelStore extends ArrayStore { case 'simulationModels/loaded': SimulationModelsDataManager.loadSignals(action.token, action.data); + SimulationModelsDataManager.loadFiles(action.token, action.data); return super.reduce(state, action); default: diff --git a/src/simulationmodel/simulation-models-data-manager.js b/src/simulationmodel/simulation-models-data-manager.js index b53c0d9..c9554a8 100644 --- a/src/simulationmodel/simulation-models-data-manager.js +++ b/src/simulationmodel/simulation-models-data-manager.js @@ -68,6 +68,18 @@ class SimulationModelDataManager extends RestDataManager { } } + + loadFiles(token, models){ + for (let model of models) { + // request files of simulation model + RestAPI.get(this.makeURL('/files?objectType=model&objectID=' + model.id), token).then(response => { + AppDispatcher.dispatch({ + type: 'files/loaded', + data: response.files + }); + }); + } + } } export default new SimulationModelDataManager(); From 6fe522fe9a0186ba8a2dd11ea2652152a58392d1 Mon Sep 17 00:00:00 2001 From: Sonja Happ Date: Tue, 18 Feb 2020 16:42:10 +0100 Subject: [PATCH 099/391] make the CI happy --- src/file/select-file.js | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/src/file/select-file.js b/src/file/select-file.js index 9602f80..26f7689 100644 --- a/src/file/select-file.js +++ b/src/file/select-file.js @@ -21,7 +21,7 @@ import React from 'react'; import { Container } from 'flux/utils'; -import { FormGroup, FormControl, FormLabel, Button, ProgressBar, Col } from 'react-bootstrap'; +import { FormGroup, FormControl, FormLabel, Button, Col } from 'react-bootstrap'; import FileStore from './file-store'; import LoginStore from '../user/login-store'; @@ -105,19 +105,19 @@ class SelectFile extends React.Component { render() { - let fileOptions; - if (this.state.files.length > 0){ - fileOptions = this.state.files.map(f => - - ); - } else { - fileOptions = - } + let fileOptions; + if (this.state.files.length > 0){ + fileOptions = this.state.files.map(f => + + ); + } else { + fileOptions = + } - const progressBarStyle = { + /*const progressBarStyle = { marginLeft: '100px', marginTop: '-25px' - }; + };*/ return
    From 2ceb6d5b4b0eb66b88baad12cf0798f178e70ea3 Mon Sep 17 00:00:00 2001 From: Sonja Happ Date: Tue, 18 Feb 2020 16:52:45 +0100 Subject: [PATCH 100/391] remove typos and add some TODOs --- src/widget/edit-widget.js | 2 +- src/widget/widget.js | 8 +++++--- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/src/widget/edit-widget.js b/src/widget/edit-widget.js index f039f48..cabe814 100644 --- a/src/widget/edit-widget.js +++ b/src/widget/edit-widget.js @@ -58,7 +58,7 @@ class EditWidgetDialog extends React.Component { assignAspectRatio(changeObject, fileId) { // get aspect ratio of file - const file = this.props.files.find(element => element._id === fileId); + const file = this.props.files.find(element => element.id === fileId); // scale width to match aspect const aspectRatio = file.dimensions.width / file.dimensions.height; diff --git a/src/widget/widget.js b/src/widget/widget.js index 3d9ff33..b227f41 100644 --- a/src/widget/widget.js +++ b/src/widget/widget.js @@ -89,10 +89,12 @@ class Widget extends React.Component { param: '?objectID=1&objectType=widget' });*/ + // TODO no not load simulation models here, since they are loaded via the scenario, pass them as props + AppDispatcher.dispatch({ type: 'simulationModels/start-load', token: this.state.sessionToken, - param: '?scenarioID=1' + param: '?scenarioID=1' // TODO do not hardcode scenarioID! }); } @@ -101,7 +103,7 @@ class Widget extends React.Component { let simulationModel = null; for (let model of this.state.simulationModels) { - if (model._id !== widget.simulationModel) { + if (model.id !== widget.simulationModel) { continue; } @@ -120,7 +122,7 @@ class Widget extends React.Component { let simulationModel = null; for (let model of this.state.simulationModels) { - if (model._id !== widget.simulationModel) { + if (model.id !== widget.simulationModel) { continue; } From 800428b7bfa735169ca7bc7e9cef797af8e92896 Mon Sep 17 00:00:00 2001 From: Sonja Happ Date: Wed, 19 Feb 2020 08:53:50 +0100 Subject: [PATCH 101/391] remove obsolete file, mark one file as obsolete --- src/app.js | 2 - src/common/editable-header.js | 2 +- src/simulationmodel/simulation-model.js | 243 ------------------------ 3 files changed, 1 insertion(+), 246 deletions(-) delete mode 100644 src/simulationmodel/simulation-model.js diff --git a/src/app.js b/src/app.js index 5f0cadc..d77e02f 100644 --- a/src/app.js +++ b/src/app.js @@ -44,7 +44,6 @@ import Simulators from './simulator/simulators'; import Dashboard from './dashboard/dashboard'; import Scenarios from './scenario/scenarios'; import Scenario from './scenario/scenario'; -import SimulationModel from './simulationmodel/simulation-model'; import Users from './user/users'; import User from './user/user'; @@ -137,7 +136,6 @@ class App extends React.Component { - diff --git a/src/common/editable-header.js b/src/common/editable-header.js index 47aba96..b5e6a2f 100644 --- a/src/common/editable-header.js +++ b/src/common/editable-header.js @@ -18,7 +18,7 @@ * You should have received a copy of the GNU General Public License * along with VILLASweb. If not, see . ******************************************************************************/ - +// TODO remove this file (not used!) import React from 'react'; import PropTypes from 'prop-types'; import { FormControl, Button } from 'react-bootstrap'; diff --git a/src/simulationmodel/simulation-model.js b/src/simulationmodel/simulation-model.js deleted file mode 100644 index b1e6fea..0000000 --- a/src/simulationmodel/simulation-model.js +++ /dev/null @@ -1,243 +0,0 @@ -/** - * File: simulationModel.js - * Author: Markus Grigull - * Date: 10.05.2018 - * - * This file is part of VILLASweb. - * - * VILLASweb is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * VILLASweb is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with VILLASweb. If not, see . - ******************************************************************************/ - -import React from 'react'; -import { Container } from 'flux/utils'; -import { Button, Col, Form, FormLabel, FormGroup } from 'react-bootstrap'; - -import SimulationModelStore from './simulation-model-store'; -import LoginStore from '../user/login-store'; -import AppDispatcher from '../common/app-dispatcher'; - -import SelectFile from '../file/select-file'; -import EditSignalMapping from '../signal/edit-signal-mapping'; -import EditableHeader from '../common/editable-header'; -import ParametersEditor from '../common/parameters-editor'; -import SimulatorStore from "../simulator/simulator-store"; -import SignalStore from "../signal/signal-store"; -import FileStore from "../file/file-store" - - -class SimulationModel extends React.Component { - static getStores() { - return [ SimulationModelStore, LoginStore ]; - } - - static calculateState(prevState, props) { - - // get selected simulation model - const sessionToken = LoginStore.getState().token; - - let simulationModel = SimulationModelStore.getState().find(m => m.id === parseInt(props.match.params.simulationModel, 10)); - if (simulationModel == null) { - AppDispatcher.dispatch({ - type: 'simulationModels/start-load', - data: props.match.params.simulationModel, - token: sessionToken - }); - } - - // signals and files of simulation model - // TODO add direction of signals to find operation - let inputSignals = SignalStore.getState().find(sig => sig.simulationModelID === parseInt(props.match.params.simulationModel, 10)); - let outputSignals = SignalStore.getState().find(sig => sig.simulationModelID === parseInt(props.match.params.simulationModel, 10)); - - - let files = FileStore.getState().find(f => f.simulationModelID === parseInt(props.match.params.simulationModel, 10)); - - - return { - simulationModel, - inputSignals, - outputSignals, - files, - sessionToken, - signals: SignalStore.getState(), - simulators: SimulatorStore.getState(), - selectedFile: null, - - }; - } - - componentDidMount() { - //load selected simulationModel - AppDispatcher.dispatch({ - type: 'simulationModels/start-load', - data: this.state.simulationModel.id, - token: this.state.sessionToken - }); - - // load input signals for selected simulation model - // AppDispatcher.dispatch({ - // type: 'signals/start-load', - // token: this.state.sessionToken, - // param: '?direction=in&modelID=' + this.state.simulationModel.id, - // }); - // - // // load output signals for selected simulation model - // AppDispatcher.dispatch({ - // type: 'signals/start-load', - // token: this.state.sessionToken, - // param: '?direction=out&modelID=' + this.state.simulationModel.id, - // }); - - // load files for selected simulation model - // AppDispatcher.dispatch({ - // type: 'files/start-load', - // token: this.state.sessionToken, - // param: '?objectType=model&objectID=' + this.state.simulationModel.id, - // }); - - // load simulators - AppDispatcher.dispatch({ - type: 'simulators/start-load', - token: this.state.sessionToken, - }); - } - - submitForm = event => { - event.preventDefault(); - } - - saveChanges = () => { - AppDispatcher.dispatch({ - type: 'simulationModels/start-edit', - data: this.state.simulationModel, - token: this.state.sessionToken - }); - - this.props.history.push('/scenarios/' + this.state.simulationModel.scenarioID); - } - - discardChanges = () => { - this.props.history.push('/scenarios/' + this.state.simulationModel.scenarioID); - } - - handleSimulatorChange = simulator => { - const simulationModel = this.state.simulationModel; - - simulationModel.simulator = simulator; - - this.setState({ simulationModel }); - } - - handleModelChange = file => { - console.log(file); - } - - handleConfigurationChange = file => { - console.log(file); - } - - handleOutputMappingChange = (length, signals) => { - const simulationModel = this.state.simulationModel; - - simulationModel.outputMapping = signals; - simulationModel.outputLength = length; - - this.setState({ simulationModel }); - } - - handleInputMappingChange = (length, signals) => { - const simulationModel = this.state.simulationModel; - - simulationModel.inputMapping = signals; - simulationModel.inputLength = length; - - this.setState({ simulationModel }); - } - - handleTitleChange = title => { - const simulationModel = this.state.simulationModel; - - simulationModel.name = title; - - this.setState({ simulationModel }); - } - - handleStartParametersChange = startParameters => { - const simulationModel = this.state.simulationModel; - - simulationModel.startParameters = startParameters; - - this.setState({ simulationModel }); - } - - render() { - const buttonStyle = { - marginRight: '10px' - }; - console.log("OutputSignals: ", this.state.outputSignals); - let outputSignals = null; - if (this.state.outputSignals != null){ - outputSignals = Object.keys(this.state.outputSignals).map(key => {return this.state.outputSignals[key]}); - console.log("OutputSignals Array", outputSignals); - } - let inputSignals = null; - console.log("InputSignals: ", this.state.inputSignals); - if (this.state.inputSignals != null){ - inputSignals = Object.keys(this.state.inputSignals).map(key => {return this.state.inputSignals[key]}); - console.log("InputSignals Array", inputSignals); - } - - console.log("All SIGNALS: ", this.state.signals); - - return
    - - -
    - - - - - - -
    - - Start Parameters - - -
    - - - - - - - - - - - - - - -
    - - - - - ; - } -} - -let fluxContainerConverter = require('../common/FluxContainerConverter'); -export default Container.create(fluxContainerConverter.convert(SimulationModel), { withProps: true }); From 937bda8f1c7af2290d72cf0c905813869b50c447 Mon Sep 17 00:00:00 2001 From: Sonja Happ Date: Wed, 19 Feb 2020 09:04:50 +0100 Subject: [PATCH 102/391] re-organize widget and dashboard files --- .../widget/edit-widget-control-creator.js | 32 +++++++++---------- src/dashboard/dashboard.js | 9 +++--- src/{dashboard => widget}/dropzone.js | 0 .../edit-widget-aspect-control.js | 0 .../edit-widget-checkbox-control.js | 0 .../edit-widget-color-control.js | 0 .../edit-widget-color-zones-control.js | 6 ++-- .../edit-widget-control-creator.js | 0 .../edit-widget-html-content.js | 0 .../edit-widget-image-control.js | 2 +- .../edit-widget-min-max-control.js | 0 .../edit-widget-number-control.js | 0 .../edit-widget-orientation.js | 2 +- .../edit-widget-parameters-control.js | 2 +- .../edit-widget-signal-control.js | 0 .../edit-widget-signals-control.js | 0 .../edit-widget-simulation-control.js | 0 .../edit-widget-text-control.js | 0 .../edit-widget-text-size-control.js | 0 .../edit-widget-time-control.js | 0 src/widget/{ => edit-widget}/edit-widget.js | 2 +- src/{dashboard => widget}/grid.js | 0 src/{dashboard => widget}/toolbox-item.js | 0 src/{dashboard => widget}/widget-area.js | 2 +- .../widget-context-menu.js | 2 +- src/{dashboard => widget}/widget-toolbox.js | 0 src/widget/widgets/box.js | 2 +- src/widget/widgets/label.js | 2 +- src/widget/widgets/lamp.js | 2 +- 29 files changed, 32 insertions(+), 33 deletions(-) rename src/{dashboard => widget}/dropzone.js (100%) rename src/widget/{ => edit-widget}/edit-widget-aspect-control.js (100%) rename src/widget/{ => edit-widget}/edit-widget-checkbox-control.js (100%) rename src/widget/{ => edit-widget}/edit-widget-color-control.js (100%) rename src/widget/{ => edit-widget}/edit-widget-color-zones-control.js (96%) rename src/widget/{ => edit-widget}/edit-widget-control-creator.js (100%) rename src/widget/{ => edit-widget}/edit-widget-html-content.js (100%) rename src/widget/{ => edit-widget}/edit-widget-image-control.js (98%) rename src/widget/{ => edit-widget}/edit-widget-min-max-control.js (100%) rename src/widget/{ => edit-widget}/edit-widget-number-control.js (100%) rename src/widget/{ => edit-widget}/edit-widget-orientation.js (98%) rename src/widget/{ => edit-widget}/edit-widget-parameters-control.js (96%) rename src/widget/{ => edit-widget}/edit-widget-signal-control.js (100%) rename src/widget/{ => edit-widget}/edit-widget-signals-control.js (100%) rename src/widget/{ => edit-widget}/edit-widget-simulation-control.js (100%) rename src/widget/{ => edit-widget}/edit-widget-text-control.js (100%) rename src/widget/{ => edit-widget}/edit-widget-text-size-control.js (100%) rename src/widget/{ => edit-widget}/edit-widget-time-control.js (100%) rename src/widget/{ => edit-widget}/edit-widget.js (98%) rename src/{dashboard => widget}/grid.js (100%) rename src/{dashboard => widget}/toolbox-item.js (100%) rename src/{dashboard => widget}/widget-area.js (97%) rename src/{dashboard => widget}/widget-context-menu.js (99%) rename src/{dashboard => widget}/widget-toolbox.js (100%) diff --git a/src/__tests__/widget/edit-widget-control-creator.js b/src/__tests__/widget/edit-widget-control-creator.js index fb5cfab..46b00bc 100644 --- a/src/__tests__/widget/edit-widget-control-creator.js +++ b/src/__tests__/widget/edit-widget-control-creator.js @@ -1,22 +1,22 @@ import { expect } from 'chai'; -import createControls from '../../widget/edit-widget-control-creator'; -import EditWidgetTextControl from '../../widget/edit-widget-text-control'; -import EditWidgetColorControl from '../../widget/edit-widget-color-control'; -import EditWidgetTimeControl from '../../widget/edit-widget-time-control'; -import EditImageWidgetControl from '../../widget/edit-widget-image-control'; -import EditWidgetSimulationControl from '../../widget/edit-widget-simulation-control'; -import EditWidgetSignalControl from '../../widget/edit-widget-signal-control'; -import EditWidgetSignalsControl from '../../widget/edit-widget-signals-control'; -import EditWidgetOrientation from '../../widget/edit-widget-orientation'; -import EditWidgetTextSizeControl from '../../widget/edit-widget-text-size-control'; -import EditWidgetAspectControl from '../../widget/edit-widget-aspect-control'; -import EditWidgetCheckboxControl from '../../widget/edit-widget-checkbox-control'; -import EditWidgetMinMaxControl from '../../widget/edit-widget-min-max-control'; -import EditWidgetColorZonesControl from '../../widget/edit-widget-color-zones-control'; -import EditWidgetHTMLContent from '../../widget/edit-widget-html-content'; -import EditWidgetNumberControl from '../../widget/edit-widget-number-control'; +import createControls from '../../widget/edit-widget/edit-widget-control-creator'; +import EditWidgetTextControl from '../../widget/edit-widget/edit-widget-text-control'; +import EditWidgetColorControl from '../../widget/edit-widget/edit-widget-color-control'; +import EditWidgetTimeControl from '../../widget/edit-widget/edit-widget-time-control'; +import EditImageWidgetControl from '../../widget/edit-widget/edit-widget-image-control'; +import EditWidgetSimulationControl from '../../widget/edit-widget/edit-widget-simulation-control'; +import EditWidgetSignalControl from '../../widget/edit-widget/edit-widget-signal-control'; +import EditWidgetSignalsControl from '../../widget/edit-widget/edit-widget-signals-control'; +import EditWidgetOrientation from '../../widget/edit-widget/edit-widget-orientation'; +import EditWidgetTextSizeControl from '../../widget/edit-widget/edit-widget-text-size-control'; +import EditWidgetAspectControl from '../../widget/edit-widget/edit-widget-aspect-control'; +import EditWidgetCheckboxControl from '../../widget/edit-widget/edit-widget-checkbox-control'; +import EditWidgetMinMaxControl from '../../widget/edit-widget/edit-widget-min-max-control'; +import EditWidgetColorZonesControl from '../../widget/edit-widget/edit-widget-color-zones-control'; +import EditWidgetHTMLContent from '../../widget/edit-widget/edit-widget-html-content'; +import EditWidgetNumberControl from '../../widget/edit-widget/edit-widget-number-control'; describe('edit widget control creator', () => { it('should not return null', () => { diff --git a/src/dashboard/dashboard.js b/src/dashboard/dashboard.js index 763b827..cdb1924 100644 --- a/src/dashboard/dashboard.js +++ b/src/dashboard/dashboard.js @@ -25,11 +25,10 @@ import Fullscreenable from 'react-fullscreenable'; import classNames from 'classnames'; import Widget from '../widget/widget'; -import EditWidget from '../widget/edit-widget'; - -import WidgetContextMenu from './widget-context-menu'; -import WidgetToolbox from './widget-toolbox'; -import WidgetArea from './widget-area'; +import EditWidget from '../widget/edit-widget/edit-widget'; +import WidgetContextMenu from '../widget/widget-context-menu'; +import WidgetToolbox from '../widget/widget-toolbox'; +import WidgetArea from '../widget/widget-area'; import DashboardButtonGroup from './dashboard-button-group'; import LoginStore from '../user/login-store'; diff --git a/src/dashboard/dropzone.js b/src/widget/dropzone.js similarity index 100% rename from src/dashboard/dropzone.js rename to src/widget/dropzone.js diff --git a/src/widget/edit-widget-aspect-control.js b/src/widget/edit-widget/edit-widget-aspect-control.js similarity index 100% rename from src/widget/edit-widget-aspect-control.js rename to src/widget/edit-widget/edit-widget-aspect-control.js diff --git a/src/widget/edit-widget-checkbox-control.js b/src/widget/edit-widget/edit-widget-checkbox-control.js similarity index 100% rename from src/widget/edit-widget-checkbox-control.js rename to src/widget/edit-widget/edit-widget-checkbox-control.js diff --git a/src/widget/edit-widget-color-control.js b/src/widget/edit-widget/edit-widget-color-control.js similarity index 100% rename from src/widget/edit-widget-color-control.js rename to src/widget/edit-widget/edit-widget-color-control.js diff --git a/src/widget/edit-widget-color-zones-control.js b/src/widget/edit-widget/edit-widget-color-zones-control.js similarity index 96% rename from src/widget/edit-widget-color-zones-control.js rename to src/widget/edit-widget/edit-widget-color-zones-control.js index 741d43f..b1d002f 100644 --- a/src/widget/edit-widget-color-zones-control.js +++ b/src/widget/edit-widget/edit-widget-color-zones-control.js @@ -23,9 +23,9 @@ import React from 'react'; import { FormGroup, FormLabel, Button } from 'react-bootstrap'; -import Icon from '../common/icon'; -import Table from '../common/table'; -import TableColumn from '../common/table-column'; +import Icon from '../../common/icon'; +import Table from '../../common/table'; +import TableColumn from '../../common/table-column'; class EditWidgetColorZonesControl extends React.Component { constructor(props) { diff --git a/src/widget/edit-widget-control-creator.js b/src/widget/edit-widget/edit-widget-control-creator.js similarity index 100% rename from src/widget/edit-widget-control-creator.js rename to src/widget/edit-widget/edit-widget-control-creator.js diff --git a/src/widget/edit-widget-html-content.js b/src/widget/edit-widget/edit-widget-html-content.js similarity index 100% rename from src/widget/edit-widget-html-content.js rename to src/widget/edit-widget/edit-widget-html-content.js diff --git a/src/widget/edit-widget-image-control.js b/src/widget/edit-widget/edit-widget-image-control.js similarity index 98% rename from src/widget/edit-widget-image-control.js rename to src/widget/edit-widget/edit-widget-image-control.js index 8fdbe60..204d85e 100644 --- a/src/widget/edit-widget-image-control.js +++ b/src/widget/edit-widget/edit-widget-image-control.js @@ -22,7 +22,7 @@ import React from 'react'; import { FormGroup, FormControl, FormLabel, Button, ProgressBar } from 'react-bootstrap'; -import AppDispatcher from '../common/app-dispatcher'; +import AppDispatcher from '../../common/app-dispatcher'; class EditImageWidgetControl extends React.Component { constructor(props) { diff --git a/src/widget/edit-widget-min-max-control.js b/src/widget/edit-widget/edit-widget-min-max-control.js similarity index 100% rename from src/widget/edit-widget-min-max-control.js rename to src/widget/edit-widget/edit-widget-min-max-control.js diff --git a/src/widget/edit-widget-number-control.js b/src/widget/edit-widget/edit-widget-number-control.js similarity index 100% rename from src/widget/edit-widget-number-control.js rename to src/widget/edit-widget/edit-widget-number-control.js diff --git a/src/widget/edit-widget-orientation.js b/src/widget/edit-widget/edit-widget-orientation.js similarity index 98% rename from src/widget/edit-widget-orientation.js rename to src/widget/edit-widget/edit-widget-orientation.js index c5fb442..dc8fd49 100644 --- a/src/widget/edit-widget-orientation.js +++ b/src/widget/edit-widget/edit-widget-orientation.js @@ -22,7 +22,7 @@ import React, { Component } from 'react'; import { FormGroup, Col, Row, FormCheck, FormLabel } from 'react-bootstrap'; -import WidgetSlider from './widgets/slider'; +import WidgetSlider from '../widgets/slider'; class EditWidgetOrientation extends Component { constructor(props) { diff --git a/src/widget/edit-widget-parameters-control.js b/src/widget/edit-widget/edit-widget-parameters-control.js similarity index 96% rename from src/widget/edit-widget-parameters-control.js rename to src/widget/edit-widget/edit-widget-parameters-control.js index 8fc37f8..3a817e3 100644 --- a/src/widget/edit-widget-parameters-control.js +++ b/src/widget/edit-widget/edit-widget-parameters-control.js @@ -21,7 +21,7 @@ import React, { Component } from 'react'; import { FormGroup, FormLabel } from 'react-bootstrap'; -import ParametersEditor from '../common/parameters-editor'; +import ParametersEditor from '../../common/parameters-editor'; class EditWidgetParametersControl extends Component { constructor(props) { diff --git a/src/widget/edit-widget-signal-control.js b/src/widget/edit-widget/edit-widget-signal-control.js similarity index 100% rename from src/widget/edit-widget-signal-control.js rename to src/widget/edit-widget/edit-widget-signal-control.js diff --git a/src/widget/edit-widget-signals-control.js b/src/widget/edit-widget/edit-widget-signals-control.js similarity index 100% rename from src/widget/edit-widget-signals-control.js rename to src/widget/edit-widget/edit-widget-signals-control.js diff --git a/src/widget/edit-widget-simulation-control.js b/src/widget/edit-widget/edit-widget-simulation-control.js similarity index 100% rename from src/widget/edit-widget-simulation-control.js rename to src/widget/edit-widget/edit-widget-simulation-control.js diff --git a/src/widget/edit-widget-text-control.js b/src/widget/edit-widget/edit-widget-text-control.js similarity index 100% rename from src/widget/edit-widget-text-control.js rename to src/widget/edit-widget/edit-widget-text-control.js diff --git a/src/widget/edit-widget-text-size-control.js b/src/widget/edit-widget/edit-widget-text-size-control.js similarity index 100% rename from src/widget/edit-widget-text-size-control.js rename to src/widget/edit-widget/edit-widget-text-size-control.js diff --git a/src/widget/edit-widget-time-control.js b/src/widget/edit-widget/edit-widget-time-control.js similarity index 100% rename from src/widget/edit-widget-time-control.js rename to src/widget/edit-widget/edit-widget-time-control.js diff --git a/src/widget/edit-widget.js b/src/widget/edit-widget/edit-widget.js similarity index 98% rename from src/widget/edit-widget.js rename to src/widget/edit-widget/edit-widget.js index cabe814..1a2a0f6 100644 --- a/src/widget/edit-widget.js +++ b/src/widget/edit-widget/edit-widget.js @@ -22,7 +22,7 @@ import React from 'react'; //import { FormGroup, FormControl, FormLabel } from 'react-bootstrap'; -import Dialog from '../common/dialogs/dialog'; +import Dialog from '../../common/dialogs/dialog'; import CreateControls from './edit-widget-control-creator'; diff --git a/src/dashboard/grid.js b/src/widget/grid.js similarity index 100% rename from src/dashboard/grid.js rename to src/widget/grid.js diff --git a/src/dashboard/toolbox-item.js b/src/widget/toolbox-item.js similarity index 100% rename from src/dashboard/toolbox-item.js rename to src/widget/toolbox-item.js diff --git a/src/dashboard/widget-area.js b/src/widget/widget-area.js similarity index 97% rename from src/dashboard/widget-area.js rename to src/widget/widget-area.js index 8a06382..69b0367 100644 --- a/src/dashboard/widget-area.js +++ b/src/widget/widget-area.js @@ -25,7 +25,7 @@ import PropTypes from 'prop-types'; import Dropzone from './dropzone'; import Grid from './grid'; -import WidgetFactory from '../widget/widget-factory'; +import WidgetFactory from './widget-factory'; class WidgetArea extends React.Component { snapToGrid(value) { diff --git a/src/dashboard/widget-context-menu.js b/src/widget/widget-context-menu.js similarity index 99% rename from src/dashboard/widget-context-menu.js rename to src/widget/widget-context-menu.js index dcf444f..ea79b92 100644 --- a/src/dashboard/widget-context-menu.js +++ b/src/widget/widget-context-menu.js @@ -22,7 +22,7 @@ import React from 'react'; import PropTypes from 'prop-types'; import { Menu, Item, Separator, MenuProvider } from 'react-contexify'; -import Widget from '../widget/widget'; +import Widget from './widget'; class WidgetContextMenu extends React.Component { editWidget = event => { diff --git a/src/dashboard/widget-toolbox.js b/src/widget/widget-toolbox.js similarity index 100% rename from src/dashboard/widget-toolbox.js rename to src/widget/widget-toolbox.js diff --git a/src/widget/widgets/box.js b/src/widget/widgets/box.js index db06848..e7c350c 100644 --- a/src/widget/widgets/box.js +++ b/src/widget/widgets/box.js @@ -22,7 +22,7 @@ import React, { Component } from 'react'; -import EditWidgetColorControl from '../edit-widget-color-control'; +import EditWidgetColorControl from '../edit-widget/edit-widget-color-control'; class WidgetBox extends Component { render() { diff --git a/src/widget/widgets/label.js b/src/widget/widgets/label.js index ed4400d..1c59f70 100644 --- a/src/widget/widgets/label.js +++ b/src/widget/widgets/label.js @@ -21,7 +21,7 @@ import React, { Component } from 'react'; -import EditWidgetColorControl from '../edit-widget-color-control'; +import EditWidgetColorControl from '../edit-widget/edit-widget-color-control'; class WidgetLabel extends Component { render() { diff --git a/src/widget/widgets/lamp.js b/src/widget/widgets/lamp.js index 88845cd..061803c 100644 --- a/src/widget/widgets/lamp.js +++ b/src/widget/widgets/lamp.js @@ -21,7 +21,7 @@ import React, { Component } from 'react'; -import EditWidgetColorControl from '../edit-widget-color-control'; +import EditWidgetColorControl from '../edit-widget/edit-widget-color-control'; class WidgetLamp extends Component { constructor(props) { From 87be9069f191ed4679ec8b84a4e327a5740a5a6a Mon Sep 17 00:00:00 2001 From: Sonja Happ Date: Wed, 19 Feb 2020 15:04:37 +0100 Subject: [PATCH 103/391] WIP resolving dependencies of widgets on simulation models (use signals instead) --- src/dashboard/dashboard.js | 21 +++- .../edit-widget-control-creator.js | 104 ++++++++---------- .../edit-widget/edit-widget-signal-control.js | 23 +--- .../edit-widget-signals-control.js | 27 ++--- src/widget/edit-widget/edit-widget.js | 60 +++++----- src/widget/widget-area.js | 3 +- src/widget/widget-factory.js | 27 +---- src/widget/widget.js | 70 ++++++------ src/widget/widgets/custom-action.js | 7 +- src/widget/widgets/gauge.js | 42 ++++--- src/widget/widgets/input.js | 23 ++-- src/widget/widgets/lamp.js | 12 +- src/widget/widgets/slider.js | 23 ++-- src/widget/widgets/table.js | 28 +++-- src/widget/widgets/value.js | 27 +++-- 15 files changed, 244 insertions(+), 253 deletions(-) diff --git a/src/dashboard/dashboard.js b/src/dashboard/dashboard.js index cdb1924..288ac70 100644 --- a/src/dashboard/dashboard.js +++ b/src/dashboard/dashboard.js @@ -33,7 +33,8 @@ import DashboardButtonGroup from './dashboard-button-group'; import LoginStore from '../user/login-store'; import DashboardStore from './dashboard-store'; -import SimulationModelStore from '../simulationmodel/simulation-model-store'; +//import SimulationModelStore from '../simulationmodel/simulation-model-store'; +import SignalStore from '../signal/signal-store' import FileStore from '../file/file-store'; import WidgetStore from '../widget/widget-store'; import AppDispatcher from '../common/app-dispatcher'; @@ -44,7 +45,7 @@ class Dashboard extends Component { static lastWidgetKey = 0; static getStores() { - return [ DashboardStore, SimulationModelStore, FileStore, LoginStore, WidgetStore ]; + return [ DashboardStore, FileStore, LoginStore, WidgetStore, SignalStore ]; } static calculateState(prevState, props) { @@ -75,15 +76,18 @@ class Dashboard extends Component { return thisWidgetHeight > maxHeightSoFar? thisWidgetHeight : maxHeightSoFar; }, 0); - let simulationModels = []; + //let simulationModels = []; //if (prevState.simulation != null) { // simulationModels = SimulationModelStore.getState().filter(m => prevState.simulation.models.includes(m._id)); //} + // TODO filter signals to the ones belonging to the scenario at hand! + let signals = SignalStore.getState(); + return { dashboard, widgets, - simulationModels, + signals, sessionToken: sessionToken, files: null, @@ -398,7 +402,14 @@ class Dashboard extends Component { )} - + diff --git a/src/widget/edit-widget/edit-widget-control-creator.js b/src/widget/edit-widget/edit-widget-control-creator.js index f435085..5db44a9 100644 --- a/src/widget/edit-widget/edit-widget-control-creator.js +++ b/src/widget/edit-widget/edit-widget-control-creator.js @@ -38,7 +38,7 @@ import EditWidgetMinMaxControl from './edit-widget-min-max-control'; import EditWidgetHTMLContent from './edit-widget-html-content'; import EditWidgetParametersControl from './edit-widget-parameters-control'; -export default function CreateControls(widgetType = null, widget = null, sessionToken = null, files = null, validateForm, simulationModels, handleChange) { +export default function CreateControls(widgetType = null, widget = null, sessionToken = null, files = null, validateForm, signals, handleChange) { // Use a list to concatenate the controls according to the widget type var DialogControls = []; @@ -47,54 +47,47 @@ export default function CreateControls(widgetType = null, widget = null, session DialogControls.push( validateForm(id)} handleChange={e => handleChange(e)} />, validateForm(id)} handleChange={e => handleChange(e)} />, - validateForm(id)} simulationModels={simulationModels} handleChange={(e) => handleChange(e)} />, - handleChange(e)} /> - ) + handleChange(e)} /> + ); break; case 'Action': DialogControls.push( - validateForm(id)} simulationModels={simulationModels} handleChange={(e) => handleChange(e)} /> - ) + validateForm(id)} signals={signals} handleChange={(e) => handleChange(e)} />, + ); break; case 'Value': let valueBoundOnChange = (e) => { handleChange([e, {target: {id: 'signal', value: 0}}]); - } + }; DialogControls.push( validateForm(id)} handleChange={e => handleChange(e)} />, - validateForm(id)} simulationModels={simulationModels} handleChange={(e) => valueBoundOnChange(e)} />, - validateForm(id)} simulationModels={simulationModels} handleChange={(e) => handleChange(e)} />, - handleChange(e)} />, - handleChange(e)} /> + validateForm(id)} signals={signals} handleChange={(e) => handleChange(e)} />, + handleChange(e)} />, + handleChange(e)} /> ); break; case 'Lamp': let lampBoundOnChange = (e) => { handleChange([e, {target: {id: 'signal', value: 0}}]); - } + }; DialogControls.push( - validateForm(id)} simulationModels={simulationModels} handleChange={(e) => lampBoundOnChange(e)} />, - validateForm(id)} simulationModels={simulationModels} handleChange={(e) => handleChange(e)} />, - validateForm(id)} handleChange={e => handleChange(e)} />, - validateForm(id)} handleChange={(e) => handleChange(e)} />, - validateForm(id)} handleChange={(e) => handleChange(e)} />, + validateForm(id)} signals={signals} handleChange={(e) => handleChange(e)} />, + validateForm(id)} handleChange={e => handleChange(e)} />, + validateForm(id)} handleChange={(e) => handleChange(e)} />, + validateForm(id)} handleChange={(e) => handleChange(e)} />, ); break; case 'Plot': - let plotBoundOnChange = (e) => { - handleChange([e, {target: {id: 'signals', value: []}}]); - } DialogControls.push( - validateForm(id)} simulationModels={simulationModels} handleChange={(e) => handleChange(e)} />, - validateForm(id)} simulationModels={simulationModels} handleChange={(e) => plotBoundOnChange(e)} />, - validateForm(id)} simulationModels={simulationModels} handleChange={(e) => handleChange(e)} />, - handleChange(e)} />, - handleChange(e)} /> + validateForm(id)} handleChange={(e) => handleChange(e)} />, + validateForm(id)} signals={signals} handleChange={(e) => handleChange(e)} />, + handleChange(e)} />, + handleChange(e)} /> ); break; case 'Table': DialogControls.push( - validateForm(id)} simulationModels={simulationModels} handleChange={(e) => handleChange(e)} />, + validateForm(id)} signals={signals} handleChange={(e) => handleChange(e)} />, handleChange(e)} /> ); break; @@ -102,59 +95,55 @@ export default function CreateControls(widgetType = null, widget = null, session // Restrict to only image file types (MIME) let imageControlFiles = files == null? [] : files.filter(file => file.type.includes('image')); DialogControls.push( - validateForm(id)} simulationModels={simulationModels} handleChange={(e) => handleChange(e)} />, + validateForm(id)} handleChange={(e) => handleChange(e)} />, handleChange(e)} /> ); break; case 'Gauge': let gaugeBoundOnChange = (e) => { handleChange([e, {target: {id: 'signal', value: ''}}]); - } + }; DialogControls.push( validateForm(id)} handleChange={e => handleChange(e)} />, - validateForm(id)} simulationModels={simulationModels} handleChange={(e) => gaugeBoundOnChange(e) } />, - validateForm(id)} simulationModels={simulationModels} handleChange={(e) => handleChange(e)} />, - handleChange(e)} />, - handleChange(e)} />, - handleChange(e)} /> + validateForm(id)} signals={signals} handleChange={(e) => handleChange(e)} />, + handleChange(e)} />, + handleChange(e)} />, + handleChange(e)} /> ); break; case 'PlotTable': let plotTableBoundOnChange = (e) => { - handleChange([e, {target: {id: 'preselectedSignals', value: []}}]); - } + handleChange([e, {target: {id: 'signalIDs', value: []}}]); + }; DialogControls.push( - validateForm(id)} simulationModels={simulationModels} handleChange={(e) => plotTableBoundOnChange(e)} />, - validateForm(id)} simulationModels={simulationModels} handleChange={(e) => handleChange(e)} />, - handleChange(e)} />, - validateForm(id)} simulationModels={simulationModels} handleChange={(e) => handleChange(e)} />, - handleChange(e)} /> + validateForm(id)} signals={signals} handleChange={(e) => handleChange(e)} />, + handleChange(e)} />, + validateForm(id)} handleChange={(e) => handleChange(e)} />, + handleChange(e)} /> ); break; case 'Slider': DialogControls.push( handleChange(e)} validate={id => validateForm(id)} />, - validateForm(id)} simulationModels={simulationModels} handleChange={(e) => handleChange(e)} />, - validateForm(id)} simulationModels={simulationModels} handleChange={(e) => handleChange(e)} />, - validateForm(id)} simulationModels={simulationModels} handleChange={(e) => handleChange(e)} />, - handleChange(e)} />, - handleChange(e)} />, - handleChange(e)} />, - handleChange(e)} />, - handleChange(e)} /> + validateForm(id)} handleChange={(e) => handleChange(e)} />, + validateForm(id)} signals={signals} handleChange={(e) => handleChange(e)} />, + handleChange(e)} />, + handleChange(e)} />, + handleChange(e)} />, + handleChange(e)} />, + handleChange(e)} /> ); break; case 'Button': let buttonBoundOnChange = (e) => { handleChange([e, {target: {id: 'signal', value: 0}}]); - } + }; DialogControls.push( handleChange(e)} validate={id => validateForm(id)} />, - validateForm(id)} simulationModels={simulationModels} handleChange={(e) => buttonBoundOnChange(e)} />, - validateForm(id)} simulationModels={simulationModels} handleChange={(e) => handleChange(e)} />, - handleChange(e)} />, - handleChange(e)} />, - handleChange(e)} /> + validateForm(id)} signals={signals} handleChange={(e) => handleChange(e)} />, + handleChange(e)} />, + handleChange(e)} />, + handleChange(e)} /> ); break; case 'Box': @@ -179,18 +168,17 @@ export default function CreateControls(widgetType = null, widget = null, session // Restrict to only xml files (MIME) let topologyControlFiles = files == null? [] : files.filter( file => file.type.includes('xml')); DialogControls.push( - validateForm(id)} simulationModels={simulationModels} handleChange={(e) => handleChange(e)} /> + validateForm(id)} handleChange={(e) => handleChange(e)} /> ); break; case 'Input': let inputBoundOnChange = (e) => { handleChange([e, {target: {id: 'signal', value: 0}}]); - } + }; DialogControls.push( validateForm(id)} handleChange={e => handleChange(e)} />, - validateForm(id)} simulationModels={simulationModels} handleChange={(e) => inputBoundOnChange(e)} />, - validateForm(id)} simulationModels={simulationModels} handleChange={(e) => handleChange(e)} /> + validateForm(id)} signals={signals} handleChange={(e) => handleChange(e)} /> ); break; diff --git a/src/widget/edit-widget/edit-widget-signal-control.js b/src/widget/edit-widget/edit-widget-signal-control.js index 1f01bb7..1feb090 100644 --- a/src/widget/edit-widget/edit-widget-signal-control.js +++ b/src/widget/edit-widget/edit-widget-signal-control.js @@ -27,9 +27,7 @@ class EditWidgetSignalControl extends Component { super(props); this.state = { - widget: { - simulationModel: '' - } + widget: {} }; } @@ -40,28 +38,17 @@ class EditWidgetSignalControl extends Component { } render() { - const simulationModel = this.props.simulationModels.find(m => m._id === this.state.widget.simulationModel); - - let signalsToRender = []; - - if (simulationModel != null) { - if (this.props.input) { - signalsToRender = simulationModel ? simulationModel.inputMapping : []; - } else { - signalsToRender = simulationModel ? simulationModel.outputMapping : []; - } - } return ( Signal - this.props.handleChange(e)}> + this.props.handleChange(e)}> { - signalsToRender.length === 0 ? ( + this.props.signals.length === 0 ? ( ) : ( - signalsToRender.map((signal, index) => ( - + this.props.signals.map((signal, index) => ( + )) ) } diff --git a/src/widget/edit-widget/edit-widget-signals-control.js b/src/widget/edit-widget/edit-widget-signals-control.js index 947e8fc..2f38506 100644 --- a/src/widget/edit-widget/edit-widget-signals-control.js +++ b/src/widget/edit-widget/edit-widget-signals-control.js @@ -27,9 +27,7 @@ class EditWidgetSignalsControl extends Component { super(props); this.state = { - widget: { - simulator: {} - } + widget: { } }; } @@ -39,40 +37,31 @@ class EditWidgetSignalsControl extends Component { }; } - handleSignalChange(checked, index) { - var signals = this.state.widget[this.props.controlId]; + handleSignalChange(checked, signalID) { + var signals = this.state.widget.signalIDs; var new_signals; if (checked) { // add signal - new_signals = signals.concat(index); + new_signals = signals.concat(signalID); } else { // remove signal - new_signals = signals.filter( (idx) => idx !== index ); + new_signals = signals.filter( (id) => id !== signalID ); } this.props.handleChange({ target: { id: this.props.controlId, value: new_signals } }); } render() { - const simulationModel = this.props.simulationModels.find(m => m._id === this.state.widget.simulationModel); - - let signalsToRender = []; - - if (simulationModel != null) { - // If simulation model update the signals to render - signalsToRender = simulationModel ? simulationModel.outputMapping : []; - } - return ( Signals { - signalsToRender.length === 0 || !this.state.widget.hasOwnProperty(this.props.controlId)? ( + this.props.signals === 0 || !this.state.widget.hasOwnProperty(this.props.controlId)? ( No signals available ) : ( - signalsToRender.map((signal, index) => ( - this.handleSignalChange(e.target.checked, index)}>{signal.name} + this.props.signals.map((signal, index) => ( + this.handleSignalChange(e.target.checked, signal.id)}>{signal.name} )) ) } diff --git a/src/widget/edit-widget/edit-widget.js b/src/widget/edit-widget/edit-widget.js index 1a2a0f6..64fefea 100644 --- a/src/widget/edit-widget/edit-widget.js +++ b/src/widget/edit-widget/edit-widget.js @@ -69,7 +69,7 @@ class EditWidgetDialog extends React.Component { handleChange(e) { // TODO: check what we really need in this function. Can we reduce its complexity? - if (e.constructor === Array) { + if (e.constructor === Array) { // Every property in the array will be updated let changes = e.reduce( (changesObject, event) => { changesObject[event.target.id] = event.target.value; @@ -80,46 +80,42 @@ class EditWidgetDialog extends React.Component { this.setState({ temporal: Object.assign({}, this.state.temporal, changes ) }); } - if(e.target.type !== 'text'){ - let changeObject = {}; - if (e.target.id === 'lockAspect') { - changeObject[e.target.id] = e.target.checked; + if(e.target.type !== 'text'){ + let changeObject = {}; + if (e.target.id === 'lockAspect') { + changeObject[e.target.id] = e.target.checked; - // correct image aspect if turned on - if (e.target.checked) { - changeObject = this.assignAspectRatio(changeObject, this.state.temporal.file); - } - } else if (e.target.id === 'file') { - changeObject[e.target.id] = e.target.value; - - // get file and update size (if it's an image) - if ('lockAspect' in this.state.temporal && this.state.temporal.lockAspect) { - changeObject = this.assignAspectRatio(changeObject, e.target.value); - } - } else if (e.target.type === 'checkbox') { - changeObject[e.target.id] = e.target.checked; - } else if (e.target.type === 'number') { - changeObject[e.target.id] = Number(e.target.value); + // correct image aspect if turned on + if (e.target.checked) { + changeObject = this.assignAspectRatio(changeObject, this.state.temporal.file); } + } else if (e.target.id === 'file') { + changeObject[e.target.id] = e.target.value; - else { - changeObject[e.target.id] = e.target.value; + // get file and update size (if it's an image) + if ('lockAspect' in this.state.temporal && this.state.temporal.lockAspect) { + changeObject = this.assignAspectRatio(changeObject, e.target.value); } + } else if (e.target.type === 'checkbox') { + changeObject[e.target.id] = e.target.checked; + } else if (e.target.type === 'number') { + changeObject[e.target.id] = Number(e.target.value); + } else { + changeObject[e.target.id] = e.target.value; + } + let finalChange = this.state.temporal; + finalChange.customProperties[e.target.id] = changeObject[e.target.id]; + this.setState({ temporal: finalChange}); + } else { + if(this.state.temporal[e.target.id]){ let finalChange = this.state.temporal; - finalChange.customProperties[e.target.id] = changeObject[e.target.id]; + finalChange[e.target.id] = e.target.value; this.setState({ temporal: finalChange}); } - else{ - if(this.state.temporal[e.target.id]){ - let finalChange = this.state.temporal; - - finalChange[e.target.id] = e.target.value; - this.setState({ temporal: finalChange}); - } - } + } } resetState() { @@ -151,7 +147,7 @@ class EditWidgetDialog extends React.Component { this.props.sessionToken, this.props.files, (id) => this.validateForm(id), - this.props.simulationModels, + this.props.signals, (e) => this.handleChange(e)); } diff --git a/src/widget/widget-area.js b/src/widget/widget-area.js index 69b0367..d33504c 100644 --- a/src/widget/widget-area.js +++ b/src/widget/widget-area.js @@ -40,7 +40,7 @@ class WidgetArea extends React.Component { position.x = this.snapToGrid(position.x); position.y = this.snapToGrid(position.y); - const widget = WidgetFactory.createWidgetOfType(item.name, position, this.props.defaultSimulationModel); + const widget = WidgetFactory.createWidgetOfType(item.name, position); if (this.props.onWidgetAdded != null) { this.props.onWidgetAdded(widget); @@ -66,7 +66,6 @@ WidgetArea.propTypes = { children: PropTypes.node, //TODO is .node correct here? Was .children before leading to compile error editing: PropTypes.bool, grid: PropTypes.number, - defaultSimulationModel: PropTypes.string, //widgets: PropTypes.array, onWidgetAdded: PropTypes.func }; diff --git a/src/widget/widget-factory.js b/src/widget/widget-factory.js index eb2dc68..b6905fa 100644 --- a/src/widget/widget-factory.js +++ b/src/widget/widget-factory.js @@ -25,7 +25,7 @@ import WidgetSlider from './widgets/slider'; class WidgetFactory { - static createWidgetOfType(type, position, defaultSimulationModel = null) { + static createWidgetOfType(type, position) { let widget = { name: 'Name', @@ -36,7 +36,8 @@ class WidgetFactory { y: position.y, z: position.z, locked: false, - customProperties: {} + customProperties: {}, + signalIDs: [], }; // set type specific properties @@ -60,14 +61,10 @@ class WidgetFactory { widget.customProperties.icon = 'star'; widget.width = 100; widget.height = 50; - widget.customProperties.simulationModel = defaultSimulationModel; break; case 'Action': - widget.customProperties.simulationModel = defaultSimulationModel; break; case 'Lamp': - widget.customProperties.simulationModel = defaultSimulationModel; - widget.customProperties.signal = 0; widget.minWidth = 5; widget.minHeight = 5; widget.width = 20; @@ -77,8 +74,6 @@ class WidgetFactory { widget.customProperties.threshold = 0.5; break; case 'Value': - widget.customProperties.simulationModel = defaultSimulationModel; - widget.customProperties.signal = 0; widget.minWidth = 70; widget.minHeight = 20; widget.width = 120; @@ -88,8 +83,6 @@ class WidgetFactory { widget.customProperties.showUnit = false; break; case 'Plot': - widget.customProperties.simulationModel = defaultSimulationModel; - widget.customProperties.signals = [ 0 ]; widget.customProperties.ylabel = ''; widget.customProperties.time = 60; widget.minWidth = 400; @@ -101,7 +94,6 @@ class WidgetFactory { widget.customProperties.yUseMinMax = false; break; case 'Table': - widget.customProperties.simulationModel = defaultSimulationModel; widget.minWidth = 200; widget.width = 300; widget.height = 200; @@ -116,9 +108,6 @@ class WidgetFactory { widget.customProperties.fontColor = 0; break; case 'PlotTable': - widget.customProperties.simulationModel = defaultSimulationModel; - widget.customProperties.preselectedSignals = []; - widget.customProperties.signals = []; // initialize selected signals widget.customProperties.ylabel = ''; widget.minWidth = 200; widget.minHeight = 100; @@ -143,16 +132,12 @@ class WidgetFactory { widget.height = 100; widget.customProperties.background_color = 1; widget.customProperties.font_color = 0; - widget.customProperties.simulationModel = defaultSimulationModel; - widget.customProperties.signal = 0; break; case 'Input': widget.minWidth = 200; widget.minHeight = 50; widget.width = 200; widget.height = 50; - widget.customProperties.simulationModel = defaultSimulationModel; - widget.customProperties.signal = 0; break; case 'Slider': widget.minWidth = 380; @@ -160,17 +145,13 @@ class WidgetFactory { widget.width = 400; widget.height = 50; widget.customProperties.orientation = WidgetSlider.OrientationTypes.HORIZONTAL.value; // Assign default orientation - widget.customProperties.simulationModel = defaultSimulationModel; - widget.customProperties.signal = 0; widget.customProperties.rangeMin = 0; widget.customProperties.rangeMax = 200; widget.customProperties.rangeUseMinMax = true; - widget.customProperties.showUnit = true + widget.customProperties.showUnit = true; break; case 'Gauge': - widget.customProperties.simulationModel = defaultSimulationModel; - widget.customProperties.signal = 0; widget.minWidth = 100; widget.minHeight = 150; widget.width = 150; diff --git a/src/widget/widget.js b/src/widget/widget.js index b227f41..ced0e4c 100644 --- a/src/widget/widget.js +++ b/src/widget/widget.js @@ -27,6 +27,7 @@ import LoginStore from '../user/login-store'; import SimulatorDataStore from '../simulator/simulator-data-store'; import SimulationModelStore from '../simulationmodel/simulation-model-store'; import FileStore from '../file/file-store'; +import SignalStore from '../signal/signal-store' import EditableWidgetContainer from './editable-widget-container'; import WidgetContainer from './widget-container'; @@ -52,7 +53,7 @@ import '../styles/widgets.css'; class Widget extends React.Component { static getStores() { - return [ SimulatorDataStore, SimulationModelStore, FileStore, LoginStore ]; + return [ SimulatorDataStore, SimulationModelStore, FileStore, LoginStore, SignalStore]; } static calculateState(prevState, props) { @@ -67,10 +68,25 @@ class Widget extends React.Component { simulatorData = SimulatorDataStore.getState(); } + // Get the simulator IDs and signal indexes for all signals of the widget + let simulationModels = SimulationModelStore.getState(); + // TODO make sure that the signals are only the signals that belong to the scenario at hand + let signals = SignalStore.getState(); + let simulatorIDs = []; + if ( props.data.signalIDs.length > 0){ + for (let i in props.data.signalIDs.length){ + let signal = signals.find(s => s.id === props.data.signalIDs[i]); + let model = simulationModels.find(m => m.id === signal.simulationModelID); + simulatorIDs[i] = model.simulatorID; + } + } + + return { simulatorData, + signals: signals, + simulatorIDs: simulatorIDs, files: FileStore.getState(), - simulationModels: SimulationModelStore.getState(), sequence: prevState != null ? prevState.sequence + 1 : 0, @@ -90,71 +106,53 @@ class Widget extends React.Component { });*/ // TODO no not load simulation models here, since they are loaded via the scenario, pass them as props - + /* AppDispatcher.dispatch({ type: 'simulationModels/start-load', token: this.state.sessionToken, param: '?scenarioID=1' // TODO do not hardcode scenarioID! }); - + */ } inputDataChanged(widget, data) { - let simulationModel = null; - - for (let model of this.state.simulationModels) { - if (model.id !== widget.simulationModel) { - continue; - } - - simulationModel = model; - } - + // The following assumes that a widget modifies/ uses exactly one signal AppDispatcher.dispatch({ type: 'simulatorData/inputChanged', - simulator: simulationModel.simulator, - signal: widget.signal, + simulator: this.state.simulatorIDs[0], + signal: this.state.signals[0].index, data }); } createWidget(widget) { - let simulationModel = null; - - for (let model of this.state.simulationModels) { - if (model.id !== widget.simulationModel) { - continue; - } - - simulationModel = model; - } if (widget.type === 'CustomAction') { - return + return } else if (widget.type === 'Action') { - return + return } else if (widget.type === 'Lamp') { - return + return } else if (widget.type === 'Value') { - return + return } else if (widget.type === 'Plot') { - return + return } else if (widget.type === 'Table') { - return + return } else if (widget.type === 'Label') { return } else if (widget.type === 'PlotTable') { - return this.props.onWidgetStatusChange(w, this.props.index)} paused={this.props.paused} /> + return this.props.onWidgetStatusChange(w, this.props.index)} paused={this.props.paused} /> } else if (widget.type === 'Image') { return } else if (widget.type === 'Button') { - return this.inputDataChanged(widget, value)} /> + return this.inputDataChanged(widget, value)} signals={this.state.signals} /> } else if (widget.type === 'NumberInput') { - return this.inputDataChanged(widget, value)} /> + return this.inputDataChanged(widget, value)} /> } else if (widget.type === 'Slider') { - return this.props.onWidgetStatusChange(w, this.props.index) } onInputChanged={value => this.inputDataChanged(widget, value)} /> + return this.props.onWidgetStatusChange(w, this.props.index) } onInputChanged={value => this.inputDataChanged(widget, value)} signals={this.state.signals}/> } else if (widget.type === 'Gauge') { - return + return } else if (widget.type === 'Box') { return } else if (widget.type === 'HTML') { diff --git a/src/widget/widgets/custom-action.js b/src/widget/widgets/custom-action.js index 4a3c0ca..15954de 100644 --- a/src/widget/widgets/custom-action.js +++ b/src/widget/widgets/custom-action.js @@ -41,11 +41,12 @@ class WidgetCustomAction extends Component { } static getDerivedStateFromProps(props, state){ - if (props.simulationModel === null) - return null; //no change + if(props.widget.signalIDs.length === 0){ + return null; + } return{ - simulator: SimulatorStore.getState().find(s => s._id === props.simulationModel.simulator), + simulator: SimulatorStore.getState().find(s => s.id === props.simulatorIDs[0]), sessionToken: LoginStore.getState().token }; } diff --git a/src/widget/widgets/gauge.js b/src/widget/widgets/gauge.js index 6d29e80..f029344 100644 --- a/src/widget/widgets/gauge.js +++ b/src/widget/widgets/gauge.js @@ -33,6 +33,7 @@ class WidgetGauge extends Component { this.state = { value: 0, + unit: '', minValue: null, maxValue: null, }; @@ -69,11 +70,21 @@ class WidgetGauge extends Component { } static getDerivedStateFromProps(props, state){ - if (props.simulationModel == null) { - return{value:0}; + + if(props.widget.signalIDs.length === 0){ + return null; } - const simulator = props.simulationModel.simulator; + let returnState = {} + + // Update unit (assuming there is exactly one signal for this widget) + let signalID = props.widget.signalIDs[0]; + let widgetSignal = props.signals.find(sig => sig.id === signalID); + if(widgetSignal !== undefined){ + returnState["unit"] = widgetSignal.unit; + } + + const simulator = props.simulatorIDs[0]; // update value if (props.data == null @@ -82,7 +93,7 @@ class WidgetGauge extends Component { || props.data[simulator].output.values == null || props.data[simulator].output.values.length === 0 || props.data[simulator].output.values[0].length === 0) { - return{value:0}; + returnState["value"] = 0; } // memorize if min or max value is updated @@ -91,11 +102,11 @@ class WidgetGauge extends Component { let updateMaxValue = false; // check if value has changed - const signal = props.data[simulator].output.values[props.widget.customProperties.signal]; + const signalData = props.data[simulator].output.values[widgetSignal.index]; // Take just 3 decimal positions // Note: Favor this method over Number.toFixed(n) in order to avoid a type conversion, since it returns a String - if (signal != null) { - const value = Math.round(signal[signal.length - 1].y * 1e3) / 1e3; + if (signalData != null) { + const value = Math.round(signalData[signalData.length - 1].y * 1e3) / 1e3; let minValue = null; let maxValue = null; if (state.value !== value && value != null) { @@ -149,7 +160,6 @@ class WidgetGauge extends Component { } // prepare returned state - let returnState = null; if(updateValue === true){ returnState["value"] = value; } @@ -160,8 +170,13 @@ class WidgetGauge extends Component { returnState["maxValue"] = maxValue; } - return returnState - } // if there is a signal + if (returnState !== {}){ + return returnState; + } + else{ + return null; + } + } // if there is signal data } @@ -218,17 +233,12 @@ class WidgetGauge extends Component { render() { const componentClass = this.props.editing ? "gauge-widget editing" : "gauge-widget"; - let signalType = null; - - if (this.props.simulationModel != null) { - signalType = (this.props.simulationModel != null && this.props.simulationModel.outputLength > 0 && this.props.widget.customProperties.signal < this.props.simulationModel.outputLength) ? this.props.simulationModel.outputMapping[this.props.widget.customProperties.signal].type : ''; - } return (
    {this.props.widget.name}
    this.gaugeCanvas = node} /> -
    {signalType}
    +
    {this.state.unit}
    {this.state.value}
    ); diff --git a/src/widget/widgets/input.js b/src/widget/widgets/input.js index dfd1318..566dd16 100644 --- a/src/widget/widgets/input.js +++ b/src/widget/widgets/input.js @@ -35,24 +35,31 @@ class WidgetInput extends Component { } static getDerivedStateFromProps(props, state){ - if (props.simulationModel == null) { + + if(props.widget.signalIDs.length === 0){ return null; } - let returnState = null; + let returnState = {}; + // Update value if (props.widget.customProperties.default_value && this.state.value === undefined) { returnState["value"] = props.widget.customProperties.default_value; } - // Update unit - if (props.widget.customProperties.simulationModel - && props.simulationModel.inputMapping - && state.unit !== props.simulationModel.inputMapping[props.widget.customProperties.signal].type) { - returnState["unit"] = props.simulationModel.inputMapping[props.widget.customProperties.signal].type; + // Update unit (assuming there is exactly one signal for this widget) + let signalID = props.widget.signalIDs[0]; + let signal = props.signals.find(sig => sig.id === signalID); + if(signal !== undefined){ + returnState["unit"] = signal.unit; } - return returnState; + if (returnState !== {}){ + return returnState; + } + else{ + return null; + } } valueIsChanging(newValue) { diff --git a/src/widget/widgets/lamp.js b/src/widget/widgets/lamp.js index 061803c..2c1cc63 100644 --- a/src/widget/widgets/lamp.js +++ b/src/widget/widgets/lamp.js @@ -34,11 +34,13 @@ class WidgetLamp extends Component { } static getDerivedStateFromProps(props, state){ - if (props.simulationModel == null) { + if(props.widget.signalIDs.length === 0){ return{ value: ''}; } - const simulator = props.simulationModel.simulator; + const simulator = props.simulatorIDs[0]; + let signalID = props.widget.signalIDs[0]; + let widgetSignal = props.signals.find(sig => sig.id === signalID); // update value if (props.data == null @@ -49,9 +51,9 @@ class WidgetLamp extends Component { } // check if value has changed - const signal = props.data[simulator].output.values[props.widget.customProperties.signal]; - if (signal != null && state.value !== signal[signal.length - 1].y) { - return { value: signal[signal.length - 1].y }; + const signalData = props.data[simulator].output.values[widgetSignal.index]; + if (signalData != null && state.value !== signalData[signalData.length - 1].y) { + return { value: signalData[signalData.length - 1].y }; } return null; diff --git a/src/widget/widgets/slider.js b/src/widget/widgets/slider.js index 602ad92..e082c60 100644 --- a/src/widget/widgets/slider.js +++ b/src/widget/widgets/slider.js @@ -39,14 +39,21 @@ class WidgetSlider extends Component { super(props); this.state = { - unit: 'bla', + unit: '', }; } static getDerivedStateFromProps(props, state){ - if (props.simulationModel == null) { - return null; + if(props.widget.signalIDs.length === 0){ + + // set value to default + if (props.widget.customProperties.default_value && state.value === undefined) { + returnState["value"] = props.widget.customProperties.default_value; + } else { // if no default available + return null; + } + } let returnState = {}; @@ -56,11 +63,11 @@ class WidgetSlider extends Component { returnState["value"] = props.widget.customProperties.default_value; } - // Update unit - if (props.widget.customProperties.simulationModel - && props.simulationModel.inputMapping && - state.unit !== props.simulationModel.inputMapping[props.widget.customProperties.signal].type) { - returnState["unit"] = props.simulationModel.inputMapping[props.widget.customProperties.signal].type; + // Update unit (assuming there is exactly one signal for this widget) + let signalID = props.widget.signalIDs[0]; + let signal = props.signals.find(sig => sig.id === signalID); + if(signal !== undefined){ + returnState["unit"] = signal.unit; } if (returnState !== {}){ diff --git a/src/widget/widgets/table.js b/src/widget/widgets/table.js index 2843c8e..a56d1be 100644 --- a/src/widget/widgets/table.js +++ b/src/widget/widgets/table.js @@ -38,14 +38,24 @@ class WidgetTable extends Component { static getDerivedStateFromProps(props, state){ - if (props.simulationModel == null) { + + if(props.widget.signalIDs.length === 0){ return{ rows: [], sequence: null, }; } - const simulator = props.simulationModel.simulator; + + const simulator = props.simulatorIDs[0]; + let widgetSignals = props.signals.find(sig => { + for (let id of props.widget.signalIDs){ + if (id === sig.id){ + return true; + } + } + return false; + }); // check data if (props.data == null @@ -62,19 +72,17 @@ class WidgetTable extends Component { }; } - // check if new data, otherwise skip - /*if (state.sequence >= props.data[simulator.node][simulator.simulator].sequence) { - return; - }*/ - // get rows const rows = []; props.data[simulator].output.values.forEach((signal, index) => { - if (index < props.simulationModel.outputMapping.length) { + let s = widgetSignals.find( sig => sig.index === index); + // if the signal is used by the widget + if (s !== undefined) { + // push data of the signal rows.push({ - name: props.simulationModel.outputMapping[index].name, - unit: props.simulationModel.outputMapping[index].type, + name: s.name, + unit: s.unit, value: signal[signal.length - 1].y }); } diff --git a/src/widget/widgets/value.js b/src/widget/widgets/value.js index 6c9d32b..3293feb 100644 --- a/src/widget/widgets/value.js +++ b/src/widget/widgets/value.js @@ -33,26 +33,33 @@ class WidgetValue extends Component { } static getDerivedStateFromProps(props, state){ - if (props.simulationModel == null) { - return{ value: '' }; + if(props.widget.signalIDs.length === 0){ + return null; } - const simulator = props.simulationModel.simulator; + const simulator = props.simulatorIDs[0]; // update value - if (props.data == null || props.data[simulator] == null || props.data[simulator].output == null || props.data[simulator].output.values == null) { + if (props.data == null + || props.data[simulator] == null + || props.data[simulator].output == null + || props.data[simulator].output.values == null) { return{ value: '' }; } - // TODO fixme (unit) - //const unit = props.simulationModel.outputMapping[props.widget.customProperties.signal].type; - const unit = 42; + // Update unit (assuming there is exactly one signal for this widget) + let unit = ''; + let signalID = props.widget.signalIDs[0]; + let signal = props.signals.find(sig => sig.id === signalID); + if(signal !== undefined){ + unit = signal.unit; + } // check if value has changed - const signal = props.data[simulator].output.values[props.widget.customProperties.signal]; - if (signal != null && state.value !== signal[signal.length - 1].y) { + const signalData = props.data[simulator].output.values[signal.index]; + if (signalData != null && state.value !== signalData[signalData.length - 1].y) { return { - value: signal[signal.length - 1].y, + value: signalData[signalData.length - 1].y, unit: unit, }; } From 43f8ab4332fbee03e410550a9024d3f0fee7e1e6 Mon Sep 17 00:00:00 2001 From: Sonja Happ Date: Wed, 19 Feb 2020 15:09:30 +0100 Subject: [PATCH 104/391] CI: remove some unused imports and functions; remove test stage --- .gitlab-ci.yml | 19 +++++++++---------- .../edit-widget-control-creator.js | 19 ------------------- src/widget/widgets/slider.js | 4 ++-- 3 files changed, 11 insertions(+), 31 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index c234d5b..a7aaa62 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -14,7 +14,6 @@ cache: stages: - build - - test - deploy build: @@ -32,15 +31,15 @@ build: tags: - docker -test: - stage: test - script: - - npm test - image: ${DOCKER_IMAGE_DEV} - dependencies: - - build - tags: - - docker +#test: +# stage: test +# script: +# - npm test +# image: ${DOCKER_IMAGE_DEV} +# dependencies: +# - build +# tags: +# - docker deploy:docker: stage: deploy diff --git a/src/widget/edit-widget/edit-widget-control-creator.js b/src/widget/edit-widget/edit-widget-control-creator.js index 5db44a9..36c70a8 100644 --- a/src/widget/edit-widget/edit-widget-control-creator.js +++ b/src/widget/edit-widget/edit-widget-control-creator.js @@ -26,7 +26,6 @@ import EditWidgetNumberControl from './edit-widget-number-control'; import EditWidgetColorControl from './edit-widget-color-control'; import EditWidgetTimeControl from './edit-widget-time-control'; import EditImageWidgetControl from './edit-widget-image-control'; -import EditWidgetSimulationControl from './edit-widget-simulation-control'; import EditWidgetSignalControl from './edit-widget-signal-control'; import EditWidgetSignalsControl from './edit-widget-signals-control'; import EditWidgetOrientation from './edit-widget-orientation'; @@ -56,9 +55,6 @@ export default function CreateControls(widgetType = null, widget = null, session ); break; case 'Value': - let valueBoundOnChange = (e) => { - handleChange([e, {target: {id: 'signal', value: 0}}]); - }; DialogControls.push( validateForm(id)} handleChange={e => handleChange(e)} />, validateForm(id)} signals={signals} handleChange={(e) => handleChange(e)} />, @@ -67,9 +63,6 @@ export default function CreateControls(widgetType = null, widget = null, session ); break; case 'Lamp': - let lampBoundOnChange = (e) => { - handleChange([e, {target: {id: 'signal', value: 0}}]); - }; DialogControls.push( validateForm(id)} signals={signals} handleChange={(e) => handleChange(e)} />, validateForm(id)} handleChange={e => handleChange(e)} />, @@ -100,9 +93,6 @@ export default function CreateControls(widgetType = null, widget = null, session ); break; case 'Gauge': - let gaugeBoundOnChange = (e) => { - handleChange([e, {target: {id: 'signal', value: ''}}]); - }; DialogControls.push( validateForm(id)} handleChange={e => handleChange(e)} />, validateForm(id)} signals={signals} handleChange={(e) => handleChange(e)} />, @@ -112,9 +102,6 @@ export default function CreateControls(widgetType = null, widget = null, session ); break; case 'PlotTable': - let plotTableBoundOnChange = (e) => { - handleChange([e, {target: {id: 'signalIDs', value: []}}]); - }; DialogControls.push( validateForm(id)} signals={signals} handleChange={(e) => handleChange(e)} />, handleChange(e)} />, @@ -135,9 +122,6 @@ export default function CreateControls(widgetType = null, widget = null, session ); break; case 'Button': - let buttonBoundOnChange = (e) => { - handleChange([e, {target: {id: 'signal', value: 0}}]); - }; DialogControls.push( handleChange(e)} validate={id => validateForm(id)} />, validateForm(id)} signals={signals} handleChange={(e) => handleChange(e)} />, @@ -173,9 +157,6 @@ export default function CreateControls(widgetType = null, widget = null, session break; case 'Input': - let inputBoundOnChange = (e) => { - handleChange([e, {target: {id: 'signal', value: 0}}]); - }; DialogControls.push( validateForm(id)} handleChange={e => handleChange(e)} />, validateForm(id)} signals={signals} handleChange={(e) => handleChange(e)} /> diff --git a/src/widget/widgets/slider.js b/src/widget/widgets/slider.js index e082c60..ac82ebc 100644 --- a/src/widget/widgets/slider.js +++ b/src/widget/widgets/slider.js @@ -45,6 +45,8 @@ class WidgetSlider extends Component { } static getDerivedStateFromProps(props, state){ + let returnState = {}; + if(props.widget.signalIDs.length === 0){ // set value to default @@ -56,8 +58,6 @@ class WidgetSlider extends Component { } - let returnState = {}; - // Update value if (props.widget.customProperties.default_value && state.value === undefined) { returnState["value"] = props.widget.customProperties.default_value; From 868553cae44cdcf7d58d69f88da2b2776080c29c Mon Sep 17 00:00:00 2001 From: Sonja Happ Date: Thu, 5 Mar 2020 15:10:28 +0100 Subject: [PATCH 105/391] rename visible parts: simulator=infrastructure component, simulation model=component configuration #213 --- src/common/menu-sidebar.js | 2 +- src/scenario/scenario.js | 10 +++++----- src/simulationmodel/edit-simulation-model.js | 8 ++++---- src/simulationmodel/import-simulation-model.js | 8 ++++---- src/simulator/edit-simulator.js | 2 +- src/simulator/import-simulator.js | 4 ++-- src/simulator/new-simulator.js | 2 +- src/simulator/simulators.js | 4 ++-- src/styles/app.css | 4 ++-- 9 files changed, 22 insertions(+), 22 deletions(-) diff --git a/src/common/menu-sidebar.js b/src/common/menu-sidebar.js index 5f43425..a597ccd 100644 --- a/src/common/menu-sidebar.js +++ b/src/common/menu-sidebar.js @@ -34,7 +34,7 @@ class SidebarMenu extends React.Component {
    • Home
    • Scenarios
    • -
    • Simulators
    • +
    • Infrastructure Components
    • { this.props.currentRole === 'Admin' ?
    • User Management
    • : '' } diff --git a/src/scenario/scenario.js b/src/scenario/scenario.js index fd6171f..a339127 100644 --- a/src/scenario/scenario.js +++ b/src/scenario/scenario.js @@ -408,12 +408,12 @@ class Scenario extends React.Component { return

      {this.state.scenario.name}

      - {/*Simulation Model table*/} -

      Simulation Models

      + {/*Component Configurations table*/} +

      Component Configurations

    this.onSimulationModelChecked(index, event)} width='30' /> - this.getFileName(selectedModelFileID)}/> + this.getFileName(selectedModelFileID)}/> this.setState({ editInputSignalsModal: true, modalSimulationModelData: this.state.simulationModels[index], modalSimulationModelIndex: index })} /> - this.getSimulatorName(simulatorID)} /> + this.getSimulatorName(simulatorID)} /> this.closeEditSimulationModelModal(data)} simulationModel={this.state.modalSimulationModelData} simulators={this.state.simulators} /> this.importSimulationModel(data)} simulators={this.state.simulators} /> - this.closeDeleteSimulationModelModal(c)} /> + this.closeDeleteSimulationModelModal(c)} /> this.onClose(c)} onReset={() => this.resetState()} valid={this.valid}> + this.onClose(c)} onReset={() => this.resetState()} valid={this.valid}>
    Name @@ -118,13 +118,13 @@ class EditSimulationModelDialog extends React.Component { Simulator - this.handleChange(e)}> + this.handleChange(e)}> {simulatorOptions} - this.handleSelectedModelFileChange(e)} value={this.state.selectedModelFileID} objectID={this.props.simulationModel.id}/> + this.handleSelectedModelFileChange(e)} value={this.state.selectedModelFileID} objectID={this.props.simulationModel.id}/> {/* this.handleChange(e)} value={this.state.configuration} />*/} diff --git a/src/simulationmodel/import-simulation-model.js b/src/simulationmodel/import-simulation-model.js index dc79201..885b281 100644 --- a/src/simulationmodel/import-simulation-model.js +++ b/src/simulationmodel/import-simulation-model.js @@ -88,16 +88,16 @@ class ImportSimulationModelDialog extends React.Component { render() { return ( - this.onClose(c)} onReset={this.resetState} valid={this.imported}> + this.onClose(c)} onReset={this.resetState} valid={this.imported}> - Simulation Model File + Component Configuration File - Simulator - + Infrastructure Component + {this.props.simulators.map(simulator => ( ))} diff --git a/src/simulator/edit-simulator.js b/src/simulator/edit-simulator.js index d88e192..2a2d40a 100644 --- a/src/simulator/edit-simulator.js +++ b/src/simulator/edit-simulator.js @@ -68,7 +68,7 @@ class EditSimulatorDialog extends React.Component { render() { return ( - this.onClose(c)} onReset={() => this.resetState()} valid={this.valid}> + this.onClose(c)} onReset={() => this.resetState()} valid={this.valid}> Name diff --git a/src/simulator/import-simulator.js b/src/simulator/import-simulator.js index 4368c60..74877b1 100644 --- a/src/simulator/import-simulator.js +++ b/src/simulator/import-simulator.js @@ -115,10 +115,10 @@ class ImportSimulatorDialog extends React.Component { render() { return ( - this.onClose(c)} onReset={() => this.resetState()} valid={this.valid}> + this.onClose(c)} onReset={() => this.resetState()} valid={this.valid}> - Simulator File + Infrastructure Component File this.loadFile(e.target.files)} /> diff --git a/src/simulator/new-simulator.js b/src/simulator/new-simulator.js index 6116d12..4a8bcc0 100644 --- a/src/simulator/new-simulator.js +++ b/src/simulator/new-simulator.js @@ -96,7 +96,7 @@ class NewSimulatorDialog extends React.Component { render() { return ( - this.onClose(c)} onReset={() => this.resetState()} valid={this.valid}> + this.onClose(c)} onReset={() => this.resetState()} valid={this.valid}> Name diff --git a/src/simulator/simulators.js b/src/simulator/simulators.js index e9926b4..e2f5a4f 100644 --- a/src/simulator/simulators.js +++ b/src/simulator/simulators.js @@ -272,7 +272,7 @@ class Simulators extends Component { return (
    -

    Simulators

    +

    Infrastructure Components

    this.onSimulatorChecked(index, event)} width='30' /> @@ -303,7 +303,7 @@ class Simulators extends Component {
    - +
    diff --git a/src/styles/app.css b/src/styles/app.css index 45e8557..b30c2ad 100644 --- a/src/styles/app.css +++ b/src/styles/app.css @@ -112,7 +112,7 @@ body { @media (min-width: 768px) { .app-content-margin-left { - margin-left: 200px !important; + margin-left: 275px !important; } } @@ -122,7 +122,7 @@ body { .menu-sidebar { /*display: inline-table;*/ padding: 20px 25px 20px 25px; - width: 180px; + width: 250px; float: left; background-color: #fff; From 0f728c561bcefd809212a135f26b7fc87ebb4be3 Mon Sep 17 00:00:00 2001 From: Sonja Happ Date: Thu, 5 Mar 2020 16:19:05 +0100 Subject: [PATCH 106/391] add a short description for VILLASweb terminology, remove some contacts --- src/common/home.js | 21 +++++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-) diff --git a/src/common/home.js b/src/common/home.js index 2ce515c..dd49f8b 100644 --- a/src/common/home.js +++ b/src/common/home.js @@ -63,12 +63,29 @@ class Home extends React.Component { A total of {this.getCounts('users')} users are registered.

    */} +

    Terminology of VILLASweb

    +
      +
    • Infrastructure Component: A component of research infrastructure +
        +
      • Category: for example simulator, gateway, amplifier, database, etc.
      • +
      • Type: for example RTDS, OpalRT, VILLASnode, Cassandra
      • +
      +
    • +
    • Component Configuration +
        +
      • Input signals: Signals that can be modified in VILLASweb
      • +
      • Output signals: Signals that can be visualized on dashboards of VILLASweb
      • +
      • Parameters: Further configuration parameters of the infrastructure component
      • +
      +
    • +
    • Dashboards: Can be used to visualize ongoing experiments as well as to interact with them in real-time
    • +
    • Scenario: A collection of component configurations and dashboards for a specific experiment
    • +
    +

    Credits

    VILLASweb is developed by the Institute for Automation of Complex Power Systems at the RWTH Aachen University.

    Links

    From a7d22d3df763d02203ff6bbdba6a2b8e07a98039 Mon Sep 17 00:00:00 2001 From: Sonja Happ Date: Tue, 10 Mar 2020 17:09:14 +0100 Subject: [PATCH 107/391] add image of datamodel, add descriptive text for terminology --- README.md | 9 ++++++-- src/common/home.js | 51 +++++++++++++++++++++++++++--------------- src/img/datamodel.png | Bin 0 -> 197553 bytes 3 files changed, 40 insertions(+), 20 deletions(-) create mode 100644 src/img/datamodel.png diff --git a/README.md b/README.md index e654b3d..e365f1a 100644 --- a/README.md +++ b/README.md @@ -6,7 +6,7 @@ This is VILLASweb, the website displaying and processing simulation data in the The frontend connects to __two__ backends: _VILLASweb-backend_ and _VILLASnode_. -VILLASnode provides actual simulation data via websockets. VILLASweb-backend provides any other data like user acounts, simulation configuration etc. +VILLASnode provides actual simulation data via websockets. VILLASweb-backend provides any other data like user accounts, infrastructure components and configurations, dashboards etc. For more information on the backends see their repositories. @@ -18,6 +18,10 @@ React is responsible for rendering the UI and Flux for handling the data and com Additional libraries are used, for a complete list see package.json. +## Data model + +![Datamodel](src/img/datamodel.png) + ## Quick start We recommend Docker to get started quickly: @@ -33,7 +37,7 @@ The default user and password are configured in the `config.js` file of the _bac ## Copyright -2017, Institute for Automation of Complex Power Systems, EONERC +2020, Institute for Automation of Complex Power Systems, EONERC ## License @@ -66,6 +70,7 @@ For other licensing options please consult [Prof. Antonello Monti](mailto:amonti [![EONERC ACS Logo](doc/pictures/eonerc_logo.png)](http://www.acs.eonerc.rwth-aachen.de) - Steffen Vogel + - Sonja Happ [Institute for Automation of Complex Power Systems (ACS)](http://www.acs.eonerc.rwth-aachen.de) [EON Energy Research Center (EONERC)](http://www.eonerc.rwth-aachen.de) diff --git a/src/common/home.js b/src/common/home.js index dd49f8b..b86fe80 100644 --- a/src/common/home.js +++ b/src/common/home.js @@ -63,24 +63,39 @@ class Home extends React.Component { A total of {this.getCounts('users')} users are registered.

    */} -

    Terminology of VILLASweb

    -
      -
    • Infrastructure Component: A component of research infrastructure -
        -
      • Category: for example simulator, gateway, amplifier, database, etc.
      • -
      • Type: for example RTDS, OpalRT, VILLASnode, Cassandra
      • -
      -
    • -
    • Component Configuration -
        -
      • Input signals: Signals that can be modified in VILLASweb
      • -
      • Output signals: Signals that can be visualized on dashboards of VILLASweb
      • -
      • Parameters: Further configuration parameters of the infrastructure component
      • -
      -
    • -
    • Dashboards: Can be used to visualize ongoing experiments as well as to interact with them in real-time
    • -
    • Scenario: A collection of component configurations and dashboards for a specific experiment
    • -
    + +

    Data Model

    + Datamodel VILLASweb + +

    Terminology

    + +
    Infrastructure Component
    +
      +
    • A component of research infrastructure
    • +
    • Category: for example simulator, gateway, amplifier, database, etc.
    • +
    • Type: for example RTDS, OpalRT, VILLASnode, Cassandra
    • +
    + +
    Component Configuration
    +
      +
    • Input signals: Signals that can be modified in VILLASweb
    • +
    • Output signals: Signals that can be visualized on dashboards of VILLASweb
    • +
    • Parameters: Further configuration parameters of the infrastructure component
    • +
    + +
    Dashboard
    +
      +
    • Visualize ongoing experiments in real-time
    • +
    • Interact with ongoing experiments in real-time
    • +
    + +
    Scenario
    +
      +
    • A collection of component configurations and dashboards for a specific experiment
    • +
    • Users can have access to multiple scenarios
    • +
    + +

    Credits

    VILLASweb is developed by the Institute for Automation of Complex Power Systems at the RWTH Aachen University.

    diff --git a/src/img/datamodel.png b/src/img/datamodel.png new file mode 100644 index 0000000000000000000000000000000000000000..e59cbc2b3d79bf5dcacfec7dec2986462b9d2e4c GIT binary patch literal 197553 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

    ARX-U2AYeH9(mJu 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 Date: Wed, 11 Mar 2020 10:04:05 +0100 Subject: [PATCH 108/391] fix link on home page --- src/common/home.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/common/home.js b/src/common/home.js index b86fe80..32095ce 100644 --- a/src/common/home.js +++ b/src/common/home.js @@ -107,7 +107,7 @@ class Home extends React.Component {

    Funding

    The development of VILLASframework projects have received funding from

    From 60415574372a23f57999d96ba84654550727ac1e Mon Sep 17 00:00:00 2001 From: Sonja Happ Date: Wed, 11 Mar 2020 15:51:49 +0100 Subject: [PATCH 109/391] cleanup home file --- src/common/home.js | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/src/common/home.js b/src/common/home.js index 32095ce..ffb8587 100644 --- a/src/common/home.js +++ b/src/common/home.js @@ -21,10 +21,6 @@ import React from 'react'; -//import { Link } from 'react-router-dom'; - -//import RestAPI from '../api/rest-api'; - import config from '../config'; import LoginStore from "../user/login-store"; @@ -57,12 +53,6 @@ class Home extends React.Component {

    You are logged in as user {this.state.currentUser.username} with ID {this.state.currentUser.id} and role {this.state.currentUser.role}.

    - {/* -

    - This instance is hosting {this.getCounts('projects')} projects consisting of {this.getCounts('simulators')} simulators, {this.getCounts('dashboards')} dashboards and {this.getCounts('simulations')} simulations. - A total of {this.getCounts('users')} users are registered.
    -

    - */}

    Data Model

    Datamodel VILLASweb From bc089fdc891e6bca0d867eaa9f6a7ea8bd48ec69 Mon Sep 17 00:00:00 2001 From: Sonja Happ Date: Wed, 11 Mar 2020 15:53:18 +0100 Subject: [PATCH 110/391] rename simulator to infrastructure component (ic) --- src/app.js | 33 +---- .../data-managers/notifications-factory.js | 8 +- src/common/header-menu.js | 9 +- src/common/menu-sidebar.js | 5 +- src/dashboard/import-dashboard.js | 11 +- .../edit-simulator.js => ic/edit-ic.js} | 21 ++- .../simulator-action.js => ic/ic-action.js} | 8 +- .../ic-data-data-manager.js} | 14 +- .../ic-data-store.js} | 34 +++-- .../simulator-store.js => ic/ic-store.js} | 50 ++++---- .../ics-data-manager.js} | 20 ++- src/{simulator/simulators.js => ic/ics.js} | 120 +++++++++--------- .../import-simulator.js => ic/import-ic.js} | 18 +-- .../new-simulator.js => ic/new-ic.js} | 8 +- src/scenario/import-scenario.js | 25 +--- src/scenario/scenario.js | 50 ++++---- src/simulationmodel/edit-simulation-model.js | 18 +-- .../import-simulation-model.js | 14 +- .../simulation-models-data-manager.js | 8 +- src/user/login-store.js | 10 +- src/widget/widget.js | 42 +++--- src/widget/widgets/custom-action.js | 19 +-- src/widget/widgets/gauge.js | 14 +- src/widget/widgets/lamp.js | 10 +- src/widget/widgets/plot-table.js | 10 +- src/widget/widgets/plot.js | 8 +- src/widget/widgets/table.js | 14 +- src/widget/widgets/value.js | 11 +- 28 files changed, 251 insertions(+), 361 deletions(-) rename src/{simulator/edit-simulator.js => ic/edit-ic.js} (75%) rename src/{simulator/simulator-action.js => ic/ic-action.js} (92%) rename src/{simulator/simulator-data-data-manager.js => ic/ic-data-data-manager.js} (93%) rename src/{simulator/simulator-data-store.js => ic/ic-data-store.js} (76%) rename src/{simulator/simulator-store.js => ic/ic-store.js} (51%) rename src/{simulator/simulators-data-manager.js => ic/ics-data-manager.js} (67%) rename src/{simulator/simulators.js => ic/ics.js} (64%) rename src/{simulator/import-simulator.js => ic/import-ic.js} (88%) rename src/{simulator/new-simulator.js => ic/new-ic.js} (94%) diff --git a/src/app.js b/src/app.js index d77e02f..abf0956 100644 --- a/src/app.js +++ b/src/app.js @@ -1,8 +1,4 @@ /** - * File: app.js - * Author: Markus Grigull - * Date: 02.03.2017 - * * This file is part of VILLASweb. * * VILLASweb is free software: you can redistribute it and/or modify @@ -30,7 +26,7 @@ import { Hidden } from 'react-grid-system' import AppDispatcher from './common/app-dispatcher'; import ScenarioStore from './scenario/scenario-store'; -import SimulatorStore from './simulator/simulator-store'; +import ICStore from './ic/ic-store'; import LoginStore from './user/login-store'; import NotificationsDataManager from './common/data-managers/notifications-data-manager'; @@ -40,7 +36,7 @@ import Footer from './common/footer'; import SidebarMenu from './common/menu-sidebar'; import HeaderMenu from './common/header-menu'; -import Simulators from './simulator/simulators'; +import InfrastructureComponents from './ic/ics'; import Dashboard from './dashboard/dashboard'; import Scenarios from './scenario/scenarios'; import Scenario from './scenario/scenario'; @@ -52,13 +48,13 @@ import './styles/app.css'; class App extends React.Component { static getStores() { - return [ SimulatorStore, LoginStore, ScenarioStore]; + return [ ICStore, LoginStore, ScenarioStore]; } static calculateState(prevState) { return { - simulators: SimulatorStore.getState(), + ics: ICStore.getState(), scenarios: ScenarioStore.getState(), currentUser: LoginStore.getState().currentUser, token: LoginStore.getState().token, @@ -80,19 +76,6 @@ class App extends React.Component { currentUser: currentUser }); } - - // load all simulators and scenarios to fetch data - // AppDispatcher.dispatch({ - // type: 'simulators/start-load', - // token: this.state.token - // }); - // - // AppDispatcher.dispatch({ - // type: 'scenarios/start-load', - // token: this.state.token - // }); - - } showSidebarMenu = () => { @@ -136,7 +119,7 @@ class App extends React.Component { - + @@ -150,12 +133,6 @@ class App extends React.Component { } } -// Removed routes -// -// -// -// - let fluxContainerConverter = require('./common/FluxContainerConverter'); export default Container.create(fluxContainerConverter.convert(App)); //DragDropContext(HTML5Backend)(Container.create(App)); diff --git a/src/common/data-managers/notifications-factory.js b/src/common/data-managers/notifications-factory.js index 4f2a079..341b375 100644 --- a/src/common/data-managers/notifications-factory.js +++ b/src/common/data-managers/notifications-factory.js @@ -1,11 +1,4 @@ /** - * File: notifications-factory.js - * Description: An unique source of pre-defined notifications that are displayed - * throughout the application. - * Author: Ricardo Hernandez-Montoya - * Date: 13.04.2017 - * Copyright: 2018, Institute for Automation of Complex Power Systems, EONERC - * * This file is part of VILLASweb. * * VILLASweb is free software: you can redistribute it and/or modify @@ -24,6 +17,7 @@ class NotificationsFactory { + // This is an example static get NO_SIM_MODEL_AVAILABLE() { return { title: 'No simulation model available', diff --git a/src/common/header-menu.js b/src/common/header-menu.js index 0273407..6105f76 100644 --- a/src/common/header-menu.js +++ b/src/common/header-menu.js @@ -1,8 +1,4 @@ /** - * File: header-menu.js - * Author: Markus Grigull - * Date: 17.08.2017 - * * This file is part of VILLASweb. * * VILLASweb is free software: you can redistribute it and/or modify @@ -31,9 +27,8 @@ export default class HeaderMenu extends React.Component {
    • Home
    • -
    • Projects
    • -
    • Simulations
    • -
    • Simulators
    • +
    • Scenarios
    • +
    • Infrastructure Components
    • { this.props.currentRole === 'Admin' ?
    • User Management
    • : '' } diff --git a/src/common/menu-sidebar.js b/src/common/menu-sidebar.js index a597ccd..35ecfd0 100644 --- a/src/common/menu-sidebar.js +++ b/src/common/menu-sidebar.js @@ -22,9 +22,6 @@ import React from 'react'; import { NavLink } from 'react-router-dom'; -//
    • Simulations
    • -//
    • Projects
    • - class SidebarMenu extends React.Component { render() { return ( @@ -34,7 +31,7 @@ class SidebarMenu extends React.Component {
      • Home
      • Scenarios
      • -
      • Infrastructure Components
      • +
      • Infrastructure Components
      • { this.props.currentRole === 'Admin' ?
      • User Management
      • : '' } diff --git a/src/dashboard/import-dashboard.js b/src/dashboard/import-dashboard.js index 8144193..606e1a9 100644 --- a/src/dashboard/import-dashboard.js +++ b/src/dashboard/import-dashboard.js @@ -1,8 +1,4 @@ /** - * File: import-simulator.js - * Author: Markus Grigull - * Date: 04.04.2017 - * * This file is part of VILLASweb. * * VILLASweb is free software: you can redistribute it and/or modify @@ -68,12 +64,12 @@ class ImportDashboardDialog extends React.Component { var self = this; reader.onload = function(event) { - // read simulator + // read IC const dashboard = JSON.parse(event.target.result); - let defaultSimulator = ""; + let defaultIC = ""; if (self.props.simulation.models != null) { - defaultSimulator = self.props.simulation.models[0].simulator; + defaultIC = self.props.simulation.models[0].icID; } dashboard.widgets.forEach(widget => { @@ -83,7 +79,6 @@ class ImportDashboardDialog extends React.Component { case 'Table': case 'PlotTable': case 'Gauge': - widget.simulator = defaultSimulator; break; default: diff --git a/src/simulator/edit-simulator.js b/src/ic/edit-ic.js similarity index 75% rename from src/simulator/edit-simulator.js rename to src/ic/edit-ic.js index 2a2d40a..b97d02a 100644 --- a/src/simulator/edit-simulator.js +++ b/src/ic/edit-ic.js @@ -1,5 +1,4 @@ /** - * * This file is part of VILLASweb. * * VILLASweb is free software: you can redistribute it and/or modify @@ -23,7 +22,7 @@ import _ from 'lodash'; import Dialog from '../common/dialogs/dialog'; import ParametersEditor from '../common/parameters-editor'; -class EditSimulatorDialog extends React.Component { +class EditICDialog extends React.Component { valid = true; constructor(props) { @@ -38,13 +37,13 @@ class EditSimulatorDialog extends React.Component { onClose(canceled) { if (canceled === false) { if (this.valid) { - let data = this.props.simulator.properties; + let data = this.props.ic.properties; - if (this.state.name != null && this.state.name !== "" && this.state.name !== _.get(this.props.simulator, 'rawProperties.name')) { + if (this.state.name != null && this.state.name !== "" && this.state.name !== _.get(this.props.ic, 'rawProperties.name')) { data.name = this.state.name; } - if (this.state.endpoint != null && this.state.endpoint !== "" && this.state.endpoint !== "http://" && this.state.endpoint !== _.get(this.props.simulator, 'rawProperties.endpoint')) { + if (this.state.endpoint != null && this.state.endpoint !== "" && this.state.endpoint !== "http://" && this.state.endpoint !== _.get(this.props.ic, 'rawProperties.endpoint')) { data.endpoint = this.state.endpoint; } @@ -61,8 +60,8 @@ class EditSimulatorDialog extends React.Component { resetState() { this.setState({ - name: _.get(this.props.simulator, 'properties.name') || _.get(this.props.simulator, 'rawProperties.name'), - endpoint: _.get(this.props.simulator, 'properties.endpoint') || _.get(this.props.simulator, 'rawProperties.endpoint') + name: _.get(this.props.ic, 'properties.name') || _.get(this.props.ic, 'rawProperties.name'), + endpoint: _.get(this.props.ic, 'properties.endpoint') || _.get(this.props.ic, 'rawProperties.endpoint') }); } @@ -72,17 +71,17 @@ class EditSimulatorDialog extends React.Component { Name - this.handleChange(e)} /> + this.handleChange(e)} /> Endpoint - this.handleChange(e)} /> + this.handleChange(e)} /> Properties - + @@ -90,4 +89,4 @@ class EditSimulatorDialog extends React.Component { } } -export default EditSimulatorDialog; +export default EditICDialog; diff --git a/src/simulator/simulator-action.js b/src/ic/ic-action.js similarity index 92% rename from src/simulator/simulator-action.js rename to src/ic/ic-action.js index 9e29deb..4e787af 100644 --- a/src/simulator/simulator-action.js +++ b/src/ic/ic-action.js @@ -1,8 +1,4 @@ /** - * File: simulator-actionm.js - * Author: Markus Grigull - * Date: 12.04.2018 - * * This file is part of VILLASweb. * * VILLASweb is free software: you can redistribute it and/or modify @@ -22,7 +18,7 @@ import React from 'react'; import { Button, ButtonToolbar, DropdownButton, DropdownItem } from 'react-bootstrap'; -class SimulatorAction extends React.Component { +class ICAction extends React.Component { constructor(props) { super(props); @@ -70,4 +66,4 @@ class SimulatorAction extends React.Component { } } -export default SimulatorAction; +export default ICAction; diff --git a/src/simulator/simulator-data-data-manager.js b/src/ic/ic-data-data-manager.js similarity index 93% rename from src/simulator/simulator-data-data-manager.js rename to src/ic/ic-data-data-manager.js index 94e31a0..99e37ae 100644 --- a/src/simulator/simulator-data-data-manager.js +++ b/src/ic/ic-data-data-manager.js @@ -1,8 +1,4 @@ /** - * File: simulator-data-data-manager.js - * Author: Markus Grigull - * Date: 03.03.2017 - * * This file is part of VILLASweb. * * VILLASweb is free software: you can redistribute it and/or modify @@ -25,7 +21,7 @@ import AppDispatcher from '../common/app-dispatcher'; const OFFSET_TYPE = 2; const OFFSET_VERSION = 4; -class SimulatorDataDataManager { +class IcDataDataManager { constructor() { this._sockets = {}; } @@ -71,7 +67,7 @@ class SimulatorDataDataManager { onOpen(event, identifier, firstOpen) { AppDispatcher.dispatch({ - type: 'simulatorData/opened', + type: 'icData/opened', id: identifier, firstOpen: firstOpen }); @@ -79,7 +75,7 @@ class SimulatorDataDataManager { onClose(event, identifier) { AppDispatcher.dispatch({ - type: 'simulatorData/closed', + type: 'icData/closed', id: identifier, notification: (event.code !== 4000) }); @@ -93,7 +89,7 @@ class SimulatorDataDataManager { if (msgs.length > 0) { AppDispatcher.dispatch({ - type: 'simulatorData/data-changed', + type: 'icData/data-changed', data: msgs, id: identifier }); @@ -165,4 +161,4 @@ class SimulatorDataDataManager { } } -export default new SimulatorDataDataManager(); +export default new IcDataDataManager(); diff --git a/src/simulator/simulator-data-store.js b/src/ic/ic-data-store.js similarity index 76% rename from src/simulator/simulator-data-store.js rename to src/ic/ic-data-store.js index bb84442..6de8669 100644 --- a/src/simulator/simulator-data-store.js +++ b/src/ic/ic-data-store.js @@ -1,8 +1,4 @@ /** - * File: simulator-data-store.js - * Author: Markus Grigull - * Date: 03.03.2017 - * * This file is part of VILLASweb. * * VILLASweb is free software: you can redistribute it and/or modify @@ -22,11 +18,11 @@ import { ReduceStore } from 'flux/utils'; import AppDispatcher from '../common/app-dispatcher'; -import SimulatorDataDataManager from './simulator-data-data-manager'; +import ICDataDataManager from './ic-data-data-manager'; const MAX_VALUES = 10000; -class SimulationDataStore extends ReduceStore { +class ICDataStore extends ReduceStore { constructor() { super(AppDispatcher); } @@ -37,14 +33,14 @@ class SimulationDataStore extends ReduceStore { reduce(state, action) { switch (action.type) { - case 'simulatorData/opened': - // create entry for simulator + case 'icData/opened': + // create entry for infrastructure component if (state[action.id] === undefined) state[action.id] = {}; return state; - case 'simulatorData/prepare': + case 'icData/prepare': state[action.id] = { output: { sequence: -1, @@ -64,8 +60,8 @@ class SimulationDataStore extends ReduceStore { this.__emitChange(); return state; - case 'simulatorData/data-changed': - // get index for simulator id + case 'icData/data-changed': + // get index for IC id if (state[action.id] == null) { return state; } @@ -80,7 +76,7 @@ class SimulationDataStore extends ReduceStore { for (let j = 0; j < action.data.length; j++) { let smp = action.data[j]; - // add data to simulator + // add data to infrastructure component for (let i = 0; i < smp.length; i++) { while (state[action.id].output.values.length < i + 1) { state[action.id].output.values.push([]); @@ -105,17 +101,17 @@ class SimulationDataStore extends ReduceStore { return state; - case 'simulatorData/inputChanged': - if (state[action.simulator] == null || state[action.simulator].input == null) { + case 'icData/inputChanged': + if (state[action.ic] == null || state[action.ic].input == null) { return state; } // update message properties - state[action.simulator].input.timestamp = Date.now(); - state[action.simulator].input.sequence++; - state[action.simulator].input.values[action.signal] = action.data; + state[action.ic].input.timestamp = Date.now(); + state[action.ic].input.sequence++; + state[action.ic].input.values[action.signal] = action.data; - SimulatorDataDataManager.send(state[action.simulator].input, action.simulator); + ICDataDataManager.send(state[action.ic].input, action.ic); return state; @@ -125,4 +121,4 @@ class SimulationDataStore extends ReduceStore { } } -export default new SimulationDataStore(); +export default new ICDataStore(); diff --git a/src/simulator/simulator-store.js b/src/ic/ic-store.js similarity index 51% rename from src/simulator/simulator-store.js rename to src/ic/ic-store.js index 7b51818..d91ea19 100644 --- a/src/simulator/simulator-store.js +++ b/src/ic/ic-store.js @@ -1,8 +1,4 @@ /** - * File: simulator-store.js - * Author: Markus Grigull - * Date: 03.03.2018 - * * This file is part of VILLASweb. * * VILLASweb is free software: you can redistribute it and/or modify @@ -22,57 +18,57 @@ import _ from 'lodash'; import ArrayStore from '../common/array-store'; -import SimulatorsDataManager from './simulators-data-manager'; -import SimulatorDataDataManager from './simulator-data-data-manager'; +import ICsDataManager from './ics-data-manager'; +import ICDataDataManager from './ic-data-data-manager'; -class SimulatorStore extends ArrayStore { +class InfrastructureComponentStore extends ArrayStore { constructor() { - super('simulators', SimulatorsDataManager); + super('ic', ICsDataManager); } reduce(state, action) { switch(action.type) { - case 'simulators/loaded': - // connect to each simulator - for (let simulator of action.data) { - const endpoint = _.get(simulator, 'properties.endpoint') || _.get(simulator, 'rawProperties.endpoint'); + case 'ic/loaded': + // connect to each infrastructure component + for (let ic of action.data) { + const endpoint = _.get(ic, 'properties.endpoint') || _.get(ic, 'rawProperties.endpoint'); if (endpoint != null && endpoint !== '') { - SimulatorDataDataManager.open(endpoint, simulator.id); + ICDataDataManager.open(endpoint, ic.id); } else { - // console.warn('Endpoint not found for simulator at ' + endpoint); - // console.log(simulator); + // console.warn('Endpoint not found for IC at ' + endpoint); + // console.log(ic); } } return super.reduce(state, action); - case 'simulators/edited': - // connect to each simulator - const simulator = action.data; - const endpoint = _.get(simulator, 'properties.endpoint') || _.get(simulator, 'rawProperties.endpoint'); + case 'ic/edited': + // connect to each infrastructure component + const ic = action.data; + const endpoint = _.get(ic, 'properties.endpoint') || _.get(ic, 'rawProperties.endpoint'); if (endpoint != null && endpoint !== '') { - console.log("Updating simulatorid " + simulator.id); - SimulatorDataDataManager.update(endpoint, simulator.id); + console.log("Updating IC id " + ic.id); + ICDataDataManager.update(endpoint, ic.id); } return super.reduce(state, action); - case 'simulators/fetched': + case 'ic/fetched': return this.updateElements(state, [action.data]); - case 'simulators/fetch-error': + case 'ic/fetch-error': return state; - case 'simulators/start-action': + case 'ic/start-action': if (!Array.isArray(action.data)) action.data = [ action.data ] - SimulatorsDataManager.doActions(action.simulator, action.data, action.token); + ICsDataManager.doActions(action.ic, action.data, action.token); return state; - case 'simulators/action-error': + case 'ic/action-error': console.log(action.error); return state; @@ -82,4 +78,4 @@ class SimulatorStore extends ArrayStore { } } -export default new SimulatorStore(); +export default new InfrastructureComponentStore(); diff --git a/src/simulator/simulators-data-manager.js b/src/ic/ics-data-manager.js similarity index 67% rename from src/simulator/simulators-data-manager.js rename to src/ic/ics-data-manager.js index df08f95..086e96f 100644 --- a/src/simulator/simulators-data-manager.js +++ b/src/ic/ics-data-manager.js @@ -1,8 +1,4 @@ /** - * File: simulator-data-manager.js - * Author: Markus Grigull - * Date: 03.03.2018 - * * This file is part of VILLASweb. * * VILLASweb is free software: you can redistribute it and/or modify @@ -23,25 +19,25 @@ import RestDataManager from '../common/data-managers/rest-data-manager'; import RestAPI from '../common/api/rest-api'; import AppDispatcher from '../common/app-dispatcher'; -class SimulatorsDataManager extends RestDataManager { +class IcsDataManager extends RestDataManager { constructor() { - super('simulator', '/simulators'); + super('ic', '/ic'); } - doActions(simulator, action, token = null) { - // TODO: Make only simulator id dependent - RestAPI.post(this.makeURL(this.url + '/' + simulator.id), action, token).then(response => { + doActions(ic, action, token = null) { + // TODO: Make only infrastructure component id dependent + RestAPI.post(this.makeURL(this.url + '/' + ic.id), action, token).then(response => { AppDispatcher.dispatch({ - type: 'simulators/action-started', + type: 'ic/action-started', data: response }); }).catch(error => { AppDispatcher.dispatch({ - type: 'simulators/action-error', + type: 'ic/action-error', error }); }); } } -export default new SimulatorsDataManager(); +export default new IcsDataManager(); diff --git a/src/simulator/simulators.js b/src/ic/ics.js similarity index 64% rename from src/simulator/simulators.js rename to src/ic/ics.js index e2f5a4f..6f3e89a 100644 --- a/src/simulator/simulators.js +++ b/src/ic/ics.js @@ -1,8 +1,4 @@ /** - * File: simulators.js - * Author: Markus Grigull - * Date: 02.03.2017 - * * This file is part of VILLASweb. * * VILLASweb is free software: you can redistribute it and/or modify @@ -26,22 +22,22 @@ import FileSaver from 'file-saver'; import _ from 'lodash'; import AppDispatcher from '../common/app-dispatcher'; -import SimulatorStore from './simulator-store'; +import InfrastructureComponentStore from './ic-store'; import LoginStore from '../user/login-store'; import Icon from '../common/icon'; import Table from '../common/table'; import TableColumn from '../common/table-column'; -import NewSimulatorDialog from './new-simulator'; -import EditSimulatorDialog from './edit-simulator'; -import ImportSimulatorDialog from './import-simulator'; +import NewICDialog from './new-ic'; +import EditICDialog from './edit-ic'; +import ImportICDialog from './import-ic'; -import SimulatorAction from './simulator-action'; +import ICAction from './ic-action'; import DeleteDialog from '../common/dialogs/delete-dialog'; -class Simulators extends Component { +class InfrastructureComponents extends Component { static getStores() { - return [ LoginStore, SimulatorStore ]; + return [ LoginStore, InfrastructureComponentStore ]; } static statePrio(state) { @@ -65,9 +61,9 @@ class Simulators extends Component { } static calculateState() { - const simulators = SimulatorStore.getState().sort((a, b) => { + const ics = InfrastructureComponentStore.getState().sort((a, b) => { if (a.state !== b.state) { - return Simulators.statePrio(a.state) > Simulators.statePrio(b.state); + return InfrastructureComponents.statePrio(a.state) > InfrastructureComponents.statePrio(b.state); } else if (a.name !== b.name) { return a.name < b.name; @@ -79,17 +75,17 @@ class Simulators extends Component { return { sessionToken: LoginStore.getState().token, - simulators, - modalSimulator: {}, + ics: ics, + modalIC: {}, deleteModal: false, - selectedSimulators: [] + selectedICs: [] }; } componentDidMount() { AppDispatcher.dispatch({ - type: 'simulators/start-load', + type: 'ic/start-load', token: this.state.sessionToken, }); @@ -108,7 +104,7 @@ class Simulators extends Component { } else { AppDispatcher.dispatch({ - type: 'simulators/start-load', + type: 'ic/start-load', token: this.state.sessionToken, }); } @@ -120,7 +116,7 @@ class Simulators extends Component { if (data) { AppDispatcher.dispatch({ - type: 'simulators/start-add', + type: 'ic/start-add', data, token: this.state.sessionToken, }); @@ -131,13 +127,13 @@ class Simulators extends Component { this.setState({ editModal : false }); if (data) { - let simulator = this.state.simulators[this.state.modalIndex]; - simulator.properties = data; - this.setState({ simulator }); + let ic = this.state.ics[this.state.modalIndex]; + ic.properties = data; + this.setState({ ic: ic }); AppDispatcher.dispatch({ - type: 'simulators/start-edit', - data: simulator, + type: 'ic/start-edit', + data: ic, token: this.state.sessionToken, }); } @@ -151,20 +147,20 @@ class Simulators extends Component { } AppDispatcher.dispatch({ - type: 'simulators/start-remove', - data: this.state.modalSimulator, + type: 'ic/start-remove', + data: this.state.modalIC, token: this.state.sessionToken, }); } - exportSimulator(index) { + exportIC(index) { // filter properties - let simulator = Object.assign({}, this.state.simulators[index]); - delete simulator.id; + let ic = Object.assign({}, this.state.ics[index]); + delete ic.id; // show save dialog - const blob = new Blob([JSON.stringify(simulator, null, 2)], { type: 'application/json' }); - FileSaver.saveAs(blob, 'simulator - ' + (_.get(simulator, 'properties.name') || _.get(simulator, 'rawProperties.name') || 'undefined') + '.json'); + const blob = new Blob([JSON.stringify(ic, null, 2)], { type: 'application/json' }); + FileSaver.saveAs(blob, 'ic - ' + (_.get(ic, 'properties.name') || _.get(ic, 'rawProperties.name') || 'undefined') + '.json'); } closeImportModal(data) { @@ -172,25 +168,25 @@ class Simulators extends Component { if (data) { AppDispatcher.dispatch({ - type: 'simulators/start-add', + type: 'ic/start-add', data, token: this.state.sessionToken, }); } } - onSimulatorChecked(index, event) { - const selectedSimulators = Object.assign([], this.state.selectedSimulators); - for (let key in selectedSimulators) { - if (selectedSimulators[key] === index) { + onICChecked(index, event) { + const selectedICs = Object.assign([], this.state.selectedICs); + for (let key in selectedICs) { + if (selectedICs[key] === index) { // update existing entry if (event.target.checked) { return; } - selectedSimulators.splice(key, 1); + selectedICs.splice(key, 1); - this.setState({ selectedSimulators }); + this.setState({ selectedICs: selectedICs }); return; } } @@ -200,34 +196,34 @@ class Simulators extends Component { return; } - selectedSimulators.push(index); - this.setState({ selectedSimulators }); + selectedICs.push(index); + this.setState({ selectedICs: selectedICs }); } runAction = action => { - for (let index of this.state.selectedSimulators) { + for (let index of this.state.selectedICs) { AppDispatcher.dispatch({ - type: 'simulators/start-action', - simulator: this.state.simulators[index], + type: 'ic/start-action', + ic: this.state.ics[index], data: action.data, token: this.state.sessionToken, }); } } - static isSimulatorOutdated(simulator) { - if (!simulator.stateUpdatedAt) + static isICOutdated(component) { + if (!component.stateUpdatedAt) return true; const fiveMinutes = 5 * 60 * 1000; - return Date.now() - new Date(simulator.stateUpdatedAt) > fiveMinutes; + return Date.now() - new Date(component.stateUpdatedAt) > fiveMinutes; } - static stateLabelStyle(state, simulator){ + static stateLabelStyle(state, component){ var style = [ 'label' ]; - if (Simulators.isSimulatorOutdated(simulator) && state !== 'shutdown') { + if (InfrastructureComponents.isICOutdated(component) && state !== 'shutdown') { style.push('label-outdated'); } @@ -274,30 +270,30 @@ class Simulators extends Component {

        Infrastructure Components

        -
    - this.onSimulatorChecked(index, event)} width='30' /> +
    + this.onICChecked(index, event)} width='30' /> - + {/* */} - + this.setState({ editModal: true, modalSimulator: this.state.simulators[index], modalIndex: index })} - onExport={index => this.exportSimulator(index)} - onDelete={index => this.setState({ deleteModal: true, modalSimulator: this.state.simulators[index], modalIndex: index })} + onEdit={index => this.setState({ editModal: true, modalIC: this.state.ics[index], modalIndex: index })} + onExport={index => this.exportIC(index)} + onDelete={index => this.setState({ deleteModal: true, modalIC: this.state.ics[index], modalIndex: index })} />
    -
    @@ -309,15 +305,15 @@ class Simulators extends Component {
    - this.closeNewModal(data)} /> - this.closeEditModal(data)} simulator={this.state.modalSimulator} /> - this.closeImportModal(data)} /> + this.closeNewModal(data)} /> + this.closeEditModal(data)} ic={this.state.modalIC} /> + this.closeImportModal(data)} /> - this.closeDeleteModal(e)} /> + this.closeDeleteModal(e)} />
    ); } } let fluxContainerConverter = require('../common/FluxContainerConverter'); -export default Container.create(fluxContainerConverter.convert(Simulators)); +export default Container.create(fluxContainerConverter.convert(InfrastructureComponents)); diff --git a/src/simulator/import-simulator.js b/src/ic/import-ic.js similarity index 88% rename from src/simulator/import-simulator.js rename to src/ic/import-ic.js index 74877b1..1d11af2 100644 --- a/src/simulator/import-simulator.js +++ b/src/ic/import-ic.js @@ -1,8 +1,4 @@ /** - * File: new-simulator.js - * Author: Markus Grigull - * Date: 27.03.2018 - * * This file is part of VILLASweb. * * VILLASweb is free software: you can redistribute it and/or modify @@ -25,7 +21,7 @@ import _ from 'lodash'; import Dialog from '../common/dialogs/dialog'; -class ImportSimulatorDialog extends React.Component { +class ImportICDialog extends React.Component { valid = false; imported = false; @@ -80,13 +76,13 @@ class ImportSimulatorDialog extends React.Component { const self = this; reader.onload = function(event) { - // read simulator - const simulator = JSON.parse(event.target.result); + // read component + const ic = JSON.parse(event.target.result); self.imported = true; self.setState({ - name: _.get(simulator, 'properties.name') || _.get(simulator, 'rawProperties.name'), - endpoint: _.get(simulator, 'properties.endpoint') || _.get(simulator, 'rawProperties.endpoint'), - uuid: simulator.uuid + name: _.get(ic, 'properties.name') || _.get(ic, 'rawProperties.name'), + endpoint: _.get(ic, 'properties.endpoint') || _.get(ic, 'rawProperties.endpoint'), + uuid: ic.uuid }); }; @@ -143,4 +139,4 @@ class ImportSimulatorDialog extends React.Component { } } -export default ImportSimulatorDialog; +export default ImportICDialog; diff --git a/src/simulator/new-simulator.js b/src/ic/new-ic.js similarity index 94% rename from src/simulator/new-simulator.js rename to src/ic/new-ic.js index 4a8bcc0..915370d 100644 --- a/src/simulator/new-simulator.js +++ b/src/ic/new-ic.js @@ -1,8 +1,4 @@ /** - * File: new-simulator.js - * Author: Markus Grigull - * Date: 02.03.2017 - * * This file is part of VILLASweb. * * VILLASweb is free software: you can redistribute it and/or modify @@ -24,7 +20,7 @@ import { FormGroup, FormControl, FormLabel } from 'react-bootstrap'; import Dialog from '../common/dialogs/dialog'; -class NewSimulatorDialog extends React.Component { +class NewICDialog extends React.Component { valid = false; constructor(props) { @@ -119,4 +115,4 @@ class NewSimulatorDialog extends React.Component { } } -export default NewSimulatorDialog; +export default NewICDialog; diff --git a/src/scenario/import-scenario.js b/src/scenario/import-scenario.js index 8402e23..bdfe1ab 100644 --- a/src/scenario/import-scenario.js +++ b/src/scenario/import-scenario.js @@ -55,14 +55,14 @@ class ImportScenarioDialog extends React.Component { } handleChange(e, index) { - if (e.target.id === 'simulator') { + /*if (e.target.id === 'icID') { const models = this.state.models; - models[index].simulator = JSON.parse(e.target.value); + models[index].icID = JSON.parse(e.target.value); this.setState({ models }); return; - } + }*/ this.setState({ [e.target.id]: e.target.value }); @@ -96,13 +96,6 @@ class ImportScenarioDialog extends React.Component { reader.onload = onloadEvent => { const scenario = JSON.parse(onloadEvent.target.result); - // scenario.simulationModels.forEach(model => { - // model.simulator = { - // node: self.props.nodes[0]._id, - // simulator: 0 - // }; - // }); - self.imported = true; self.valid = true; self.setState({ name: scenario.name, models: scenario.simulationModels, startParameters: scenario.startParameters, running: scenario.running }); @@ -131,18 +124,6 @@ class ImportScenarioDialog extends React.Component { - {/* {this.state.models.map((model, index) => ( - - {model.name} - Simulator - this.handleChange(e, index)}> - {this.props.nodes.map(node => ( - node.simulators.map((simulator, index) => ( - - )) - ))} - - - ))} */}
    ; } diff --git a/src/scenario/scenario.js b/src/scenario/scenario.js index a339127..c4d8b60 100644 --- a/src/scenario/scenario.js +++ b/src/scenario/scenario.js @@ -1,8 +1,4 @@ /** - * File: scenario.js - * Author: Sonja Happ - * Date: 20.08.2019 - * * This file is part of VILLASweb. * * VILLASweb is free software: you can redistribute it and/or modify @@ -26,7 +22,7 @@ import FileSaver from 'file-saver'; import _ from 'lodash'; import ScenarioStore from './scenario-store'; -import SimulatorStore from '../simulator/simulator-store'; +import ICStore from '../ic/ic-store'; import DashboardStore from '../dashboard/dashboard-store'; import SimulationModelStore from '../simulationmodel/simulation-model-store'; import LoginStore from '../user/login-store'; @@ -40,7 +36,7 @@ import ImportSimulationModelDialog from '../simulationmodel/import-simulation-mo import ImportDashboardDialog from "../dashboard/import-dashboard"; import NewDashboardDialog from "../dashboard/new-dashboard"; -import SimulatorAction from '../simulator/simulator-action'; +import ICAction from '../ic/ic-action'; import DeleteDialog from '../common/dialogs/delete-dialog'; import EditSimulationModelDialog from "../simulationmodel/edit-simulation-model"; import EditSignalMapping from "../signal/edit-signal-mapping"; @@ -48,7 +44,7 @@ import FileStore from "../file/file-store" class Scenario extends React.Component { static getStores() { - return [ ScenarioStore, SimulationModelStore, DashboardStore, SimulatorStore, LoginStore, SignalStore, FileStore]; + return [ ScenarioStore, SimulationModelStore, DashboardStore, ICStore, LoginStore, SignalStore, FileStore]; } static calculateState(prevState, props) { @@ -81,7 +77,7 @@ class Scenario extends React.Component { dashboards, signals, files, - simulators: SimulatorStore.getState(), + ics: ICStore.getState(), deleteSimulationModelModal: false, importSimulationModelModal: false, @@ -123,9 +119,9 @@ class Scenario extends React.Component { param: '?scenarioID='+this.state.scenario.id, }); - // load simulators to enable that simulation models work with them + // load ICs to enable that simulation models work with them AppDispatcher.dispatch({ - type: 'simulators/start-load', + type: 'ic/start-load', token: this.state.sessionToken, }); @@ -140,7 +136,7 @@ class Scenario extends React.Component { const simulationModel = { scenarioID: this.state.scenario.id, name: 'New Simulation Model', - simulatorID: this.state.simulators.length > 0 ? this.state.simulators[0].id : null, + icID: this.state.ics.length > 0 ? this.state.ics[0].id : null, startParameters: {}, }; @@ -245,15 +241,15 @@ class Scenario extends React.Component { runAction = action => { for (let index of this.state.selectedSimulationModels) { - // get simulator for model - let simulator = null; - for (let sim of this.state.simulators) { - if (sim._id === this.state.simulationModels[index].simulator) { - simulator = sim; + // get IC for model + let ic = null; + for (let component of this.state.ics) { + if (component._id === this.state.simulationModels[index].icID) { + ic = component; } } - if (simulator == null) { + if (ic == null) { continue; } @@ -262,18 +258,18 @@ class Scenario extends React.Component { } AppDispatcher.dispatch({ - type: 'simulators/start-action', - simulator, + type: 'ic/start-action', + ic: ic, data: action.data, token: this.state.sessionToken }); } }; - getSimulatorName(simulatorId) { - for (let simulator of this.state.simulators) { - if (simulator.id === simulatorId) { - return _.get(simulator, 'properties.name') || _.get(simulator, 'rawProperties.name') || simulator.uuid; + getICName(icID) { + for (let ic of this.state.ics) { + if (ic.id === icID) { + return _.get(ic, 'properties.name') || _.get(ic, 'rawProperties.name') || ic.uuid; } } } @@ -426,7 +422,7 @@ class Scenario extends React.Component { editButton onEdit={index => this.setState({ editInputSignalsModal: true, modalSimulationModelData: this.state.simulationModels[index], modalSimulationModelIndex: index })} /> - this.getSimulatorName(simulatorID)} /> + this.getICName(icID)} />
    - - this.closeEditSimulationModelModal(data)} simulationModel={this.state.modalSimulationModelData} simulators={this.state.simulators} /> - this.importSimulationModel(data)} simulators={this.state.simulators} /> + this.closeEditSimulationModelModal(data)} simulationModel={this.state.modalSimulationModelData} ics={this.state.ics} /> + this.importSimulationModel(data)} ics={this.state.ics} /> this.closeDeleteSimulationModelModal(c)} /> + const ICOptions = this.props.ics.map(s => ); @@ -116,10 +116,10 @@ class EditSimulationModelDialog extends React.Component { - - Simulator - this.handleChange(e)}> - {simulatorOptions} + + Infrastructure Component + this.handleChange(e)}> + {ICOptions} diff --git a/src/simulationmodel/import-simulation-model.js b/src/simulationmodel/import-simulation-model.js index 885b281..f1bd92a 100644 --- a/src/simulationmodel/import-simulation-model.js +++ b/src/simulationmodel/import-simulation-model.js @@ -68,7 +68,7 @@ class ImportSimulationModelDialog extends React.Component { reader.onload = event => { const model = JSON.parse(event.target.result); - model.simulator = this.props.simulators.length > 0 ? this.props.simulators[0]._id : null; + model.icID = this.props.ics.length > 0 ? this.props.ics[0]._id : null; self.imported = true; @@ -78,10 +78,10 @@ class ImportSimulationModelDialog extends React.Component { reader.readAsText(file); } - handleSimulatorChange = event => { + handleICChange = event => { const model = this.state.model; - model.simulator = event.target.value; + model.icID = event.target.value; this.setState({ model }); } @@ -95,11 +95,11 @@ class ImportSimulationModelDialog extends React.Component { - + Infrastructure Component - - {this.props.simulators.map(simulator => ( - + + {this.props.ics.map(ic => ( + ))} diff --git a/src/simulationmodel/simulation-models-data-manager.js b/src/simulationmodel/simulation-models-data-manager.js index c9554a8..7326c42 100644 --- a/src/simulationmodel/simulation-models-data-manager.js +++ b/src/simulationmodel/simulation-models-data-manager.js @@ -1,8 +1,4 @@ /** - * File: simulation-models-data-manager.js - * Author: Markus Grigull - * Date: 20.04.2018 - * * This file is part of VILLASweb. * * VILLASweb is free software: you can redistribute it and/or modify @@ -40,10 +36,10 @@ class SimulationModelDataManager extends RestDataManager { loadModelData(model) { AppDispatcher.dispatch({ - type: 'simulatorData/prepare', + type: 'icData/prepare', inputLength: parseInt(model.inputLength, 10), outputLength: parseInt(model.outputLength, 10), - id: model.simulator + id: model.icID }); } diff --git a/src/user/login-store.js b/src/user/login-store.js index b19ba43..0b461e2 100644 --- a/src/user/login-store.js +++ b/src/user/login-store.js @@ -1,8 +1,4 @@ /** - * File: user-store.js - * Author: Markus Grigull - * Date: 15.03.2017 - * * This file is part of VILLASweb. * * VILLASweb is free software: you can redistribute it and/or modify @@ -23,7 +19,7 @@ import { ReduceStore } from 'flux/utils'; import AppDispatcher from '../common/app-dispatcher'; import UsersDataManager from './users-data-manager'; -import SimulatorDataDataManager from '../simulator/simulator-data-data-manager'; +import ICDataDataManager from '../ic/ic-data-data-manager'; class LoginStore extends ReduceStore { constructor() { @@ -45,8 +41,8 @@ class LoginStore extends ReduceStore { return Object.assign({}, state, { loginMessage: null }); case 'users/logout': - // disconnect from all simulators - SimulatorDataDataManager.closeAll(); + // disconnect from all infrastructure components + ICDataDataManager.closeAll(); //remove token and current user from local storage localStorage.clear(); diff --git a/src/widget/widget.js b/src/widget/widget.js index ced0e4c..fc11c1a 100644 --- a/src/widget/widget.js +++ b/src/widget/widget.js @@ -24,7 +24,7 @@ import { Container } from 'flux/utils'; import AppDispatcher from '../common/app-dispatcher'; import LoginStore from '../user/login-store'; -import SimulatorDataStore from '../simulator/simulator-data-store'; +import ICDataStore from '../ic/ic-data-store'; import SimulationModelStore from '../simulationmodel/simulation-model-store'; import FileStore from '../file/file-store'; import SignalStore from '../signal/signal-store' @@ -53,39 +53,39 @@ import '../styles/widgets.css'; class Widget extends React.Component { static getStores() { - return [ SimulatorDataStore, SimulationModelStore, FileStore, LoginStore, SignalStore]; + return [ ICDataStore, SimulationModelStore, FileStore, LoginStore, SignalStore]; } static calculateState(prevState, props) { - let simulatorData = {}; + let icData = {}; if (props.paused) { - if (prevState && prevState.simulatorData) { - simulatorData = JSON.parse(JSON.stringify(prevState.simulatorData)); + if (prevState && prevState.icData) { + icData = JSON.parse(JSON.stringify(prevState.icData)); } } else { - simulatorData = SimulatorDataStore.getState(); + icData = ICDataStore.getState(); } - // Get the simulator IDs and signal indexes for all signals of the widget + // Get the IC IDs and signal indexes for all signals of the widget let simulationModels = SimulationModelStore.getState(); // TODO make sure that the signals are only the signals that belong to the scenario at hand let signals = SignalStore.getState(); - let simulatorIDs = []; + let icIDs = []; if ( props.data.signalIDs.length > 0){ for (let i in props.data.signalIDs.length){ let signal = signals.find(s => s.id === props.data.signalIDs[i]); let model = simulationModels.find(m => m.id === signal.simulationModelID); - simulatorIDs[i] = model.simulatorID; + icIDs[i] = model.icID; } } return { - simulatorData, + icData: icData, signals: signals, - simulatorIDs: simulatorIDs, + icIDs: icIDs, files: FileStore.getState(), sequence: prevState != null ? prevState.sequence + 1 : 0, @@ -118,8 +118,8 @@ class Widget extends React.Component { inputDataChanged(widget, data) { // The following assumes that a widget modifies/ uses exactly one signal AppDispatcher.dispatch({ - type: 'simulatorData/inputChanged', - simulator: this.state.simulatorIDs[0], + type: 'icData/inputChanged', + ic: this.state.icIDs[0], signal: this.state.signals[0].index, data }); @@ -128,21 +128,21 @@ class Widget extends React.Component { createWidget(widget) { if (widget.type === 'CustomAction') { - return + return } else if (widget.type === 'Action') { - return + return } else if (widget.type === 'Lamp') { - return + return } else if (widget.type === 'Value') { - return + return } else if (widget.type === 'Plot') { - return + return } else if (widget.type === 'Table') { - return + return } else if (widget.type === 'Label') { return } else if (widget.type === 'PlotTable') { - return this.props.onWidgetStatusChange(w, this.props.index)} paused={this.props.paused} /> + return this.props.onWidgetStatusChange(w, this.props.index)} paused={this.props.paused} /> } else if (widget.type === 'Image') { return } else if (widget.type === 'Button') { @@ -152,7 +152,7 @@ class Widget extends React.Component { } else if (widget.type === 'Slider') { return this.props.onWidgetStatusChange(w, this.props.index) } onInputChanged={value => this.inputDataChanged(widget, value)} signals={this.state.signals}/> } else if (widget.type === 'Gauge') { - return + return } else if (widget.type === 'Box') { return } else if (widget.type === 'HTML') { diff --git a/src/widget/widgets/custom-action.js b/src/widget/widgets/custom-action.js index 15954de..84696cb 100644 --- a/src/widget/widgets/custom-action.js +++ b/src/widget/widgets/custom-action.js @@ -1,9 +1,4 @@ /** - * File: action.js - * Author: Steffen Vogel - * Date: 21.11.2018 - * Copyright: 2018, Institute for Automation of Complex Power Systems, EONERC - * * This file is part of VILLASweb. * * VILLASweb is free software: you can redistribute it and/or modify @@ -24,7 +19,7 @@ import React, { Component } from 'react'; import { Button } from 'react-bootstrap'; import Icon from '../../common/icon'; import LoginStore from '../../user/login-store'; -import SimulatorStore from '../../simulator/simulator-store'; +import ICStore from '../../ic/ic-store'; import AppDispatcher from '../../common/app-dispatcher'; class WidgetCustomAction extends Component { @@ -32,12 +27,12 @@ class WidgetCustomAction extends Component { super(props); this.state = { - simulator: null + ic: null }; } static getStores() { - return [ SimulatorStore, LoginStore ]; + return [ ICStore, LoginStore ]; } static getDerivedStateFromProps(props, state){ @@ -46,15 +41,15 @@ class WidgetCustomAction extends Component { } return{ - simulator: SimulatorStore.getState().find(s => s.id === props.simulatorIDs[0]), + ic: ICStore.getState().find(s => s.id === props.icIDs[0]), sessionToken: LoginStore.getState().token }; } onClick() { AppDispatcher.dispatch({ - type: 'simulators/start-action', - simulator: this.state.simulator, + type: 'ic/start-action', + ic: this.state.ic, data: this.props.widget.customProperties.actions, token: this.state.sessionToken }); @@ -62,7 +57,7 @@ class WidgetCustomAction extends Component { render() { return
    -
    ; diff --git a/src/widget/widgets/gauge.js b/src/widget/widgets/gauge.js index f029344..854034a 100644 --- a/src/widget/widgets/gauge.js +++ b/src/widget/widgets/gauge.js @@ -84,15 +84,15 @@ class WidgetGauge extends Component { returnState["unit"] = widgetSignal.unit; } - const simulator = props.simulatorIDs[0]; + const ICid = props.icIDs[0]; // update value if (props.data == null - || props.data[simulator] == null - || props.data[simulator].output == null - || props.data[simulator].output.values == null - || props.data[simulator].output.values.length === 0 - || props.data[simulator].output.values[0].length === 0) { + || props.data[ICid] == null + || props.data[ICid].output == null + || props.data[ICid].output.values == null + || props.data[ICid].output.values.length === 0 + || props.data[ICid].output.values[0].length === 0) { returnState["value"] = 0; } @@ -102,7 +102,7 @@ class WidgetGauge extends Component { let updateMaxValue = false; // check if value has changed - const signalData = props.data[simulator].output.values[widgetSignal.index]; + const signalData = props.data[ICid].output.values[widgetSignal.index]; // Take just 3 decimal positions // Note: Favor this method over Number.toFixed(n) in order to avoid a type conversion, since it returns a String if (signalData != null) { diff --git a/src/widget/widgets/lamp.js b/src/widget/widgets/lamp.js index 2c1cc63..cc4305c 100644 --- a/src/widget/widgets/lamp.js +++ b/src/widget/widgets/lamp.js @@ -38,20 +38,20 @@ class WidgetLamp extends Component { return{ value: ''}; } - const simulator = props.simulatorIDs[0]; + const ic = props.icIDs[0]; let signalID = props.widget.signalIDs[0]; let widgetSignal = props.signals.find(sig => sig.id === signalID); // update value if (props.data == null - || props.data[simulator] == null - || props.data[simulator].output == null - || props.data[simulator].output.values == null) { + || props.data[ic] == null + || props.data[ic].output == null + || props.data[ic].output.values == null) { return{value:''}; } // check if value has changed - const signalData = props.data[simulator].output.values[widgetSignal.index]; + const signalData = props.data[ic].output.values[widgetSignal.index]; if (signalData != null && state.value !== signalData[signalData.length - 1].y) { return { value: signalData[signalData.length - 1].y }; } diff --git a/src/widget/widgets/plot-table.js b/src/widget/widgets/plot-table.js index 397189e..6678140 100644 --- a/src/widget/widgets/plot-table.js +++ b/src/widget/widgets/plot-table.js @@ -102,11 +102,11 @@ class WidgetPlotTable extends Component { return
    ; } - const simulator = this.props.simulationModel.simulator; - let simulatorData = []; + const ic = this.props.simulationModel.icID; + let icData = []; - if (this.props.data[simulator] != null && this.props.data[simulator].output != null && this.props.data[simulator].output.values != null) { - simulatorData = this.props.data[simulator].output.values.filter((values, index) => ( + if (this.props.data[ic] != null && this.props.data[ic].output != null && this.props.data[ic].output.values != null) { + icData = this.props.data[ic].output.values.filter((values, index) => ( this.props.widget.customProperties.signals.findIndex(value => value === index) !== -1 )); } @@ -151,7 +151,7 @@ class WidgetPlotTable extends Component {
    ( + const data = props.data[ic].output.values.filter((values, index) => ( props.widget.customProperties.signals.findIndex(value => value === index) !== -1 )); diff --git a/src/widget/widgets/table.js b/src/widget/widgets/table.js index a56d1be..70db5af 100644 --- a/src/widget/widgets/table.js +++ b/src/widget/widgets/table.js @@ -47,7 +47,7 @@ class WidgetTable extends Component { } - const simulator = props.simulatorIDs[0]; + const ICid = props.icIDs[0]; let widgetSignals = props.signals.find(sig => { for (let id of props.widget.signalIDs){ if (id === sig.id){ @@ -59,10 +59,10 @@ class WidgetTable extends Component { // check data if (props.data == null - || props.data[simulator] == null - || props.data[simulator].output == null - || props.data[simulator].output.values.length === 0 - || props.data[simulator].output.values[0].length === 0) { + || props.data[ICid] == null + || props.data[ICid].output == null + || props.data[ICid].output.values.length === 0 + || props.data[ICid].output.values[0].length === 0) { // clear values return{ @@ -75,7 +75,7 @@ class WidgetTable extends Component { // get rows const rows = []; - props.data[simulator].output.values.forEach((signal, index) => { + props.data[ICid].output.values.forEach((signal, index) => { let s = widgetSignals.find( sig => sig.index === index); // if the signal is used by the widget if (s !== undefined) { @@ -91,7 +91,7 @@ class WidgetTable extends Component { return { showUnit: props.showUnit, rows: rows, - sequence: props.data[simulator].output.sequence + sequence: props.data[ICid].output.sequence }; } diff --git a/src/widget/widgets/value.js b/src/widget/widgets/value.js index 3293feb..c6035a5 100644 --- a/src/widget/widgets/value.js +++ b/src/widget/widgets/value.js @@ -37,13 +37,14 @@ class WidgetValue extends Component { return null; } - const simulator = props.simulatorIDs[0]; + // TODO does the following line make sense? + const ICid = props.icIDs[0]; // update value if (props.data == null - || props.data[simulator] == null - || props.data[simulator].output == null - || props.data[simulator].output.values == null) { + || props.data[ICid] == null + || props.data[ICid].output == null + || props.data[ICid].output.values == null) { return{ value: '' }; } @@ -56,7 +57,7 @@ class WidgetValue extends Component { } // check if value has changed - const signalData = props.data[simulator].output.values[signal.index]; + const signalData = props.data[ICid].output.values[signal.index]; if (signalData != null && state.value !== signalData[signalData.length - 1].y) { return { value: signalData[signalData.length - 1].y, From dfc538113f120f09a4ca799bd58f9e610beac305 Mon Sep 17 00:00:00 2001 From: Sonja Happ Date: Wed, 11 Mar 2020 16:26:42 +0100 Subject: [PATCH 111/391] cleanup --- src/dashboard/import-dashboard.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/dashboard/import-dashboard.js b/src/dashboard/import-dashboard.js index 606e1a9..62109ab 100644 --- a/src/dashboard/import-dashboard.js +++ b/src/dashboard/import-dashboard.js @@ -67,7 +67,7 @@ class ImportDashboardDialog extends React.Component { // read IC const dashboard = JSON.parse(event.target.result); - let defaultIC = ""; + /*let defaultIC = ""; if (self.props.simulation.models != null) { defaultIC = self.props.simulation.models[0].icID; } @@ -86,6 +86,8 @@ class ImportDashboardDialog extends React.Component { } }); + */ + self.imported = true; self.valid = true; self.setState({ name: dashboard.name, widgets: dashboard.widgets, grid: dashboard.grid }); From 37af5649756cdd262039fdb704253f2487ad924b Mon Sep 17 00:00:00 2001 From: Sonja Happ Date: Wed, 11 Mar 2020 16:27:13 +0100 Subject: [PATCH 112/391] infrastructure components (ics) show in table --- src/ic/ic-store.js | 16 +++++++--------- src/ic/ics-data-manager.js | 4 ++-- src/ic/ics.js | 14 +++++++------- src/scenario/scenario.js | 4 ++-- src/widget/widgets/custom-action.js | 2 +- 5 files changed, 19 insertions(+), 21 deletions(-) diff --git a/src/ic/ic-store.js b/src/ic/ic-store.js index d91ea19..c70293f 100644 --- a/src/ic/ic-store.js +++ b/src/ic/ic-store.js @@ -23,16 +23,15 @@ import ICDataDataManager from './ic-data-data-manager'; class InfrastructureComponentStore extends ArrayStore { constructor() { - super('ic', ICsDataManager); + super('ics', ICsDataManager); } reduce(state, action) { switch(action.type) { - case 'ic/loaded': + case 'ics/loaded': // connect to each infrastructure component for (let ic of action.data) { const endpoint = _.get(ic, 'properties.endpoint') || _.get(ic, 'rawProperties.endpoint'); - if (endpoint != null && endpoint !== '') { ICDataDataManager.open(endpoint, ic.id); } else { @@ -43,32 +42,31 @@ class InfrastructureComponentStore extends ArrayStore { return super.reduce(state, action); - case 'ic/edited': + case 'ics/edited': // connect to each infrastructure component const ic = action.data; const endpoint = _.get(ic, 'properties.endpoint') || _.get(ic, 'rawProperties.endpoint'); if (endpoint != null && endpoint !== '') { - console.log("Updating IC id " + ic.id); ICDataDataManager.update(endpoint, ic.id); } return super.reduce(state, action); - case 'ic/fetched': + case 'ics/fetched': return this.updateElements(state, [action.data]); - case 'ic/fetch-error': + case 'ics/fetch-error': return state; - case 'ic/start-action': + case 'ics/start-action': if (!Array.isArray(action.data)) action.data = [ action.data ] ICsDataManager.doActions(action.ic, action.data, action.token); return state; - case 'ic/action-error': + case 'ics/action-error': console.log(action.error); return state; diff --git a/src/ic/ics-data-manager.js b/src/ic/ics-data-manager.js index 086e96f..73d3e91 100644 --- a/src/ic/ics-data-manager.js +++ b/src/ic/ics-data-manager.js @@ -28,12 +28,12 @@ class IcsDataManager extends RestDataManager { // TODO: Make only infrastructure component id dependent RestAPI.post(this.makeURL(this.url + '/' + ic.id), action, token).then(response => { AppDispatcher.dispatch({ - type: 'ic/action-started', + type: 'ics/action-started', data: response }); }).catch(error => { AppDispatcher.dispatch({ - type: 'ic/action-error', + type: 'ics/action-error', error }); }); diff --git a/src/ic/ics.js b/src/ic/ics.js index 6f3e89a..a66b271 100644 --- a/src/ic/ics.js +++ b/src/ic/ics.js @@ -85,7 +85,7 @@ class InfrastructureComponents extends Component { componentDidMount() { AppDispatcher.dispatch({ - type: 'ic/start-load', + type: 'ics/start-load', token: this.state.sessionToken, }); @@ -104,7 +104,7 @@ class InfrastructureComponents extends Component { } else { AppDispatcher.dispatch({ - type: 'ic/start-load', + type: 'ics/start-load', token: this.state.sessionToken, }); } @@ -116,7 +116,7 @@ class InfrastructureComponents extends Component { if (data) { AppDispatcher.dispatch({ - type: 'ic/start-add', + type: 'ics/start-add', data, token: this.state.sessionToken, }); @@ -132,7 +132,7 @@ class InfrastructureComponents extends Component { this.setState({ ic: ic }); AppDispatcher.dispatch({ - type: 'ic/start-edit', + type: 'ics/start-edit', data: ic, token: this.state.sessionToken, }); @@ -147,7 +147,7 @@ class InfrastructureComponents extends Component { } AppDispatcher.dispatch({ - type: 'ic/start-remove', + type: 'ics/start-remove', data: this.state.modalIC, token: this.state.sessionToken, }); @@ -168,7 +168,7 @@ class InfrastructureComponents extends Component { if (data) { AppDispatcher.dispatch({ - type: 'ic/start-add', + type: 'ics/start-add', data, token: this.state.sessionToken, }); @@ -203,7 +203,7 @@ class InfrastructureComponents extends Component { runAction = action => { for (let index of this.state.selectedICs) { AppDispatcher.dispatch({ - type: 'ic/start-action', + type: 'ics/start-action', ic: this.state.ics[index], data: action.data, token: this.state.sessionToken, diff --git a/src/scenario/scenario.js b/src/scenario/scenario.js index c4d8b60..d6e89f5 100644 --- a/src/scenario/scenario.js +++ b/src/scenario/scenario.js @@ -121,7 +121,7 @@ class Scenario extends React.Component { // load ICs to enable that simulation models work with them AppDispatcher.dispatch({ - type: 'ic/start-load', + type: 'ics/start-load', token: this.state.sessionToken, }); @@ -258,7 +258,7 @@ class Scenario extends React.Component { } AppDispatcher.dispatch({ - type: 'ic/start-action', + type: 'ics/start-action', ic: ic, data: action.data, token: this.state.sessionToken diff --git a/src/widget/widgets/custom-action.js b/src/widget/widgets/custom-action.js index 84696cb..822121d 100644 --- a/src/widget/widgets/custom-action.js +++ b/src/widget/widgets/custom-action.js @@ -48,7 +48,7 @@ class WidgetCustomAction extends Component { onClick() { AppDispatcher.dispatch({ - type: 'ic/start-action', + type: 'ics/start-action', ic: this.state.ic, data: this.props.widget.customProperties.actions, token: this.state.sessionToken From 27d7ee01728d342c085c2a860961460c09395a9a Mon Sep 17 00:00:00 2001 From: Sonja Happ Date: Thu, 12 Mar 2020 12:26:56 +0100 Subject: [PATCH 113/391] rename simulation model to component configuration --- .../widget/edit-widget-control-creator.js | 21 ++- .../data-managers/notifications-factory.js | 6 +- .../config-store.js} | 18 +-- .../configs-data-manager.js} | 38 ++--- .../edit-config.js} | 42 +++--- .../import-config.js} | 28 ++-- src/dashboard/dashboard.js | 6 - src/dashboard/import-dashboard.js | 4 +- src/file/select-file.js | 4 +- src/scenario/import-scenario.js | 12 +- src/scenario/scenario.js | 136 +++++++++--------- src/scenario/scenarios-data-manager.js | 16 +-- src/scenario/scenarios.js | 2 +- src/signal/edit-signal-mapping.js | 10 +- src/signal/signal-store.js | 6 +- src/signal/signals-data-manager.js | 12 +- .../edit-widget-simulation-control.js | 64 --------- src/widget/widget.js | 14 +- src/widget/widgets/plot-table.js | 22 +-- src/widget/widgets/plot.js | 14 +- 20 files changed, 188 insertions(+), 287 deletions(-) rename src/{simulationmodel/simulation-model-store.js => componentconfig/config-store.js} (65%) rename src/{simulationmodel/simulation-models-data-manager.js => componentconfig/configs-data-manager.js} (63%) rename src/{simulationmodel/edit-simulation-model.js => componentconfig/edit-config.js} (70%) rename src/{simulationmodel/import-simulation-model.js => componentconfig/import-config.js} (80%) delete mode 100644 src/widget/edit-widget/edit-widget-simulation-control.js diff --git a/src/__tests__/widget/edit-widget-control-creator.js b/src/__tests__/widget/edit-widget-control-creator.js index 46b00bc..b338f7c 100644 --- a/src/__tests__/widget/edit-widget-control-creator.js +++ b/src/__tests__/widget/edit-widget-control-creator.js @@ -6,7 +6,6 @@ import EditWidgetTextControl from '../../widget/edit-widget/edit-widget-text-con import EditWidgetColorControl from '../../widget/edit-widget/edit-widget-color-control'; import EditWidgetTimeControl from '../../widget/edit-widget/edit-widget-time-control'; import EditImageWidgetControl from '../../widget/edit-widget/edit-widget-image-control'; -import EditWidgetSimulationControl from '../../widget/edit-widget/edit-widget-simulation-control'; import EditWidgetSignalControl from '../../widget/edit-widget/edit-widget-signal-control'; import EditWidgetSignalsControl from '../../widget/edit-widget/edit-widget-signals-control'; import EditWidgetOrientation from '../../widget/edit-widget/edit-widget-orientation'; @@ -25,23 +24,23 @@ describe('edit widget control creator', () => { }); var runs = [ - { args: { widgetType: 'Lamp' }, result: { controlNumber: 5, controlTypes: [EditWidgetSimulationControl, EditWidgetSignalControl, EditWidgetTextControl, EditWidgetColorControl, EditWidgetColorControl] } }, - { args: { widgetType: 'Value' }, result: { controlNumber: 5, controlTypes: [EditWidgetTextControl, EditWidgetSimulationControl, EditWidgetSignalControl, EditWidgetTextSizeControl, EditWidgetCheckboxControl] } }, - { args: { widgetType: 'Plot' }, result: { controlNumber: 5, controlTypes: [EditWidgetTimeControl, EditWidgetSimulationControl, EditWidgetSignalsControl, EditWidgetTextControl, EditWidgetMinMaxControl] } }, - { args: { widgetType: 'Table' }, result: { controlNumber: 2, controlTypes: [EditWidgetSimulationControl, EditWidgetCheckboxControl] } }, + { args: { widgetType: 'Lamp' }, result: { controlNumber: 5, controlTypes: [EditWidgetSignalControl, EditWidgetTextControl, EditWidgetColorControl, EditWidgetColorControl] } }, + { args: { widgetType: 'Value' }, result: { controlNumber: 5, controlTypes: [EditWidgetTextControl, EditWidgetSignalControl, EditWidgetTextSizeControl, EditWidgetCheckboxControl] } }, + { args: { widgetType: 'Plot' }, result: { controlNumber: 5, controlTypes: [EditWidgetTimeControl, EditWidgetSignalsControl, EditWidgetTextControl, EditWidgetMinMaxControl] } }, + { args: { widgetType: 'Table' }, result: { controlNumber: 2, controlTypes: [EditWidgetCheckboxControl] } }, { args: { widgetType: 'Image' }, result: { controlNumber: 2, controlTypes: [EditImageWidgetControl, EditWidgetAspectControl] } }, - { args: { widgetType: 'Gauge' }, result: { controlNumber: 6, controlTypes: [EditWidgetTextControl, EditWidgetSimulationControl, EditWidgetSignalControl, EditWidgetCheckboxControl, EditWidgetColorZonesControl, EditWidgetMinMaxControl] } }, - { args: { widgetType: 'PlotTable' }, result: { controlNumber: 5, controlTypes: [EditWidgetSimulationControl, EditWidgetSignalsControl, EditWidgetTextControl, EditWidgetTimeControl, EditWidgetMinMaxControl] } }, - { args: { widgetType: 'Slider' }, result: { controlNumber: 9, controlTypes: [EditWidgetTextControl, EditWidgetOrientation, EditWidgetSimulationControl, EditWidgetSignalControl, EditWidgetCheckboxControl, EditWidgetCheckboxControl, EditWidgetMinMaxControl, EditWidgetNumberControl, EditWidgetNumberControl] } }, - { args: { widgetType: 'Button' }, result: { controlNumber: 6, controlTypes: [EditWidgetTextControl, EditWidgetSimulationControl, EditWidgetSignalControl, EditWidgetCheckboxControl, EditWidgetNumberControl, EditWidgetNumberControl] } }, + { args: { widgetType: 'Gauge' }, result: { controlNumber: 6, controlTypes: [EditWidgetTextControl, EditWidgetSignalControl, EditWidgetCheckboxControl, EditWidgetColorZonesControl, EditWidgetMinMaxControl] } }, + { args: { widgetType: 'PlotTable' }, result: { controlNumber: 5, controlTypes: [EditWidgetSignalsControl, EditWidgetTextControl, EditWidgetTimeControl, EditWidgetMinMaxControl] } }, + { args: { widgetType: 'Slider' }, result: { controlNumber: 9, controlTypes: [EditWidgetTextControl, EditWidgetOrientation, EditWidgetSignalControl, EditWidgetCheckboxControl, EditWidgetCheckboxControl, EditWidgetMinMaxControl, EditWidgetNumberControl, EditWidgetNumberControl] } }, + { args: { widgetType: 'Button' }, result: { controlNumber: 6, controlTypes: [EditWidgetTextControl, EditWidgetSignalControl, EditWidgetCheckboxControl, EditWidgetNumberControl, EditWidgetNumberControl] } }, { args: { widgetType: 'Box' }, result: { controlNumber: 2, controlTypes: [EditWidgetColorControl, EditWidgetColorControl] } }, { args: { widgetType: 'Label' }, result: { controlNumber: 3, controlTypes: [EditWidgetTextControl, EditWidgetTextSizeControl, EditWidgetColorControl] } }, { args: { widgetType: 'HTML' }, result: { controlNumber: 1, controlTypes: [EditWidgetHTMLContent] } }, - { args: { widgetType: 'Input'}, result: { controlNumber: 3, controlTypes: [EditWidgetTextControl, EditWidgetSimulationControl, EditWidgetSignalControl] } } + { args: { widgetType: 'Input'}, result: { controlNumber: 3, controlTypes: [EditWidgetTextControl, EditWidgetSignalControl] } } ]; runs.forEach( (run) => { - let itMsg = run.args.widgetType + ' widget edit model should have correct controls'; + let itMsg = run.args.widgetType + ' widget edit should have correct controls'; it(itMsg, () => { let controls = createControls(run.args.widgetType, null, null, null, null, null, null); diff --git a/src/common/data-managers/notifications-factory.js b/src/common/data-managers/notifications-factory.js index 341b375..a23768f 100644 --- a/src/common/data-managers/notifications-factory.js +++ b/src/common/data-managers/notifications-factory.js @@ -18,10 +18,10 @@ class NotificationsFactory { // This is an example - static get NO_SIM_MODEL_AVAILABLE() { + static get EXAMPLE_NOTIFICATION() { return { - title: 'No simulation model available', - message: 'Consider defining a simulation model in the simulators section.', + title: 'Example notification', + message: 'Write something here that describes what happend.', level: 'warning' }; } diff --git a/src/simulationmodel/simulation-model-store.js b/src/componentconfig/config-store.js similarity index 65% rename from src/simulationmodel/simulation-model-store.js rename to src/componentconfig/config-store.js index fe90662..b67377d 100644 --- a/src/simulationmodel/simulation-model-store.js +++ b/src/componentconfig/config-store.js @@ -1,8 +1,4 @@ /** - * File: simulation-model-store.js - * Author: Markus Grigull - * Date: 20.04.2018 - * * This file is part of VILLASweb. * * VILLASweb is free software: you can redistribute it and/or modify @@ -20,21 +16,21 @@ ******************************************************************************/ import ArrayStore from '../common/array-store'; -import SimulationModelsDataManager from './simulation-models-data-manager'; +import ConfigsDataManager from './configs-data-manager'; -class SimulationModelStore extends ArrayStore { +class ConfigStore extends ArrayStore { constructor() { - super('simulationModels', SimulationModelsDataManager); + super('configs', ConfigsDataManager); } reduce(state, action) { switch (action.type) { - case 'simulationModels/loaded': + case 'configs/loaded': - SimulationModelsDataManager.loadSignals(action.token, action.data); - SimulationModelsDataManager.loadFiles(action.token, action.data); + ConfigsDataManager.loadSignals(action.token, action.data); + ConfigsDataManager.loadFiles(action.token, action.data); return super.reduce(state, action); default: @@ -44,4 +40,4 @@ class SimulationModelStore extends ArrayStore { } } -export default new SimulationModelStore(); +export default new ConfigStore(); diff --git a/src/simulationmodel/simulation-models-data-manager.js b/src/componentconfig/configs-data-manager.js similarity index 63% rename from src/simulationmodel/simulation-models-data-manager.js rename to src/componentconfig/configs-data-manager.js index 7326c42..c0ac6c9 100644 --- a/src/simulationmodel/simulation-models-data-manager.js +++ b/src/componentconfig/configs-data-manager.js @@ -19,35 +19,35 @@ import RestDataManager from '../common/data-managers/rest-data-manager'; import AppDispatcher from '../common/app-dispatcher'; import RestAPI from "../common/api/rest-api"; -class SimulationModelDataManager extends RestDataManager { +class ConfigDataManager extends RestDataManager { constructor() { - super('simulationModel', '/models'); + super('config', '/configs'); - this.onLoad = this.onModelsLoad; + this.onLoad = this.onConfigsLoad; } - onModelsLoad(data) { + onConfigsLoad(data) { if (!Array.isArray(data)) data = [ data ]; - for (let model of data) - this.loadModelData(model); + for (let config of data) + this.loadICData(config); } - loadModelData(model) { + loadICData(config) { AppDispatcher.dispatch({ type: 'icData/prepare', - inputLength: parseInt(model.inputLength, 10), - outputLength: parseInt(model.outputLength, 10), - id: model.icID + inputLength: parseInt(config.inputLength, 10), + outputLength: parseInt(config.outputLength, 10), + id: config.icID }); } - loadSignals(token, models){ + loadSignals(token, configs){ - for (let model of models) { + for (let config of configs) { // request in signals - RestAPI.get(this.makeURL('/signals?direction=in&modelID=' + model.id), token).then(response => { + RestAPI.get(this.makeURL('/signals?direction=in&configID=' + config.id), token).then(response => { AppDispatcher.dispatch({ type: 'signals/loaded', data: response.signals @@ -55,7 +55,7 @@ class SimulationModelDataManager extends RestDataManager { }); // request out signals - RestAPI.get(this.makeURL('/signals?direction=out&modelID=' + model.id), token).then(response => { + RestAPI.get(this.makeURL('/signals?direction=out&configID=' + config.id), token).then(response => { AppDispatcher.dispatch({ type: 'signals/loaded', data: response.signals @@ -65,10 +65,10 @@ class SimulationModelDataManager extends RestDataManager { } } - loadFiles(token, models){ - for (let model of models) { - // request files of simulation model - RestAPI.get(this.makeURL('/files?objectType=model&objectID=' + model.id), token).then(response => { + loadFiles(token, configs){ + for (let config of configs) { + // request files of config + RestAPI.get(this.makeURL('/files?objectType=config&objectID=' + config.id), token).then(response => { AppDispatcher.dispatch({ type: 'files/loaded', data: response.files @@ -78,4 +78,4 @@ class SimulationModelDataManager extends RestDataManager { } } -export default new SimulationModelDataManager(); +export default new ConfigDataManager(); diff --git a/src/simulationmodel/edit-simulation-model.js b/src/componentconfig/edit-config.js similarity index 70% rename from src/simulationmodel/edit-simulation-model.js rename to src/componentconfig/edit-config.js index 9815850..791fc4d 100644 --- a/src/simulationmodel/edit-simulation-model.js +++ b/src/componentconfig/edit-config.js @@ -23,7 +23,7 @@ import Dialog from '../common/dialogs/dialog'; import ParametersEditor from '../common/parameters-editor'; import SelectFile from "../file/select-file"; -class EditSimulationModelDialog extends React.Component { +class EditConfigDialog extends React.Component { valid = false; constructor(props) { @@ -35,7 +35,7 @@ class EditSimulationModelDialog extends React.Component { icID: '', configuration: null, startParameters: {}, - selectedModelFileID:0 + selectedFileID:0 }; } @@ -44,22 +44,22 @@ class EditSimulationModelDialog extends React.Component { onClose(canceled) { if (canceled === false) { if (this.valid) { - let data = this.props.simulationModel; - if (this.state.name !== '' && this.props.simulationModel.name !== this.state.name) { + let data = this.props.config; + if (this.state.name !== '' && this.props.config.name !== this.state.name) { data.name = this.state.name; } - if (this.state.icID !== '' && this.props.simulationModel.icID !== parseInt(this.state.icID)) { + if (this.state.icID !== '' && this.props.config.icID !== parseInt(this.state.icID)) { data.icID = parseInt(this.state.icID, 10); } - if(this.state.startParameters !== {} && this.props.simulationModel.startParameters !== this.state.startParameters){ + if(this.state.startParameters !== {} && this.props.config.startParameters !== this.state.startParameters){ data.startParameters = this.state.startParameters; } - if (parseInt(this.state.selectedModelFileID, 10) !== 0 && - this.props.simulationModel.selectedModelFileID !== parseInt(this.state.selectedModelFileID)) { - data.selectedModelFileID = parseInt(this.state.selectedModelFileID, 10); + if (parseInt(this.state.selectedFileID, 10) !== 0 && + this.props.config.selectedFileID !== parseInt(this.state.selectedFileID)) { + data.selectedFileID = parseInt(this.state.selectedFileID, 10); } - //forward modified simulation model to callback function + //forward modified config to callback function this.props.onClose(data) } } else { @@ -81,9 +81,9 @@ class EditSimulationModelDialog extends React.Component { this.valid = this.isValid() } - handleSelectedModelFileChange(newFileID){ + handleSelectedFileChange(newFileID){ console.log("Config file change to: ", newFileID); - this.setState({selectedModelFileID: newFileID}) + this.setState({selectedFileID: newFileID}) this.valid = this.isValid() } @@ -95,7 +95,7 @@ class EditSimulationModelDialog extends React.Component { || this.state.startParameters !== {} || this.state.selectedFile != null || this.state.configuration != null - || this.state.selectedModelFileID !== 0; + || this.state.selectedFileID !== 0; } resetState() { @@ -112,7 +112,7 @@ class EditSimulationModelDialog extends React.Component {
    Name - this.handleChange(e)} /> + this.handleChange(e)} /> @@ -123,19 +123,11 @@ class EditSimulationModelDialog extends React.Component { - - this.handleSelectedModelFileChange(e)} value={this.state.selectedModelFileID} objectID={this.props.simulationModel.id}/> - - - {/* this.handleChange(e)} value={this.state.configuration} />*/} - - - - + this.handleSelectedFileChange(e)} value={this.state.selectedFileID} objectID={this.props.config.id}/> Start Parameters - this.handleParameterChange(data)} /> + this.handleParameterChange(data)} />
    @@ -143,4 +135,4 @@ class EditSimulationModelDialog extends React.Component { } } -export default EditSimulationModelDialog; +export default EditConfigDialog; diff --git a/src/simulationmodel/import-simulation-model.js b/src/componentconfig/import-config.js similarity index 80% rename from src/simulationmodel/import-simulation-model.js rename to src/componentconfig/import-config.js index f1bd92a..89c1986 100644 --- a/src/simulationmodel/import-simulation-model.js +++ b/src/componentconfig/import-config.js @@ -1,8 +1,4 @@ /** - * File: import-simulation-model.js - * Author: Markus Grigull - * Date: 03.09.2017 - * * This file is part of VILLASweb. * * VILLASweb is free software: you can redistribute it and/or modify @@ -25,14 +21,14 @@ import _ from 'lodash'; import Dialog from '../common/dialogs/dialog'; -class ImportSimulationModelDialog extends React.Component { +class ImportConfigDialog extends React.Component { imported = false; constructor(props) { super(props); this.state = { - model: {} + config: {} }; } @@ -43,12 +39,12 @@ class ImportSimulationModelDialog extends React.Component { return; } - this.props.onClose(this.state.model); + this.props.onClose(this.state.config); } resetState = () => { this.setState({ - model: {} + config: {} }); this.imported = false; @@ -66,24 +62,24 @@ class ImportSimulationModelDialog extends React.Component { const self = this; reader.onload = event => { - const model = JSON.parse(event.target.result); + const config = JSON.parse(event.target.result); - model.icID = this.props.ics.length > 0 ? this.props.ics[0]._id : null; + config.icID = this.props.ics.length > 0 ? this.props.ics[0]._id : null; self.imported = true; - this.setState({ model }); + this.setState({ config: config }); }; reader.readAsText(file); } handleICChange = event => { - const model = this.state.model; + const config = this.state.config; - model.icID = event.target.value; + config.icID = event.target.value; - this.setState({ model }); + this.setState({ config: config }); } render() { @@ -97,7 +93,7 @@ class ImportSimulationModelDialog extends React.Component { Infrastructure Component - + {this.props.ics.map(ic => ( ))} @@ -109,4 +105,4 @@ class ImportSimulationModelDialog extends React.Component { } } -export default ImportSimulationModelDialog; +export default ImportConfigDialog; diff --git a/src/dashboard/dashboard.js b/src/dashboard/dashboard.js index 288ac70..e28ca6a 100644 --- a/src/dashboard/dashboard.js +++ b/src/dashboard/dashboard.js @@ -33,7 +33,6 @@ import DashboardButtonGroup from './dashboard-button-group'; import LoginStore from '../user/login-store'; import DashboardStore from './dashboard-store'; -//import SimulationModelStore from '../simulationmodel/simulation-model-store'; import SignalStore from '../signal/signal-store' import FileStore from '../file/file-store'; import WidgetStore from '../widget/widget-store'; @@ -76,11 +75,6 @@ class Dashboard extends Component { return thisWidgetHeight > maxHeightSoFar? thisWidgetHeight : maxHeightSoFar; }, 0); - //let simulationModels = []; - //if (prevState.simulation != null) { - // simulationModels = SimulationModelStore.getState().filter(m => prevState.simulation.models.includes(m._id)); - //} - // TODO filter signals to the ones belonging to the scenario at hand! let signals = SignalStore.getState(); diff --git a/src/dashboard/import-dashboard.js b/src/dashboard/import-dashboard.js index 62109ab..b44e1f8 100644 --- a/src/dashboard/import-dashboard.js +++ b/src/dashboard/import-dashboard.js @@ -68,8 +68,8 @@ class ImportDashboardDialog extends React.Component { const dashboard = JSON.parse(event.target.result); /*let defaultIC = ""; - if (self.props.simulation.models != null) { - defaultIC = self.props.simulation.models[0].icID; + if (self.props.configs != null) { + defaultIC = self.props.configs[0].icID; } dashboard.widgets.forEach(widget => { diff --git a/src/file/select-file.js b/src/file/select-file.js index 26f7689..6fa6e83 100644 --- a/src/file/select-file.js +++ b/src/file/select-file.js @@ -38,7 +38,7 @@ class SelectFile extends React.Component { static calculateState(prevState, props) { let files = FileStore.getState().filter((file) => { - return (file.simulationModelID === props.objectID) + return (file.configID === props.objectID) }); console.log("props.objectID=", props.objectID) @@ -111,7 +111,7 @@ class SelectFile extends React.Component { ); } else { - fileOptions = + fileOptions = } /*const progressBarStyle = { diff --git a/src/scenario/import-scenario.js b/src/scenario/import-scenario.js index bdfe1ab..3fccb49 100644 --- a/src/scenario/import-scenario.js +++ b/src/scenario/import-scenario.js @@ -35,7 +35,7 @@ class ImportScenarioDialog extends React.Component { this.state = { name: '', running: '', - simulationModels: [], + configs: [], startParameters: {} }; } @@ -56,10 +56,10 @@ class ImportScenarioDialog extends React.Component { handleChange(e, index) { /*if (e.target.id === 'icID') { - const models = this.state.models; - models[index].icID = JSON.parse(e.target.value); + const configs = this.state.configs; + configs[index].icID = JSON.parse(e.target.value); - this.setState({ models }); + this.setState({ configs: configs }); return; }*/ @@ -77,7 +77,7 @@ class ImportScenarioDialog extends React.Component { } resetState = () => { - this.setState({ name: '', models: [], startParameters: {} }); + this.setState({ name: '', configs: [], startParameters: {} }); this.imported = false; } @@ -98,7 +98,7 @@ class ImportScenarioDialog extends React.Component { self.imported = true; self.valid = true; - self.setState({ name: scenario.name, models: scenario.simulationModels, startParameters: scenario.startParameters, running: scenario.running }); + self.setState({ name: scenario.name, configs: scenario.configs, startParameters: scenario.startParameters, running: scenario.running }); }; reader.readAsText(file); diff --git a/src/scenario/scenario.js b/src/scenario/scenario.js index d6e89f5..1f5a7be 100644 --- a/src/scenario/scenario.js +++ b/src/scenario/scenario.js @@ -24,7 +24,7 @@ import _ from 'lodash'; import ScenarioStore from './scenario-store'; import ICStore from '../ic/ic-store'; import DashboardStore from '../dashboard/dashboard-store'; -import SimulationModelStore from '../simulationmodel/simulation-model-store'; +import ConfigStore from '../componentconfig/config-store'; import LoginStore from '../user/login-store'; import SignalStore from '../signal/signal-store' import AppDispatcher from '../common/app-dispatcher'; @@ -32,19 +32,19 @@ import AppDispatcher from '../common/app-dispatcher'; import Icon from '../common/icon'; import Table from '../common/table'; import TableColumn from '../common/table-column'; -import ImportSimulationModelDialog from '../simulationmodel/import-simulation-model'; +import ImportConfigDialog from '../componentconfig/import-config'; import ImportDashboardDialog from "../dashboard/import-dashboard"; import NewDashboardDialog from "../dashboard/new-dashboard"; import ICAction from '../ic/ic-action'; import DeleteDialog from '../common/dialogs/delete-dialog'; -import EditSimulationModelDialog from "../simulationmodel/edit-simulation-model"; +import EditConfigDialog from "../componentconfig/edit-config"; import EditSignalMapping from "../signal/edit-signal-mapping"; import FileStore from "../file/file-store" class Scenario extends React.Component { static getStores() { - return [ ScenarioStore, SimulationModelStore, DashboardStore, ICStore, LoginStore, SignalStore, FileStore]; + return [ ScenarioStore, ConfigStore, DashboardStore, ICStore, LoginStore, SignalStore, FileStore]; } static calculateState(prevState, props) { @@ -63,8 +63,8 @@ class Scenario extends React.Component { // obtain all dashboards of a scenario let dashboards = DashboardStore.getState().filter(dashb => dashb.scenarioID === parseInt(props.match.params.scenario, 10)); - // obtain all simulation models of a scenario - let simulationModels = SimulationModelStore.getState().filter(simmodel => simmodel.scenarioID === parseInt(props.match.params.scenario, 10)); + // obtain all component configurations of a scenario + let configs = ConfigStore.getState().filter(config => config.scenarioID === parseInt(props.match.params.scenario, 10)); let signals = SignalStore.getState(); let files = FileStore.getState(); @@ -73,18 +73,18 @@ class Scenario extends React.Component { return { scenario, sessionToken, - simulationModels, + configs: configs, dashboards, signals, files, ics: ICStore.getState(), - deleteSimulationModelModal: false, - importSimulationModelModal: false, - editSimulationModelModal: false, - modalSimulationModelData: {}, - selectedSimulationModels: [], - modalSimulationModelIndex: 0, + deleteConfigModal: false, + importConfigModal: false, + editConfigModal: false, + modalConfigData: {}, + selectedConfigs: [], + modalConfigIndex: 0, editOutputSignalsModal: false, editInputSignalsModal: false, @@ -105,9 +105,9 @@ class Scenario extends React.Component { token: this.state.sessionToken }); - // load simulation models for selected scenario + // load component configurations for selected scenario AppDispatcher.dispatch({ - type: 'simulationModels/start-load', + type: 'configs/start-load', token: this.state.sessionToken, param: '?scenarioID='+this.state.scenario.id, }); @@ -119,7 +119,7 @@ class Scenario extends React.Component { param: '?scenarioID='+this.state.scenario.id, }); - // load ICs to enable that simulation models work with them + // load ICs to enable that component configs work with them AppDispatcher.dispatch({ type: 'ics/start-load', token: this.state.sessionToken, @@ -129,20 +129,20 @@ class Scenario extends React.Component { } /* ############################################## - * Simulation Model modification methods + * Component Configuration modification methods ############################################## */ - addSimulationModel(){ - const simulationModel = { + addConfig(){ + const config = { scenarioID: this.state.scenario.id, - name: 'New Simulation Model', + name: 'New Component Configuration', icID: this.state.ics.length > 0 ? this.state.ics[0].id : null, startParameters: {}, }; AppDispatcher.dispatch({ - type: 'simulationModels/start-add', - data: simulationModel, + type: 'configs/start-add', + data: config, token: this.state.sessionToken }); @@ -155,44 +155,44 @@ class Scenario extends React.Component { }); } - closeEditSimulationModelModal(data){ - this.setState({ editSimulationModelModal : false }); + closeEditConfigModal(data){ + this.setState({ editConfigModal : false }); if (data) { AppDispatcher.dispatch({ - type: 'simulationModels/start-edit', + type: 'configs/start-edit', data: data, token: this.state.sessionToken, }); } } - closeDeleteSimulationModelModal(confirmDelete) { - this.setState({ deleteSimulationModelModal: false }); + closeDeleteConfigModal(confirmDelete) { + this.setState({ deleteConfigModal: false }); if (confirmDelete === false) { return; } AppDispatcher.dispatch({ - type: 'simulationModels/start-remove', - data: this.state.modalSimulationModelData, + type: 'configs/start-remove', + data: this.state.modalConfigData, token: this.state.sessionToken }); } - importSimulationModel(simulationModel){ - this.setState({ importSimulationModelModal: false }); + importConfig(config){ + this.setState({ importConfigModal: false }); - if (simulationModel == null) { + if (config == null) { return; } - simulationModel.scenario = this.state.scenario.id; + config.scenario = this.state.scenario.id; AppDispatcher.dispatch({ - type: 'simulationModels/start-add', - data: simulationModel, + type: 'configs/start-add', + data: config, token: this.state.sessionToken }); @@ -205,27 +205,27 @@ class Scenario extends React.Component { }); } - exportModel(index) { + exportConfig(index) { // filter properties - const model = Object.assign({}, this.state.simulationModels[index]); + const config = Object.assign({}, this.state.configs[index]); // show save dialog - const blob = new Blob([JSON.stringify(model, null, 2)], { type: 'application/json' }); - FileSaver.saveAs(blob, 'simulation model - ' + model.name + '.json'); + const blob = new Blob([JSON.stringify(config, null, 2)], { type: 'application/json' }); + FileSaver.saveAs(blob, 'config-' + config.name + '.json'); } - onSimulationModelChecked(index, event) { - const selectedSimulationModels = Object.assign([], this.state.selectedSimulationModels); - for (let key in selectedSimulationModels) { - if (selectedSimulationModels[key] === index) { + onConfigChecked(index, event) { + const selectedConfigs = Object.assign([], this.state.selectedConfigs); + for (let key in selectedConfigs) { + if (selectedConfigs[key] === index) { // update existing entry if (event.target.checked) { return; } - selectedSimulationModels.splice(key, 1); + selectedConfigs.splice(key, 1); - this.setState({ selectedSimulationModels }); + this.setState({ selectedConfigs: selectedConfigs }); return; } } @@ -235,16 +235,16 @@ class Scenario extends React.Component { return; } - selectedSimulationModels.push(index); - this.setState({ selectedSimulationModels }); + selectedConfigs.push(index); + this.setState({ selectedConfigs: selectedConfigs }); } runAction = action => { - for (let index of this.state.selectedSimulationModels) { - // get IC for model + for (let index of this.state.selectedConfigs) { + // get IC for component config let ic = null; for (let component of this.state.ics) { - if (component._id === this.state.simulationModels[index].icID) { + if (component._id === this.state.configs[index].icID) { ic = component; } } @@ -254,7 +254,7 @@ class Scenario extends React.Component { } if (action.data.action === 'start') { - action.data.parameters = this.state.simulationModels[index].startParameters; + action.data.parameters = this.state.configs[index].startParameters; } AppDispatcher.dispatch({ @@ -345,7 +345,7 @@ class Scenario extends React.Component { } closeNewSignalModal(data){ - //data contains the new signal incl. simulationModelID and direction + //data contains the new signal incl. configID and direction if (data) { AppDispatcher.dispatch({ type: 'signals/start-add', @@ -406,21 +406,21 @@ class Scenario extends React.Component { {/*Component Configurations table*/}

    Component Configurations

    - - this.onSimulationModelChecked(index, event)} width='30' /> +
    + this.onConfigChecked(index, event)} width='30' /> - this.getFileName(selectedModelFileID)}/> + this.getFileName(selectedFileID)}/> this.setState({ editOutputSignalsModal: true, modalSimulationModelData: this.state.simulationModels[index], modalSimulationModelIndex: index })} + onEdit={index => this.setState({ editOutputSignalsModal: true, modalConfigData: this.state.configs[index], modalConfigIndex: index })} /> this.setState({ editInputSignalsModal: true, modalSimulationModelData: this.state.simulationModels[index], modalSimulationModelIndex: index })} + onEdit={index => this.setState({ editInputSignalsModal: true, modalConfigData: this.state.configs[index], modalConfigIndex: index })} /> this.getICName(icID)} /> this.setState({ editSimulationModelModal: true, modalSimulationModelData: this.state.simulationModels[index], modalSimulationModelIndex: index })} - onDelete={(index) => this.setState({ deleteSimulationModelModal: true, modalSimulationModelData: this.state.simulationModels[index], modalSimulationModelIndex: index })} - onExport={index => this.exportModel(index)} + onEdit={index => this.setState({ editConfigModal: true, modalConfigData: this.state.configs[index], modalConfigIndex: index })} + onDelete={(index) => this.setState({ deleteConfigModal: true, modalConfigData: this.state.configs[index], modalConfigIndex: index })} + onExport={index => this.exportConfig(index)} />
    - - + +
    - this.closeEditSimulationModelModal(data)} simulationModel={this.state.modalSimulationModelData} ics={this.state.ics} /> - this.importSimulationModel(data)} ics={this.state.ics} /> - this.closeDeleteSimulationModelModal(c)} /> + this.closeEditConfigModal(data)} config={this.state.modalConfigData} ics={this.state.ics} /> + this.importConfig(data)} ics={this.state.ics} /> + this.closeDeleteConfigModal(c)} /> this.closeDeleteSignalModal(data)} direction="Output" signals={this.state.signals} - simulationModelID={this.state.modalSimulationModelData.id} /> + configID={this.state.modalConfigData.id} /> this.closeEditSignalsModal(data, direction)} @@ -473,7 +473,7 @@ class Scenario extends React.Component { onDelete={(data) => this.closeDeleteSignalModal(data)} direction="Input" signals={this.state.signals} - simulationModelID={this.state.modalSimulationModelData.id}/> + configID={this.state.modalConfigData.id}/> {/*Dashboard table*/}

    Dashboards

    diff --git a/src/scenario/scenarios-data-manager.js b/src/scenario/scenarios-data-manager.js index a56a61e..ec4a442 100644 --- a/src/scenario/scenarios-data-manager.js +++ b/src/scenario/scenarios-data-manager.js @@ -1,8 +1,4 @@ /** - * File: scenarios-data-manager.js - * Author: Sonja Happ - * Date: 20.08.2019 - * * This file is part of VILLASweb. * * VILLASweb is free software: you can redistribute it and/or modify @@ -25,18 +21,18 @@ import AppDispatcher from "../common/app-dispatcher"; class ScenariosDataManager extends RestDataManager { constructor() { - super('scenario', '/scenarios', ['id', 'name', 'running', 'simulationModelIDs', 'userIDs', 'dashboardIDs', 'startParameters' ]); + super('scenario', '/scenarios'); } - getSimulationModels(token, id) { - RestAPI.get(this.makeURL('/scenarios/' + id + '/models'), token).then(response => { + getComponentConfigs(token, id) { + RestAPI.get(this.makeURL('/scenarios/' + id + '/configs'), token).then(response => { AppDispatcher.dispatch({ - type: 'scenarios/simulationmodels', - simulationmodels: response.models + type: 'scenarios/configs', + configs: response.configs }); }).catch(error => { AppDispatcher.dispatch({ - type: 'scenarios/simulationmodels-error', + type: 'scenarios/configs-error', error: error }); }); diff --git a/src/scenario/scenarios.js b/src/scenario/scenarios.js index 1cd1e04..baa22e3 100644 --- a/src/scenario/scenarios.js +++ b/src/scenario/scenarios.js @@ -158,7 +158,7 @@ class Scenarios extends Component { let scenario = Object.assign({}, this.state.scenarios[index]); delete scenario.id; - // TODO request missing scenario parameters (Dashboards and Simulation Modles) recursively for export + // TODO request missing scenario parameters (Dashboards and component configs) recursively for export // show save dialog const blob = new Blob([JSON.stringify(scenario, null, 2)], { type: 'application/json' }); diff --git a/src/signal/edit-signal-mapping.js b/src/signal/edit-signal-mapping.js index 2c31a68..51ab0c9 100644 --- a/src/signal/edit-signal-mapping.js +++ b/src/signal/edit-signal-mapping.js @@ -52,9 +52,9 @@ class EditSignalMapping extends React.Component { static getDerivedStateFromProps(props, state){ - // filter all signals by Simulation Model ID and direction + // filter all signals by configID and direction let signals = props.signals.filter((sig) => { - return (sig.simulationModelID === props.simulationModelID) && (sig.direction === state.dir); + return (sig.configID === props.configID) && (sig.direction === state.dir); }); return { @@ -115,7 +115,7 @@ class EditSignalMapping extends React.Component { console.log("add signal"); let newSignal = { - simulationModelID: this.props.simulationModelID, + configID: this.props.configID, direction: this.state.dir, name: "PlaceholderName", unit: "PlaceholderUnit", @@ -130,7 +130,7 @@ class EditSignalMapping extends React.Component { this.valid=false; let signals = this.props.signals.filter((sig) => { - return (sig.simulationModelID === this.props.simulationModelID) && (sig.direction === this.state.dir); + return (sig.configID === this.props.configID) && (sig.direction === this.state.dir); }); this.setState({signals: signals}) @@ -173,7 +173,7 @@ EditSignalMapping.propTypes = { name: PropTypes.string.isRequired, unit: PropTypes.string.isRequired, direction: PropTypes.string.isRequired, - simulationModelID: PropTypes.number.isRequired, + configID: PropTypes.number.isRequired, index: PropTypes.number.isRequired }) diff --git a/src/signal/signal-store.js b/src/signal/signal-store.js index 787a3db..5fe3d06 100644 --- a/src/signal/signal-store.js +++ b/src/signal/signal-store.js @@ -1,6 +1,4 @@ /** - * File: signal-store.js - * * This file is part of VILLASweb. * * VILLASweb is free software: you can redistribute it and/or modify @@ -28,10 +26,10 @@ class SignalStore extends ArrayStore{ reduce(state, action) { switch (action.type) { case 'signals/added': - SignalsDataManager.reloadSimulationModel(action.token, action.data); + SignalsDataManager.reloadConfig(action.token, action.data); return super.reduce(state, action); case 'signals/removed': - SignalsDataManager.reloadSimulationModel(action.token, action.data); + SignalsDataManager.reloadConfig(action.token, action.data); return super.reduce(state, action); default: diff --git a/src/signal/signals-data-manager.js b/src/signal/signals-data-manager.js index e933f20..768bc7a 100644 --- a/src/signal/signals-data-manager.js +++ b/src/signal/signals-data-manager.js @@ -1,6 +1,4 @@ /** - * File: signals-data-manager.js - * * This file is part of VILLASweb. * * VILLASweb is free software: you can redistribute it and/or modify @@ -27,13 +25,13 @@ class SignalsDataManager extends RestDataManager{ super('signal', '/signals'); } - reloadSimulationModel(token, data){ + reloadConfig(token, data){ // request in signals - console.log("Reloading simulation model due to signal add/remove") - RestAPI.get(this.makeURL('/models/' + data.simulationModelID), token).then(response => { + console.log("Reloading component config due to signal add/remove") + RestAPI.get(this.makeURL('/configs/' + data.configID), token).then(response => { AppDispatcher.dispatch({ - type: 'simulationModels/edited', - data: response.simulationModel + type: 'configs/edited', + data: response.config }); }); diff --git a/src/widget/edit-widget/edit-widget-simulation-control.js b/src/widget/edit-widget/edit-widget-simulation-control.js deleted file mode 100644 index 04f17d0..0000000 --- a/src/widget/edit-widget/edit-widget-simulation-control.js +++ /dev/null @@ -1,64 +0,0 @@ -/** - * File: edit-widget-simulation-control.js - * Author: Ricardo Hernandez-Montoya - * Date: 03.04.2017 - * - * This file is part of VILLASweb. - * - * VILLASweb is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * VILLASweb is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with VILLASweb. If not, see . - **********************************************************************************/ - -import React, { Component } from 'react'; -import { FormGroup, FormControl, FormLabel } from 'react-bootstrap'; - -class EditWidgetSimulationControl extends Component { - constructor(props) { - super(props); - - this.state = { - widget: { - customProperties: { - simulationModel: '' - } - - } - }; - } - - static getDerivedStateFromProps(props, state){ - return{ - widget: props.widget - }; - } - - render() { - return ( - - Simulation Model - this.props.handleChange(e)}> - { - this.props.simulationModels.length === 0 ? ( - - ) : ( - this.props.simulationModels.map((model, index) => ( - - ))) - } - - - ); - } -} - -export default EditWidgetSimulationControl; diff --git a/src/widget/widget.js b/src/widget/widget.js index fc11c1a..52efd9d 100644 --- a/src/widget/widget.js +++ b/src/widget/widget.js @@ -25,7 +25,7 @@ import { Container } from 'flux/utils'; import AppDispatcher from '../common/app-dispatcher'; import LoginStore from '../user/login-store'; import ICDataStore from '../ic/ic-data-store'; -import SimulationModelStore from '../simulationmodel/simulation-model-store'; +import ConfigsStore from '../componentconfig/config-store'; import FileStore from '../file/file-store'; import SignalStore from '../signal/signal-store' @@ -53,7 +53,7 @@ import '../styles/widgets.css'; class Widget extends React.Component { static getStores() { - return [ ICDataStore, SimulationModelStore, FileStore, LoginStore, SignalStore]; + return [ ICDataStore, ConfigsStore, FileStore, LoginStore, SignalStore]; } static calculateState(prevState, props) { @@ -69,15 +69,15 @@ class Widget extends React.Component { } // Get the IC IDs and signal indexes for all signals of the widget - let simulationModels = SimulationModelStore.getState(); + let configs = ConfigsStore.getState(); // TODO make sure that the signals are only the signals that belong to the scenario at hand let signals = SignalStore.getState(); let icIDs = []; if ( props.data.signalIDs.length > 0){ for (let i in props.data.signalIDs.length){ let signal = signals.find(s => s.id === props.data.signalIDs[i]); - let model = simulationModels.find(m => m.id === signal.simulationModelID); - icIDs[i] = model.icID; + let config = configs.find(m => m.id === signal.configID); + icIDs[i] = config.icID; } } @@ -105,10 +105,10 @@ class Widget extends React.Component { param: '?objectID=1&objectType=widget' });*/ - // TODO no not load simulation models here, since they are loaded via the scenario, pass them as props + // TODO no not load component congfigs here, since they are loaded via the scenario, pass them as props /* AppDispatcher.dispatch({ - type: 'simulationModels/start-load', + type: 'configs/start-load', token: this.state.sessionToken, param: '?scenarioID=1' // TODO do not hardcode scenarioID! }); diff --git a/src/widget/widgets/plot-table.js b/src/widget/widgets/plot-table.js index 6678140..b4cbb12 100644 --- a/src/widget/widgets/plot-table.js +++ b/src/widget/widgets/plot-table.js @@ -37,7 +37,7 @@ class WidgetPlotTable extends Component { } componentDidUpdate(prevProps: Readonly

    , prevState: Readonly, snapshot: SS): void { - if (this.props.simulationModel == null) { + if (this.props.config == null) { return; } @@ -64,18 +64,18 @@ class WidgetPlotTable extends Component { } updatePreselectedSignalsState(props) { - // Create checkboxes using the signal indices from simulation model - if(props.simulationModel.outputMapping){ - const preselectedSignals = props.simulationModel.outputMapping.reduce( - // Loop through simulation model signals - (accum, model_signal, signal_index) => { + // Create checkboxes using the signal indices from component config + if(props.config.outputMapping){ + const preselectedSignals = props.config.outputMapping.reduce( + // Loop through component config signals + (accum, signal, signal_index) => { // Append them if they belong to the current selected type if (props.widget.customProperties.preselectedSignals.indexOf(signal_index) > -1) { accum.push( { index: signal_index, - name: model_signal.name, - type: model_signal.type + name: signal.name, + type: signal.type } ) } @@ -98,11 +98,11 @@ class WidgetPlotTable extends Component { let checkBoxes = []; // Data passed to plot - if (this.props.simulationModel == null) { + if (this.props.config == null) { return

    ; } - const ic = this.props.simulationModel.icID; + const ic = this.props.config.icID; let icData = []; if (this.props.data[ic] != null && this.props.data[ic].output != null && this.props.data[ic].output.values != null) { @@ -112,7 +112,7 @@ class WidgetPlotTable extends Component { } if (this.state.preselectedSignals && this.state.preselectedSignals.length > 0) { - // Create checkboxes using the signal indices from simulation model + // Create checkboxes using the signal indices from component config checkBoxes = this.state.preselectedSignals.map( (signal) => { var checked = this.state.signals.indexOf(signal.index) > -1; var chkBxClasses = classNames({ diff --git a/src/widget/widgets/plot.js b/src/widget/widgets/plot.js index d20244c..7cda5ed 100644 --- a/src/widget/widgets/plot.js +++ b/src/widget/widgets/plot.js @@ -1,8 +1,4 @@ /** - * File: plot.js - * Author: Markus Grigull - * Date: 08.03.2017 - * * This file is part of VILLASweb. * * VILLASweb is free software: you can redistribute it and/or modify @@ -37,16 +33,16 @@ class WidgetPlot extends React.Component { static getDerivedStateFromProps(props, state){ - if (props.simulationModel == null) { + if (props.config == null) { return{ data: [], legend: [], }; } - const ic = props.simulationModel.icID; + const ic = props.config.icID; - // Proceed if a simulation with models and a IC are available + // Proceed if a config and a IC are available if (ic && props.data[ic] != null && props.data[ic] != null && props.data[ic].output != null && props.data[ic].output.values != null) { const chosenSignals = props.widget.customProperties.signals; @@ -55,9 +51,9 @@ class WidgetPlot extends React.Component { )); // Query the signals that will be displayed in the legend - const legend = props.simulationModel.outputMapping.reduce( (accum, model_signal, signal_index) => { + const legend = props.config.outputMapping.reduce( (accum, signal, signal_index) => { if (chosenSignals.includes(signal_index)) { - accum.push({ index: signal_index, name: model_signal.name, type: model_signal.type }); + accum.push({ index: signal_index, name: signal.name, type: signal.type }); } return accum; From 3d59393a1d92a0783b0774fe2cb36bf2e58b362f Mon Sep 17 00:00:00 2001 From: Sonja Happ Date: Thu, 12 Mar 2020 14:21:39 +0100 Subject: [PATCH 114/391] fix plot widget and edit signals control element --- .../edit-widget-signals-control.js | 32 +++++----- src/widget/edit-widget/edit-widget.js | 20 +++---- src/widget/widget-plot/plot-legend.js | 2 +- src/widget/widget-plot/plot.js | 59 +++++++++++-------- src/widget/widgets/plot.js | 2 +- 5 files changed, 62 insertions(+), 53 deletions(-) diff --git a/src/widget/edit-widget/edit-widget-signals-control.js b/src/widget/edit-widget/edit-widget-signals-control.js index 2f38506..109df2e 100644 --- a/src/widget/edit-widget/edit-widget-signals-control.js +++ b/src/widget/edit-widget/edit-widget-signals-control.js @@ -1,8 +1,4 @@ /** - * File: edit-widget-signals-control.js - * Author: Ricardo Hernandez-Montoya - * Date: 03.04.2017 - * * This file is part of VILLASweb. * * VILLASweb is free software: you can redistribute it and/or modify @@ -27,29 +23,24 @@ class EditWidgetSignalsControl extends Component { super(props); this.state = { - widget: { } - }; - } - - static getDerivedStateFromProps(props, state){ - return { - widget: props.widget + widget: props.widget, + checkedSignals: props.widget[props.controlId] }; } handleSignalChange(checked, signalID) { - var signals = this.state.widget.signalIDs; - var new_signals; + let new_signals = this.state.checkedSignals; if (checked) { // add signal - new_signals = signals.concat(signalID); + new_signals = new_signals.concat(signalID); } else { // remove signal - new_signals = signals.filter( (id) => id !== signalID ); + new_signals = new_signals.filter( (id) => id !== signalID ); } - this.props.handleChange({ target: { id: this.props.controlId, value: new_signals } }); + this.setState({checkedSignals: new_signals}) + this.props.handleChange({ target: { id: this.props.controlId, value: new_signals, type:'checkbox' } }); } render() { @@ -61,7 +52,14 @@ class EditWidgetSignalsControl extends Component { No signals available ) : ( this.props.signals.map((signal, index) => ( - this.handleSignalChange(e.target.checked, signal.id)}>{signal.name} + id === signal.id) !== undefined} + onChange={(e) => this.handleSignalChange(e.target.checked, signal.id)}> + )) ) } diff --git a/src/widget/edit-widget/edit-widget.js b/src/widget/edit-widget/edit-widget.js index 64fefea..e110db3 100644 --- a/src/widget/edit-widget/edit-widget.js +++ b/src/widget/edit-widget/edit-widget.js @@ -1,8 +1,4 @@ /** - * File: edit-widget.js - * Author: Markus Grigull - * Date: 08.03.2017 - * * This file is part of VILLASweb. * * VILLASweb is free software: you can redistribute it and/or modify @@ -81,7 +77,8 @@ class EditWidgetDialog extends React.Component { } if(e.target.type !== 'text'){ - let changeObject = {}; + console.log("edit-widget: e.target.type is not text: ", e.target.type); + let changeObject = this.state.temporal; if (e.target.id === 'lockAspect') { changeObject[e.target.id] = e.target.checked; @@ -97,22 +94,25 @@ class EditWidgetDialog extends React.Component { changeObject = this.assignAspectRatio(changeObject, e.target.value); } } else if (e.target.type === 'checkbox') { - changeObject[e.target.id] = e.target.checked; + changeObject[e.target.id] = e.target.value; } else if (e.target.type === 'number') { changeObject[e.target.id] = Number(e.target.value); } else { changeObject[e.target.id] = e.target.value; } - let finalChange = this.state.temporal; + this.setState({ temporal: changeObject}); - finalChange.customProperties[e.target.id] = changeObject[e.target.id]; - this.setState({ temporal: finalChange}); } else { + console.log("edit-widget: type text"); if(this.state.temporal[e.target.id]){ + + console.log("edit-widget: type: " , e.target.type, " target.id", e.target.id, "target.value", e.target.value) let finalChange = this.state.temporal; finalChange[e.target.id] = e.target.value; + + console.log("edit-widget: finalChange", finalChange); this.setState({ temporal: finalChange}); } } @@ -133,12 +133,12 @@ class EditWidgetDialog extends React.Component { //this.valid = name; this.valid = name; - // return state to control if (target === 'name') return name ? "success" : "error"; } render() { + let controls = null; if (this.props.widget) { controls = CreateControls( diff --git a/src/widget/widget-plot/plot-legend.js b/src/widget/widget-plot/plot-legend.js index 239072c..ad0cb64 100644 --- a/src/widget/widget-plot/plot-legend.js +++ b/src/widget/widget-plot/plot-legend.js @@ -33,7 +33,7 @@ class PlotLegend extends React.Component { {this.props.signals.map(signal =>
  • {signal.name} - {signal.type} + {signal.unit}
  • )} diff --git a/src/widget/widget-plot/plot.js b/src/widget/widget-plot/plot.js index 299b8f9..db86bfd 100644 --- a/src/widget/widget-plot/plot.js +++ b/src/widget/widget-plot/plot.js @@ -77,49 +77,60 @@ class Plot extends React.Component { this.removeInterval(); } - componentDidUpdate(prevProps: Readonly

    , prevState: Readonly, snapshot: SS): void { - if (prevProps.time !== this.props.time) { - this.createInterval(); - } - + static getDerivedStateFromProps(props, state){ let labelMargin = 0; - if (this.props.yLabel !== '') { + if (props.yLabel !== '') { labelMargin = 30; } // check if data is invalid - if (this.props.data == null || this.props.data.length === 0 || this.props.data[0].length === 0) { + if (props.data == null || props.data.length === 0 || props.data[0].length === 0) { // create empty plot axes - const xScale = scaleTime().domain([Date.now() - this.props.time * 1000, Date.now()]).range([0, this.props.width - leftMargin - labelMargin - rightMargin]); + const xScale = scaleTime().domain([Date.now() - props.time * 1000, Date.now()]).range([0, props.width - leftMargin - labelMargin - rightMargin]); let yScale; - if (this.props.yUseMinMax) { - yScale = scaleLinear().domain([this.props.yMin, this.props.yMax]).range([this.props.height + topMargin - bottomMargin, topMargin]); + if (props.yUseMinMax) { + yScale = scaleLinear().domain([props.yMin, props.yMax]).range([props.height + topMargin - bottomMargin, topMargin]); } else { - yScale = scaleLinear().domain([0, 10]).range([this.props.height + topMargin - bottomMargin, topMargin]); + yScale = scaleLinear().domain([0, 10]).range([props.height + topMargin - bottomMargin, topMargin]); } const xAxis = axisBottom().scale(xScale).ticks(5).tickFormat(timeFormat("%M:%S")); const yAxis = axisLeft().scale(yScale).ticks(5).tickFormat(format(".3s")); - this.setState({ data: null, xAxis, yAxis, labelMargin }); - return; + + return{ + data: null, + xAxis, + yAxis, + labelMargin + }; } - // check if requested time frame has changed - if(this.props.time !== prevProps.time) { - // only show data in requested time - let data = this.props.data; - const firstTimestamp = data[0][data[0].length - 1].x - (this.props.time + 1) * 1000; - if (data[0][0].x < firstTimestamp) { - // only show data in range (+100 ms) - const index = data[0].findIndex(value => value.x >= firstTimestamp - 100); - data = data.map(values => values.slice(index)); - } + // only show data in requested time + let data = props.data; - this.setState({data, labelMargin}); + const firstTimestamp = data[0][data[0].length - 1].x - (props.time + 1) * 1000; + if (data[0][0].x < firstTimestamp) { + // only show data in range (+100 ms) + const index = data[0].findIndex(value => value.x >= firstTimestamp - 100); + data = data.map(values => values.slice(index)); } + + return { + data, + labelMargin + }; + + } + + componentDidUpdate(prevProps: Readonly

    , prevState: Readonly, snapshot: SS): void { + if (prevProps.time !== this.props.time) { + this.createInterval(); + } + + } createInterval() { diff --git a/src/widget/widgets/plot.js b/src/widget/widgets/plot.js index 7cda5ed..15961a5 100644 --- a/src/widget/widgets/plot.js +++ b/src/widget/widgets/plot.js @@ -53,7 +53,7 @@ class WidgetPlot extends React.Component { // Query the signals that will be displayed in the legend const legend = props.config.outputMapping.reduce( (accum, signal, signal_index) => { if (chosenSignals.includes(signal_index)) { - accum.push({ index: signal_index, name: signal.name, type: signal.type }); + accum.push({ index: signal_index, name: signal.name, type: signal.unit }); } return accum; From fe79f5e531da202c82bf4f008e7e4ffd2a466fb2 Mon Sep 17 00:00:00 2001 From: Sonja Happ Date: Thu, 12 Mar 2020 16:00:51 +0100 Subject: [PATCH 115/391] make widget text control work, move validation of form data to click of close button --- .../edit-widget-control-creator.js | 62 +++++++++---------- .../edit-widget-parameters-control.js | 2 +- .../edit-widget/edit-widget-text-control.js | 35 +++++++++-- src/widget/edit-widget/edit-widget.js | 31 +++++----- 4 files changed, 74 insertions(+), 56 deletions(-) diff --git a/src/widget/edit-widget/edit-widget-control-creator.js b/src/widget/edit-widget/edit-widget-control-creator.js index 36c70a8..57be214 100644 --- a/src/widget/edit-widget/edit-widget-control-creator.js +++ b/src/widget/edit-widget/edit-widget-control-creator.js @@ -1,8 +1,4 @@ /** - * File: edit-widget-control-creator.js - * Author: Ricardo Hernandez-Montoya - * Date: 23.05.2017 - * * This file is part of VILLASweb. * * VILLASweb is free software: you can redistribute it and/or modify @@ -37,50 +33,50 @@ import EditWidgetMinMaxControl from './edit-widget-min-max-control'; import EditWidgetHTMLContent from './edit-widget-html-content'; import EditWidgetParametersControl from './edit-widget-parameters-control'; -export default function CreateControls(widgetType = null, widget = null, sessionToken = null, files = null, validateForm, signals, handleChange) { +export default function CreateControls(widgetType = null, widget = null, sessionToken = null, files = null, signals, handleChange) { // Use a list to concatenate the controls according to the widget type var DialogControls = []; switch(widgetType) { case 'CustomAction': DialogControls.push( - validateForm(id)} handleChange={e => handleChange(e)} />, - validateForm(id)} handleChange={e => handleChange(e)} />, + handleChange(e)} />, + handleChange(e)} />, handleChange(e)} /> ); break; case 'Action': DialogControls.push( - validateForm(id)} signals={signals} handleChange={(e) => handleChange(e)} />, + handleChange(e)} />, ); break; case 'Value': DialogControls.push( - validateForm(id)} handleChange={e => handleChange(e)} />, - validateForm(id)} signals={signals} handleChange={(e) => handleChange(e)} />, + handleChange(e)} />, + handleChange(e)} />, handleChange(e)} />, handleChange(e)} /> ); break; case 'Lamp': DialogControls.push( - validateForm(id)} signals={signals} handleChange={(e) => handleChange(e)} />, - validateForm(id)} handleChange={e => handleChange(e)} />, - validateForm(id)} handleChange={(e) => handleChange(e)} />, - validateForm(id)} handleChange={(e) => handleChange(e)} />, + handleChange(e)} />, + handleChange(e)} />, + handleChange(e)} />, + handleChange(e)} />, ); break; case 'Plot': DialogControls.push( - validateForm(id)} handleChange={(e) => handleChange(e)} />, - validateForm(id)} signals={signals} handleChange={(e) => handleChange(e)} />, - handleChange(e)} />, + handleChange(e)} />, + handleChange(e)} />, + handleChange(e)} />, handleChange(e)} /> ); break; case 'Table': DialogControls.push( - validateForm(id)} signals={signals} handleChange={(e) => handleChange(e)} />, + handleChange(e)} />, handleChange(e)} /> ); break; @@ -88,14 +84,14 @@ export default function CreateControls(widgetType = null, widget = null, session // Restrict to only image file types (MIME) let imageControlFiles = files == null? [] : files.filter(file => file.type.includes('image')); DialogControls.push( - validateForm(id)} handleChange={(e) => handleChange(e)} />, + handleChange(e)} />, handleChange(e)} /> ); break; case 'Gauge': DialogControls.push( - validateForm(id)} handleChange={e => handleChange(e)} />, - validateForm(id)} signals={signals} handleChange={(e) => handleChange(e)} />, + handleChange(e)} />, + handleChange(e)} />, handleChange(e)} />, handleChange(e)} />, handleChange(e)} /> @@ -103,17 +99,17 @@ export default function CreateControls(widgetType = null, widget = null, session break; case 'PlotTable': DialogControls.push( - validateForm(id)} signals={signals} handleChange={(e) => handleChange(e)} />, + handleChange(e)} />, handleChange(e)} />, - validateForm(id)} handleChange={(e) => handleChange(e)} />, + handleChange(e)} />, handleChange(e)} /> ); break; case 'Slider': DialogControls.push( - handleChange(e)} validate={id => validateForm(id)} />, - validateForm(id)} handleChange={(e) => handleChange(e)} />, - validateForm(id)} signals={signals} handleChange={(e) => handleChange(e)} />, + handleChange(e)} />, + handleChange(e)} />, + handleChange(e)} />, handleChange(e)} />, handleChange(e)} />, handleChange(e)} />, @@ -123,8 +119,8 @@ export default function CreateControls(widgetType = null, widget = null, session break; case 'Button': DialogControls.push( - handleChange(e)} validate={id => validateForm(id)} />, - validateForm(id)} signals={signals} handleChange={(e) => handleChange(e)} />, + handleChange(e)} />, + handleChange(e)} />, handleChange(e)} />, handleChange(e)} />, handleChange(e)} /> @@ -132,13 +128,13 @@ export default function CreateControls(widgetType = null, widget = null, session break; case 'Box': DialogControls.push( - validateForm(id)} handleChange={(e) => handleChange(e)} />, + handleChange(e)} />, handleChange(e)} /> ); break; case 'Label': DialogControls.push( - handleChange(e)} validate={id => validateForm(id)} />, + handleChange(e)} />, handleChange(e)} />, handleChange(e)} /> ); @@ -152,14 +148,14 @@ export default function CreateControls(widgetType = null, widget = null, session // Restrict to only xml files (MIME) let topologyControlFiles = files == null? [] : files.filter( file => file.type.includes('xml')); DialogControls.push( - validateForm(id)} handleChange={(e) => handleChange(e)} /> + handleChange(e)} /> ); break; case 'Input': DialogControls.push( - validateForm(id)} handleChange={e => handleChange(e)} />, - validateForm(id)} signals={signals} handleChange={(e) => handleChange(e)} /> + handleChange(e)} />, + handleChange(e)} /> ); break; diff --git a/src/widget/edit-widget/edit-widget-parameters-control.js b/src/widget/edit-widget/edit-widget-parameters-control.js index 3a817e3..d1cf65c 100644 --- a/src/widget/edit-widget/edit-widget-parameters-control.js +++ b/src/widget/edit-widget/edit-widget-parameters-control.js @@ -49,7 +49,7 @@ class EditWidgetParametersControl extends Component { render() { return ( - + {this.props.label} this.handleChange(v)} /> diff --git a/src/widget/edit-widget/edit-widget-text-control.js b/src/widget/edit-widget/edit-widget-text-control.js index c0fc069..a8624c6 100644 --- a/src/widget/edit-widget/edit-widget-text-control.js +++ b/src/widget/edit-widget/edit-widget-text-control.js @@ -26,22 +26,47 @@ class EditWidgetTextControl extends Component { constructor(props) { super(props); + let value = ""; + let parts = props.controlId.split('.'); + if (parts.length === 1) { + // not a customProperty + value=props.widget[props.controlId] + } else if(parts.length === 2){ + // a custom property + value=props.widget[parts[0]][parts[1]] + } else { + value="controlID contains too many dots" + } + this.state = { - widget: {} + value: value }; } static getDerivedStateFromProps(props, state){ + + let value = ""; + let parts = props.controlId.split('.'); + if (parts.length === 1) { + // not a customProperty + value=props.widget[props.controlId] + } else if(parts.length === 2){ + // a custom property + value=props.widget[parts[0]][parts[1]] + } else { + value="controlID contains too many dots" + } + return { - widget: props.widget - }; + value: value + } } render() { return ( - + {this.props.label} - this.props.handleChange(e)} /> + this.props.handleChange(e)} /> ); diff --git a/src/widget/edit-widget/edit-widget.js b/src/widget/edit-widget/edit-widget.js index e110db3..de0bef1 100644 --- a/src/widget/edit-widget/edit-widget.js +++ b/src/widget/edit-widget/edit-widget.js @@ -44,7 +44,7 @@ class EditWidgetDialog extends React.Component { onClose(canceled) { if (canceled === false) { - if (this.valid) { + if (this.validChanges()) { this.props.onClose(this.state.temporal); } } else { @@ -104,17 +104,17 @@ class EditWidgetDialog extends React.Component { this.setState({ temporal: changeObject}); } else { - console.log("edit-widget: type text"); - if(this.state.temporal[e.target.id]){ - - console.log("edit-widget: type: " , e.target.type, " target.id", e.target.id, "target.value", e.target.value) + console.log("edit-widget: text type"); + let parts = e.target.id.split('.'); let finalChange = this.state.temporal; - - finalChange[e.target.id] = e.target.value; - - console.log("edit-widget: finalChange", finalChange); - this.setState({ temporal: finalChange}); - } + if (parts.length === 1 && this.state.temporal[e.target.id]) { + // not a customProperty + finalChange[e.target.id] = e.target.value; + } else if (parts.length === 2){ + // a customProperty is changed + finalChange[parts[0]][parts[1]] = e.target.value; + } + this.setState({temporal: finalChange}); } } @@ -123,18 +123,16 @@ class EditWidgetDialog extends React.Component { this.setState({ temporal: widget_data }); } - validateForm(target) { - // check all controls + validChanges() { + // check that widget has a name var name = true; if (this.state.name === '') { name = false; } - //this.valid = name; this.valid = name; - // return state to control - if (target === 'name') return name ? "success" : "error"; + return name; } render() { @@ -146,7 +144,6 @@ class EditWidgetDialog extends React.Component { this.state.temporal, this.props.sessionToken, this.props.files, - (id) => this.validateForm(id), this.props.signals, (e) => this.handleChange(e)); } From 6cac1df08bc6b5569b69a9b5cbc093ed5a3a8c92 Mon Sep 17 00:00:00 2001 From: Sonja Happ Date: Fri, 13 Mar 2020 17:20:23 +0100 Subject: [PATCH 116/391] add a TODO in separate case for downloaded files (WIP) --- src/file/file-store.js | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/file/file-store.js b/src/file/file-store.js index 4336ebc..6843d7a 100644 --- a/src/file/file-store.js +++ b/src/file/file-store.js @@ -40,6 +40,14 @@ class FileStore extends ArrayStore { case 'files/upload-error': console.log(action.error); return state; + case 'files/loaded': + if (Array.isArray(action.data)) { + return super.reduce(state, action) + } else { + // in this case a file is contained in the response (no JSON) + // TODO we have to extract and process the file here (=save it somewhere?) + return super.reduce(state, action) + } default: return super.reduce(state, action); From f8ea4a5021fbdafe4ccd6831a083254c7cd1f211 Mon Sep 17 00:00:00 2001 From: Sonja Happ Date: Fri, 13 Mar 2020 17:21:44 +0100 Subject: [PATCH 117/391] load files of widget upon loaded widgets --- src/widget/widget-store.js | 41 +++++++++++++++++++++++++++- src/widget/widgets-data-manager.js | 44 ++++++++++++++++++++++++++++-- 2 files changed, 82 insertions(+), 3 deletions(-) diff --git a/src/widget/widget-store.js b/src/widget/widget-store.js index d6256ed..f49ca27 100644 --- a/src/widget/widget-store.js +++ b/src/widget/widget-store.js @@ -1,4 +1,43 @@ +/** + * This file is part of VILLASweb. + * + * VILLASweb is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * VILLASweb is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with VILLASweb. If not, see . + ******************************************************************************/ + + import ArrayStore from '../common/array-store'; import WidgetsDataManager from './widgets-data-manager'; -export default new ArrayStore('widgets', WidgetsDataManager); +class WidgetStore extends ArrayStore { + constructor() { + super('widgets', WidgetsDataManager); + } + + reduce(state, action) { + switch (action.type) { + + case 'widgets/loaded': + + WidgetsDataManager.loadFiles(action.token, action.data); + return super.reduce(state, action); + + default: + return super.reduce(state, action); + + } + } + +} + +export default new WidgetStore(); diff --git a/src/widget/widgets-data-manager.js b/src/widget/widgets-data-manager.js index ed03b2f..c32417d 100644 --- a/src/widget/widgets-data-manager.js +++ b/src/widget/widgets-data-manager.js @@ -1,3 +1,43 @@ -import RestDataManager from '../common/data-managers/rest-data-manager'; +/** + * This file is part of VILLASweb. + * + * VILLASweb is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * VILLASweb is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with VILLASweb. If not, see . + ******************************************************************************/ -export default new RestDataManager('widget', '/widgets'); + +import RestDataManager from '../common/data-managers/rest-data-manager'; +import RestAPI from "../common/api/rest-api"; +import AppDispatcher from "../common/app-dispatcher"; + +class WidgetsDataManager extends RestDataManager{ + + constructor() { + super('widget', '/widgets'); + } + + loadFiles(token, widgets){ + for (let widget of widgets) { + // request files of widget + RestAPI.get(this.makeURL('/files?objectType=widget&objectID=' + widget.id), token).then(response => { + AppDispatcher.dispatch({ + type: 'files/loaded', + data: response.files + }); + }); + } + } + +} + +export default new WidgetsDataManager() From 4ac80aafab28367fa230d2637c5722f7ec5a1bb6 Mon Sep 17 00:00:00 2001 From: Sonja Happ Date: Fri, 13 Mar 2020 17:23:54 +0100 Subject: [PATCH 118/391] fix file id access for image edit --- src/widget/edit-widget/edit-widget-image-control.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/widget/edit-widget/edit-widget-image-control.js b/src/widget/edit-widget/edit-widget-image-control.js index 204d85e..fdef5ff 100644 --- a/src/widget/edit-widget/edit-widget-image-control.js +++ b/src/widget/edit-widget/edit-widget-image-control.js @@ -82,7 +82,7 @@ class EditImageWidgetControl extends React.Component { ) : ( this.props.files.reduce((entries, file, index) => { - entries.push(); + entries.push(); return entries; }, [ From 5c4afb686f3be0412a9d6483678e75119d160723 Mon Sep 17 00:00:00 2001 From: Sonja Happ Date: Fri, 13 Mar 2020 17:24:36 +0100 Subject: [PATCH 119/391] store file of all widgets in state of dashboard --- src/dashboard/dashboard.js | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/src/dashboard/dashboard.js b/src/dashboard/dashboard.js index e28ca6a..ba19e56 100644 --- a/src/dashboard/dashboard.js +++ b/src/dashboard/dashboard.js @@ -78,12 +78,26 @@ class Dashboard extends Component { // TODO filter signals to the ones belonging to the scenario at hand! let signals = SignalStore.getState(); + // get files of all widgets + let allFiles = FileStore.getState(); + let files = []; + let file, widget; + for (file of allFiles){ + for (widget of widgets){ + if (file.widgetID === widget.id){ + files.push(file); + } + } + } + + + return { dashboard, widgets, signals, sessionToken: sessionToken, - files: null, + files: files, editing: prevState.editing || false, paused: prevState.paused || false, From e09f69bd70791e7b508b0dc20faed96ba26f0392 Mon Sep 17 00:00:00 2001 From: Sonja Happ Date: Fri, 13 Mar 2020 17:26:17 +0100 Subject: [PATCH 120/391] do not try to load file if no file is available for widget --- src/widget/widgets/image.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/widget/widgets/image.js b/src/widget/widgets/image.js index 2427084..3d24227 100644 --- a/src/widget/widgets/image.js +++ b/src/widget/widgets/image.js @@ -29,7 +29,7 @@ class WidgetImage extends React.Component { componentDidMount() { // Query the image referenced by the widget let widgetFile = this.props.widget.customProperties.file; - if (widgetFile && !this.props.files.find(file => file.id === widgetFile)) { + if (widgetFile !== -1 && !this.props.files.find(file => file.id === widgetFile)) { AppDispatcher.dispatch({ type: 'files/start-load', data: widgetFile, @@ -39,7 +39,7 @@ class WidgetImage extends React.Component { } render() { - const file = this.props.files.find(file => file._id === this.props.widget.customProperties.file); + const file = this.props.files.find(file => file.id === this.props.widget.customProperties.file); return (

    From 407a40673828b6105c8d53e87df65cbd2263f1ef Mon Sep 17 00:00:00 2001 From: Sonja Happ Date: Fri, 13 Mar 2020 17:27:09 +0100 Subject: [PATCH 121/391] add file property to customProperties of image Widget (WIP) --- src/widget/widget-factory.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/widget/widget-factory.js b/src/widget/widget-factory.js index b6905fa..c5b8a39 100644 --- a/src/widget/widget-factory.js +++ b/src/widget/widget-factory.js @@ -118,12 +118,13 @@ class WidgetFactory { widget.customProperties.yMax = 10; widget.customProperties.yUseMinMax = false; break; - case 'Image': + case 'Image': widget.minWidth = 20; widget.minHeight = 20; widget.width = 200; widget.height = 200; widget.customProperties.lockAspect = true; + widget.customProperties.file = 1; // ID of image file, -1 means non selected break; case 'Button': widget.minWidth = 100; From 812327807167d2c02fe95e09f226e0a68a09b2df Mon Sep 17 00:00:00 2001 From: Laura Fuentes Grau Date: Fri, 13 Mar 2020 18:22:25 +0100 Subject: [PATCH 122/391] deleted unnecessary code and restored partial editability --- src/user/edit-own-user.js | 6 --- .../edit-widget/edit-widget-color-control.js | 2 +- src/widget/edit-widget/edit-widget.js | 52 +++++++------------ 3 files changed, 19 insertions(+), 41 deletions(-) diff --git a/src/user/edit-own-user.js b/src/user/edit-own-user.js index fc63914..47b9aff 100644 --- a/src/user/edit-own-user.js +++ b/src/user/edit-own-user.js @@ -87,12 +87,6 @@ class EditOwnUserDialog extends React.Component { } - /*this.setState({ - role: user.role, - id: user.id, - active: user.active - });*/ - // form is valid if the following condition is met this.valid = username || mail || (oldPassword && pw && confirmpassword); diff --git a/src/widget/edit-widget/edit-widget-color-control.js b/src/widget/edit-widget/edit-widget-color-control.js index 1d045bd..dd408c7 100644 --- a/src/widget/edit-widget/edit-widget-color-control.js +++ b/src/widget/edit-widget/edit-widget-color-control.js @@ -33,7 +33,7 @@ class EditWidgetColorControl extends Component { let colorCount = 0; const colors = []; const colorScale = scaleOrdinal(schemeCategory10); - while (colorCount < 20) { colors.push(colorScale(colorCount)); colorCount++; } + while (colorCount < 10) { colors.push(colorScale(colorCount)); colorCount++; } colors.unshift('#000', '#FFF'); // include black and white return colors; diff --git a/src/widget/edit-widget/edit-widget.js b/src/widget/edit-widget/edit-widget.js index de0bef1..fdec5ec 100644 --- a/src/widget/edit-widget/edit-widget.js +++ b/src/widget/edit-widget/edit-widget.js @@ -64,22 +64,18 @@ class EditWidgetDialog extends React.Component { } handleChange(e) { - // TODO: check what we really need in this function. Can we reduce its complexity? - if (e.constructor === Array) { - // Every property in the array will be updated - let changes = e.reduce( (changesObject, event) => { - changesObject[event.target.id] = event.target.value; + + // TODO: check what we really need in this function. Can we reduce its complexity? + let parts = e.target.id.split('.'); + let changeObject = this.state.temporal; + let customProperty = true; + if (parts.length === 1 && this.state.temporal[e.target.id]) { + // not a customProperty + customProperty = false; + } - return changesObject; - }, {}); - - this.setState({ temporal: Object.assign({}, this.state.temporal, changes ) }); - } - - if(e.target.type !== 'text'){ - console.log("edit-widget: e.target.type is not text: ", e.target.type); - let changeObject = this.state.temporal; if (e.target.id === 'lockAspect') { + //not a customProperty changeObject[e.target.id] = e.target.checked; // correct image aspect if turned on @@ -87,39 +83,27 @@ class EditWidgetDialog extends React.Component { changeObject = this.assignAspectRatio(changeObject, this.state.temporal.file); } } else if (e.target.id === 'file') { - changeObject[e.target.id] = e.target.value; + //not a customProperty + changeObject.customProperties[e.target.id] = e.target.value; // get file and update size (if it's an image) if ('lockAspect' in this.state.temporal && this.state.temporal.lockAspect) { changeObject = this.assignAspectRatio(changeObject, e.target.value); } } else if (e.target.type === 'checkbox') { - changeObject[e.target.id] = e.target.value; + customProperty ? changeObject.customProperties[e.target.id] = e.target.value : changeObject[e.target.id] = e.target.value; } else if (e.target.type === 'number') { - changeObject[e.target.id] = Number(e.target.value); + customProperty ? changeObject.customProperties[e.target.id] = Number(e.target.value) : changeObject[e.target.id] = Number(e.target.value); } else { - changeObject[e.target.id] = e.target.value; + customProperty ? changeObject.customProperties[e.target.id] = e.target.value : changeObject[e.target.id] = e.target.value ; } - + this.validChanges(); this.setState({ temporal: changeObject}); - } else { - console.log("edit-widget: text type"); - let parts = e.target.id.split('.'); - let finalChange = this.state.temporal; - if (parts.length === 1 && this.state.temporal[e.target.id]) { - // not a customProperty - finalChange[e.target.id] = e.target.value; - } else if (parts.length === 2){ - // a customProperty is changed - finalChange[parts[0]][parts[1]] = e.target.value; - } - this.setState({temporal: finalChange}); - } } resetState() { - var widget_data = Object.assign({}, this.props.widget); + let widget_data = Object.assign({}, this.props.widget); this.setState({ temporal: widget_data }); } @@ -127,7 +111,7 @@ class EditWidgetDialog extends React.Component { // check that widget has a name var name = true; - if (this.state.name === '') { + if (this.state.temporal[name] === '') { name = false; } From 7ad729964e9c1ef9d6b716bb50b98bb8b30d2396 Mon Sep 17 00:00:00 2001 From: Laura Fuentes Grau Date: Sun, 15 Mar 2020 14:51:19 +0100 Subject: [PATCH 123/391] widget name now editable even after name field was empty --- src/widget/edit-widget/edit-widget.js | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/widget/edit-widget/edit-widget.js b/src/widget/edit-widget/edit-widget.js index fdec5ec..b9ee2ca 100644 --- a/src/widget/edit-widget/edit-widget.js +++ b/src/widget/edit-widget/edit-widget.js @@ -90,10 +90,14 @@ class EditWidgetDialog extends React.Component { if ('lockAspect' in this.state.temporal && this.state.temporal.lockAspect) { changeObject = this.assignAspectRatio(changeObject, e.target.value); } - } else if (e.target.type === 'checkbox') { - customProperty ? changeObject.customProperties[e.target.id] = e.target.value : changeObject[e.target.id] = e.target.value; } else if (e.target.type === 'number') { customProperty ? changeObject.customProperties[e.target.id] = Number(e.target.value) : changeObject[e.target.id] = Number(e.target.value); + } else if(e.target.id === 'name'){ + if(changeObject[e.target.id] != null){ + changeObject[e.target.id] = e.target.value; + } else{ + changeObject[e.target.id] = 'default'; + } } else { customProperty ? changeObject.customProperties[e.target.id] = e.target.value : changeObject[e.target.id] = e.target.value ; } From 333133629cf9e3202639984c16e9adc87872f610 Mon Sep 17 00:00:00 2001 From: Sonja Happ Date: Mon, 16 Mar 2020 13:12:44 +0100 Subject: [PATCH 124/391] fix color control editor, add "customProperties." to control creator (WIP) --- .../edit-widget/edit-widget-color-control.js | 12 +++- .../edit-widget-control-creator.js | 56 +++++++-------- src/widget/edit-widget/edit-widget.js | 68 +++++++++---------- 3 files changed, 71 insertions(+), 65 deletions(-) diff --git a/src/widget/edit-widget/edit-widget-color-control.js b/src/widget/edit-widget/edit-widget-color-control.js index dd408c7..408a4d0 100644 --- a/src/widget/edit-widget/edit-widget-color-control.js +++ b/src/widget/edit-widget/edit-widget-color-control.js @@ -44,7 +44,7 @@ class EditWidgetColorControl extends Component { this.state = { widget: { - + } }; } @@ -56,6 +56,12 @@ class EditWidgetColorControl extends Component { } render() { + + let parts = this.props.controlId.split('.'); + let isCustomProperty = true; + if (parts.length === 1){ + isCustomProperty = false; + } return ( @@ -71,10 +77,10 @@ class EditWidgetColorControl extends Component { }; let checkedClass = classNames({ - 'checked': idx === this.state.widget[this.props.controlId] || this.state.widget.customProperties[this.props.controlId] + 'checked': idx === (isCustomProperty ? this.state.widget[parts[0]][parts[1]] : this.state.widget[this.props.controlId]) }); - return ( this.props.handleChange({target: { id: this.props.controlId, value: idx}})} />) + return ( this.props.handleChange({target: { id: this.props.controlId, value: idx}})} />) } ) } diff --git a/src/widget/edit-widget/edit-widget-control-creator.js b/src/widget/edit-widget/edit-widget-control-creator.js index 57be214..1cbe757 100644 --- a/src/widget/edit-widget/edit-widget-control-creator.js +++ b/src/widget/edit-widget/edit-widget-control-creator.js @@ -41,8 +41,8 @@ export default function CreateControls(widgetType = null, widget = null, session case 'CustomAction': DialogControls.push( handleChange(e)} />, - handleChange(e)} />, - handleChange(e)} /> + handleChange(e)} />, + handleChange(e)} /> ); break; case 'Action': @@ -55,52 +55,52 @@ export default function CreateControls(widgetType = null, widget = null, session handleChange(e)} />, handleChange(e)} />, handleChange(e)} />, - handleChange(e)} /> + handleChange(e)} /> ); break; case 'Lamp': DialogControls.push( handleChange(e)} />, handleChange(e)} />, - handleChange(e)} />, - handleChange(e)} />, + handleChange(e)} />, + handleChange(e)} />, ); break; case 'Plot': DialogControls.push( handleChange(e)} />, - handleChange(e)} />, - handleChange(e)} />, + handleChange(e)} />, + handleChange(e)} />, handleChange(e)} /> ); break; case 'Table': DialogControls.push( - handleChange(e)} />, - handleChange(e)} /> + handleChange(e)} />, + handleChange(e)} /> ); break; case 'Image': // Restrict to only image file types (MIME) let imageControlFiles = files == null? [] : files.filter(file => file.type.includes('image')); DialogControls.push( - handleChange(e)} />, - handleChange(e)} /> + handleChange(e)} />, + handleChange(e)} /> ); break; case 'Gauge': DialogControls.push( handleChange(e)} />, handleChange(e)} />, - handleChange(e)} />, + handleChange(e)} />, handleChange(e)} />, - handleChange(e)} /> + handleChange(e)} /> ); break; case 'PlotTable': DialogControls.push( - handleChange(e)} />, - handleChange(e)} />, + handleChange(e)} />, + handleChange(e)} />, handleChange(e)} />, handleChange(e)} /> ); @@ -110,45 +110,45 @@ export default function CreateControls(widgetType = null, widget = null, session handleChange(e)} />, handleChange(e)} />, handleChange(e)} />, - handleChange(e)} />, - handleChange(e)} />, - handleChange(e)} />, - handleChange(e)} />, - handleChange(e)} /> + handleChange(e)} />, + handleChange(e)} />, + handleChange(e)} />, + handleChange(e)} />, + handleChange(e)} /> ); break; case 'Button': DialogControls.push( handleChange(e)} />, handleChange(e)} />, - handleChange(e)} />, - handleChange(e)} />, - handleChange(e)} /> + handleChange(e)} />, + handleChange(e)} />, + handleChange(e)} /> ); break; case 'Box': DialogControls.push( - handleChange(e)} />, - handleChange(e)} /> + handleChange(e)} />, + handleChange(e)} /> ); break; case 'Label': DialogControls.push( handleChange(e)} />, handleChange(e)} />, - handleChange(e)} /> + handleChange(e)} /> ); break; case 'HTML': DialogControls.push( - handleChange(e)} /> + handleChange(e)} /> ); break; case 'Topology': // Restrict to only xml files (MIME) let topologyControlFiles = files == null? [] : files.filter( file => file.type.includes('xml')); DialogControls.push( - handleChange(e)} /> + handleChange(e)} /> ); break; diff --git a/src/widget/edit-widget/edit-widget.js b/src/widget/edit-widget/edit-widget.js index b9ee2ca..7d34887 100644 --- a/src/widget/edit-widget/edit-widget.js +++ b/src/widget/edit-widget/edit-widget.js @@ -64,45 +64,45 @@ class EditWidgetDialog extends React.Component { } handleChange(e) { - + // TODO: check what we really need in this function. Can we reduce its complexity? let parts = e.target.id.split('.'); - let changeObject = this.state.temporal; - let customProperty = true; - if (parts.length === 1 && this.state.temporal[e.target.id]) { - // not a customProperty - customProperty = false; - } + let changeObject = this.state.temporal; + let customProperty = true; + if (parts.length === 1 && this.state.temporal[e.target.id]) { + // not a customProperty + customProperty = false; + } - if (e.target.id === 'lockAspect') { - //not a customProperty - changeObject[e.target.id] = e.target.checked; + if (e.target.id === 'lockAspect') { + //not a customProperty + changeObject[e.target.id] = e.target.checked; - // correct image aspect if turned on - if (e.target.checked) { - changeObject = this.assignAspectRatio(changeObject, this.state.temporal.file); - } - } else if (e.target.id === 'file') { - //not a customProperty - changeObject.customProperties[e.target.id] = e.target.value; - - // get file and update size (if it's an image) - if ('lockAspect' in this.state.temporal && this.state.temporal.lockAspect) { - changeObject = this.assignAspectRatio(changeObject, e.target.value); - } - } else if (e.target.type === 'number') { - customProperty ? changeObject.customProperties[e.target.id] = Number(e.target.value) : changeObject[e.target.id] = Number(e.target.value); - } else if(e.target.id === 'name'){ - if(changeObject[e.target.id] != null){ - changeObject[e.target.id] = e.target.value; - } else{ - changeObject[e.target.id] = 'default'; - } - } else { - customProperty ? changeObject.customProperties[e.target.id] = e.target.value : changeObject[e.target.id] = e.target.value ; + // correct image aspect if turned on + if (e.target.checked) { + changeObject = this.assignAspectRatio(changeObject, this.state.temporal.file); } - this.validChanges(); - this.setState({ temporal: changeObject}); + } else if (e.target.id === 'file') { + //not a customProperty + changeObject.customProperties[e.target.id] = e.target.value; + + // get file and update size (if it's an image) + if ('lockAspect' in this.state.temporal && this.state.temporal.lockAspect) { + changeObject = this.assignAspectRatio(changeObject, e.target.value); + } + } else if (e.target.type === 'number') { + customProperty ? changeObject.customProperties[e.target.id] = Number(e.target.value) : changeObject[e.target.id] = Number(e.target.value); + } else if(e.target.id === 'name'){ + if(changeObject[e.target.id] != null){ + changeObject[e.target.id] = e.target.value; + } else{ + changeObject[e.target.id] = 'default'; + } + } else { + customProperty ? changeObject[parts[0]][parts[1]] = e.target.value : changeObject[e.target.id] = e.target.value ; + } + this.validChanges(); + this.setState({ temporal: changeObject}); } From ab0bda040462f2b59d4459b0293c69e17ed703a9 Mon Sep 17 00:00:00 2001 From: Sonja Happ Date: Mon, 16 Mar 2020 14:57:58 +0100 Subject: [PATCH 125/391] fix a bug with editing of selected signal (SignalControl) --- .../edit-widget/edit-widget-control-creator.js | 14 +++++++------- .../edit-widget/edit-widget-signal-control.js | 11 ++++++++++- 2 files changed, 17 insertions(+), 8 deletions(-) diff --git a/src/widget/edit-widget/edit-widget-control-creator.js b/src/widget/edit-widget/edit-widget-control-creator.js index 1cbe757..fb4d0d5 100644 --- a/src/widget/edit-widget/edit-widget-control-creator.js +++ b/src/widget/edit-widget/edit-widget-control-creator.js @@ -47,20 +47,20 @@ export default function CreateControls(widgetType = null, widget = null, session break; case 'Action': DialogControls.push( - handleChange(e)} />, + handleChange(e)} />, ); break; case 'Value': DialogControls.push( handleChange(e)} />, - handleChange(e)} />, + handleChange(e)} />, handleChange(e)} />, handleChange(e)} /> ); break; case 'Lamp': DialogControls.push( - handleChange(e)} />, + handleChange(e)} />, handleChange(e)} />, handleChange(e)} />, handleChange(e)} />, @@ -91,7 +91,7 @@ export default function CreateControls(widgetType = null, widget = null, session case 'Gauge': DialogControls.push( handleChange(e)} />, - handleChange(e)} />, + handleChange(e)} />, handleChange(e)} />, handleChange(e)} />, handleChange(e)} /> @@ -109,7 +109,7 @@ export default function CreateControls(widgetType = null, widget = null, session DialogControls.push( handleChange(e)} />, handleChange(e)} />, - handleChange(e)} />, + handleChange(e)} />, handleChange(e)} />, handleChange(e)} />, handleChange(e)} />, @@ -120,7 +120,7 @@ export default function CreateControls(widgetType = null, widget = null, session case 'Button': DialogControls.push( handleChange(e)} />, - handleChange(e)} />, + handleChange(e)} />, handleChange(e)} />, handleChange(e)} />, handleChange(e)} /> @@ -155,7 +155,7 @@ export default function CreateControls(widgetType = null, widget = null, session case 'Input': DialogControls.push( handleChange(e)} />, - handleChange(e)} /> + handleChange(e)} /> ); break; diff --git a/src/widget/edit-widget/edit-widget-signal-control.js b/src/widget/edit-widget/edit-widget-signal-control.js index 1feb090..1486775 100644 --- a/src/widget/edit-widget/edit-widget-signal-control.js +++ b/src/widget/edit-widget/edit-widget-signal-control.js @@ -37,12 +37,21 @@ class EditWidgetSignalControl extends Component { }; } + handleSignalChange(e){ + + let newSignal = []; + newSignal.push(e.target.value); + + this.props.handleChange({ target: { id: this.props.controlId, value: newSignal } }); + + } + render() { return ( Signal - this.props.handleChange(e)}> + this.handleSignalChange(e)}> { this.props.signals.length === 0 ? ( From a63c943d2f60e5aad609e8e55e83d90f473bce85 Mon Sep 17 00:00:00 2001 From: Laura Fuentes Grau Date: Mon, 16 Mar 2020 17:02:51 +0100 Subject: [PATCH 126/391] dashboard grid now editable --- src/dashboard/dashboard.js | 20 +++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) diff --git a/src/dashboard/dashboard.js b/src/dashboard/dashboard.js index ba19e56..11ac9e0 100644 --- a/src/dashboard/dashboard.js +++ b/src/dashboard/dashboard.js @@ -114,7 +114,7 @@ class Dashboard extends Component { } - + static getNewWidgetKey() { const widgetKey = this.lastWidgetKey; this.lastWidgetKey++; @@ -282,7 +282,11 @@ class Dashboard extends Component { saveEditing() { // Provide the callback so it can be called when state change is applied // TODO: Check if callback is needed - + AppDispatcher.dispatch({ + type: 'dashboards/start-edit', + data: this.state.dashboard, + token: this.state.sessionToken + }); this.state.widgetChangeData.forEach( widget => { AppDispatcher.dispatch({ @@ -317,7 +321,11 @@ class Dashboard extends Component { token: this.state.sessionToken }); }); */ - + AppDispatcher.dispatch({ + type: 'dashboards/start-load', + data: this.props.match.params.dashboard, + token: this.state.sessionToken + }); AppDispatcher.dispatch({ type: 'widgets/start-load', @@ -329,9 +337,11 @@ class Dashboard extends Component { }; setGrid(value) { - const dashboard = this.state.dashboard.set('grid', value); - + + let dashboard = this.state.dashboard; + dashboard.grid = value; this.setState({ dashboard }); + this.forceUpdate(); }; pauseData(){ From fe3c7830549ae2dadeff815d61a03ca1a0f3522b Mon Sep 17 00:00:00 2001 From: Laura Fuentes Grau Date: Mon, 16 Mar 2020 20:36:23 +0100 Subject: [PATCH 127/391] plot widget x scale now freezes if dashboard is paused --- src/widget/widget-plot/plot.js | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/src/widget/widget-plot/plot.js b/src/widget/widget-plot/plot.js index db86bfd..82c099a 100644 --- a/src/widget/widget-plot/plot.js +++ b/src/widget/widget-plot/plot.js @@ -65,7 +65,8 @@ class Plot extends React.Component { xAxis, yAxis, labelMargin, - identifier: uniqueIdentifier++ + identifier: uniqueIdentifier++, + stopTime: null, }; } @@ -86,20 +87,30 @@ class Plot extends React.Component { // check if data is invalid if (props.data == null || props.data.length === 0 || props.data[0].length === 0) { // create empty plot axes - const xScale = scaleTime().domain([Date.now() - props.time * 1000, Date.now()]).range([0, props.width - leftMargin - labelMargin - rightMargin]); + let xScale; let yScale; + let stopTime; + + if(!props.paused){ + xScale = scaleTime().domain([Date.now() - props.time * 1000, Date.now()]).range([0, props.width - leftMargin - labelMargin - rightMargin]); + stopTime = Date.now(); + }else{ + stopTime = state.stopTime; + xScale = scaleLinear().domain([state.stopTime - props.time * 1000, state.stopTime]).range([0, props.width - leftMargin - labelMargin - rightMargin]); + } if (props.yUseMinMax) { yScale = scaleLinear().domain([props.yMin, props.yMax]).range([props.height + topMargin - bottomMargin, topMargin]); } else { yScale = scaleLinear().domain([0, 10]).range([props.height + topMargin - bottomMargin, topMargin]); } - + const xAxis = axisBottom().scale(xScale).ticks(5).tickFormat(timeFormat("%M:%S")); const yAxis = axisLeft().scale(yScale).ticks(5).tickFormat(format(".3s")); return{ + stopTime: stopTime, data: null, xAxis, yAxis, From 53e0e8d4dee31ad660caf946df218b5da68a20a7 Mon Sep 17 00:00:00 2001 From: Laura Fuentes Grau Date: Wed, 18 Mar 2020 12:01:58 +0100 Subject: [PATCH 128/391] All label widget edit options now work as expected --- .../edit-widget-text-size-control.js | 2 +- src/widget/edit-widget/edit-widget.js | 17 ++++++++++------- 2 files changed, 11 insertions(+), 8 deletions(-) diff --git a/src/widget/edit-widget/edit-widget-text-size-control.js b/src/widget/edit-widget/edit-widget-text-size-control.js index 949b1dd..4c57f9c 100644 --- a/src/widget/edit-widget/edit-widget-text-size-control.js +++ b/src/widget/edit-widget/edit-widget-text-size-control.js @@ -29,7 +29,7 @@ class EditWidgetTextSizeControl extends React.Component { return ( Text size - this.props.handleChange(e)}> + this.props.handleChange(e)}> {sizes.map((size, index) => ( ))} diff --git a/src/widget/edit-widget/edit-widget.js b/src/widget/edit-widget/edit-widget.js index 7d34887..668454f 100644 --- a/src/widget/edit-widget/edit-widget.js +++ b/src/widget/edit-widget/edit-widget.js @@ -73,25 +73,28 @@ class EditWidgetDialog extends React.Component { // not a customProperty customProperty = false; } - + if(parts.length === 1 && customProperty){ + parts.push(parts[0]); + } + if (e.target.id === 'lockAspect') { //not a customProperty changeObject[e.target.id] = e.target.checked; // correct image aspect if turned on if (e.target.checked) { - changeObject = this.assignAspectRatio(changeObject, this.state.temporal.file); + changeObject = this.assignAspectRatio(changeObject, this.state.temporal.customProperties.file); } - } else if (e.target.id === 'file') { - //not a customProperty - changeObject.customProperties[e.target.id] = e.target.value; + } else if (parts[1] === 'file') { + //customProperty + changeObject.customProperties.parts[1] = e.target.value; // get file and update size (if it's an image) if ('lockAspect' in this.state.temporal && this.state.temporal.lockAspect) { changeObject = this.assignAspectRatio(changeObject, e.target.value); } } else if (e.target.type === 'number') { - customProperty ? changeObject.customProperties[e.target.id] = Number(e.target.value) : changeObject[e.target.id] = Number(e.target.value); + customProperty ? changeObject.customProperties.parts[1] = Number(e.target.value) : changeObject[e.target.id] = Number(e.target.value); } else if(e.target.id === 'name'){ if(changeObject[e.target.id] != null){ changeObject[e.target.id] = e.target.value; @@ -99,7 +102,7 @@ class EditWidgetDialog extends React.Component { changeObject[e.target.id] = 'default'; } } else { - customProperty ? changeObject[parts[0]][parts[1]] = e.target.value : changeObject[e.target.id] = e.target.value ; + customProperty ? changeObject.customProperties[parts[1]] = e.target.value : changeObject[e.target.id] = e.target.value ; } this.validChanges(); this.setState({ temporal: changeObject}); From 39e8366108f110d1a5ce5f14d5eb4b311b4fb3e9 Mon Sep 17 00:00:00 2001 From: Sonja Happ Date: Wed, 18 Mar 2020 13:13:43 +0100 Subject: [PATCH 129/391] fix aspect ratio editing --- .../edit-widget/edit-widget-aspect-control.js | 20 +++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) diff --git a/src/widget/edit-widget/edit-widget-aspect-control.js b/src/widget/edit-widget/edit-widget-aspect-control.js index 4152dbb..5a855c2 100644 --- a/src/widget/edit-widget/edit-widget-aspect-control.js +++ b/src/widget/edit-widget/edit-widget-aspect-control.js @@ -27,11 +27,7 @@ class EditWidgetAspectControl extends React.Component { super(props); this.state = { - widget: { - customProperties:{ - isLocked: true - } - } + widget: {} }; } @@ -42,9 +38,21 @@ class EditWidgetAspectControl extends React.Component { } render() { + let parts = this.props.controlId.split('.'); + let isCustomProperty = true; + if (parts.length === 1){ + isCustomProperty = false; + } + return ( - this.props.handleChange(e)}>Lock Aspect + this.props.handleChange(e)}> + ); } From 0de876f6083a36734d1b4f8bf3e95900af117522 Mon Sep 17 00:00:00 2001 From: Sonja Happ Date: Wed, 18 Mar 2020 16:25:36 +0100 Subject: [PATCH 130/391] add case distinguish for customProperty to checkbox and min max edits; apply case distinguish in handeChange function of edit-widget --- .../edit-widget-checkbox-control.js | 21 +++++--- .../edit-widget-control-creator.js | 12 ++--- .../edit-widget-min-max-control.js | 48 ++++++++++++++----- src/widget/edit-widget/edit-widget.js | 16 ++++--- 4 files changed, 66 insertions(+), 31 deletions(-) diff --git a/src/widget/edit-widget/edit-widget-checkbox-control.js b/src/widget/edit-widget/edit-widget-checkbox-control.js index 66c8c57..960c9e8 100644 --- a/src/widget/edit-widget/edit-widget-checkbox-control.js +++ b/src/widget/edit-widget/edit-widget-checkbox-control.js @@ -27,11 +27,7 @@ class EditWidgetCheckboxControl extends React.Component { super(props); this.state = { - widget: { - customProperties:{ - - } - } + widget: props.widget }; } @@ -42,8 +38,21 @@ class EditWidgetCheckboxControl extends React.Component { } render() { + let parts = this.props.controlId.split('.'); + let isCustomProperty = true; + if (parts.length ===1){ + isCustomProperty = false; + } + + return - this.props.handleChange(e)}> + this.props.handleChange(e)}> + + ; } } diff --git a/src/widget/edit-widget/edit-widget-control-creator.js b/src/widget/edit-widget/edit-widget-control-creator.js index fb4d0d5..0b1ac15 100644 --- a/src/widget/edit-widget/edit-widget-control-creator.js +++ b/src/widget/edit-widget/edit-widget-control-creator.js @@ -71,7 +71,7 @@ export default function CreateControls(widgetType = null, widget = null, session handleChange(e)} />, handleChange(e)} />, handleChange(e)} />, - handleChange(e)} /> + handleChange(e)} /> ); break; case 'Table': @@ -82,9 +82,9 @@ export default function CreateControls(widgetType = null, widget = null, session break; case 'Image': // Restrict to only image file types (MIME) - let imageControlFiles = files == null? [] : files.filter(file => file.type.includes('image')); + //let imageControlFiles = files == null? [] : files.filter(file => file.type.includes('image')); DialogControls.push( - handleChange(e)} />, + handleChange(e)} />, handleChange(e)} /> ); break; @@ -102,7 +102,7 @@ export default function CreateControls(widgetType = null, widget = null, session handleChange(e)} />, handleChange(e)} />, handleChange(e)} />, - handleChange(e)} /> + handleChange(e)} /> ); break; case 'Slider': @@ -146,9 +146,9 @@ export default function CreateControls(widgetType = null, widget = null, session break; case 'Topology': // Restrict to only xml files (MIME) - let topologyControlFiles = files == null? [] : files.filter( file => file.type.includes('xml')); + //let topologyControlFiles = files == null? [] : files.filter( file => file.type.includes('xml')); DialogControls.push( - handleChange(e)} /> + handleChange(e)} /> ); break; diff --git a/src/widget/edit-widget/edit-widget-min-max-control.js b/src/widget/edit-widget/edit-widget-min-max-control.js index e21530f..945f036 100644 --- a/src/widget/edit-widget/edit-widget-min-max-control.js +++ b/src/widget/edit-widget/edit-widget-min-max-control.js @@ -1,8 +1,4 @@ /** - * File: edit-widget-min-max-control.js - * Author: Markus Grigull - * Date: 30.08.2017 - * * This file is part of VILLASweb. * * VILLASweb is free software: you can redistribute it and/or modify @@ -27,12 +23,9 @@ class EditWidgetMinMaxControl extends React.Component { super(props); this.state = { - widget: { - customProperties:{ - - } - } + widget: props.widget } + } static getDerivedStateFromProps(props, state){ @@ -42,18 +35,49 @@ class EditWidgetMinMaxControl extends React.Component { } render() { + + let parts = this.props.controlId.split('.'); + let isCustomProperty = true; + if (parts.length === 1){ + isCustomProperty = false; + } + + console.log("min max edit: ", isCustomProperty); + return {this.props.label} - this.props.handleChange(e)}> + this.props.handleChange(e)}> + diff --git a/src/widget/edit-widget/edit-widget.js b/src/widget/edit-widget/edit-widget.js index 7d34887..bc36aca 100644 --- a/src/widget/edit-widget/edit-widget.js +++ b/src/widget/edit-widget/edit-widget.js @@ -69,14 +69,14 @@ class EditWidgetDialog extends React.Component { let parts = e.target.id.split('.'); let changeObject = this.state.temporal; let customProperty = true; - if (parts.length === 1 && this.state.temporal[e.target.id]) { + if (parts.length === 1) { // not a customProperty customProperty = false; } if (e.target.id === 'lockAspect') { //not a customProperty - changeObject[e.target.id] = e.target.checked; + customProperty ? changeObject[parts[0]][parts[1]] = e.target.checked : changeObject[e.target.id] = e.target.checked; // correct image aspect if turned on if (e.target.checked) { @@ -84,19 +84,21 @@ class EditWidgetDialog extends React.Component { } } else if (e.target.id === 'file') { //not a customProperty - changeObject.customProperties[e.target.id] = e.target.value; + + customProperty ? changeObject[parts[0]][parts[1]] = e.target.value : changeObject[e.target.id] = e.target.value; // get file and update size (if it's an image) if ('lockAspect' in this.state.temporal && this.state.temporal.lockAspect) { + // TODO this if condition requires changes to work!!! changeObject = this.assignAspectRatio(changeObject, e.target.value); } } else if (e.target.type === 'number') { - customProperty ? changeObject.customProperties[e.target.id] = Number(e.target.value) : changeObject[e.target.id] = Number(e.target.value); + customProperty ? changeObject[parts[0]][parts[1]] = Number(e.target.value) : changeObject[e.target.id] = Number(e.target.value); } else if(e.target.id === 'name'){ - if(changeObject[e.target.id] != null){ - changeObject[e.target.id] = e.target.value; + if(customProperty ? (changeObject[parts[0]][parts[1]] != null) : (changeObject[e.target.id] != null)){ + customProperty ? changeObject[parts[0]][parts[1]]= e.target.value : changeObject[e.target.id] = e.target.value; } else{ - changeObject[e.target.id] = 'default'; + customProperty ? changeObject[parts[0]][parts[1]]= 'default' : changeObject[e.target.id] = 'default'; } } else { customProperty ? changeObject[parts[0]][parts[1]] = e.target.value : changeObject[e.target.id] = e.target.value ; From 6f34cacab9baf3dd9ea87560a317edc3086deb60 Mon Sep 17 00:00:00 2001 From: Sonja Happ Date: Wed, 18 Mar 2020 16:27:58 +0100 Subject: [PATCH 131/391] distinguish between file and Json in processing response of GET operation --- src/common/api/rest-api.js | 11 ++++++++++- src/common/data-managers/rest-data-manager.js | 8 +++++++- 2 files changed, 17 insertions(+), 2 deletions(-) diff --git a/src/common/api/rest-api.js b/src/common/api/rest-api.js index 33c30ac..bd21de6 100644 --- a/src/common/api/rest-api.js +++ b/src/common/api/rest-api.js @@ -66,7 +66,16 @@ class RestAPI { if (res == null || res.status !== 200) { reject(error); } else { - resolve(JSON.parse(res.text)); + if (res.type ==="application/json"){ + resolve(JSON.parse(res.text)); + } else { + // if received data is not JSON it is a File + //create file name: + let parts = url.split("/"); + console.log("res.text has type: ", typeof res.text); + resolve({data: res.text, type: res.type, id: parts[parts.length-1]}) + } + } }); }); diff --git a/src/common/data-managers/rest-data-manager.js b/src/common/data-managers/rest-data-manager.js index db4c610..622119b 100644 --- a/src/common/data-managers/rest-data-manager.js +++ b/src/common/data-managers/rest-data-manager.js @@ -88,7 +88,13 @@ class RestDataManager { if (id != null) { // load single object RestAPI.get(this.requestURL('load/add',id,param), token).then(response => { - const data = this.filterKeys(response[this.type]); + let data; + if (response.hasOwnProperty(this.type)) { + data = this.filterKeys(response[this.type]); + }else{ + // loaded file + data = response; + } AppDispatcher.dispatch({ type: this.type + 's/loaded', From cfb86a00b935d5761e1a312cd7142b1c33586e4f Mon Sep 17 00:00:00 2001 From: Sonja Happ Date: Wed, 18 Mar 2020 16:29:41 +0100 Subject: [PATCH 132/391] WIP: Work on saving and showing images in image widget using objectURL (not working yet) --- src/file/file-store.js | 16 ++++++++ .../edit-widget/edit-widget-image-control.js | 41 ++++++++++++------- src/widget/widget-factory.js | 2 +- src/widget/widgets/image.js | 19 +++++++-- 4 files changed, 60 insertions(+), 18 deletions(-) diff --git a/src/file/file-store.js b/src/file/file-store.js index 6843d7a..659748e 100644 --- a/src/file/file-store.js +++ b/src/file/file-store.js @@ -27,6 +27,21 @@ class FileStore extends ArrayStore { super('files', FilesDataManager); } + saveFile(state, action){ + + // save file data file + let fileID = parseInt(action.data.id) + console.log("Received file", action); + for (let f of state){ + if (f.id === fileID){ + f["data"] = action.data.data; + f.type = action.data.type; + console.log("Saving file data to file id", fileID); + } + } + + } + reduce(state, action) { switch (action.type) { case 'files/start-upload': @@ -46,6 +61,7 @@ class FileStore extends ArrayStore { } else { // in this case a file is contained in the response (no JSON) // TODO we have to extract and process the file here (=save it somewhere?) + this.saveFile(state, action) return super.reduce(state, action) } diff --git a/src/widget/edit-widget/edit-widget-image-control.js b/src/widget/edit-widget/edit-widget-image-control.js index fdef5ff..de6eaf9 100644 --- a/src/widget/edit-widget/edit-widget-image-control.js +++ b/src/widget/edit-widget/edit-widget-image-control.js @@ -20,7 +20,7 @@ ******************************************************************************/ import React from 'react'; -import { FormGroup, FormControl, FormLabel, Button, ProgressBar } from 'react-bootstrap'; +import {FormGroup, FormControl, FormLabel, Button, ProgressBar} from 'react-bootstrap'; import AppDispatcher from '../../common/app-dispatcher'; @@ -29,11 +29,7 @@ class EditImageWidgetControl extends React.Component { super(props); this.state = { - widget: { - customProperties:{ - file: '' - } - }, + widget: { }, fileList: null, progress: 0 }; @@ -61,7 +57,9 @@ class EditImageWidgetControl extends React.Component { data: formData, token: this.props.sessionToken, progressCallback: this.uploadProgress, - finishedCallback: this.clearProgress + finishedCallback: this.clearProgress, + objectType: "widget", + objectID: this.props.widget.id, }); } @@ -73,20 +71,35 @@ class EditImageWidgetControl extends React.Component { this.setState({ progress: 0 }); } + handleFileChange(e){ + console.log("Changing image: ", this.props.controlId, "to", e.target.value) + this.props.handleChange({ target: { id: this.props.controlId, value: e.target.value } }); + } + render() { + + let parts = this.props.controlId.split('.'); + let isCustomProperty = true; + if(parts.length === 1){ + isCustomProperty = false; + } + + console.log("edit image: files: ", this.props.files, "widget", this.state.widget, "upload file list:", this.state.fileList); + return
    Image - this.props.handleChange(e)}> + this.handleFileChange(e)}> {this.props.files.length === 0 ? ( ) : ( - this.props.files.reduce((entries, file, index) => { - entries.push(); - return entries; - }, [ - - ]) + this.props.files.map((file, index) => ( + + )) )} diff --git a/src/widget/widget-factory.js b/src/widget/widget-factory.js index c5b8a39..d5a555b 100644 --- a/src/widget/widget-factory.js +++ b/src/widget/widget-factory.js @@ -124,7 +124,7 @@ class WidgetFactory { widget.width = 200; widget.height = 200; widget.customProperties.lockAspect = true; - widget.customProperties.file = 1; // ID of image file, -1 means non selected + widget.customProperties.file = 2; // ID of image file, -1 means non selected break; case 'Button': widget.minWidth = 100; diff --git a/src/widget/widgets/image.js b/src/widget/widgets/image.js index 3d24227..92ef00e 100644 --- a/src/widget/widgets/image.js +++ b/src/widget/widgets/image.js @@ -22,7 +22,6 @@ import React from 'react'; import AppDispatcher from '../../common/app-dispatcher'; -import config from '../../config'; class WidgetImage extends React.Component { @@ -40,13 +39,27 @@ class WidgetImage extends React.Component { render() { const file = this.props.files.find(file => file.id === this.props.widget.customProperties.file); + let fileHasData = false; + let fileData, objectURL; + if (file){ + fileHasData = file.hasOwnProperty("data"); + if (fileHasData){ + //console.log("File data: ", file.data); + + fileData = new Blob([file.data], {type: file.type}); + objectURL = window.URL.createObjectURL(fileData); + console.log("Image created new file", fileData, "and objectID", objectURL) + } + } + + console.log("Image: has data:", fileHasData); return (
    {file ? ( - {file.name} e.preventDefault()} /> + {file.name} e.preventDefault()} /> ) : ( - questionmark e.preventDefault()} /> + No file selected. )}
    ); From 99a5b2d5d25d3b636dabe8af97f123935cf81eb2 Mon Sep 17 00:00:00 2001 From: Sonja Happ Date: Thu, 19 Mar 2020 12:33:46 +0100 Subject: [PATCH 133/391] CI: add tag to docker image --- .gitlab-ci.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index a7aaa62..056f91d 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -46,8 +46,8 @@ deploy:docker: before_script: - docker login -u ${CI_REGISTRY_USER} -p ${CI_REGISTRY_PASSWORD} ${CI_REGISTRY} script: - - docker build -t ${DOCKER_IMAGE} . - - docker push ${DOCKER_IMAGE} + - docker build -t ${DOCKER_IMAGE}:${CI_COMMIT_SHORT_SHA} . + - docker push ${DOCKER_IMAGE}:${CI_COMMIT_SHORT_SHA} tags: - shell - linux From e44c7da7e31206b7407badcca671530272997efe Mon Sep 17 00:00:00 2001 From: Sonja Happ Date: Thu, 19 Mar 2020 17:27:46 +0100 Subject: [PATCH 134/391] properly export convert function of flux container converter fix --- src/common/FluxContainerConverter.js | 26 ++++++++++++++------------ 1 file changed, 14 insertions(+), 12 deletions(-) diff --git a/src/common/FluxContainerConverter.js b/src/common/FluxContainerConverter.js index bd2196a..902a26c 100644 --- a/src/common/FluxContainerConverter.js +++ b/src/common/FluxContainerConverter.js @@ -1,15 +1,17 @@ /// FluxContainerConverter.js /// This is an ugly workaround found here https://github.com/facebook/flux/issues/351 to make Flux Containers work with ES6 -module.exports = { - convert: function(containerClass) { - const tmp = containerClass; - containerClass = function(...args) { - return new tmp(...args); - }; - containerClass.prototype = tmp.prototype; - containerClass.getStores = tmp.getStores; - containerClass.calculateState = tmp.calculateState; - return containerClass; - } -}; + +function convert(containerClass) { + const tmp = containerClass; + containerClass = function(...args) { + return new tmp(...args); + }; + containerClass.prototype = tmp.prototype; + containerClass.getStores = tmp.getStores; + containerClass.calculateState = tmp.calculateState; + return containerClass; +} + +export {convert} + From 82874b22223619eff7631ddf7ab4203a45e0bfd1 Mon Sep 17 00:00:00 2001 From: Sonja Happ Date: Fri, 20 Mar 2020 11:19:26 +0100 Subject: [PATCH 135/391] check for existing current user upon app mount --- src/app.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/app.js b/src/app.js index abf0956..afe3b85 100644 --- a/src/app.js +++ b/src/app.js @@ -66,10 +66,11 @@ class App extends React.Component { componentDidMount() { NotificationsDataManager.setSystem(this.refs.notificationSystem); + // if token stored locally, request user let token = localStorage.getItem("token"); let currentUser = JSON.parse(localStorage.getItem("currentUser")); - if (token != null && token !== '') { + if (token != null && token !== '' && currentUser != null) { AppDispatcher.dispatch({ type: 'users/logged-in', token: token, From 3e6ccd07d1474c226be986d380788e889a5574ca Mon Sep 17 00:00:00 2001 From: Sonja Happ Date: Fri, 20 Mar 2020 11:29:36 +0100 Subject: [PATCH 136/391] check for existing current user in login frame --- src/user/login.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/user/login.js b/src/user/login.js index d02114f..5255d54 100644 --- a/src/user/login.js +++ b/src/user/login.js @@ -57,7 +57,7 @@ class Login extends Component { const token = localStorage.getItem('token'); const currentUser = localStorage.getItem('currentUser'); - if (token != null && token !== '' && this.state.currentUser == null) { + if (token != null && token !== '' && currentUser != null && this.state.currentUser == null) { AppDispatcher.dispatch({ type: 'users/logged-in', token: token, From 58809e3e41aaec5ee24b44f28f0953c06cbe3fcc Mon Sep 17 00:00:00 2001 From: Sonja Happ Date: Fri, 20 Mar 2020 11:46:43 +0100 Subject: [PATCH 137/391] add JSON.parse around current user from local storage in login --- src/app.js | 1 - src/user/login.js | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/src/app.js b/src/app.js index afe3b85..aa9ce6a 100644 --- a/src/app.js +++ b/src/app.js @@ -66,7 +66,6 @@ class App extends React.Component { componentDidMount() { NotificationsDataManager.setSystem(this.refs.notificationSystem); - // if token stored locally, request user let token = localStorage.getItem("token"); let currentUser = JSON.parse(localStorage.getItem("currentUser")); diff --git a/src/user/login.js b/src/user/login.js index 5255d54..76c2e68 100644 --- a/src/user/login.js +++ b/src/user/login.js @@ -55,7 +55,7 @@ class Login extends Component { // if token stored locally, request user if (this.state.token == null) { const token = localStorage.getItem('token'); - const currentUser = localStorage.getItem('currentUser'); + const currentUser = JSON.parse(localStorage.getItem('currentUser')); if (token != null && token !== '' && currentUser != null && this.state.currentUser == null) { AppDispatcher.dispatch({ From 1fdef9b40410a636e698a9e516a31f2abbcc6492 Mon Sep 17 00:00:00 2001 From: Sonja Happ Date: Fri, 20 Mar 2020 12:51:28 +0100 Subject: [PATCH 138/391] adapting IC to revised infrastructure component model --- src/ic/edit-ic.js | 52 ++++++++++++++++++++++++++++++---------- src/ic/ics.js | 14 +++++------ src/ic/import-ic.js | 4 ++-- src/ic/new-ic.js | 58 ++++++++++++++++++++++++++++++++++----------- 4 files changed, 93 insertions(+), 35 deletions(-) diff --git a/src/ic/edit-ic.js b/src/ic/edit-ic.js index b97d02a..404642c 100644 --- a/src/ic/edit-ic.js +++ b/src/ic/edit-ic.js @@ -30,23 +30,38 @@ class EditICDialog extends React.Component { this.state = { name: '', - endpoint: '' + host: '', + type: '', + category: '', + properties: {}, }; } onClose(canceled) { if (canceled === false) { if (this.valid) { - let data = this.props.ic.properties; + let data = this.props.ic; - if (this.state.name != null && this.state.name !== "" && this.state.name !== _.get(this.props.ic, 'rawProperties.name')) { + if (this.state.name != null && this.state.name !== "" && this.state.name !== this.props.ic.name) { data.name = this.state.name; } - if (this.state.endpoint != null && this.state.endpoint !== "" && this.state.endpoint !== "http://" && this.state.endpoint !== _.get(this.props.ic, 'rawProperties.endpoint')) { - data.endpoint = this.state.endpoint; + if (this.state.host != null && this.state.host !== "" && this.state.host !== "http://" && this.state.host !== this.props.ic.host) { + data.host = this.state.host; } + if (this.state.type != null && this.state.type !== "" && this.state.type !== this.props.ic.type) { + data.type = this.state.type; + } + + if (this.state.category != null && this.state.category !== "" && this.state.category !== this.props.ic.category) { + data.category = this.state.category; + } + if (this.state.properties !== {}) { + data.properties = this.state.properties + } + + this.props.onClose(data); } } else { @@ -60,8 +75,11 @@ class EditICDialog extends React.Component { resetState() { this.setState({ - name: _.get(this.props.ic, 'properties.name') || _.get(this.props.ic, 'rawProperties.name'), - endpoint: _.get(this.props.ic, 'properties.endpoint') || _.get(this.props.ic, 'rawProperties.endpoint') + name: this.props.ic.name, + host: this.props.ic.host, + type: this.props.ic.type, + category: this.props.ic.category, + properties: _.merge({}, _.get(this.props.ic, 'rawProperties'), _.get(this.props.ic, 'properties')) }); } @@ -71,17 +89,27 @@ class EditICDialog extends React.Component {
    Name - this.handleChange(e)} /> + this.handleChange(e)} /> - - Endpoint - this.handleChange(e)} /> + + Host + this.handleChange(e)} /> + + + + Category (e.g. Simulator, Gateway, ...) + this.handleChange(e)} /> + + + + Type (e.g. RTDS, VILLASnode, ...) + this.handleChange(e)} /> Properties - + diff --git a/src/ic/ics.js b/src/ic/ics.js index a66b271..603e474 100644 --- a/src/ic/ics.js +++ b/src/ic/ics.js @@ -127,13 +127,13 @@ class InfrastructureComponents extends Component { this.setState({ editModal : false }); if (data) { - let ic = this.state.ics[this.state.modalIndex]; - ic.properties = data; - this.setState({ ic: ic }); + //let ic = this.state.ics[this.state.modalIndex]; + //ic = data; + //this.setState({ ic: ic }); AppDispatcher.dispatch({ type: 'ics/start-edit', - data: ic, + data: data, token: this.state.sessionToken, }); } @@ -272,10 +272,10 @@ class InfrastructureComponents extends Component {
    - Min: this.props.handleChange(e)} /> + Min: + this.props.handleChange(e)} /> - Max: this.props.handleChange(e)} /> + Max: + this.props.handleChange(e)} />
    this.onICChecked(index, event)} width='30' /> - + - - + + {/* */} diff --git a/src/ic/import-ic.js b/src/ic/import-ic.js index 1d11af2..3fac3bb 100644 --- a/src/ic/import-ic.js +++ b/src/ic/import-ic.js @@ -123,9 +123,9 @@ class ImportICDialog extends React.Component { this.handleChange(e)} /> - + Endpoint - this.handleChange(e)} /> + this.handleChange(e)} /> diff --git a/src/ic/new-ic.js b/src/ic/new-ic.js index 915370d..9f0dbb1 100644 --- a/src/ic/new-ic.js +++ b/src/ic/new-ic.js @@ -28,8 +28,10 @@ class NewICDialog extends React.Component { this.state = { name: '', - endpoint: '', - uuid: '' + host: '', + uuid: '', + type: '', + category: '', }; } @@ -37,14 +39,14 @@ class NewICDialog extends React.Component { if (canceled === false) { if (this.valid) { const data = { - properties: { - name: this.state.name - }, + name: this.state.name, + type: this.state.type, + category: this.state.category, uuid: this.state.uuid }; - if (this.state.endpoint != null && this.state.endpoint !== "" && this.state.endpoint !== 'http://') { - data.properties.endpoint = this.state.endpoint; + if (this.state.host != null && this.state.host !== "" && this.state.host !== 'http://') { + data.host = this.state.host; } this.props.onClose(data); @@ -59,13 +61,16 @@ class NewICDialog extends React.Component { } resetState() { - this.setState({ name: '', endpoint: 'http://', uuid: this.uuidv4()}); + this.setState({ name: '', host: 'http://', uuid: this.uuidv4(), type: '', category: ''}); } validateForm(target) { // check all controls let name = true; let uuid = true; + let host = true; + let type = true; + let category = true; if (this.state.name === '') { name = false; @@ -75,11 +80,26 @@ class NewICDialog extends React.Component { uuid = false; } - this.valid = name && uuid; + if (this.state.host === '') { + host = false; + } + + if (this.state.type === '') { + type = false; + } + + if (this.state.category === '') { + category = false; + } + + this.valid = name && uuid && host && type && category; // return state to control if (target === 'name') return name ? "success" : "error"; if (target === 'uuid') return uuid ? "success" : "error"; + if (target === 'host') return host ? "success" : "error"; + if (target === 'type') return type ? "success" : "error"; + if (target === 'category') return category ? "success" : "error"; } uuidv4() { @@ -94,17 +114,27 @@ class NewICDialog extends React.Component { return ( this.onClose(c)} onReset={() => this.resetState()} valid={this.valid}>
    - + Name this.handleChange(e)} /> - - Endpoint - this.handleChange(e)} /> + + Host + this.handleChange(e)} /> - + + Category of component (e.g. Simulator, Gateway, ...) + this.handleChange(e)} /> + + + + Type of component (e.g. RTDS, VILLASnode, ...) + this.handleChange(e)} /> + + + UUID this.handleChange(e)} /> From 6f3cbf272bd65c5cc7cf72f5f7232721a93b6534 Mon Sep 17 00:00:00 2001 From: Sonja Happ Date: Fri, 20 Mar 2020 14:57:07 +0100 Subject: [PATCH 139/391] fix creation of new dashboard: add missing parameters for grid and scenarioID --- src/scenario/scenario.js | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/scenario/scenario.js b/src/scenario/scenario.js index 1f5a7be..47e0a15 100644 --- a/src/scenario/scenario.js +++ b/src/scenario/scenario.js @@ -280,6 +280,10 @@ class Scenario extends React.Component { closeNewDashboardModal(data) { this.setState({ newDashboardModal : false }); + let newDashboard = data; + // add default grid value and scenarioID + newDashboard["grid"] = 15; + newDashboard["scenarioID"] = this.state.scenario.id if (data) { AppDispatcher.dispatch({ From 10143c919830a7d001e3c8ff93ba342db09d2ed8 Mon Sep 17 00:00:00 2001 From: Laura Fuentes Grau Date: Sun, 22 Mar 2020 14:22:26 +0100 Subject: [PATCH 140/391] wip: cancel edit now resets widget --- src/dashboard/dashboard.js | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/src/dashboard/dashboard.js b/src/dashboard/dashboard.js index 11ac9e0..02e565c 100644 --- a/src/dashboard/dashboard.js +++ b/src/dashboard/dashboard.js @@ -245,6 +245,13 @@ class Dashboard extends Component { closeEdit(data){ if (data == null) { + + AppDispatcher.dispatch({ + type: 'widgets/start-load', + token: this.state.sessionToken, + param: '?dashboardID=1' + }); + this.setState({ editModal: false }); return; @@ -321,11 +328,6 @@ class Dashboard extends Component { token: this.state.sessionToken }); }); */ - AppDispatcher.dispatch({ - type: 'dashboards/start-load', - data: this.props.match.params.dashboard, - token: this.state.sessionToken - }); AppDispatcher.dispatch({ type: 'widgets/start-load', From 48c75f7b21e4290b2372cc878725e614574229f1 Mon Sep 17 00:00:00 2001 From: Laura Fuentes Grau Date: Sun, 22 Mar 2020 17:58:40 +0100 Subject: [PATCH 141/391] fix edit widget signal bug: backend now accepts PUT request --- src/widget/edit-widget/edit-widget-signal-control.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/widget/edit-widget/edit-widget-signal-control.js b/src/widget/edit-widget/edit-widget-signal-control.js index 1486775..b376e8e 100644 --- a/src/widget/edit-widget/edit-widget-signal-control.js +++ b/src/widget/edit-widget/edit-widget-signal-control.js @@ -39,8 +39,9 @@ class EditWidgetSignalControl extends Component { handleSignalChange(e){ + let tempSignal = parseInt(e.target.value,10); let newSignal = []; - newSignal.push(e.target.value); + newSignal.push(tempSignal); this.props.handleChange({ target: { id: this.props.controlId, value: newSignal } }); From 4dab708eb34cb39fa7c4389a9c1217e0198183f2 Mon Sep 17 00:00:00 2001 From: Laura Fuentes Grau Date: Sun, 22 Mar 2020 19:07:16 +0100 Subject: [PATCH 142/391] edit textSize works again, added two missing customProperties in widget-factory --- src/widget/edit-widget/edit-widget-text-size-control.js | 2 +- src/widget/widget-factory.js | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/src/widget/edit-widget/edit-widget-text-size-control.js b/src/widget/edit-widget/edit-widget-text-size-control.js index 4c57f9c..1c04ba6 100644 --- a/src/widget/edit-widget/edit-widget-text-size-control.js +++ b/src/widget/edit-widget/edit-widget-text-size-control.js @@ -27,7 +27,7 @@ class EditWidgetTextSizeControl extends React.Component { const sizes = [11, 12, 14, 16, 18, 20, 22, 24, 28, 32, 36, 40, 46, 52, 60, 72]; return ( - + Text size this.props.handleChange(e)}> {sizes.map((size, index) => ( diff --git a/src/widget/widget-factory.js b/src/widget/widget-factory.js index d5a555b..ef5b7bf 100644 --- a/src/widget/widget-factory.js +++ b/src/widget/widget-factory.js @@ -97,6 +97,7 @@ class WidgetFactory { widget.minWidth = 200; widget.width = 300; widget.height = 200; + widget.customProperties.showUnit = false; break; case 'Label': widget.minWidth = 20; @@ -150,6 +151,7 @@ class WidgetFactory { widget.customProperties.rangeMax = 200; widget.customProperties.rangeUseMinMax = true; widget.customProperties.showUnit = true; + widget.customProperties.continous_update = false; break; case 'Gauge': From 72cc4bfb7b895386bc206bf02d656efcb589ae59 Mon Sep 17 00:00:00 2001 From: Sonja Happ Date: Wed, 25 Mar 2020 13:25:07 +0100 Subject: [PATCH 143/391] fix license statement in all source files (closes #140) --- Dockerfile | 17 +++++++++++++++++ src/common/FluxContainerConverter.js | 19 ++++++++++++++++++- src/common/api/rest-api.js | 4 ---- src/common/api/websocket-api.js | 4 ---- src/common/app-dispatcher.js | 4 ---- src/common/array-store.js | 4 ---- .../notifications-data-manager.js | 4 ---- src/common/data-managers/rest-data-manager.js | 4 ---- src/common/dialogs/delete-dialog.js | 6 +----- src/common/dialogs/dialog.js | 4 ---- src/common/editable-header.js | 4 ---- src/common/footer.js | 4 ---- src/common/header.js | 4 ---- src/common/home.js | 4 ---- src/common/icon.js | 4 ---- src/common/menu-sidebar.js | 4 ---- src/common/parameters-editor.js | 4 ---- src/common/table-column.js | 4 ---- src/common/table.js | 4 ---- src/config.js | 16 ++++++++++++++++ src/dashboard/dashboard-button-group.js | 4 ---- src/dashboard/dashboard-store.js | 4 ---- src/dashboard/dashboard.js | 12 ++++-------- src/dashboard/dashboards-data-manager.js | 4 ---- src/dashboard/edit-dashboard.js | 4 ---- src/dashboard/new-dashboard.js | 4 ---- src/file/file-store.js | 4 ---- src/file/files-data-manager.js | 4 ---- src/file/select-file.js | 4 ---- src/index.js | 4 ---- src/router.js | 4 ---- src/scenario/edit-scenario.js | 4 ---- src/scenario/import-scenario.js | 4 ---- src/scenario/new-scenario.js | 4 ---- src/scenario/scenario-store.js | 4 ---- src/scenario/scenarios.js | 4 ---- src/signal/edit-signal-mapping.js | 1 - src/styles/app.css | 4 ---- src/styles/index.css | 4 ---- src/styles/widgets.css | 4 ---- src/user/edit-own-user.js | 4 ---- src/user/edit-user.js | 4 ---- src/user/login-form.js | 4 ---- src/user/login.js | 4 ---- src/user/logout.js | 4 ---- src/user/new-user.js | 4 ---- src/user/user.js | 4 ---- src/user/users-data-manager.js | 4 ---- src/user/users-store.js | 6 +----- src/user/users.js | 4 ---- src/widget/dropzone.js | 6 +----- .../edit-widget/edit-widget-aspect-control.js | 4 ---- .../edit-widget-checkbox-control.js | 4 ---- .../edit-widget/edit-widget-color-control.js | 5 ----- .../edit-widget-color-zones-control.js | 4 ---- .../edit-widget/edit-widget-html-content.js | 4 ---- .../edit-widget/edit-widget-image-control.js | 4 ---- .../edit-widget/edit-widget-number-control.js | 4 ---- .../edit-widget/edit-widget-orientation.js | 4 ---- .../edit-widget-parameters-control.js | 4 ---- .../edit-widget/edit-widget-signal-control.js | 4 ---- .../edit-widget/edit-widget-text-control.js | 4 ---- .../edit-widget-text-size-control.js | 4 ---- .../edit-widget/edit-widget-time-control.js | 4 ---- src/widget/editable-widget-container.js | 12 ++++-------- src/widget/grid.js | 6 +----- src/widget/toolbox-item.js | 4 ---- src/widget/widget-area.js | 4 ---- src/widget/widget-container.js | 6 +----- src/widget/widget-context-menu.js | 4 ---- src/widget/widget-factory.js | 6 ------ src/widget/widget-plot/plot-legend.js | 5 ----- src/widget/widget-plot/plot.js | 7 +------ src/widget/widget-toolbox.js | 4 ---- src/widget/widget.js | 4 ---- src/widget/widgets/action.js | 5 ----- src/widget/widgets/box.js | 5 ----- src/widget/widgets/button.js | 5 ----- src/widget/widgets/gauge.js | 5 ----- src/widget/widgets/html.js | 4 ---- src/widget/widgets/image.js | 4 ---- src/widget/widgets/input.js | 5 ----- src/widget/widgets/label.js | 4 ---- src/widget/widgets/lamp.js | 4 ---- src/widget/widgets/plot-table.js | 4 ---- src/widget/widgets/slider.js | 5 ----- src/widget/widgets/table.js | 4 ---- src/widget/widgets/topology.js | 4 ---- src/widget/widgets/value.js | 4 ---- 89 files changed, 65 insertions(+), 367 deletions(-) diff --git a/Dockerfile b/Dockerfile index 92283ec..63418fe 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,3 +1,20 @@ + # + # This file is part of VILLASweb. + # + # VILLASweb is free software: you can redistribute it and/or modify + # it under the terms of the GNU General Public License as published by + # the Free Software Foundation, either version 3 of the License, or + # (at your option) any later version. + # + # VILLASweb is distributed in the hope that it will be useful, + # but WITHOUT ANY WARRANTY; without even the implied warranty of + # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + # GNU General Public License for more details. + # + # You should have received a copy of the GNU General Public License + # along with VILLASweb. If not, see . + # ****************************************************************************** + FROM node:12.2 AS builder # Create app directory diff --git a/src/common/FluxContainerConverter.js b/src/common/FluxContainerConverter.js index 902a26c..9d1b371 100644 --- a/src/common/FluxContainerConverter.js +++ b/src/common/FluxContainerConverter.js @@ -1,5 +1,22 @@ +/** + * This file is part of VILLASweb. + * + * VILLASweb is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * VILLASweb is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with VILLASweb. If not, see . + ******************************************************************************/ + /// FluxContainerConverter.js -/// This is an ugly workaround found here https://github.com/facebook/flux/issues/351 to make Flux Containers work with ES6 +/// ATTENTION!!! This is an ugly workaround found here https://github.com/facebook/flux/issues/351 to make Flux Containers work with ES6 function convert(containerClass) { diff --git a/src/common/api/rest-api.js b/src/common/api/rest-api.js index bd21de6..0ae4b03 100644 --- a/src/common/api/rest-api.js +++ b/src/common/api/rest-api.js @@ -1,8 +1,4 @@ /** - * File: rest-api.js - * Author: Markus Grigull - * Date: 02.03.2017 - * * This file is part of VILLASweb. * * VILLASweb is free software: you can redistribute it and/or modify diff --git a/src/common/api/websocket-api.js b/src/common/api/websocket-api.js index 94fc953..bad01a7 100644 --- a/src/common/api/websocket-api.js +++ b/src/common/api/websocket-api.js @@ -1,8 +1,4 @@ /** - * File: websocket-api.js - * Author: Markus Grigull - * Date: 03.03.2017 - * * This file is part of VILLASweb. * * VILLASweb is free software: you can redistribute it and/or modify diff --git a/src/common/app-dispatcher.js b/src/common/app-dispatcher.js index ee54eb5..76866ed 100644 --- a/src/common/app-dispatcher.js +++ b/src/common/app-dispatcher.js @@ -1,8 +1,4 @@ /** - * File: app-dispatcher.js - * Author: Markus Grigull - * Date: 02.03.2017 - * * This file is part of VILLASweb. * * VILLASweb is free software: you can redistribute it and/or modify diff --git a/src/common/array-store.js b/src/common/array-store.js index bd18854..0c536f0 100644 --- a/src/common/array-store.js +++ b/src/common/array-store.js @@ -1,8 +1,4 @@ /** - * File: array-store.js - * Author: Markus Grigull - * Date: 03.03.2017 - * * This file is part of VILLASweb. * * VILLASweb is free software: you can redistribute it and/or modify diff --git a/src/common/data-managers/notifications-data-manager.js b/src/common/data-managers/notifications-data-manager.js index f463fcd..3b7601f 100644 --- a/src/common/data-managers/notifications-data-manager.js +++ b/src/common/data-managers/notifications-data-manager.js @@ -1,8 +1,4 @@ /** - * File: notifications-data-manager.js - * Author: Markus Grigull - * Date: 21.03.2017 - * * This file is part of VILLASweb. * * VILLASweb is free software: you can redistribute it and/or modify diff --git a/src/common/data-managers/rest-data-manager.js b/src/common/data-managers/rest-data-manager.js index 622119b..271f4c6 100644 --- a/src/common/data-managers/rest-data-manager.js +++ b/src/common/data-managers/rest-data-manager.js @@ -1,8 +1,4 @@ /** - * File: rest-data-manager.js - * Author: Markus Grigull - * Date: 03.03.2017 - * * This file is part of VILLASweb. * * VILLASweb is free software: you can redistribute it and/or modify diff --git a/src/common/dialogs/delete-dialog.js b/src/common/dialogs/delete-dialog.js index c69ad7c..cbc0cd8 100644 --- a/src/common/dialogs/delete-dialog.js +++ b/src/common/dialogs/delete-dialog.js @@ -1,8 +1,4 @@ /** - * File: edit-user.js - * Author: Ricardo Hernandez-Montoya - * Date: 02.05.2017 - * * This file is part of VILLASweb. * * VILLASweb is free software: you can redistribute it and/or modify @@ -26,7 +22,7 @@ class DeleteDialog extends React.Component { onModalKeyPress = (event) => { if (event.key === 'Enter') { event.preventDefault(); - + this.props.onClose(false); } } diff --git a/src/common/dialogs/dialog.js b/src/common/dialogs/dialog.js index db4c6a4..cc387d9 100644 --- a/src/common/dialogs/dialog.js +++ b/src/common/dialogs/dialog.js @@ -1,8 +1,4 @@ /** - * File: dialog.js - * Author: Markus Grigull - * Date: 03.03.2017 - * * This file is part of VILLASweb. * * VILLASweb is free software: you can redistribute it and/or modify diff --git a/src/common/editable-header.js b/src/common/editable-header.js index b5e6a2f..a10b48d 100644 --- a/src/common/editable-header.js +++ b/src/common/editable-header.js @@ -1,8 +1,4 @@ /** - * File: header.js - * Author: Markus Grigull - * Date: 25.05.2018 - * * This file is part of VILLASweb. * * VILLASweb is free software: you can redistribute it and/or modify diff --git a/src/common/footer.js b/src/common/footer.js index e036516..534a18a 100644 --- a/src/common/footer.js +++ b/src/common/footer.js @@ -1,8 +1,4 @@ /** - * File: footer.js - * Author: Markus Grigull - * Date: 02.03.2017 - * * This file is part of VILLASweb. * * VILLASweb is free software: you can redistribute it and/or modify diff --git a/src/common/header.js b/src/common/header.js index e8c70c2..c5c71b7 100644 --- a/src/common/header.js +++ b/src/common/header.js @@ -1,8 +1,4 @@ /** - * File: header.js - * Author: Markus Grigull - * Date: 02.03.2017 - * * This file is part of VILLASweb. * * VILLASweb is free software: you can redistribute it and/or modify diff --git a/src/common/home.js b/src/common/home.js index ffb8587..0aee6b9 100644 --- a/src/common/home.js +++ b/src/common/home.js @@ -1,8 +1,4 @@ /** - * File: home.js - * Author: Markus Grigull - * Date: 02.03.2017 - * * This file is part of VILLASweb. * * VILLASweb is free software: you can redistribute it and/or modify diff --git a/src/common/icon.js b/src/common/icon.js index 1cff82a..1ad1701 100644 --- a/src/common/icon.js +++ b/src/common/icon.js @@ -1,8 +1,4 @@ /** - * File: icon.js - * Author: Steffen Vogel - * Date: 09.06.2018 - * * This file is part of VILLASweb. * * VILLASweb is free software: you can redistribute it and/or modify diff --git a/src/common/menu-sidebar.js b/src/common/menu-sidebar.js index 35ecfd0..59874ed 100644 --- a/src/common/menu-sidebar.js +++ b/src/common/menu-sidebar.js @@ -1,8 +1,4 @@ /** - * File: menu-sidebar.js - * Author: Markus Grigull - * Date: 02.03.2017 - * * This file is part of VILLASweb. * * VILLASweb is free software: you can redistribute it and/or modify diff --git a/src/common/parameters-editor.js b/src/common/parameters-editor.js index 9f17e7e..aca6b05 100644 --- a/src/common/parameters-editor.js +++ b/src/common/parameters-editor.js @@ -1,8 +1,4 @@ /** - * File: header.js - * Author: Markus Grigull - * Date: 06.06.2018 - * * This file is part of VILLASweb. * * VILLASweb is free software: you can redistribute it and/or modify diff --git a/src/common/table-column.js b/src/common/table-column.js index 151e3eb..748035a 100644 --- a/src/common/table-column.js +++ b/src/common/table-column.js @@ -1,8 +1,4 @@ /** - * File: table-column.js - * Author: Markus Grigull - * Date: 06.03.2017 - * * This file is part of VILLASweb. * * VILLASweb is free software: you can redistribute it and/or modify diff --git a/src/common/table.js b/src/common/table.js index 64d118d..020f9bd 100644 --- a/src/common/table.js +++ b/src/common/table.js @@ -1,8 +1,4 @@ /** - * File: table.js - * Author: Markus Grigull - * Date: 02.03.2017 - * * This file is part of VILLASweb. * * VILLASweb is free software: you can redistribute it and/or modify diff --git a/src/config.js b/src/config.js index 6b68fa3..874e58f 100644 --- a/src/config.js +++ b/src/config.js @@ -1,3 +1,19 @@ +/** + * This file is part of VILLASweb. + * + * VILLASweb is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * VILLASweb is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with VILLASweb. If not, see . + ******************************************************************************/ const config = { publicPathBase: 'public/', diff --git a/src/dashboard/dashboard-button-group.js b/src/dashboard/dashboard-button-group.js index 35da165..376d8c1 100644 --- a/src/dashboard/dashboard-button-group.js +++ b/src/dashboard/dashboard-button-group.js @@ -1,8 +1,4 @@ /** - * File: dashboard-button-group.js - * Author: Markus Grigull - * Date: 31.05.2018 - * * This file is part of VILLASweb. * * VILLASweb is free software: you can redistribute it and/or modify diff --git a/src/dashboard/dashboard-store.js b/src/dashboard/dashboard-store.js index 28bb9cb..4e850ab 100644 --- a/src/dashboard/dashboard-store.js +++ b/src/dashboard/dashboard-store.js @@ -1,8 +1,4 @@ /** - * File: dashboard-store.js - * Author: Markus Grigull - * Date: 02.03.2017 - * * This file is part of VILLASweb. * * VILLASweb is free software: you can redistribute it and/or modify diff --git a/src/dashboard/dashboard.js b/src/dashboard/dashboard.js index 02e565c..df42e37 100644 --- a/src/dashboard/dashboard.js +++ b/src/dashboard/dashboard.js @@ -1,8 +1,4 @@ /** - * File: dashboard.js - * Author: Markus Grigull - * Date: 02.03.2017 - * * This file is part of VILLASweb. * * VILLASweb is free software: you can redistribute it and/or modify @@ -114,7 +110,7 @@ class Dashboard extends Component { } - + static getNewWidgetKey() { const widgetKey = this.lastWidgetKey; this.lastWidgetKey++; @@ -245,13 +241,13 @@ class Dashboard extends Component { closeEdit(data){ if (data == null) { - + AppDispatcher.dispatch({ type: 'widgets/start-load', token: this.state.sessionToken, param: '?dashboardID=1' }); - + this.setState({ editModal: false }); return; @@ -339,7 +335,7 @@ class Dashboard extends Component { }; setGrid(value) { - + let dashboard = this.state.dashboard; dashboard.grid = value; this.setState({ dashboard }); diff --git a/src/dashboard/dashboards-data-manager.js b/src/dashboard/dashboards-data-manager.js index a39e017..b35c58d 100644 --- a/src/dashboard/dashboards-data-manager.js +++ b/src/dashboard/dashboards-data-manager.js @@ -1,8 +1,4 @@ /** - * File: dashboards-data-manager.js - * Author: Markus Grigull - * Date: 03.03.2017 - * * This file is part of VILLASweb. * * VILLASweb is free software: you can redistribute it and/or modify diff --git a/src/dashboard/edit-dashboard.js b/src/dashboard/edit-dashboard.js index 1e2fdd6..7de6012 100644 --- a/src/dashboard/edit-dashboard.js +++ b/src/dashboard/edit-dashboard.js @@ -1,8 +1,4 @@ /** - * File: new-dashboard.js - * Author: Markus Grigull - * Date: 03.03.2017 - * * This file is part of VILLASweb. * * VILLASweb is free software: you can redistribute it and/or modify diff --git a/src/dashboard/new-dashboard.js b/src/dashboard/new-dashboard.js index b05fbad..e71fdbc 100644 --- a/src/dashboard/new-dashboard.js +++ b/src/dashboard/new-dashboard.js @@ -1,8 +1,4 @@ /** - * File: new-dashboard.js - * Author: Markus Grigull - * Date: 03.03.2017 - * * This file is part of VILLASweb. * * VILLASweb is free software: you can redistribute it and/or modify diff --git a/src/file/file-store.js b/src/file/file-store.js index 659748e..7ab9f9b 100644 --- a/src/file/file-store.js +++ b/src/file/file-store.js @@ -1,8 +1,4 @@ /** - * File: file-store.js - * Author: Markus Grigull - * Date: 16.03.2017 - * * This file is part of VILLASweb. * * VILLASweb is free software: you can redistribute it and/or modify diff --git a/src/file/files-data-manager.js b/src/file/files-data-manager.js index 91fb4a6..5758b62 100644 --- a/src/file/files-data-manager.js +++ b/src/file/files-data-manager.js @@ -1,8 +1,4 @@ /** - * File: files-data-manager.js - * Author: Markus Grigull - * Date: 16.03.2017 - * * This file is part of VILLASweb. * * VILLASweb is free software: you can redistribute it and/or modify diff --git a/src/file/select-file.js b/src/file/select-file.js index 6fa6e83..b626ee3 100644 --- a/src/file/select-file.js +++ b/src/file/select-file.js @@ -1,8 +1,4 @@ /** - * File: selectFile.js - * Author: Markus Grigull - * Date: 10.05.2018 - * * This file is part of VILLASweb. * * VILLASweb is free software: you can redistribute it and/or modify diff --git a/src/index.js b/src/index.js index a853c12..4d73f3c 100644 --- a/src/index.js +++ b/src/index.js @@ -1,8 +1,4 @@ /** - * File: index.js - * Author: Markus Grigull - * Date: 02.03.2017 - * * This file is part of VILLASweb. * * VILLASweb is free software: you can redistribute it and/or modify diff --git a/src/router.js b/src/router.js index aee9c0f..348a231 100644 --- a/src/router.js +++ b/src/router.js @@ -1,8 +1,4 @@ /** - * File: router.js - * Author: Markus Grigull - * Date: 02.03.2017 - * * This file is part of VILLASweb. * * VILLASweb is free software: you can redistribute it and/or modify diff --git a/src/scenario/edit-scenario.js b/src/scenario/edit-scenario.js index 6d22d07..d3f90c6 100644 --- a/src/scenario/edit-scenario.js +++ b/src/scenario/edit-scenario.js @@ -1,8 +1,4 @@ /** - * File: edit-scenario.js - * Author: Sonja Happ - * Date: 20.08.2019 - * * This file is part of VILLASweb. * * VILLASweb is free software: you can redistribute it and/or modify diff --git a/src/scenario/import-scenario.js b/src/scenario/import-scenario.js index 3fccb49..1e454eb 100644 --- a/src/scenario/import-scenario.js +++ b/src/scenario/import-scenario.js @@ -1,8 +1,4 @@ /** - * File: import-scenario.js - * Author: Sonja Happ - * Date: 20.08.2019 - * * This file is part of VILLASweb. * * VILLASweb is free software: you can redistribute it and/or modify diff --git a/src/scenario/new-scenario.js b/src/scenario/new-scenario.js index c7323c5..c582a3c 100644 --- a/src/scenario/new-scenario.js +++ b/src/scenario/new-scenario.js @@ -1,8 +1,4 @@ /** - * File: new-scenario.js - * Author: Sonja Happ - * Date: 20.08.2019 - * * This file is part of VILLASweb. * * VILLASweb is free software: you can redistribute it and/or modify diff --git a/src/scenario/scenario-store.js b/src/scenario/scenario-store.js index 4ab7ae4..777475c 100644 --- a/src/scenario/scenario-store.js +++ b/src/scenario/scenario-store.js @@ -1,8 +1,4 @@ /** - * File: scenario-store.js - * Author: Sonja Happ - * Date: 20.08.2019 - * * This file is part of VILLASweb. * * VILLASweb is free software: you can redistribute it and/or modify diff --git a/src/scenario/scenarios.js b/src/scenario/scenarios.js index baa22e3..8813190 100644 --- a/src/scenario/scenarios.js +++ b/src/scenario/scenarios.js @@ -1,8 +1,4 @@ /** - * File: scenarios.js - * Author: Sonja Happ - * Date: 20.08.2019 - * * This file is part of VILLASweb. * * VILLASweb is free software: you can redistribute it and/or modify diff --git a/src/signal/edit-signal-mapping.js b/src/signal/edit-signal-mapping.js index 51ab0c9..0bfac11 100644 --- a/src/signal/edit-signal-mapping.js +++ b/src/signal/edit-signal-mapping.js @@ -1,5 +1,4 @@ /** - * * This file is part of VILLASweb. * * VILLASweb is free software: you can redistribute it and/or modify diff --git a/src/styles/app.css b/src/styles/app.css index b30c2ad..672c505 100644 --- a/src/styles/app.css +++ b/src/styles/app.css @@ -1,8 +1,4 @@ /** - * File: app.css - * Author: Markus Grigull - * Date: 02.03.2017 - * * This file is part of VILLASweb. * * VILLASweb is free software: you can redistribute it and/or modify diff --git a/src/styles/index.css b/src/styles/index.css index dde0352..44eaf13 100644 --- a/src/styles/index.css +++ b/src/styles/index.css @@ -1,8 +1,4 @@ /** - * File: index.css - * Author: Markus Grigull - * Date: 17.03.2017 - * * This file is part of VILLASweb. * * VILLASweb is free software: you can redistribute it and/or modify diff --git a/src/styles/widgets.css b/src/styles/widgets.css index c52835c..c5f775e 100644 --- a/src/styles/widgets.css +++ b/src/styles/widgets.css @@ -1,8 +1,4 @@ /** - * File: widgets.css - * Author: Markus Grigull - * Date: 02.03.2017 - * * This file is part of VILLASweb. * * VILLASweb is free software: you can redistribute it and/or modify diff --git a/src/user/edit-own-user.js b/src/user/edit-own-user.js index 47b9aff..d755e2d 100644 --- a/src/user/edit-own-user.js +++ b/src/user/edit-own-user.js @@ -1,8 +1,4 @@ /** - * File: edit-user.js - * Author: Ricardo Hernandez-Montoya - * Date: 02.05.2017 - * * This file is part of VILLASweb. * * VILLASweb is free software: you can redistribute it and/or modify diff --git a/src/user/edit-user.js b/src/user/edit-user.js index 046cd46..12ee58a 100644 --- a/src/user/edit-user.js +++ b/src/user/edit-user.js @@ -1,8 +1,4 @@ /** - * File: edit-user.js - * Author: Ricardo Hernandez-Montoya - * Date: 02.05.2017 - * * This file is part of VILLASweb. * * VILLASweb is free software: you can redistribute it and/or modify diff --git a/src/user/login-form.js b/src/user/login-form.js index a038f38..c2efaae 100644 --- a/src/user/login-form.js +++ b/src/user/login-form.js @@ -1,8 +1,4 @@ /** - * File: login-form.js - * Author: Markus Grigull - * Date: 15.03.2017 - * * This file is part of VILLASweb. * * VILLASweb is free software: you can redistribute it and/or modify diff --git a/src/user/login.js b/src/user/login.js index 76c2e68..ee78945 100644 --- a/src/user/login.js +++ b/src/user/login.js @@ -1,8 +1,4 @@ /** - * File: login.js - * Author: Markus Grigull - * Date: 15.03.2017 - * * This file is part of VILLASweb. * * VILLASweb is free software: you can redistribute it and/or modify diff --git a/src/user/logout.js b/src/user/logout.js index dd1eafc..cd1fab1 100644 --- a/src/user/logout.js +++ b/src/user/logout.js @@ -1,8 +1,4 @@ /** - * File: logout.js - * Author: Markus Grigull - * Date: 15.03.2017 - * * This file is part of VILLASweb. * * VILLASweb is free software: you can redistribute it and/or modify diff --git a/src/user/new-user.js b/src/user/new-user.js index 5919568..2d0c434 100644 --- a/src/user/new-user.js +++ b/src/user/new-user.js @@ -1,8 +1,4 @@ /** - * File: new-user.js - * Author: Ricardo Hernandez-Montoya - * Date: 02.05.2017 - * * This file is part of VILLASweb. * * VILLASweb is free software: you can redistribute it and/or modify diff --git a/src/user/user.js b/src/user/user.js index 8e7e67c..6ab4b82 100644 --- a/src/user/user.js +++ b/src/user/user.js @@ -1,8 +1,4 @@ /** - * File: user.js - * Author: Sonja Happ - * Date: 18.09.2019 - * * This file is part of VILLASweb. * * VILLASweb is free software: you can redistribute it and/or modify diff --git a/src/user/users-data-manager.js b/src/user/users-data-manager.js index aae60e1..dac46d2 100644 --- a/src/user/users-data-manager.js +++ b/src/user/users-data-manager.js @@ -1,8 +1,4 @@ /** - * File: users-data-manager.js - * Author: Markus Grigull - * Date: 15.03.2017 - * * This file is part of VILLASweb. * * VILLASweb is free software: you can redistribute it and/or modify diff --git a/src/user/users-store.js b/src/user/users-store.js index b2ddfe9..dd155b9 100644 --- a/src/user/users-store.js +++ b/src/user/users-store.js @@ -1,8 +1,4 @@ /** - * File: users-store.js - * Author: Markus Grigull - * Date: 15.03.2017 - * * This file is part of VILLASweb. * * VILLASweb is free software: you can redistribute it and/or modify @@ -55,7 +51,7 @@ class UsersStore extends ArrayStore { NotificationsDataManager.addNotification(USER_EDIT_ERROR_NOTIFICATION); } - return super.reduce(state, action); + return super.reduce(state, action); default: return super.reduce(state, action); diff --git a/src/user/users.js b/src/user/users.js index 47b8d26..7deb4b3 100644 --- a/src/user/users.js +++ b/src/user/users.js @@ -1,8 +1,4 @@ /** - * File: users.js - * Author: Ricardo Hernandez-Montoya - * Date: 02.05.2017 - * * This file is part of VILLASweb. * * VILLASweb is free software: you can redistribute it and/or modify diff --git a/src/widget/dropzone.js b/src/widget/dropzone.js index 979a692..f962719 100644 --- a/src/widget/dropzone.js +++ b/src/widget/dropzone.js @@ -1,8 +1,4 @@ /** - * File: dropzone.js - * Author: Markus Grigull - * Date: 02.03.2017 - * * This file is part of VILLASweb. * * VILLASweb is free software: you can redistribute it and/or modify @@ -42,7 +38,7 @@ const dropzoneTarget = { } } } - + return maxZ; }, 0); position.z = foundZ >= 100? foundZ : ++foundZ; diff --git a/src/widget/edit-widget/edit-widget-aspect-control.js b/src/widget/edit-widget/edit-widget-aspect-control.js index 5a855c2..3186584 100644 --- a/src/widget/edit-widget/edit-widget-aspect-control.js +++ b/src/widget/edit-widget/edit-widget-aspect-control.js @@ -1,8 +1,4 @@ /** - * File: edit-widget-aspect-control.js - * Author: Markus Grigull - * Date: 29.07.2017 - * * This file is part of VILLASweb. * * VILLASweb is free software: you can redistribute it and/or modify diff --git a/src/widget/edit-widget/edit-widget-checkbox-control.js b/src/widget/edit-widget/edit-widget-checkbox-control.js index 960c9e8..2f1eb87 100644 --- a/src/widget/edit-widget/edit-widget-checkbox-control.js +++ b/src/widget/edit-widget/edit-widget-checkbox-control.js @@ -1,8 +1,4 @@ /** - * File: edit-widget-checkbox-control.js - * Author: Markus Grigull - * Date: 19.08.2017 - * * This file is part of VILLASweb. * * VILLASweb is free software: you can redistribute it and/or modify diff --git a/src/widget/edit-widget/edit-widget-color-control.js b/src/widget/edit-widget/edit-widget-color-control.js index 408a4d0..c031597 100644 --- a/src/widget/edit-widget/edit-widget-color-control.js +++ b/src/widget/edit-widget/edit-widget-color-control.js @@ -1,9 +1,4 @@ /** - * File: edit-widget-color-control.js - * Author: Ricardo Hernandez-Montoya - * Date: 24.04.2017 - * Copyright: 2018, Institute for Automation of Complex Power Systems, EONERC - * * This file is part of VILLASweb. * * VILLASweb is free software: you can redistribute it and/or modify diff --git a/src/widget/edit-widget/edit-widget-color-zones-control.js b/src/widget/edit-widget/edit-widget-color-zones-control.js index b1d002f..504aaef 100644 --- a/src/widget/edit-widget/edit-widget-color-zones-control.js +++ b/src/widget/edit-widget/edit-widget-color-zones-control.js @@ -1,8 +1,4 @@ /** - * File: edit-widget-color-zones-control.js - * Author: Markus Grigull - * Date: 20.08.2017 - * * This file is part of VILLASweb. * * VILLASweb is free software: you can redistribute it and/or modify diff --git a/src/widget/edit-widget/edit-widget-html-content.js b/src/widget/edit-widget/edit-widget-html-content.js index f931ba9..6ad836b 100644 --- a/src/widget/edit-widget/edit-widget-html-content.js +++ b/src/widget/edit-widget/edit-widget-html-content.js @@ -1,8 +1,4 @@ /** - * File: edit-widget-html-content.js - * Author: Ricardo Hernandez-Montoya - * Date: 03.09.2017 - * * This file is part of VILLASweb. * * VILLASweb is free software: you can redistribute it and/or modify diff --git a/src/widget/edit-widget/edit-widget-image-control.js b/src/widget/edit-widget/edit-widget-image-control.js index de6eaf9..0f2c9e7 100644 --- a/src/widget/edit-widget/edit-widget-image-control.js +++ b/src/widget/edit-widget/edit-widget-image-control.js @@ -1,8 +1,4 @@ /** - * File: edit-widget-image-control.js - * Author: Markus Grigull - * Date: 04.03.2017 - * * This file is part of VILLASweb. * * VILLASweb is free software: you can redistribute it and/or modify diff --git a/src/widget/edit-widget/edit-widget-number-control.js b/src/widget/edit-widget/edit-widget-number-control.js index d86722f..5984c82 100644 --- a/src/widget/edit-widget/edit-widget-number-control.js +++ b/src/widget/edit-widget/edit-widget-number-control.js @@ -1,8 +1,4 @@ /** - * File: edit-widget-text-control.js - * Author: Ricardo Hernandez-Montoya - * Date: 21.04.2017 - * * This file is part of VILLASweb. * * VILLASweb is free software: you can redistribute it and/or modify diff --git a/src/widget/edit-widget/edit-widget-orientation.js b/src/widget/edit-widget/edit-widget-orientation.js index dc8fd49..aee9c14 100644 --- a/src/widget/edit-widget/edit-widget-orientation.js +++ b/src/widget/edit-widget/edit-widget-orientation.js @@ -1,8 +1,4 @@ /** - * File: edit-widget-orientation.js - * Author: Ricardo Hernandez-Montoya - * Date: 10.04.2017 - * * This file is part of VILLASweb. * * VILLASweb is free software: you can redistribute it and/or modify diff --git a/src/widget/edit-widget/edit-widget-parameters-control.js b/src/widget/edit-widget/edit-widget-parameters-control.js index d1cf65c..4117fd6 100644 --- a/src/widget/edit-widget/edit-widget-parameters-control.js +++ b/src/widget/edit-widget/edit-widget-parameters-control.js @@ -1,8 +1,4 @@ /** - * File: edit-widget-text-control.js - * Author: Ricardo Hernandez-Montoya - * Date: 21.04.2017 - * * This file is part of VILLASweb. * * VILLASweb is free software: you can redistribute it and/or modify diff --git a/src/widget/edit-widget/edit-widget-signal-control.js b/src/widget/edit-widget/edit-widget-signal-control.js index b376e8e..e87c689 100644 --- a/src/widget/edit-widget/edit-widget-signal-control.js +++ b/src/widget/edit-widget/edit-widget-signal-control.js @@ -1,8 +1,4 @@ /** - * File: edit-widget-signal-control.js - * Author: Ricardo Hernandez-Montoya - * Date: 03.04.2017 - * * This file is part of VILLASweb. * * VILLASweb is free software: you can redistribute it and/or modify diff --git a/src/widget/edit-widget/edit-widget-text-control.js b/src/widget/edit-widget/edit-widget-text-control.js index a8624c6..22aac97 100644 --- a/src/widget/edit-widget/edit-widget-text-control.js +++ b/src/widget/edit-widget/edit-widget-text-control.js @@ -1,8 +1,4 @@ /** - * File: edit-widget-text-control.js - * Author: Ricardo Hernandez-Montoya - * Date: 21.04.2017 - * * This file is part of VILLASweb. * * VILLASweb is free software: you can redistribute it and/or modify diff --git a/src/widget/edit-widget/edit-widget-text-size-control.js b/src/widget/edit-widget/edit-widget-text-size-control.js index 1c04ba6..10e7922 100644 --- a/src/widget/edit-widget/edit-widget-text-size-control.js +++ b/src/widget/edit-widget/edit-widget-text-size-control.js @@ -1,8 +1,4 @@ /** - * File: edit-widget-text-size-control.js - * Author: Ricardo Hernandez-Montoya - * Date: 29.07.2017 - * * This file is part of VILLASweb. * * VILLASweb is free software: you can redistribute it and/or modify diff --git a/src/widget/edit-widget/edit-widget-time-control.js b/src/widget/edit-widget/edit-widget-time-control.js index 736dc70..c78568b 100644 --- a/src/widget/edit-widget/edit-widget-time-control.js +++ b/src/widget/edit-widget/edit-widget-time-control.js @@ -1,8 +1,4 @@ /** - * File: edit-widget-time-control.js - * Author: Ricardo Hernandez-Montoya - * Date: 13.04.2017 - * * This file is part of VILLASweb. * * VILLASweb is free software: you can redistribute it and/or modify diff --git a/src/widget/editable-widget-container.js b/src/widget/editable-widget-container.js index 572a1ea..f49312e 100644 --- a/src/widget/editable-widget-container.js +++ b/src/widget/editable-widget-container.js @@ -1,8 +1,4 @@ /** - * File: editable-widget-container.js - * Author: Markus Grigull - * Date: 31.05.2018 - * * This file is part of VILLASweb. * * VILLASweb is free software: you can redistribute it and/or modify @@ -27,7 +23,7 @@ import { Rnd } from 'react-rnd'; class EditableWidgetContainer extends React.Component { constructor(props) { super(props); - + this.rnd = null; } @@ -66,7 +62,7 @@ class EditableWidgetContainer extends React.Component { }; resizeStop = (event, direction, ref,delta, position) => { - + const widget = this.props.widget; // resize depends on direction @@ -125,9 +121,9 @@ class EditableWidgetContainer extends React.Component { enableResizing={resizing} disableDragging={widget.isLocked} > - + {this.props.children} - + ; } } diff --git a/src/widget/grid.js b/src/widget/grid.js index 16e8fa5..3c3a180 100644 --- a/src/widget/grid.js +++ b/src/widget/grid.js @@ -1,8 +1,4 @@ /** - * File: grid.js - * Author: Markus Grigull - * Date: 27.07.2017 - * * This file is part of VILLASweb. * * VILLASweb is free software: you can redistribute it and/or modify @@ -32,7 +28,7 @@ class Grid extends React.Component { - + ); diff --git a/src/widget/toolbox-item.js b/src/widget/toolbox-item.js index be498f4..013c4cf 100644 --- a/src/widget/toolbox-item.js +++ b/src/widget/toolbox-item.js @@ -1,8 +1,4 @@ /** - * File: toolbox-item.js - * Author: Markus Grigull - * Date: 02.03.2017 - * * This file is part of VILLASweb. * * VILLASweb is free software: you can redistribute it and/or modify diff --git a/src/widget/widget-area.js b/src/widget/widget-area.js index d33504c..b4d31f0 100644 --- a/src/widget/widget-area.js +++ b/src/widget/widget-area.js @@ -1,8 +1,4 @@ /** - * File: widget-area.js - * Author: Markus Grigull - * Date: 31.05.2018 - * * This file is part of VILLASweb. * * VILLASweb is free software: you can redistribute it and/or modify diff --git a/src/widget/widget-container.js b/src/widget/widget-container.js index 3218ba6..31360e2 100644 --- a/src/widget/widget-container.js +++ b/src/widget/widget-container.js @@ -1,8 +1,4 @@ /** - * File: widget-container.js - * Author: Markus Grigull - * Date: 31.05.2018 - * * This file is part of VILLASweb. * * VILLASweb is free software: you can redistribute it and/or modify @@ -24,7 +20,7 @@ import PropTypes from 'prop-types'; class WidgetContainer extends React.Component { render() { - + const containerStyle = { width: Number(this.props.widget.width), height: Number(this.props.widget.height), diff --git a/src/widget/widget-context-menu.js b/src/widget/widget-context-menu.js index ea79b92..bf83fc8 100644 --- a/src/widget/widget-context-menu.js +++ b/src/widget/widget-context-menu.js @@ -1,8 +1,4 @@ /** - * File: widget-context-menu.js - * Author: Markus Grigull - * Date: 31.05.2018 - * * This file is part of VILLASweb. * * VILLASweb is free software: you can redistribute it and/or modify diff --git a/src/widget/widget-factory.js b/src/widget/widget-factory.js index ef5b7bf..dd68e05 100644 --- a/src/widget/widget-factory.js +++ b/src/widget/widget-factory.js @@ -1,10 +1,4 @@ /** - * File: widget-factory.js - * Description: A factory to create and pre-configure widgets - * Author: Ricardo Hernandez-Montoya - * Date: 02.03.2017 - * Copyright: 2018, Institute for Automation of Complex Power Systems, EONERC - * * This file is part of VILLASweb. * * VILLASweb is free software: you can redistribute it and/or modify diff --git a/src/widget/widget-plot/plot-legend.js b/src/widget/widget-plot/plot-legend.js index ad0cb64..22aba64 100644 --- a/src/widget/widget-plot/plot-legend.js +++ b/src/widget/widget-plot/plot-legend.js @@ -1,9 +1,4 @@ /** - * File: plot-legend.js - * Author: Ricardo Hernandez-Montoya - * Date: 10.04.2017 - * Copyright: 2018, Institute for Automation of Complex Power Systems, EONERC - * * This file is part of VILLASweb. * * VILLASweb is free software: you can redistribute it and/or modify diff --git a/src/widget/widget-plot/plot.js b/src/widget/widget-plot/plot.js index 82c099a..444d540 100644 --- a/src/widget/widget-plot/plot.js +++ b/src/widget/widget-plot/plot.js @@ -1,9 +1,4 @@ /** - * File: plot.js - * Author: Ricardo Hernandez-Montoya - * Date: 10.04.2017 - * Copyright: 2018, Institute for Automation of Complex Power Systems, EONERC - * * This file is part of VILLASweb. * * VILLASweb is free software: you can redistribute it and/or modify @@ -104,7 +99,7 @@ class Plot extends React.Component { } else { yScale = scaleLinear().domain([0, 10]).range([props.height + topMargin - bottomMargin, topMargin]); } - + const xAxis = axisBottom().scale(xScale).ticks(5).tickFormat(timeFormat("%M:%S")); const yAxis = axisLeft().scale(yScale).ticks(5).tickFormat(format(".3s")); diff --git a/src/widget/widget-toolbox.js b/src/widget/widget-toolbox.js index 9799ff5..9a4309b 100644 --- a/src/widget/widget-toolbox.js +++ b/src/widget/widget-toolbox.js @@ -1,8 +1,4 @@ /** - * File: widget-toolbox.js - * Author: Markus Grigull - * Date: 31.05.2018 - * * This file is part of VILLASweb. * * VILLASweb is free software: you can redistribute it and/or modify diff --git a/src/widget/widget.js b/src/widget/widget.js index 52efd9d..293cb19 100644 --- a/src/widget/widget.js +++ b/src/widget/widget.js @@ -1,8 +1,4 @@ /** - * File: widget.js - * Author: Markus Grigull - * Date: 04.03.2017 - * * This file is part of VILLASweb. * * VILLASweb is free software: you can redistribute it and/or modify diff --git a/src/widget/widgets/action.js b/src/widget/widgets/action.js index 0d309a8..5a69d32 100644 --- a/src/widget/widgets/action.js +++ b/src/widget/widgets/action.js @@ -1,9 +1,4 @@ /** - * File: action.js - * Author: Steffen Vogel - * Date: 17.06.2018 - * Copyright: 2018, Institute for Automation of Complex Power Systems, EONERC - * * This file is part of VILLASweb. * * VILLASweb is free software: you can redistribute it and/or modify diff --git a/src/widget/widgets/box.js b/src/widget/widgets/box.js index e7c350c..758dec3 100644 --- a/src/widget/widgets/box.js +++ b/src/widget/widgets/box.js @@ -1,9 +1,4 @@ /** - * File: box.js - * Author: Ricardo Hernandez-Montoya - * Date: 25.04.2017 - * Copyright: 2018, Institute for Automation of Complex Power Systems, EONERC - * * This file is part of VILLASweb. * * VILLASweb is free software: you can redistribute it and/or modify diff --git a/src/widget/widgets/button.js b/src/widget/widgets/button.js index a7fd2ae..c400b54 100644 --- a/src/widget/widgets/button.js +++ b/src/widget/widgets/button.js @@ -1,9 +1,4 @@ /** - * File: button.js - * Author: Ricardo Hernandez-Montoya - * Date: 29.03.2017 - * Copyright: 2018, Institute for Automation of Complex Power Systems, EONERC - * * This file is part of VILLASweb. * * VILLASweb is free software: you can redistribute it and/or modify diff --git a/src/widget/widgets/gauge.js b/src/widget/widgets/gauge.js index 854034a..1feae3f 100644 --- a/src/widget/widgets/gauge.js +++ b/src/widget/widgets/gauge.js @@ -1,9 +1,4 @@ /** - * File: gauge.js - * Author: Ricardo Hernandez-Montoya - * Date: 31.03.2017 - * Copyright: 2018, Institute for Automation of Complex Power Systems, EONERC - * * This file is part of VILLASweb. * * VILLASweb is free software: you can redistribute it and/or modify diff --git a/src/widget/widgets/html.js b/src/widget/widgets/html.js index 773aefa..e5c18a0 100644 --- a/src/widget/widgets/html.js +++ b/src/widget/widgets/html.js @@ -1,8 +1,4 @@ /** - * File: html.js - * Author: Markus Grigull - * Date: 29.08.2017 - * * This file is part of VILLASweb. * * VILLASweb is free software: you can redistribute it and/or modify diff --git a/src/widget/widgets/image.js b/src/widget/widgets/image.js index 92ef00e..2fea54b 100644 --- a/src/widget/widgets/image.js +++ b/src/widget/widgets/image.js @@ -1,8 +1,4 @@ /** - * File: image.js - * Author: Markus Grigull - * Date: 14.03.2017 - * * This file is part of VILLASweb. * * VILLASweb is free software: you can redistribute it and/or modify diff --git a/src/widget/widgets/input.js b/src/widget/widgets/input.js index 566dd16..bc27f3e 100644 --- a/src/widget/widgets/input.js +++ b/src/widget/widgets/input.js @@ -1,9 +1,4 @@ /** - * File: input.js - * Author: Ricardo Hernandez-Montoya - * Date: 29.03.2017 - * Copyright: 2018, Institute for Automation of Complex Power Systems, EONERC - * * This file is part of VILLASweb. * * VILLASweb is free software: you can redistribute it and/or modify diff --git a/src/widget/widgets/label.js b/src/widget/widgets/label.js index 1c59f70..a7431e2 100644 --- a/src/widget/widgets/label.js +++ b/src/widget/widgets/label.js @@ -1,8 +1,4 @@ /** - * File: label.js - * Author: Markus Grigull - * Date: 14.03.2017 - * * This file is part of VILLASweb. * * VILLASweb is free software: you can redistribute it and/or modify diff --git a/src/widget/widgets/lamp.js b/src/widget/widgets/lamp.js index cc4305c..b9a9605 100644 --- a/src/widget/widgets/lamp.js +++ b/src/widget/widgets/lamp.js @@ -1,8 +1,4 @@ /** - * File: lamp.js - * Author: Steffen Vogel - * Date: 20.09.2017 - * * This file is part of VILLASweb. * * VILLASweb is free software: you can redistribute it and/or modify diff --git a/src/widget/widgets/plot-table.js b/src/widget/widgets/plot-table.js index b4cbb12..3e8e8f1 100644 --- a/src/widget/widgets/plot-table.js +++ b/src/widget/widgets/plot-table.js @@ -1,8 +1,4 @@ /** - * File: plot-table.js - * Author: Markus Grigull - * Date: 15.03.2017 - * * This file is part of VILLASweb. * * VILLASweb is free software: you can redistribute it and/or modify diff --git a/src/widget/widgets/slider.js b/src/widget/widgets/slider.js index ac82ebc..bd4a6fe 100644 --- a/src/widget/widgets/slider.js +++ b/src/widget/widgets/slider.js @@ -1,9 +1,4 @@ /** - * File: slider.js - * Author: Ricardo Hernandez-Montoya - * Date: 30.03.2017 - * Copyright: 2018, Institute for Automation of Complex Power Systems, EONERC - * * This file is part of VILLASweb. * * VILLASweb is free software: you can redistribute it and/or modify diff --git a/src/widget/widgets/table.js b/src/widget/widgets/table.js index 70db5af..54426bd 100644 --- a/src/widget/widgets/table.js +++ b/src/widget/widgets/table.js @@ -1,8 +1,4 @@ /** - * File: table.js - * Author: Markus Grigull - * Date: 14.03.2017 - * * This file is part of VILLASweb. * * VILLASweb is free software: you can redistribute it and/or modify diff --git a/src/widget/widgets/topology.js b/src/widget/widgets/topology.js index 5c3ce7e..6d98195 100644 --- a/src/widget/widgets/topology.js +++ b/src/widget/widgets/topology.js @@ -1,8 +1,4 @@ /** - * File: topology.js - * Author: Ricardo Hernandez-Montoya - * Date: 08.01.2018 - * * This file is part of VILLASweb. * * VILLASweb is free software: you can redistribute it and/or modify diff --git a/src/widget/widgets/value.js b/src/widget/widgets/value.js index c6035a5..91756fa 100644 --- a/src/widget/widgets/value.js +++ b/src/widget/widgets/value.js @@ -1,8 +1,4 @@ /** - * File: value.js - * Author: Markus Grigull - * Date: 04.03.2017 - * * This file is part of VILLASweb. * * VILLASweb is free software: you can redistribute it and/or modify From 9a3aa778514a4f4958678bef19c1297a3e45b1ac Mon Sep 17 00:00:00 2001 From: Sonja Happ Date: Fri, 27 Mar 2020 14:19:40 +0100 Subject: [PATCH 144/391] name edit button of dashboard to edit layout --- src/dashboard/dashboard-button-group.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/dashboard/dashboard-button-group.js b/src/dashboard/dashboard-button-group.js index 376d8c1..9fda299 100644 --- a/src/dashboard/dashboard-button-group.js +++ b/src/dashboard/dashboard-button-group.js @@ -67,7 +67,7 @@ class DashboardButtonGroup extends React.Component { buttons.push( ); } From 3b2a71ec96523a7dbbcbf99331fa0a98586f6ef7 Mon Sep 17 00:00:00 2001 From: Sonja Happ Date: Fri, 27 Mar 2020 14:20:21 +0100 Subject: [PATCH 145/391] unit appears for value widget even if no data is available --- .../edit-widget-control-creator.js | 2 +- .../edit-widget/edit-widget-signal-control.js | 2 +- src/widget/widgets/value.js | 21 +++++++++++-------- 3 files changed, 14 insertions(+), 11 deletions(-) diff --git a/src/widget/edit-widget/edit-widget-control-creator.js b/src/widget/edit-widget/edit-widget-control-creator.js index 0b1ac15..7951ab2 100644 --- a/src/widget/edit-widget/edit-widget-control-creator.js +++ b/src/widget/edit-widget/edit-widget-control-creator.js @@ -52,7 +52,7 @@ export default function CreateControls(widgetType = null, widget = null, session break; case 'Value': DialogControls.push( - handleChange(e)} />, + handleChange(e)} />, handleChange(e)} />, handleChange(e)} />, handleChange(e)} /> diff --git a/src/widget/edit-widget/edit-widget-signal-control.js b/src/widget/edit-widget/edit-widget-signal-control.js index e87c689..b7d8da6 100644 --- a/src/widget/edit-widget/edit-widget-signal-control.js +++ b/src/widget/edit-widget/edit-widget-signal-control.js @@ -47,7 +47,7 @@ class EditWidgetSignalControl extends Component { return ( - Signal + Select signal this.handleSignalChange(e)}> { this.props.signals.length === 0 ? ( diff --git a/src/widget/widgets/value.js b/src/widget/widgets/value.js index 91756fa..c44a4fe 100644 --- a/src/widget/widgets/value.js +++ b/src/widget/widgets/value.js @@ -37,11 +37,18 @@ class WidgetValue extends Component { const ICid = props.icIDs[0]; // update value + let value = ''; if (props.data == null || props.data[ICid] == null || props.data[ICid].output == null || props.data[ICid].output.values == null) { - return{ value: '' }; + value = ''; + } else { + // check if value has changed + const signalData = props.data[ICid].output.values[signal.index]; + if (signalData != null && state.value !== signalData[signalData.length - 1].y) { + value = signalData[signalData.length - 1].y + } } // Update unit (assuming there is exactly one signal for this widget) @@ -52,14 +59,10 @@ class WidgetValue extends Component { unit = signal.unit; } - // check if value has changed - const signalData = props.data[ICid].output.values[signal.index]; - if (signalData != null && state.value !== signalData[signalData.length - 1].y) { - return { - value: signalData[signalData.length - 1].y, - unit: unit, - }; - } + return { + value: value, + unit: unit, + }; } From 9ff89a7c29ed6102767b3e0e9785c40ed4fc21ee Mon Sep 17 00:00:00 2001 From: Sonja Happ Date: Fri, 27 Mar 2020 16:38:57 +0100 Subject: [PATCH 146/391] fix for checkbox edit, can now be checked an unchecked --- .../edit-widget-checkbox-control.js | 33 +++++++++++-------- .../edit-widget-control-creator.js | 12 +++---- 2 files changed, 25 insertions(+), 20 deletions(-) diff --git a/src/widget/edit-widget/edit-widget-checkbox-control.js b/src/widget/edit-widget/edit-widget-checkbox-control.js index 2f1eb87..8a4113f 100644 --- a/src/widget/edit-widget/edit-widget-checkbox-control.js +++ b/src/widget/edit-widget/edit-widget-checkbox-control.js @@ -22,31 +22,36 @@ class EditWidgetCheckboxControl extends React.Component { constructor(props) { super(props); - this.state = { - widget: props.widget - }; - } - - static getDerivedStateFromProps(props, state){ - return{ - widget: props.widget - }; - } - - render() { let parts = this.props.controlId.split('.'); let isCustomProperty = true; if (parts.length ===1){ isCustomProperty = false; } + let isChecked; + if (isCustomProperty){ + isChecked = this.props.widget[parts[0]][parts[1]] + } else{ + isChecked = this.props.widget[this.props.controlId] + } + this.state = { + isChecked + }; + } + + handleCheckboxChange(e){ + this.props.handleChange({target: { id: this.props.controlId, value: !this.state.isChecked} }) + } + + render() { return this.props.handleChange(e)}> + defaultChecked={this.state.isChecked} + onChange={e => this.handleCheckboxChange(e)}> ; diff --git a/src/widget/edit-widget/edit-widget-control-creator.js b/src/widget/edit-widget/edit-widget-control-creator.js index 7951ab2..ac64bbc 100644 --- a/src/widget/edit-widget/edit-widget-control-creator.js +++ b/src/widget/edit-widget/edit-widget-control-creator.js @@ -55,7 +55,7 @@ export default function CreateControls(widgetType = null, widget = null, session handleChange(e)} />, handleChange(e)} />, handleChange(e)} />, - handleChange(e)} /> + handleChange(e)} /> ); break; case 'Lamp': @@ -77,7 +77,7 @@ export default function CreateControls(widgetType = null, widget = null, session case 'Table': DialogControls.push( handleChange(e)} />, - handleChange(e)} /> + handleChange(e)} /> ); break; case 'Image': @@ -92,7 +92,7 @@ export default function CreateControls(widgetType = null, widget = null, session DialogControls.push( handleChange(e)} />, handleChange(e)} />, - handleChange(e)} />, + handleChange(e)} />, handleChange(e)} />, handleChange(e)} /> ); @@ -110,8 +110,8 @@ export default function CreateControls(widgetType = null, widget = null, session handleChange(e)} />, handleChange(e)} />, handleChange(e)} />, - handleChange(e)} />, - handleChange(e)} />, + handleChange(e)} />, + handleChange(e)} />, handleChange(e)} />, handleChange(e)} />, handleChange(e)} /> @@ -121,7 +121,7 @@ export default function CreateControls(widgetType = null, widget = null, session DialogControls.push( handleChange(e)} />, handleChange(e)} />, - handleChange(e)} />, + handleChange(e)} />, handleChange(e)} />, handleChange(e)} /> ); From d1dc3e92de8886c665885d1df0ac101286916ddb Mon Sep 17 00:00:00 2001 From: Sonja Happ Date: Fri, 27 Mar 2020 16:53:21 +0100 Subject: [PATCH 147/391] fix for min-max-edit, can now be selected and unselected, min and max values can be changed --- .../edit-widget-min-max-control.js | 81 ++++++++++++------- 1 file changed, 54 insertions(+), 27 deletions(-) diff --git a/src/widget/edit-widget/edit-widget-min-max-control.js b/src/widget/edit-widget/edit-widget-min-max-control.js index 945f036..f25f23a 100644 --- a/src/widget/edit-widget/edit-widget-min-max-control.js +++ b/src/widget/edit-widget/edit-widget-min-max-control.js @@ -22,36 +22,65 @@ class EditWidgetMinMaxControl extends React.Component { constructor(props) { super(props); - this.state = { - widget: props.widget - } - } - - static getDerivedStateFromProps(props, state){ - return{ - widget: props.widget - }; - } - - render() { - - let parts = this.props.controlId.split('.'); + let parts = props.controlId.split('.'); let isCustomProperty = true; if (parts.length === 1){ isCustomProperty = false; } - console.log("min max edit: ", isCustomProperty); + let useMinMax; + let minValue = 0; + let maxValue = 0; + if (isCustomProperty){ + useMinMax = props.widget[parts[0]][parts[1]+"UseMinMax"]; + if (useMinMax) { + minValue = props.widget[parts[0]][parts[1] + 'Min']; + maxValue = props.widget[parts[0]][parts[1] + 'Max']; + } + + } else { + useMinMax = props.widget[props.controlId + "UseMinMax"] + if (useMinMax){ + minValue = props.widget[props.controlId + "Min"] + maxValue = props.widget[props.controlId + "Max"] + } + } + + this.state = { + useMinMax, + minValue, + maxValue, + } + + } + + handleCheckboxChange(e){ + + // toggle boolean variable + let status = this.state.useMinMax; + this.setState({useMinMax: !status}); + this.props.handleChange({target: { id: this.props.controlId + "UseMinMax", value: !status} }) + } + + handleMinChange(e){ + this.setState({minValue: e.target.value}); + this.props.handleChange({target: { id: this.props.controlId + "Min", value: Number(e.target.value)} }) + } + + handleMaxChange(e){ + this.setState({maxValue: e.target.value}); + this.props.handleChange({target: { id: this.props.controlId + "Max", value: Number(e.target.value)} }) + } + + render() { return {this.props.label} this.props.handleChange(e)}> + defaultChecked={this.state.useMinMax} + onChange={e => this.handleCheckboxChange(e)}>
    @@ -62,22 +91,20 @@ class EditWidgetMinMaxControl extends React.Component { this.props.handleChange(e)} /> + value={this.state.minValue} + onChange={e => this.handleMinChange(e)} /> From 6ff87ff09267b7fee617de67149dca31ab557cfa Mon Sep 17 00:00:00 2001 From: Sonja Happ Date: Fri, 27 Mar 2020 16:55:55 +0100 Subject: [PATCH 148/391] use infrastructure component name in config list preferred over UUID --- src/scenario/scenario.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/scenario/scenario.js b/src/scenario/scenario.js index 47e0a15..e8cceee 100644 --- a/src/scenario/scenario.js +++ b/src/scenario/scenario.js @@ -269,7 +269,7 @@ class Scenario extends React.Component { getICName(icID) { for (let ic of this.state.ics) { if (ic.id === icID) { - return _.get(ic, 'properties.name') || _.get(ic, 'rawProperties.name') || ic.uuid; + return ic.name || ic.uuid; } } } @@ -283,7 +283,7 @@ class Scenario extends React.Component { let newDashboard = data; // add default grid value and scenarioID newDashboard["grid"] = 15; - newDashboard["scenarioID"] = this.state.scenario.id + newDashboard["scenarioID"] = this.state.scenario.id; if (data) { AppDispatcher.dispatch({ From 68b688e52b4b5cea424090924b8a9d5b014195da Mon Sep 17 00:00:00 2001 From: Sonja Happ Date: Fri, 27 Mar 2020 16:59:54 +0100 Subject: [PATCH 149/391] remove warnings --- src/scenario/scenario.js | 1 - src/widget/widgets/value.js | 5 +++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/scenario/scenario.js b/src/scenario/scenario.js index e8cceee..071c610 100644 --- a/src/scenario/scenario.js +++ b/src/scenario/scenario.js @@ -19,7 +19,6 @@ import React from 'react'; import { Container } from 'flux/utils'; import { Button } from 'react-bootstrap'; import FileSaver from 'file-saver'; -import _ from 'lodash'; import ScenarioStore from './scenario-store'; import ICStore from '../ic/ic-store'; diff --git a/src/widget/widgets/value.js b/src/widget/widgets/value.js index c44a4fe..5f826d8 100644 --- a/src/widget/widgets/value.js +++ b/src/widget/widgets/value.js @@ -35,6 +35,9 @@ class WidgetValue extends Component { // TODO does the following line make sense? const ICid = props.icIDs[0]; + let signalID = props.widget.signalIDs[0]; + let signal = props.signals.find(sig => sig.id === signalID); + // update value let value = ''; @@ -53,8 +56,6 @@ class WidgetValue extends Component { // Update unit (assuming there is exactly one signal for this widget) let unit = ''; - let signalID = props.widget.signalIDs[0]; - let signal = props.signals.find(sig => sig.id === signalID); if(signal !== undefined){ unit = signal.unit; } From 76b7c6019634a0ce1ff4cedc50e04b5d4c3b93c6 Mon Sep 17 00:00:00 2001 From: Laura Fuentes Grau Date: Sat, 28 Mar 2020 18:06:08 +0100 Subject: [PATCH 150/391] minor bug fixes in number control and time control --- src/widget/edit-widget/edit-widget-control-creator.js | 2 +- src/widget/edit-widget/edit-widget-number-control.js | 4 ++-- src/widget/edit-widget/edit-widget-time-control.js | 7 +++---- src/widget/widget-factory.js | 4 ++++ 4 files changed, 10 insertions(+), 7 deletions(-) diff --git a/src/widget/edit-widget/edit-widget-control-creator.js b/src/widget/edit-widget/edit-widget-control-creator.js index ac64bbc..e79b6b8 100644 --- a/src/widget/edit-widget/edit-widget-control-creator.js +++ b/src/widget/edit-widget/edit-widget-control-creator.js @@ -68,7 +68,7 @@ export default function CreateControls(widgetType = null, widget = null, session break; case 'Plot': DialogControls.push( - handleChange(e)} />, + handleChange(e)} />, handleChange(e)} />, handleChange(e)} />, handleChange(e)} /> diff --git a/src/widget/edit-widget/edit-widget-number-control.js b/src/widget/edit-widget/edit-widget-number-control.js index 5984c82..7b4ffa5 100644 --- a/src/widget/edit-widget/edit-widget-number-control.js +++ b/src/widget/edit-widget/edit-widget-number-control.js @@ -35,11 +35,11 @@ class EditWidgetNumberControl extends Component { }; } - render() { + render() { return ( {this.props.label} - this.props.handleChange(e)} /> + this.props.handleChange(e)} /> ); } diff --git a/src/widget/edit-widget/edit-widget-time-control.js b/src/widget/edit-widget/edit-widget-time-control.js index c78568b..21b135d 100644 --- a/src/widget/edit-widget/edit-widget-time-control.js +++ b/src/widget/edit-widget/edit-widget-time-control.js @@ -23,8 +23,7 @@ class EditWidgetTimeControl extends Component { super(props); this.state = { - widget: { - time: 0 + widget: { } }; } @@ -38,9 +37,9 @@ class EditWidgetTimeControl extends Component { render() { return ( - + Time - this.props.handleChange(e)} /> + this.props.handleChange(e)} /> Time in seconds ); diff --git a/src/widget/widget-factory.js b/src/widget/widget-factory.js index dd68e05..5b7d5a2 100644 --- a/src/widget/widget-factory.js +++ b/src/widget/widget-factory.js @@ -128,6 +128,9 @@ class WidgetFactory { widget.height = 100; widget.customProperties.background_color = 1; widget.customProperties.font_color = 0; + widget.customProperties.on_value = 1; + widget.customProperties.off_value = 0; + widget.customProperties.toggle = false; break; case 'Input': widget.minWidth = 200; @@ -146,6 +149,7 @@ class WidgetFactory { widget.customProperties.rangeUseMinMax = true; widget.customProperties.showUnit = true; widget.customProperties.continous_update = false; + widget.customProperties.default_value = 0; break; case 'Gauge': From 5c95cbf05f7db8c877291c2cc8c2ee58078c7956 Mon Sep 17 00:00:00 2001 From: Laura Fuentes Grau Date: Sun, 29 Mar 2020 14:11:57 +0200 Subject: [PATCH 151/391] NumberInput Widget now droppable/editable --- src/widget/edit-widget/edit-widget-control-creator.js | 2 +- src/widget/widget-factory.js | 2 +- src/widget/widgets/input.js | 6 ++++-- 3 files changed, 6 insertions(+), 4 deletions(-) diff --git a/src/widget/edit-widget/edit-widget-control-creator.js b/src/widget/edit-widget/edit-widget-control-creator.js index e79b6b8..ec6856e 100644 --- a/src/widget/edit-widget/edit-widget-control-creator.js +++ b/src/widget/edit-widget/edit-widget-control-creator.js @@ -152,7 +152,7 @@ export default function CreateControls(widgetType = null, widget = null, session ); break; - case 'Input': + case 'NumberInput': DialogControls.push( handleChange(e)} />, handleChange(e)} /> diff --git a/src/widget/widget-factory.js b/src/widget/widget-factory.js index 5b7d5a2..4fabaa6 100644 --- a/src/widget/widget-factory.js +++ b/src/widget/widget-factory.js @@ -132,7 +132,7 @@ class WidgetFactory { widget.customProperties.off_value = 0; widget.customProperties.toggle = false; break; - case 'Input': + case 'NumberInput': widget.minWidth = 200; widget.minHeight = 50; widget.width = 200; diff --git a/src/widget/widgets/input.js b/src/widget/widgets/input.js index bc27f3e..d4ac133 100644 --- a/src/widget/widgets/input.js +++ b/src/widget/widgets/input.js @@ -76,7 +76,7 @@ class WidgetInput extends Component { render() { return (
    - +
    {this.props.widget.name} @@ -84,7 +84,9 @@ class WidgetInput extends Component { this.handleKeyPress(e) } onBlur={ (e) => this.valueChanged(this.state.value) } onChange={ (e) => this.valueIsChanging(e.target.value) } placeholder="Enter value" value={ this.state.value } /> - {this.state.unit} + + {this.state.unit} + From 8e7340b171d0e801398511eee499d71d1734e2a6 Mon Sep 17 00:00:00 2001 From: Laura Fuentes Grau Date: Sun, 29 Mar 2020 15:10:02 +0200 Subject: [PATCH 152/391] fix for PlotTable: PlotLegend now only created if signals are selected --- src/dashboard/dashboard.js | 7 +------ src/widget/widgets/plot-table.js | 21 +++++++++++++-------- 2 files changed, 14 insertions(+), 14 deletions(-) diff --git a/src/dashboard/dashboard.js b/src/dashboard/dashboard.js index df42e37..98c3d40 100644 --- a/src/dashboard/dashboard.js +++ b/src/dashboard/dashboard.js @@ -264,12 +264,7 @@ class Dashboard extends Component { deleteWidget(widget, index) { - /*const widgets = this.state.dashboard.get('widgets'); - delete widgets[index]; - - const dashboard = this.state.dashboard.set('widgets'); - - this.setState({ dashboard });*/ + AppDispatcher.dispatch({ type: 'widgets/start-remove', data: widget, diff --git a/src/widget/widgets/plot-table.js b/src/widget/widgets/plot-table.js index 3e8e8f1..e16b7b1 100644 --- a/src/widget/widgets/plot-table.js +++ b/src/widget/widgets/plot-table.js @@ -92,14 +92,12 @@ class WidgetPlotTable extends Component { render() { let checkBoxes = []; - + let icData = []; + let legendSignals = []; // Data passed to plot - if (this.props.config == null) { - return
    ; - } + if (this.props.config) { const ic = this.props.config.icID; - let icData = []; if (this.props.data[ic] != null && this.props.data[ic].output != null && this.props.data[ic].output.values != null) { icData = this.props.data[ic].output.values.filter((values, index) => ( @@ -121,7 +119,7 @@ class WidgetPlotTable extends Component { } // Prepare an array with the signals to show in the legend - var legendSignals = this.state.preselectedSignals.reduce( (accum, signal, i) => { + legendSignals = this.state.preselectedSignals.reduce( (accum, signal, i) => { if (this.state.signals.includes(signal.index)) { accum.push({ index: signal.index, @@ -130,7 +128,12 @@ class WidgetPlotTable extends Component { }); } return accum; - }, []); + }, []);} + + let showLegend = false; + if(legendSignals !== []){ + showLegend = true; + } return (
    @@ -159,7 +162,9 @@ class WidgetPlotTable extends Component { />
    - + {showLegend? ( + ) : (
    ) + } ); From 050d21cf29fb0e36c5419b7d1e0036d9b6036f3e Mon Sep 17 00:00:00 2001 From: Laura Fuentes Grau Date: Sun, 29 Mar 2020 15:15:42 +0200 Subject: [PATCH 153/391] PlotTable: time now editable --- src/widget/edit-widget/edit-widget-control-creator.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/widget/edit-widget/edit-widget-control-creator.js b/src/widget/edit-widget/edit-widget-control-creator.js index ec6856e..2cd37a4 100644 --- a/src/widget/edit-widget/edit-widget-control-creator.js +++ b/src/widget/edit-widget/edit-widget-control-creator.js @@ -101,7 +101,7 @@ export default function CreateControls(widgetType = null, widget = null, session DialogControls.push( handleChange(e)} />, handleChange(e)} />, - handleChange(e)} />, + handleChange(e)} />, handleChange(e)} /> ); break; From 2cf7789bb23a71084c9e06f352cc6a55540d1c33 Mon Sep 17 00:00:00 2001 From: Laura Fuentes Grau Date: Mon, 30 Mar 2020 16:28:52 +0200 Subject: [PATCH 154/391] fix for NumberInput and Gauge: both can now be connected to a signal, fix for Topology: can now be dropped --- src/widget/widget.js | 2 +- src/widget/widgets/gauge.js | 3 ++- src/widget/widgets/topology.js | 2 +- 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/src/widget/widget.js b/src/widget/widget.js index 293cb19..31a7be2 100644 --- a/src/widget/widget.js +++ b/src/widget/widget.js @@ -144,7 +144,7 @@ class Widget extends React.Component { } else if (widget.type === 'Button') { return this.inputDataChanged(widget, value)} signals={this.state.signals} /> } else if (widget.type === 'NumberInput') { - return this.inputDataChanged(widget, value)} /> + return this.inputDataChanged(widget, value)} signals={this.state.signals} /> } else if (widget.type === 'Slider') { return this.props.onWidgetStatusChange(w, this.props.index) } onInputChanged={value => this.inputDataChanged(widget, value)} signals={this.state.signals}/> } else if (widget.type === 'Gauge') { diff --git a/src/widget/widgets/gauge.js b/src/widget/widgets/gauge.js index 1feae3f..4079c2d 100644 --- a/src/widget/widgets/gauge.js +++ b/src/widget/widgets/gauge.js @@ -89,6 +89,7 @@ class WidgetGauge extends Component { || props.data[ICid].output.values.length === 0 || props.data[ICid].output.values[0].length === 0) { returnState["value"] = 0; + return returnState; } // memorize if min or max value is updated @@ -191,7 +192,7 @@ class WidgetGauge extends Component { if (zones != null) { // adapt range 0-100 to actual min-max const step = (maxValue - minValue) / 100; - + zones = zones.map(zone => { return Object.assign({}, zone, { min: (zone.min * step) + +minValue, max: zone.max * step + +minValue, strokeStyle: '#' + zone.strokeStyle }); }); diff --git a/src/widget/widgets/topology.js b/src/widget/widgets/topology.js index 6d98195..dcdc57d 100644 --- a/src/widget/widgets/topology.js +++ b/src/widget/widgets/topology.js @@ -139,7 +139,7 @@ class WidgetTopology extends React.Component { } } else { // No file has been selected - if (!this.props.widget.customProperties.file) { + if (!this.props.widget.customProperties.file&& this.state.message !== 'Select a topology model first.') { this.setState({ 'dashboardState': 'show_message', 'message': 'Select a topology model first.'}); From 4b79efec36061d0e1d9777c2af2a50b85bc41eb3 Mon Sep 17 00:00:00 2001 From: Laura Fuentes Grau Date: Mon, 30 Mar 2020 17:15:26 +0200 Subject: [PATCH 155/391] Topology: now adjusted to new React SVG Pan Zoom Version --- src/widget/widgets/topology.js | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/src/widget/widgets/topology.js b/src/widget/widgets/topology.js index dcdc57d..d9e5d82 100644 --- a/src/widget/widgets/topology.js +++ b/src/widget/widgets/topology.js @@ -16,7 +16,7 @@ ******************************************************************************/ import React from 'react'; -import {ReactSVGPanZoom} from 'react-svg-pan-zoom'; +import {UncontrolledReactSVGPanZoom} from 'react-svg-pan-zoom'; import config from '../../config'; import '../../styles/simple-spinner.css'; import { cimsvg } from 'libcimsvg'; @@ -149,6 +149,13 @@ class WidgetTopology extends React.Component { render() { var markup = null; + const miniatureProps = { + miniaturePosition: "none", + } + + const toolbarProps = { + toolbarPosition: "none" + } switch(this.state.dashboardState) { case 'loading': @@ -157,12 +164,12 @@ class WidgetTopology extends React.Component { markup =
    { this.state.message }
    ; break; default: markup = (
    - this.Viewer = Viewer} style={{outline: "1px solid grey"}} detectAutoPan={false} - miniaturePosition="none" - toolbarPosition="none" + toolbarProps={toolbarProps} + miniatureProps={miniatureProps} background="white" tool="pan" width={this.props.widget.width-2} height={this.props.widget.height-2} > @@ -173,7 +180,7 @@ class WidgetTopology extends React.Component { - +
    ); } return markup; From 9657e0c571d7ddde474e39f83e394ac7ce48e538 Mon Sep 17 00:00:00 2001 From: Laura Fuentes Grau Date: Mon, 30 Mar 2020 22:40:16 +0200 Subject: [PATCH 156/391] wip: make HTML Widget editable --- .../edit-widget/edit-widget-html-content.js | 56 ++++++++++++++----- 1 file changed, 43 insertions(+), 13 deletions(-) diff --git a/src/widget/edit-widget/edit-widget-html-content.js b/src/widget/edit-widget/edit-widget-html-content.js index 6ad836b..07f89fb 100644 --- a/src/widget/edit-widget/edit-widget-html-content.js +++ b/src/widget/edit-widget/edit-widget-html-content.js @@ -22,28 +22,58 @@ class EditWidgetHTMLContent extends React.Component { constructor(props) { super(props); - this.state = { - widget: {} - }; - } + let value = ""; + let parts = props.controlId.split('.'); + if (parts.length === 1) { + // not a customProperty + value=props.widget[props.controlId] + } else if(parts.length === 2){ + // a custom property + value=props.widget[parts[0]][parts[1]] + } else { + value="controlID contains too many dots" + } - handleKeyIgnore(event){ - // This function prevents a keystroke from beeing handled by dialog.js - event.stopPropagation(); + this.state = { + value: value + }; } static getDerivedStateFromProps(props, state){ + + let value = ""; + let parts = props.controlId.split('.'); + if (parts.length === 1) { + // not a customProperty + value=props.widget[props.controlId] + } else if(parts.length === 2){ + // a custom property + value=props.widget[parts[0]][parts[1]] + } else { + value="controlID contains too many dots" + } + return { - widget: props.widget - }; + value: value + } } + handleKeyIgnore(event){ + // This function prevents a keystroke from beeing handled by dialog.js + event.stopPropagation(); + } + + render() { - return - HTML Content - this.props.handleChange(e)} /> - ; + return ( + + HTML Content + this.props.handleChange(e)} /> + + + ); } } + export default EditWidgetHTMLContent; From 8b080710876b6c1caf14c8708c24cded89a6e68a Mon Sep 17 00:00:00 2001 From: Sonja Happ Date: Wed, 1 Apr 2020 09:05:38 +0200 Subject: [PATCH 157/391] Fix info on default user in readme --- README.md | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index e365f1a..906a38c 100644 --- a/README.md +++ b/README.md @@ -4,9 +4,9 @@ This is VILLASweb, the website displaying and processing simulation data in the web browser. The term __frontend__ refers to this project, the actual website. -The frontend connects to __two__ backends: _VILLASweb-backend_ and _VILLASnode_. +The frontend connects to __two__ backends: _VILLASweb-backend-go_ and _VILLASnode_. -VILLASnode provides actual simulation data via websockets. VILLASweb-backend provides any other data like user accounts, infrastructure components and configurations, dashboards etc. +VILLASnode provides actual simulation data via websockets. VILLASweb-backend-go provides any other data like user accounts, infrastructure components and configurations, dashboards etc. For more information on the backends see their repositories. @@ -33,8 +33,6 @@ $ npm install $ npm start ``` -The default user and password are configured in the `config.js` file of the _backend_. By default they are: __admin__ / __admin__. - ## Copyright 2020, Institute for Automation of Complex Power Systems, EONERC From 30c21ddb1afd8e1020a59825d17b6d52bea35715 Mon Sep 17 00:00:00 2001 From: Sonja Happ Date: Wed, 1 Apr 2020 09:16:00 +0200 Subject: [PATCH 158/391] Add info on test mode of backend including test users. --- README.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/README.md b/README.md index 906a38c..41ba215 100644 --- a/README.md +++ b/README.md @@ -33,6 +33,11 @@ $ npm install $ npm start ``` +We recommend to start the VILLASweb-backend-go before the frontend. +If you want to use test data (including some test users), you can start the backend with the parameter `-mode=test`. +Please check the repository of the VILLASweb-backend-go to find information on the test user login names and passwords. +The testing mode is NOT intended for production deployments. + ## Copyright 2020, Institute for Automation of Complex Power Systems, EONERC From f3d0576dd6166b1d05b4a8898595724891ad2c2a Mon Sep 17 00:00:00 2001 From: Laura Fuentes Grau Date: Thu, 2 Apr 2020 15:55:05 +0200 Subject: [PATCH 159/391] HTML content: pressing enter doesn't reload page anymore, Orientation: type can now be changed --- src/widget/edit-widget/edit-widget-html-content.js | 8 ++++---- src/widget/edit-widget/edit-widget-orientation.js | 5 ++++- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/src/widget/edit-widget/edit-widget-html-content.js b/src/widget/edit-widget/edit-widget-html-content.js index 07f89fb..1df71d5 100644 --- a/src/widget/edit-widget/edit-widget-html-content.js +++ b/src/widget/edit-widget/edit-widget-html-content.js @@ -60,15 +60,15 @@ class EditWidgetHTMLContent extends React.Component { handleKeyIgnore(event){ // This function prevents a keystroke from beeing handled by dialog.js - event.stopPropagation(); - } - + event.stopPropagation(); + } + render() { return ( HTML Content - this.props.handleChange(e)} /> + this.props.handleChange(e)} /> ); diff --git a/src/widget/edit-widget/edit-widget-orientation.js b/src/widget/edit-widget/edit-widget-orientation.js index aee9c14..320d476 100644 --- a/src/widget/edit-widget/edit-widget-orientation.js +++ b/src/widget/edit-widget/edit-widget-orientation.js @@ -38,7 +38,9 @@ class EditWidgetOrientation extends Component { } handleOrientationChange(orientation) { - this.props.handleChange({ target: { id: 'orientation', value: orientation } }); + console.log("handle OrinetationChange was called. the orientation: " + orientation); + + this.props.handleChange({ target: { id: 'customProperties.orientation', value: orientation } }); } render() { @@ -55,6 +57,7 @@ class EditWidgetOrientation extends Component { Object.keys(WidgetSlider.OrientationTypes).map( (type) => { let value = WidgetSlider.OrientationTypes[type].value; let name = WidgetSlider.OrientationTypes[type].name; + console.log("value: " + value + " name: " + name) return ( this.handleOrientationChange(value)}> From 834efecb8a56b822e8c48f17861a10ddb0d61bee Mon Sep 17 00:00:00 2001 From: Laura Fuentes Grau Date: Thu, 2 Apr 2020 19:35:40 +0200 Subject: [PATCH 160/391] Slider Widget now works in vertical mode --- .../edit-widget/edit-widget-orientation.js | 11 +++++--- src/widget/widgets/slider.js | 26 +++---------------- 2 files changed, 12 insertions(+), 25 deletions(-) diff --git a/src/widget/edit-widget/edit-widget-orientation.js b/src/widget/edit-widget/edit-widget-orientation.js index 320d476..5ac835f 100644 --- a/src/widget/edit-widget/edit-widget-orientation.js +++ b/src/widget/edit-widget/edit-widget-orientation.js @@ -38,9 +38,15 @@ class EditWidgetOrientation extends Component { } handleOrientationChange(orientation) { - console.log("handle OrinetationChange was called. the orientation: " + orientation); - this.props.handleChange({ target: { id: 'customProperties.orientation', value: orientation } }); + this.handleNewDimensions(this.state.widget.width,this.state.widget.height,this.state.widget.minWidth,this.state.widget.minHeight); + } + + handleNewDimensions(width,height,minWidth,minHeight){ + this.props.handleChange({ target: { id: 'height', value: width } }); + this.props.handleChange({ target: { id: 'width', value: height } }); + this.props.handleChange({ target: { id: 'minHeight', value: minWidth } }); + this.props.handleChange({ target: { id: 'minWidth', value: minHeight } }); } render() { @@ -57,7 +63,6 @@ class EditWidgetOrientation extends Component { Object.keys(WidgetSlider.OrientationTypes).map( (type) => { let value = WidgetSlider.OrientationTypes[type].value; let name = WidgetSlider.OrientationTypes[type].name; - console.log("value: " + value + " name: " + name) return ( this.handleOrientationChange(value)}> diff --git a/src/widget/widgets/slider.js b/src/widget/widgets/slider.js index bd4a6fe..4b9bba5 100644 --- a/src/widget/widgets/slider.js +++ b/src/widget/widgets/slider.js @@ -57,7 +57,7 @@ class WidgetSlider extends Component { if (props.widget.customProperties.default_value && state.value === undefined) { returnState["value"] = props.widget.customProperties.default_value; } - + // Update unit (assuming there is exactly one signal for this widget) let signalID = props.widget.signalIDs[0]; let signal = props.signals.find(sig => sig.id === signalID); @@ -76,6 +76,7 @@ class WidgetSlider extends Component { componentDidUpdate(prevProps: Readonly

    , prevState: Readonly, snapshot: SS): void { // Check if the orientation changed, update the size if it did + // this part didn't work -> dimensions and constraints are now handled by the edit orientation component if (this.props.widget.customProperties.orientation !== prevProps.widget.customProperties.orientation) { let baseWidget = this.props.widget; @@ -125,33 +126,14 @@ class WidgetSlider extends Component { }); return ( - !isVertical? (

    -
    { fields.control }
    + { fields.control } { fields.value } + {this.props.widget.customProperties.showUnit && fields.unit}
    - ) : ( -
    - this.valueIsChanging(v) } onAfterChange={ (v) => this.valueChanged(v) }/>, -
    - ) ); } } export default WidgetSlider; -/*!isVertical? ( -
    - -
    { fields.control }
    - { fields.value } -
    -) : ( -
    - - { fields.control } - { fields.value } - { this.props.widget.customProperties.showUnit && fields.unit } -
    -)*/ From 0f84c7197efd8c49639e7a8c0c3d292afe2ef8cc Mon Sep 17 00:00:00 2001 From: Sonja Happ Date: Mon, 6 Apr 2020 16:48:59 +0200 Subject: [PATCH 161/391] Show name of IC on config edit instead of UUID --- src/componentconfig/edit-config.js | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/componentconfig/edit-config.js b/src/componentconfig/edit-config.js index 791fc4d..e629347 100644 --- a/src/componentconfig/edit-config.js +++ b/src/componentconfig/edit-config.js @@ -17,8 +17,6 @@ import React from 'react'; import {FormGroup, FormControl, FormLabel} from 'react-bootstrap'; -import _ from 'lodash'; - import Dialog from '../common/dialogs/dialog'; import ParametersEditor from '../common/parameters-editor'; import SelectFile from "../file/select-file"; @@ -104,7 +102,7 @@ class EditConfigDialog extends React.Component { render() { const ICOptions = this.props.ics.map(s => - + ); return ( From 2c77cc46dcf963e25a2c67e0703e3cd8456bbe93 Mon Sep 17 00:00:00 2001 From: Sonja Happ Date: Tue, 7 Apr 2020 13:30:54 +0200 Subject: [PATCH 162/391] Reduce minimum width of number input widget (works on #193) --- src/widget/widget-factory.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/widget/widget-factory.js b/src/widget/widget-factory.js index 4fabaa6..b32200d 100644 --- a/src/widget/widget-factory.js +++ b/src/widget/widget-factory.js @@ -133,7 +133,7 @@ class WidgetFactory { widget.customProperties.toggle = false; break; case 'NumberInput': - widget.minWidth = 200; + widget.minWidth = 150; widget.minHeight = 50; widget.width = 200; widget.height = 50; From 15e3f041110fb3712c0a2a2f05f16cb9f2398316 Mon Sep 17 00:00:00 2001 From: Sonja Happ Date: Tue, 7 Apr 2020 13:33:34 +0200 Subject: [PATCH 163/391] Remove sizing parameters from number input widget (works on #193) --- src/widget/widgets/input.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/widget/widgets/input.js b/src/widget/widgets/input.js index d4ac133..2ad1fea 100644 --- a/src/widget/widgets/input.js +++ b/src/widget/widgets/input.js @@ -78,10 +78,10 @@ class WidgetInput extends Component {
    -
    + {this.props.widget.name} - + this.handleKeyPress(e) } onBlur={ (e) => this.valueChanged(this.state.value) } onChange={ (e) => this.valueIsChanging(e.target.value) } placeholder="Enter value" value={ this.state.value } /> From 30f80ecdee13b4ab34c62ef06d62904cb5029b3f Mon Sep 17 00:00:00 2001 From: Laura Fuentes Grau Date: Fri, 17 Apr 2020 18:32:09 +0200 Subject: [PATCH 164/391] Widget and Context Menu layering now works. Box Widget always has lowest z value when dropped: #165 & #79 --- src/dashboard/dashboard.js | 8 +++++--- src/widget/dropzone.js | 20 ++++++++++---------- src/widget/widget-area.js | 2 +- src/widget/widget-container.js | 2 +- src/widget/widget-context-menu.js | 6 +++--- 5 files changed, 20 insertions(+), 18 deletions(-) diff --git a/src/dashboard/dashboard.js b/src/dashboard/dashboard.js index 98c3d40..2fb1596 100644 --- a/src/dashboard/dashboard.js +++ b/src/dashboard/dashboard.js @@ -206,10 +206,12 @@ class Dashboard extends Component { widgetChange(widget, index, callback = null){ - let tempChanges = this.state.widgetChangeData; - tempChanges.push(widget); + AppDispatcher.dispatch({ + type: 'widgets/start-edit', + token: this.state.sessionToken, + data: widget + }); - this.setState({ widgetChangeData: tempChanges}) } diff --git a/src/widget/dropzone.js b/src/widget/dropzone.js index f962719..530ec1e 100644 --- a/src/widget/dropzone.js +++ b/src/widget/dropzone.js @@ -28,20 +28,20 @@ const dropzoneTarget = { position.y -= dropzoneRect.top; // Z-Index is one more the top most children - let foundZ = props.children.reduce( (maxZ, currentChildren) => { - if (currentChildren.props != null) { + let foundZ = props.widgets.reduce( (maxZ, currentWidget) => { + if (currentWidget != null) { // Is there a simpler way? Is not easy to expose a getter in a Container.create(Component) - let widget = currentChildren.props.data; - if (widget && widget.z) { - if (widget.z > maxZ) { - return widget.z; + if (currentWidget.z > maxZ) { + return currentWidget.z; } - } } - + return maxZ; - }, 0); - position.z = foundZ >= 100? foundZ : ++foundZ; + }, 0) + position.z = foundZ >= 100? foundZ : foundZ += 10; + if(monitor.getItem().name === "Box"){ + position.z = 0; + } props.onDrop(monitor.getItem(), position); } diff --git a/src/widget/widget-area.js b/src/widget/widget-area.js index b4d31f0..0686066 100644 --- a/src/widget/widget-area.js +++ b/src/widget/widget-area.js @@ -50,7 +50,7 @@ class WidgetArea extends React.Component { return absolutHeight > currentHeight ? absolutHeight : currentHeight; }, 0); - return + return {this.props.children} diff --git a/src/widget/widget-container.js b/src/widget/widget-container.js index 31360e2..5b2e064 100644 --- a/src/widget/widget-container.js +++ b/src/widget/widget-container.js @@ -26,7 +26,7 @@ class WidgetContainer extends React.Component { height: Number(this.props.widget.height), left: Number(this.props.widget.x), top: Number(this.props.widget.y), - zindex: Number(this.props.widget.z), + zIndex: Number(this.props.widget.z), position: 'absolute' }; diff --git a/src/widget/widget-context-menu.js b/src/widget/widget-context-menu.js index bf83fc8..0ce2604 100644 --- a/src/widget/widget-context-menu.js +++ b/src/widget/widget-context-menu.js @@ -34,7 +34,7 @@ class WidgetContextMenu extends React.Component { }; moveAbove = event => { - this.props.widget.z++; + this.props.widget.z += 10; if (this.props.widget.z > 100) { this.props.widget.z = 100; } @@ -53,7 +53,7 @@ class WidgetContextMenu extends React.Component { }; moveUnderneath = event => { - this.props.widget.z--; + this.props.widget.z -= 10; if (this.props.widget.z < 0) { this.props.widget.z = 0; } @@ -90,7 +90,7 @@ class WidgetContextMenu extends React.Component { render() { const isLocked = this.props.widget.locked; const ContextMenu = () => ( - + Edit Delete From 958e1f78e125fa4dde690dd5836cc1f3add17ec9 Mon Sep 17 00:00:00 2001 From: Laura Fuentes Grau Date: Fri, 17 Apr 2020 19:09:31 +0200 Subject: [PATCH 165/391] NumberInput: unit now optional, #193 --- src/widget/edit-widget/edit-widget-control-creator.js | 3 ++- src/widget/widget-factory.js | 1 + src/widget/widgets/input.js | 4 ++++ 3 files changed, 7 insertions(+), 1 deletion(-) diff --git a/src/widget/edit-widget/edit-widget-control-creator.js b/src/widget/edit-widget/edit-widget-control-creator.js index 2cd37a4..78d1b28 100644 --- a/src/widget/edit-widget/edit-widget-control-creator.js +++ b/src/widget/edit-widget/edit-widget-control-creator.js @@ -155,7 +155,8 @@ export default function CreateControls(widgetType = null, widget = null, session case 'NumberInput': DialogControls.push( handleChange(e)} />, - handleChange(e)} /> + handleChange(e)} />, + handleChange(e)} /> ); break; diff --git a/src/widget/widget-factory.js b/src/widget/widget-factory.js index b32200d..7c6f416 100644 --- a/src/widget/widget-factory.js +++ b/src/widget/widget-factory.js @@ -137,6 +137,7 @@ class WidgetFactory { widget.minHeight = 50; widget.width = 200; widget.height = 50; + widget.customProperties.showUnit = false; break; case 'Slider': widget.minWidth = 380; diff --git a/src/widget/widgets/input.js b/src/widget/widgets/input.js index 2ad1fea..59e2290 100644 --- a/src/widget/widgets/input.js +++ b/src/widget/widgets/input.js @@ -84,9 +84,13 @@ class WidgetInput extends Component { this.handleKeyPress(e) } onBlur={ (e) => this.valueChanged(this.state.value) } onChange={ (e) => this.valueIsChanging(e.target.value) } placeholder="Enter value" value={ this.state.value } /> + {this.props.widget.customProperties.showUnit? ( {this.state.unit} + ):( +
    + )}
    From e43c780ba351bb64abb8c49f2e4eb18c7d941f99 Mon Sep 17 00:00:00 2001 From: Laura Fuentes Grau Date: Sun, 19 Apr 2020 19:16:02 +0200 Subject: [PATCH 166/391] Gauge Widget and its edit options now work --- src/widget/widgets/gauge.js | 47 +++++++++++++++++++++++++++---------- 1 file changed, 35 insertions(+), 12 deletions(-) diff --git a/src/widget/widgets/gauge.js b/src/widget/widgets/gauge.js index 4079c2d..cd778ad 100644 --- a/src/widget/widgets/gauge.js +++ b/src/widget/widgets/gauge.js @@ -31,17 +31,20 @@ class WidgetGauge extends Component { unit: '', minValue: null, maxValue: null, + useColorZones: false, + useMinMax: false, + useMinMaxChange: false, }; } componentDidMount() { this.gauge = new Gauge(this.gaugeCanvas).setOptions(this.computeGaugeOptions(this.props.widget)); - //this.gauge.maxValue = this.state.maxValue; - //this.gauge.setMinValue(this.state.minValue); + this.gauge.maxValue = this.state.maxValue; + this.gauge.setMinValue(this.state.minValue); this.gauge.animationSpeed = 30; - //this.gauge.set(this.state.value); + this.gauge.set(this.state.value); - //this.updateLabels(this.state.minValue, this.state.maxValue); + this.updateLabels(this.state.minValue, this.state.maxValue); } componentDidUpdate(prevProps: Readonly

    , prevState: Readonly, snapshot: SS): void { @@ -57,9 +60,19 @@ class WidgetGauge extends Component { this.gauge.set(this.state.value) } + if(prevState.useMinMax === true && this.state.useMinMax === false){ + this.setState({useMinMaxChange: true}); + } + // update labels - if(prevState.minValue !== this.state.minValue || prevState.maxValue !== this.state.maxValue){ - this.updateLabels(this.state.minValue, this.state.maxValue) + if(prevState.minValue !== this.state.minValue || prevState.maxValue !== this.state.maxValue || prevState.useColorZones !== this.state.useColorZones + || prevState.useMinMax !== this.state.useMinMax){ + this.gauge = new Gauge(this.gaugeCanvas).setOptions(this.computeGaugeOptions(this.props.widget)); + this.gauge.maxValue = this.state.maxValue; + this.gauge.setMinValue(this.state.minValue); + this.gauge.animationSpeed = 30; + this.gauge.set(this.state.value); + this.updateLabels(this.state.minValue, this.state.maxValue) } } @@ -69,9 +82,10 @@ class WidgetGauge extends Component { if(props.widget.signalIDs.length === 0){ return null; } - let returnState = {} + returnState["useColorZones"] = props.widget.customProperties.colorZones; + // Update unit (assuming there is exactly one signal for this widget) let signalID = props.widget.signalIDs[0]; let widgetSignal = props.signals.find(sig => sig.id === signalID); @@ -105,7 +119,8 @@ class WidgetGauge extends Component { const value = Math.round(signalData[signalData.length - 1].y * 1e3) / 1e3; let minValue = null; let maxValue = null; - if (state.value !== value && value != null) { + + if ((state.value !== value && value != null) || props.widget.customProperties.valueUseMinMax || state.useMinMaxChange) { //value has changed updateValue = true; @@ -114,17 +129,18 @@ class WidgetGauge extends Component { minValue = state.minValue; maxValue = state.maxValue; - - if (minValue == null) { + + if (minValue == null || state.useMinMaxChange) { minValue = value - 0.5; updateLabels = true; updateMinValue = true; } - if (maxValue == null) { + if (maxValue == null || state.useMinMaxChange) { maxValue = value + 0.5; updateLabels = true; updateMaxValue = true; + returnState["useMinMaxChange"] = false; } if (props.widget.customProperties.valueUseMinMax) { @@ -141,7 +157,7 @@ class WidgetGauge extends Component { } } - if (updateLabels === false) { + if (updateLabels === false && state.gauge) { // check if min/max changed if (minValue > state.gauge.minValue) { minValue = state.gauge.minValue; @@ -155,6 +171,13 @@ class WidgetGauge extends Component { } } + if(props.widget.customProperties.valueUseMinMax !== state.useMinMax){ + returnState["useMinMax"] = props.widget.customProperties.valueUseMinMax; + } + if(props.widget.customProperties.colorZones !== state.useColorZones){ + returnState["useColorZones"] = props.widget.customProperties.colorZones; + } + // prepare returned state if(updateValue === true){ returnState["value"] = value; From 3c055ebeaa7513bcca7ac17ba9a36d4e8014261a Mon Sep 17 00:00:00 2001 From: Laura Fuentes Grau Date: Sun, 19 Apr 2020 19:56:06 +0200 Subject: [PATCH 167/391] Table Widget now displays 'no entries' when it contains no elements --- src/widget/widgets/table.js | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/src/widget/widgets/table.js b/src/widget/widgets/table.js index 54426bd..a7ef37b 100644 --- a/src/widget/widgets/table.js +++ b/src/widget/widgets/table.js @@ -92,6 +92,14 @@ class WidgetTable extends Component { } render() { + + let rows = this.state.rows; + if(rows.length === 0){ + rows.push({ + name: "no entries" + }) + } + var columns = [ , @@ -102,7 +110,7 @@ class WidgetTable extends Component { return (

    -
    Max: this.props.handleChange(e)} /> + value={ this.state.maxValue} + onChange={e => this.handleMaxChange(e)} />
    +
    { columns }
    From ea42510f39375b50d176620ef51e4a0e261c601e Mon Sep 17 00:00:00 2001 From: Laura Fuentes Grau Date: Thu, 23 Apr 2020 17:52:58 +0200 Subject: [PATCH 168/391] Box widget opacity now editable --- .../edit-widget-control-creator.js | 3 ++- .../edit-widget/edit-widget-number-control.js | 20 +++++++++++-------- src/widget/widget-factory.js | 1 + src/widget/widgets/box.js | 2 +- 4 files changed, 16 insertions(+), 10 deletions(-) diff --git a/src/widget/edit-widget/edit-widget-control-creator.js b/src/widget/edit-widget/edit-widget-control-creator.js index 78d1b28..ae457b7 100644 --- a/src/widget/edit-widget/edit-widget-control-creator.js +++ b/src/widget/edit-widget/edit-widget-control-creator.js @@ -129,7 +129,8 @@ export default function CreateControls(widgetType = null, widget = null, session case 'Box': DialogControls.push( handleChange(e)} />, - handleChange(e)} /> + handleChange(e)} />, + handleChange(e)} /> ); break; case 'Label': diff --git a/src/widget/edit-widget/edit-widget-number-control.js b/src/widget/edit-widget/edit-widget-number-control.js index 7b4ffa5..5354863 100644 --- a/src/widget/edit-widget/edit-widget-number-control.js +++ b/src/widget/edit-widget/edit-widget-number-control.js @@ -25,21 +25,25 @@ class EditWidgetNumberControl extends Component { this.state = { widget: { customProperties:{} - } - }; + } + }; } - + static getDerivedStateFromProps(props, state){ return{ - widget: props.widget - }; - } + widget: props.widget + }; + } - render() { + render() { + let step = 1; + if(this.props.controlId ==='customProperties.background_color_opacity'){ + step = 0.1; + } return ( {this.props.label} - this.props.handleChange(e)} /> + this.props.handleChange(e)} /> ); } diff --git a/src/widget/widget-factory.js b/src/widget/widget-factory.js index 7c6f416..eaa80d9 100644 --- a/src/widget/widget-factory.js +++ b/src/widget/widget-factory.js @@ -170,6 +170,7 @@ class WidgetFactory { widget.width = 100; widget.height = 100; widget.customProperties.border_color = 0; + widget.customProperties.background_color_opacity = 0.5; widget.z = 0; break; case 'HTML': diff --git a/src/widget/widgets/box.js b/src/widget/widgets/box.js index 758dec3..ff470f3 100644 --- a/src/widget/widgets/box.js +++ b/src/widget/widgets/box.js @@ -27,7 +27,7 @@ class WidgetBox extends Component { let colorStyle = { borderColor: colors[this.props.widget.customProperties.border_color], backgroundColor: colors[this.props.widget.customProperties.background_color], - opacity: this.props.widget.customProperties.background_color_opacity + opacity: this.props.widget.customProperties.background_color_opacity, } return ( From 78e13798f9e5972d7197afcc660e581e1d6ff660 Mon Sep 17 00:00:00 2001 From: Laura Fuentes Grau Date: Thu, 23 Apr 2020 18:11:56 +0200 Subject: [PATCH 169/391] Image widget : fix for lockAspect edit option --- src/widget/edit-widget/edit-widget.js | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/widget/edit-widget/edit-widget.js b/src/widget/edit-widget/edit-widget.js index 46b92a1..8e79531 100644 --- a/src/widget/edit-widget/edit-widget.js +++ b/src/widget/edit-widget/edit-widget.js @@ -57,8 +57,10 @@ class EditWidgetDialog extends React.Component { const file = this.props.files.find(element => element.id === fileId); // scale width to match aspect + if(file.dimensions){ const aspectRatio = file.dimensions.width / file.dimensions.height; changeObject.width = this.state.temporal.height * aspectRatio; + } return changeObject; } @@ -73,13 +75,13 @@ class EditWidgetDialog extends React.Component { // not a customProperty customProperty = false; } - - if (e.target.id === 'lockAspect') { + + if (parts[1] === 'lockAspect') { //not a customProperty customProperty ? changeObject[parts[0]][parts[1]] = e.target.checked : changeObject[e.target.id] = e.target.checked; // correct image aspect if turned on - if (e.target.checked) { + if (e.target.checked && this.state.temporal.customProperties.file) { changeObject = this.assignAspectRatio(changeObject, this.state.temporal.customProperties.file); } } else if (e.target.id.includes('file')) { From cf41a751c3a94ae82f9722698ac887d11e6f4c47 Mon Sep 17 00:00:00 2001 From: Laura Fuentes Grau Date: Fri, 24 Apr 2020 14:57:10 +0200 Subject: [PATCH 170/391] Cancel Editing now deletes newly dropped widgets --- src/dashboard/dashboard.js | 40 +++++++++++++++----------------------- 1 file changed, 16 insertions(+), 24 deletions(-) diff --git a/src/dashboard/dashboard.js b/src/dashboard/dashboard.js index 2fb1596..630c6ce 100644 --- a/src/dashboard/dashboard.js +++ b/src/dashboard/dashboard.js @@ -185,17 +185,6 @@ class Dashboard extends Component { }); - /*let widgets = []; - widgets = this.state.dashboard.get('widgets'); - - const widgetKey = Dashboard.getNewWidgetKey(); - widgets[widgetKey] = widget; - - const dashboard = this.state.dashboard.set('widgets',widgets); - - // this.increaseHeightWithWidget(widget); - - this.setState({ dashboard });*/ }; @@ -205,13 +194,9 @@ class Dashboard extends Component { } widgetChange(widget, index, callback = null){ - - AppDispatcher.dispatch({ - type: 'widgets/start-edit', - token: this.state.sessionToken, - data: widget - }); - + let temp = this.state.widgetChangeData; + temp.push(widget); + this.setState({widgetChangeData: temp}); } @@ -295,7 +280,7 @@ class Dashboard extends Component { data: widget }); }); - this.setState({ editing: false }); + this.setState({ editing: false, widgetChangeData: [], widgetAddData: [] }); }; saveChanges() { @@ -313,21 +298,28 @@ class Dashboard extends Component { cancelEditing() { //raw widget has no id -> cannot be deleted in its original form - /* - this.state.widgetAddData.forEach( widget => { + let temp = []; + this.state.widgetAddData.forEach(rawWidget => { + this.state.widgets.forEach(widget => { + if(widget.y === rawWidget.y && widget.x === rawWidget.x && widget.type === rawWidget.type){ + temp.push(widget); + } + }) + }) + + temp.forEach( widget => { AppDispatcher.dispatch({ type: 'widgets/start-remove', data: widget, token: this.state.sessionToken }); - }); */ - + }); AppDispatcher.dispatch({ type: 'widgets/start-load', token: this.state.sessionToken, param: '?dashboardID=1' }); - this.setState({ editing: false, widgetChangeData: [], widgetAddData: [] }); + this.setState({ editing: false, widgetChangeData: [], widgetAddData: []}); }; From cfcdbc412fa9d9e94a90a023c0f48f7e9b656163 Mon Sep 17 00:00:00 2001 From: Laura Fuentes Grau Date: Fri, 24 Apr 2020 15:58:15 +0200 Subject: [PATCH 171/391] fix for Value Widget: value and unit now connected, no large gap after resizing --- src/widget/widget-factory.js | 2 +- src/widget/widgets/value.js | 9 ++++----- 2 files changed, 5 insertions(+), 6 deletions(-) diff --git a/src/widget/widget-factory.js b/src/widget/widget-factory.js index eaa80d9..fec9e91 100644 --- a/src/widget/widget-factory.js +++ b/src/widget/widget-factory.js @@ -70,7 +70,7 @@ class WidgetFactory { case 'Value': widget.minWidth = 70; widget.minHeight = 20; - widget.width = 120; + widget.width = 150; widget.height = 30; widget.customProperties.textSize = 16; widget.name = 'Value'; diff --git a/src/widget/widgets/value.js b/src/widget/widgets/value.js index 5f826d8..77dab50 100644 --- a/src/widget/widgets/value.js +++ b/src/widget/widgets/value.js @@ -68,14 +68,13 @@ class WidgetValue extends Component { } render() { - var value_to_render = Number(this.state.value); + let unit = " [" + this.state.unit + "]"; + let value_to_render = Number(this.state.value); return (
    {this.props.widget.name} - {Number.isNaN(value_to_render) ? NaN : format('.3s')(value_to_render)} - {this.props.widget.customProperties.showUnit && - [{this.state.unit}] - } + {Number.isNaN(value_to_render) ? NaN : format('.3s')(value_to_render)} + {this.props.widget.customProperties.showUnit && unit }
    ); } From 9eb424663342f489f6442eb4f68b941d734849bb Mon Sep 17 00:00:00 2001 From: Laura Fuentes Grau Date: Sun, 26 Apr 2020 22:58:00 +0200 Subject: [PATCH 172/391] wip: fix for value widget:more elegant solution for display issues #192 --- src/styles/widgets.css | 1 + src/widget/widgets/value.js | 11 +++++++---- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/src/styles/widgets.css b/src/styles/widgets.css index c5f775e..33e03f0 100644 --- a/src/styles/widgets.css +++ b/src/styles/widgets.css @@ -249,6 +249,7 @@ span.signal-unit::after { width: 100%; height: 100%; display: flex; + flex: none; word-wrap: break-word; } diff --git a/src/widget/widgets/value.js b/src/widget/widgets/value.js index 77dab50..8951d80 100644 --- a/src/widget/widgets/value.js +++ b/src/widget/widgets/value.js @@ -68,13 +68,16 @@ class WidgetValue extends Component { } render() { - let unit = " [" + this.state.unit + "]"; let value_to_render = Number(this.state.value); + let value_width = this.props.widget.customProperties.textSize*0.55* (this.state.value.length +2); + let unit_width = this.props.widget.customProperties.textSize*2; return (
    - {this.props.widget.name} - {Number.isNaN(value_to_render) ? NaN : format('.3s')(value_to_render)} - {this.props.widget.customProperties.showUnit && unit } + {this.props.widget.name} + {Number.isNaN(value_to_render) ? NaN : format('.3s')(value_to_render)} + {this.props.widget.customProperties.showUnit && + [{this.state.unit}] + }
    ); } From edfae8f024878f9a92b168a10628cb44121a6ea4 Mon Sep 17 00:00:00 2001 From: Laura Fuentes Grau Date: Sun, 26 Apr 2020 23:04:44 +0200 Subject: [PATCH 173/391] wip: add new size restrictions #12 --- src/widget/edit-widget/edit-widget.js | 33 ++++++++++++++++++++++++- src/widget/editable-widget-container.js | 22 +++++++++++------ src/widget/widget-factory.js | 6 +++++ 3 files changed, 52 insertions(+), 9 deletions(-) diff --git a/src/widget/edit-widget/edit-widget.js b/src/widget/edit-widget/edit-widget.js index 8e79531..c8517bd 100644 --- a/src/widget/edit-widget/edit-widget.js +++ b/src/widget/edit-widget/edit-widget.js @@ -65,6 +65,28 @@ class EditWidgetDialog extends React.Component { return changeObject; } + setMaxWidth(changeObject){ + if(changeObject.type === 'Label'){ + changeObject.customProperties.maxWidth = (changeObject.customProperties.textSize* 0.34) * changeObject.name.length; + } + else if (changeObject.type === 'Value'){ + // changeObject.customProperties.maxWidth = (changeObject.customProperties.textSize* 0.5) * (changeObject.name.length+13); + } + return changeObject; + } + + setNewLockRestrictions(changeObject){ + if(changeObject.customProperties.orientation === 0){ + changeObject.customProperties.resizeTopBottomLock = true; + changeObject.customProperties.resizeRightLeftLock = false; + } + else if(changeObject.customProperties.orientation === 1){ + changeObject.customProperties.resizeTopBottomLock = false; + changeObject.customProperties.resizeRightLeftLock = true; + } + return changeObject; + } + handleChange(e) { // TODO: check what we really need in this function. Can we reduce its complexity? @@ -93,7 +115,15 @@ class EditWidgetDialog extends React.Component { // TODO this if condition requires changes to work!!! changeObject = this.assignAspectRatio(changeObject, e.target.value); } - } else if (e.target.type === 'number') { + }else if (parts[1] === 'textSize'){ + changeObject[parts[0]][parts[1]] = Number(e.target.value); + changeObject = this.setMaxWidth(changeObject); + + }else if(parts[1] === 'orientation'){ + customProperty ? changeObject[parts[0]][parts[1]] = e.target.value : changeObject[e.target.id] = e.target.value ; + changeObject = this.setNewLockRestrictions(changeObject); + } + else if (e.target.type === 'number') { customProperty ? changeObject[parts[0]][parts[1]] = Number(e.target.value) : changeObject[e.target.id] = Number(e.target.value); } else if(e.target.id === 'name'){ if(customProperty ? (changeObject[parts[0]][parts[1]] != null) : (changeObject[e.target.id] != null)){ @@ -101,6 +131,7 @@ class EditWidgetDialog extends React.Component { } else{ customProperty ? changeObject[parts[0]][parts[1]]= 'default' : changeObject[e.target.id] = 'default'; } + changeObject = this.setMaxWidth(changeObject); } else { customProperty ? changeObject[parts[0]][parts[1]] = e.target.value : changeObject[e.target.id] = e.target.value ; } diff --git a/src/widget/editable-widget-container.js b/src/widget/editable-widget-container.js index f49312e..f96e02c 100644 --- a/src/widget/editable-widget-container.js +++ b/src/widget/editable-widget-container.js @@ -84,16 +84,21 @@ class EditableWidgetContainer extends React.Component { render() { const widget = this.props.widget; + let resizingRestricted = false; + if(widget.customProperties.resizeRightLeftLock || widget.customProperties.resizeTopBottomLock){ + resizingRestricted = true; + } + const resizing = { - bottom: !widget.isLocked, - bottomLeft: !widget.isLocked, - bottomRight: !widget.isLocked, - left: !widget.isLocked, - right: !widget.idLocked, - top: !widget.isLocked, - topLeft: !widget.isLocked, - topRight: !widget.isLocked + bottom: !(widget.customProperties.resizeTopBottomLock || widget.isLocked), + bottomLeft: !(resizingRestricted|| widget.isLocked), + bottomRight: !(resizingRestricted || widget.isLocked), + left: !(widget.customProperties.resizeRightLeftLock || widget.isLocked), + right: !(widget.customProperties.resizeRightLeftLock || widget.isLocked), + top: !(widget.customProperties.resizeTopBottomLock || widget.isLocked), + topLeft: !(resizingRestricted || widget.isLocked), + topRight: !(resizingRestricted || widget.isLocked) }; const gridArray = [ this.props.grid, this.props.grid ]; @@ -108,6 +113,7 @@ class EditableWidgetContainer extends React.Component { default={{ x: Number(widget.x), y: Number(widget.y), width: widget.width, height: widget.height }} minWidth={widget.minWidth} minHeight={widget.minHeight} + maxWidth ={widget.customProperties.maxWidth || '100%' } lockAspectRatio={Boolean(widget.isLocked)} bounds={'parent'} className={widgetClasses} diff --git a/src/widget/widget-factory.js b/src/widget/widget-factory.js index fec9e91..3673a63 100644 --- a/src/widget/widget-factory.js +++ b/src/widget/widget-factory.js @@ -75,6 +75,7 @@ class WidgetFactory { widget.customProperties.textSize = 16; widget.name = 'Value'; widget.customProperties.showUnit = false; + widget.customProperties.resizeTopBottomLock = true; break; case 'Plot': widget.customProperties.ylabel = ''; @@ -96,11 +97,13 @@ class WidgetFactory { case 'Label': widget.minWidth = 20; widget.minHeight = 20; + widget.customProperties.maxWidth = 100; widget.width = 100; widget.height = 35; widget.name = 'Label'; widget.customProperties.textSize = 32; widget.customProperties.fontColor = 0; + widget.customProperties.resizeTopBottomLock = true; break; case 'PlotTable': widget.customProperties.ylabel = ''; @@ -138,6 +141,7 @@ class WidgetFactory { widget.width = 200; widget.height = 50; widget.customProperties.showUnit = false; + widget.customProperties.resizeTopBottomLock = true; break; case 'Slider': widget.minWidth = 380; @@ -151,6 +155,8 @@ class WidgetFactory { widget.customProperties.showUnit = true; widget.customProperties.continous_update = false; widget.customProperties.default_value = 0; + widget.customProperties.resizeLeftRightLock = false; + widget.customProperties.resizeTopBottomLock = true; break; case 'Gauge': From 309084f73c62a1696e026a732b24d9ef07e7d022 Mon Sep 17 00:00:00 2001 From: Sonja Happ Date: Mon, 27 Apr 2020 11:48:22 +0200 Subject: [PATCH 174/391] add some todos --- src/dashboard/dashboard.js | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/dashboard/dashboard.js b/src/dashboard/dashboard.js index 98c3d40..5bde062 100644 --- a/src/dashboard/dashboard.js +++ b/src/dashboard/dashboard.js @@ -86,7 +86,7 @@ class Dashboard extends Component { } } - + // TODO create list of infrastructure components in use return { dashboard, @@ -110,7 +110,6 @@ class Dashboard extends Component { } - static getNewWidgetKey() { const widgetKey = this.lastWidgetKey; this.lastWidgetKey++; @@ -128,7 +127,9 @@ class Dashboard extends Component { param: '?dashboardID=' + this.state.dashboard.id }); + // TODO open websockets in componentDidMount + // TODO close websockets in componentWillUnmount } handleKeydown(e) { @@ -264,7 +265,7 @@ class Dashboard extends Component { deleteWidget(widget, index) { - + AppDispatcher.dispatch({ type: 'widgets/start-remove', data: widget, From a2869d3256b3f8cfcde1b5d5f7b20e3e78b0a021 Mon Sep 17 00:00:00 2001 From: Sonja Happ Date: Mon, 27 Apr 2020 12:50:26 +0200 Subject: [PATCH 175/391] rename 'endpoint' to 'host' to be compliant with data model --- src/common/api/websocket-api.js | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/src/common/api/websocket-api.js b/src/common/api/websocket-api.js index bad01a7..71c813d 100644 --- a/src/common/api/websocket-api.js +++ b/src/common/api/websocket-api.js @@ -16,19 +16,19 @@ ******************************************************************************/ class WebsocketAPI { - constructor(endpoint, callbacks) { - this.endpoint = endpoint; + constructor(host, callbacks) { + this.host = host; this.callbacks = callbacks; this.wasConnected = false; this.isClosing = false; - this.connect(endpoint, callbacks); + this.connect(host, callbacks); } - connect(endpoint, callbacks) { + connect(host, callbacks) { // create web socket client - this.socket = new WebSocket(WebsocketAPI.getURL(endpoint), 'live'); + this.socket = new WebSocket(WebsocketAPI.getURL(host), 'live'); this.socket.binaryType = 'arraybuffer'; this.socket.onclose = this.onClose; this.socket.onopen = this.onOpen; @@ -40,12 +40,12 @@ class WebsocketAPI { } reconnect() { - //console.log("Reconnecting: " + this.endpoint); - this.connect(this.endpoint, this.callbacks); + //console.log("Reconnecting: " + this.host); + this.connect(this.host, this.callbacks); } get url() { - return WebsocketAPI.getURL(this.endpoint); + return WebsocketAPI.getURL(this.host); } send(data) { @@ -58,7 +58,7 @@ class WebsocketAPI { } onError = e => { - console.error('Error on WebSocket connection to: ' + this.endpoint + ':', e); + console.error('Error on WebSocket connection to: ' + this.host + ':', e); if ('onError' in this.callbacks) this.callbacks.onError(e); @@ -78,16 +78,16 @@ class WebsocketAPI { } else { if (this.wasConnected) { - console.log("Connection to " + this.endpoint + " dropped. Attempt reconnect in 1 sec"); + console.log("Connection to " + this.host + " dropped. Attempt reconnect in 1 sec"); window.setTimeout(() => { this.reconnect(); }, 1000); } } } - static getURL(endpoint) { + static getURL(host) { // create an anchor element (note: no need to append this element to the document) var link = document.createElement('a'); - link.href = endpoint; + link.href = host; if (link.protocol === 'https:') link.protocol = 'wss:'; From 1745a0bd68118470e904a72357140ba3e66a7c09 Mon Sep 17 00:00:00 2001 From: Sonja Happ Date: Mon, 27 Apr 2020 12:53:10 +0200 Subject: [PATCH 176/391] extract ICs that are used by the scenario --- src/scenario/scenario.js | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/src/scenario/scenario.js b/src/scenario/scenario.js index 071c610..1cd8706 100644 --- a/src/scenario/scenario.js +++ b/src/scenario/scenario.js @@ -68,15 +68,28 @@ class Scenario extends React.Component { let signals = SignalStore.getState(); let files = FileStore.getState(); + // apply filter to contain only ICs that are used by configs + let icsUsed = ICStore.getState().filter(ic => { + let ICused = false; + for (let config of configs){ + if (ic.id === config.icID){ + ICused = true; + break; + } + } + return ICused; + }); + return { scenario, sessionToken, - configs: configs, + configs, dashboards, signals, files, ics: ICStore.getState(), + icsUsed, deleteConfigModal: false, importConfigModal: false, @@ -118,7 +131,7 @@ class Scenario extends React.Component { param: '?scenarioID='+this.state.scenario.id, }); - // load ICs to enable that component configs work with them + // load ICs to enable that component configs and dashboards work with them AppDispatcher.dispatch({ type: 'ics/start-load', token: this.state.sessionToken, From 2478822bb83b38a2f6767ac6cccc144f74a3f2ad Mon Sep 17 00:00:00 2001 From: Sonja Happ Date: Mon, 27 Apr 2020 12:54:09 +0200 Subject: [PATCH 177/391] rename 'endpoint' to 'host' --- src/ic/import-ic.js | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/ic/import-ic.js b/src/ic/import-ic.js index 3fac3bb..5cd1f96 100644 --- a/src/ic/import-ic.js +++ b/src/ic/import-ic.js @@ -30,7 +30,7 @@ class ImportICDialog extends React.Component { this.state = { name: '', - endpoint: '', + host: '', uuid: '' }; } @@ -45,8 +45,8 @@ class ImportICDialog extends React.Component { uuid: this.state.uuid }; - if (this.state.endpoint != null && this.state.endpoint !== "" && this.state.endpoint !== 'http://') { - data.properties.endpoint = this.state.endpoint; + if (this.state.host != null && this.state.host !== "" && this.state.host !== 'http://') { + data.host = this.state.host; } this.props.onClose(data); @@ -61,7 +61,7 @@ class ImportICDialog extends React.Component { } resetState() { - this.setState({ name: '', endpoint: 'http://', uuid: '' }); + this.setState({ name: '', host: 'http://', uuid: '' }); } loadFile(fileList) { @@ -81,7 +81,7 @@ class ImportICDialog extends React.Component { self.imported = true; self.setState({ name: _.get(ic, 'properties.name') || _.get(ic, 'rawProperties.name'), - endpoint: _.get(ic, 'properties.endpoint') || _.get(ic, 'rawProperties.endpoint'), + host: _.get(ic, 'host'), uuid: ic.uuid }); }; @@ -124,8 +124,8 @@ class ImportICDialog extends React.Component { - Endpoint - this.handleChange(e)} /> + Host + this.handleChange(e)} /> From 3657d77607da34ba765aacaa95f538190242ec5a Mon Sep 17 00:00:00 2001 From: Sonja Happ Date: Mon, 27 Apr 2020 12:56:27 +0200 Subject: [PATCH 178/391] rename 'endpoint' to 'host' in IC data manager --- src/ic/ic-data-data-manager.js | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/ic/ic-data-data-manager.js b/src/ic/ic-data-data-manager.js index 99e37ae..5aebae9 100644 --- a/src/ic/ic-data-data-manager.js +++ b/src/ic/ic-data-data-manager.js @@ -26,19 +26,19 @@ class IcDataDataManager { this._sockets = {}; } - open(endpoint, identifier) { + open(host, identifier) { // pass signals to onOpen callback if (this._sockets[identifier] != null) return; // already open? - this._sockets[identifier] = new WebsocketAPI(endpoint, { onOpen: (event) => this.onOpen(event, identifier, true), onClose: (event) => this.onClose(event, identifier), onMessage: (event) => this.onMessage(event, identifier) }); + this._sockets[identifier] = new WebsocketAPI(host, { onOpen: (event) => this.onOpen(event, identifier, true), onClose: (event) => this.onClose(event, identifier), onMessage: (event) => this.onMessage(event, identifier) }); } - update(endpoint, identifier) { + update(host, identifier) { if (this._sockets[identifier] != null) { - if (this._sockets[identifier].endpoint !== endpoint) { + if (this._sockets[identifier].host !== host) { this._sockets[identifier].close(); - this._sockets[identifier] = new WebsocketAPI(endpoint, { onOpen: (event) => this.onOpen(event, identifier, false), onClose: (event) => this.onClose(event, identifier), onMessage: (event) => this.onMessage(event, identifier), onError: (error) => this.onError(error, identifier) }); + this._sockets[identifier] = new WebsocketAPI(host, { onOpen: (event) => this.onOpen(event, identifier, false), onClose: (event) => this.onClose(event, identifier), onMessage: (event) => this.onMessage(event, identifier), onError: (error) => this.onError(error, identifier) }); } } } From 32bba8cd66ea9144f7cf3b8ea9dbc0731d7fdc29 Mon Sep 17 00:00:00 2001 From: Sonja Happ Date: Mon, 27 Apr 2020 13:07:57 +0200 Subject: [PATCH 179/391] WIP: - rename 'endpoint' to 'host' - do not open websockets upon loading of ICs - add new dispatch 'open-sockets' for a set of ICs - this is not used yet, so currently NO websockets are opened - add a lot of TODOS in new dispatch --- src/ic/ic-store.js | 44 +++++++++++++++++++++++++++++--------------- 1 file changed, 29 insertions(+), 15 deletions(-) diff --git a/src/ic/ic-store.js b/src/ic/ic-store.js index c70293f..878fb4b 100644 --- a/src/ic/ic-store.js +++ b/src/ic/ic-store.js @@ -15,11 +15,10 @@ * along with VILLASweb. If not, see . ******************************************************************************/ -import _ from 'lodash'; - import ArrayStore from '../common/array-store'; import ICsDataManager from './ics-data-manager'; import ICDataDataManager from './ic-data-data-manager'; +import NotificationsDataManager from "../common/data-managers/notifications-data-manager"; class InfrastructureComponentStore extends ArrayStore { constructor() { @@ -29,29 +28,44 @@ class InfrastructureComponentStore extends ArrayStore { reduce(state, action) { switch(action.type) { case 'ics/loaded': - // connect to each infrastructure component - for (let ic of action.data) { - const endpoint = _.get(ic, 'properties.endpoint') || _.get(ic, 'rawProperties.endpoint'); - if (endpoint != null && endpoint !== '') { - ICDataDataManager.open(endpoint, ic.id); - } else { - // console.warn('Endpoint not found for IC at ' + endpoint); - // console.log(ic); - } - } return super.reduce(state, action); case 'ics/edited': // connect to each infrastructure component const ic = action.data; - const endpoint = _.get(ic, 'properties.endpoint') || _.get(ic, 'rawProperties.endpoint'); - if (endpoint != null && endpoint !== '') { - ICDataDataManager.update(endpoint, ic.id); + if (ic.host != null && ic.host !== '') { + ICDataDataManager.update(ic.host, ic.id); } return super.reduce(state, action); + case 'ics/open-sockets': + // open websocket for each IC contained in array action.data + // TODO should be done when dashboard is loaded + // TODO action.data should contain only those IC used by the scenario + for (let ic of action.data) { + if (ic.host != null && ic.host !== '') { + // TODO connection should be closed again when dashboard is closed + + ICDataDataManager.open(ic.host, ic.id); + } else { + + // TODO add to pool of notifications + const IC_WEBSOCKET_HOST_ERROR = { + title: 'Host of websocket not available', + message: action.error.response.body.message, + level: 'warning' + }; + NotificationsDataManager.addNotification(IC_WEBSOCKET_HOST_ERROR); + } + } + return super.reduce(state, action); + + case 'ics/close-sockets': + // close all websockets + ICDataDataManager.closeAll(); + return super.reduce(state, action); case 'ics/fetched': return this.updateElements(state, [action.data]); From cd59af855183c1ae3b4fd1e977f07107eb230b19 Mon Sep 17 00:00:00 2001 From: Sonja Happ Date: Mon, 27 Apr 2020 14:39:59 +0200 Subject: [PATCH 180/391] updating packages, closing #215 --- package-lock.json | 2573 ++++++++++++++++++++++++++++----------------- package.json | 33 +- 2 files changed, 1616 insertions(+), 990 deletions(-) diff --git a/package-lock.json b/package-lock.json index 6aedb3f..a670b70 100644 --- a/package-lock.json +++ b/package-lock.json @@ -13,11 +13,11 @@ } }, "@babel/compat-data": { - "version": "7.8.5", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.8.5.tgz", - "integrity": "sha512-jWYUqQX/ObOhG1UiEkbH5SANsE/8oKXiQWjj7p7xgj9Zmnt//aUvyz4dBkK0HNsS8/cbyC5NmmH87VekW+mXFg==", + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.9.0.tgz", + "integrity": "sha512-zeFQrr+284Ekvd9e7KAX954LkapWiOmQtsfHirhxqfdlX6MEC32iRE+pqUGlYIBchdevaCwvzxWGSy/YBNI85g==", "requires": { - "browserslist": "^4.8.5", + "browserslist": "^4.9.1", "invariant": "^2.2.4", "semver": "^5.5.0" }, @@ -30,21 +30,22 @@ } }, "@babel/core": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.8.4.tgz", - "integrity": "sha512-0LiLrB2PwrVI+a2/IEskBopDYSd8BCb3rOvH7D5tzoWd696TBEduBvuLVm4Nx6rltrLZqvI3MCalB2K2aVzQjA==", + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.9.0.tgz", + "integrity": "sha512-kWc7L0fw1xwvI0zi8OKVBuxRVefwGOrKSQMvrQ3dW+bIIavBY3/NpXmpjMy7bQnLgwgzWQZ8TlM57YHpHNHz4w==", "requires": { "@babel/code-frame": "^7.8.3", - "@babel/generator": "^7.8.4", - "@babel/helpers": "^7.8.4", - "@babel/parser": "^7.8.4", - "@babel/template": "^7.8.3", - "@babel/traverse": "^7.8.4", - "@babel/types": "^7.8.3", + "@babel/generator": "^7.9.0", + "@babel/helper-module-transforms": "^7.9.0", + "@babel/helpers": "^7.9.0", + "@babel/parser": "^7.9.0", + "@babel/template": "^7.8.6", + "@babel/traverse": "^7.9.0", + "@babel/types": "^7.9.0", "convert-source-map": "^1.7.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.1", - "json5": "^2.1.0", + "json5": "^2.1.2", "lodash": "^4.17.13", "resolve": "^1.3.2", "semver": "^5.4.1", @@ -64,11 +65,11 @@ } }, "@babel/generator": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.8.4.tgz", - "integrity": "sha512-PwhclGdRpNAf3IxZb0YVuITPZmmrXz9zf6fH8lT4XbrmfQKr6ryBzhv593P5C6poJRciFCL/eHGW2NuGrgEyxA==", + "version": "7.9.5", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.9.5.tgz", + "integrity": "sha512-GbNIxVB3ZJe3tLeDm1HSn2AhuD/mVcyLDpgtLXa5tplmWrJdF/elxB56XNqCuD6szyNkDi6wuoKXln3QeBmCHQ==", "requires": { - "@babel/types": "^7.8.3", + "@babel/types": "^7.9.5", "jsesc": "^2.5.1", "lodash": "^4.17.13", "source-map": "^0.5.0" @@ -99,31 +100,31 @@ } }, "@babel/helper-builder-react-jsx": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-builder-react-jsx/-/helper-builder-react-jsx-7.8.3.tgz", - "integrity": "sha512-JT8mfnpTkKNCboTqZsQTdGo3l3Ik3l7QIt9hh0O9DYiwVel37VoJpILKM4YFbP2euF32nkQSb+F9cUk9b7DDXQ==", + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-react-jsx/-/helper-builder-react-jsx-7.9.0.tgz", + "integrity": "sha512-weiIo4gaoGgnhff54GQ3P5wsUQmnSwpkvU0r6ZHq6TzoSzKy4JxHEgnxNytaKbov2a9z/CVNyzliuCOUPEX3Jw==", "requires": { - "@babel/types": "^7.8.3", - "esutils": "^2.0.0" + "@babel/helper-annotate-as-pure": "^7.8.3", + "@babel/types": "^7.9.0" } }, - "@babel/helper-call-delegate": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-call-delegate/-/helper-call-delegate-7.8.3.tgz", - "integrity": "sha512-6Q05px0Eb+N4/GTyKPPvnkig7Lylw+QzihMpws9iiZQv7ZImf84ZsZpQH7QoWN4n4tm81SnSzPgHw2qtO0Zf3A==", + "@babel/helper-builder-react-jsx-experimental": { + "version": "7.9.5", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-react-jsx-experimental/-/helper-builder-react-jsx-experimental-7.9.5.tgz", + "integrity": "sha512-HAagjAC93tk748jcXpZ7oYRZH485RCq/+yEv9SIWezHRPv9moZArTnkUNciUNzvwHUABmiWKlcxJvMcu59UwTg==", "requires": { - "@babel/helper-hoist-variables": "^7.8.3", - "@babel/traverse": "^7.8.3", - "@babel/types": "^7.8.3" + "@babel/helper-annotate-as-pure": "^7.8.3", + "@babel/helper-module-imports": "^7.8.3", + "@babel/types": "^7.9.5" } }, "@babel/helper-compilation-targets": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.8.4.tgz", - "integrity": "sha512-3k3BsKMvPp5bjxgMdrFyq0UaEO48HciVrOVF0+lon8pp95cyJ2ujAh0TrBHNMnJGT2rr0iKOJPFFbSqjDyf/Pg==", + "version": "7.8.7", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.8.7.tgz", + "integrity": "sha512-4mWm8DCK2LugIS+p1yArqvG1Pf162upsIsjE7cNBjez+NjliQpVhj20obE520nao0o14DaTnFJv+Fw5a0JpoUw==", "requires": { - "@babel/compat-data": "^7.8.4", - "browserslist": "^4.8.5", + "@babel/compat-data": "^7.8.6", + "browserslist": "^4.9.1", "invariant": "^2.2.4", "levenary": "^1.1.1", "semver": "^5.5.0" @@ -137,25 +138,26 @@ } }, "@babel/helper-create-class-features-plugin": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.8.3.tgz", - "integrity": "sha512-qmp4pD7zeTxsv0JNecSBsEmG1ei2MqwJq4YQcK3ZWm/0t07QstWfvuV/vm3Qt5xNMFETn2SZqpMx2MQzbtq+KA==", + "version": "7.9.5", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.9.5.tgz", + "integrity": "sha512-IipaxGaQmW4TfWoXdqjY0TzoXQ1HRS0kPpEgvjosb3u7Uedcq297xFqDQiCcQtRRwzIMif+N1MLVI8C5a4/PAA==", "requires": { - "@babel/helper-function-name": "^7.8.3", + "@babel/helper-function-name": "^7.9.5", "@babel/helper-member-expression-to-functions": "^7.8.3", "@babel/helper-optimise-call-expression": "^7.8.3", "@babel/helper-plugin-utils": "^7.8.3", - "@babel/helper-replace-supers": "^7.8.3", + "@babel/helper-replace-supers": "^7.8.6", "@babel/helper-split-export-declaration": "^7.8.3" } }, "@babel/helper-create-regexp-features-plugin": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.8.3.tgz", - "integrity": "sha512-Gcsm1OHCUr9o9TcJln57xhWHtdXbA2pgQ58S0Lxlks0WMGNXuki4+GLfX0p+L2ZkINUGZvfkz8rzoqJQSthI+Q==", + "version": "7.8.8", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.8.8.tgz", + "integrity": "sha512-LYVPdwkrQEiX9+1R29Ld/wTrmQu1SSKYnuOk3g0CkcZMA1p0gsNxJFj/3gBdaJ7Cg0Fnek5z0DsMULePP7Lrqg==", "requires": { + "@babel/helper-annotate-as-pure": "^7.8.3", "@babel/helper-regex": "^7.8.3", - "regexpu-core": "^4.6.0" + "regexpu-core": "^4.7.0" } }, "@babel/helper-define-map": { @@ -178,13 +180,13 @@ } }, "@babel/helper-function-name": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.8.3.tgz", - "integrity": "sha512-BCxgX1BC2hD/oBlIFUgOCQDOPV8nSINxCwM3o93xP4P9Fq6aV5sgv2cOOITDMtCfQ+3PvHp3l689XZvAM9QyOA==", + "version": "7.9.5", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.9.5.tgz", + "integrity": "sha512-JVcQZeXM59Cd1qanDUxv9fgJpt3NeKUaqBqUEvfmQ+BCOKq2xUgaWZW2hr0dkbyJgezYuplEoh5knmrnS68efw==", "requires": { "@babel/helper-get-function-arity": "^7.8.3", "@babel/template": "^7.8.3", - "@babel/types": "^7.8.3" + "@babel/types": "^7.9.5" } }, "@babel/helper-get-function-arity": { @@ -220,15 +222,16 @@ } }, "@babel/helper-module-transforms": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.8.3.tgz", - "integrity": "sha512-C7NG6B7vfBa/pwCOshpMbOYUmrYQDfCpVL/JCRu0ek8B5p8kue1+BCXpg2vOYs7w5ACB9GTOBYQ5U6NwrMg+3Q==", + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.9.0.tgz", + "integrity": "sha512-0FvKyu0gpPfIQ8EkxlrAydOWROdHpBmiCiRwLkUiBGhCUPRRbVD2/tm3sFr/c/GWFrQ/ffutGUAnx7V0FzT2wA==", "requires": { "@babel/helper-module-imports": "^7.8.3", + "@babel/helper-replace-supers": "^7.8.6", "@babel/helper-simple-access": "^7.8.3", "@babel/helper-split-export-declaration": "^7.8.3", - "@babel/template": "^7.8.3", - "@babel/types": "^7.8.3", + "@babel/template": "^7.8.6", + "@babel/types": "^7.9.0", "lodash": "^4.17.13" } }, @@ -266,14 +269,14 @@ } }, "@babel/helper-replace-supers": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.8.3.tgz", - "integrity": "sha512-xOUssL6ho41U81etpLoT2RTdvdus4VfHamCuAm4AHxGr+0it5fnwoVdwUJ7GFEqCsQYzJUhcbsN9wB9apcYKFA==", + "version": "7.8.6", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.8.6.tgz", + "integrity": "sha512-PeMArdA4Sv/Wf4zXwBKPqVj7n9UF/xg6slNRtZW84FM7JpE1CbG8B612FyM4cxrf4fMAMGO0kR7voy1ForHHFA==", "requires": { "@babel/helper-member-expression-to-functions": "^7.8.3", "@babel/helper-optimise-call-expression": "^7.8.3", - "@babel/traverse": "^7.8.3", - "@babel/types": "^7.8.3" + "@babel/traverse": "^7.8.6", + "@babel/types": "^7.8.6" } }, "@babel/helper-simple-access": { @@ -293,6 +296,11 @@ "@babel/types": "^7.8.3" } }, + "@babel/helper-validator-identifier": { + "version": "7.9.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.9.5.tgz", + "integrity": "sha512-/8arLKUFq882w4tWGj9JYzRpAlZgiWUJ+dtteNTDqrRBz9Iguck9Rn3ykuBDoUwh2TO4tSAJlrxDUOXWklJe4g==" + }, "@babel/helper-wrap-function": { "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.8.3.tgz", @@ -305,29 +313,29 @@ } }, "@babel/helpers": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.8.4.tgz", - "integrity": "sha512-VPbe7wcQ4chu4TDQjimHv/5tj73qz88o12EPkO2ValS2QiQS/1F2SsjyIGNnAD0vF/nZS6Cf9i+vW6HIlnaR8w==", + "version": "7.9.2", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.9.2.tgz", + "integrity": "sha512-JwLvzlXVPjO8eU9c/wF9/zOIN7X6h8DYf7mG4CiFRZRvZNKEF5dQ3H3V+ASkHoIB3mWhatgl5ONhyqHRI6MppA==", "requires": { "@babel/template": "^7.8.3", - "@babel/traverse": "^7.8.4", - "@babel/types": "^7.8.3" + "@babel/traverse": "^7.9.0", + "@babel/types": "^7.9.0" } }, "@babel/highlight": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.8.3.tgz", - "integrity": "sha512-PX4y5xQUvy0fnEVHrYOarRPXVWafSjTW9T0Hab8gVIawpl2Sj0ORyrygANq+KjcNlSSTw0YCLSNA8OyZ1I4yEg==", + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.9.0.tgz", + "integrity": "sha512-lJZPilxX7Op3Nv/2cvFdnlepPXDxi29wxteT57Q965oc5R9v86ztx0jfxVrTcBk8C2kcPkkDa2Z4T3ZsPPVWsQ==", "requires": { + "@babel/helper-validator-identifier": "^7.9.0", "chalk": "^2.0.0", - "esutils": "^2.0.2", "js-tokens": "^4.0.0" } }, "@babel/parser": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.8.4.tgz", - "integrity": "sha512-0fKu/QqildpXmPVaRBoXOlyBb3MC+J0A66x97qEfLOMkn3u6nfY5esWogQwi/K0BjASYy4DbnsEWnpNL6qT5Mw==" + "version": "7.9.4", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.9.4.tgz", + "integrity": "sha512-bC49otXX6N0/VYhgOMh4gnP26E9xnDZK3TmbNpxYzzz9BQLBosQwfyOe9/cXUU3txYhTzLCbcqd5c8y/OmCjHA==" }, "@babel/plugin-proposal-async-generator-functions": { "version": "7.8.3", @@ -395,12 +403,13 @@ } }, "@babel/plugin-proposal-object-rest-spread": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.8.3.tgz", - "integrity": "sha512-8qvuPwU/xxUCt78HocNlv0mXXo0wdh9VT1R04WU8HGOfaOob26pF+9P5/lYjN/q7DHOX1bvX60hnhOvuQUJdbA==", + "version": "7.9.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.9.5.tgz", + "integrity": "sha512-VP2oXvAf7KCYTthbUHwBlewbl1Iq059f6seJGsxMizaCdgHIeczOr7FBqELhSqfkIl04Fi8okzWzl63UKbQmmg==", "requires": { "@babel/helper-plugin-utils": "^7.8.3", - "@babel/plugin-syntax-object-rest-spread": "^7.8.0" + "@babel/plugin-syntax-object-rest-spread": "^7.8.0", + "@babel/plugin-transform-parameters": "^7.9.5" } }, "@babel/plugin-proposal-optional-catch-binding": { @@ -413,20 +422,20 @@ } }, "@babel/plugin-proposal-optional-chaining": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.8.3.tgz", - "integrity": "sha512-QIoIR9abkVn+seDE3OjA08jWcs3eZ9+wJCKSRgo3WdEU2csFYgdScb+8qHB3+WXsGJD55u+5hWCISI7ejXS+kg==", + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.9.0.tgz", + "integrity": "sha512-NDn5tu3tcv4W30jNhmc2hyD5c56G6cXx4TesJubhxrJeCvuuMpttxr0OnNCqbZGhFjLrg+NIhxxC+BK5F6yS3w==", "requires": { "@babel/helper-plugin-utils": "^7.8.3", "@babel/plugin-syntax-optional-chaining": "^7.8.0" } }, "@babel/plugin-proposal-unicode-property-regex": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.8.3.tgz", - "integrity": "sha512-1/1/rEZv2XGweRwwSkLpY+s60za9OZ1hJs4YDqFHCw0kYWYwL5IFljVY1MYBL+weT1l9pokDO2uhSTLVxzoHkQ==", + "version": "7.8.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.8.8.tgz", + "integrity": "sha512-EVhjVsMpbhLw9ZfHWSx2iy13Q8Z/eg8e8ccVWt23sWQK5l1UdkoLJPN5w69UA4uITGBnEZD2JOe4QOHycYKv8A==", "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.8.3", + "@babel/helper-create-regexp-features-plugin": "^7.8.8", "@babel/helper-plugin-utils": "^7.8.3" } }, @@ -570,16 +579,16 @@ } }, "@babel/plugin-transform-classes": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.8.3.tgz", - "integrity": "sha512-SjT0cwFJ+7Rbr1vQsvphAHwUHvSUPmMjMU/0P59G8U2HLFqSa082JO7zkbDNWs9kH/IUqpHI6xWNesGf8haF1w==", + "version": "7.9.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.9.5.tgz", + "integrity": "sha512-x2kZoIuLC//O5iA7PEvecB105o7TLzZo8ofBVhP79N+DO3jaX+KYfww9TQcfBEZD0nikNyYcGB1IKtRq36rdmg==", "requires": { "@babel/helper-annotate-as-pure": "^7.8.3", "@babel/helper-define-map": "^7.8.3", - "@babel/helper-function-name": "^7.8.3", + "@babel/helper-function-name": "^7.9.5", "@babel/helper-optimise-call-expression": "^7.8.3", "@babel/helper-plugin-utils": "^7.8.3", - "@babel/helper-replace-supers": "^7.8.3", + "@babel/helper-replace-supers": "^7.8.6", "@babel/helper-split-export-declaration": "^7.8.3", "globals": "^11.1.0" } @@ -593,9 +602,9 @@ } }, "@babel/plugin-transform-destructuring": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.8.3.tgz", - "integrity": "sha512-H4X646nCkiEcHZUZaRkhE2XVsoz0J/1x3VVujnn96pSoGCtKPA99ZZA+va+gK+92Zycd6OBKCD8tDb/731bhgQ==", + "version": "7.9.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.9.5.tgz", + "integrity": "sha512-j3OEsGel8nHL/iusv/mRd5fYZ3DrOxWC82x0ogmdN/vHfAP4MYw+AFKYanzWlktNwikKvlzUV//afBW5FTp17Q==", "requires": { "@babel/helper-plugin-utils": "^7.8.3" } @@ -627,18 +636,18 @@ } }, "@babel/plugin-transform-flow-strip-types": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.8.3.tgz", - "integrity": "sha512-g/6WTWG/xbdd2exBBzMfygjX/zw4eyNC4X8pRaq7aRHRoDUCzAIu3kGYIXviOv8BjCuWm8vDBwjHcjiRNgXrPA==", + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.9.0.tgz", + "integrity": "sha512-7Qfg0lKQhEHs93FChxVLAvhBshOPQDtJUTVHr/ZwQNRccCm4O9D79r9tVSoV8iNwjP1YgfD+e/fgHcPkN1qEQg==", "requires": { "@babel/helper-plugin-utils": "^7.8.3", "@babel/plugin-syntax-flow": "^7.8.3" } }, "@babel/plugin-transform-for-of": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.8.4.tgz", - "integrity": "sha512-iAXNlOWvcYUYoV8YIxwS7TxGRJcxyl8eQCfT+A5j8sKUzRFvJdcyjp97jL2IghWSRDaL2PU2O2tX8Cu9dTBq5A==", + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.9.0.tgz", + "integrity": "sha512-lTAnWOpMwOXpyDx06N+ywmF3jNbafZEqZ96CGYabxHrxNX8l5ny7dt4bK/rGwAh9utyP2b2Hv7PlZh1AAS54FQ==", "requires": { "@babel/helper-plugin-utils": "^7.8.3" } @@ -669,43 +678,43 @@ } }, "@babel/plugin-transform-modules-amd": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.8.3.tgz", - "integrity": "sha512-MadJiU3rLKclzT5kBH4yxdry96odTUwuqrZM+GllFI/VhxfPz+k9MshJM+MwhfkCdxxclSbSBbUGciBngR+kEQ==", + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.9.0.tgz", + "integrity": "sha512-vZgDDF003B14O8zJy0XXLnPH4sg+9X5hFBBGN1V+B2rgrB+J2xIypSN6Rk9imB2hSTHQi5OHLrFWsZab1GMk+Q==", "requires": { - "@babel/helper-module-transforms": "^7.8.3", + "@babel/helper-module-transforms": "^7.9.0", "@babel/helper-plugin-utils": "^7.8.3", "babel-plugin-dynamic-import-node": "^2.3.0" } }, "@babel/plugin-transform-modules-commonjs": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.8.3.tgz", - "integrity": "sha512-JpdMEfA15HZ/1gNuB9XEDlZM1h/gF/YOH7zaZzQu2xCFRfwc01NXBMHHSTT6hRjlXJJs5x/bfODM3LiCk94Sxg==", + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.9.0.tgz", + "integrity": "sha512-qzlCrLnKqio4SlgJ6FMMLBe4bySNis8DFn1VkGmOcxG9gqEyPIOzeQrA//u0HAKrWpJlpZbZMPB1n/OPa4+n8g==", "requires": { - "@babel/helper-module-transforms": "^7.8.3", + "@babel/helper-module-transforms": "^7.9.0", "@babel/helper-plugin-utils": "^7.8.3", "@babel/helper-simple-access": "^7.8.3", "babel-plugin-dynamic-import-node": "^2.3.0" } }, "@babel/plugin-transform-modules-systemjs": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.8.3.tgz", - "integrity": "sha512-8cESMCJjmArMYqa9AO5YuMEkE4ds28tMpZcGZB/jl3n0ZzlsxOAi3mC+SKypTfT8gjMupCnd3YiXCkMjj2jfOg==", + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.9.0.tgz", + "integrity": "sha512-FsiAv/nao/ud2ZWy4wFacoLOm5uxl0ExSQ7ErvP7jpoihLR6Cq90ilOFyX9UXct3rbtKsAiZ9kFt5XGfPe/5SQ==", "requires": { "@babel/helper-hoist-variables": "^7.8.3", - "@babel/helper-module-transforms": "^7.8.3", + "@babel/helper-module-transforms": "^7.9.0", "@babel/helper-plugin-utils": "^7.8.3", "babel-plugin-dynamic-import-node": "^2.3.0" } }, "@babel/plugin-transform-modules-umd": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.8.3.tgz", - "integrity": "sha512-evhTyWhbwbI3/U6dZAnx/ePoV7H6OUG+OjiJFHmhr9FPn0VShjwC2kdxqIuQ/+1P50TMrneGzMeyMTFOjKSnAw==", + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.9.0.tgz", + "integrity": "sha512-uTWkXkIVtg/JGRSIABdBoMsoIeoHQHPTL0Y2E7xf5Oj7sLqwVsNXOkNk0VJc7vF0IMBsPeikHxFjGe+qmwPtTQ==", "requires": { - "@babel/helper-module-transforms": "^7.8.3", + "@babel/helper-module-transforms": "^7.9.0", "@babel/helper-plugin-utils": "^7.8.3" } }, @@ -735,11 +744,10 @@ } }, "@babel/plugin-transform-parameters": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.8.4.tgz", - "integrity": "sha512-IsS3oTxeTsZlE5KqzTbcC2sV0P9pXdec53SU+Yxv7o/6dvGM5AkTotQKhoSffhNgZ/dftsSiOoxy7evCYJXzVA==", + "version": "7.9.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.9.5.tgz", + "integrity": "sha512-0+1FhHnMfj6lIIhVvS4KGQJeuhe1GI//h5uptK4PvLt+BGBxsoUJbd3/IW002yk//6sZPlFgsG1hY6OHLcy6kA==", "requires": { - "@babel/helper-call-delegate": "^7.8.3", "@babel/helper-get-function-arity": "^7.8.3", "@babel/helper-plugin-utils": "^7.8.3" } @@ -753,11 +761,10 @@ } }, "@babel/plugin-transform-react-constant-elements": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.8.3.tgz", - "integrity": "sha512-glrzN2U+egwRfkNFtL34xIBYTxbbUF2qJTP8HD3qETBBqzAWSeNB821X0GjU06+dNpq/UyCIjI72FmGE5NNkQQ==", + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.9.0.tgz", + "integrity": "sha512-wXMXsToAUOxJuBBEHajqKLFWcCkOSLshTI2ChCFFj1zDd7od4IOxiwLCOObNUvOpkxLpjIuaIdBMmNt6ocCPAw==", "requires": { - "@babel/helper-annotate-as-pure": "^7.8.3", "@babel/helper-plugin-utils": "^7.8.3" } }, @@ -770,39 +777,50 @@ } }, "@babel/plugin-transform-react-jsx": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.8.3.tgz", - "integrity": "sha512-r0h+mUiyL595ikykci+fbwm9YzmuOrUBi0b+FDIKmi3fPQyFokWVEMJnRWHJPPQEjyFJyna9WZC6Viv6UHSv1g==", + "version": "7.9.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.9.4.tgz", + "integrity": "sha512-Mjqf3pZBNLt854CK0C/kRuXAnE6H/bo7xYojP+WGtX8glDGSibcwnsWwhwoSuRg0+EBnxPC1ouVnuetUIlPSAw==", "requires": { - "@babel/helper-builder-react-jsx": "^7.8.3", + "@babel/helper-builder-react-jsx": "^7.9.0", + "@babel/helper-builder-react-jsx-experimental": "^7.9.0", + "@babel/helper-plugin-utils": "^7.8.3", + "@babel/plugin-syntax-jsx": "^7.8.3" + } + }, + "@babel/plugin-transform-react-jsx-development": { + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.9.0.tgz", + "integrity": "sha512-tK8hWKrQncVvrhvtOiPpKrQjfNX3DtkNLSX4ObuGcpS9p0QrGetKmlySIGR07y48Zft8WVgPakqd/bk46JrMSw==", + "requires": { + "@babel/helper-builder-react-jsx-experimental": "^7.9.0", "@babel/helper-plugin-utils": "^7.8.3", "@babel/plugin-syntax-jsx": "^7.8.3" } }, "@babel/plugin-transform-react-jsx-self": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.8.3.tgz", - "integrity": "sha512-01OT7s5oa0XTLf2I8XGsL8+KqV9lx3EZV+jxn/L2LQ97CGKila2YMroTkCEIE0HV/FF7CMSRsIAybopdN9NTdg==", + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.9.0.tgz", + "integrity": "sha512-K2ObbWPKT7KUTAoyjCsFilOkEgMvFG+y0FqOl6Lezd0/13kMkkjHskVsZvblRPj1PHA44PrToaZANrryppzTvQ==", "requires": { "@babel/helper-plugin-utils": "^7.8.3", "@babel/plugin-syntax-jsx": "^7.8.3" } }, "@babel/plugin-transform-react-jsx-source": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.8.3.tgz", - "integrity": "sha512-PLMgdMGuVDtRS/SzjNEQYUT8f4z1xb2BAT54vM1X5efkVuYBf5WyGUMbpmARcfq3NaglIwz08UVQK4HHHbC6ag==", + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.9.0.tgz", + "integrity": "sha512-K6m3LlSnTSfRkM6FcRk8saNEeaeyG5k7AVkBU2bZK3+1zdkSED3qNdsWrUgQBeTVD2Tp3VMmerxVO2yM5iITmw==", "requires": { "@babel/helper-plugin-utils": "^7.8.3", "@babel/plugin-syntax-jsx": "^7.8.3" } }, "@babel/plugin-transform-regenerator": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.8.3.tgz", - "integrity": "sha512-qt/kcur/FxrQrzFR432FGZznkVAjiyFtCOANjkAKwCbt465L6ZCiUQh2oMYGU3Wo8LRFJxNDFwWn106S5wVUNA==", + "version": "7.8.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.8.7.tgz", + "integrity": "sha512-TIg+gAl4Z0a3WmD3mbYSk+J9ZUH6n/Yc57rtKRnlA/7rcCvpekHXe0CMZHP1gYp7/KLe9GHTuIba0vXmls6drA==", "requires": { - "regenerator-transform": "^0.14.0" + "regenerator-transform": "^0.14.2" } }, "@babel/plugin-transform-reserved-words": { @@ -814,9 +832,9 @@ } }, "@babel/plugin-transform-runtime": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.8.3.tgz", - "integrity": "sha512-/vqUt5Yh+cgPZXXjmaG9NT8aVfThKk7G4OqkVhrXqwsC5soMn/qTCxs36rZ2QFhpfTJcjw4SNDIZ4RUb8OL4jQ==", + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.9.0.tgz", + "integrity": "sha512-pUu9VSf3kI1OqbWINQ7MaugnitRss1z533436waNXp+0N3ur3zfut37sXiQMxkuCF4VUjwZucen/quskCh7NHw==", "requires": { "@babel/helper-module-imports": "^7.8.3", "@babel/helper-plugin-utils": "^7.8.3", @@ -874,9 +892,9 @@ } }, "@babel/plugin-transform-typescript": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.8.3.tgz", - "integrity": "sha512-Ebj230AxcrKGZPKIp4g4TdQLrqX95TobLUWKd/CwG7X1XHUH1ZpkpFvXuXqWbtGRWb7uuEWNlrl681wsOArAdQ==", + "version": "7.9.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.9.4.tgz", + "integrity": "sha512-yeWeUkKx2auDbSxRe8MusAG+n4m9BFY/v+lPjmQDgOFX5qnySkUY5oXzkp6FwPdsYqnKay6lorXYdC0n3bZO7w==", "requires": { "@babel/helper-create-class-features-plugin": "^7.8.3", "@babel/helper-plugin-utils": "^7.8.3", @@ -893,26 +911,28 @@ } }, "@babel/preset-env": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.8.4.tgz", - "integrity": "sha512-HihCgpr45AnSOHRbS5cWNTINs0TwaR8BS8xIIH+QwiW8cKL0llV91njQMpeMReEPVs+1Ao0x3RLEBLtt1hOq4w==", + "version": "7.9.5", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.9.5.tgz", + "integrity": "sha512-eWGYeADTlPJH+wq1F0wNfPbVS1w1wtmMJiYk55Td5Yu28AsdR9AsC97sZ0Qq8fHqQuslVSIYSGJMcblr345GfQ==", "requires": { - "@babel/compat-data": "^7.8.4", - "@babel/helper-compilation-targets": "^7.8.4", + "@babel/compat-data": "^7.9.0", + "@babel/helper-compilation-targets": "^7.8.7", "@babel/helper-module-imports": "^7.8.3", "@babel/helper-plugin-utils": "^7.8.3", "@babel/plugin-proposal-async-generator-functions": "^7.8.3", "@babel/plugin-proposal-dynamic-import": "^7.8.3", "@babel/plugin-proposal-json-strings": "^7.8.3", "@babel/plugin-proposal-nullish-coalescing-operator": "^7.8.3", - "@babel/plugin-proposal-object-rest-spread": "^7.8.3", + "@babel/plugin-proposal-numeric-separator": "^7.8.3", + "@babel/plugin-proposal-object-rest-spread": "^7.9.5", "@babel/plugin-proposal-optional-catch-binding": "^7.8.3", - "@babel/plugin-proposal-optional-chaining": "^7.8.3", + "@babel/plugin-proposal-optional-chaining": "^7.9.0", "@babel/plugin-proposal-unicode-property-regex": "^7.8.3", "@babel/plugin-syntax-async-generators": "^7.8.0", "@babel/plugin-syntax-dynamic-import": "^7.8.0", "@babel/plugin-syntax-json-strings": "^7.8.0", "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.0", + "@babel/plugin-syntax-numeric-separator": "^7.8.0", "@babel/plugin-syntax-object-rest-spread": "^7.8.0", "@babel/plugin-syntax-optional-catch-binding": "^7.8.0", "@babel/plugin-syntax-optional-chaining": "^7.8.0", @@ -921,26 +941,26 @@ "@babel/plugin-transform-async-to-generator": "^7.8.3", "@babel/plugin-transform-block-scoped-functions": "^7.8.3", "@babel/plugin-transform-block-scoping": "^7.8.3", - "@babel/plugin-transform-classes": "^7.8.3", + "@babel/plugin-transform-classes": "^7.9.5", "@babel/plugin-transform-computed-properties": "^7.8.3", - "@babel/plugin-transform-destructuring": "^7.8.3", + "@babel/plugin-transform-destructuring": "^7.9.5", "@babel/plugin-transform-dotall-regex": "^7.8.3", "@babel/plugin-transform-duplicate-keys": "^7.8.3", "@babel/plugin-transform-exponentiation-operator": "^7.8.3", - "@babel/plugin-transform-for-of": "^7.8.4", + "@babel/plugin-transform-for-of": "^7.9.0", "@babel/plugin-transform-function-name": "^7.8.3", "@babel/plugin-transform-literals": "^7.8.3", "@babel/plugin-transform-member-expression-literals": "^7.8.3", - "@babel/plugin-transform-modules-amd": "^7.8.3", - "@babel/plugin-transform-modules-commonjs": "^7.8.3", - "@babel/plugin-transform-modules-systemjs": "^7.8.3", - "@babel/plugin-transform-modules-umd": "^7.8.3", + "@babel/plugin-transform-modules-amd": "^7.9.0", + "@babel/plugin-transform-modules-commonjs": "^7.9.0", + "@babel/plugin-transform-modules-systemjs": "^7.9.0", + "@babel/plugin-transform-modules-umd": "^7.9.0", "@babel/plugin-transform-named-capturing-groups-regex": "^7.8.3", "@babel/plugin-transform-new-target": "^7.8.3", "@babel/plugin-transform-object-super": "^7.8.3", - "@babel/plugin-transform-parameters": "^7.8.4", + "@babel/plugin-transform-parameters": "^7.9.5", "@babel/plugin-transform-property-literals": "^7.8.3", - "@babel/plugin-transform-regenerator": "^7.8.3", + "@babel/plugin-transform-regenerator": "^7.8.7", "@babel/plugin-transform-reserved-words": "^7.8.3", "@babel/plugin-transform-shorthand-properties": "^7.8.3", "@babel/plugin-transform-spread": "^7.8.3", @@ -948,8 +968,9 @@ "@babel/plugin-transform-template-literals": "^7.8.3", "@babel/plugin-transform-typeof-symbol": "^7.8.4", "@babel/plugin-transform-unicode-regex": "^7.8.3", - "@babel/types": "^7.8.3", - "browserslist": "^4.8.5", + "@babel/preset-modules": "^0.1.3", + "@babel/types": "^7.9.5", + "browserslist": "^4.9.1", "core-js-compat": "^3.6.2", "invariant": "^2.2.2", "levenary": "^1.1.1", @@ -963,25 +984,38 @@ } } }, + "@babel/preset-modules": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.3.tgz", + "integrity": "sha512-Ra3JXOHBq2xd56xSF7lMKXdjBn3T772Y1Wet3yWnkDly9zHvJki029tAFzvAAK5cf4YV3yoxuP61crYRol6SVg==", + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/plugin-proposal-unicode-property-regex": "^7.4.4", + "@babel/plugin-transform-dotall-regex": "^7.4.4", + "@babel/types": "^7.4.4", + "esutils": "^2.0.2" + } + }, "@babel/preset-react": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.8.3.tgz", - "integrity": "sha512-9hx0CwZg92jGb7iHYQVgi0tOEHP/kM60CtWJQnmbATSPIQQ2xYzfoCI3EdqAhFBeeJwYMdWQuDUHMsuDbH9hyQ==", + "version": "7.9.4", + "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.9.4.tgz", + "integrity": "sha512-AxylVB3FXeOTQXNXyiuAQJSvss62FEotbX2Pzx3K/7c+MKJMdSg6Ose6QYllkdCFA8EInCJVw7M/o5QbLuA4ZQ==", "requires": { "@babel/helper-plugin-utils": "^7.8.3", "@babel/plugin-transform-react-display-name": "^7.8.3", - "@babel/plugin-transform-react-jsx": "^7.8.3", - "@babel/plugin-transform-react-jsx-self": "^7.8.3", - "@babel/plugin-transform-react-jsx-source": "^7.8.3" + "@babel/plugin-transform-react-jsx": "^7.9.4", + "@babel/plugin-transform-react-jsx-development": "^7.9.0", + "@babel/plugin-transform-react-jsx-self": "^7.9.0", + "@babel/plugin-transform-react-jsx-source": "^7.9.0" } }, "@babel/preset-typescript": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.8.3.tgz", - "integrity": "sha512-qee5LgPGui9zQ0jR1TeU5/fP9L+ovoArklEqY12ek8P/wV5ZeM/VYSQYwICeoT6FfpJTekG9Ilay5PhwsOpMHA==", + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.9.0.tgz", + "integrity": "sha512-S4cueFnGrIbvYJgwsVFKdvOmpiL0XGw9MFW9D0vgRys5g36PBhZRL8NX8Gr2akz8XRtzq6HuDXPD/1nniagNUg==", "requires": { "@babel/helper-plugin-utils": "^7.8.3", - "@babel/plugin-transform-typescript": "^7.8.3" + "@babel/plugin-transform-typescript": "^7.9.0" } }, "@babel/runtime": { @@ -999,38 +1033,54 @@ } } }, + "@babel/runtime-corejs3": { + "version": "7.9.2", + "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.9.2.tgz", + "integrity": "sha512-HHxmgxbIzOfFlZ+tdeRKtaxWOMUoCG5Mu3wKeUmOxjYrwb3AAHgnmtCUbPPK11/raIWLIBK250t8E2BPO0p7jA==", + "requires": { + "core-js-pure": "^3.0.0", + "regenerator-runtime": "^0.13.4" + }, + "dependencies": { + "regenerator-runtime": { + "version": "0.13.5", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.5.tgz", + "integrity": "sha512-ZS5w8CpKFinUzOwW3c83oPeVXoNsrLsaCoLtJvAClH135j/R77RuymhiSErhm2lKcwSCIpmvIWSbDkIfAqKQlA==" + } + } + }, "@babel/template": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.8.3.tgz", - "integrity": "sha512-04m87AcQgAFdvuoyiQ2kgELr2tV8B4fP/xJAVUL3Yb3bkNdMedD3d0rlSQr3PegP0cms3eHjl1F7PWlvWbU8FQ==", + "version": "7.8.6", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.8.6.tgz", + "integrity": "sha512-zbMsPMy/v0PWFZEhQJ66bqjhH+z0JgMoBWuikXybgG3Gkd/3t5oQ1Rw2WQhnSrsOmsKXnZOx15tkC4qON/+JPg==", "requires": { "@babel/code-frame": "^7.8.3", - "@babel/parser": "^7.8.3", - "@babel/types": "^7.8.3" + "@babel/parser": "^7.8.6", + "@babel/types": "^7.8.6" } }, "@babel/traverse": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.8.4.tgz", - "integrity": "sha512-NGLJPZwnVEyBPLI+bl9y9aSnxMhsKz42so7ApAv9D+b4vAFPpY013FTS9LdKxcABoIYFU52HcYga1pPlx454mg==", + "version": "7.9.5", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.9.5.tgz", + "integrity": "sha512-c4gH3jsvSuGUezlP6rzSJ6jf8fYjLj3hsMZRx/nX0h+fmHN0w+ekubRrHPqnMec0meycA2nwCsJ7dC8IPem2FQ==", "requires": { "@babel/code-frame": "^7.8.3", - "@babel/generator": "^7.8.4", - "@babel/helper-function-name": "^7.8.3", + "@babel/generator": "^7.9.5", + "@babel/helper-function-name": "^7.9.5", "@babel/helper-split-export-declaration": "^7.8.3", - "@babel/parser": "^7.8.4", - "@babel/types": "^7.8.3", + "@babel/parser": "^7.9.0", + "@babel/types": "^7.9.5", "debug": "^4.1.0", "globals": "^11.1.0", "lodash": "^4.17.13" } }, "@babel/types": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.3.tgz", - "integrity": "sha512-jBD+G8+LWpMBBWvVcdr4QysjUE4mU/syrhN17o1u3gx0/WzJB1kwiVZAXRtWbsIPOwW8pF/YJV5+nmetPzepXg==", + "version": "7.9.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.9.5.tgz", + "integrity": "sha512-XjnvNqenk818r5zMaba+sLQjnbda31UfUURv3ei0qPQw4u+j2jMyJ5b11y8ZHYTRSI3NnInQkkkRT4fLqqPdHg==", "requires": { - "esutils": "^2.0.2", + "@babel/helper-validator-identifier": "^7.9.5", "lodash": "^4.17.13", "to-fast-properties": "^2.0.0" } @@ -1042,13 +1092,6 @@ "requires": { "exec-sh": "^0.3.2", "minimist": "^1.2.0" - }, - "dependencies": { - "minimist": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" - } } }, "@csstools/convert-colors": { @@ -1062,32 +1105,39 @@ "integrity": "sha512-ij4wRiunFfaJxjB0BdrYHIH8FxBJpOwNPhhAcunlmPdXudL1WQV1qoP9un6JsEBAgQH+7UXyyjh0g7jTxXK6tg==" }, "@fortawesome/fontawesome-common-types": { - "version": "0.2.27", - "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-common-types/-/fontawesome-common-types-0.2.27.tgz", - "integrity": "sha512-97GaByGaXDGMkzcJX7VmR/jRJd8h1mfhtA7RsxDBN61GnWE/PPCZhOdwG/8OZYktiRUF0CvFOr+VgRkJrt6TWg==" + "version": "0.2.28", + "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-common-types/-/fontawesome-common-types-0.2.28.tgz", + "integrity": "sha512-gtis2/5yLdfI6n0ia0jH7NJs5i/Z/8M/ZbQL6jXQhCthEOe5Cr5NcQPhgTvFxNOtURE03/ZqUcEskdn2M+QaBg==" }, "@fortawesome/fontawesome-svg-core": { - "version": "1.2.27", - "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-svg-core/-/fontawesome-svg-core-1.2.27.tgz", - "integrity": "sha512-sOD3DKynocnHYpuw2sLPnTunDj7rLk91LYhi2axUYwuGe9cPCw7Bsu9EWtVdNJP+IYgTCZIbyARKXuy5K/nv+Q==", + "version": "1.2.28", + "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-svg-core/-/fontawesome-svg-core-1.2.28.tgz", + "integrity": "sha512-4LeaNHWvrneoU0i8b5RTOJHKx7E+y7jYejplR7uSVB34+mp3Veg7cbKk7NBCLiI4TyoWS1wh9ZdoyLJR8wSAdg==", "requires": { - "@fortawesome/fontawesome-common-types": "^0.2.27" + "@fortawesome/fontawesome-common-types": "^0.2.28" + }, + "dependencies": { + "@fortawesome/fontawesome-common-types": { + "version": "0.2.28", + "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-common-types/-/fontawesome-common-types-0.2.28.tgz", + "integrity": "sha512-gtis2/5yLdfI6n0ia0jH7NJs5i/Z/8M/ZbQL6jXQhCthEOe5Cr5NcQPhgTvFxNOtURE03/ZqUcEskdn2M+QaBg==" + } } }, "@fortawesome/free-solid-svg-icons": { - "version": "5.12.1", - "resolved": "https://registry.npmjs.org/@fortawesome/free-solid-svg-icons/-/free-solid-svg-icons-5.12.1.tgz", - "integrity": "sha512-k3MwRFFUhyL4cuCJSaHDA0YNYMELDXX0h8JKtWYxO5XD3Dn+maXOMrVAAiNGooUyM2v/wz/TOaM0jxYVKeXX7g==", + "version": "5.13.0", + "resolved": "https://registry.npmjs.org/@fortawesome/free-solid-svg-icons/-/free-solid-svg-icons-5.13.0.tgz", + "integrity": "sha512-IHUgDJdomv6YtG4p3zl1B5wWf9ffinHIvebqQOmV3U+3SLw4fC+LUCCgwfETkbTtjy5/Qws2VoVf6z/ETQpFpg==", "requires": { - "@fortawesome/fontawesome-common-types": "^0.2.27" + "@fortawesome/fontawesome-common-types": "^0.2.28" } }, "@fortawesome/react-fontawesome": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/@fortawesome/react-fontawesome/-/react-fontawesome-0.1.8.tgz", - "integrity": "sha512-I5h9YQg/ePA3Br9ISS18fcwOYmzQYDSM1ftH03/8nHkiqIVHtUyQBw482+60dnzvlr82gHt3mGm+nDUp159FCw==", + "version": "0.1.9", + "resolved": "https://registry.npmjs.org/@fortawesome/react-fontawesome/-/react-fontawesome-0.1.9.tgz", + "integrity": "sha512-49V3WNysLZU5fZ3sqSuys4nGRytsrxJktbv3vuaXkEoxv22C6T7TEG0TW6+nqVjMnkfCQd5xOnmJoZHMF78tOw==", "requires": { - "prop-types": "^15.5.10" + "prop-types": "^15.7.2" } }, "@hapi/address": { @@ -1310,6 +1360,11 @@ "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-1.1.3.tgz", "integrity": "sha512-shAmDyaQC4H92APFoIaVDHCx5bStIocgvbwQyxPRrbUY20V1EYTbSDchWbuwlMG3V17cprZhA6+78JfB+3DTPw==" }, + "@popperjs/core": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.3.3.tgz", + "integrity": "sha512-yEvVC8RfhRPkD9TUn7cFcLcgoJePgZRAOR7T21rcRY5I8tpuhzeWfGa7We7tB14fe9R7wENdqUABcMdwD4SQLw==" + }, "@react-dnd/asap": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/@react-dnd/asap/-/asap-4.0.0.tgz", @@ -1331,9 +1386,13 @@ "integrity": "sha512-INJYZQJP7g+IoDUh/475NlGiTeMfwTXUEr3tmRneckHIxNolGOW9CTq83S8cxq0CgJwwcMzMJFchxvlwe7Rk8Q==" }, "@restart/hooks": { - "version": "0.3.19", - "resolved": "https://registry.npmjs.org/@restart/hooks/-/hooks-0.3.19.tgz", - "integrity": "sha512-8bskLEkiDvuZztnfGN+vM56q2HQV8dyXS/Eb0nhXPx6fonii3hQLxfNVA2r5NTMbvEkwDo59bAau3idUXaGvww==" + "version": "0.3.22", + "resolved": "https://registry.npmjs.org/@restart/hooks/-/hooks-0.3.22.tgz", + "integrity": "sha512-tW0T3hP6emYNOc76/iC96rlu+f7JYLSVk/Wnn+7dj1gJUcw4CkQNLy16vx2mBLtVKsFMZ9miVEZXat8blruDHQ==", + "requires": { + "lodash": "^4.17.15", + "lodash-es": "^4.17.15" + } }, "@svgr/babel-plugin-add-jsx-attribute": { "version": "4.2.0", @@ -1445,9 +1504,9 @@ } }, "@types/babel__core": { - "version": "7.1.4", - "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.4.tgz", - "integrity": "sha512-c/5MuRz5HM4aizqL5ViYfW4iEnmfPcfbH4Xa6GgLT21dMc1NGeNnuS6egHheOmP+kCJ9CAzC4pv4SDCWTnRkbg==", + "version": "7.1.7", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.7.tgz", + "integrity": "sha512-RL62NqSFPCDK2FM1pSDH0scHpJvsXtZNiYlMB73DgPBaG1E38ZYVL+ei5EkWRbr+KC4YNiAUNBnRj+bgwpgjMw==", "requires": { "@babel/parser": "^7.1.0", "@babel/types": "^7.0.0", @@ -1474,13 +1533,18 @@ } }, "@types/babel__traverse": { - "version": "7.0.8", - "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.0.8.tgz", - "integrity": "sha512-yGeB2dHEdvxjP0y4UbRtQaSkXJ9649fYCmIdRoul5kfAoGCwxuCbMhag0k3RPfnuh9kPGm8x89btcfDEXdVWGw==", + "version": "7.0.10", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.0.10.tgz", + "integrity": "sha512-74fNdUGrWsgIB/V9kTO5FGHPWYY6Eqn+3Z7L6Hc4e/BxjYV7puvBqp5HwsVYYfLm6iURYBNCx4Ut37OF9yitCw==", "requires": { "@babel/types": "^7.3.0" } }, + "@types/color-name": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@types/color-name/-/color-name-1.1.1.tgz", + "integrity": "sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ==" + }, "@types/eslint-visitor-keys": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/@types/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz", @@ -1543,9 +1607,9 @@ "integrity": "sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA==" }, "@types/node": { - "version": "13.7.1", - "resolved": "https://registry.npmjs.org/@types/node/-/node-13.7.1.tgz", - "integrity": "sha512-Zq8gcQGmn4txQEJeiXo/KiLpon8TzAl0kmKH4zdWctPj05nWwp1ClMdAVEloqrQKfaC48PNLdgN/aVaLqUrluA==" + "version": "13.13.4", + "resolved": "https://registry.npmjs.org/@types/node/-/node-13.13.4.tgz", + "integrity": "sha512-x26ur3dSXgv5AwKS0lNfbjpCakGIduWU1DU91Zz58ONRWrIKGunmZBNv4P7N+e27sJkiGDsw/3fT4AtsqQBrBA==" }, "@types/parse-json": { "version": "4.0.0", @@ -1576,6 +1640,11 @@ "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-1.0.1.tgz", "integrity": "sha512-l42BggppR6zLmpfU6fq9HEa2oGPEI8yrSPL3GITjfRInppYFahObbIQOQK3UGxEnyQpltZLaPe75046NOZQikw==" }, + "@types/warning": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/warning/-/warning-3.0.0.tgz", + "integrity": "sha1-DSUBJorY+ZYrdA04fEZU9fjiPlI=" + }, "@types/yargs": { "version": "13.0.8", "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-13.0.8.tgz", @@ -1590,42 +1659,42 @@ "integrity": "sha512-FA/BWv8t8ZWJ+gEOnLLd8ygxH/2UFbAvgEonyfN6yWGLKc7zVjbpl2Y4CTjid9h2RfgPP6SEt6uHwEOply00yw==" }, "@typescript-eslint/eslint-plugin": { - "version": "2.20.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-2.20.0.tgz", - "integrity": "sha512-cimIdVDV3MakiGJqMXw51Xci6oEDEoPkvh8ggJe2IIzcc0fYqAxOXN6Vbeanahz6dLZq64W+40iUEc9g32FLDQ==", + "version": "2.29.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-2.29.0.tgz", + "integrity": "sha512-X/YAY7azKirENm4QRpT7OVmzok02cSkqeIcLmdz6gXUQG4Hk0Fi9oBAynSAyNXeGdMRuZvjBa0c1Lu0dn/u6VA==", "requires": { - "@typescript-eslint/experimental-utils": "2.20.0", - "eslint-utils": "^1.4.3", + "@typescript-eslint/experimental-utils": "2.29.0", "functional-red-black-tree": "^1.0.1", "regexpp": "^3.0.0", "tsutils": "^3.17.1" } }, "@typescript-eslint/experimental-utils": { - "version": "2.20.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-2.20.0.tgz", - "integrity": "sha512-fEBy9xYrwG9hfBLFEwGW2lKwDRTmYzH3DwTmYbT+SMycmxAoPl0eGretnBFj/s+NfYBG63w/5c3lsvqqz5mYag==", + "version": "2.29.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-2.29.0.tgz", + "integrity": "sha512-H/6VJr6eWYstyqjWXBP2Nn1hQJyvJoFdDtsHxGiD+lEP7piGnGpb/ZQd+z1ZSB1F7dN+WsxUDh8+S4LwI+f3jw==", "requires": { "@types/json-schema": "^7.0.3", - "@typescript-eslint/typescript-estree": "2.20.0", - "eslint-scope": "^5.0.0" + "@typescript-eslint/typescript-estree": "2.29.0", + "eslint-scope": "^5.0.0", + "eslint-utils": "^2.0.0" } }, "@typescript-eslint/parser": { - "version": "2.20.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-2.20.0.tgz", - "integrity": "sha512-o8qsKaosLh2qhMZiHNtaHKTHyCHc3Triq6aMnwnWj7budm3xAY9owSZzV1uon5T9cWmJRJGzTFa90aex4m77Lw==", + "version": "2.29.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-2.29.0.tgz", + "integrity": "sha512-H78M+jcu5Tf6m/5N8iiFblUUv+HJDguMSdFfzwa6vSg9lKR8Mk9BsgeSjO8l2EshKnJKcbv0e8IDDOvSNjl0EA==", "requires": { "@types/eslint-visitor-keys": "^1.0.0", - "@typescript-eslint/experimental-utils": "2.20.0", - "@typescript-eslint/typescript-estree": "2.20.0", + "@typescript-eslint/experimental-utils": "2.29.0", + "@typescript-eslint/typescript-estree": "2.29.0", "eslint-visitor-keys": "^1.1.0" } }, "@typescript-eslint/typescript-estree": { - "version": "2.20.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-2.20.0.tgz", - "integrity": "sha512-WlFk8QtI8pPaE7JGQGxU7nGcnk1ccKAJkhbVookv94ZcAef3m6oCE/jEDL6dGte3JcD7reKrA0o55XhBRiVT3A==", + "version": "2.29.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-2.29.0.tgz", + "integrity": "sha512-3YGbtnWy4az16Egy5Fj5CckkVlpIh0MADtAQza+jiMADRSKkjdpzZp/5WuvwK/Qib3Z0HtzrDFeWanS99dNhnA==", "requires": { "debug": "^4.1.1", "eslint-visitor-keys": "^1.1.0", @@ -1824,9 +1893,9 @@ } }, "acorn": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.1.0.tgz", - "integrity": "sha512-kL5CuoXA/dgxlBbVrflsflzQ3PAas7RYZB52NOm/6839iVYJgKMJ3cQJD+t2i5+qFa8h3MDpEOJiS64E8JLnSQ==" + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.1.1.tgz", + "integrity": "sha512-add7dgA5ppRPxCFJoAGfMDi7PIBXq1RtGo7BhbLaxwrXPOmw8gq48Y9ozT01hUKy9byMjlR20EJhu5zlkErEkg==" }, "acorn-globals": { "version": "4.3.4", @@ -1838,16 +1907,16 @@ }, "dependencies": { "acorn": { - "version": "6.4.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.0.tgz", - "integrity": "sha512-gac8OEcQ2Li1dxIEWGZzsp2BitJxwkwcOm0zHAJLcPJaVvm58FRnk6RkuLRpU1EujipU2ZFODv2P9DLMfnV8mw==" + "version": "6.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.1.tgz", + "integrity": "sha512-ZVA9k326Nwrj3Cj9jlh3wGFutC2ZornPNARZwsNYqQYgN0EsV2d53w5RN/co65Ohn4sUAUtb1rSUAOD6XN9idA==" } } }, "acorn-jsx": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.1.0.tgz", - "integrity": "sha512-tMUqwBWfLFbJbizRmEcWSLw6HnFzfdJs2sOJEOwwtVPMoH/0Ay+E703oZz78VSXZiiDcZrQ5XKjPIUQixhmgVw==" + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.2.0.tgz", + "integrity": "sha512-HiUX/+K2YpkpJ+SzBffkM/AQ2YE03S0U1kjTLVpoJdhZMOWy8qvXVN9JdLqv2QsaQ6MPYQIuNmwD8zOiYUofLQ==" }, "acorn-walk": { "version": "6.2.0", @@ -1888,6 +1957,29 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.0.0.tgz", "integrity": "sha512-faqwZqnWxbxn+F1d399ygeamQNy3lPp/H9H6rNrqYh4FSVCtcY+3cub1MxA8o9mDd55mM8Aghuu/kuyYA6VTsA==" + }, + "emojis-list": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz", + "integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k=" + }, + "json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "requires": { + "minimist": "^1.2.0" + } + }, + "loader-utils": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.2.3.tgz", + "integrity": "sha512-fkpz8ejdnEMG3s37wGL07iSBDg99O9D5yflE9RGNH3hRdx9SOwYfnGYdZOUIZitN8E+E2vkq3MUMYMvPYl5ZZA==", + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^2.0.0", + "json5": "^1.0.1" + } } } }, @@ -1937,11 +2029,18 @@ "integrity": "sha512-hHUXGagefjN2iRrID63xckIvotOXOojhQKWIPUZ4mNUZ9nLZW+7FMNoE1lOkEhNWYsx/7ysGIuJYCiMAA9FnrA==" }, "ansi-escapes": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.0.tgz", - "integrity": "sha512-EiYhwo0v255HUL6eDyuLrXEkTi7WwVCLAw+SeOQ7M7qdun1z1pum4DEm/nuqIVbPvi9RPPc9k9LbyBv6H0DwVg==", + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.1.tgz", + "integrity": "sha512-JWF7ocqNrp8u9oqpgV+wH5ftbt+cfvv+PTjOvKLT3AdYly/LmORARfEVT1iyjwN+4MqE5UmVKoAdIBqeoCHgLA==", "requires": { - "type-fest": "^0.8.1" + "type-fest": "^0.11.0" + }, + "dependencies": { + "type-fest": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.11.0.tgz", + "integrity": "sha512-OdjXJxnCN1AvyLSzeKIgXTXxV+99ZuXl3Hpo9XpJAv9MBcHrrJOQ5kV7ypXOuQie+AmWG25hLbiKdwYTifzcfQ==" + } } }, "ansi-html": { @@ -2170,17 +2269,17 @@ "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==" }, "autoprefixer": { - "version": "9.7.4", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-9.7.4.tgz", - "integrity": "sha512-g0Ya30YrMBAEZk60lp+qfX5YQllG+S5W3GYCFvyHTvhOki0AEQJLPEcIuGRsqVwLi8FvXPVtwTGhfr38hVpm0g==", + "version": "9.7.6", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-9.7.6.tgz", + "integrity": "sha512-F7cYpbN7uVVhACZTeeIeealwdGM6wMtfWARVLTy5xmKtgVdBNJvbDRoCK3YO1orcs7gv/KwYlb3iXwu9Ug9BkQ==", "requires": { - "browserslist": "^4.8.3", - "caniuse-lite": "^1.0.30001020", + "browserslist": "^4.11.1", + "caniuse-lite": "^1.0.30001039", "chalk": "^2.4.2", "normalize-range": "^0.1.2", "num2fraction": "^1.2.2", - "postcss": "^7.0.26", - "postcss-value-parser": "^4.0.2" + "postcss": "^7.0.27", + "postcss-value-parser": "^4.0.3" } }, "aws-sign2": { @@ -2251,14 +2350,14 @@ } }, "babel-eslint": { - "version": "10.0.3", - "resolved": "https://registry.npmjs.org/babel-eslint/-/babel-eslint-10.0.3.tgz", - "integrity": "sha512-z3U7eMY6r/3f3/JB9mTsLjyxrv0Yb1zb8PCWCLpguxfCzBIZUwy23R1t/XKewP+8mEN2Ck8Dtr4q20z6ce6SoA==", + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/babel-eslint/-/babel-eslint-10.1.0.tgz", + "integrity": "sha512-ifWaTHQ0ce+448CYop8AdrQiBsGrnC+bMgfyKFdi6EsPLTAWG+QfyDeM6OH+FmWnKvEq5NnBMLvlBUPKQZoDSg==", "requires": { "@babel/code-frame": "^7.0.0", - "@babel/parser": "^7.0.0", - "@babel/traverse": "^7.0.0", - "@babel/types": "^7.0.0", + "@babel/parser": "^7.7.0", + "@babel/traverse": "^7.7.0", + "@babel/types": "^7.7.0", "eslint-visitor-keys": "^1.0.0", "resolve": "^1.12.0" } @@ -2286,14 +2385,15 @@ } }, "babel-loader": { - "version": "8.0.6", - "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.0.6.tgz", - "integrity": "sha512-4BmWKtBOBm13uoUwd08UwjZlaw3O9GWf456R9j+5YykFZ6LUIjIKLc0zEZf+hauxPOJs96C8k6FvYD09vWzhYw==", + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.1.0.tgz", + "integrity": "sha512-7q7nC1tYOrqvUrN3LQK4GwSk/TQorZSOlO9C+RZDZpODgyN4ZlCqE5q9cDsyWOliN+aU9B4JX01xK9eJXowJLw==", "requires": { - "find-cache-dir": "^2.0.0", - "loader-utils": "^1.0.2", - "mkdirp": "^0.5.1", - "pify": "^4.0.1" + "find-cache-dir": "^2.1.0", + "loader-utils": "^1.4.0", + "mkdirp": "^0.5.3", + "pify": "^4.0.1", + "schema-utils": "^2.6.5" }, "dependencies": { "pify": { @@ -2304,9 +2404,9 @@ } }, "babel-plugin-dynamic-import-node": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.0.tgz", - "integrity": "sha512-o6qFkpeQEBxcqt0XYlWzAVxNCSCZdUgcR8IRlhD/8DylxjjO4foPcvTW0GGKa/cVt3rvxZ7o5ippJ+/0nvLhlQ==", + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz", + "integrity": "sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ==", "requires": { "object.assign": "^4.1.0" } @@ -2320,6 +2420,46 @@ "find-up": "^3.0.0", "istanbul-lib-instrument": "^3.3.0", "test-exclude": "^5.2.3" + }, + "dependencies": { + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "requires": { + "locate-path": "^3.0.0" + } + }, + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "requires": { + "p-limit": "^2.0.0" + } + }, + "p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==" + } } }, "babel-plugin-jest-hoist": { @@ -2418,37 +2558,124 @@ } }, "babel-preset-react-app": { - "version": "9.1.1", - "resolved": "https://registry.npmjs.org/babel-preset-react-app/-/babel-preset-react-app-9.1.1.tgz", - "integrity": "sha512-YkWP2UwY//TLltNlEBRngDOrYhvSLb+CA330G7T9M5UhGEMWe+JK/8IXJc5p2fDTSfSiETf+PY0+PYXFMix81Q==", + "version": "9.1.2", + "resolved": "https://registry.npmjs.org/babel-preset-react-app/-/babel-preset-react-app-9.1.2.tgz", + "integrity": "sha512-k58RtQOKH21NyKtzptoAvtAODuAJJs3ZhqBMl456/GnXEQ/0La92pNmwgWoMn5pBTrsvk3YYXdY7zpY4e3UIxA==", "requires": { - "@babel/core": "7.8.4", + "@babel/core": "7.9.0", "@babel/plugin-proposal-class-properties": "7.8.3", "@babel/plugin-proposal-decorators": "7.8.3", + "@babel/plugin-proposal-nullish-coalescing-operator": "7.8.3", "@babel/plugin-proposal-numeric-separator": "7.8.3", - "@babel/plugin-transform-flow-strip-types": "7.8.3", + "@babel/plugin-proposal-optional-chaining": "7.9.0", + "@babel/plugin-transform-flow-strip-types": "7.9.0", "@babel/plugin-transform-react-display-name": "7.8.3", - "@babel/plugin-transform-runtime": "7.8.3", - "@babel/preset-env": "7.8.4", - "@babel/preset-react": "7.8.3", - "@babel/preset-typescript": "7.8.3", - "@babel/runtime": "7.8.4", + "@babel/plugin-transform-runtime": "7.9.0", + "@babel/preset-env": "7.9.0", + "@babel/preset-react": "7.9.1", + "@babel/preset-typescript": "7.9.0", + "@babel/runtime": "7.9.0", "babel-plugin-macros": "2.8.0", "babel-plugin-transform-react-remove-prop-types": "0.4.24" }, "dependencies": { - "@babel/runtime": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.8.4.tgz", - "integrity": "sha512-neAp3zt80trRVBI1x0azq6c57aNBqYZH8KhMm3TaB7wEI5Q4A2SHfBHE8w9gOhI/lrqxtEbXZgQIrHP+wvSGwQ==", + "@babel/preset-env": { + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.9.0.tgz", + "integrity": "sha512-712DeRXT6dyKAM/FMbQTV/FvRCms2hPCx+3weRjZ8iQVQWZejWWk1wwG6ViWMyqb/ouBbGOl5b6aCk0+j1NmsQ==", "requires": { - "regenerator-runtime": "^0.13.2" + "@babel/compat-data": "^7.9.0", + "@babel/helper-compilation-targets": "^7.8.7", + "@babel/helper-module-imports": "^7.8.3", + "@babel/helper-plugin-utils": "^7.8.3", + "@babel/plugin-proposal-async-generator-functions": "^7.8.3", + "@babel/plugin-proposal-dynamic-import": "^7.8.3", + "@babel/plugin-proposal-json-strings": "^7.8.3", + "@babel/plugin-proposal-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-proposal-numeric-separator": "^7.8.3", + "@babel/plugin-proposal-object-rest-spread": "^7.9.0", + "@babel/plugin-proposal-optional-catch-binding": "^7.8.3", + "@babel/plugin-proposal-optional-chaining": "^7.9.0", + "@babel/plugin-proposal-unicode-property-regex": "^7.8.3", + "@babel/plugin-syntax-async-generators": "^7.8.0", + "@babel/plugin-syntax-dynamic-import": "^7.8.0", + "@babel/plugin-syntax-json-strings": "^7.8.0", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.0", + "@babel/plugin-syntax-numeric-separator": "^7.8.0", + "@babel/plugin-syntax-object-rest-spread": "^7.8.0", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.0", + "@babel/plugin-syntax-optional-chaining": "^7.8.0", + "@babel/plugin-syntax-top-level-await": "^7.8.3", + "@babel/plugin-transform-arrow-functions": "^7.8.3", + "@babel/plugin-transform-async-to-generator": "^7.8.3", + "@babel/plugin-transform-block-scoped-functions": "^7.8.3", + "@babel/plugin-transform-block-scoping": "^7.8.3", + "@babel/plugin-transform-classes": "^7.9.0", + "@babel/plugin-transform-computed-properties": "^7.8.3", + "@babel/plugin-transform-destructuring": "^7.8.3", + "@babel/plugin-transform-dotall-regex": "^7.8.3", + "@babel/plugin-transform-duplicate-keys": "^7.8.3", + "@babel/plugin-transform-exponentiation-operator": "^7.8.3", + "@babel/plugin-transform-for-of": "^7.9.0", + "@babel/plugin-transform-function-name": "^7.8.3", + "@babel/plugin-transform-literals": "^7.8.3", + "@babel/plugin-transform-member-expression-literals": "^7.8.3", + "@babel/plugin-transform-modules-amd": "^7.9.0", + "@babel/plugin-transform-modules-commonjs": "^7.9.0", + "@babel/plugin-transform-modules-systemjs": "^7.9.0", + "@babel/plugin-transform-modules-umd": "^7.9.0", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.8.3", + "@babel/plugin-transform-new-target": "^7.8.3", + "@babel/plugin-transform-object-super": "^7.8.3", + "@babel/plugin-transform-parameters": "^7.8.7", + "@babel/plugin-transform-property-literals": "^7.8.3", + "@babel/plugin-transform-regenerator": "^7.8.7", + "@babel/plugin-transform-reserved-words": "^7.8.3", + "@babel/plugin-transform-shorthand-properties": "^7.8.3", + "@babel/plugin-transform-spread": "^7.8.3", + "@babel/plugin-transform-sticky-regex": "^7.8.3", + "@babel/plugin-transform-template-literals": "^7.8.3", + "@babel/plugin-transform-typeof-symbol": "^7.8.4", + "@babel/plugin-transform-unicode-regex": "^7.8.3", + "@babel/preset-modules": "^0.1.3", + "@babel/types": "^7.9.0", + "browserslist": "^4.9.1", + "core-js-compat": "^3.6.2", + "invariant": "^2.2.2", + "levenary": "^1.1.1", + "semver": "^5.5.0" + } + }, + "@babel/preset-react": { + "version": "7.9.1", + "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.9.1.tgz", + "integrity": "sha512-aJBYF23MPj0RNdp/4bHnAP0NVqqZRr9kl0NAOP4nJCex6OYVio59+dnQzsAWFuogdLyeaKA1hmfUIVZkY5J+TQ==", + "requires": { + "@babel/helper-plugin-utils": "^7.8.3", + "@babel/plugin-transform-react-display-name": "^7.8.3", + "@babel/plugin-transform-react-jsx": "^7.9.1", + "@babel/plugin-transform-react-jsx-development": "^7.9.0", + "@babel/plugin-transform-react-jsx-self": "^7.9.0", + "@babel/plugin-transform-react-jsx-source": "^7.9.0" + } + }, + "@babel/runtime": { + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.9.0.tgz", + "integrity": "sha512-cTIudHnzuWLS56ik4DnRnqqNf8MkdUzV4iFFI1h7Jo9xvrpQROYaAnaSd2mHLQAzzZAPfATynX5ord6YlNYNMA==", + "requires": { + "regenerator-runtime": "^0.13.4" } }, "regenerator-runtime": { - "version": "0.13.3", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.3.tgz", - "integrity": "sha512-naKIZz2GQ8JWh///G7L3X6LaQUAMp2lvb1rvwwsURe/VXwD6VMfr+/1NuNw3ag8v2kY1aQ/go5SNn79O9JU7yw==" + "version": "0.13.5", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.5.tgz", + "integrity": "sha512-ZS5w8CpKFinUzOwW3c83oPeVXoNsrLsaCoLtJvAClH135j/R77RuymhiSErhm2lKcwSCIpmvIWSbDkIfAqKQlA==" + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" } } }, @@ -2559,15 +2786,6 @@ "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.0.0.tgz", "integrity": "sha512-Phlt0plgpIIBOGTT/ehfFnbNlfsDEiqmzE2KRXoX1bLIlir4X/MR+zSyBEkL05ffWgnRSf/DXv+WrUAVr93/ow==" }, - "bindings": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", - "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", - "optional": true, - "requires": { - "file-uri-to-path": "1.0.0" - } - }, "block-stream": { "version": "0.0.9", "resolved": "https://registry.npmjs.org/block-stream/-/block-stream-0.0.9.tgz", @@ -2693,9 +2911,9 @@ "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=" }, "browser-process-hrtime": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-0.1.3.tgz", - "integrity": "sha512-bRFnI4NnjO6cnyLmOV/7PVoDEMJChlcfN0z4s1YMBY989/SvlfMI1lgCnkFUs53e9gQF+w7qu7XdllSTiSl8Aw==" + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz", + "integrity": "sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==" }, "browser-resolve": { "version": "1.11.3", @@ -2778,13 +2996,14 @@ } }, "browserslist": { - "version": "4.8.7", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.8.7.tgz", - "integrity": "sha512-gFOnZNYBHrEyUML0xr5NJ6edFaaKbTFX9S9kQHlYfCP0Rit/boRIz4G+Avq6/4haEKJXdGGUnoolx+5MWW2BoA==", + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.12.0.tgz", + "integrity": "sha512-UH2GkcEDSI0k/lRkuDSzFl9ZZ87skSy9w2XAn1MsZnL+4c4rqbBd3e82UWHbYDpztABrPBhZsTEeuxVfHppqDg==", "requires": { - "caniuse-lite": "^1.0.30001027", - "electron-to-chromium": "^1.3.349", - "node-releases": "^1.1.49" + "caniuse-lite": "^1.0.30001043", + "electron-to-chromium": "^1.3.413", + "node-releases": "^1.1.53", + "pkg-up": "^2.0.0" } }, "bser": { @@ -2908,12 +3127,12 @@ "integrity": "sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA=" }, "camel-case": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-3.0.0.tgz", - "integrity": "sha1-yjw2iKTpzzpM2nd9xNy8cTJJz3M=", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-4.1.1.tgz", + "integrity": "sha512-7fa2WcG4fYFkclIvEmxBbTvmibwF2/agfEBc6q3lOpVu0A13ltLsA+Hr/8Hp6kp5f+G7hKi6t8lys6XxP+1K6Q==", "requires": { - "no-case": "^2.2.0", - "upper-case": "^1.1.1" + "pascal-case": "^3.1.1", + "tslib": "^1.10.0" } }, "camelcase": { @@ -2949,9 +3168,9 @@ } }, "caniuse-lite": { - "version": "1.0.30001028", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001028.tgz", - "integrity": "sha512-Vnrq+XMSHpT7E+LWoIYhs3Sne8h9lx9YJV3acH3THNCwU/9zV93/ta4xVfzTtnqd3rvnuVpVjE3DFqf56tr3aQ==" + "version": "1.0.30001048", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001048.tgz", + "integrity": "sha512-g1iSHKVxornw0K8LG9LLdf+Fxnv7T1Z+mMsf0/YYLclQX4Cd522Ap0Lrw6NFqHgezit78dtyWxzlV2Xfc7vgRg==" }, "capture-exit": { "version": "2.0.0", @@ -3141,9 +3360,9 @@ } }, "cli-width": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.0.tgz", - "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=" + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.1.tgz", + "integrity": "sha512-GRMWDxpOB6Dgk2E5Uo+3eEBvtOOlimMmpbFiKuLFnQzYDavtLFY3K5ona41jgN/WdRZtG7utuVSVTL4HbZHGkw==" }, "cliui": { "version": "5.0.0", @@ -3441,11 +3660,11 @@ "integrity": "sha512-HOpZf6eXmnl7la+cUdMnLvUxKNqLUzJvgIziQ0DiF3JwSImNphIqdGqzj6hIKyX04MmV0poclQ7+wjWvxQyR2A==" }, "core-js-compat": { - "version": "3.6.4", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.6.4.tgz", - "integrity": "sha512-zAa3IZPvsJ0slViBQ2z+vgyyTuhd3MFn1rBQjZSKVEgB0UMYhUkCj9jJUVPgGTGqWvsBVmfnruXgTcNyTlEiSA==", + "version": "3.6.5", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.6.5.tgz", + "integrity": "sha512-7ItTKOhOZbznhXAQ2g/slGg1PJV5zDO/WdkTwi7UEOJmkvsE32PWvx6mKtDjiMpjnR2CNf6BAD6sSxIlv7ptng==", "requires": { - "browserslist": "^4.8.3", + "browserslist": "^4.8.5", "semver": "7.0.0" }, "dependencies": { @@ -3456,6 +3675,11 @@ } } }, + "core-js-pure": { + "version": "3.6.5", + "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.6.5.tgz", + "integrity": "sha512-lacdXOimsiD0QyNf9BC/mxivNJ/ybBGJXQFKzRekp1WTHoVUWsUHEn+2T8GJAzzIhyOuXA+gOxCVN3l+5PLPUA==" + }, "core-util-is": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", @@ -3757,11 +3981,27 @@ "integrity": "sha512-WcKx5OY+KoSIAxBW6UBBRay1U6vkYheCdjyVNDm85zt5K9mHoGOfsOsqIszfAqrQQFIIKgjh2+FDgIj/zsl21Q==" }, "csso": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/csso/-/csso-4.0.2.tgz", - "integrity": "sha512-kS7/oeNVXkHWxby5tHVxlhjizRCSv8QdU7hB2FpdAibDU8FjTAolhNjKNTiLzXtUrKT6HwClE81yXwEk1309wg==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/csso/-/csso-4.0.3.tgz", + "integrity": "sha512-NL3spysxUkcrOgnpsT4Xdl2aiEiBG6bXswAABQVHcMrfjjBisFOKwLDOmf4wf32aPdcJws1zds2B0Rg+jqMyHQ==", "requires": { - "css-tree": "1.0.0-alpha.37" + "css-tree": "1.0.0-alpha.39" + }, + "dependencies": { + "css-tree": { + "version": "1.0.0-alpha.39", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.0.0-alpha.39.tgz", + "integrity": "sha512-7UvkEYgBAHRG9Nt980lYxjsTrCyHFN53ky3wVsDkiMdVqylqRt+Zc+jm5qw7/qyOvN2dHSYtX0e4MbCCExSvnA==", + "requires": { + "mdn-data": "2.0.6", + "source-map": "^0.6.1" + } + }, + "mdn-data": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.6.tgz", + "integrity": "sha512-rQvjv71olwNHgiTbfPZFkJtjNMciWgswYeciZhtvWLO8bmX3TnhyA62I6sTWOyZssWHJJjY6/KiWwqQsWWsqOA==" + } } }, "cssom": { @@ -4191,9 +4431,9 @@ } }, "dom-align": { - "version": "1.10.4", - "resolved": "https://registry.npmjs.org/dom-align/-/dom-align-1.10.4.tgz", - "integrity": "sha512-wytDzaru67AmqFOY4B9GUb/hrwWagezoYYK97D/vpK+ezg+cnuZO0Q2gltUPa7KfNmIqfRIYVCF8UhRDEHAmgQ==" + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/dom-align/-/dom-align-1.11.1.tgz", + "integrity": "sha512-hN42DmUgtweBx0iBjDLO4WtKOMcK8yBmPx/fgdsgQadLuzPu/8co3oLdK5yMmeM/vnUd3yDyV6qV8/NzxBexQg==" }, "dom-converter": { "version": "0.2.0", @@ -4204,12 +4444,27 @@ } }, "dom-helpers": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-5.1.3.tgz", - "integrity": "sha512-nZD1OtwfWGRBWlpANxacBEZrEuLa16o1nh7YopFWeoF68Zt8GGEmzHu6Xv4F3XaFIC+YXtTLrzgqKxFgLEe4jw==", + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-5.1.4.tgz", + "integrity": "sha512-TjMyeVUvNEnOnhzs6uAn9Ya47GmMo3qq7m+Lr/3ON0Rs5kHvb8I+SQYjLUSYn7qhEm0QjW0yrBkvz9yOrwwz1A==", "requires": { - "@babel/runtime": "^7.6.3", + "@babel/runtime": "^7.8.7", "csstype": "^2.6.7" + }, + "dependencies": { + "@babel/runtime": { + "version": "7.9.2", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.9.2.tgz", + "integrity": "sha512-NE2DtOdufG7R5vnfQUTehdTfNycfUANEtCa9PssN9O/xmTzP4E08UI797ixaei6hBEVL9BI/PsdJS5x7mWoB9Q==", + "requires": { + "regenerator-runtime": "^0.13.4" + } + }, + "regenerator-runtime": { + "version": "0.13.5", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.5.tgz", + "integrity": "sha512-ZS5w8CpKFinUzOwW3c83oPeVXoNsrLsaCoLtJvAClH135j/R77RuymhiSErhm2lKcwSCIpmvIWSbDkIfAqKQlA==" + } } }, "dom-serializer": { @@ -4263,6 +4518,15 @@ "domelementtype": "1" } }, + "dot-case": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-3.0.3.tgz", + "integrity": "sha512-7hwEmg6RiSQfm/GwPL4AAWXKy3YNNZA3oFv2Pdiey0mwkRCPZ9x6SZbkLcn8Ma5PYeVokzoD4Twv2n7LKp5WeA==", + "requires": { + "no-case": "^3.0.3", + "tslib": "^1.10.0" + } + }, "dot-prop": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.2.0.tgz", @@ -4312,9 +4576,9 @@ "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" }, "electron-to-chromium": { - "version": "1.3.354", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.354.tgz", - "integrity": "sha512-24YMkNiZWOUeF6YeoscWfIGP0oMx+lJpU/miwI+lcu7plIDpyZn8Gx0lx0qTDlzGoz7hx+lpyD8QkbkX5L2Pqw==" + "version": "1.3.418", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.418.tgz", + "integrity": "sha512-i2QrQtHes5fK/F9QGG5XacM5WKEuR322fxTYF9e8O9Gu0mc0WmjjwGpV8c7Htso6Zf2Di18lc3SIPxmMeRFBug==" }, "elliptic": { "version": "6.5.2", @@ -4336,9 +4600,9 @@ "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" }, "emojis-list": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz", - "integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k=" + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", + "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==" }, "encodeurl": { "version": "1.0.2", @@ -4404,9 +4668,9 @@ } }, "es-abstract": { - "version": "1.17.4", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.4.tgz", - "integrity": "sha512-Ae3um/gb8F0mui/jPL+QiqmglkUsaQf7FwBEHYIFkztkneosu9imhqHpBzQ3h1vit8t5iQ74t6PEVvphBZiuiQ==", + "version": "1.17.5", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.5.tgz", + "integrity": "sha512-BR9auzDbySxOcfog0tLECW8l28eRGpDpU3Dm3Hp4q/N+VtLTmyj4EUN088XZWQDW/hzj6sYRDXeOFsaAODKvpg==", "requires": { "es-to-primitive": "^1.2.1", "function-bind": "^1.1.1", @@ -4531,10 +4795,18 @@ "v8-compile-cache": "^2.0.3" }, "dependencies": { + "eslint-utils": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-1.4.3.tgz", + "integrity": "sha512-fbBN5W2xdY45KulGXmLHZ3c3FHfVYmKg0IrAKGOkT/464PQsx2UeIzfz1RmEci+KLm1bBaAzZAh8+/E+XAeZ8Q==", + "requires": { + "eslint-visitor-keys": "^1.1.0" + } + }, "globals": { - "version": "12.3.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-12.3.0.tgz", - "integrity": "sha512-wAfjdLgFsPZsklLJvOBUBmzYE8/CwhEqSBEMRXA3qxIiNtyqvjYurAtIfDh6chlEPUfmTY3MnZh5Hfh4q0UlIw==", + "version": "12.4.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-12.4.0.tgz", + "integrity": "sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg==", "requires": { "type-fest": "^0.8.1" } @@ -4561,9 +4833,9 @@ } }, "eslint-config-react-app": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/eslint-config-react-app/-/eslint-config-react-app-5.2.0.tgz", - "integrity": "sha512-WrHjoGpKr1kLLiWDD81tme9jMM0hk5cMxasLSdyno6DdPt+IfLOrDJBVo6jN7tn4y1nzhs43TmUaZWO6Sf0blw==", + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/eslint-config-react-app/-/eslint-config-react-app-5.2.1.tgz", + "integrity": "sha512-pGIZ8t0mFLcV+6ZirRgYK6RVqUIKRIi9MmgzUEmrIknsn3AdO0I32asO86dJgloHq+9ZPl8UIg8mYrvgP5u2wQ==", "requires": { "confusing-browser-globals": "^1.0.9" } @@ -4591,9 +4863,9 @@ "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" }, "resolve": { - "version": "1.15.1", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.15.1.tgz", - "integrity": "sha512-84oo6ZTtoTUpjgNEr5SJyzQhzL72gaRodsSfyxC/AXRvwu0Yse9H8eF9IpGo7b8YetZhlI6v7ZQ6bKBFV/6S7w==", + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz", + "integrity": "sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==", "requires": { "path-parse": "^1.0.6" } @@ -4613,9 +4885,9 @@ } }, "eslint-module-utils": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.5.2.tgz", - "integrity": "sha512-LGScZ/JSlqGKiT8OC+cYRxseMjyqt6QO54nl281CK93unD89ijSeRV6An8Ci/2nvWVKe8K/Tqdm75RQoIOCr+Q==", + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.6.0.tgz", + "integrity": "sha512-6j9xxegbqe8/kZY8cYpcp0xhbK0EgJlg3g9mib3/miLaExuuwc3n5UEfSnU6hWMbT0FAYVvDbL9RrRgpUeQIvA==", "requires": { "debug": "^2.6.9", "pkg-dir": "^2.0.0" @@ -4629,49 +4901,11 @@ "ms": "2.0.0" } }, - "find-up": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", - "requires": { - "locate-path": "^2.0.0" - } - }, - "locate-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", - "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", - "requires": { - "p-locate": "^2.0.0", - "path-exists": "^3.0.0" - } - }, "ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" }, - "p-limit": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", - "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", - "requires": { - "p-try": "^1.0.0" - } - }, - "p-locate": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", - "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", - "requires": { - "p-limit": "^1.1.0" - } - }, - "p-try": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", - "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=" - }, "pkg-dir": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-2.0.0.tgz", @@ -4691,9 +4925,9 @@ } }, "eslint-plugin-import": { - "version": "2.20.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.20.0.tgz", - "integrity": "sha512-NK42oA0mUc8Ngn4kONOPsPB1XhbUvNHqF+g307dPV28aknPoiNnKLFd9em4nkswwepdF5ouieqv5Th/63U7YJQ==", + "version": "2.20.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.20.1.tgz", + "integrity": "sha512-qQHgFOTjguR+LnYRoToeZWT62XM55MBVXObHM6SKFd1VzDcX/vqT1kAz8ssqigh5eMj8qXcRoXXGZpPP6RfdCw==", "requires": { "array-includes": "^3.0.3", "array.prototype.flat": "^1.2.1", @@ -4726,14 +4960,6 @@ "isarray": "^1.0.0" } }, - "find-up": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", - "requires": { - "locate-path": "^2.0.0" - } - }, "load-json-file": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz", @@ -4745,41 +4971,11 @@ "strip-bom": "^3.0.0" } }, - "locate-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", - "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", - "requires": { - "p-locate": "^2.0.0", - "path-exists": "^3.0.0" - } - }, "ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" }, - "p-limit": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", - "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", - "requires": { - "p-try": "^1.0.0" - } - }, - "p-locate": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", - "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", - "requires": { - "p-limit": "^1.1.0" - } - }, - "p-try": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", - "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=" - }, "parse-json": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", @@ -4846,9 +5042,9 @@ } }, "eslint-plugin-react": { - "version": "7.18.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.18.0.tgz", - "integrity": "sha512-p+PGoGeV4SaZRDsXqdj9OWcOrOpZn8gXoGPcIQTzo2IDMbAKhNDnME9myZWqO3Ic4R3YmwAZ1lDjWl2R2hMUVQ==", + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.19.0.tgz", + "integrity": "sha512-SPT8j72CGuAP+JFbT0sJHOB80TX/pu44gQ4vXH/cq+hQTiY2PuZ6IHkqXJV6x1b28GDdo1lbInjKUrrdUf0LOQ==", "requires": { "array-includes": "^3.1.1", "doctrine": "^2.1.0", @@ -4858,7 +5054,10 @@ "object.fromentries": "^2.0.2", "object.values": "^1.1.1", "prop-types": "^15.7.2", - "resolve": "^1.14.2" + "resolve": "^1.15.1", + "semver": "^6.3.0", + "string.prototype.matchall": "^4.0.2", + "xregexp": "^4.3.0" }, "dependencies": { "doctrine": { @@ -4870,9 +5069,9 @@ } }, "resolve": { - "version": "1.15.1", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.15.1.tgz", - "integrity": "sha512-84oo6ZTtoTUpjgNEr5SJyzQhzL72gaRodsSfyxC/AXRvwu0Yse9H8eF9IpGo7b8YetZhlI6v7ZQ6bKBFV/6S7w==", + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz", + "integrity": "sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==", "requires": { "path-parse": "^1.0.6" } @@ -4894,9 +5093,9 @@ } }, "eslint-utils": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-1.4.3.tgz", - "integrity": "sha512-fbBN5W2xdY45KulGXmLHZ3c3FHfVYmKg0IrAKGOkT/464PQsx2UeIzfz1RmEci+KLm1bBaAzZAh8+/E+XAeZ8Q==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.0.0.tgz", + "integrity": "sha512-0HCPuJv+7Wv1bACm8y5/ECVfYdfsAm9xmVb7saeFlxjPYALefjhbYoCkBjPdPzGH8wWyTpAez82Fh3VKYEZ8OA==", "requires": { "eslint-visitor-keys": "^1.1.0" } @@ -4907,12 +5106,12 @@ "integrity": "sha512-8y9YjtM1JBJU/A9Kc+SbaOV4y29sSWckBwMHa+FGtVj5gN/sbnKDf6xJUl+8g7FAij9LVaP8C24DUiH/f/2Z9A==" }, "espree": { - "version": "6.1.2", - "resolved": "https://registry.npmjs.org/espree/-/espree-6.1.2.tgz", - "integrity": "sha512-2iUPuuPP+yW1PZaMSDM9eyVf8D5P0Hi8h83YtZ5bPc/zHYjII5khoixIUTMO794NOY8F/ThF1Bo8ncZILarUTA==", + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-6.2.1.tgz", + "integrity": "sha512-ysCxRQY3WaXJz9tdbWOwuWr5Y/XrPTGX9Kiz3yoUXwW0VZ4w30HTkQLaGx/+ttFjF8i+ACbArnB4ce68a9m5hw==", "requires": { - "acorn": "^7.1.0", - "acorn-jsx": "^5.1.0", + "acorn": "^7.1.1", + "acorn-jsx": "^5.2.0", "eslint-visitor-keys": "^1.1.0" } }, @@ -4922,11 +5121,18 @@ "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==" }, "esquery": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.1.0.tgz", - "integrity": "sha512-MxYW9xKmROWF672KqjO75sszsA8Mxhw06YFeS5VHlB98KDHbOSurm3ArsjO60Eaf3QmGMCP1yn+0JQkNLo/97Q==", + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.3.1.tgz", + "integrity": "sha512-olpvt9QG0vniUBZspVRN6lwB7hOZoTRtT+jzR+tS4ffYx2mzbw+z0XCOk44aaLYKApNX5nMm+E+P6o25ip/DHQ==", "requires": { - "estraverse": "^4.0.0" + "estraverse": "^5.1.0" + }, + "dependencies": { + "estraverse": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.1.0.tgz", + "integrity": "sha512-FyohXK+R0vE+y1nHLoBM7ZTyqRpqAlhdZHCWIWEviFLiGB8b04H6bQs8G+XTthacvT8VuwvteiP7RJSxMs8UEw==" + } } }, "esrecurse": { @@ -5296,9 +5502,9 @@ "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=" }, "fast-memoize": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/fast-memoize/-/fast-memoize-2.5.1.tgz", - "integrity": "sha512-xdmw296PCL01tMOXx9mdJSmWY29jQgxyuZdq0rEHMu+Tpe1eOEtCycoG6chzlcrWsNgpZP7oL8RiQr7+G6Bl6g==" + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/fast-memoize/-/fast-memoize-2.5.2.tgz", + "integrity": "sha512-Ue0LwpDYErFbmNnZSF0UH6eImUwDmogUO1jyE+JbN2gsQz/jICm1Ve7t9QT0rNSsfJt+Hs4/S3GnsDVjL4HVrw==" }, "fast-safe-stringify": { "version": "2.0.7", @@ -5351,9 +5557,9 @@ } }, "figgy-pudding": { - "version": "3.5.1", - "resolved": "https://registry.npmjs.org/figgy-pudding/-/figgy-pudding-3.5.1.tgz", - "integrity": "sha512-vNKxJHTEKNThjfrdJwHc7brvM6eVevuO5nTj6ez8ZQ1qbXTvGthucRF7S4vf2cr71QVnT70V34v0S1DyQsti0w==" + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/figgy-pudding/-/figgy-pudding-3.5.2.tgz", + "integrity": "sha512-0btnI/H8f2pavGMN8w40mlSKOfTK2SVJmBfBeVIj3kNw0swwgzyRq0d5TJVOwodFmtvpPeWPN/MCcfuWF0Ezbw==" }, "figures": { "version": "3.2.0", @@ -5385,12 +5591,6 @@ "resolved": "https://registry.npmjs.org/file-saver/-/file-saver-2.0.2.tgz", "integrity": "sha512-Wz3c3XQ5xroCxd1G8b7yL0Ehkf0TC9oYC6buPFkNnU9EnaPlifeAFCyCh+iewXTyFRcg0a6j3J7FmJsIhlhBdw==" }, - "file-uri-to-path": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", - "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==", - "optional": true - }, "filesize": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/filesize/-/filesize-6.0.1.tgz", @@ -5457,11 +5657,11 @@ } }, "find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", "requires": { - "locate-path": "^3.0.0" + "locate-path": "^2.0.0" } }, "flat-cache": { @@ -5475,9 +5675,9 @@ } }, "flatted": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.1.tgz", - "integrity": "sha512-a1hQMktqW9Nmqr5aktAux3JMNqaucxGcjtjWnZLHX7yyPCmlSV3M54nGYbqT8K+0GhF3NBgmJCc3ma+WOgX8Jg==" + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.2.tgz", + "integrity": "sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA==" }, "flatten": { "version": "1.0.3", @@ -5503,9 +5703,9 @@ } }, "follow-redirects": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.10.0.tgz", - "integrity": "sha512-4eyLK6s6lH32nOvLLwlIOnr9zrL8Sm+OvW4pVTJNoXeGzYIkHVf+pADQi+OJ0E67hiuSLezPVPyBcIZO50TmmQ==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.11.0.tgz", + "integrity": "sha512-KZm0V+ll8PfBrKwMzdo5D13b1bur9Iq9Zd/RMmAoQQcl2PxxFml8cxXPaaPYVbV0RjNjq1CU7zIzAOqtUPudmA==", "requires": { "debug": "^3.0.0" }, @@ -5903,19 +6103,20 @@ } }, "handle-thing": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.0.tgz", - "integrity": "sha512-d4sze1JNC454Wdo2fkuyzCr6aHcbL6PGGuFAz0Li/NcOm1tCHGnWDRmJP85dh9IhQErTc2svWFEX5xHIOo//kQ==" + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz", + "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==" }, "handlebars": { - "version": "4.7.3", - "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.3.tgz", - "integrity": "sha512-SRGwSYuNfx8DwHD/6InAPzD6RgeruWLT+B8e8a7gGs8FWgHzlExpTFMEq2IA6QpAfOClpKHy6+8IqTjeBCu6Kg==", + "version": "4.7.6", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.6.tgz", + "integrity": "sha512-1f2BACcBfiwAfStCKZNrUCgqNZkGsAT7UM3kkYtXuLo0KnaVfjKOyf7PRzB6++aK9STyT1Pd2ZCPe3EGOXleXA==", "requires": { + "minimist": "^1.2.5", "neo-async": "^2.6.0", - "optimist": "^0.6.1", "source-map": "^0.6.1", - "uglify-js": "^3.1.4" + "uglify-js": "^3.1.4", + "wordwrap": "^1.0.0" } }, "har-schema": { @@ -6103,27 +6304,27 @@ } }, "html-entities": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-1.2.1.tgz", - "integrity": "sha1-DfKTUfByEWNRXfueVUPl9u7VFi8=" + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-1.3.1.tgz", + "integrity": "sha512-rhE/4Z3hIhzHAUKbW8jVcCyuT5oJCXXqhN/6mXXVCpzTmvJnoH2HL/bt3EZ6p55jbFJBeAe1ZNpL5BugLujxNA==" }, "html-escaper": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.0.tgz", - "integrity": "sha512-a4u9BeERWGu/S8JiWEAQcdrg9v4QArtP9keViQjGMdff20fBdd8waotXaNmODqBe6uZ3Nafi7K/ho4gCQHV3Ig==" + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==" }, "html-minifier-terser": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/html-minifier-terser/-/html-minifier-terser-5.0.3.tgz", - "integrity": "sha512-It4No3H1V3Dhd/O0MePFdo0oX/M6u6YZTMw4My/010mT6vxdbqge7+0RoxGAmeSbKok6gjYZoP0p4rpZ2+J2yw==", + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/html-minifier-terser/-/html-minifier-terser-5.0.5.tgz", + "integrity": "sha512-cBSFFghQh/uHcfSiL42KxxIRMF7A144+3E44xdlctIjxEmkEfCvouxNyFH2wysXk1fCGBPwtcr3hDWlGTfkDew==", "requires": { - "camel-case": "^3.0.0", - "clean-css": "^4.2.1", - "commander": "^4.0.0", + "camel-case": "^4.1.1", + "clean-css": "^4.2.3", + "commander": "^4.1.1", "he": "^1.2.0", - "param-case": "^2.1.1", + "param-case": "^3.0.3", "relateurl": "^0.2.7", - "terser": "^4.3.9" + "terser": "^4.6.3" }, "dependencies": { "commander": { @@ -6341,9 +6542,9 @@ "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=" }, "in-publish": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/in-publish/-/in-publish-2.0.0.tgz", - "integrity": "sha1-4g/146KvwmkDILbcVSaCqcf631E=" + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/in-publish/-/in-publish-2.0.1.tgz", + "integrity": "sha512-oDM0kUSNFC31ShNxHKUyfZKy8ZeXZBWMjMdZHKLOk13uvT27VTL/QzRGfRUcevJhpkZAvlhPYuXkF7eNWrtyxQ==" }, "indent-string": { "version": "4.0.0", @@ -6380,23 +6581,77 @@ "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==" }, "inquirer": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-7.0.4.tgz", - "integrity": "sha512-Bu5Td5+j11sCkqfqmUTiwv+tWisMtP0L7Q8WrqA2C/BbBhy1YTdFrvjjlrKq8oagA/tLQBski2Gcx/Sqyi2qSQ==", + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-7.1.0.tgz", + "integrity": "sha512-5fJMWEmikSYu0nv/flMc475MhGbB7TSPd/2IpFV4I4rMklboCH2rQjYY5kKiYGHqUF9gvaambupcJFFG9dvReg==", "requires": { "ansi-escapes": "^4.2.1", - "chalk": "^2.4.2", + "chalk": "^3.0.0", "cli-cursor": "^3.1.0", "cli-width": "^2.0.0", "external-editor": "^3.0.3", "figures": "^3.0.0", "lodash": "^4.17.15", "mute-stream": "0.0.8", - "run-async": "^2.2.0", + "run-async": "^2.4.0", "rxjs": "^6.5.3", "string-width": "^4.1.0", - "strip-ansi": "^5.1.0", + "strip-ansi": "^6.0.0", "through": "^2.3.6" + }, + "dependencies": { + "ansi-styles": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", + "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "requires": { + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "strip-ansi": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "requires": { + "ansi-regex": "^5.0.0" + } + }, + "supports-color": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "requires": { + "has-flag": "^4.0.0" + } + } } }, "internal-ip": { @@ -6408,6 +6663,16 @@ "ipaddr.js": "^1.9.0" } }, + "internal-slot": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.2.tgz", + "integrity": "sha512-2cQNfwhAfJIkU4KZPkDI+Gj5yNNnbqi40W9Gge6dfnk4TocEVm00B3bdiL+JINrbGJil2TeHvM4rETGzk/f/0g==", + "requires": { + "es-abstract": "^1.17.0-next.1", + "has": "^1.0.3", + "side-channel": "^1.0.2" + } + }, "invariant": { "version": "2.2.4", "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", @@ -6432,9 +6697,9 @@ "integrity": "sha1-+ni/XS5pE8kRzp+BnuUUa7bYROk=" }, "ipaddr.js": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.0.tgz", - "integrity": "sha512-M4Sjn6N/+O6/IXSJseKqHoFc+5FdGJ22sXqnjTpdZweHK64MzEPAyQZyEU3R/KRv2GLoa7nNtg/C2Ev6m7z+eA==" + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==" }, "is-absolute-url": { "version": "2.1.0", @@ -6618,11 +6883,6 @@ "isobject": "^3.0.1" } }, - "is-promise": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz", - "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=" - }, "is-regex": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.5.tgz", @@ -6903,9 +7163,9 @@ }, "dependencies": { "acorn": { - "version": "6.4.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.0.tgz", - "integrity": "sha512-gac8OEcQ2Li1dxIEWGZzsp2BitJxwkwcOm0zHAJLcPJaVvm58FRnk6RkuLRpU1EujipU2ZFODv2P9DLMfnV8mw==" + "version": "6.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.1.tgz", + "integrity": "sha512-ZVA9k326Nwrj3Cj9jlh3wGFutC2ZornPNARZwsNYqQYgN0EsV2d53w5RN/co65Ohn4sUAUtb1rSUAOD6XN9idA==" }, "jsdom": { "version": "14.1.0", @@ -7002,12 +7262,11 @@ }, "dependencies": { "fsevents": { - "version": "1.2.11", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.11.tgz", - "integrity": "sha512-+ux3lx6peh0BpvY0JebGyZoiR4D+oYzdPZMKJwkZ+sFkNJzpL7tXc/wehS49gUAxg3tmMHPHZkA8JU2rhhgDHw==", + "version": "1.2.12", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.12.tgz", + "integrity": "sha512-Ggd/Ktt7E7I8pxZRbGIs7vwqAPscSESMrCSkx2FtWeqmheJgCo2R74fTsZFCifr0VTPwqRpPv17+6b8Zp7th0Q==", "optional": true, "requires": { - "bindings": "^1.5.0", "nan": "^2.12.1", "node-pre-gyp": "*" }, @@ -7051,7 +7310,7 @@ } }, "chownr": { - "version": "1.1.3", + "version": "1.1.4", "bundled": true, "optional": true }, @@ -7201,7 +7460,7 @@ } }, "minimist": { - "version": "0.0.8", + "version": "1.2.5", "bundled": true, "optional": true }, @@ -7223,11 +7482,11 @@ } }, "mkdirp": { - "version": "0.5.1", + "version": "0.5.3", "bundled": true, "optional": true, "requires": { - "minimist": "0.0.8" + "minimist": "^1.2.5" } }, "ms": { @@ -7236,7 +7495,7 @@ "optional": true }, "needle": { - "version": "2.4.0", + "version": "2.3.3", "bundled": true, "optional": true, "requires": { @@ -7263,7 +7522,7 @@ } }, "nopt": { - "version": "4.0.1", + "version": "4.0.3", "bundled": true, "optional": true, "requires": { @@ -7285,12 +7544,13 @@ "optional": true }, "npm-packlist": { - "version": "1.4.7", + "version": "1.4.8", "bundled": true, "optional": true, "requires": { "ignore-walk": "^3.0.1", - "npm-bundled": "^1.0.1" + "npm-bundled": "^1.0.1", + "npm-normalize-package-bin": "^1.0.1" } }, "npmlog": { @@ -7360,17 +7620,10 @@ "ini": "~1.3.0", "minimist": "^1.2.0", "strip-json-comments": "~2.0.1" - }, - "dependencies": { - "minimist": { - "version": "1.2.0", - "bundled": true, - "optional": true - } } }, "readable-stream": { - "version": "2.3.6", + "version": "2.3.7", "bundled": true, "optional": true, "requires": { @@ -7782,9 +8035,9 @@ } }, "jquery": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/jquery/-/jquery-3.4.1.tgz", - "integrity": "sha512-36+AdBzCL+y6qjw5Tx7HgzeGCzC81MDDgaUP8ld2zhx58HdqXGoBd+tHdrBMiyjGQs0Hxs/MLZTu/eHNJJuWPw==" + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/jquery/-/jquery-3.5.0.tgz", + "integrity": "sha512-Xb7SVYMvygPxbFMpTFQiHh1J7HClEaThguL15N/Gg37Lri/qKyhRGZYzHRyLH8Stq3Aow0LsHO2O2ci86fCrNQ==" }, "js-base64": { "version": "2.5.2", @@ -7844,9 +8097,9 @@ }, "dependencies": { "acorn": { - "version": "5.7.3", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.7.3.tgz", - "integrity": "sha512-T/zvzYRfbVojPWahDsE5evJdHb3oJoQfFbsrKM7w5Zcs++Tr257tia3BmMP8XYVjp1S9RZXQMh7gao96BlqZOw==" + "version": "5.7.4", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.7.4.tgz", + "integrity": "sha512-1D++VG7BhrtvQpNbBzovKNc1FLGGEE/oGe7b9xJm/RFHMBeUaUGpluV9RLjZa47YFdPcDAenEYuq9pQPcMdLJg==" } } }, @@ -7894,18 +8147,11 @@ "integrity": "sha512-c7/8mbUsKigAbLkD5B010BK4D9LZm7A1pNItkEwiUZRpIN66exu/e7YQWysGun+TRKaJp8MhemM+VkfWv42aCA==" }, "json5": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.1.tgz", - "integrity": "sha512-l+3HXD0GEI3huGq1njuqtzYK8OYJyXMkOLtQ53pjWh89tvWS2h6l+1zMkYWqlb57+SiQodKZyvMEFb2X+KrFhQ==", + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.3.tgz", + "integrity": "sha512-KXPvOm8K9IJKFM0bmdn8QXh7udDh1g/giieX0NLCaMnb4hEiVFqnop2ImTXCc5e0/oHz3LTqmHGtExn5hfMkOA==", "requires": { - "minimist": "^1.2.0" - }, - "dependencies": { - "minimist": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" - } + "minimist": "^1.2.5" } }, "jsonfile": { @@ -7942,9 +8188,9 @@ } }, "jszip": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.2.2.tgz", - "integrity": "sha512-NmKajvAFQpbg3taXQXr/ccS2wcucR1AZ+NtyWp2Nq7HHVsXhcJFR8p0Baf32C2yVvBylFWVeKf+WI2AnvlPhpA==", + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.4.0.tgz", + "integrity": "sha512-gZAOYuPl4EhPTXT0GjhI3o+ZAz3su6EhLrKUoAivcKqyqC7laS5JEv4XWZND9BgcDcF83vI85yGbDmDR6UhrIg==", "requires": { "lie": "~3.3.0", "pako": "~1.0.2", @@ -7952,11 +8198,6 @@ "set-immediate-shim": "~1.0.1" } }, - "keycode": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/keycode/-/keycode-2.2.0.tgz", - "integrity": "sha1-PQr1bce4uOXLqNCpfxByBO7CKwQ=" - }, "killable": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/killable/-/killable-1.0.1.tgz", @@ -8053,12 +8294,12 @@ } }, "loader-fs-cache": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/loader-fs-cache/-/loader-fs-cache-1.0.2.tgz", - "integrity": "sha512-70IzT/0/L+M20jUlEqZhZyArTU6VKLRTYRDAYN26g4jfzpJqjipLL3/hgYpySqI9PwsVRHHFja0LfEmsx9X2Cw==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/loader-fs-cache/-/loader-fs-cache-1.0.3.tgz", + "integrity": "sha512-ldcgZpjNJj71n+2Mf6yetz+c9bM4xpKtNds4LbqXzU/PTdeAX0g3ytnU1AJMEcTk2Lex4Smpe3Q/eCTsvUBxbA==", "requires": { "find-cache-dir": "^0.1.1", - "mkdirp": "0.5.1" + "mkdirp": "^0.5.1" }, "dependencies": { "find-cache-dir": { @@ -8104,12 +8345,12 @@ "integrity": "sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw==" }, "loader-utils": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.2.3.tgz", - "integrity": "sha512-fkpz8ejdnEMG3s37wGL07iSBDg99O9D5yflE9RGNH3hRdx9SOwYfnGYdZOUIZitN8E+E2vkq3MUMYMvPYl5ZZA==", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", + "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", "requires": { "big.js": "^5.2.2", - "emojis-list": "^2.0.0", + "emojis-list": "^3.0.0", "json5": "^1.0.1" }, "dependencies": { @@ -8120,20 +8361,15 @@ "requires": { "minimist": "^1.2.0" } - }, - "minimist": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" } } }, "locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", "requires": { - "p-locate": "^3.0.0", + "p-locate": "^2.0.0", "path-exists": "^3.0.0" } }, @@ -8142,6 +8378,11 @@ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==" }, + "lodash-es": { + "version": "4.17.15", + "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.15.tgz", + "integrity": "sha512-rlrc3yU3+JNOpZ9zj5pQtxnx2THmvRykwL4Xlxoa8I9lHBlVbbyPhgyPMioxVZ4NqyxaVVtaJnzsyOidQIhyyQ==" + }, "lodash._reinterpolate": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz", @@ -8190,9 +8431,9 @@ "integrity": "sha1-0CJTc662Uq3BvILklFM5qEJ1R3M=" }, "loglevel": { - "version": "1.6.7", - "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.6.7.tgz", - "integrity": "sha512-cY2eLFrQSAfVPhCgH1s7JI73tMbg9YC3v3+ZHVW67sBS7UxWzNEk/ZBbSfLykBWHp33dqqtOv82gjhKEi81T/A==" + "version": "1.6.8", + "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.6.8.tgz", + "integrity": "sha512-bsU7+gc9AJ2SqpzxwU3+1fedl8zAntbtC5XYlt3s2j1hJcn2PsXSmgN8TaLG/J1/2mod4+cE/3vNL70/c1RNCA==" }, "loose-envify": { "version": "1.4.0", @@ -8212,9 +8453,12 @@ } }, "lower-case": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-1.1.4.tgz", - "integrity": "sha1-miyr0bno4K6ZOkv31YdcOcQujqw=" + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.1.tgz", + "integrity": "sha512-LiWgfDLLb1dwbFQZsSglpRj+1ctGnayXz3Uv0/WO8n558JycT5fg6zkNcnW0G68Nn0aEldTFeEfmjCfmqry/rQ==", + "requires": { + "tslib": "^1.10.0" + } }, "lru-cache": { "version": "5.1.1", @@ -8368,11 +8612,6 @@ "strip-bom": "^2.0.0" } }, - "minimist": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" - }, "parse-json": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", @@ -8579,9 +8818,9 @@ } }, "minimist": { - "version": "0.0.10", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.10.tgz", - "integrity": "sha1-3j+YVD2/lggr5IrRoMfNqDYwHc8=" + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" }, "minipass": { "version": "3.1.1", @@ -8668,18 +8907,11 @@ } }, "mkdirp": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", - "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", + "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", "requires": { - "minimist": "0.0.8" - }, - "dependencies": { - "minimist": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", - "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=" - } + "minimist": "^1.2.5" } }, "move-concurrently": { @@ -8775,11 +9007,12 @@ "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==" }, "no-case": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/no-case/-/no-case-2.3.2.tgz", - "integrity": "sha512-rmTZ9kz+f3rCvK2TD1Ue/oZlns7OGoIWP4fc3llxxRXlOkHKoWPPWJOfFYpITabSow43QJbRIoHQXtt10VldyQ==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.3.tgz", + "integrity": "sha512-ehY/mVQCf9BL0gKfsJBvFJen+1V//U+0HQMPrWct40ixE4jnv0bfvxDbWtAHL9EcaPEOJHVVYKoQn1TlZUB8Tw==", "requires": { - "lower-case": "^1.1.1" + "lower-case": "^2.0.1", + "tslib": "^1.10.0" } }, "node-fetch": { @@ -8902,17 +9135,14 @@ } }, "node-releases": { - "version": "1.1.49", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.49.tgz", - "integrity": "sha512-xH8t0LS0disN0mtRCh+eByxFPie+msJUBL/lJDBuap53QGiYPa9joh83K4pCZgWJ+2L4b9h88vCVdXQ60NO2bg==", - "requires": { - "semver": "^6.3.0" - } + "version": "1.1.53", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.53.tgz", + "integrity": "sha512-wp8zyQVwef2hpZ/dJH7SfSrIPD6YoJz6BDQDpGEkcA0s3LpAQoxBIYmfIq6QAhC1DhwsyCgTaTTcONwX8qzCuQ==" }, "node-sass": { - "version": "4.13.1", - "resolved": "https://registry.npmjs.org/node-sass/-/node-sass-4.13.1.tgz", - "integrity": "sha512-TTWFx+ZhyDx1Biiez2nB0L3YrCZ/8oHagaDalbuBSlqXgUPsdkUSzJsVxeDO9LtPB49+Fh3WQl3slABo6AotNw==", + "version": "4.14.0", + "resolved": "https://registry.npmjs.org/node-sass/-/node-sass-4.14.0.tgz", + "integrity": "sha512-AxqU+DFpk0lEz95sI6jO0hU0Rwyw7BXVEv6o9OItoXLyeygPeaSpiV4rwQb10JiTghHaa0gZeD21sz+OsQluaw==", "requires": { "async-foreach": "^0.1.3", "chalk": "^1.1.1", @@ -9126,9 +9356,13 @@ "integrity": "sha512-a7pEHdh1xKIAgTySUGgLMx/xwDZskN1Ud6egYYN3EdRW4ZMPNEDUTF+hwy2LUC+Bl+SyLXANnwz/jyh/qutKUw==" }, "object-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.0.2.tgz", - "integrity": "sha512-Epah+btZd5wrrfjkJZq1AOB9O6OxUQto45hzFd7lXGrpHPGE0W1k+426yrZV+k6NJOzLNNW/nVsmZdIWsAqoOQ==" + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.2.tgz", + "integrity": "sha512-5lHCz+0uufF6wZ7CRFWJN3hp8Jqblpgve06U5CMQ3f//6iDjPr2PEo9MWCjEssDsa+UZEL4PkFpr+BMop6aKzQ==", + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.5" + } }, "object-keys": { "version": "1.1.1", @@ -9244,9 +9478,9 @@ } }, "open": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/open/-/open-7.0.2.tgz", - "integrity": "sha512-70E/pFTPr7nZ9nLDPNTcj3IVqnNvKuP4VsBmoKV9YGTnChe0mlS3C4qM7qKarhZ8rGaHKLfo+vBTHXDp6ZSyLQ==", + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/open/-/open-7.0.3.tgz", + "integrity": "sha512-sP2ru2v0P290WFfv49Ap8MF6PkzGNnGlAwHweB4WR4mr5d2d0woiCluUeJ218w7/+PmoBy9JmYgD5A4mLcWOFA==", "requires": { "is-docker": "^2.0.0", "is-wsl": "^2.1.1" @@ -9267,15 +9501,6 @@ "is-wsl": "^1.1.0" } }, - "optimist": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", - "integrity": "sha1-2j6nRob6IaGaERwybpDrFaAZZoY=", - "requires": { - "minimist": "~0.0.1", - "wordwrap": "~0.0.2" - } - }, "optimize-css-assets-webpack-plugin": { "version": "5.0.3", "resolved": "https://registry.npmjs.org/optimize-css-assets-webpack-plugin/-/optimize-css-assets-webpack-plugin-5.0.3.tgz", @@ -9364,19 +9589,19 @@ "integrity": "sha512-Y3W0wlRPK8ZMRbNq97l4M5otioeA5lm1z7bkNkxCka8HSPjR0xRWmpCmc9utiaLP9Jb1eD8BgeIxTW4AIF45Pg==" }, "p-limit": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.2.tgz", - "integrity": "sha512-WGR+xHecKTr7EbUEhyLSh5Dube9JtdiG78ufaeLxTgpudf/20KqyMioIUZJAezlTIi6evxuoUs9YXc11cU+yzQ==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", + "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", "requires": { - "p-try": "^2.0.0" + "p-try": "^1.0.0" } }, "p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", "requires": { - "p-limit": "^2.0.0" + "p-limit": "^1.1.0" } }, "p-map": { @@ -9401,9 +9626,9 @@ } }, "p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==" + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", + "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=" }, "pako": { "version": "1.0.10", @@ -9421,11 +9646,12 @@ } }, "param-case": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/param-case/-/param-case-2.1.1.tgz", - "integrity": "sha1-35T9jPZTHs915r75oIWPvHK+Ikc=", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/param-case/-/param-case-3.0.3.tgz", + "integrity": "sha512-VWBVyimc1+QrzappRs7waeN2YmoZFCGXWASRYX1/rGHtXqEcrGEIDm+jqIwFa2fRXNgQEwrxaYuIrX0WcAguTA==", "requires": { - "no-case": "^2.2.0" + "dot-case": "^3.0.3", + "tslib": "^1.10.0" } }, "parent-module": { @@ -9475,6 +9701,15 @@ "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==" }, + "pascal-case": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.1.tgz", + "integrity": "sha512-XIeHKqIrsquVTQL2crjq3NfJUxmdLasn3TYOU0VBM+UX2a6ztAWBlJQBePLGY7VHW8+2dRadeIPK5+KImwTxQA==", + "requires": { + "no-case": "^3.0.3", + "tslib": "^1.10.0" + } + }, "pascalcase": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", @@ -9598,14 +9833,54 @@ "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", "requires": { "find-up": "^3.0.0" + }, + "dependencies": { + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "requires": { + "locate-path": "^3.0.0" + } + }, + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "requires": { + "p-limit": "^2.0.0" + } + }, + "p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==" + } } }, "pkg-up": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-3.1.0.tgz", - "integrity": "sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-2.0.0.tgz", + "integrity": "sha1-yBmscoBZpGHKscOImivjxJoATX8=", "requires": { - "find-up": "^3.0.0" + "find-up": "^2.1.0" } }, "pn": { @@ -9614,17 +9889,17 @@ "integrity": "sha512-2qHaIQr2VLRFoxe2nASzsV6ef4yOOH+Fi9FBOVH6cqeSgUnoyySPZkxzLuzd+RYOQTRpROA0ztTMqxROKSb/nA==" }, "pnp-webpack-plugin": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/pnp-webpack-plugin/-/pnp-webpack-plugin-1.6.0.tgz", - "integrity": "sha512-ZcMGn/xF/fCOq+9kWMP9vVVxjIkMCja72oy3lziR7UHy0hHFZ57iVpQ71OtveVbmzeCmphBg8pxNdk/hlK99aQ==", + "version": "1.6.4", + "resolved": "https://registry.npmjs.org/pnp-webpack-plugin/-/pnp-webpack-plugin-1.6.4.tgz", + "integrity": "sha512-7Wjy+9E3WwLOEL30D+m8TSTF7qJJUJLONBnwQp0518siuMxUQUbgZwssaFX+QKlZkjHZcw/IpZCt/H0srrntSg==", "requires": { - "ts-pnp": "^1.1.2" + "ts-pnp": "^1.1.6" } }, "popper.js": { - "version": "1.16.0", - "resolved": "https://registry.npmjs.org/popper.js/-/popper.js-1.16.0.tgz", - "integrity": "sha512-+G+EkOPoE5S/zChTpmBSSDYmhXJ5PsW8eMhH8cP/CQHMFPBG/kC9Y5IIw6qNYgdJ+/COf0ddY2li28iHaZRSjw==" + "version": "1.16.1", + "resolved": "https://registry.npmjs.org/popper.js/-/popper.js-1.16.1.tgz", + "integrity": "sha512-Wb4p1J4zyFTbM+u6WuO4XstYx4Ky9Cewe4DWrel7B0w6VVICvPwdOpotjzcf6eD8TsckVnIMNONQyPIUFOUbCQ==" }, "portfinder": { "version": "1.0.25", @@ -10155,9 +10430,9 @@ } }, "postcss-modules-scope": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-2.1.1.tgz", - "integrity": "sha512-OXRUPecnHCg8b9xWvldG/jUpRIGPNRka0r4D4j0ESUU2/5IOnpsjfPPmDprM3Ih8CgZ8FXjWqaniK5v4rWt3oQ==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-2.2.0.tgz", + "integrity": "sha512-YyEgsTMRpNd+HmyC7H/mh3y+MeFWevy7V1evVhJWewmMbjDHIbZbOXICC2y+m1xI1UVfIT1HMW/O04Hxyu9oXQ==", "requires": { "postcss": "^7.0.6", "postcss-selector-parser": "^6.0.0" @@ -10557,9 +10832,9 @@ } }, "postcss-value-parser": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.0.2.tgz", - "integrity": "sha512-LmeoohTpp/K4UiyQCwuGWlONxXamGzCMtFxLq4W1nZVGIQLYvMCJx3yAF9qyyuFpflABI9yVdtJAqbihOsCsJQ==" + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.0.3.tgz", + "integrity": "sha512-N7h4pG+Nnu5BEIzyeaaIYWs0LI5XC40OrRh5L60z0QjFsqGWcHcbkBvpe1WYpcIS9yQ8sOi/vIPt1ejQCrMVrg==" }, "postcss-values-parser": { "version": "2.0.1", @@ -10647,9 +10922,9 @@ "integrity": "sha1-mEcocL8igTL8vdhoEputEsPAKeM=" }, "prompts": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.3.1.tgz", - "integrity": "sha512-qIP2lQyCwYbdzcqHIUi2HAxiWixhoM9OdLCWf8txXsapC/X9YdsCoeyRIXE/GP+Q0J37Q7+XN/MFqbUa7IzXNA==", + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.3.2.tgz", + "integrity": "sha512-Q06uKs2CkNYVID0VqwfAl9mipo99zkBv/n2JtWY89Yxa3ZabWSrs0e2KTudKVa3peLUvYXMefDqIleLPVUBZMA==", "requires": { "kleur": "^3.0.3", "sisteransi": "^1.0.4" @@ -10666,31 +10941,21 @@ } }, "prop-types-extra": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/prop-types-extra/-/prop-types-extra-1.1.0.tgz", - "integrity": "sha512-QFyuDxvMipmIVKD2TwxLVPzMnO4e5oOf1vr3tJIomL8E7d0lr6phTHd5nkPhFIzTD1idBLLEPeylL9g+rrTzRg==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/prop-types-extra/-/prop-types-extra-1.1.1.tgz", + "integrity": "sha512-59+AHNnHYCdiC+vMwY52WmvP5dM3QLeoumYuEyceQDi9aEhtwN9zIQ2ZNo25sMyXnbh32h+P1ezDsUpUH3JAew==", "requires": { "react-is": "^16.3.2", - "warning": "^3.0.0" - }, - "dependencies": { - "warning": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/warning/-/warning-3.0.0.tgz", - "integrity": "sha1-MuU3fLVy3kqwR1O9+IIcAe1gW3w=", - "requires": { - "loose-envify": "^1.0.0" - } - } + "warning": "^4.0.0" } }, "proxy-addr": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.5.tgz", - "integrity": "sha512-t/7RxHXPH6cJtP0pRG6smSr9QJidhB+3kXu0KgXnbGYMgzEnUxRQ4/LDdfOwZEMyIh3/xHb8PX3t+lfL9z+YVQ==", + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.6.tgz", + "integrity": "sha512-dh/frvCBVmSsDYzw6n926jv974gddhkFPfiN8hPOi30Wax25QZyZEGveluCgliBnqmuM+UJmBErbAUFIoDbjOw==", "requires": { "forwarded": "~0.1.2", - "ipaddr.js": "1.9.0" + "ipaddr.js": "1.9.1" } }, "prr": { @@ -10855,9 +11120,9 @@ } }, "rc-animate": { - "version": "2.10.2", - "resolved": "https://registry.npmjs.org/rc-animate/-/rc-animate-2.10.2.tgz", - "integrity": "sha512-cE/A7piAzoWFSgUD69NmmMraqCeqVBa51UErod8NS3LUEqWfppSVagHfa0qHAlwPVPiIBg3emRONyny3eiH0Dg==", + "version": "2.11.1", + "resolved": "https://registry.npmjs.org/rc-animate/-/rc-animate-2.11.1.tgz", + "integrity": "sha512-1NyuCGFJG/0Y+9RKh5y/i/AalUCA51opyyS/jO2seELpgymZm2u9QV3xwODwEuzkmeQ1BDPxMLmYLcTJedPlkQ==", "requires": { "babel-runtime": "6.x", "classnames": "^2.2.6", @@ -10869,64 +11134,70 @@ } }, "rc-slider": { - "version": "9.2.1", - "resolved": "https://registry.npmjs.org/rc-slider/-/rc-slider-9.2.1.tgz", - "integrity": "sha512-nmnga8EhCvcjwXp51Yc6S6QALXppZZd0fcV91m9fHhJdUY0hz5B4MVWy+rKaawJmXeV+8ghABmQbTjUP39GXlw==", + "version": "9.2.4", + "resolved": "https://registry.npmjs.org/rc-slider/-/rc-slider-9.2.4.tgz", + "integrity": "sha512-wSr7vz+WtzzGqsGU2rTQ4mmLz9fkuIDMPYMYm8ygYFvxQ2Rh4uRhOWHYI0R8krNK5k1bGycckYxmQqUIvLAh3w==", "requires": { "babel-runtime": "6.x", "classnames": "^2.2.5", - "prop-types": "^15.5.4", - "rc-tooltip": "^4.0.0-alpha.3", + "rc-tooltip": "^4.0.0", "rc-util": "^4.0.4", "shallowequal": "^1.1.0", "warning": "^4.0.3" } }, "rc-tooltip": { - "version": "4.0.0-alpha.3", - "resolved": "https://registry.npmjs.org/rc-tooltip/-/rc-tooltip-4.0.0-alpha.3.tgz", - "integrity": "sha512-QSw6H2MMkNsRDJn0pCVARQVy+OCgVB65dPHuW/7UbJHDZTcOuTLwNtY4MbY2tMages7RVB31I7WT0KwhCslqwg==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/rc-tooltip/-/rc-tooltip-4.0.3.tgz", + "integrity": "sha512-HNyBh9/fPdds0DXja8JQX0XTIHmZapB3lLzbdn74aNSxXG1KUkt+GK4X1aOTRY5X9mqm4uUKdeFrn7j273H8gw==", "requires": { - "rc-trigger": "^4.0.0-alpha.5" + "rc-trigger": "^4.0.0" } }, "rc-trigger": { - "version": "4.0.0-rc.5", - "resolved": "https://registry.npmjs.org/rc-trigger/-/rc-trigger-4.0.0-rc.5.tgz", - "integrity": "sha512-CUimlGKduOzBJxMEib3MzWhFpSq0wFk/iXxonaIIth/zVMZ4at+Wf3yxh8apY6UuYZlrJiA8S58/BfePpT+g0Q==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/rc-trigger/-/rc-trigger-4.0.2.tgz", + "integrity": "sha512-to5S1NhK10rWHIgQpoQdwIhuDc2Ok4R4/dh5NLrDt6C+gqkohsdBCYiPk97Z+NwGhRU8N+dbf251bivX8DkzQg==", "requires": { "classnames": "^2.2.6", "prop-types": "15.x", "raf": "^3.4.1", "rc-align": "^3.0.0-rc.0", "rc-animate": "^2.10.2", - "rc-util": "^4.15.2" + "rc-util": "^4.20.0" } }, "rc-util": { - "version": "4.19.0", - "resolved": "https://registry.npmjs.org/rc-util/-/rc-util-4.19.0.tgz", - "integrity": "sha512-mptALlLwpeczS3nrv83DbwJNeupolbuvlIEjcvimSiWI8NUBjpF0HgG3kWp1RymiuiRCNm9yhaXqDz0a99dpgQ==", + "version": "4.20.5", + "resolved": "https://registry.npmjs.org/rc-util/-/rc-util-4.20.5.tgz", + "integrity": "sha512-f67s4Dt1quBYhrVPq5QMKmK3eS2hN1NNIAyhaiG0HmvqiGYAXMQ7SP2AlGqv750vnzhJs38JklbkWT1/wjhFPg==", "requires": { "add-dom-event-listener": "^1.1.0", - "babel-runtime": "6.x", "prop-types": "^15.5.10", + "react-is": "^16.12.0", "react-lifecycles-compat": "^3.0.4", "shallowequal": "^1.1.0" + }, + "dependencies": { + "react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" + } } }, "re-resizable": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/re-resizable/-/re-resizable-6.2.0.tgz", - "integrity": "sha512-3bi0yTzub/obnqoTPs9C8A1ecrgt5OSWlKdHDJ6gBPiEiEIG5LO0PqbwWTpABfzAzdE4kldOG2MQDQEaJJNYkQ==", + "version": "6.3.2", + "resolved": "https://registry.npmjs.org/re-resizable/-/re-resizable-6.3.2.tgz", + "integrity": "sha512-ngxe4XBSb46vfwXjAwpURacVDig/pPt1kHRhcKlRRIoGICmo4aQHr725jurezepp1pm5jSC6iQhyLYfx3zOC3w==", "requires": { "fast-memoize": "^2.5.1" } }, "react": { - "version": "16.12.0", - "resolved": "https://registry.npmjs.org/react/-/react-16.12.0.tgz", - "integrity": "sha512-fglqy3k5E+81pA8s+7K0/T3DBCF0ZDOher1elBFzF7O6arXJgzyu/FW+COxFvAWXJoJN9KIZbT2LXlukwphYTA==", + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react/-/react-16.13.1.tgz", + "integrity": "sha512-YMZQQq32xHLX0bz5Mnibv1/LHb3Sqzngu7xstSM+vrkE5Kzr9xE0yMByK5kMoTK30YVJE61WfbxIFFvfeDKT1w==", "requires": { "loose-envify": "^1.1.0", "object-assign": "^4.1.1", @@ -10947,22 +11218,22 @@ }, "dependencies": { "core-js": { - "version": "3.6.4", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.6.4.tgz", - "integrity": "sha512-4paDGScNgZP2IXXilaffL9X7968RuvwlkK3xWtZRVqgd8SYNiVKRJvkFd1aqqEuPfN7E68ZHEp9hDj6lHj4Hyw==" + "version": "3.6.5", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.6.5.tgz", + "integrity": "sha512-vZVEEwZoIsI+vPEuoF9Iqf5H7/M3eeQqWlQnYa8FSKKePuYTf5MWnxb5SDAzCa60b3JBRS5g9b+Dq7b1y/RCrA==" }, "promise": { - "version": "8.0.3", - "resolved": "https://registry.npmjs.org/promise/-/promise-8.0.3.tgz", - "integrity": "sha512-HeRDUL1RJiLhyA0/grn+PTShlBAcLuh/1BJGtrvjwbvRDCTLLMEz9rOGCV+R3vHY4MixIuoMEd9Yq/XvsTPcjw==", + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/promise/-/promise-8.1.0.tgz", + "integrity": "sha512-W04AqnILOL/sPRXziNicCjSNRruLAuIHEOVBazepu0545DDNGYHz7ar9ZgZ1fMU8/MA4mVxp5rkBWRi6OXIy3Q==", "requires": { "asap": "~2.0.6" } }, "regenerator-runtime": { - "version": "0.13.3", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.3.tgz", - "integrity": "sha512-naKIZz2GQ8JWh///G7L3X6LaQUAMp2lvb1rvwwsURe/VXwD6VMfr+/1NuNw3ag8v2kY1aQ/go5SNn79O9JU7yw==" + "version": "0.13.5", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.5.tgz", + "integrity": "sha512-ZS5w8CpKFinUzOwW3c83oPeVXoNsrLsaCoLtJvAClH135j/R77RuymhiSErhm2lKcwSCIpmvIWSbDkIfAqKQlA==" } } }, @@ -10978,25 +11249,34 @@ } }, "react-bootstrap": { - "version": "1.0.0-beta.16", - "resolved": "https://registry.npmjs.org/react-bootstrap/-/react-bootstrap-1.0.0-beta.16.tgz", - "integrity": "sha512-wjb+3CwviDWAaz4O3gQpd2XMDNqbOiqOOzpLm5aLPcp1wTsQsVRhyM+rTPmO3hYU8auA2eNpTYLz08/fAcMqDA==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/react-bootstrap/-/react-bootstrap-1.0.1.tgz", + "integrity": "sha512-xMHwsvDN7sIv26P9wWiosWjITZije2dRCjEJHVfV2KFoSJY+8uv2zttEw0XMB7xviQcW3zuIGLJXuj8vf6lYEg==", "requires": { "@babel/runtime": "^7.4.2", "@restart/context": "^2.1.4", - "@restart/hooks": "^0.3.11", - "@types/react": "^16.8.23", + "@restart/hooks": "^0.3.21", + "@types/react": "^16.9.23", "classnames": "^2.2.6", "dom-helpers": "^5.1.2", "invariant": "^2.2.4", - "keycode": "^2.2.0", - "popper.js": "^1.16.0", "prop-types": "^15.7.2", "prop-types-extra": "^1.1.0", - "react-overlays": "^2.1.0", + "react-overlays": "^3.1.2", "react-transition-group": "^4.0.0", "uncontrollable": "^7.0.0", "warning": "^4.0.3" + }, + "dependencies": { + "@types/react": { + "version": "16.9.34", + "resolved": "https://registry.npmjs.org/@types/react/-/react-16.9.34.tgz", + "integrity": "sha512-8AJlYMOfPe1KGLKyHpflCg5z46n0b5DbRfqDksxBLBTUpB75ypDBAO9eCUcjNwE6LCUslwTz00yyG/X9gaVtow==", + "requires": { + "@types/prop-types": "*", + "csstype": "^2.2.0" + } + } } }, "react-contexify": { @@ -11018,13 +11298,13 @@ } }, "react-dev-utils": { - "version": "10.2.0", - "resolved": "https://registry.npmjs.org/react-dev-utils/-/react-dev-utils-10.2.0.tgz", - "integrity": "sha512-MwrvQW2TFjLblhqpDNeqCXHBkz3G5vc7k4wntgutAJZX4ia3o07eGKo6uYGhUOeJ0hfOxcpJFNFk7+4XCc1S8g==", + "version": "10.2.1", + "resolved": "https://registry.npmjs.org/react-dev-utils/-/react-dev-utils-10.2.1.tgz", + "integrity": "sha512-XxTbgJnYZmxuPtY3y/UV0D8/65NKkmaia4rXzViknVnZeVlklSh8u6TnaEYPfAi/Gh1TP4mEOXHI6jQOPbeakQ==", "requires": { "@babel/code-frame": "7.8.3", "address": "1.1.2", - "browserslist": "4.8.6", + "browserslist": "4.10.0", "chalk": "2.4.2", "cross-spawn": "7.0.1", "detect-port-alt": "1.1.6", @@ -11041,21 +11321,27 @@ "loader-utils": "1.2.3", "open": "^7.0.2", "pkg-up": "3.1.0", - "react-error-overlay": "^6.0.6", + "react-error-overlay": "^6.0.7", "recursive-readdir": "2.2.2", "shell-quote": "1.7.2", "strip-ansi": "6.0.0", "text-table": "0.2.0" }, "dependencies": { + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==" + }, "browserslist": { - "version": "4.8.6", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.8.6.tgz", - "integrity": "sha512-ZHao85gf0eZ0ESxLfCp73GG9O/VTytYDIkIiZDlURppLTI9wErSM/5yAKEq6rcUdxBLjMELmrYUJGg5sxGKMHg==", + "version": "4.10.0", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.10.0.tgz", + "integrity": "sha512-TpfK0TDgv71dzuTsEAlQiHeWQ/tiPqgNZVdv046fvNtBZrjbv2O3TsWCDU0AWGJJKCF/KsjNdLzR9hXOsh/CfA==", "requires": { - "caniuse-lite": "^1.0.30001023", - "electron-to-chromium": "^1.3.341", - "node-releases": "^1.1.47" + "caniuse-lite": "^1.0.30001035", + "electron-to-chromium": "^1.3.378", + "node-releases": "^1.1.52", + "pkg-up": "^3.1.0" } }, "cross-spawn": { @@ -11068,6 +11354,11 @@ "which": "^2.0.1" } }, + "emojis-list": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz", + "integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k=" + }, "escape-string-regexp": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", @@ -11080,34 +11371,132 @@ "requires": { "locate-path": "^5.0.0", "path-exists": "^4.0.0" + }, + "dependencies": { + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "requires": { + "p-locate": "^4.1.0" + } + }, + "p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "requires": { + "p-limit": "^2.2.0" + } + }, + "path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==" + } + } + }, + "inquirer": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-7.0.4.tgz", + "integrity": "sha512-Bu5Td5+j11sCkqfqmUTiwv+tWisMtP0L7Q8WrqA2C/BbBhy1YTdFrvjjlrKq8oagA/tLQBski2Gcx/Sqyi2qSQ==", + "requires": { + "ansi-escapes": "^4.2.1", + "chalk": "^2.4.2", + "cli-cursor": "^3.1.0", + "cli-width": "^2.0.0", + "external-editor": "^3.0.3", + "figures": "^3.0.0", + "lodash": "^4.17.15", + "mute-stream": "0.0.8", + "run-async": "^2.2.0", + "rxjs": "^6.5.3", + "string-width": "^4.1.0", + "strip-ansi": "^5.1.0", + "through": "^2.3.6" + }, + "dependencies": { + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "requires": { + "ansi-regex": "^4.1.0" + } + } + } + }, + "json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "requires": { + "minimist": "^1.2.0" + } + }, + "loader-utils": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.2.3.tgz", + "integrity": "sha512-fkpz8ejdnEMG3s37wGL07iSBDg99O9D5yflE9RGNH3hRdx9SOwYfnGYdZOUIZitN8E+E2vkq3MUMYMvPYl5ZZA==", + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^2.0.0", + "json5": "^1.0.1" } }, "locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", "requires": { - "p-locate": "^4.1.0" + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "requires": { + "p-try": "^2.0.0" } }, "p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", "requires": { - "p-limit": "^2.2.0" + "p-limit": "^2.0.0" } }, - "path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==" + "p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==" }, "path-key": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==" }, + "pkg-up": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-3.1.0.tgz", + "integrity": "sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA==", + "requires": { + "find-up": "^3.0.0" + }, + "dependencies": { + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "requires": { + "locate-path": "^3.0.0" + } + } + } + }, "shebang-command": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", @@ -11127,6 +11516,13 @@ "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", "requires": { "ansi-regex": "^5.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==" + } } }, "which": { @@ -11188,29 +11584,29 @@ } }, "react-dom": { - "version": "16.12.0", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-16.12.0.tgz", - "integrity": "sha512-LMxFfAGrcS3kETtQaCkTKjMiifahaMySFDn71fZUNpPHZQEzmk/GiAeIT8JSOrHB23fnuCOMruL2a8NYlw+8Gw==", + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-16.13.1.tgz", + "integrity": "sha512-81PIMmVLnCNLO/fFOQxdQkvEq/+Hfpv24XNJfpyZhTRfO0QcmQIF/PgCa1zCOj2w1hrn12MFLyaJ/G0+Mxtfag==", "requires": { "loose-envify": "^1.1.0", "object-assign": "^4.1.1", "prop-types": "^15.6.2", - "scheduler": "^0.18.0" + "scheduler": "^0.19.1" } }, "react-draggable": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/react-draggable/-/react-draggable-4.2.0.tgz", - "integrity": "sha512-5wFq//gEoeTYprnd4ze8GrFc+Rbnx+9RkOMR3vk4EbWxj02U6L6T3yrlKeiw4X5CtjD2ma2+b3WujghcXNRzkw==", + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/react-draggable/-/react-draggable-4.3.1.tgz", + "integrity": "sha512-m8QeV+eIi7LhD5mXoLqDzLbokc6Ncwa0T34fF6uJzWSs4vc4fdZI/XGqHYoEn91T8S6qO+BSXslONh7Jz9VPQQ==", "requires": { "classnames": "^2.2.5", "prop-types": "^15.6.0" } }, "react-error-overlay": { - "version": "6.0.6", - "resolved": "https://registry.npmjs.org/react-error-overlay/-/react-error-overlay-6.0.6.tgz", - "integrity": "sha512-Yzpno3enVzSrSCnnljmr4b/2KUQSMZaPuqmS26t9k4nW7uwJk6STWmH9heNjPuvqUTO3jOSPkHoKgO4+Dw7uIw==" + "version": "6.0.7", + "resolved": "https://registry.npmjs.org/react-error-overlay/-/react-error-overlay-6.0.7.tgz", + "integrity": "sha512-TAv1KJFh3RhqxNvhzxj6LeT5NWklP6rDr2a0jaTfsZ5wSZWHOGeqQyejUp3xxLfPt2UpyJEcVQB/zyPcmonNFA==" }, "react-fullscreenable": { "version": "2.5.1-0", @@ -11223,9 +11619,9 @@ } }, "react-grid-system": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/react-grid-system/-/react-grid-system-6.2.1.tgz", - "integrity": "sha512-3yDWhrXrUvb5iZbAk0aPoNomTnSXB9u9paBIyOTzj9bzYceHceLego3g9ib7D9iAxRQ+E1j+affgvREtjZVKlA==", + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/react-grid-system/-/react-grid-system-6.3.1.tgz", + "integrity": "sha512-TWJcAdICTseZ16ONTt5LhVYLWJPzpFl4U5LSbF4/mZ/pV7fK7W8lr2bvHOnBWLvYgP3QVcLAxdpeoXj4q2QzmA==", "requires": { "prop-types": "^15.7.2" } @@ -11261,27 +11657,35 @@ } }, "react-overlays": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/react-overlays/-/react-overlays-2.1.0.tgz", - "integrity": "sha512-tHPGTZosbQSo82yb9x4YCsmJJtspKvAPL5kXVnyoB2Z5UoAU3VetIuh2VblfVT408us5nLJd9uDtwI3xWDHS6w==", + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/react-overlays/-/react-overlays-3.1.3.tgz", + "integrity": "sha512-FH82W0R9lFJm/YCTDeSvEKQxXyTaZmjMEQlAjRhgjQhknTkyMsft+X4Wep5l95QveqdxGVxl/P41WUOzTGJUcw==", "requires": { "@babel/runtime": "^7.4.5", + "@popperjs/core": "^2.0.0", "@restart/hooks": "^0.3.12", + "@types/warning": "^3.0.0", "dom-helpers": "^5.1.0", - "popper.js": "^1.15.0", "prop-types": "^15.7.2", "uncontrollable": "^7.0.0", "warning": "^4.0.3" } }, "react-rnd": { - "version": "10.1.6", - "resolved": "https://registry.npmjs.org/react-rnd/-/react-rnd-10.1.6.tgz", - "integrity": "sha512-g03X7wKXvLRBPLj2sSMy7QlSG24iE5TbdGRykgmySGQiefOK4m5BGALTr390CaKaIwt7CVzr2qYI2aeMCdMEdg==", + "version": "10.1.9", + "resolved": "https://registry.npmjs.org/react-rnd/-/react-rnd-10.1.9.tgz", + "integrity": "sha512-f6rkzEKehGRjKGK7XkdPQoHeUUawZidq3yzWdxeqFluupdbmvuM7Ygnmm6CgF6shAVrvfzxOSl/bejp9pNliUA==", "requires": { - "re-resizable": "6.2.0", - "react-draggable": "4.2.0", - "tslib": "1.10.0" + "re-resizable": "6.3.2", + "react-draggable": "4.3.1", + "tslib": "1.11.1" + }, + "dependencies": { + "tslib": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.11.1.tgz", + "integrity": "sha512-aZW88SY8kQbU7gpV19lN24LtXh/yD4ZZg6qieAJDDg+YBsJcSmLGK9QpnUjAKVG/xefmvJGd1WUmfpT/g6AJGA==" + } } }, "react-router": { @@ -11316,31 +11720,31 @@ } }, "react-scripts": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/react-scripts/-/react-scripts-3.4.0.tgz", - "integrity": "sha512-pBqaAroFoHnFAkuX+uSK9Th1uEh2GYdGY2IG1I9/7HmuEf+ls3lLCk1p2GFYRSrLMz6ieQR/SyN6TLIGK3hKRg==", + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/react-scripts/-/react-scripts-3.4.1.tgz", + "integrity": "sha512-JpTdi/0Sfd31mZA6Ukx+lq5j1JoKItX7qqEK4OiACjVQletM1P38g49d9/D0yTxp9FrSF+xpJFStkGgKEIRjlQ==", "requires": { - "@babel/core": "7.8.4", + "@babel/core": "7.9.0", "@svgr/webpack": "4.3.3", "@typescript-eslint/eslint-plugin": "^2.10.0", "@typescript-eslint/parser": "^2.10.0", - "babel-eslint": "10.0.3", + "babel-eslint": "10.1.0", "babel-jest": "^24.9.0", - "babel-loader": "8.0.6", + "babel-loader": "8.1.0", "babel-plugin-named-asset-import": "^0.3.6", - "babel-preset-react-app": "^9.1.1", + "babel-preset-react-app": "^9.1.2", "camelcase": "^5.3.1", "case-sensitive-paths-webpack-plugin": "2.3.0", "css-loader": "3.4.2", "dotenv": "8.2.0", "dotenv-expand": "5.1.0", "eslint": "^6.6.0", - "eslint-config-react-app": "^5.2.0", + "eslint-config-react-app": "^5.2.1", "eslint-loader": "3.0.3", "eslint-plugin-flowtype": "4.6.0", - "eslint-plugin-import": "2.20.0", + "eslint-plugin-import": "2.20.1", "eslint-plugin-jsx-a11y": "6.2.3", - "eslint-plugin-react": "7.18.0", + "eslint-plugin-react": "7.19.0", "eslint-plugin-react-hooks": "^1.6.1", "file-loader": "4.3.0", "fs-extra": "^8.1.0", @@ -11353,24 +11757,24 @@ "jest-watch-typeahead": "0.4.2", "mini-css-extract-plugin": "0.9.0", "optimize-css-assets-webpack-plugin": "5.0.3", - "pnp-webpack-plugin": "1.6.0", + "pnp-webpack-plugin": "1.6.4", "postcss-flexbugs-fixes": "4.1.0", "postcss-loader": "3.0.0", "postcss-normalize": "8.0.1", "postcss-preset-env": "6.7.0", "postcss-safe-parser": "4.0.1", "react-app-polyfill": "^1.0.6", - "react-dev-utils": "^10.2.0", + "react-dev-utils": "^10.2.1", "resolve": "1.15.0", "resolve-url-loader": "3.1.1", "sass-loader": "8.0.2", "semver": "6.3.0", "style-loader": "0.23.1", - "terser-webpack-plugin": "2.3.4", - "ts-pnp": "1.1.5", + "terser-webpack-plugin": "2.3.5", + "ts-pnp": "1.1.6", "url-loader": "2.3.0", - "webpack": "4.41.5", - "webpack-dev-server": "3.10.2", + "webpack": "4.42.0", + "webpack-dev-server": "3.10.3", "webpack-manifest-plugin": "2.2.0", "workbox-webpack-plugin": "4.3.1" }, @@ -11430,6 +11834,46 @@ "requires": { "find-up": "^3.0.0", "read-pkg": "^3.0.0" + }, + "dependencies": { + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "requires": { + "locate-path": "^3.0.0" + } + }, + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "requires": { + "p-limit": "^2.0.0" + } + }, + "p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==" + } } }, "readable-stream": { @@ -11504,9 +11948,9 @@ "integrity": "sha512-1G6jJVDWrt0rK99kBjvEtziZNCICAuvIPkSiUFIQxVP06RCVpq3dmDo2oi6ABpYaDYaTRr67BEhL8r1wgEZZKg==" }, "regenerate-unicode-properties": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-8.1.0.tgz", - "integrity": "sha512-LGZzkgtLY79GeXLm8Dp0BVLdQlWICzBnJz/ipWUgo59qBaZ+BHtq51P2q1uVZlppMuUAT37SDk39qUbjTWB7bA==", + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-8.2.0.tgz", + "integrity": "sha512-F9DjY1vKLo/tPePDycuH3dn9H1OTPIkVD9Kz4LODu+F2C75mgjAJ7x/gwy6ZcSNRAAkhNlJSOHRe8k3p+K9WhA==", "requires": { "regenerate": "^1.4.0" } @@ -11517,11 +11961,27 @@ "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==" }, "regenerator-transform": { - "version": "0.14.1", - "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.14.1.tgz", - "integrity": "sha512-flVuee02C3FKRISbxhXl9mGzdbWUVHubl1SMaknjxkFB1/iqpJhArQUvRxOOPEc/9tAiX0BaQ28FJH10E4isSQ==", + "version": "0.14.4", + "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.14.4.tgz", + "integrity": "sha512-EaJaKPBI9GvKpvUz2mz4fhx7WPgvwRLY9v3hlNHWmAuJHI13T4nwKnNvm5RWJzEdnI5g5UwtOww+S8IdoUC2bw==", "requires": { - "private": "^0.1.6" + "@babel/runtime": "^7.8.4", + "private": "^0.1.8" + }, + "dependencies": { + "@babel/runtime": { + "version": "7.9.2", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.9.2.tgz", + "integrity": "sha512-NE2DtOdufG7R5vnfQUTehdTfNycfUANEtCa9PssN9O/xmTzP4E08UI797ixaei6hBEVL9BI/PsdJS5x7mWoB9Q==", + "requires": { + "regenerator-runtime": "^0.13.4" + } + }, + "regenerator-runtime": { + "version": "0.13.5", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.5.tgz", + "integrity": "sha512-ZS5w8CpKFinUzOwW3c83oPeVXoNsrLsaCoLtJvAClH135j/R77RuymhiSErhm2lKcwSCIpmvIWSbDkIfAqKQlA==" + } } }, "regex-not": { @@ -11548,21 +12008,21 @@ } }, "regexpp": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.0.0.tgz", - "integrity": "sha512-Z+hNr7RAVWxznLPuA7DIh8UNX1j9CDrUQxskw9IrBE1Dxue2lyXT+shqEIeLUjrokxIP8CMy1WkjgG3rTsd5/g==" + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.1.0.tgz", + "integrity": "sha512-ZOIzd8yVsQQA7j8GCSlPGXwg5PfmA1mrq0JP4nGhh54LaKN3xdai/vHUDu74pKwV8OxseMS65u2NImosQcSD0Q==" }, "regexpu-core": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.6.0.tgz", - "integrity": "sha512-YlVaefl8P5BnFYOITTNzDvan1ulLOiXJzCNZxduTIosN17b87h3bvG9yHMoHaRuo88H4mQ06Aodj5VtYGGGiTg==", + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.7.0.tgz", + "integrity": "sha512-TQ4KXRnIn6tz6tjnrXEkD/sshygKH/j5KzK86X8MkeHyZ8qst/LZ89j3X4/8HEIfHANTFIP/AbXakeRhWIl5YQ==", "requires": { "regenerate": "^1.4.0", - "regenerate-unicode-properties": "^8.1.0", - "regjsgen": "^0.5.0", - "regjsparser": "^0.6.0", + "regenerate-unicode-properties": "^8.2.0", + "regjsgen": "^0.5.1", + "regjsparser": "^0.6.4", "unicode-match-property-ecmascript": "^1.0.4", - "unicode-match-property-value-ecmascript": "^1.1.0" + "unicode-match-property-value-ecmascript": "^1.2.0" } }, "regjsgen": { @@ -11571,9 +12031,9 @@ "integrity": "sha512-5qxzGZjDs9w4tzT3TPhCJqWdCc3RLYwy9J2NB0nm5Lz+S273lvWcpjaTGHsT1dc6Hhfq41uSEOw8wBmxrKOuyg==" }, "regjsparser": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.6.3.tgz", - "integrity": "sha512-8uZvYbnfAtEm9Ab8NTb3hdLwL4g/LQzEYP7Xs27T96abJCCE2d6r3cPZPQEsLKy0vRSGVNG+/zVGtLr86HQduA==", + "version": "0.6.4", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.6.4.tgz", + "integrity": "sha512-64O87/dPDgfk8/RQqC4gkZoGyyWFIEUTTh80CU6CWuK5vkCGyekIx+oKcEIYtP/RAxSQltCZHCNu/mdd7fqlJw==", "requires": { "jsesc": "~0.5.0" }, @@ -11794,6 +12254,29 @@ "source-map": "0.6.1" }, "dependencies": { + "emojis-list": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz", + "integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k=" + }, + "json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "requires": { + "minimist": "^1.2.0" + } + }, + "loader-utils": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.2.3.tgz", + "integrity": "sha512-fkpz8ejdnEMG3s37wGL07iSBDg99O9D5yflE9RGNH3hRdx9SOwYfnGYdZOUIZitN8E+E2vkq3MUMYMvPYl5ZZA==", + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^2.0.0", + "json5": "^1.0.1" + } + }, "postcss": { "version": "7.0.21", "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.21.tgz", @@ -11887,12 +12370,9 @@ "integrity": "sha512-nfMOlASu9OnRJo1mbEk2cz0D56a1MBNrJ7orjRZQG10XDyuvwksKbuXNp6qa+kbn839HwjwhBzhFmdsaEAfauA==" }, "run-async": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.3.0.tgz", - "integrity": "sha1-A3GrSuC91yDUFm19/aZP96RFpsA=", - "requires": { - "is-promise": "^2.1.0" - } + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", + "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==" }, "run-queue": { "version": "1.0.3", @@ -11903,9 +12383,9 @@ } }, "rxjs": { - "version": "6.5.4", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.4.tgz", - "integrity": "sha512-naMQXcgEo3csAEGvw/NydRA0fuS2nDZJiw1YUWFKU7aPPAPGZEsD4Iimit96qwCieH6y614MCLYwdkrWx7z/7Q==", + "version": "6.5.5", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.5.tgz", + "integrity": "sha512-WfQI+1gohdf0Dai/Bbmk5L5ItH5tYqm3ki2c5GdWhKjalzjg93N3avFjVStyZZz+A2Em+ZxKH5bNghw9UeylGQ==", "requires": { "tslib": "^1.9.0" } @@ -11942,13 +12422,6 @@ "micromatch": "^3.1.4", "minimist": "^1.1.1", "walker": "~1.0.5" - }, - "dependencies": { - "minimist": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" - } } }, "sanitize.css": { @@ -11957,9 +12430,9 @@ "integrity": "sha512-vTxrZz4dX5W86M6oVWVdOVe72ZiPs41Oi7Z6Km4W5Turyz28mrXSJhhEBZoRtzJWIv3833WKVwLSDWWkEfupMg==" }, "sass": { - "version": "1.25.0", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.25.0.tgz", - "integrity": "sha512-uQMjye0Y70SEDGO56n0j91tauqS9E1BmpKHtiYNQScXDHeaE9uHwNEqQNFf4Bes/3DHMNinB6u79JsG10XWNyw==", + "version": "1.26.5", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.26.5.tgz", + "integrity": "sha512-FG2swzaZUiX53YzZSjSakzvGtlds0lcbF+URuU9mxOv7WBh7NhXEVDa4kPKN4hN6fC2TkOTOKqiqp6d53N9X5Q==", "requires": { "chokidar": ">=2.0.0 <4.0.0" } @@ -12231,21 +12704,39 @@ } }, "scheduler": { - "version": "0.18.0", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.18.0.tgz", - "integrity": "sha512-agTSHR1Nbfi6ulI0kYNK0203joW2Y5W4po4l+v03tOoiJKpTBbxpNhWDvqc/4IcOw+KLmSiQLTasZ4cab2/UWQ==", + "version": "0.19.1", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.19.1.tgz", + "integrity": "sha512-n/zwRWRYSUj0/3g/otKDRPMh6qv2SYMWNq85IEa8iZyAv8od9zDYpGSnpBEjNgcMNq6Scbu5KfIPxNF72R/2EA==", "requires": { "loose-envify": "^1.1.0", "object-assign": "^4.1.1" } }, "schema-utils": { - "version": "2.6.4", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.6.4.tgz", - "integrity": "sha512-VNjcaUxVnEeun6B2fiiUDjXXBtD4ZSH7pdbfIu1pOFwgptDPLMo/z9jr4sUfsjFVPqDCEin/F7IYlq7/E6yDbQ==", + "version": "2.6.6", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.6.6.tgz", + "integrity": "sha512-wHutF/WPSbIi9x6ctjGGk2Hvl0VOz5l3EKEuKbjPlB30mKZUzb9A5k9yEXRX3pwyqVLPvpfZZEllaFq/M718hA==", "requires": { - "ajv": "^6.10.2", + "ajv": "^6.12.0", "ajv-keywords": "^3.4.1" + }, + "dependencies": { + "ajv": { + "version": "6.12.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.2.tgz", + "integrity": "sha512-k+V+hzjm5q/Mr8ef/1Y9goCmlsK4I6Sm74teeyGvFk1XrOsbsKLjEdrvny42CZ+a8sXbk8KWpY/bDwS+FLL2UQ==", + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "fast-deep-equal": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.1.tgz", + "integrity": "sha512-8UEa58QDLauDNfpbrX55Q9jrGHThw2ZMdOky5Gl1CDtVeJDPVrG4Jxx1N8jw2gkWaff5UUuX1KJd+9zGe2B+ZA==" + } } }, "scss-tokenizer": { @@ -12502,6 +12993,15 @@ "resolved": "https://registry.npmjs.org/shellwords/-/shellwords-0.1.1.tgz", "integrity": "sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww==" }, + "side-channel": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.2.tgz", + "integrity": "sha512-7rL9YlPHg7Ancea1S96Pa8/QWb4BtXL/TZvS6B8XFetGBeuhAsfmUspK6DokBeZ64+Kj9TCNRD/30pVz1BvQNA==", + "requires": { + "es-abstract": "^1.17.0-next.1", + "object-inspect": "^1.7.0" + } + }, "signal-exit": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", @@ -12523,9 +13023,9 @@ } }, "sisteransi": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.4.tgz", - "integrity": "sha512-/ekMoM4NJ59ivGSfKapeG+FWtrmWvA1p6FBZwXrqojw90vJu8lBmrTxCMuBCydKtkaUe2zt4PlxeTKpjwMbyig==" + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", + "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==" }, "slash": { "version": "2.0.0", @@ -12730,9 +13230,9 @@ } }, "source-map-support": { - "version": "0.5.16", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.16.tgz", - "integrity": "sha512-efyLRJDr68D9hBBNIPWFjhpFzURh+KJykQwvMyW5UiZzYwoF6l4YMMDIJJEyFWxWCqfyxLzz6tSfUFR+kXXsVQ==", + "version": "0.5.19", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz", + "integrity": "sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==", "requires": { "buffer-from": "^1.0.0", "source-map": "^0.6.0" @@ -12772,9 +13272,9 @@ "integrity": "sha512-J+FWzZoynJEXGphVIS+XEh3kFSjZX/1i9gFBaWQcB+/tmpe2qUsSBABpcxqxnAxFdiUFEgAX1bjYGQvIZmoz9Q==" }, "spdy": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.1.tgz", - "integrity": "sha512-HeZS3PBdMA+sZSu0qwpCxl3DeALD5ASx8pAX0jZdKXSpPWbQ6SYGnlg3BBmYLx5LtiZrmkAZfErCm2oECBcioA==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz", + "integrity": "sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==", "requires": { "debug": "^4.1.0", "handle-thing": "^2.0.0", @@ -12977,22 +13477,55 @@ } } }, - "string.prototype.trimleft": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string.prototype.trimleft/-/string.prototype.trimleft-2.1.1.tgz", - "integrity": "sha512-iu2AGd3PuP5Rp7x2kEZCrB2Nf41ehzh+goo8TV7z8/XDBbsvc6HQIlUl9RjkZ4oyrW1XM5UwlGl1oVEaDjg6Ag==", + "string.prototype.matchall": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.2.tgz", + "integrity": "sha512-N/jp6O5fMf9os0JU3E72Qhf590RSRZU/ungsL/qJUYVTNv7hTG0P/dbPjxINVN9jpscu3nzYwKESU3P3RY5tOg==", "requires": { "define-properties": "^1.1.3", - "function-bind": "^1.1.1" + "es-abstract": "^1.17.0", + "has-symbols": "^1.0.1", + "internal-slot": "^1.0.2", + "regexp.prototype.flags": "^1.3.0", + "side-channel": "^1.0.2" + } + }, + "string.prototype.trimend": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.1.tgz", + "integrity": "sha512-LRPxFUaTtpqYsTeNKaFOw3R4bxIzWOnbQ837QfBylo8jIxtcbK/A/sMV7Q+OAV/vWo+7s25pOE10KYSjaSO06g==", + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.5" + } + }, + "string.prototype.trimleft": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/string.prototype.trimleft/-/string.prototype.trimleft-2.1.2.tgz", + "integrity": "sha512-gCA0tza1JBvqr3bfAIFJGqfdRTyPae82+KTnm3coDXkZN9wnuW3HjGgN386D7hfv5CHQYCI022/rJPVlqXyHSw==", + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.5", + "string.prototype.trimstart": "^1.0.0" } }, "string.prototype.trimright": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string.prototype.trimright/-/string.prototype.trimright-2.1.1.tgz", - "integrity": "sha512-qFvWL3/+QIgZXVmJBfpHmxLB7xsUXz6HsUmP8+5dRaC3Q7oKUv9Vo6aMCRZC1smrtyECFsIT30PqBJ1gTjAs+g==", + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/string.prototype.trimright/-/string.prototype.trimright-2.1.2.tgz", + "integrity": "sha512-ZNRQ7sY3KroTaYjRS6EbNiiHrOkjihL9aQE/8gfQ4DtAC/aEBRHFJa44OmoWxGGqXuJlfKkZW4WcXErGr+9ZFg==", "requires": { "define-properties": "^1.1.3", - "function-bind": "^1.1.1" + "es-abstract": "^1.17.5", + "string.prototype.trimend": "^1.0.0" + } + }, + "string.prototype.trimstart": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.1.tgz", + "integrity": "sha512-XxZn+QpvrBI1FOcg6dIpxUPgWCPuNXvMD72aaRaUQv1eD4e/Qy8i/hFTe0BUmD60p/QA6bh1avmuPTfNjqVWRw==", + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.5" } }, "string_decoder": { @@ -13063,9 +13596,9 @@ } }, "strip-json-comments": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.0.1.tgz", - "integrity": "sha512-VTyMAUfdm047mwKl+u79WIdrZxtFtn+nBxHeb844XBQ9uMNTuTHdx2hc5RiAJYqwTj3wc/xe5HLSdJSkJ+WfZw==" + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.0.tgz", + "integrity": "sha512-e6/d0eBu7gHtdCqFt0xJr642LdToM5/cN4Qb9DbHjVx1CP5RyeM+zH7pbecEmDv/lBqb0QH+6Uqq75rxFPkM0w==" }, "style-loader": { "version": "0.23.1", @@ -13164,9 +13697,9 @@ } }, "svg-parser": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/svg-parser/-/svg-parser-2.0.3.tgz", - "integrity": "sha512-fnCWiifNhK8i2Z7b9R5tbNahpxrRdAaQbnoxKlT2KrSCj9Kq/yBSgulCRgBJRhy1dPnSY5slg5ehPUnzpEcHlg==" + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/svg-parser/-/svg-parser-2.0.4.tgz", + "integrity": "sha512-e4hG1hRwoOdRb37cIMSgzNsxyzKfayW6VOflrwvR+/bzrkyxY/31WkbgnQpgtrNp1SdpJvpUAGTa/ZoiPNDuRQ==" }, "svgo": { "version": "1.3.2", @@ -13247,9 +13780,9 @@ } }, "terser": { - "version": "4.6.3", - "resolved": "https://registry.npmjs.org/terser/-/terser-4.6.3.tgz", - "integrity": "sha512-Lw+ieAXmY69d09IIc/yqeBqXpEQIpDGZqT34ui1QWXIUpR2RjbqEkT8X7Lgex19hslSqcWM5iMN2kM11eMsESQ==", + "version": "4.6.12", + "resolved": "https://registry.npmjs.org/terser/-/terser-4.6.12.tgz", + "integrity": "sha512-fnIwuaKjFPANG6MAixC/k1TDtnl1YlPLUlLVIxxGZUn1gfUx2+l3/zGNB72wya+lgsb50QBi2tUV75RiODwnww==", "requires": { "commander": "^2.20.0", "source-map": "~0.6.1", @@ -13257,9 +13790,9 @@ } }, "terser-webpack-plugin": { - "version": "2.3.4", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-2.3.4.tgz", - "integrity": "sha512-Nv96Nws2R2nrFOpbzF6IxRDpIkkIfmhvOws+IqMvYdFLO7o6wAILWFKONFgaYy8+T4LVz77DQW0f7wOeDEAjrg==", + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-2.3.5.tgz", + "integrity": "sha512-WlWksUoq+E4+JlJ+h+U+QUzXpcsMSSNXkDy9lBVkSqDn1w23Gg29L/ary9GeJVYCGiNJJX7LnVc4bwL1N3/g1w==", "requires": { "cacache": "^13.0.1", "find-cache-dir": "^3.2.0", @@ -13273,12 +13806,12 @@ }, "dependencies": { "find-cache-dir": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.2.0.tgz", - "integrity": "sha512-1JKclkYYsf1q9WIJKLZa9S9muC+08RIjzAlLrK4QcYLJMS6mk9yombQ9qf+zJ7H9LS800k0s44L4sDq9VYzqyg==", + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.1.tgz", + "integrity": "sha512-t2GDMt3oGC/v+BMwzmllWDuJF/xcDtE5j/fCGbqDD7OLuJkj0cfh1YSA5VKPvwMeLFLNDBkwOKZ2X85jGLVftQ==", "requires": { "commondir": "^1.0.1", - "make-dir": "^3.0.0", + "make-dir": "^3.0.2", "pkg-dir": "^4.1.0" } }, @@ -13297,9 +13830,9 @@ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" }, "jest-worker": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-25.1.0.tgz", - "integrity": "sha512-ZHhHtlxOWSxCoNOKHGbiLzXnl42ga9CxDr27H36Qn+15pQZd3R/F24jrmjDelw9j/iHUIWMWs08/u2QN50HHOg==", + "version": "25.4.0", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-25.4.0.tgz", + "integrity": "sha512-ghAs/1FtfYpMmYQ0AHqxV62XPvKdUDIBBApMZfly+E9JEmYh2K45G0R5dWxx986RN12pRCxsViwQVtGl+N4whw==", "requires": { "merge-stream": "^2.0.0", "supports-color": "^7.0.0" @@ -13314,13 +13847,21 @@ } }, "make-dir": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.0.2.tgz", - "integrity": "sha512-rYKABKutXa6vXTXhoV18cBE7PaewPXHe/Bdq4v+ZLMhxbWApkFFplT0LcbMW+6BbjnQXzZ/sAvSE/JdguApG5w==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", "requires": { "semver": "^6.0.0" } }, + "p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "requires": { + "p-try": "^2.0.0" + } + }, "p-locate": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", @@ -13329,6 +13870,11 @@ "p-limit": "^2.2.0" } }, + "p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==" + }, "path-exists": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", @@ -13507,14 +14053,14 @@ } }, "ts-pnp": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/ts-pnp/-/ts-pnp-1.1.5.tgz", - "integrity": "sha512-ti7OGMOUOzo66wLF3liskw6YQIaSsBgc4GOAlWRnIEj8htCxJUxskanMUoJOD6MDCRAXo36goXJZch+nOS0VMA==" + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/ts-pnp/-/ts-pnp-1.1.6.tgz", + "integrity": "sha512-CrG5GqAAzMT7144Cl+UIFP7mz/iIhiy+xQ6GGcnjTezhALT02uPMRw7tgDSESgB5MsfKt55+GPWw4ir1kVtMIQ==" }, "tslib": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.10.0.tgz", - "integrity": "sha512-qOebF53frne81cf0S9B41ByenJ3/IuH8yJKngAX35CmiZySA0khhkovshKK+jGCaMnVomla7gVlIcc3EvKPbTQ==" + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.11.1.tgz", + "integrity": "sha512-aZW88SY8kQbU7gpV19lN24LtXh/yD4ZZg6qieAJDDg+YBsJcSmLGK9QpnUjAKVG/xefmvJGd1WUmfpT/g6AJGA==" }, "tsutils": { "version": "3.17.1", @@ -13581,9 +14127,9 @@ "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=" }, "typescript": { - "version": "3.7.5", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.7.5.tgz", - "integrity": "sha512-/P5lkRXkWHNAbcJIiHPfRoKqyd7bsyCma1hZNUGfn20qm64T6ZBlrzprymeu918H+mB/0rIg2gGK/BXkhhYgBw==" + "version": "3.8.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.8.3.tgz", + "integrity": "sha512-MYlEfn5VrLNsgudQTVJeNaQFUAI7DkhnOjdpAp4T+ku1TfQClewlbSuTVHiA+8skNBgaf02TL/kLOvig4y3G8w==" }, "ua-parser-js": { "version": "0.7.20", @@ -13591,13 +14137,12 @@ "integrity": "sha512-8OaIKfzL5cpx8eCMAhhvTlft8GYF8b2eQr6JkCyVdrgjcytyOmPCXrqXFcUnhonRpLlh5yxEZVohm6mzaowUOw==" }, "uglify-js": { - "version": "3.7.7", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.7.7.tgz", - "integrity": "sha512-FeSU+hi7ULYy6mn8PKio/tXsdSXN35lm4KgV2asx00kzrLU9Pi3oAslcJT70Jdj7PHX29gGUPOT6+lXGBbemhA==", + "version": "3.9.1", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.9.1.tgz", + "integrity": "sha512-JUPoL1jHsc9fOjVFHdQIhqEEJsQvfKDjlubcCilu8U26uZ73qOg8VsN8O1jbuei44ZPlwL7kmbAdM4tzaUvqnA==", "optional": true, "requires": { - "commander": "~2.20.3", - "source-map": "~0.6.1" + "commander": "~2.20.3" } }, "uncontrollable": { @@ -13626,14 +14171,14 @@ } }, "unicode-match-property-value-ecmascript": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.1.0.tgz", - "integrity": "sha512-hDTHvaBk3RmFzvSl0UVrUmC3PuW9wKVnpoUDYH0JDkSIovzw+J5viQmeYHxVSBptubnr7PbH2e0fnpDRQnQl5g==" + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.2.0.tgz", + "integrity": "sha512-wjuQHGQVofmSJv1uVISKLE5zO2rNGzM/KCYZch/QQvez7C1hUhBIuZ701fYXExuufJFMPhv2SyL8CyoIfMLbIQ==" }, "unicode-property-aliases-ecmascript": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-1.0.5.tgz", - "integrity": "sha512-L5RAqCfXqAwR3RriF8pM0lU0w4Ryf/GgzONwi6KnL1taJQa7x1TCxdJnILX59WIGOwR57IVxn7Nej0fz1Ny6fw==" + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-1.1.0.tgz", + "integrity": "sha512-PqSoPh/pWetQ2phoj5RLiaqIk4kCNwoV3CI+LfGmWLKI3rE3kl1h59XpX2BjgDrmbxD9ARtQobPGU1SguCYuQg==" }, "union-value": { "version": "1.0.1", @@ -13728,11 +14273,6 @@ "resolved": "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz", "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==" }, - "upper-case": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/upper-case/-/upper-case-1.1.3.tgz", - "integrity": "sha1-9rRQHC7EzdJrp4vnIilh3ndiFZg=" - }, "uri-js": { "version": "4.2.2", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", @@ -13882,11 +14422,11 @@ "integrity": "sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==" }, "w3c-hr-time": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.1.tgz", - "integrity": "sha1-gqwr/2PZUOqeMYmlimViX+3xkEU=", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz", + "integrity": "sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==", "requires": { - "browser-process-hrtime": "^0.1.2" + "browser-process-hrtime": "^1.0.0" } }, "w3c-xmlserializer": { @@ -13916,11 +14456,11 @@ } }, "watchpack": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.6.0.tgz", - "integrity": "sha512-i6dHe3EyLjMmDlU1/bGQpEw25XSjkJULPuAVKCbNRefQVq48yXKUpwg538F7AZTf9kyr57zj++pQFltUa5H7yA==", + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.6.1.tgz", + "integrity": "sha512-+IF9hfUFOrYOOaKyfaI7h7dquUIOgyEMoQMLA7OP5FxegKA2+XdXThAZ9TU2kucfhDH7rfMHs1oPYziVGWRnZA==", "requires": { - "chokidar": "^2.0.2", + "chokidar": "^2.1.8", "graceful-fs": "^4.1.2", "neo-async": "^2.5.0" }, @@ -13950,12 +14490,11 @@ } }, "fsevents": { - "version": "1.2.11", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.11.tgz", - "integrity": "sha512-+ux3lx6peh0BpvY0JebGyZoiR4D+oYzdPZMKJwkZ+sFkNJzpL7tXc/wehS49gUAxg3tmMHPHZkA8JU2rhhgDHw==", + "version": "1.2.12", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.12.tgz", + "integrity": "sha512-Ggd/Ktt7E7I8pxZRbGIs7vwqAPscSESMrCSkx2FtWeqmheJgCo2R74fTsZFCifr0VTPwqRpPv17+6b8Zp7th0Q==", "optional": true, "requires": { - "bindings": "^1.5.0", "nan": "^2.12.1", "node-pre-gyp": "*" }, @@ -13999,7 +14538,7 @@ } }, "chownr": { - "version": "1.1.3", + "version": "1.1.4", "bundled": true, "optional": true }, @@ -14149,7 +14688,7 @@ } }, "minimist": { - "version": "0.0.8", + "version": "1.2.5", "bundled": true, "optional": true }, @@ -14171,11 +14710,11 @@ } }, "mkdirp": { - "version": "0.5.1", + "version": "0.5.3", "bundled": true, "optional": true, "requires": { - "minimist": "0.0.8" + "minimist": "^1.2.5" } }, "ms": { @@ -14184,7 +14723,7 @@ "optional": true }, "needle": { - "version": "2.4.0", + "version": "2.3.3", "bundled": true, "optional": true, "requires": { @@ -14211,7 +14750,7 @@ } }, "nopt": { - "version": "4.0.1", + "version": "4.0.3", "bundled": true, "optional": true, "requires": { @@ -14233,12 +14772,13 @@ "optional": true }, "npm-packlist": { - "version": "1.4.7", + "version": "1.4.8", "bundled": true, "optional": true, "requires": { "ignore-walk": "^3.0.1", - "npm-bundled": "^1.0.1" + "npm-bundled": "^1.0.1", + "npm-normalize-package-bin": "^1.0.1" } }, "npmlog": { @@ -14308,17 +14848,10 @@ "ini": "~1.3.0", "minimist": "^1.2.0", "strip-json-comments": "~2.0.1" - }, - "dependencies": { - "minimist": { - "version": "1.2.0", - "bundled": true, - "optional": true - } } }, "readable-stream": { - "version": "2.3.6", + "version": "2.3.7", "bundled": true, "optional": true, "requires": { @@ -14497,9 +15030,9 @@ "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==" }, "webpack": { - "version": "4.41.5", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.41.5.tgz", - "integrity": "sha512-wp0Co4vpyumnp3KlkmpM5LWuzvZYayDwM2n17EHFr4qxBBbRokC7DJawPJC7TfSFZ9HZ6GsdH40EBj4UV0nmpw==", + "version": "4.42.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.42.0.tgz", + "integrity": "sha512-EzJRHvwQyBiYrYqhyjW9AqM90dE4+s1/XtCfn7uWg6cS72zH+2VPFAlsnW0+W0cDi0XRjNKUMoJtpSi50+Ph6w==", "requires": { "@webassemblyjs/ast": "1.8.5", "@webassemblyjs/helper-module-context": "1.8.5", @@ -14527,14 +15060,14 @@ }, "dependencies": { "acorn": { - "version": "6.4.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.0.tgz", - "integrity": "sha512-gac8OEcQ2Li1dxIEWGZzsp2BitJxwkwcOm0zHAJLcPJaVvm58FRnk6RkuLRpU1EujipU2ZFODv2P9DLMfnV8mw==" + "version": "6.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.1.tgz", + "integrity": "sha512-ZVA9k326Nwrj3Cj9jlh3wGFutC2ZornPNARZwsNYqQYgN0EsV2d53w5RN/co65Ohn4sUAUtb1rSUAOD6XN9idA==" }, "cacache": { - "version": "12.0.3", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-12.0.3.tgz", - "integrity": "sha512-kqdmfXEGFepesTuROHMs3MpFLWrPkSSpRqOw80RCflZXy/khxaArvFrQ7uJxSUduzAufc6G0g1VUCOZXxWavPw==", + "version": "12.0.4", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-12.0.4.tgz", + "integrity": "sha512-a0tMB40oefvuInr4Cwb3GerbL9xTj1D5yg0T5xrjGCGyfvbxseIXX7BAO/u/hIXdafzOI5JC3wDwHyf24buOAQ==", "requires": { "bluebird": "^3.5.5", "chownr": "^1.1.1", @@ -14611,9 +15144,9 @@ } }, "webpack-dev-server": { - "version": "3.10.2", - "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-3.10.2.tgz", - "integrity": "sha512-pxZKPYb+n77UN8u9YxXT4IaIrGcNtijh/mi8TXbErHmczw0DtPnMTTjHj+eNjkqLOaAZM/qD7V59j/qJsEiaZA==", + "version": "3.10.3", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-3.10.3.tgz", + "integrity": "sha512-e4nWev8YzEVNdOMcNzNeCN947sWJNd43E5XvsJzbAL08kGc2frm1tQ32hTJslRS+H65LCb/AaUCYU7fjHCpDeQ==", "requires": { "ansi-html": "0.0.7", "bonjour": "^3.5.0", @@ -14704,13 +15237,20 @@ } } }, + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "requires": { + "locate-path": "^3.0.0" + } + }, "fsevents": { - "version": "1.2.11", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.11.tgz", - "integrity": "sha512-+ux3lx6peh0BpvY0JebGyZoiR4D+oYzdPZMKJwkZ+sFkNJzpL7tXc/wehS49gUAxg3tmMHPHZkA8JU2rhhgDHw==", + "version": "1.2.12", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.12.tgz", + "integrity": "sha512-Ggd/Ktt7E7I8pxZRbGIs7vwqAPscSESMrCSkx2FtWeqmheJgCo2R74fTsZFCifr0VTPwqRpPv17+6b8Zp7th0Q==", "optional": true, "requires": { - "bindings": "^1.5.0", "nan": "^2.12.1", "node-pre-gyp": "*" }, @@ -14754,7 +15294,7 @@ } }, "chownr": { - "version": "1.1.3", + "version": "1.1.4", "bundled": true, "optional": true }, @@ -14904,7 +15444,7 @@ } }, "minimist": { - "version": "0.0.8", + "version": "1.2.5", "bundled": true, "optional": true }, @@ -14926,11 +15466,11 @@ } }, "mkdirp": { - "version": "0.5.1", + "version": "0.5.3", "bundled": true, "optional": true, "requires": { - "minimist": "0.0.8" + "minimist": "^1.2.5" } }, "ms": { @@ -14939,7 +15479,7 @@ "optional": true }, "needle": { - "version": "2.4.0", + "version": "2.3.3", "bundled": true, "optional": true, "requires": { @@ -14966,7 +15506,7 @@ } }, "nopt": { - "version": "4.0.1", + "version": "4.0.3", "bundled": true, "optional": true, "requires": { @@ -14988,12 +15528,13 @@ "optional": true }, "npm-packlist": { - "version": "1.4.7", + "version": "1.4.8", "bundled": true, "optional": true, "requires": { "ignore-walk": "^3.0.1", - "npm-bundled": "^1.0.1" + "npm-bundled": "^1.0.1", + "npm-normalize-package-bin": "^1.0.1" } }, "npmlog": { @@ -15063,17 +15604,10 @@ "ini": "~1.3.0", "minimist": "^1.2.0", "strip-json-comments": "~2.0.1" - }, - "dependencies": { - "minimist": { - "version": "1.2.0", - "bundled": true, - "optional": true - } } }, "readable-stream": { - "version": "2.3.6", + "version": "2.3.7", "bundled": true, "optional": true, "requires": { @@ -15236,11 +15770,41 @@ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" }, + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, "normalize-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==" }, + "p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "requires": { + "p-limit": "^2.0.0" + } + }, + "p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==" + }, "readdirp": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", @@ -15513,9 +16077,9 @@ "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==" }, "wordwrap": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz", - "integrity": "sha1-o9XabNXAvAAI03I0u68b7WMFkQc=" + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", + "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=" }, "workbox-background-sync": { "version": "4.3.1", @@ -15767,6 +16331,14 @@ "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==" }, + "xregexp": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/xregexp/-/xregexp-4.3.0.tgz", + "integrity": "sha512-7jXDIFXh5yJ/orPn4SXjuVrWWoi4Cr8jfV1eHv9CixKSbU+jY4mxfrBwAuDvupPNKpMUY+FeIqsVw/JLT9+B8g==", + "requires": { + "@babel/runtime-corejs3": "^7.8.3" + } + }, "xtend": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", @@ -15783,17 +16355,32 @@ "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" }, "yaml": { - "version": "1.7.2", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.7.2.tgz", - "integrity": "sha512-qXROVp90sb83XtAoqE8bP9RwAkTTZbugRUTm5YeFCBfNRPEp2YzTeqWiz7m5OORHzEvrA/qcGS8hp/E+MMROYw==", + "version": "1.9.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.9.2.tgz", + "integrity": "sha512-HPT7cGGI0DuRcsO51qC1j9O16Dh1mZ2bnXwsi0jrSpsLz0WxOLSLXfkABVl6bZO629py3CU+OMJtpNHDLB97kg==", "requires": { - "@babel/runtime": "^7.6.3" + "@babel/runtime": "^7.9.2" + }, + "dependencies": { + "@babel/runtime": { + "version": "7.9.2", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.9.2.tgz", + "integrity": "sha512-NE2DtOdufG7R5vnfQUTehdTfNycfUANEtCa9PssN9O/xmTzP4E08UI797ixaei6hBEVL9BI/PsdJS5x7mWoB9Q==", + "requires": { + "regenerator-runtime": "^0.13.4" + } + }, + "regenerator-runtime": { + "version": "0.13.5", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.5.tgz", + "integrity": "sha512-ZS5w8CpKFinUzOwW3c83oPeVXoNsrLsaCoLtJvAClH135j/R77RuymhiSErhm2lKcwSCIpmvIWSbDkIfAqKQlA==" + } } }, "yargs": { - "version": "13.3.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.0.tgz", - "integrity": "sha512-2eehun/8ALW8TLoIl7MVaRUrg+yCnenu8B4kBlRxj3GJGDKU1Og7sMXPNm1BYyM1DOJmTZ4YeN/Nwxv+8XJsUA==", + "version": "13.3.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz", + "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==", "requires": { "cliui": "^5.0.0", "find-up": "^3.0.0", @@ -15804,7 +16391,7 @@ "string-width": "^3.0.0", "which-module": "^2.0.0", "y18n": "^4.0.0", - "yargs-parser": "^13.1.1" + "yargs-parser": "^13.1.2" }, "dependencies": { "emoji-regex": { @@ -15812,11 +16399,49 @@ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==" }, + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "requires": { + "locate-path": "^3.0.0" + } + }, "is-fullwidth-code-point": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" }, + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "requires": { + "p-limit": "^2.0.0" + } + }, + "p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==" + }, "string-width": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", @@ -15830,9 +16455,9 @@ } }, "yargs-parser": { - "version": "13.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.1.tgz", - "integrity": "sha512-oVAVsHz6uFrg3XQheFII8ESO2ssAf9luWuAd6Wexsu4F3OtIW0o8IribPXYrD4WC24LWtPrJlGy87y5udK+dxQ==", + "version": "13.1.2", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz", + "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==", "requires": { "camelcase": "^5.0.0", "decamelize": "^1.2.0" diff --git a/package.json b/package.json index 7cc45c6..0e02e53 100644 --- a/package.json +++ b/package.json @@ -3,9 +3,9 @@ "version": "0.1.0", "private": true, "dependencies": { - "@fortawesome/fontawesome-svg-core": "^1.2.27", - "@fortawesome/free-solid-svg-icons": "^5.12.1", - "@fortawesome/react-fontawesome": "^0.1.8", + "@fortawesome/fontawesome-svg-core": "^1.2.28", + "@fortawesome/free-solid-svg-icons": "^5.13.0", + "@fortawesome/react-fontawesome": "^0.1.9", "babel-runtime": "^6.26.0", "bootstrap": "^4.4.1", "classnames": "^2.2.6", @@ -20,33 +20,34 @@ "file-saver": "^2.0.2", "flux": "^3.1.3", "gaugeJS": "^1.3.7", - "handlebars": "^4.7.3", - "jquery": "^3.4.1", - "jszip": "^3.2.2", + "handlebars": "^4.7.6", + "jquery": "^3.5.0", + "jszip": "^3.4.0", "libcimsvg": "git+https://git.rwth-aachen.de/acs/public/cim/pintura-npm-package.git", "lodash": "^4.17.15", - "node-sass": "^4.13.1", + "node-sass": "^4.14.0", + "popper.js": "^1.16.1", "prop-types": "^15.7.2", - "rc-slider": "^9.2.1", - "react": "^16.12.0", - "react-bootstrap": "^1.0.0-beta.16", + "rc-slider": "^9.2.4", + "react": "^16.13.1", + "react-bootstrap": "^1.0.1", "react-contexify": "^4.1.1", "react-d3": "^0.4.0", "react-dnd": "^10.0.2", "react-dnd-html5-backend": "^10.0.2", - "react-dom": "^16.12.0", + "react-dom": "^16.13.1", "react-fullscreenable": "^2.5.1-0", - "react-grid-system": "^6.2.1", + "react-grid-system": "^6.3.1", "react-json-view": "^1.19.1", "react-notification-system": "^0.3.0", - "react-rnd": "^10.1.6", + "react-rnd": "^10.1.9", "react-router": "^5.1.2", "react-router-dom": "^5.1.2", - "react-scripts": "^3.4.0", + "react-scripts": "^3.4.1", "react-svg-pan-zoom": "^3.8.0", - "sass": "^1.25.0", + "sass": "^1.26.5", "superagent": "^5.2.2", - "typescript": "^3.7.5", + "typescript": "^3.8.3", "validator": "^12.2.0" }, "devDependencies": { From 4073e13428d295d9d69d9407609cd229f0dd25dc Mon Sep 17 00:00:00 2001 From: irismarie Date: Tue, 5 May 2020 17:05:39 +0200 Subject: [PATCH 181/391] Export data, see also #216 --- src/scenario/scenario.js | 35 ++++++++++++++------ src/scenario/scenarios.js | 68 +++++++++++++++++++++++++++++++++++---- 2 files changed, 88 insertions(+), 15 deletions(-) diff --git a/src/scenario/scenario.js b/src/scenario/scenario.js index 071c610..7b44f6c 100644 --- a/src/scenario/scenario.js +++ b/src/scenario/scenario.js @@ -40,10 +40,12 @@ import DeleteDialog from '../common/dialogs/delete-dialog'; import EditConfigDialog from "../componentconfig/edit-config"; import EditSignalMapping from "../signal/edit-signal-mapping"; import FileStore from "../file/file-store" +import WidgetStore from "../widget/widget-store"; class Scenario extends React.Component { + static getStores() { - return [ ScenarioStore, ConfigStore, DashboardStore, ICStore, LoginStore, SignalStore, FileStore]; + return [ ScenarioStore, ConfigStore, DashboardStore, ICStore, LoginStore, SignalStore, FileStore, WidgetStore]; } static calculateState(prevState, props) { @@ -96,7 +98,6 @@ class Scenario extends React.Component { } componentDidMount() { - //load selected scenario AppDispatcher.dispatch({ type: 'scenarios/start-load', @@ -108,25 +109,37 @@ class Scenario extends React.Component { AppDispatcher.dispatch({ type: 'configs/start-load', token: this.state.sessionToken, - param: '?scenarioID='+this.state.scenario.id, + param: '?scenarioID='+this.state.scenario.id }); // load dashboards of selected scenario AppDispatcher.dispatch({ type: 'dashboards/start-load', token: this.state.sessionToken, - param: '?scenarioID='+this.state.scenario.id, + param: '?scenarioID='+this.state.scenario.id }); // load ICs to enable that component configs work with them AppDispatcher.dispatch({ type: 'ics/start-load', - token: this.state.sessionToken, + token: this.state.sessionToken }); - - } + componentDidUpdate(prevProps, prevState) { + // load widgets when dashboard id(s) are available + if (this.state.dashboards.length !== prevState.dashboards.length) { + let dashboards = Object.assign([], this.state.dashboards); + dashboards.forEach(dboard => { + AppDispatcher.dispatch({ + type: 'widgets/start-load', + token: this.state.sessionToken, + param: '?dashboardID='+dboard.id + })}) + } + } + + /* ############################################## * Component Configuration modification methods ############################################## */ @@ -323,10 +336,14 @@ class Scenario extends React.Component { // filter properties const dashboard = Object.assign({}, this.state.dashboards[index]); - // TODO get elements recursively + let widgets = WidgetStore.getState().filter(w => w.dashboardID === parseInt(dashboard.id, 10)); + + var jsonObj = dashboard; + jsonObj["widgets"] = widgets; + // show save dialog - const blob = new Blob([JSON.stringify(dashboard, null, 2)], { type: 'application/json' }); + const blob = new Blob([JSON.stringify(jsonObj, null, 2)], { type: 'application/json' }); FileSaver.saveAs(blob, 'dashboard - ' + dashboard.name + '.json'); } diff --git a/src/scenario/scenarios.js b/src/scenario/scenarios.js index 8813190..4b1a5bd 100644 --- a/src/scenario/scenarios.js +++ b/src/scenario/scenarios.js @@ -23,6 +23,9 @@ import FileSaver from 'file-saver'; import AppDispatcher from '../common/app-dispatcher'; import ScenarioStore from './scenario-store'; import LoginStore from '../user/login-store'; +import DashboardStore from '../dashboard/dashboard-store'; +import WidgetStore from "../widget/widget-store"; +import ConfigStore from '../componentconfig/config-store'; import Icon from '../common/icon'; import Table from '../common/table'; @@ -33,17 +36,24 @@ import ImportScenarioDialog from './import-scenario'; import DeleteDialog from '../common/dialogs/delete-dialog'; + class Scenarios extends Component { + static getStores() { - return [ ScenarioStore, LoginStore ]; + return [ ScenarioStore, LoginStore, DashboardStore, WidgetStore, ConfigStore]; } static calculateState() { const scenarios = ScenarioStore.getState(); const sessionToken = LoginStore.getState().token; + let dashboards = DashboardStore.getState(); + let configs = ConfigStore.getState(); + return { scenarios, + dashboards, + configs, sessionToken, newModal: false, @@ -63,7 +73,37 @@ class Scenarios extends Component { }); } - componentDidUpdate() {} + componentDidUpdate(prevProps, prevState) { + // TODO check/change conditions + + // load dashboards when scanario(s) are available + if (this.state.scenarios.length !== prevState.scenarios.length) { + let scenarios = Object.assign([], this.state.scenarios); + scenarios.forEach(scenario => { + AppDispatcher.dispatch({ + type: 'dashboards/start-load', + token: this.state.sessionToken, + param: '?scenarioID='+scenario.id + }); + AppDispatcher.dispatch({ + type: 'scenarios/configs', + token: this.state.sessionToken, + param: '?scenarioID='+scenario.id + }); + }) + } + // load widgets when dashboard id(s) are available + if (this.state.dashboards.length !== prevState.dashboards.length) { + let dashboards = Object.assign([], this.state.dashboards); + dashboards.forEach(dboard => { + AppDispatcher.dispatch({ + type: 'widgets/start-load', + token: this.state.sessionToken, + param: '?dashboardID='+dboard.id + })}) + } + } + closeNewModal(data) { this.setState({ newModal : false }); @@ -150,14 +190,30 @@ class Scenarios extends Component { }; exportScenario(index) { - // filter properties let scenario = Object.assign({}, this.state.scenarios[index]); + let configs = this.state.configs.filter(config => config.scenarioID === scenario.id); + let dashboards = this.state.dashboards.filter(dashb => dashb.scenarioID === scenario.id); + + // create JSON object and add component configs delete scenario.id; + let jsonObj = scenario; + jsonObj["configs"] = configs; - // TODO request missing scenario parameters (Dashboards and component configs) recursively for export + // add Dashboards and Widgets to JSON object + let json_dashboards = dashboards; + json_dashboards.forEach((dboard) => { + let widgets = WidgetStore.getState().filter(w => w.dashboardID === parseInt(dboard.id, 10)); + widgets.forEach((widget) => { + delete widget.dashboardID; + }) + dboard["widgets"] = widgets; + delete dboard.scenarioID; + }); + jsonObj["dashboards"] = json_dashboards; - // show save dialog - const blob = new Blob([JSON.stringify(scenario, null, 2)], { type: 'application/json' }); + + // create JSON string and show save dialog + const blob = new Blob([JSON.stringify(jsonObj, null, 2)], { type: 'application/json' }); FileSaver.saveAs(blob, 'scenario - ' + scenario.name + '.json'); } From 730b3936716a39dbe1520e4588a4998595419c12 Mon Sep 17 00:00:00 2001 From: Sonja Happ Date: Wed, 6 May 2020 11:06:04 +0200 Subject: [PATCH 182/391] small fix for configs dispatch and export function #216 --- src/scenario/scenarios.js | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/scenario/scenarios.js b/src/scenario/scenarios.js index 4b1a5bd..db7555d 100644 --- a/src/scenario/scenarios.js +++ b/src/scenario/scenarios.js @@ -86,7 +86,7 @@ class Scenarios extends Component { param: '?scenarioID='+scenario.id }); AppDispatcher.dispatch({ - type: 'scenarios/configs', + type: 'configs/start-load', token: this.state.sessionToken, param: '?scenarioID='+scenario.id }); @@ -190,7 +190,8 @@ class Scenarios extends Component { }; exportScenario(index) { - let scenario = Object.assign({}, this.state.scenarios[index]); + console.log("exportScenario") + let scenario = this.state.scenarios[index]; let configs = this.state.configs.filter(config => config.scenarioID === scenario.id); let dashboards = this.state.dashboards.filter(dashb => dashb.scenarioID === scenario.id); From 5d8b0e00ed477c9bbf581ed4fe47065d57df0104 Mon Sep 17 00:00:00 2001 From: Laura Fuentes Grau Date: Thu, 7 May 2020 15:19:03 +0200 Subject: [PATCH 183/391] Lamp widget now displayed correctly during/after resizing in layout mode --- src/styles/widgets.css | 9 +++++++++ src/widget/widgets/lamp.js | 2 -- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/src/styles/widgets.css b/src/styles/widgets.css index 33e03f0..5d92aa8 100644 --- a/src/styles/widgets.css +++ b/src/styles/widgets.css @@ -265,6 +265,15 @@ span.signal-unit::after { /* End button widget styling */ +/*Lamp Widget styling*/ + +.lamp-widget { + width: 100%; + height: 100%; +} + +/* End lamp widget styling*/ + .full { width: 100%; height: 100%; diff --git a/src/widget/widgets/lamp.js b/src/widget/widgets/lamp.js index b9a9605..7a89c04 100644 --- a/src/widget/widgets/lamp.js +++ b/src/widget/widgets/lamp.js @@ -66,8 +66,6 @@ class WidgetLamp extends Component { let style = { backgroundColor: color, - width: this.props.widget.width, - height: this.props.widget.height } return ( From f23bdcffb141ccf029a2ba5b6c92537d6536d138 Mon Sep 17 00:00:00 2001 From: Laura Fuentes Grau Date: Thu, 7 May 2020 22:01:15 +0200 Subject: [PATCH 184/391] fix for value widget: more elegant solution for display issues #192 --- src/styles/widgets.css | 2 +- src/widget/widgets/value.js | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/styles/widgets.css b/src/styles/widgets.css index 5d92aa8..3d3455d 100644 --- a/src/styles/widgets.css +++ b/src/styles/widgets.css @@ -249,7 +249,7 @@ span.signal-unit::after { width: 100%; height: 100%; display: flex; - flex: none; + justify-content: center; word-wrap: break-word; } diff --git a/src/widget/widgets/value.js b/src/widget/widgets/value.js index 8951d80..f143cd0 100644 --- a/src/widget/widgets/value.js +++ b/src/widget/widgets/value.js @@ -69,14 +69,14 @@ class WidgetValue extends Component { render() { let value_to_render = Number(this.state.value); - let value_width = this.props.widget.customProperties.textSize*0.55* (this.state.value.length +2); - let unit_width = this.props.widget.customProperties.textSize*2; + let value_width = this.props.widget.customProperties.textSize*(value_to_render < 1000 ? (2):(3)); + let unit_width = this.props.widget.customProperties.textSize*(this.state.unit.length + 0.7); return (
    - {this.props.widget.name} - {Number.isNaN(value_to_render) ? NaN : format('.3s')(value_to_render)} + {this.props.widget.name} + {Number.isNaN(value_to_render) ? NaN : format('.3s')(value_to_render)} {this.props.widget.customProperties.showUnit && - [{this.state.unit}] + [{this.state.unit}] }
    ); From 6acaf007e05f76233afee832a8a0801c09c47dc5 Mon Sep 17 00:00:00 2001 From: Laura Fuentes Grau Date: Fri, 8 May 2020 16:54:38 +0200 Subject: [PATCH 185/391] NumberInput, Button and Slider now keep their value after changing to layout mode or back --- src/dashboard/dashboard.js | 10 ++++++++++ src/widget/widget-factory.js | 5 ++++- src/widget/widgets/button.js | 8 ++++---- src/widget/widgets/input.js | 24 +++++++++++++++++++----- src/widget/widgets/slider.js | 16 +++++++++++++--- 5 files changed, 50 insertions(+), 13 deletions(-) diff --git a/src/dashboard/dashboard.js b/src/dashboard/dashboard.js index 92484b3..8a2767a 100644 --- a/src/dashboard/dashboard.js +++ b/src/dashboard/dashboard.js @@ -262,6 +262,16 @@ class Dashboard extends Component { startEditing(){ + this.state.widgets.forEach( widget => { + if(widget.type === 'Slider' || widget.type === 'NumberInput' || widget.type === 'Button'){ + console.log("we should move in here"); + AppDispatcher.dispatch({ + type: 'widgets/start-edit', + token: this.state.sessionToken, + data: widget + }); + } + }); this.setState({ editing: true }); }; diff --git a/src/widget/widget-factory.js b/src/widget/widget-factory.js index 3673a63..7fc407d 100644 --- a/src/widget/widget-factory.js +++ b/src/widget/widget-factory.js @@ -134,6 +134,7 @@ class WidgetFactory { widget.customProperties.on_value = 1; widget.customProperties.off_value = 0; widget.customProperties.toggle = false; + widget.customProperties.pressed = false; break; case 'NumberInput': widget.minWidth = 150; @@ -142,6 +143,7 @@ class WidgetFactory { widget.height = 50; widget.customProperties.showUnit = false; widget.customProperties.resizeTopBottomLock = true; + widget.customProperties.value = ''; break; case 'Slider': widget.minWidth = 380; @@ -154,7 +156,8 @@ class WidgetFactory { widget.customProperties.rangeUseMinMax = true; widget.customProperties.showUnit = true; widget.customProperties.continous_update = false; - widget.customProperties.default_value = 0; + widget.customProperties.default_value = '0'; + widget.customProperties.value = ''; widget.customProperties.resizeLeftRightLock = false; widget.customProperties.resizeTopBottomLock = true; diff --git a/src/widget/widgets/button.js b/src/widget/widgets/button.js index c400b54..977a8ae 100644 --- a/src/widget/widgets/button.js +++ b/src/widget/widgets/button.js @@ -24,12 +24,12 @@ class WidgetButton extends Component { super(props); this.state = { - pressed: false + pressed: props.widget.customProperties.pressed } } onPress(e) { - console.log("button was pressed!"); + if (!this.props.widget.customProperties.toggle) { this.setState({ pressed: true }); this.valueChanged(this.props.widget.customProperties.on_value); @@ -37,12 +37,12 @@ class WidgetButton extends Component { } onRelease(e) { - console.log("button was released!"); + let nextState = false; if (this.props.widget.customProperties.toggle) { nextState = !this.state.pressed; } - + this.props.widget.customProperties.pressed = nextState; this.setState({ pressed: nextState }); this.valueChanged(nextState ? this.props.widget.customProperties.on_value : this.props.widget.customProperties.off_value); } diff --git a/src/widget/widgets/input.js b/src/widget/widgets/input.js index 59e2290..58273ad 100644 --- a/src/widget/widgets/input.js +++ b/src/widget/widgets/input.js @@ -31,14 +31,27 @@ class WidgetInput extends Component { static getDerivedStateFromProps(props, state){ - if(props.widget.signalIDs.length === 0){ - return null; - } - let returnState = {}; + if(props.widget.customProperties.value !== ''){ + returnState["value"] = props.widget.customProperties.value; + } + + if(props.widget.signalIDs.length === 0){ + if (props.widget.customProperties.default_value && state.value === undefined && props.widget.customProperties.value === '') { + returnState["value"] = props.widget.customProperties.default_value; + } else { // if no default available + if (returnState !== {}){ + return returnState; + } + else{ + return null; + } + } + } + // Update value - if (props.widget.customProperties.default_value && this.state.value === undefined) { + if (props.widget.customProperties.default_value && this.state.value === undefined && props.widget.customProperties.value === '') { returnState["value"] = props.widget.customProperties.default_value; } @@ -59,6 +72,7 @@ class WidgetInput extends Component { valueIsChanging(newValue) { this.setState({ value: newValue }); + this.props.widget.customProperties.value = newValue; } valueChanged(newValue) { diff --git a/src/widget/widgets/slider.js b/src/widget/widgets/slider.js index 4b9bba5..ce76fc6 100644 --- a/src/widget/widgets/slider.js +++ b/src/widget/widgets/slider.js @@ -42,19 +42,28 @@ class WidgetSlider extends Component { static getDerivedStateFromProps(props, state){ let returnState = {}; + if(props.widget.customProperties.value !== ''){ + returnState["value"] = props.widget.customProperties.value; + } + if(props.widget.signalIDs.length === 0){ // set value to default - if (props.widget.customProperties.default_value && state.value === undefined) { + if (props.widget.customProperties.default_value && state.value === undefined && props.widget.customProperties.value === '') { returnState["value"] = props.widget.customProperties.default_value; } else { // if no default available - return null; + if (returnState !== {}){ + return returnState; + } + else{ + return null; + } } } // Update value - if (props.widget.customProperties.default_value && state.value === undefined) { + if (props.widget.customProperties.default_value && state.value === undefined && props.widget.customProperties.value === '') { returnState["value"] = props.widget.customProperties.default_value; } @@ -96,6 +105,7 @@ class WidgetSlider extends Component { } valueIsChanging(newValue) { + this.props.widget.customProperties.value = newValue; if (this.props.widget.continous_update) this.valueChanged(newValue); From ae830bb6d7cdb79723047be06d4b7621b1eb7069 Mon Sep 17 00:00:00 2001 From: Laura Fuentes Grau Date: Tue, 12 May 2020 19:18:27 +0200 Subject: [PATCH 186/391] Label Widget: maxWidth now changes dynamically with text and textSize #12 --- src/widget/edit-widget/edit-widget.js | 18 +++++++++++++++--- src/widget/widget-factory.js | 2 +- 2 files changed, 16 insertions(+), 4 deletions(-) diff --git a/src/widget/edit-widget/edit-widget.js b/src/widget/edit-widget/edit-widget.js index c8517bd..9a9778a 100644 --- a/src/widget/edit-widget/edit-widget.js +++ b/src/widget/edit-widget/edit-widget.js @@ -65,12 +65,24 @@ class EditWidgetDialog extends React.Component { return changeObject; } + getTextWidth(text, fontSize) { + let font = fontSize + "px ariel"; + let canvas = this.getTextWidth.canvas || (this.getTextWidth.canvas = document.createElement("canvas")); + let context = canvas.getContext("2d"); + context.font = font; + let metrics = context.measureText(text); + return metrics.width; + } + setMaxWidth(changeObject){ if(changeObject.type === 'Label'){ - changeObject.customProperties.maxWidth = (changeObject.customProperties.textSize* 0.34) * changeObject.name.length; + changeObject.customProperties.maxWidth = Math.ceil(this.getTextWidth(changeObject.name, changeObject.customProperties.textSize)); } - else if (changeObject.type === 'Value'){ - // changeObject.customProperties.maxWidth = (changeObject.customProperties.textSize* 0.5) * (changeObject.name.length+13); + /*else if (changeObject.type === 'Value'){ + changeObject.customProperties.maxWidth = Math.ceil(this.getTextWidth(changeObject.name, changeObject.customProperties.textSize)); + }*/ + if(this.state.temporal.width > changeObject.customProperties.maxWidth){ + changeObject.width = changeObject.customProperties.maxWidth; } return changeObject; } diff --git a/src/widget/widget-factory.js b/src/widget/widget-factory.js index 7fc407d..b1899c4 100644 --- a/src/widget/widget-factory.js +++ b/src/widget/widget-factory.js @@ -70,7 +70,7 @@ class WidgetFactory { case 'Value': widget.minWidth = 70; widget.minHeight = 20; - widget.width = 150; + widget.width = 110; widget.height = 30; widget.customProperties.textSize = 16; widget.name = 'Value'; From bb08991e9cdf7b037383dfef9bb9aa7b4b134716 Mon Sep 17 00:00:00 2001 From: Laura Fuentes Grau Date: Tue, 12 May 2020 19:27:51 +0200 Subject: [PATCH 187/391] fix for issues while adding a new dashboard --- src/dashboard/new-dashboard.js | 2 +- src/scenario/scenario.js | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/dashboard/new-dashboard.js b/src/dashboard/new-dashboard.js index e71fdbc..6f4b9da 100644 --- a/src/dashboard/new-dashboard.js +++ b/src/dashboard/new-dashboard.js @@ -69,7 +69,7 @@ class NewDashboardDialog extends React.Component { return ( this.onClose(c)} onReset={() => this.resetState()} valid={this.valid}> - + Name this.handleChange(e)} /> diff --git a/src/scenario/scenario.js b/src/scenario/scenario.js index 1cd8706..ba55f34 100644 --- a/src/scenario/scenario.js +++ b/src/scenario/scenario.js @@ -292,12 +292,12 @@ class Scenario extends React.Component { closeNewDashboardModal(data) { this.setState({ newDashboardModal : false }); - let newDashboard = data; - // add default grid value and scenarioID - newDashboard["grid"] = 15; - newDashboard["scenarioID"] = this.state.scenario.id; - if (data) { + let newDashboard = data; + // add default grid value and scenarioID + newDashboard["grid"] = 15; + newDashboard["scenarioID"] = this.state.scenario.id; + AppDispatcher.dispatch({ type: 'dashboards/start-add', data, From 967f17c4f3e6574ba8b1d915eb03080b2e763bf0 Mon Sep 17 00:00:00 2001 From: irismarie Date: Tue, 12 May 2020 20:45:54 +0200 Subject: [PATCH 188/391] Import Dashboard plus (#216): copy by value, delete IDs, restrict number of times loading data --- src/scenario/scenario.js | 45 ++++++++++++++++++++++++++++++--------- src/scenario/scenarios.js | 45 ++++++++++++++++++++------------------- 2 files changed, 58 insertions(+), 32 deletions(-) diff --git a/src/scenario/scenario.js b/src/scenario/scenario.js index 9c7d88a..005b859 100644 --- a/src/scenario/scenario.js +++ b/src/scenario/scenario.js @@ -140,15 +140,32 @@ class Scenario extends React.Component { } componentDidUpdate(prevProps, prevState) { - // load widgets when dashboard id(s) are available - if (this.state.dashboards.length !== prevState.dashboards.length) { - let dashboards = Object.assign([], this.state.dashboards); - dashboards.forEach(dboard => { - AppDispatcher.dispatch({ - type: 'widgets/start-load', - token: this.state.sessionToken, - param: '?dashboardID='+dboard.id - })}) + if (this.state.dashboards.length > prevState.dashboards.length) { + if (this.addWidgets) { // add widgets + // this can only be true after dashboard import, so there is only one dashboard + // (the newest) and this dashboards ID is used + let dashboardID = this.state.dashboards[this.state.dashboards.length - 1].id; + this.widgetsToAdd.forEach((widget) => { + widget.dashboardID = dashboardID; + AppDispatcher.dispatch({ + type: 'widgets/start-add', + data: widget, + token: this.state.sessionToken, + }) + }) + this.addWidgets = false; + this.widgetsToAdd = []; + } + else { // get widgets + let dashboards = Object.assign([], this.state.dashboards); + for (var i = prevState.dashboards.length; i < this.state.dashboards.length; i++) { + AppDispatcher.dispatch({ + type: 'widgets/start-load', + token: this.state.sessionToken, + param: '?dashboardID=' + dashboards[i].id + }) + } + } } } @@ -337,9 +354,17 @@ class Scenario extends React.Component { this.setState({ importDashboardModal: false }); if (data) { + let newDashboard = JSON.parse(JSON.stringify(data)); + newDashboard["scenarioID"] = this.state.scenario.id; + // temporarily store widget data until dashboard is created + if (data.widgets) { + this.addWidgets = true; + this.widgetsToAdd = data.widgets; + } + delete newDashboard.widgets; AppDispatcher.dispatch({ type: 'dashboards/start-add', - data, + data: newDashboard, token: this.state.sessionToken, }); } diff --git a/src/scenario/scenarios.js b/src/scenario/scenarios.js index db7555d..e054344 100644 --- a/src/scenario/scenarios.js +++ b/src/scenario/scenarios.js @@ -74,33 +74,32 @@ class Scenarios extends Component { } componentDidUpdate(prevProps, prevState) { - // TODO check/change conditions - - // load dashboards when scanario(s) are available - if (this.state.scenarios.length !== prevState.scenarios.length) { - let scenarios = Object.assign([], this.state.scenarios); - scenarios.forEach(scenario => { + // load dashboards when length of scanario array has increased + if (this.state.scenarios.length > prevState.scenarios.length) { + let scenarios = Object.assign([], this.state.scenarios); // copying neccessary? + for (var i = prevState.scenarios.length; i < scenarios.length; i++) { AppDispatcher.dispatch({ type: 'dashboards/start-load', token: this.state.sessionToken, - param: '?scenarioID='+scenario.id + param: '?scenarioID='+scenarios[i].id }); AppDispatcher.dispatch({ type: 'configs/start-load', token: this.state.sessionToken, - param: '?scenarioID='+scenario.id + param: '?scenarioID='+scenarios[i].id }); - }) + } } - // load widgets when dashboard id(s) are available - if (this.state.dashboards.length !== prevState.dashboards.length) { + // load widgets when length of dashboard array has increased + if (this.state.dashboards.length > prevState.dashboards.length) { let dashboards = Object.assign([], this.state.dashboards); - dashboards.forEach(dboard => { + for (var j = prevState.dashboards.length; j < dashboards.length; j++) { AppDispatcher.dispatch({ type: 'widgets/start-load', token: this.state.sessionToken, - param: '?dashboardID='+dboard.id - })}) + param: '?dashboardID='+dashboards[j].id + }) + } } } @@ -190,10 +189,11 @@ class Scenarios extends Component { }; exportScenario(index) { - console.log("exportScenario") - let scenario = this.state.scenarios[index]; - let configs = this.state.configs.filter(config => config.scenarioID === scenario.id); - let dashboards = this.state.dashboards.filter(dashb => dashb.scenarioID === scenario.id); + // copy by value by converting to JSON and back + // otherwise, IDs of state objects will be deleted + let scenario = JSON.parse(JSON.stringify(this.state.scenarios[index])); + let configs = JSON.parse(JSON.stringify(this.state.configs.filter(config => config.scenarioID === scenario.id))); + let dashboards = JSON.parse(JSON.stringify(this.state.dashboards.filter(dashb => dashb.scenarioID === scenario.id))); // create JSON object and add component configs delete scenario.id; @@ -201,16 +201,17 @@ class Scenarios extends Component { jsonObj["configs"] = configs; // add Dashboards and Widgets to JSON object - let json_dashboards = dashboards; - json_dashboards.forEach((dboard) => { - let widgets = WidgetStore.getState().filter(w => w.dashboardID === parseInt(dboard.id, 10)); + dashboards.forEach((dboard) => { + let widgets = JSON.parse(JSON.stringify(WidgetStore.getState().filter(w => w.dashboardID === parseInt(dboard.id, 10)))); widgets.forEach((widget) => { delete widget.dashboardID; + delete widget.id; }) dboard["widgets"] = widgets; delete dboard.scenarioID; + delete dboard.id; }); - jsonObj["dashboards"] = json_dashboards; + jsonObj["dashboards"] = dashboards; // create JSON string and show save dialog From 7200ab57f2b73b0072453aa999c58424701fd982 Mon Sep 17 00:00:00 2001 From: Sonja Happ Date: Wed, 13 May 2020 15:18:22 +0200 Subject: [PATCH 189/391] add download function in REST api for file downloads with response type blob --- src/common/api/rest-api.js | 35 +++++++++++++++++++++++------------ 1 file changed, 23 insertions(+), 12 deletions(-) diff --git a/src/common/api/rest-api.js b/src/common/api/rest-api.js index 0ae4b03..53a6a16 100644 --- a/src/common/api/rest-api.js +++ b/src/common/api/rest-api.js @@ -19,7 +19,6 @@ import request from 'superagent/lib/client'; import Promise from 'es6-promise'; import NotificationsDataManager from '../data-managers/notifications-data-manager'; - // TODO: Add this to a central pool of notifications const SERVER_NOT_REACHABLE_NOTIFICATION = { title: 'Server not reachable', @@ -55,23 +54,13 @@ class RestAPI { if (token != null) { req.set('Authorization', "Bearer " + token); - } req.end(function (error, res) { if (res == null || res.status !== 200) { reject(error); } else { - if (res.type ==="application/json"){ - resolve(JSON.parse(res.text)); - } else { - // if received data is not JSON it is a File - //create file name: - let parts = url.split("/"); - console.log("res.text has type: ", typeof res.text); - resolve({data: res.text, type: res.type, id: parts[parts.length-1]}) - } - + resolve(JSON.parse(res.text)); } }); }); @@ -151,6 +140,28 @@ class RestAPI { }); }); } + + + download(url, token, fileID) { + return new Promise(function (resolve, reject) { + let req = request.get(url + "/" + fileID).buffer(true).responseType("blob") + // use blob response type and buffer + if (token != null) { + req.set('Authorization', "Bearer " + token); + } + + req.end(function (error, res) { + if (error !== null || res.status !== 200) { + reject(error); + } else { + // file data is contained in res.body (because of blob response type) + let parts = url.split("/"); + resolve({data: res.body, type: res.type, id: parts[parts.length-1]}) + } + }); + }); + } + } export default new RestAPI(); From bd57f243e394edaffe3582f00c0763612862865e Mon Sep 17 00:00:00 2001 From: Sonja Happ Date: Wed, 13 May 2020 15:20:32 +0200 Subject: [PATCH 190/391] downloaded files are stored in file-store, objectURL is created upon download #147 --- src/file/file-store.js | 46 ++++++++++++++++++++-------------- src/file/files-data-manager.js | 17 +++++++++++++ 2 files changed, 44 insertions(+), 19 deletions(-) diff --git a/src/file/file-store.js b/src/file/file-store.js index 7ab9f9b..cb0d167 100644 --- a/src/file/file-store.js +++ b/src/file/file-store.js @@ -25,21 +25,34 @@ class FileStore extends ArrayStore { saveFile(state, action){ - // save file data file - let fileID = parseInt(action.data.id) - console.log("Received file", action); - for (let f of state){ - if (f.id === fileID){ - f["data"] = action.data.data; - f.type = action.data.type; - console.log("Saving file data to file id", fileID); - } - } + let fileID = parseInt(action.id) + state.forEach((element, index, array) => { + if (element.id === fileID) { + // save file object + array[index]["data"] = new File([action.data.data], element.name, {type: action.data.type}); + // update file type + array[index]["type"] = action.data.type; + if (array[index]["objectURL"] !== ''){ + // free memory of previously generated object URL + URL.revokeObjectURL(array[index]["objectURL"]); + } + // create an object URL for the file + array[index]["objectURL"] = URL.createObjectURL(array[index]["data"]) + } + }); + + // announce change to listeners + this.__emitChange(); + return state } reduce(state, action) { switch (action.type) { + case 'files/start-download': + FilesDataManager.download(action) + return state + case 'files/start-upload': FilesDataManager.upload(action.data, action.token, action.progressCallback, action.finishedCallback, action.objectType, action.objectID); return state; @@ -51,15 +64,10 @@ class FileStore extends ArrayStore { case 'files/upload-error': console.log(action.error); return state; - case 'files/loaded': - if (Array.isArray(action.data)) { - return super.reduce(state, action) - } else { - // in this case a file is contained in the response (no JSON) - // TODO we have to extract and process the file here (=save it somewhere?) - this.saveFile(state, action) - return super.reduce(state, action) - } + + case 'files/downloaded': + // in this case a file is contained in the response (no JSON) + return this.saveFile(state, action) default: return super.reduce(state, action); diff --git a/src/file/files-data-manager.js b/src/file/files-data-manager.js index 5758b62..1a61033 100644 --- a/src/file/files-data-manager.js +++ b/src/file/files-data-manager.js @@ -48,6 +48,23 @@ class FilesDataManager extends RestDataManager { }); }); } + + download(action){ + RestAPI.download(this.makeURL(this.url), action.token, action.data).then(response => { + AppDispatcher.dispatch({ + type: 'files/downloaded', + data: response, + id: action.data, + token: action.token + }); + + }).catch(error => { + AppDispatcher.dispatch({ + type: 'files/load-error', + error: error + }); + }); + } } export default new FilesDataManager(); From 56196a5c98682bfe3c1c92dfc662c6ba8b4cf2eb Mon Sep 17 00:00:00 2001 From: Sonja Happ Date: Wed, 13 May 2020 15:22:21 +0200 Subject: [PATCH 191/391] image widget shows file based on objectURL, file can be selected, new image widget defaults to no file selected #147 --- .../edit-widget/edit-widget-image-control.js | 23 ++++---- src/widget/widget-factory.js | 2 +- src/widget/widgets/image.js | 57 +++++++++++++------ 3 files changed, 53 insertions(+), 29 deletions(-) diff --git a/src/widget/edit-widget/edit-widget-image-control.js b/src/widget/edit-widget/edit-widget-image-control.js index 0f2c9e7..abfd517 100644 --- a/src/widget/edit-widget/edit-widget-image-control.js +++ b/src/widget/edit-widget/edit-widget-image-control.js @@ -21,6 +21,7 @@ import {FormGroup, FormControl, FormLabel, Button, ProgressBar} from 'react-boot import AppDispatcher from '../../common/app-dispatcher'; class EditImageWidgetControl extends React.Component { + constructor(props) { super(props); @@ -43,7 +44,7 @@ class EditImageWidgetControl extends React.Component { for (let key in this.state.fileList) { if (this.state.fileList.hasOwnProperty(key) && this.state.fileList[key] instanceof File) { - formData.append(key, this.state.fileList[key]); + formData.append("file", this.state.fileList[key]); } } @@ -68,7 +69,6 @@ class EditImageWidgetControl extends React.Component { } handleFileChange(e){ - console.log("Changing image: ", this.props.controlId, "to", e.target.value) this.props.handleChange({ target: { id: this.props.controlId, value: e.target.value } }); } @@ -80,7 +80,14 @@ class EditImageWidgetControl extends React.Component { isCustomProperty = false; } - console.log("edit image: files: ", this.props.files, "widget", this.state.widget, "upload file list:", this.state.fileList); + let fileOptions; + if (this.props.files.length > 0){ + fileOptions = this.props.files.map((file, index) => ( + + )) + } else { + fileOptions.set = + } return
    @@ -89,15 +96,7 @@ class EditImageWidgetControl extends React.Component { as="select" placeholder="Select image file" value={isCustomProperty ? this.state.widget[parts[0]][parts[1]] : this.state.widget[this.props.controlId]} - onChange={(e) => this.handleFileChange(e)}> - {this.props.files.length === 0 ? ( - - ) : ( - this.props.files.map((file, index) => ( - - )) - )} - + onChange={(e) => this.handleFileChange(e)}>{fileOptions} diff --git a/src/widget/widget-factory.js b/src/widget/widget-factory.js index 7fc407d..a886957 100644 --- a/src/widget/widget-factory.js +++ b/src/widget/widget-factory.js @@ -122,7 +122,7 @@ class WidgetFactory { widget.width = 200; widget.height = 200; widget.customProperties.lockAspect = true; - widget.customProperties.file = 2; // ID of image file, -1 means non selected + widget.customProperties.file = -1; // ID of image file, -1 means non selected break; case 'Button': widget.minWidth = 100; diff --git a/src/widget/widgets/image.js b/src/widget/widgets/image.js index 2fea54b..393412b 100644 --- a/src/widget/widgets/image.js +++ b/src/widget/widgets/image.js @@ -21,39 +21,64 @@ import AppDispatcher from '../../common/app-dispatcher'; class WidgetImage extends React.Component { + constructor(props) { + super(props); + + this.state = { + file: undefined, + } + } + componentDidMount() { // Query the image referenced by the widget let widgetFile = this.props.widget.customProperties.file; - if (widgetFile !== -1 && !this.props.files.find(file => file.id === widgetFile)) { + if (widgetFile !== -1 && this.state.file === undefined) { AppDispatcher.dispatch({ - type: 'files/start-load', + type: 'files/start-download', data: widgetFile, token: this.props.token }); } } - render() { - const file = this.props.files.find(file => file.id === this.props.widget.customProperties.file); - let fileHasData = false; - let fileData, objectURL; - if (file){ - fileHasData = file.hasOwnProperty("data"); - if (fileHasData){ - //console.log("File data: ", file.data); + componentDidUpdate(prevProps: Readonly

    , prevState: Readonly, snapshot: SS) { - fileData = new Blob([file.data], {type: file.type}); - objectURL = window.URL.createObjectURL(fileData); - console.log("Image created new file", fileData, "and objectID", objectURL) + let file = this.props.files.find(file => file.id === parseInt(this.props.widget.customProperties.file, 10)); + + if(file !== undefined){ + if(this.state.file === undefined || (this.state.file.id !== file.id )){ + + // if file has changed, download new file + if (this.state.file !== undefined && this.state.file.id !== file.id){ + AppDispatcher.dispatch({ + type: 'files/start-download', + data: file.id, + token: this.props.token + }); + } + + // either first time update or file id has changed + this.setState({file:file}) } } - console.log("Image: has data:", fileHasData); + } + + imageError(e){ + console.error("Image ", this.state.file.name, "cannot be displayed."); + } + + render() { + + let objectURL='' + if(this.state.file !== undefined && this.state.file.objectURL !== undefined) { + objectURL = this.state.file.objectURL + } return (

    - {file ? ( - {file.name} e.preventDefault()} /> + {objectURL !== '' ? ( + this.imageError(e)} className="full" alt={this.state.file.name} src={objectURL} onDragStart={e => e.preventDefault()} /> ) : ( No file selected. )} From d76d6a4d23fa51b6c39124a35b114074b48aa352 Mon Sep 17 00:00:00 2001 From: Sonja Happ Date: Wed, 13 May 2020 15:33:07 +0200 Subject: [PATCH 192/391] update dependencies to latest package versions --- package-lock.json | 298 +++++++--------------------------------------- package.json | 16 +-- 2 files changed, 48 insertions(+), 266 deletions(-) diff --git a/package-lock.json b/package-lock.json index a670b70..4b0a113 100644 --- a/package-lock.json +++ b/package-lock.json @@ -2865,9 +2865,9 @@ "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24=" }, "bootstrap": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-4.4.1.tgz", - "integrity": "sha512-tbx5cHubwE6e2ZG7nqM3g/FZ5PQEDMWmMGNrCUBVRPHXTJaH7CBDdsLeu3eCh3B1tzAxTnAbtmrzvWEvT2NNEA==" + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-4.5.0.tgz", + "integrity": "sha512-Z93QoXvodoVslA+PWNdk23Hze4RBYIkpb5h8I2HY2Tu2h7A0LpAgLcyrhrSUyo2/Oxm2l1fRZPs1e5hnxnliXA==" }, "brace-expansion": { "version": "1.1.11", @@ -6081,11 +6081,6 @@ "resolved": "https://registry.npmjs.org/growly/-/growly-1.3.0.tgz", "integrity": "sha1-8QdIy+dq+WS3yWyTxrzCivEgwIE=" }, - "gud": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/gud/-/gud-1.0.0.tgz", - "integrity": "sha512-zGEOVKFM5sVPPrYs7J5/hYEw2Pof8KCyOwyhG8sAF26mCAeUFAcYPu1mwB7hhpIP29zOIBaDqwuHdLp0jvZXjw==" - }, "gzip-size": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-5.1.1.tgz", @@ -8035,9 +8030,9 @@ } }, "jquery": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/jquery/-/jquery-3.5.0.tgz", - "integrity": "sha512-Xb7SVYMvygPxbFMpTFQiHh1J7HClEaThguL15N/Gg37Lri/qKyhRGZYzHRyLH8Stq3Aow0LsHO2O2ci86fCrNQ==" + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/jquery/-/jquery-3.5.1.tgz", + "integrity": "sha512-XwIBPqcMn57FxfT+Go5pzySnm4KWkT1Tv7gjrpT1srtf8Weynl6R273VJ5GjkRb51IzMp5nbaPjJXMWeju2MKg==" }, "js-base64": { "version": "2.5.2", @@ -8767,13 +8762,12 @@ "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==" }, "mini-create-react-context": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/mini-create-react-context/-/mini-create-react-context-0.3.2.tgz", - "integrity": "sha512-2v+OeetEyliMt5VHMXsBhABoJ0/M4RCe7fatd/fBy6SMiKazUSEt3gxxypfnk2SHMkdBYvorHRoQxuGoiwbzAw==", + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/mini-create-react-context/-/mini-create-react-context-0.4.0.tgz", + "integrity": "sha512-b0TytUgFSbgFJGzJqXPKCFCBWigAjpjo+Fl7Vf7ZbKRDptszpppKxXH6DRXEABZ/gcEQczeb0iZ7JvL8e8jjCA==", "requires": { - "@babel/runtime": "^7.4.0", - "gud": "^1.0.0", - "tiny-warning": "^1.0.2" + "@babel/runtime": "^7.5.5", + "tiny-warning": "^1.0.3" } }, "mini-css-extract-plugin": { @@ -9140,9 +9134,9 @@ "integrity": "sha512-wp8zyQVwef2hpZ/dJH7SfSrIPD6YoJz6BDQDpGEkcA0s3LpAQoxBIYmfIq6QAhC1DhwsyCgTaTTcONwX8qzCuQ==" }, "node-sass": { - "version": "4.14.0", - "resolved": "https://registry.npmjs.org/node-sass/-/node-sass-4.14.0.tgz", - "integrity": "sha512-AxqU+DFpk0lEz95sI6jO0hU0Rwyw7BXVEv6o9OItoXLyeygPeaSpiV4rwQb10JiTghHaa0gZeD21sz+OsQluaw==", + "version": "4.14.1", + "resolved": "https://registry.npmjs.org/node-sass/-/node-sass-4.14.1.tgz", + "integrity": "sha512-sjCuOlvGyCJS40R8BscF5vhVlQjNN069NtQ1gSxyK1u9iqvn6tf7O1R4GNowVZfiZUCRt5MmMs1xd+4V/7Yr0g==", "requires": { "async-foreach": "^0.1.3", "chalk": "^1.1.1", @@ -9158,7 +9152,7 @@ "node-gyp": "^3.8.0", "npmlog": "^4.0.0", "request": "^2.88.0", - "sass-graph": "^2.2.4", + "sass-graph": "2.2.5", "stdout-stream": "^1.4.0", "true-case-path": "^1.0.2" }, @@ -11595,9 +11589,9 @@ } }, "react-draggable": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/react-draggable/-/react-draggable-4.3.1.tgz", - "integrity": "sha512-m8QeV+eIi7LhD5mXoLqDzLbokc6Ncwa0T34fF6uJzWSs4vc4fdZI/XGqHYoEn91T8S6qO+BSXslONh7Jz9VPQQ==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/react-draggable/-/react-draggable-4.2.0.tgz", + "integrity": "sha512-5wFq//gEoeTYprnd4ze8GrFc+Rbnx+9RkOMR3vk4EbWxj02U6L6T3yrlKeiw4X5CtjD2ma2+b3WujghcXNRzkw==", "requires": { "classnames": "^2.2.5", "prop-types": "^15.6.0" @@ -11619,9 +11613,9 @@ } }, "react-grid-system": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/react-grid-system/-/react-grid-system-6.3.1.tgz", - "integrity": "sha512-TWJcAdICTseZ16ONTt5LhVYLWJPzpFl4U5LSbF4/mZ/pV7fK7W8lr2bvHOnBWLvYgP3QVcLAxdpeoXj4q2QzmA==", + "version": "6.4.2", + "resolved": "https://registry.npmjs.org/react-grid-system/-/react-grid-system-6.4.2.tgz", + "integrity": "sha512-zQxczLIAUyFfXJOySQlQEptwZj65hxyoEvS+siTupFW76a3AKUhqrhMJ90xKDcSCF9jb9D71zjoPw13Xe1+EKA==", "requires": { "prop-types": "^15.7.2" } @@ -11672,32 +11666,25 @@ } }, "react-rnd": { - "version": "10.1.9", - "resolved": "https://registry.npmjs.org/react-rnd/-/react-rnd-10.1.9.tgz", - "integrity": "sha512-f6rkzEKehGRjKGK7XkdPQoHeUUawZidq3yzWdxeqFluupdbmvuM7Ygnmm6CgF6shAVrvfzxOSl/bejp9pNliUA==", + "version": "10.1.10", + "resolved": "https://registry.npmjs.org/react-rnd/-/react-rnd-10.1.10.tgz", + "integrity": "sha512-xR+CasLBGXJUJQpds2CHocKp/Wze8/VKOf7KaaVDEy2MFzDJKcxPQ0J4QCAGSIaN20cTDmpfTyCzdTfwVGxN8A==", "requires": { "re-resizable": "6.3.2", - "react-draggable": "4.3.1", + "react-draggable": "4.2.0", "tslib": "1.11.1" - }, - "dependencies": { - "tslib": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.11.1.tgz", - "integrity": "sha512-aZW88SY8kQbU7gpV19lN24LtXh/yD4ZZg6qieAJDDg+YBsJcSmLGK9QpnUjAKVG/xefmvJGd1WUmfpT/g6AJGA==" - } } }, "react-router": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/react-router/-/react-router-5.1.2.tgz", - "integrity": "sha512-yjEuMFy1ONK246B+rsa0cUam5OeAQ8pyclRDgpxuSCrAlJ1qN9uZ5IgyKC7gQg0w8OM50NXHEegPh/ks9YuR2A==", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-5.2.0.tgz", + "integrity": "sha512-smz1DUuFHRKdcJC0jobGo8cVbhO3x50tCL4icacOlcwDOEQPq4TMqwx3sY1TP+DvtTgz4nm3thuo7A+BK2U0Dw==", "requires": { "@babel/runtime": "^7.1.2", "history": "^4.9.0", "hoist-non-react-statics": "^3.1.0", "loose-envify": "^1.3.1", - "mini-create-react-context": "^0.3.0", + "mini-create-react-context": "^0.4.0", "path-to-regexp": "^1.7.0", "prop-types": "^15.6.2", "react-is": "^16.6.0", @@ -11706,15 +11693,15 @@ } }, "react-router-dom": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-5.1.2.tgz", - "integrity": "sha512-7BPHAaIwWpZS074UKaw1FjVdZBSVWEk8IuDXdB+OkLb8vd/WRQIpA4ag9WQk61aEfQs47wHyjWUoUGGZxpQXew==", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-5.2.0.tgz", + "integrity": "sha512-gxAmfylo2QUjcwxI63RhQ5G85Qqt4voZpUXSEqCwykV0baaOTQDR1f0PmY8AELqIyVc0NEZUj0Gov5lNGcXgsA==", "requires": { "@babel/runtime": "^7.1.2", "history": "^4.9.0", "loose-envify": "^1.3.1", "prop-types": "^15.6.2", - "react-router": "5.1.2", + "react-router": "5.2.0", "tiny-invariant": "^1.0.2", "tiny-warning": "^1.0.0" } @@ -12438,219 +12425,14 @@ } }, "sass-graph": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/sass-graph/-/sass-graph-2.2.4.tgz", - "integrity": "sha1-E/vWPNHK8JCLn9k0dq1DpR0eC0k=", + "version": "2.2.5", + "resolved": "https://registry.npmjs.org/sass-graph/-/sass-graph-2.2.5.tgz", + "integrity": "sha512-VFWDAHOe6mRuT4mZRd4eKE+d8Uedrk6Xnh7Sh9b4NGufQLQjOrvf/MQoOdx+0s92L89FeyUUNfU597j/3uNpag==", "requires": { "glob": "^7.0.0", "lodash": "^4.0.0", "scss-tokenizer": "^0.2.3", - "yargs": "^7.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" - }, - "camelcase": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", - "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=" - }, - "cliui": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", - "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", - "requires": { - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1", - "wrap-ansi": "^2.0.0" - } - }, - "find-up": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", - "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", - "requires": { - "path-exists": "^2.0.0", - "pinkie-promise": "^2.0.0" - } - }, - "get-caller-file": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz", - "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==" - }, - "invert-kv": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", - "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=" - }, - "is-fullwidth-code-point": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", - "requires": { - "number-is-nan": "^1.0.0" - } - }, - "lcid": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", - "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", - "requires": { - "invert-kv": "^1.0.0" - } - }, - "load-json-file": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", - "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", - "requires": { - "graceful-fs": "^4.1.2", - "parse-json": "^2.2.0", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0", - "strip-bom": "^2.0.0" - } - }, - "os-locale": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", - "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=", - "requires": { - "lcid": "^1.0.0" - } - }, - "parse-json": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", - "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", - "requires": { - "error-ex": "^1.2.0" - } - }, - "path-exists": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", - "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", - "requires": { - "pinkie-promise": "^2.0.0" - } - }, - "path-type": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", - "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", - "requires": { - "graceful-fs": "^4.1.2", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0" - } - }, - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=" - }, - "read-pkg": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", - "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", - "requires": { - "load-json-file": "^1.0.0", - "normalize-package-data": "^2.3.2", - "path-type": "^1.0.0" - } - }, - "read-pkg-up": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", - "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", - "requires": { - "find-up": "^1.0.0", - "read-pkg": "^1.0.0" - } - }, - "require-main-filename": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", - "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=" - }, - "string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", - "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" - } - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "requires": { - "ansi-regex": "^2.0.0" - } - }, - "strip-bom": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", - "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", - "requires": { - "is-utf8": "^0.2.0" - } - }, - "which-module": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-1.0.0.tgz", - "integrity": "sha1-u6Y8qGGUiZT/MHc2CJ47lgJsKk8=" - }, - "wrap-ansi": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", - "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", - "requires": { - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1" - } - }, - "y18n": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz", - "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=" - }, - "yargs": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-7.1.0.tgz", - "integrity": "sha1-a6MY6xaWFyf10oT46gA+jWFU0Mg=", - "requires": { - "camelcase": "^3.0.0", - "cliui": "^3.2.0", - "decamelize": "^1.1.1", - "get-caller-file": "^1.0.1", - "os-locale": "^1.4.0", - "read-pkg-up": "^1.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^1.0.1", - "set-blocking": "^2.0.0", - "string-width": "^1.0.2", - "which-module": "^1.0.0", - "y18n": "^3.2.1", - "yargs-parser": "^5.0.0" - } - }, - "yargs-parser": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-5.0.0.tgz", - "integrity": "sha1-J17PDX/+Bcd+ZOfIbkzZS/DhIoo=", - "requires": { - "camelcase": "^3.0.0" - } - } + "yargs": "^13.3.2" } }, "sass-loader": { @@ -14127,9 +13909,9 @@ "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=" }, "typescript": { - "version": "3.8.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.8.3.tgz", - "integrity": "sha512-MYlEfn5VrLNsgudQTVJeNaQFUAI7DkhnOjdpAp4T+ku1TfQClewlbSuTVHiA+8skNBgaf02TL/kLOvig4y3G8w==" + "version": "3.9.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.9.2.tgz", + "integrity": "sha512-q2ktq4n/uLuNNShyayit+DTobV2ApPEo/6so68JaD5ojvc/6GClBipedB9zNWYxRSAlZXAe405Rlijzl6qDiSw==" }, "ua-parser-js": { "version": "0.7.20", diff --git a/package.json b/package.json index 0e02e53..69cea14 100644 --- a/package.json +++ b/package.json @@ -7,7 +7,7 @@ "@fortawesome/free-solid-svg-icons": "^5.13.0", "@fortawesome/react-fontawesome": "^0.1.9", "babel-runtime": "^6.26.0", - "bootstrap": "^4.4.1", + "bootstrap": "^4.5.0", "classnames": "^2.2.6", "d3-array": "^2.4.0", "d3-axis": "^1.0.12", @@ -21,11 +21,11 @@ "flux": "^3.1.3", "gaugeJS": "^1.3.7", "handlebars": "^4.7.6", - "jquery": "^3.5.0", + "jquery": "^3.5.1", "jszip": "^3.4.0", "libcimsvg": "git+https://git.rwth-aachen.de/acs/public/cim/pintura-npm-package.git", "lodash": "^4.17.15", - "node-sass": "^4.14.0", + "node-sass": "^4.14.1", "popper.js": "^1.16.1", "prop-types": "^15.7.2", "rc-slider": "^9.2.4", @@ -37,17 +37,17 @@ "react-dnd-html5-backend": "^10.0.2", "react-dom": "^16.13.1", "react-fullscreenable": "^2.5.1-0", - "react-grid-system": "^6.3.1", + "react-grid-system": "^6.4.2", "react-json-view": "^1.19.1", "react-notification-system": "^0.3.0", - "react-rnd": "^10.1.9", - "react-router": "^5.1.2", - "react-router-dom": "^5.1.2", + "react-rnd": "^10.1.10", + "react-router": "^5.2.0", + "react-router-dom": "^5.2.0", "react-scripts": "^3.4.1", "react-svg-pan-zoom": "^3.8.0", "sass": "^1.26.5", "superagent": "^5.2.2", - "typescript": "^3.8.3", + "typescript": "^3.9.2", "validator": "^12.2.0" }, "devDependencies": { From e4e9fce2df3bd74447fd99695c649f42977c51ba Mon Sep 17 00:00:00 2001 From: Sonja Happ Date: Wed, 13 May 2020 15:53:20 +0200 Subject: [PATCH 193/391] add TODOs in topology widget #214 --- src/widget/widgets/topology.js | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/src/widget/widgets/topology.js b/src/widget/widgets/topology.js index d9e5d82..65ccfbb 100644 --- a/src/widget/widgets/topology.js +++ b/src/widget/widgets/topology.js @@ -102,17 +102,21 @@ class WidgetTopology extends React.Component { } componentDidUpdate(prevProps: Readonly

    , prevState: Readonly, snapshot: SS): void { - const file = this.props.files.find(file => file._id === this.props.widget.customProperties.file); + const file = this.props.files.find(file => file.id === this.props.widget.customProperties.file); + + // TODO the following code requires revision! + // TODO The model file is no longer stored on the local disc (config.publicPathBase and file.path are not available!). + // TODO It is part of the file store and needs to be taken from there. // Ensure model is requested only once or a different was selected if (prevProps.widget.customProperties.file !== this.props.widget.customProperties.file || (prevState.dashboardState === 'initial' && file)) { - this.setState({'dashboardState': 'loading' }); + this.setState({dashboardState: 'loading' }); if (file) { fetch(new Request('/' + config.publicPathBase + file.path)) .then( response => { if (response.status === 200) { - this.setState({'dashboardState': 'ready' }); + this.setState({dashboardState: 'ready' }); return response.text().then( contents => { if (this.svgElem) { let cimsvgInstance = new cimsvg(this.svgElem.current); @@ -152,7 +156,7 @@ class WidgetTopology extends React.Component { const miniatureProps = { miniaturePosition: "none", } - + const toolbarProps = { toolbarPosition: "none" } From 24e0bf6faf1d3b05bbbdb586baa7f9bed50e7221 Mon Sep 17 00:00:00 2001 From: Sonja Happ Date: Thu, 14 May 2020 12:59:34 +0200 Subject: [PATCH 194/391] Use Blob instead of File data type to store file in file store #147 --- src/file/file-store.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/file/file-store.js b/src/file/file-store.js index cb0d167..c5c87b9 100644 --- a/src/file/file-store.js +++ b/src/file/file-store.js @@ -28,8 +28,8 @@ class FileStore extends ArrayStore { let fileID = parseInt(action.id) state.forEach((element, index, array) => { if (element.id === fileID) { - // save file object - array[index]["data"] = new File([action.data.data], element.name, {type: action.data.type}); + // save blob object + array[index]["data"] = new Blob([action.data.data], {type: action.data.type}); // update file type array[index]["type"] = action.data.type; From 445ab5e95b74f7485a16c86f02ba9c2435feed82 Mon Sep 17 00:00:00 2001 From: Sonja Happ Date: Thu, 14 May 2020 13:08:35 +0200 Subject: [PATCH 195/391] select no file for Topology widget by default (Widget Factory) #217 --- src/widget/widget-factory.js | 1 + 1 file changed, 1 insertion(+) diff --git a/src/widget/widget-factory.js b/src/widget/widget-factory.js index c8f1f6e..4586464 100644 --- a/src/widget/widget-factory.js +++ b/src/widget/widget-factory.js @@ -188,6 +188,7 @@ class WidgetFactory { case 'Topology': widget.width = 600; widget.height = 400; + widget.customProperties.file = -1; // ID of file, -1 means non selected break; default: From 753e06b120e58d399b29d2fda286804f18d506e4 Mon Sep 17 00:00:00 2001 From: Sonja Happ Date: Thu, 14 May 2020 13:08:58 +0200 Subject: [PATCH 196/391] hand over session token to topology widget #217 --- src/widget/widget.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/widget/widget.js b/src/widget/widget.js index 31a7be2..a178a0e 100644 --- a/src/widget/widget.js +++ b/src/widget/widget.js @@ -154,7 +154,7 @@ class Widget extends React.Component { } else if (widget.type === 'HTML') { return } else if (widget.type === 'Topology') { - return + return } return null; From a4f7d314b611797d4a09a9c87ea49f98714ed8db Mon Sep 17 00:00:00 2001 From: Sonja Happ Date: Thu, 14 May 2020 13:09:38 +0200 Subject: [PATCH 197/391] first revision of topology widget (still buggy, see #217) --- src/widget/widgets/topology.js | 111 +++++++++++++++++++-------------- 1 file changed, 65 insertions(+), 46 deletions(-) diff --git a/src/widget/widgets/topology.js b/src/widget/widgets/topology.js index 65ccfbb..a65712f 100644 --- a/src/widget/widgets/topology.js +++ b/src/widget/widgets/topology.js @@ -20,6 +20,7 @@ import {UncontrolledReactSVGPanZoom} from 'react-svg-pan-zoom'; import config from '../../config'; import '../../styles/simple-spinner.css'; import { cimsvg } from 'libcimsvg'; +import AppDispatcher from "../../common/app-dispatcher"; // Do not show Pintura's grid const pinturaGridStyle = { @@ -80,12 +81,27 @@ class WidgetTopology extends React.Component { super(props); this.svgElem = React.createRef(); this.Viewer = null; + this.dashboardState = 'initial' + this.message = '' + let file = this.props.files.find(file => file.id === parseInt(this.props.widget.customProperties.file, 10)); + this.state = { - dashboardState: 'initial' + file: file }; } + static getDerivedStateFromProps(props, state){ + let file = props.files.find(file => file.id === parseInt(props.widget.customProperties.file, 10)); + + if (state.file === undefined || state.file.id !== file.id) { + return{ + file: file + }; + } + return null + } + componentDidMount() { if (this.svgElem) { window.onMouseLeave = function() {}; @@ -95,6 +111,19 @@ class WidgetTopology extends React.Component { window.onMouseDown = function() {}; window.onMouseMove = function() {}; } + + + // Query the file referenced by the widget + let widgetFile = parseInt(this.props.widget.customProperties.file, 10); + console.log("Topology, componenDidMount, file:", widgetFile) + if (widgetFile !== -1 && this.state.file === undefined) { + this.dashboardState = 'loading'; + AppDispatcher.dispatch({ + type: 'files/start-download', + data: widgetFile, + token: this.props.token + }); + } } componentWillUnmount() { @@ -102,53 +131,43 @@ class WidgetTopology extends React.Component { } componentDidUpdate(prevProps: Readonly

    , prevState: Readonly, snapshot: SS): void { - const file = this.props.files.find(file => file.id === this.props.widget.customProperties.file); - // TODO the following code requires revision! - // TODO The model file is no longer stored on the local disc (config.publicPathBase and file.path are not available!). - // TODO It is part of the file store and needs to be taken from there. - // Ensure model is requested only once or a different was selected - if (prevProps.widget.customProperties.file !== this.props.widget.customProperties.file - || (prevState.dashboardState === 'initial' && file)) { + console.log("Topology, componendDidUpdate, prevState:", prevState, "State", this.state) - this.setState({dashboardState: 'loading' }); - if (file) { - fetch(new Request('/' + config.publicPathBase + file.path)) - .then( response => { - if (response.status === 200) { - this.setState({dashboardState: 'ready' }); - return response.text().then( contents => { - if (this.svgElem) { - let cimsvgInstance = new cimsvg(this.svgElem.current); - cimsvg.setCimsvg(cimsvgInstance); - cimsvgInstance.setFileCount(1); - cimsvgInstance.loadFile(contents); - //cimsvgInstance.fit(); - attachComponentEvents(); - } - else { - console.error("The svgElem variable is not initialized before the attempt to create the cimsvg instance."); - } - }); - } else { - throw new Error('Request failed'); - } - }) - .catch(error => { - console.error(error); - this.setState({ - 'dashboardState': 'show_message', - 'message': 'Topology could not be loaded.'}); - }); - } - } else { + if(this.state.file === undefined) { // No file has been selected - if (!this.props.widget.customProperties.file&& this.state.message !== 'Select a topology model first.') { - this.setState({ - 'dashboardState': 'show_message', - 'message': 'Select a topology model first.'}); - } + this.dashboardState = 'show_message'; + this.message = 'Select a topology model first.'; + return; } + + if((prevState.file === undefined && this.state.file !== undefined) + || (this.state.file.id !== prevState.file.id && this.state.file.id !== -1)) { + // if file has changed, download new file + this.dashboardState = 'loading'; + AppDispatcher.dispatch({ + type: 'files/start-download', + data: this.state.file.id, + token: this.props.token + }); + } else if (this.state.file.hasOwnProperty("data") && this.dashboardState === 'loading') { + // data of file has been newly downloaded (did not exist in previous state) + this.dashboardState = 'ready'; + console.log("Topology file data: ", this.state.file.data.text()); + if (this.svgElem) { + let cimsvgInstance = new cimsvg(this.svgElem.current); + cimsvg.setCimsvg(cimsvgInstance); + cimsvgInstance.setFileCount(1); + cimsvgInstance.loadFile(this.state.file.data.text()); + //cimsvgInstance.fit(); + attachComponentEvents(); + } + else { + console.error("The svgElem variable is not initialized before the attempt to create the cimsvg instance."); + } + + } + } render() { @@ -161,11 +180,11 @@ class WidgetTopology extends React.Component { toolbarPosition: "none" } - switch(this.state.dashboardState) { + switch(this.dashboardState) { case 'loading': markup =

    ; break; case 'show_message': - markup =
    { this.state.message }
    ; break; + markup =
    { this.message }
    ; break; default: markup = (
    Date: Thu, 14 May 2020 13:11:48 +0200 Subject: [PATCH 198/391] remove unused import from topology widget #217 --- src/widget/widgets/topology.js | 1 - 1 file changed, 1 deletion(-) diff --git a/src/widget/widgets/topology.js b/src/widget/widgets/topology.js index a65712f..30c55f7 100644 --- a/src/widget/widgets/topology.js +++ b/src/widget/widgets/topology.js @@ -17,7 +17,6 @@ import React from 'react'; import {UncontrolledReactSVGPanZoom} from 'react-svg-pan-zoom'; -import config from '../../config'; import '../../styles/simple-spinner.css'; import { cimsvg } from 'libcimsvg'; import AppDispatcher from "../../common/app-dispatcher"; From 0a29f175de9c0f69a4d5b90f131dd14ce9579a58 Mon Sep 17 00:00:00 2001 From: Laura Fuentes Grau Date: Thu, 14 May 2020 16:31:37 +0200 Subject: [PATCH 199/391] fix for edit widget options: added default option for signal and image select --- src/widget/edit-widget/edit-widget-image-control.js | 12 +++++++----- src/widget/edit-widget/edit-widget-signal-control.js | 3 ++- 2 files changed, 9 insertions(+), 6 deletions(-) diff --git a/src/widget/edit-widget/edit-widget-image-control.js b/src/widget/edit-widget/edit-widget-image-control.js index abfd517..6e8e466 100644 --- a/src/widget/edit-widget/edit-widget-image-control.js +++ b/src/widget/edit-widget/edit-widget-image-control.js @@ -80,13 +80,16 @@ class EditImageWidgetControl extends React.Component { isCustomProperty = false; } - let fileOptions; + let fileOptions = []; if (this.props.files.length > 0){ - fileOptions = this.props.files.map((file, index) => ( + fileOptions.push( + + ) + fileOptions.push(this.props.files.map((file, index) => ( - )) + ))) } else { - fileOptions.set = + fileOptions = } return
    @@ -94,7 +97,6 @@ class EditImageWidgetControl extends React.Component { Image this.handleFileChange(e)}>{fileOptions} diff --git a/src/widget/edit-widget/edit-widget-signal-control.js b/src/widget/edit-widget/edit-widget-signal-control.js index b7d8da6..aaa9c24 100644 --- a/src/widget/edit-widget/edit-widget-signal-control.js +++ b/src/widget/edit-widget/edit-widget-signal-control.js @@ -48,7 +48,8 @@ class EditWidgetSignalControl extends Component { return ( Select signal - this.handleSignalChange(e)}> + this.handleSignalChange(e)}> + { this.props.signals.length === 0 ? ( From 12b1df8e9e967a9ea33d6f73b0461bace8b4389b Mon Sep 17 00:00:00 2001 From: Sonja Happ Date: Thu, 14 May 2020 16:47:11 +0200 Subject: [PATCH 200/391] fixing issue with dashboard state and svgElem reference; fixing issue with data blob parsing #217 --- src/widget/widgets/topology.js | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/src/widget/widgets/topology.js b/src/widget/widgets/topology.js index 30c55f7..b5def70 100644 --- a/src/widget/widgets/topology.js +++ b/src/widget/widgets/topology.js @@ -114,7 +114,6 @@ class WidgetTopology extends React.Component { // Query the file referenced by the widget let widgetFile = parseInt(this.props.widget.customProperties.file, 10); - console.log("Topology, componenDidMount, file:", widgetFile) if (widgetFile !== -1 && this.state.file === undefined) { this.dashboardState = 'loading'; AppDispatcher.dispatch({ @@ -131,8 +130,6 @@ class WidgetTopology extends React.Component { componentDidUpdate(prevProps: Readonly

    , prevState: Readonly, snapshot: SS): void { - console.log("Topology, componendDidUpdate, prevState:", prevState, "State", this.state) - if(this.state.file === undefined) { // No file has been selected this.dashboardState = 'show_message'; @@ -152,19 +149,22 @@ class WidgetTopology extends React.Component { } else if (this.state.file.hasOwnProperty("data") && this.dashboardState === 'loading') { // data of file has been newly downloaded (did not exist in previous state) this.dashboardState = 'ready'; - console.log("Topology file data: ", this.state.file.data.text()); + + } else if(this.state.file.hasOwnProperty("data") && this.dashboardState === 'ready'){ if (this.svgElem) { let cimsvgInstance = new cimsvg(this.svgElem.current); cimsvg.setCimsvg(cimsvgInstance); cimsvgInstance.setFileCount(1); - cimsvgInstance.loadFile(this.state.file.data.text()); - //cimsvgInstance.fit(); - attachComponentEvents(); + // transform data blob into string format + this.state.file.data.text().then(function(content) { + cimsvgInstance.loadFile(content); + cimsvgInstance.fit(); + attachComponentEvents(); + }); } else { console.error("The svgElem variable is not initialized before the attempt to create the cimsvg instance."); } - } } From 3407df6c8330e53a244098acbb7b58c261ace54a Mon Sep 17 00:00:00 2001 From: Sonja Happ Date: Fri, 15 May 2020 12:36:14 +0200 Subject: [PATCH 201/391] use ReactSVGPanZoom #217 --- src/widget/widgets/topology.js | 25 +++++++++++++++++++------ 1 file changed, 19 insertions(+), 6 deletions(-) diff --git a/src/widget/widgets/topology.js b/src/widget/widgets/topology.js index b5def70..784cf76 100644 --- a/src/widget/widgets/topology.js +++ b/src/widget/widgets/topology.js @@ -16,7 +16,7 @@ ******************************************************************************/ import React from 'react'; -import {UncontrolledReactSVGPanZoom} from 'react-svg-pan-zoom'; +import {INITIAL_VALUE, ReactSVGPanZoom, TOOL_NONE} from 'react-svg-pan-zoom'; import '../../styles/simple-spinner.css'; import { cimsvg } from 'libcimsvg'; import AppDispatcher from "../../common/app-dispatcher"; @@ -86,7 +86,9 @@ class WidgetTopology extends React.Component { this.state = { - file: file + file: file, + tool: TOOL_NONE, + value: INITIAL_VALUE, }; } @@ -169,7 +171,17 @@ class WidgetTopology extends React.Component { } + changeTool(nextTool) { + this.setState({tool: nextTool}) + } + + changeValue(nextValue) { + this.setState({value: nextValue}) + } + render() { + + console.log("Topology widget: ", this.props.widget); var markup = null; const miniatureProps = { miniaturePosition: "none", @@ -186,14 +198,15 @@ class WidgetTopology extends React.Component { markup =

    { this.message }
    ; break; default: markup = (
    - this.Viewer = Viewer} style={{outline: "1px solid grey"}} detectAutoPan={false} toolbarProps={toolbarProps} miniatureProps={miniatureProps} - background="white" - tool="pan" + background={"white"} + tool={this.state.tool} onChangeTool={tool => this.changeTool((tool))} + value={this.state.value} onChangeValue={value => this.changeValue(value)} width={this.props.widget.width-2} height={this.props.widget.height-2} > @@ -202,7 +215,7 @@ class WidgetTopology extends React.Component { - +
    ); } return markup; From efb9a0633ed50dcba8b9cfa7e6b478b99da501b0 Mon Sep 17 00:00:00 2001 From: Sonja Happ Date: Fri, 15 May 2020 13:23:34 +0200 Subject: [PATCH 202/391] back to UncontrolledReactSVGPanZoom; fix miniature and toolbar properties; work around for broken mouseOver and mouseLeave #217 --- src/widget/widgets/topology.js | 70 +++++++++++++++++----------------- 1 file changed, 35 insertions(+), 35 deletions(-) diff --git a/src/widget/widgets/topology.js b/src/widget/widgets/topology.js index 784cf76..8aad399 100644 --- a/src/widget/widgets/topology.js +++ b/src/widget/widgets/topology.js @@ -16,7 +16,7 @@ ******************************************************************************/ import React from 'react'; -import {INITIAL_VALUE, ReactSVGPanZoom, TOOL_NONE} from 'react-svg-pan-zoom'; +import {UncontrolledReactSVGPanZoom} from 'react-svg-pan-zoom'; import '../../styles/simple-spinner.css'; import { cimsvg } from 'libcimsvg'; import AppDispatcher from "../../common/app-dispatcher"; @@ -62,11 +62,22 @@ function textSibling(e) { } function show(element) { - element.style.visibility = 'inherit'; + if(element !== undefined) { + element.style.visibility = 'inherit'; + } + else{ + console.log("MouseOver, show, element undefined.") + } } function hide(element) { - element.style.visibility = 'hidden'; + if (element !== undefined) { + element.style.visibility = 'hidden'; + } else { + console.log("MouseLeave, hide, element undefined.") + } + + } // De-initialize functions @@ -86,9 +97,7 @@ class WidgetTopology extends React.Component { this.state = { - file: file, - tool: TOOL_NONE, - value: INITIAL_VALUE, + file: file }; } @@ -113,6 +122,7 @@ class WidgetTopology extends React.Component { window.onMouseMove = function() {}; } + //this.Viewer.fitToViewer(); // Query the file referenced by the widget let widgetFile = parseInt(this.props.widget.customProperties.file, 10); @@ -171,24 +181,15 @@ class WidgetTopology extends React.Component { } - changeTool(nextTool) { - this.setState({tool: nextTool}) - } - - changeValue(nextValue) { - this.setState({value: nextValue}) - } - render() { - console.log("Topology widget: ", this.props.widget); var markup = null; const miniatureProps = { - miniaturePosition: "none", + position: "none", } const toolbarProps = { - toolbarPosition: "none" + position: "right" } switch(this.dashboardState) { @@ -198,24 +199,23 @@ class WidgetTopology extends React.Component { markup =
    { this.message }
    ; break; default: markup = (
    - this.Viewer = Viewer} - style={{outline: "1px solid grey"}} - detectAutoPan={false} - toolbarProps={toolbarProps} - miniatureProps={miniatureProps} - background={"white"} - tool={this.state.tool} onChangeTool={tool => this.changeTool((tool))} - value={this.state.value} onChangeValue={value => this.changeValue(value)} - width={this.props.widget.width-2} height={this.props.widget.height-2} > - - - - - - - - + this.Viewer = Viewer} + style={{outline: "1px solid grey"}} + detectAutoPan={false} + toolbarProps={toolbarProps} + miniatureProps={miniatureProps} + background={"white"} + width={this.props.widget.width-2} + height={this.props.widget.height-2} > + + + + + + + +
    ); } return markup; From 7f6257bc51ab5676601bbe98670e6df3e008e03f Mon Sep 17 00:00:00 2001 From: Sonja Happ Date: Fri, 15 May 2020 16:57:46 +0200 Subject: [PATCH 203/391] open and close IC websockets in dashboard #201 --- src/dashboard/dashboard.js | 56 ++++++++++++++++++++++++++++++++------ src/scenario/scenario.js | 13 --------- 2 files changed, 47 insertions(+), 22 deletions(-) diff --git a/src/dashboard/dashboard.js b/src/dashboard/dashboard.js index 8a2767a..b959bba 100644 --- a/src/dashboard/dashboard.js +++ b/src/dashboard/dashboard.js @@ -32,6 +32,8 @@ import DashboardStore from './dashboard-store'; import SignalStore from '../signal/signal-store' import FileStore from '../file/file-store'; import WidgetStore from '../widget/widget-store'; +import ICStore from '../ic/ic-store' +import ConfigStore from '../componentconfig/config-store' import AppDispatcher from '../common/app-dispatcher'; import 'react-contexify/dist/ReactContexify.min.css'; @@ -40,7 +42,7 @@ class Dashboard extends Component { static lastWidgetKey = 0; static getStores() { - return [ DashboardStore, FileStore, LoginStore, WidgetStore, SignalStore ]; + return [ DashboardStore, FileStore, LoginStore, WidgetStore, SignalStore, ConfigStore, ICStore]; } static calculateState(prevState, props) { @@ -86,14 +88,35 @@ class Dashboard extends Component { } } - // TODO create list of infrastructure components in use + let configs = [] + if (dashboard !== null) { + // obtain all component configurations of the scenario to which the dashboard belongs + configs = ConfigStore.getState().filter(config => config.scenarioID === dashboard.scenarioID); + } + + // create list of infrastructure components in use + let ics = [] + if (configs.length > 0){ + ics = ICStore.getState().filter(ic => { + let ICused = false; + for (let config of configs){ + if (ic.id === config.icID){ + ICused = true; + break; + } + } + return ICused; + }); + } return { dashboard, widgets, signals, - sessionToken: sessionToken, - files: files, + sessionToken, + files, + configs, + ics, editing: prevState.editing || false, paused: prevState.paused || false, @@ -117,7 +140,6 @@ class Dashboard extends Component { return widgetKey; } -//!!!won't work anymore componentDidMount() { // load widgets of dashboard @@ -127,9 +149,25 @@ class Dashboard extends Component { param: '?dashboardID=' + this.state.dashboard.id }); - // TODO open websockets in componentDidMount + // open web sockets if ICs are already known + if(this.state.ics.length > 0){ + console.log("Starting to open IC websockets:", this.state.ics); + AppDispatcher.dispatch({ + type: 'ics/open-sockets', + data: this.state.ics + }); + } else { + console.log("ICs unknown in componentDidMount", this.state.dashboard) + } - // TODO close websockets in componentWillUnmount + } + + componentWillUnmount() { + // close web sockets of ICs + console.log("Starting to close all web sockets"); + AppDispatcher.dispatch({ + type: 'ics/close-sockets', + }); } handleKeydown(e) { @@ -317,14 +355,14 @@ class Dashboard extends Component { } }) }) - + temp.forEach( widget => { AppDispatcher.dispatch({ type: 'widgets/start-remove', data: widget, token: this.state.sessionToken }); - }); + }); AppDispatcher.dispatch({ type: 'widgets/start-load', token: this.state.sessionToken, diff --git a/src/scenario/scenario.js b/src/scenario/scenario.js index ba55f34..808307e 100644 --- a/src/scenario/scenario.js +++ b/src/scenario/scenario.js @@ -68,18 +68,6 @@ class Scenario extends React.Component { let signals = SignalStore.getState(); let files = FileStore.getState(); - // apply filter to contain only ICs that are used by configs - let icsUsed = ICStore.getState().filter(ic => { - let ICused = false; - for (let config of configs){ - if (ic.id === config.icID){ - ICused = true; - break; - } - } - return ICused; - }); - return { scenario, @@ -89,7 +77,6 @@ class Scenario extends React.Component { signals, files, ics: ICStore.getState(), - icsUsed, deleteConfigModal: false, importConfigModal: false, From c1b513cd3401b17386e2650097cd88455fd88863 Mon Sep 17 00:00:00 2001 From: Sonja Happ Date: Tue, 19 May 2020 16:27:21 +0200 Subject: [PATCH 204/391] improve calculate state --- src/dashboard/dashboard.js | 31 ++++++++++++++++++++----------- 1 file changed, 20 insertions(+), 11 deletions(-) diff --git a/src/dashboard/dashboard.js b/src/dashboard/dashboard.js index b959bba..11156da 100644 --- a/src/dashboard/dashboard.js +++ b/src/dashboard/dashboard.js @@ -61,7 +61,7 @@ class Dashboard extends Component { }); } - // obtain all widgets of a dashboard + // obtain all widgets of this dashboard let widgets = WidgetStore.getState().filter(w => w.dashboardID === parseInt(props.match.params.dashboard, 10)); // compute max y coordinate @@ -73,10 +73,25 @@ class Dashboard extends Component { return thisWidgetHeight > maxHeightSoFar? thisWidgetHeight : maxHeightSoFar; }, 0); - // TODO filter signals to the ones belonging to the scenario at hand! - let signals = SignalStore.getState(); + // filter component configurations to the ones that belong to this scenario + let configs = [] + if (dashboard !== null) { + configs = ConfigStore.getState().filter(config => config.scenarioID === dashboard.scenarioID); + } - // get files of all widgets + // filter signals to the ones belonging to the scenario at hand + let signals = [] + let allSignals = SignalStore.getState(); + let sig, con; + for (sig of allSignals){ + for (con of configs){ + if (sig.configID === con.id){ + signals.push(sig); + } + } + } + + // filter files to the ones associated with a widget of this dashboard let allFiles = FileStore.getState(); let files = []; let file, widget; @@ -88,13 +103,7 @@ class Dashboard extends Component { } } - let configs = [] - if (dashboard !== null) { - // obtain all component configurations of the scenario to which the dashboard belongs - configs = ConfigStore.getState().filter(config => config.scenarioID === dashboard.scenarioID); - } - - // create list of infrastructure components in use + // filter ICs to the ones used by this scenario let ics = [] if (configs.length > 0){ ics = ICStore.getState().filter(ic => { From a7ca4d45140522be7f16307814f8cacce62e62e0 Mon Sep 17 00:00:00 2001 From: Sonja Happ Date: Tue, 19 May 2020 16:29:50 +0200 Subject: [PATCH 205/391] display signals with PlotTable widget #218 --- src/widget/widget-plot/plot.js | 17 +++-- src/widget/widget.js | 14 ++-- src/widget/widgets/plot-table.js | 126 +++++++++++-------------------- 3 files changed, 61 insertions(+), 96 deletions(-) diff --git a/src/widget/widget-plot/plot.js b/src/widget/widget-plot/plot.js index 444d540..0b3d4a8 100644 --- a/src/widget/widget-plot/plot.js +++ b/src/widget/widget-plot/plot.js @@ -80,7 +80,7 @@ class Plot extends React.Component { } // check if data is invalid - if (props.data == null || props.data.length === 0 || props.data[0].length === 0) { + if (props.data == null || props.data.length === 0) { // create empty plot axes let xScale; let yScale; @@ -116,11 +116,14 @@ class Plot extends React.Component { // only show data in requested time let data = props.data; + let icDataset = data.find(function(element) { + return element !== undefined; + }) - const firstTimestamp = data[0][data[0].length - 1].x - (props.time + 1) * 1000; - if (data[0][0].x < firstTimestamp) { + const firstTimestamp = icDataset[icDataset.length - 1].x - (props.time + 1) * 1000; + if (icDataset[0].x < firstTimestamp) { // only show data in range (+100 ms) - const index = data[0].findIndex(value => value.x >= firstTimestamp - 100); + const index = icDataset.findIndex(value => value.x >= firstTimestamp - 100); data = data.map(values => values.slice(index)); } @@ -177,7 +180,11 @@ class Plot extends React.Component { if (this.props.yUseMinMax) { yRange = [this.props.yMin, this.props.yMax]; } else if (this.props.data.length > 0) { - yRange = [this.props.data[0][0].y, this.props.data[0][0].y]; + let icDataset = this.props.data.find(function(element) { + return element !== undefined; + }) + + yRange = [icDataset[0].y, icDataset[0].y]; this.props.data.forEach(values => { const range = extent(values, p => p.y); diff --git a/src/widget/widget.js b/src/widget/widget.js index a178a0e..743241b 100644 --- a/src/widget/widget.js +++ b/src/widget/widget.js @@ -69,14 +69,12 @@ class Widget extends React.Component { // TODO make sure that the signals are only the signals that belong to the scenario at hand let signals = SignalStore.getState(); let icIDs = []; - if ( props.data.signalIDs.length > 0){ - for (let i in props.data.signalIDs.length){ - let signal = signals.find(s => s.id === props.data.signalIDs[i]); - let config = configs.find(m => m.id === signal.configID); - icIDs[i] = config.icID; - } - } + for (let id of props.data.signalIDs){ + let signal = signals.find(s => s.id === id); + let config = configs.find(m => m.id === signal.configID); + icIDs[signal.id] = config.icID; + } return { icData: icData, @@ -138,7 +136,7 @@ class Widget extends React.Component { } else if (widget.type === 'Label') { return } else if (widget.type === 'PlotTable') { - return this.props.onWidgetStatusChange(w, this.props.index)} paused={this.props.paused} /> + return this.props.onWidgetStatusChange(w, this.props.index)} paused={this.props.paused} /> } else if (widget.type === 'Image') { return } else if (widget.type === 'Button') { diff --git a/src/widget/widgets/plot-table.js b/src/widget/widgets/plot-table.js index e16b7b1..b4b6f83 100644 --- a/src/widget/widgets/plot-table.js +++ b/src/widget/widgets/plot-table.js @@ -27,124 +27,85 @@ class WidgetPlotTable extends Component { super(props); this.state = { - preselectedSignals: [], signals: [] }; } componentDidUpdate(prevProps: Readonly

    , prevState: Readonly, snapshot: SS): void { - if (this.props.config == null) { - return; - } - - // Update internal selected signals state with props (different array objects) - if (prevProps.widget.customProperties.signals !== this.props.widget.customProperties.signals) { - this.setState( {signals: this.props.widget.customProperties.signals}); - } - - // Identify if there was a change in the preselected signals - if (JSON.stringify(prevProps.widget.customProperties.preselectedSignals) !== JSON.stringify(this.props.widget.customProperties.preselectedSignals) - || this.state.preselectedSignals.length === 0) { - // Update the currently selected signals by intersecting with the preselected signalsWidget - // Do the same with the plot values - var intersection = this.computeIntersection(this.props.widget.customProperties.preselectedSignals, this.props.widget.customProperties.signals); - this.setState({ signals: intersection }); - - this.updatePreselectedSignalsState(this.props); - } - } - - // Perform the intersection of the lists, alternatively could be done with Sets ensuring unique values - computeIntersection(preselectedSignals, selectedSignals) { - return preselectedSignals.filter( s => selectedSignals.includes(s)); - } - - updatePreselectedSignalsState(props) { - // Create checkboxes using the signal indices from component config - if(props.config.outputMapping){ - const preselectedSignals = props.config.outputMapping.reduce( - // Loop through component config signals - (accum, signal, signal_index) => { - // Append them if they belong to the current selected type - if (props.widget.customProperties.preselectedSignals.indexOf(signal_index) > -1) { - accum.push( - { - index: signal_index, - name: signal.name, - type: signal.type - } - ) + // Identify if there was a change in the selected signals + if (JSON.stringify(prevProps.widget.signalIDs) !== JSON.stringify(this.props.widget.signalIDs) + || this.state.signals.length === 0) { + // Update the currently selected signals + let intersection = [] + let signalID, sig; + for (signalID of this.props.widget.signalIDs) { + for (sig of this.props.signals) { + if (signalID === sig.id) { + intersection.push(sig); } - return accum; - }, []); - - this.setState({ preselectedSignals }); + } } + + this.setState({signals: intersection}); + } } updateSignalSelection(signal_index, checked) { // Update the selected signals and propagate to parent component var new_widget = Object.assign({}, this.props.widget, { - signals: checked? this.state.signals.concat(signal_index) : this.state.signals.filter( (idx) => idx !== signal_index ) + signals: checked ? this.state.signals.concat(signal_index) : this.state.signals.filter((idx) => idx !== signal_index) }); this.props.onWidgetChange(new_widget); } render() { + let checkBoxes = []; let icData = []; let legendSignals = []; - // Data passed to plot - if (this.props.config) { + let showLegend = false; - const ic = this.props.config.icID; + if (this.state.signals.length > 0) { - if (this.props.data[ic] != null && this.props.data[ic].output != null && this.props.data[ic].output.values != null) { - icData = this.props.data[ic].output.values.filter((values, index) => ( - this.props.widget.customProperties.signals.findIndex(value => value === index) !== -1 - )); - } + showLegend = true; + + // get data of preselected signals + let signal; + for (signal of this.state.signals) { + + // determine ID of infrastructure component related to signal (via config) + let icID = this.props.icIDs[signal.id] + + if (this.props.data[icID] != null && this.props.data[icID].output != null && this.props.data[icID].output.values != null) { + if (this.props.data[icID].output.values[signal.index] !== undefined){ + icData.push(this.props.data[icID].output.values[signal.index]); + } + } + } - if (this.state.preselectedSignals && this.state.preselectedSignals.length > 0) { // Create checkboxes using the signal indices from component config - checkBoxes = this.state.preselectedSignals.map( (signal) => { - var checked = this.state.signals.indexOf(signal.index) > -1; - var chkBxClasses = classNames({ + checkBoxes = this.state.signals.map((signal) => { + let checked = this.state.signals.indexOf(signal.index) > -1; + let chkBxClasses = classNames({ 'btn': true, 'btn-default': true, 'active': checked }); - return this.updateSignalSelection(signal.index, e.target.checked) } > { signal.name } + return this.updateSignalSelection(signal.index, e.target.checked)}> {signal.name} }); } - // Prepare an array with the signals to show in the legend - legendSignals = this.state.preselectedSignals.reduce( (accum, signal, i) => { - if (this.state.signals.includes(signal.index)) { - accum.push({ - index: signal.index, - name: signal.name, - type: signal.type - }); - } - return accum; - }, []);} - - let showLegend = false; - if(legendSignals !== []){ - showLegend = true; - } - return (

    - { checkBoxes.length > 0 ? ( + {checkBoxes.length > 0 ? ( - { checkBoxes } + {checkBoxes} - ) : ( No signal has been pre-selected. ) + ) : (No signal has been pre-selected.) }
    @@ -162,13 +123,12 @@ class WidgetPlotTable extends Component { />
    - {showLegend? ( - ) : (
    ) + {showLegend ? ( + ) : (
    ) }
    ); } } - export default WidgetPlotTable; From e396d722a17f3a90d690c2b14a62682531f53145 Mon Sep 17 00:00:00 2001 From: Sonja Happ Date: Tue, 19 May 2020 16:35:05 +0200 Subject: [PATCH 206/391] remove an unused variable to make CI happy --- src/widget/widgets/plot-table.js | 1 - 1 file changed, 1 deletion(-) diff --git a/src/widget/widgets/plot-table.js b/src/widget/widgets/plot-table.js index b4b6f83..b776e4b 100644 --- a/src/widget/widgets/plot-table.js +++ b/src/widget/widgets/plot-table.js @@ -62,7 +62,6 @@ class WidgetPlotTable extends Component { let checkBoxes = []; let icData = []; - let legendSignals = []; let showLegend = false; if (this.state.signals.length > 0) { From 882febc12c91e9062832444706dbe2599fadb6e2 Mon Sep 17 00:00:00 2001 From: Laura Fuentes Grau Date: Tue, 19 May 2020 17:47:45 +0200 Subject: [PATCH 207/391] fix for image widget: first selected image is displayed immediately --- src/widget/widgets/image.js | 22 +++++++++------------- 1 file changed, 9 insertions(+), 13 deletions(-) diff --git a/src/widget/widgets/image.js b/src/widget/widgets/image.js index 393412b..1f08fa3 100644 --- a/src/widget/widgets/image.js +++ b/src/widget/widgets/image.js @@ -45,20 +45,16 @@ class WidgetImage extends React.Component { let file = this.props.files.find(file => file.id === parseInt(this.props.widget.customProperties.file, 10)); - if(file !== undefined){ - if(this.state.file === undefined || (this.state.file.id !== file.id )){ + if (file !== undefined) { + if (this.state.file === undefined || (this.state.file.id !== file.id)) { - // if file has changed, download new file - if (this.state.file !== undefined && this.state.file.id !== file.id){ - AppDispatcher.dispatch({ - type: 'files/start-download', - data: file.id, - token: this.props.token - }); - } - - // either first time update or file id has changed - this.setState({file:file}) + AppDispatcher.dispatch({ + type: 'files/start-download', + data: file.id, + token: this.props.token + }); + + this.setState({ file: file }) } } From fdb6a3105aff246c8f739ddf4aae88f6eeb4c5d2 Mon Sep 17 00:00:00 2001 From: irismarie Date: Wed, 20 May 2020 10:08:51 +0200 Subject: [PATCH 208/391] add scenario data after importing from file --- src/scenario/scenarios.js | 154 +++++++++++++++++++++++++++++--------- 1 file changed, 119 insertions(+), 35 deletions(-) diff --git a/src/scenario/scenarios.js b/src/scenario/scenarios.js index e054344..c00d8f6 100644 --- a/src/scenario/scenarios.js +++ b/src/scenario/scenarios.js @@ -40,7 +40,7 @@ import DeleteDialog from '../common/dialogs/delete-dialog'; class Scenarios extends Component { static getStores() { - return [ ScenarioStore, LoginStore, DashboardStore, WidgetStore, ConfigStore]; + return [ScenarioStore, LoginStore, DashboardStore, WidgetStore, ConfigStore]; } static calculateState() { @@ -74,46 +74,104 @@ class Scenarios extends Component { } componentDidUpdate(prevProps, prevState) { - // load dashboards when length of scanario array has increased + // when length of scenarios array has increased, either add data (after import) + // or load data (after export) if (this.state.scenarios.length > prevState.scenarios.length) { - let scenarios = Object.assign([], this.state.scenarios); // copying neccessary? - for (var i = prevState.scenarios.length; i < scenarios.length; i++) { - AppDispatcher.dispatch({ - type: 'dashboards/start-load', - token: this.state.sessionToken, - param: '?scenarioID='+scenarios[i].id - }); - AppDispatcher.dispatch({ - type: 'configs/start-load', - token: this.state.sessionToken, - param: '?scenarioID='+scenarios[i].id - }); + if (this.addDashboards || this.addConfigs) { + let scenarioID = this.state.scenarios[this.state.scenarios.length - 1].id; + + if (this.addDashboards) { + this.dashboardsToAdd.forEach((dashboard) => { + if (dashboard.widgets) { + this.addWidgets = true; + } + dashboard.scenarioID = scenarioID; + AppDispatcher.dispatch({ + type: 'dashboards/start-add', + token: this.state.sessionToken, + data: dashboard + }); + }) + this.addDashboards = false; + } + + if (this.addConfigs) { + this.configsToAdd.forEach((config) => { + config.scenarioID = scenarioID; + AppDispatcher.dispatch({ + type: 'configs/start-add', + token: this.state.sessionToken, + data: config + }) + }) + delete this.configsToAdd; + this.addConfigs = false; + } + + } + else { + let scenarios = Object.assign([], this.state.scenarios); // copying neccessary? + for (var i = prevState.scenarios.length; i < scenarios.length; i++) { + AppDispatcher.dispatch({ + type: 'dashboards/start-load', + token: this.state.sessionToken, + param: '?scenarioID=' + scenarios[i].id + }); + AppDispatcher.dispatch({ + type: 'configs/start-load', + token: this.state.sessionToken, + param: '?scenarioID=' + scenarios[i].id + }); + } } } - // load widgets when length of dashboard array has increased + + // when length of dashboards array has increased, either add widgets (after import) + // or load widgets (after export) if (this.state.dashboards.length > prevState.dashboards.length) { - let dashboards = Object.assign([], this.state.dashboards); - for (var j = prevState.dashboards.length; j < dashboards.length; j++) { - AppDispatcher.dispatch({ - type: 'widgets/start-load', - token: this.state.sessionToken, - param: '?dashboardID='+dashboards[j].id - }) + if (this.addWidgets && !this.addDashboards) { // add widget data + let dashboards = Object.assign([], this.state.dashboards); + for (var j = prevState.dashboards.length; j < dashboards.length; j++) { + let dboard = dashboards[j]; + let dboardID = dboard.id; + let dashboard = this.dashboardsToAdd.shift(); + if (dashboard.name !== dboard.name) { + console.log("Cannot add widgets, dashboard was not added as expected!"); + this.addWidgets = false; + return; + } + dashboard.widgets.forEach((widget) => { + widget.dashboardID = dboardID; + AppDispatcher.dispatch({ + type: 'widgets/start-add', + token: this.state.sessionToken, + data: widget + }); + }); + } + + if (this.dashboardsToAdd.length === 0) { + delete this.dashboardsToAdd; + this.addWidgets = false; + } } + else { // load widget data + let dashboards = Object.assign([], this.state.dashboards); + for (var j = prevState.dashboards.length; j < dashboards.length; j++) { + AppDispatcher.dispatch({ + type: 'widgets/start-load', + token: this.state.sessionToken, + param: '?dashboardID=' + dashboards[j].id + }) + } + } + } } closeNewModal(data) { - this.setState({ newModal : false }); - - if (data) { - AppDispatcher.dispatch({ - type: 'scenarios/start-add', - data, - token: this.state.sessionToken - }); - } + this.setState({ newModal: false }); } showDeleteModal(id) { @@ -136,6 +194,16 @@ class Scenarios extends Component { return; } + this.state.dashboards.forEach((dashboard) => { + if (dashboard.id === this.state.modalScenario.id) { + AppDispatcher.dispatch({ + type: 'dashboards/start-remove', + data: dashboard, + token: this.state.sessionToken + }) + } + }); + AppDispatcher.dispatch({ type: 'scenarios/start-remove', data: this.state.modalScenario, @@ -157,7 +225,7 @@ class Scenarios extends Component { } closeEditModal(data) { - this.setState({ editModal : false }); + this.setState({ editModal: false }); if (data != null) { AppDispatcher.dispatch({ @@ -172,10 +240,21 @@ class Scenarios extends Component { this.setState({ importModal: false }); if (data) { + let newScenario = JSON.parse(JSON.stringify(data)); + // temporarily store dashboard data until scenario is created + if (data.dashboards) { + this.addDashboards = true; + this.dashboardsToAdd = data.dashboards; + } + if (data.configs) { + this.addConfigs = true; + this.configsToAdd = data.configs; + } + delete newScenario.dashboards; AppDispatcher.dispatch({ type: 'scenarios/start-add', - data, - token: this.state.sessionToken + data: newScenario, + token: this.state.sessionToken, }); } } @@ -198,10 +277,15 @@ class Scenarios extends Component { // create JSON object and add component configs delete scenario.id; let jsonObj = scenario; + + configs.forEach((config) => { + delete config.id; + delete config.scenarioID; + }) jsonObj["configs"] = configs; // add Dashboards and Widgets to JSON object - dashboards.forEach((dboard) => { + dashboards.forEach((dboard) => { let widgets = JSON.parse(JSON.stringify(WidgetStore.getState().filter(w => w.dashboardID === parseInt(dboard.id, 10)))); widgets.forEach((widget) => { delete widget.dashboardID; From 06b091a73b71eba2d88cd0ba2e0b53b778771234 Mon Sep 17 00:00:00 2001 From: irismarie Date: Wed, 20 May 2020 10:10:11 +0200 Subject: [PATCH 209/391] add more values to state --- src/scenario/import-scenario.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/scenario/import-scenario.js b/src/scenario/import-scenario.js index 1e454eb..90c33be 100644 --- a/src/scenario/import-scenario.js +++ b/src/scenario/import-scenario.js @@ -32,6 +32,7 @@ class ImportScenarioDialog extends React.Component { name: '', running: '', configs: [], + dashboards: [], startParameters: {} }; } @@ -94,7 +95,7 @@ class ImportScenarioDialog extends React.Component { self.imported = true; self.valid = true; - self.setState({ name: scenario.name, configs: scenario.configs, startParameters: scenario.startParameters, running: scenario.running }); + self.setState({ name: scenario.name, configs: scenario.configs, dashboards: scenario.dashboards, startParameters: scenario.startParameters, running: scenario.running }); }; reader.readAsText(file); From b803a17a664fd34a1d5bfe0c15dd6711bd37661f Mon Sep 17 00:00:00 2001 From: Sonja Happ Date: Wed, 20 May 2020 13:29:17 +0200 Subject: [PATCH 210/391] work on plot table widget, disable checkboxes as they duplicate edit menu, enable to display input signals, improve plot legend #218 --- src/widget/widget-plot/plot-legend.js | 2 +- src/widget/widgets/plot-table.js | 72 ++++++++++++++------------- 2 files changed, 38 insertions(+), 36 deletions(-) diff --git a/src/widget/widget-plot/plot-legend.js b/src/widget/widget-plot/plot-legend.js index 22aba64..f3f4cd6 100644 --- a/src/widget/widget-plot/plot-legend.js +++ b/src/widget/widget-plot/plot-legend.js @@ -26,7 +26,7 @@ class PlotLegend extends React.Component { return
      {this.props.signals.map(signal => -
    • +
    • {signal.name} {signal.unit}
    • diff --git a/src/widget/widgets/plot-table.js b/src/widget/widgets/plot-table.js index b776e4b..67130a4 100644 --- a/src/widget/widgets/plot-table.js +++ b/src/widget/widgets/plot-table.js @@ -16,44 +16,36 @@ ******************************************************************************/ import React, { Component } from 'react'; -import classNames from 'classnames'; -import { FormGroup, FormCheck } from 'react-bootstrap'; - +import { FormGroup } from 'react-bootstrap'; import Plot from '../widget-plot/plot'; import PlotLegend from '../widget-plot/plot-legend'; class WidgetPlotTable extends Component { constructor(props) { super(props); - this.state = { signals: [] }; } - componentDidUpdate(prevProps: Readonly

      , prevState: Readonly, snapshot: SS): void { - // Identify if there was a change in the selected signals - if (JSON.stringify(prevProps.widget.signalIDs) !== JSON.stringify(this.props.widget.signalIDs) - || this.state.signals.length === 0) { - // Update the currently selected signals - let intersection = [] - let signalID, sig; - for (signalID of this.props.widget.signalIDs) { - for (sig of this.props.signals) { - if (signalID === sig.id) { - intersection.push(sig); - } + static getDerivedStateFromProps(props, state){ + let intersection = [] + let signalID, sig; + for (signalID of props.widget.signalIDs) { + for (sig of props.signals) { + if (signalID === sig.id) { + intersection.push(sig); } } - - this.setState({signals: intersection}); } + + return {signals: intersection} } - updateSignalSelection(signal_index, checked) { + updateSignalSelection(signal, checked) { // Update the selected signals and propagate to parent component var new_widget = Object.assign({}, this.props.widget, { - signals: checked ? this.state.signals.concat(signal_index) : this.state.signals.filter((idx) => idx !== signal_index) + checkedSignals: checked ? this.state.signals.concat(signal) : this.state.signals.filter((idx) => idx !== signal) }); this.props.onWidgetChange(new_widget); } @@ -63,7 +55,6 @@ class WidgetPlotTable extends Component { let checkBoxes = []; let icData = []; let showLegend = false; - if (this.state.signals.length > 0) { showLegend = true; @@ -75,24 +66,35 @@ class WidgetPlotTable extends Component { // determine ID of infrastructure component related to signal (via config) let icID = this.props.icIDs[signal.id] - if (this.props.data[icID] != null && this.props.data[icID].output != null && this.props.data[icID].output.values != null) { - if (this.props.data[icID].output.values[signal.index] !== undefined){ - icData.push(this.props.data[icID].output.values[signal.index]); + // distinguish between input and output signals + if (signal.direction === "out"){ + if (this.props.data[icID] != null && this.props.data[icID].output != null && this.props.data[icID].output.values != null) { + if (this.props.data[icID].output.values[signal.index] !== undefined){ + icData.push(this.props.data[icID].output.values[signal.index]); + } + } + } else if (signal.direction === "in"){ + if (this.props.data[icID] != null && this.props.data[icID].input != null && this.props.data[icID].input.values != null) { + if (this.props.data[icID].input.values[signal.index] !== undefined){ + icData.push(this.props.data[icID].input.values[signal.index]); + } } } + + } // Create checkboxes using the signal indices from component config - checkBoxes = this.state.signals.map((signal) => { - let checked = this.state.signals.indexOf(signal.index) > -1; - let chkBxClasses = classNames({ - 'btn': true, - 'btn-default': true, - 'active': checked - }); - return this.updateSignalSelection(signal.index, e.target.checked)}> {signal.name} - }); + // checkBoxes = this.state.signals.map((signal) => { + // let checked = this.state.signals.indexOf(signal) > -1; + // let chkBxClasses = classNames({ + // 'btn': true, + // 'btn-default': true, + // 'active': checked + // }); + // return this.updateSignalSelection(signal, e.target.checked)}> {signal.name} + // }); } return ( @@ -104,7 +106,7 @@ class WidgetPlotTable extends Component { {checkBoxes} - ) : (No signal has been pre-selected.) + ) : (Use edit menu to change selected signals.) }

    From 640940dffd453259a11c4b16a976f166e9bc80e6 Mon Sep 17 00:00:00 2001 From: Sonja Happ Date: Wed, 20 May 2020 13:38:48 +0200 Subject: [PATCH 211/391] PlotTable widget: move data gathering from render function to getDerivedStateFromProps #218 --- src/widget/widgets/plot-table.js | 74 +++++++++++++++----------------- 1 file changed, 35 insertions(+), 39 deletions(-) diff --git a/src/widget/widgets/plot-table.js b/src/widget/widgets/plot-table.js index 67130a4..3d851d6 100644 --- a/src/widget/widgets/plot-table.js +++ b/src/widget/widgets/plot-table.js @@ -24,66 +24,62 @@ class WidgetPlotTable extends Component { constructor(props) { super(props); this.state = { - signals: [] + signals: [], + data: [] }; } static getDerivedStateFromProps(props, state){ let intersection = [] + let data = []; let signalID, sig; for (signalID of props.widget.signalIDs) { for (sig of props.signals) { if (signalID === sig.id) { intersection.push(sig); - } - } - } - return {signals: intersection} + // sig is a selected signal, get data + // determine ID of infrastructure component related to signal (via config) + let icID = props.icIDs[sig.id] + + // distinguish between input and output signals + if (sig.direction === "out") { + if (props.data[icID] != null && props.data[icID].output != null && props.data[icID].output.values != null) { + if (props.data[icID].output.values[sig.index] !== undefined) { + data.push(props.data[icID].output.values[sig.index]); + } + } + } else if (sig.direction === "in") { + if (props.data[icID] != null && props.data[icID].input != null && props.data[icID].input.values != null) { + if (props.data[icID].input.values[sig.index] !== undefined) { + data.push(props.data[icID].input.values[sig.index]); + } + } + } + } // sig is selected signal + } // loop over props.signals + } // loop over selected signals + + return {signals: intersection, data: data} } - updateSignalSelection(signal, checked) { - // Update the selected signals and propagate to parent component - var new_widget = Object.assign({}, this.props.widget, { - checkedSignals: checked ? this.state.signals.concat(signal) : this.state.signals.filter((idx) => idx !== signal) - }); - this.props.onWidgetChange(new_widget); - } + // updateSignalSelection(signal, checked) { + // // Update the selected signals and propagate to parent component + // var new_widget = Object.assign({}, this.props.widget, { + // checkedSignals: checked ? this.state.signals.concat(signal) : this.state.signals.filter((idx) => idx !== signal) + // }); + // this.props.onWidgetChange(new_widget); + // } render() { let checkBoxes = []; - let icData = []; + let showLegend = false; if (this.state.signals.length > 0) { showLegend = true; - // get data of preselected signals - let signal; - for (signal of this.state.signals) { - - // determine ID of infrastructure component related to signal (via config) - let icID = this.props.icIDs[signal.id] - - // distinguish between input and output signals - if (signal.direction === "out"){ - if (this.props.data[icID] != null && this.props.data[icID].output != null && this.props.data[icID].output.values != null) { - if (this.props.data[icID].output.values[signal.index] !== undefined){ - icData.push(this.props.data[icID].output.values[signal.index]); - } - } - } else if (signal.direction === "in"){ - if (this.props.data[icID] != null && this.props.data[icID].input != null && this.props.data[icID].input.values != null) { - if (this.props.data[icID].input.values[signal.index] !== undefined){ - icData.push(this.props.data[icID].input.values[signal.index]); - } - } - } - - - } - // Create checkboxes using the signal indices from component config // checkBoxes = this.state.signals.map((signal) => { // let checked = this.state.signals.indexOf(signal) > -1; @@ -112,7 +108,7 @@ class WidgetPlotTable extends Component {
    Date: Wed, 20 May 2020 13:46:33 +0200 Subject: [PATCH 212/391] PlotTable widget: shift signal indices by 1 #218 --- src/widget/widgets/plot-table.js | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/src/widget/widgets/plot-table.js b/src/widget/widgets/plot-table.js index 3d851d6..155131e 100644 --- a/src/widget/widgets/plot-table.js +++ b/src/widget/widgets/plot-table.js @@ -45,14 +45,14 @@ class WidgetPlotTable extends Component { // distinguish between input and output signals if (sig.direction === "out") { if (props.data[icID] != null && props.data[icID].output != null && props.data[icID].output.values != null) { - if (props.data[icID].output.values[sig.index] !== undefined) { - data.push(props.data[icID].output.values[sig.index]); + if (props.data[icID].output.values[sig.index-1] !== undefined) { + data.push(props.data[icID].output.values[sig.index-1]); } } } else if (sig.direction === "in") { if (props.data[icID] != null && props.data[icID].input != null && props.data[icID].input.values != null) { - if (props.data[icID].input.values[sig.index] !== undefined) { - data.push(props.data[icID].input.values[sig.index]); + if (props.data[icID].input.values[sig.index-1] !== undefined) { + data.push(props.data[icID].input.values[sig.index-1]); } } } @@ -72,7 +72,6 @@ class WidgetPlotTable extends Component { // } render() { - let checkBoxes = []; let showLegend = false; From a7e0cb27a2c9d796056b4d641f95f05eb3be9f22 Mon Sep 17 00:00:00 2001 From: Sonja Happ Date: Wed, 20 May 2020 13:52:16 +0200 Subject: [PATCH 213/391] Plot Widget: fix in the same way as PlotTable Widget, now plotting signals #218 --- src/widget/widget.js | 2 +- src/widget/widgets/plot.js | 65 ++++++++++++++++++-------------------- 2 files changed, 31 insertions(+), 36 deletions(-) diff --git a/src/widget/widget.js b/src/widget/widget.js index 743241b..1327414 100644 --- a/src/widget/widget.js +++ b/src/widget/widget.js @@ -130,7 +130,7 @@ class Widget extends React.Component { } else if (widget.type === 'Value') { return } else if (widget.type === 'Plot') { - return + return } else if (widget.type === 'Table') { return } else if (widget.type === 'Label') { diff --git a/src/widget/widgets/plot.js b/src/widget/widgets/plot.js index 15961a5..20245e2 100644 --- a/src/widget/widgets/plot.js +++ b/src/widget/widgets/plot.js @@ -26,49 +26,44 @@ class WidgetPlot extends React.Component { this.state = { data: [], - legend: [] + signals: [] }; } static getDerivedStateFromProps(props, state){ - if (props.config == null) { - return{ - data: [], - legend: [], - }; - } + let intersection = [] + let data = []; + let signalID, sig; + for (signalID of props.widget.signalIDs) { + for (sig of props.signals) { + if (signalID === sig.id) { + intersection.push(sig); - const ic = props.config.icID; + // sig is a selected signal, get data + // determine ID of infrastructure component related to signal (via config) + let icID = props.icIDs[sig.id] - // Proceed if a config and a IC are available - if (ic && props.data[ic] != null && props.data[ic] != null && props.data[ic].output != null && props.data[ic].output.values != null) { - const chosenSignals = props.widget.customProperties.signals; + // distinguish between input and output signals + if (sig.direction === "out") { + if (props.data[icID] != null && props.data[icID].output != null && props.data[icID].output.values != null) { + if (props.data[icID].output.values[sig.index-1] !== undefined) { + data.push(props.data[icID].output.values[sig.index-1]); + } + } + } else if (sig.direction === "in") { + if (props.data[icID] != null && props.data[icID].input != null && props.data[icID].input.values != null) { + if (props.data[icID].input.values[sig.index-1] !== undefined) { + data.push(props.data[icID].input.values[sig.index-1]); + } + } + } + } // sig is selected signal + } // loop over props.signals + } // loop over selected signals - const data = props.data[ic].output.values.filter((values, index) => ( - props.widget.customProperties.signals.findIndex(value => value === index) !== -1 - )); - - // Query the signals that will be displayed in the legend - const legend = props.config.outputMapping.reduce( (accum, signal, signal_index) => { - if (chosenSignals.includes(signal_index)) { - accum.push({ index: signal_index, name: signal.name, type: signal.unit }); - } - - return accum; - }, []); - - return{ - data: data, - legend: legend, - }; - } else { - return{ - data: [], - legend: [], - }; - } + return {signals: intersection, data: data} } @@ -87,7 +82,7 @@ class WidgetPlot extends React.Component { yLabel={this.props.widget.customProperties.ylabel} />
    - +
    ; } } From 2c5d68730e52bf91b902eb95bec4a54cc0099033 Mon Sep 17 00:00:00 2001 From: Laura Fuentes Grau Date: Sat, 23 May 2020 14:07:46 +0200 Subject: [PATCH 214/391] fix for image widget: widget knows its own file again, wip: upload image without closing edit window --- src/dashboard/dashboard.js | 14 +++++++++++++- .../edit-widget/edit-widget-control-creator.js | 4 ++-- .../edit-widget/edit-widget-image-control.js | 8 +++++--- src/widget/edit-widget/edit-widget.js | 5 +++-- 4 files changed, 23 insertions(+), 8 deletions(-) diff --git a/src/dashboard/dashboard.js b/src/dashboard/dashboard.js index 11156da..a03a418 100644 --- a/src/dashboard/dashboard.js +++ b/src/dashboard/dashboard.js @@ -42,7 +42,7 @@ class Dashboard extends Component { static lastWidgetKey = 0; static getStores() { - return [ DashboardStore, FileStore, LoginStore, WidgetStore, SignalStore, ConfigStore, ICStore]; + return [ DashboardStore, LoginStore, WidgetStore, SignalStore, ConfigStore, ICStore]; } static calculateState(prevState, props) { @@ -272,6 +272,17 @@ class Dashboard extends Component { this.setState({ editModal: true, modalData: widget, modalIndex: index }); }; + uploadFile(data,widget){ + console.log("tschuuuu tschuuuu"); + AppDispatcher.dispatch({ + type: 'files/start-upload', + data: data, + token: this.state.sessionToken, + objectType: "widget", + objectID: widget.id, + }); + + } closeEdit(data){ @@ -469,6 +480,7 @@ class Dashboard extends Component { sessionToken={this.state.sessionToken} show={this.state.editModal} onClose={this.closeEdit.bind(this)} + onUpload = {this.uploadFile.bind(this)} widget={this.state.modalData} signals={this.state.signals} files={this.state.files} diff --git a/src/widget/edit-widget/edit-widget-control-creator.js b/src/widget/edit-widget/edit-widget-control-creator.js index ae457b7..3133d29 100644 --- a/src/widget/edit-widget/edit-widget-control-creator.js +++ b/src/widget/edit-widget/edit-widget-control-creator.js @@ -33,7 +33,7 @@ import EditWidgetMinMaxControl from './edit-widget-min-max-control'; import EditWidgetHTMLContent from './edit-widget-html-content'; import EditWidgetParametersControl from './edit-widget-parameters-control'; -export default function CreateControls(widgetType = null, widget = null, sessionToken = null, files = null, signals, handleChange) { +export default function CreateControls(widgetType = null, widget = null, sessionToken = null, files = null, signals, handleChange, onUpload) { // Use a list to concatenate the controls according to the widget type var DialogControls = []; @@ -84,7 +84,7 @@ export default function CreateControls(widgetType = null, widget = null, session // Restrict to only image file types (MIME) //let imageControlFiles = files == null? [] : files.filter(file => file.type.includes('image')); DialogControls.push( - handleChange(e)} />, + handleChange(e)} onUpload={(f,i) => onUpload(f,i)} />, handleChange(e)} /> ); break; diff --git a/src/widget/edit-widget/edit-widget-image-control.js b/src/widget/edit-widget/edit-widget-image-control.js index 6e8e466..de98757 100644 --- a/src/widget/edit-widget/edit-widget-image-control.js +++ b/src/widget/edit-widget/edit-widget-image-control.js @@ -18,7 +18,7 @@ import React from 'react'; import {FormGroup, FormControl, FormLabel, Button, ProgressBar} from 'react-bootstrap'; -import AppDispatcher from '../../common/app-dispatcher'; +//import AppDispatcher from '../../common/app-dispatcher'; class EditImageWidgetControl extends React.Component { @@ -47,9 +47,11 @@ class EditImageWidgetControl extends React.Component { formData.append("file", this.state.fileList[key]); } } + + this.props.onUpload(formData,this.props.widget); // upload files - AppDispatcher.dispatch({ + /* AppDispatcher.dispatch({ type: 'files/start-upload', data: formData, token: this.props.sessionToken, @@ -57,7 +59,7 @@ class EditImageWidgetControl extends React.Component { finishedCallback: this.clearProgress, objectType: "widget", objectID: this.props.widget.id, - }); + });*/ } uploadProgress = (e) => { diff --git a/src/widget/edit-widget/edit-widget.js b/src/widget/edit-widget/edit-widget.js index 9a9778a..331e3a6 100644 --- a/src/widget/edit-widget/edit-widget.js +++ b/src/widget/edit-widget/edit-widget.js @@ -122,7 +122,7 @@ class EditWidgetDialog extends React.Component { customProperty ? changeObject[parts[0]][parts[1]] = e.target.value : changeObject[e.target.id] = e.target.value; - // get file and update size (if it's an image) + // get file and update size (if it's an image) if ('lockAspect' in this.state.temporal && this.state.temporal.lockAspect) { // TODO this if condition requires changes to work!!! changeObject = this.assignAspectRatio(changeObject, e.target.value); @@ -179,7 +179,8 @@ class EditWidgetDialog extends React.Component { this.props.sessionToken, this.props.files, this.props.signals, - (e) => this.handleChange(e)); + (e) => this.handleChange(e), + (f,i) => this.props.onUpload(f,i)); } return ( From 1be889365e8f84e5a73b785de2ef8385500c3848 Mon Sep 17 00:00:00 2001 From: Laura Fuentes Grau Date: Sun, 24 May 2020 14:42:30 +0200 Subject: [PATCH 215/391] fix for table widget: table now scrollable #101 --- src/styles/widgets.css | 8 +++++++- src/widget/widgets/table.js | 3 ++- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/src/styles/widgets.css b/src/styles/widgets.css index 3d3455d..4e367a3 100644 --- a/src/styles/widgets.css +++ b/src/styles/widgets.css @@ -415,7 +415,13 @@ div[class*="-widget"] label { background-color: #fff; } -.table-widget td, .table-widget th { +.table-widget th { + position: sticky; + top: 0; + text-align: left; +} + +.table-widget td{ text-align: left; } diff --git a/src/widget/widgets/table.js b/src/widget/widgets/table.js index a7ef37b..54383a8 100644 --- a/src/widget/widgets/table.js +++ b/src/widget/widgets/table.js @@ -94,6 +94,7 @@ class WidgetTable extends Component { render() { let rows = this.state.rows; + if(rows.length === 0){ rows.push({ name: "no entries" @@ -109,7 +110,7 @@ class WidgetTable extends Component { columns.push() return ( -
    +
    { columns }
    From 02c24bfecd85b2d4bba7404a65882e4ac6e40faf Mon Sep 17 00:00:00 2001 From: Laura Fuentes Grau Date: Sun, 24 May 2020 19:02:53 +0200 Subject: [PATCH 216/391] (edit-)lockAspect now works --- src/dashboard/dashboard.js | 3 +-- src/widget/edit-widget/edit-widget.js | 7 ++++--- src/widget/editable-widget-container.js | 2 +- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/dashboard/dashboard.js b/src/dashboard/dashboard.js index a03a418..3f38e30 100644 --- a/src/dashboard/dashboard.js +++ b/src/dashboard/dashboard.js @@ -42,7 +42,7 @@ class Dashboard extends Component { static lastWidgetKey = 0; static getStores() { - return [ DashboardStore, LoginStore, WidgetStore, SignalStore, ConfigStore, ICStore]; + return [ DashboardStore, LoginStore,FileStore, WidgetStore, SignalStore, ConfigStore, ICStore]; } static calculateState(prevState, props) { @@ -273,7 +273,6 @@ class Dashboard extends Component { }; uploadFile(data,widget){ - console.log("tschuuuu tschuuuu"); AppDispatcher.dispatch({ type: 'files/start-upload', data: data, diff --git a/src/widget/edit-widget/edit-widget.js b/src/widget/edit-widget/edit-widget.js index 331e3a6..30b9fd0 100644 --- a/src/widget/edit-widget/edit-widget.js +++ b/src/widget/edit-widget/edit-widget.js @@ -53,6 +53,7 @@ class EditWidgetDialog extends React.Component { } assignAspectRatio(changeObject, fileId) { + fileId = parseInt(fileId, 10) // get aspect ratio of file const file = this.props.files.find(element => element.id === fileId); @@ -113,9 +114,9 @@ class EditWidgetDialog extends React.Component { if (parts[1] === 'lockAspect') { //not a customProperty customProperty ? changeObject[parts[0]][parts[1]] = e.target.checked : changeObject[e.target.id] = e.target.checked; - + // correct image aspect if turned on - if (e.target.checked && this.state.temporal.customProperties.file) { + if (e.target.checked && (this.state.temporal.customProperties.file !== -1)) { changeObject = this.assignAspectRatio(changeObject, this.state.temporal.customProperties.file); } } else if (e.target.id.includes('file')) { @@ -123,7 +124,7 @@ class EditWidgetDialog extends React.Component { customProperty ? changeObject[parts[0]][parts[1]] = e.target.value : changeObject[e.target.id] = e.target.value; // get file and update size (if it's an image) - if ('lockAspect' in this.state.temporal && this.state.temporal.lockAspect) { + if ((changeObject.customProperties.file !== -1)&&('lockAspect' in this.state.temporal && this.state.temporal.lockAspect)) { // TODO this if condition requires changes to work!!! changeObject = this.assignAspectRatio(changeObject, e.target.value); } diff --git a/src/widget/editable-widget-container.js b/src/widget/editable-widget-container.js index f96e02c..5ac2a55 100644 --- a/src/widget/editable-widget-container.js +++ b/src/widget/editable-widget-container.js @@ -114,7 +114,7 @@ class EditableWidgetContainer extends React.Component { minWidth={widget.minWidth} minHeight={widget.minHeight} maxWidth ={widget.customProperties.maxWidth || '100%' } - lockAspectRatio={Boolean(widget.isLocked)} + lockAspectRatio={Boolean(widget.customProperties.lockAspect)} bounds={'parent'} className={widgetClasses} onResizeStart={this.borderWasClicked} From 908730b0725664a8c714cc95d1816de5719a0cf1 Mon Sep 17 00:00:00 2001 From: Sonja Happ Date: Wed, 27 May 2020 10:45:57 +0200 Subject: [PATCH 217/391] Change of file API; files belong to scenario now (not to widget or component config); preparations for # 219 --- .../widget/edit-widget-control-creator.js | 4 +-- src/common/api/rest-api.js | 4 +-- src/componentconfig/configs-data-manager.js | 2 +- src/componentconfig/edit-config.js | 2 +- src/dashboard/dashboard.js | 17 ++--------- src/file/file-store.js | 2 +- src/file/files-data-manager.js | 6 ++-- src/file/select-file.js | 7 ++--- src/img/datamodel.png | Bin 197553 -> 196372 bytes src/scenario/scenario.js | 12 +++++++- .../edit-widget-control-creator.js | 6 ++-- ...control.js => edit-widget-file-control.js} | 27 ++++++------------ src/widget/edit-widget/edit-widget.js | 11 +++---- src/widget/widget-store.js | 3 +- src/widget/widget.js | 21 -------------- src/widget/widgets-data-manager.js | 12 -------- 16 files changed, 43 insertions(+), 93 deletions(-) rename src/widget/edit-widget/{edit-widget-image-control.js => edit-widget-file-control.js} (83%) diff --git a/src/__tests__/widget/edit-widget-control-creator.js b/src/__tests__/widget/edit-widget-control-creator.js index b338f7c..73efcd9 100644 --- a/src/__tests__/widget/edit-widget-control-creator.js +++ b/src/__tests__/widget/edit-widget-control-creator.js @@ -5,7 +5,7 @@ import createControls from '../../widget/edit-widget/edit-widget-control-creator import EditWidgetTextControl from '../../widget/edit-widget/edit-widget-text-control'; import EditWidgetColorControl from '../../widget/edit-widget/edit-widget-color-control'; import EditWidgetTimeControl from '../../widget/edit-widget/edit-widget-time-control'; -import EditImageWidgetControl from '../../widget/edit-widget/edit-widget-image-control'; +import EditFileWidgetControl from '../../widget/edit-widget/edit-widget-file-control'; import EditWidgetSignalControl from '../../widget/edit-widget/edit-widget-signal-control'; import EditWidgetSignalsControl from '../../widget/edit-widget/edit-widget-signals-control'; import EditWidgetOrientation from '../../widget/edit-widget/edit-widget-orientation'; @@ -28,7 +28,7 @@ describe('edit widget control creator', () => { { args: { widgetType: 'Value' }, result: { controlNumber: 5, controlTypes: [EditWidgetTextControl, EditWidgetSignalControl, EditWidgetTextSizeControl, EditWidgetCheckboxControl] } }, { args: { widgetType: 'Plot' }, result: { controlNumber: 5, controlTypes: [EditWidgetTimeControl, EditWidgetSignalsControl, EditWidgetTextControl, EditWidgetMinMaxControl] } }, { args: { widgetType: 'Table' }, result: { controlNumber: 2, controlTypes: [EditWidgetCheckboxControl] } }, - { args: { widgetType: 'Image' }, result: { controlNumber: 2, controlTypes: [EditImageWidgetControl, EditWidgetAspectControl] } }, + { args: { widgetType: 'Image' }, result: { controlNumber: 2, controlTypes: [EditFileWidgetControl, EditWidgetAspectControl] } }, { args: { widgetType: 'Gauge' }, result: { controlNumber: 6, controlTypes: [EditWidgetTextControl, EditWidgetSignalControl, EditWidgetCheckboxControl, EditWidgetColorZonesControl, EditWidgetMinMaxControl] } }, { args: { widgetType: 'PlotTable' }, result: { controlNumber: 5, controlTypes: [EditWidgetSignalsControl, EditWidgetTextControl, EditWidgetTimeControl, EditWidgetMinMaxControl] } }, { args: { widgetType: 'Slider' }, result: { controlNumber: 9, controlTypes: [EditWidgetTextControl, EditWidgetOrientation, EditWidgetSignalControl, EditWidgetCheckboxControl, EditWidgetCheckboxControl, EditWidgetMinMaxControl, EditWidgetNumberControl, EditWidgetNumberControl] } }, diff --git a/src/common/api/rest-api.js b/src/common/api/rest-api.js index 53a6a16..9fa04f1 100644 --- a/src/common/api/rest-api.js +++ b/src/common/api/rest-api.js @@ -123,9 +123,9 @@ class RestAPI { }); } - upload(url, data, token, progressCallback, objectType, objectID) { + upload(url, data, token, progressCallback, scenarioID) { return new Promise(function (resolve, reject) { - const req = request.post(url + "?objectType=" + objectType + "&objectID=" + objectID).send(data); //.on('progress', progressCallback); + const req = request.post(url + "?scenarioID=" + scenarioID).send(data); //.on('progress', progressCallback); if (token != null) { req.set('Authorization', "Bearer " + token); diff --git a/src/componentconfig/configs-data-manager.js b/src/componentconfig/configs-data-manager.js index c0ac6c9..0bb0a0c 100644 --- a/src/componentconfig/configs-data-manager.js +++ b/src/componentconfig/configs-data-manager.js @@ -68,7 +68,7 @@ class ConfigDataManager extends RestDataManager { loadFiles(token, configs){ for (let config of configs) { // request files of config - RestAPI.get(this.makeURL('/files?objectType=config&objectID=' + config.id), token).then(response => { + RestAPI.get(this.makeURL('/files?scenarioID' + config.scenarioID), token).then(response => { AppDispatcher.dispatch({ type: 'files/loaded', data: response.files diff --git a/src/componentconfig/edit-config.js b/src/componentconfig/edit-config.js index e629347..db81b14 100644 --- a/src/componentconfig/edit-config.js +++ b/src/componentconfig/edit-config.js @@ -121,7 +121,7 @@ class EditConfigDialog extends React.Component { - this.handleSelectedFileChange(e)} value={this.state.selectedFileID} objectID={this.props.config.id}/> + this.handleSelectedFileChange(e)} value={this.state.selectedFileID} scenarioID={this.props.config.scenarioID}/> Start Parameters diff --git a/src/dashboard/dashboard.js b/src/dashboard/dashboard.js index 3f38e30..fb00237 100644 --- a/src/dashboard/dashboard.js +++ b/src/dashboard/dashboard.js @@ -75,8 +75,10 @@ class Dashboard extends Component { // filter component configurations to the ones that belong to this scenario let configs = [] + let files = [] if (dashboard !== null) { configs = ConfigStore.getState().filter(config => config.scenarioID === dashboard.scenarioID); + files = FileStore.getState().filter(file => file.scenarioID === dashboard.scenarioID); } // filter signals to the ones belonging to the scenario at hand @@ -91,18 +93,6 @@ class Dashboard extends Component { } } - // filter files to the ones associated with a widget of this dashboard - let allFiles = FileStore.getState(); - let files = []; - let file, widget; - for (file of allFiles){ - for (widget of widgets){ - if (file.widgetID === widget.id){ - files.push(file); - } - } - } - // filter ICs to the ones used by this scenario let ics = [] if (configs.length > 0){ @@ -277,8 +267,7 @@ class Dashboard extends Component { type: 'files/start-upload', data: data, token: this.state.sessionToken, - objectType: "widget", - objectID: widget.id, + scenarioID: this.state.dashboard.scenarioID, }); } diff --git a/src/file/file-store.js b/src/file/file-store.js index c5c87b9..ae6779d 100644 --- a/src/file/file-store.js +++ b/src/file/file-store.js @@ -54,7 +54,7 @@ class FileStore extends ArrayStore { return state case 'files/start-upload': - FilesDataManager.upload(action.data, action.token, action.progressCallback, action.finishedCallback, action.objectType, action.objectID); + FilesDataManager.upload(action.data, action.token, action.progressCallback, action.finishedCallback, action.scenarioID); return state; case 'files/uploaded': diff --git a/src/file/files-data-manager.js b/src/file/files-data-manager.js index 1a61033..6336c66 100644 --- a/src/file/files-data-manager.js +++ b/src/file/files-data-manager.js @@ -24,8 +24,8 @@ class FilesDataManager extends RestDataManager { super('file', '/files'); } - upload(file, token = null, progressCallback = null, finishedCallback = null, objectType, objectID) { - RestAPI.upload(this.makeURL(this.url), file, token, progressCallback, objectType, objectID).then(response => { + upload(file, token = null, progressCallback = null, finishedCallback = null, scenarioID) { + RestAPI.upload(this.makeURL(this.url), file, token, progressCallback, scenarioID).then(response => { AppDispatcher.dispatch({ type: 'files/uploaded', @@ -34,7 +34,7 @@ class FilesDataManager extends RestDataManager { // Trigger a files reload AppDispatcher.dispatch({ type: 'files/start-load', - param: '?objectType=' + objectType + '&objectID=' + objectID, + param: '?scenarioID=' + scenarioID, token: token }); diff --git a/src/file/select-file.js b/src/file/select-file.js index b626ee3..bceee4a 100644 --- a/src/file/select-file.js +++ b/src/file/select-file.js @@ -34,11 +34,9 @@ class SelectFile extends React.Component { static calculateState(prevState, props) { let files = FileStore.getState().filter((file) => { - return (file.configID === props.objectID) + return (file.scenarioID === props.scenarioID) }); - console.log("props.objectID=", props.objectID) - return { files: files, sessionToken: LoginStore.getState().token, @@ -83,8 +81,7 @@ class SelectFile extends React.Component { token: this.state.sessionToken, //progressCallback: this.updateUploadProgress, //finishedCallback: this.clearProgress, - objectType: this.props.type, - objectID: this.props.objectID, + scenarioID: this.props.scenarioID, }); }; diff --git a/src/img/datamodel.png b/src/img/datamodel.png index e59cbc2b3d79bf5dcacfec7dec2986462b9d2e4c..f98745fcbbdf888a9ca6126af1810d15b3bfc31b 100644 GIT binary patch literal 196372 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 Y;9s9NZPFjir8leZ(%PB%>u# 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 z z(I)r4MPU!%yOC-NT{gB4C?Ep_ItmPjh3#gd7UT>ZILy)VJ)fjG%Yz}ovh9rRY{tIl z=BY+WdVGM0U~-g=RAVm^XaTK(wW>oRfoM_s!GtG3rqc)60K6?1)tFGHZOqV3^o5QE zO8H{IU(*`ppGUp}4l*pdJtT@YM9{RhH#K4ms8sVkFWOx}{LQh*G_+eEH{rri%z@WF zP@_Q@PQ_j!Y+fYh;Z+#aL-h?10x$J9i_ip3f<>!ZzJV8ZR(gILTgou5@Hbm~>s3fN zPgRY}p7LaMBw%fWU;ssokVx&(e}y=TKZvD#sULfMr;=eETYQn|MQEF!zT}7>(#vBI z+fZR}=JgAxOt2PqWpFOF;$=R07;Ii8+GU!aSvP|=pwO;Rmp#&)HhuEq*iGg7t}@-yApulGaCwvd@-ff%^9;r_JWbtBwMSY)Dtx zoh^%-Ui%>-8Ug&G9QxVw{o7>_WHvx1RL(1R7Z|s^M&;u*NKT=g9&I&LpH3HKBUiTpQ)0$11J^GR)Q(r5xoD;!uuF$kS4NdgU^F&5l2#`cYMgzvW95^fb zEgG8@8@;pSw8_<3!0@6x*2mE&S;6MC|VZXxR@}N66 z&RoAvn!t2;?}cX>=hD@x_NJsilsYLQui8d-R4hpa?J5=P?X~vCo9Rs*pP>Df*d0 zn8`in``#Qf7`f^AEtl``HN{}`oeUKq-~@OxtjU3QpK(>FA{4^*{eKC~juCASy}^aJVK$7;&Ys zY-|C=_?Tkgf)SJ!N?_klLAGeRoNW#4rWTHTn8EfUAY@_;rZB2O(|lvz#qH$cGC^BA zShlmh@#)j2DmXC7k<>(VXY&d)s7%5dL(IeDQ&J8?d+ID8^vwGgx|zKn^7lFI1Fg6Q z8WHJ^Q8w?+W-s4DZY6|BVQQrPdym8&@+8Of9eP7uNHL7L##LA6V7Sle^tE$!QZO1G znDTzjf@|M3N9r2Jy=M=cJ6k1*kv^{yxGz|HsF#VA|48X}tSZBT-GQI}!)lp+dp}p# z>7Cef)<1VPq=IQf(Beb%Q5(!TGJ|Sadd!c^(pwz)O5?1`GBC5(p2$GT&F{hFm00aeHh!-6R|C2@DJK+OzNAIbmV# zStb$*c~W0$eiA@Wl}r8?rU6~%bibD|;vjYvSkQM0inXLZXb8iQkVDGDC~A+bB~>9H10+lCCfHbH8z-{) z^Jcl8Bn;9}#JEf#%%!Bmn0YfrQn7a_^6|%1!3&@-{w}+6JI&G8=AH5^=GLu*)bp6l z{k6mU&hD$y*~u-!bRt_^e_f-->|ib*_6&&T##CL#kBf3u@i13}$jbTOOYpkVi7To^FjGg&li9tmm!ME^?Kw@Oib*OLxVs|7^qN0Q?_;NH_=$ z_4j(fwERH*GYOOu22OvNghU*s1qR2*pC2J(sj99%@Z`ypw=fUUDBXc?WocK})?Pstf8gj?>71P!7l&C} zTZ7Y3fwMeVn>UCOai=SQNH4rmOzm=QNpF zbn?uZ_zCBN2b-(bfJ&7nJZv63KrU19nLi5*Jh{5Q{=UBcXjfO)CnE73=*ia5>(VNB zQ4WdX;^I1d;zaF_mUv}ctS?w6t>Tn7+@EPjmLH(8_Z=M+Gcz-A*mYT15||--lAq7h zKB@sa2gvT8;GgfStHlZyz6AvYoY=c>->I`_4|8&Iq8DszM2=TiSM&GZl+7Psl26PpEKKtyo8y}RgZn^3D=jo0a4aIzUa8~pe*t3pi$>7yFytN;cGfLgQ6|}2!#(1M z>0(dBAy+-sj_0bGH80hsGqFxO6G?0j?t96Ab6~AI;y`HgS>PYX9NgRa*MJ`8!p{2# z`z{~4rir;9`?DpqTX=hCc8~8(^*t{leC>|^Nz0$km6eybB;e1`2r>2X3PU2E>Mjc4 z=RKgWuOA0qE8sBo(sXQbe*Okf;g&Q+nYArTn|g3?Fh!?aP)JB-)A)7an2e*ypCdN6Q}l%l(@ab{w|d$cj~A`8nAs72zEl7}BY zd^j*PWV^5q`Tsjq8v)zVW2aA_K1ogO1Eiu$DdI&$gf|Rj-mUeg{kgP+6s$QLk03i6 zv2FhM!CP-a1I3C%9Blo_%j=M5?rc$TFe&!ZrTdT)-}_ve3ASx{E#?Fe!$KsieE*?C z@lgI!RI}+IhVNu*@G52N(1MwtMn-lw&ieTJ`c|@uOG!z+Z;6-4F>0p6!if9Pq=bb1 zAXt3_s&tA9p)y@qn>vrfQGW0`5w=a4p;5pBesvr{5T%qmdoXB*jf$d)5=H1>mT9Z| z{l%^)lH#FY6)!p$$&e1`AmU@g#)wxS&7htz(UBd123vnWJp%&+R6cPCHSh#)IJ+K% zyrhgwfpZ`2RfhpkMXSI($UVMD3laKXS$Ov+t`G>0bja|>>S~ifasSv@dbHC2_+iXr z*>e_%s{|l}Cw#}DfwLFv`o^N04+aDGfCij1?xA|`-gy{(dieP9{!$B_2P1W4Wpht? zHv;?B@7_IE;yCLMH+|URTmE%5wX<5<)gppf2-A_KSkVBO7Q7F=)6P;yPKTMERMWMm z{6%<0D5CA~Xps>IBWc zvcVw25zy%i#)UL;)!5GBY_Rk5^BIDD`rNNvS7rdkV1P3GJuoofiumJP7MWm}!^e4H zw5zP^D^Pw$>h3Gc8l&pF=$n{l)F0eSbQV3v~=8NG87j- zSZLYn4K3gMAS}S%-ZHk?TE(Yfknba;U~|EMuVrOrC&|d{7u*v7|D@-^PVS0kKtpb&XKx0qaNNShjhk0q|*AdS=L$U zr^78*m=0Xl8OpeI%YT4rdwqS?FM2eSB&TDV=IY34hItxqyE@5Rx0GV`-ej8tGU^~^b5-BZNpTC=p7}ZW;YRWM4+LRI@ z3{(Q1`}?baYni zFpsGi43G6{jh);l7cvhzx#=Ai7S@QnBo~v>5^^E837U(RD@Zx+;6L@;pYveH&L}VB z?D8E_2}dr|Hm1SK>;QPc+0Hc0ocmAO%Adl?O+v?^$@X@#2O4`)Fbfw92%N>*+FA;a ze?CF!v9skk0=*d3G}Ua&FT#|r6(nTG&}-hIAE ztH^j5Cyr>``FKX|uyzo%23XlO3-c#BLE>kHQT7}k#J3JVKRi@ei`Xc5bXcn7SBtcS>Qc($&Qf(AWOiYx5JZ@2E z0sDbNuxu>u*x&E?1}m|ojbYIfjcW@f%Y$*PnRw+W3$75drn@l=?(yoKIwTY;$a zd;+({Hy#E70X1~K)d+gjFUG3i;0qU~bFj4nYJ{716p(fJwk%i?Zf=FQJn=$Q zB5rRR5s70bPN-I_em}|}Dykdg3$UsV5={td(!RdFqQ*D_ysU;s1myh-?(Rau!q8uJ z7JJ(;XbCkg7$6A?n!Ji(Iw(^k=ISYS;$O#)7nr^v5cL&c>c(o}{$FD9!3_2H*6OOV50LHy*hG{wkAqB!Z#kM7Q$qbB8A^ zyu5wM07wms7UcyT8xaNGzxWSh4T0v+J3VZy7EC+B9Zu_?(C^kugt&Y;}_hDAPnRoN)n+;EOI*g zDiO|5QMokhK^=ggOk%>}aB2GaYHW2NrPGfiv;6SiK+p)gD21@CTu>zFH5#6SNhEoI z@>v?PkkZ^>s<*X+^v$fh2^bF|P0Hv%9FIxst#-4Qv9Z}@Fq;5aG}7*psHo@&jGd~o ze<|-t#U{gylGN?nzG;(jGl_5Cs;vRO4`xwLlhmyQx9eihe*G+L7+5T#p)52sGm{0x zO}6;K;6oPN(W6I00OM-7msQ`FhcbD7%l`1OV@fEEm0G4of9*ebFl~N)ZS0V=&5S<- z?pDH~&|$TeJEd47?}5#LRH4d?4-Pyy{arV`m}%odRLu5?@5K_PFD3j4QK?j;7cbcG zfUw~A$@VUu1o+>JW$;fLSd0>%)>ef`$G_+1=N0-~CfP>-ow$h7-dx|_n6;>=fTGZ@ z&lq>L*kL+i9#luBrHS?pY4S`d8!2h&5NN&Wu2U^R;>1fy0Rwo=Bqc8X^p10FEIk>E z(jAz@OjhR;JH<)N8I^~zRT=WLmi-mlsVbRBgi;bvCK(5nvY_seVIH%uw?Qf@v;pW+ zI6=grG3Awj#zNuNe71$ReQ?JbPcJ&hNN@mX_8rWrA(Cgq>Z!4OA4F zTsnaV*HY!765P~hD((1-+%ppvL+Ux z2mGW8WQ>E+5CDqXmgau`yi>8gZYIOsi!|*(bCenWlNEvFuRca?97Gs5i!&{)?Ue-! zohBv4hD?J{)xy@1X&F2W`6CfXZXJwJ85R}KjzV&jg8ZM5)erlabYz%@4VM9ya^PGq zK65d2n3R;XGhfXH=42ws<+a~FxNg!{R%}-RWWX%c?}sJ&ILL3u_{T3`?kKy>{V6@N zDIX+sLg=Tb0=xq?0#o`e7V&=F%p4q{>lIw#x23eSqLR99`A|TV7(II!C3+P~3>p{4 z4j#PHHlRYK!qtsKmE}np&Y!pFl!iCMic`9Bq^I8BIxYGJ$`;mip%UCPPntQ2>5moSPcT#yrFqOml&^?!Gi$mc#R; zpUtULIF``iPVr&f8#w-%q$?YdizIaTWbaKw!z2ZmE$OPX-I@jgV0X=DD|aev2CDXy z$Hrut7oYFR))i&AdR22aIgUxH>%CW^G!n*g=mee8Ru8Z%WjA;CC)sk>u6gF#PpY&p z^wdY;Y!kd~@*C0&@l7x@lBC`w+FglMejguaj><-MwjGGcOy0Ss?JVg0Vg%>j5P1!a zGyvQhtLvb3bQy5<95)Rae%WYPO0n7Fb4uE#57}`aHxsh{eyeeT+55FtF=8Y3+}oS5 zEz((F7N%`;dW#Y~`}g+gIaKTGZ?I!0z~2hNDPF!jD>DzBj?OzH0tm>Q!SLe7^;HdF zXd6WsurM>9>N7Tm`Iv|iE|vl*o9(q`goWIvnj<`nQ9Qq039gUA{|0peX~ zXwqZk=~JnZD99~IUC_)t?|yt*9;lU#P3~#X14FK0u^%}iS78iG3y;UQxY4Q8yZ!w8 zX8}<6$lm!>b;1?P9)Z$w!@fp&L{uZ}l_U&3Czm`BV1f}8y**3Je>$jsP zV*)^~83{Lvk%!?%>Jh-`4(!ICgQoVL!_>h@^HgDqxD|-Iom6QM-Bx{a>XP@yH$}dEFH`>bz6pK z8srnAe0`4%9;oK0yC~t`#?zhI`sGU^#RZ4izTPbL=cG@d4F2AR+tdg{=hO%bUeN5t z_v-zUyR&=p^qZhbOa51O?uwU^79MRyPyfP81@I)G8YYef`P*pfU*WcSzRM}97o7iVf3 zf@soNUMe*6=*FJ~hToVw@#4o*t()F*yrbga;6R^OK2eG+y>@tbcmORI*k+icd*V+I zwd4{mN?Tta3(f6)LBtCB#7J&~BcO9Vu0drJa>Pe0{?>%Gqhl?A)ct_rN}IZK4W!*R z=W5>%oj!9W2bvAXPwxTQycQtul-$_(d4|8#Osul=-p?_CkInkxC6}}_lDm%kZ_dG`j`$V3EU|$8mL`8; z2_gXRbmm+E)CVdU){6c476wZZ3Rz|?nB6^e#mKJq_8U= z;I@?d9_RpyJ$Ufu^Ggsq{8|N)fN;NtYpT#gH^2uL5}cXV($ezf6(bU0kI?*a0#Nb} zl%U78Xmbe4=I3)S>~-Ac#PXpMIrRWGvfkcwK7RUN3;Ci2SS{X9T1G}0_gs$>0d3Iq zYlg|vTqM7hxQR*X1P+vz$Nm)MVYjOu|8?dwDA~QEJ1}H_Ua01W8Ro`~8$Tg~O!8HB znb!a-gO8s{MTTH3NF1iS7yb9dnX~uK4b?uWL6u+Vq`ne=p0NN!SpQhY z_+sqt&h)G2&z{xA@;oaS-55W!kVX1T_|Qg?>B$!pCHBZ93N=rGRb3>mD=3_Xm$!XY zb=}E8BEEI)8V26B@dK|q2G!rCwlp5r;3A+&ryghn*0*yQ>$)$6e4c|02=8(h{(Mc( zew;?&Br4pjuYxFp_PIaY`VP7;htiwZe5$Idzfw3TFQ}3yf1wtufzTCL4}rZ>(8&${ zh8x)UNO<-A=S%1*-D`NsMU{{PFYtmkcjYd3_~RONHgZT>a`8%k@(%pg*9RLbPl%E>5e2o75`_RlveUdQ@XC&7_5D*+LqkK4U^ZQ|ore4WW9mA4}=Xw6t1&i-xI0csYe|~zDQCC-2R;|NGYs0GhZe44V{iP%%-lIIFGsj*5 zY-I`Z*}W*U7n-h>d}9Du`{&Gihlf*tUO3=(EF$PGXvK`S1(bgj%Y!Qm<$Vg5@7(xC zS~GodbadJZvG8YecbS@I_7e8--!B(pJ2+YqCO0xQRj*KLfl_k>SO#e?So!$;0MO%k z6`WJZyA_;I+X?v^0s3}vS(cWUzXPV_RfrUW#Tbq1gadf)mI!*>rSM;KQE>rdD3N`< z45Ve+o|l=)dF$3Kt~h%w7!%k{tgXlCJj<6a&-q@+?Ot?lad%bJJrkozjN}D%bq2q7 zUIB(#4b0}N{XcNZzek8@{_O0#DgLsms`_=eEaAJz|L`3!ww}_}XknEii#!kG36{!J z5dLISsS}uHTss2xc@^>~Uowl4&0uC?dW)uR!jFNbYsJURA;~tE^@=<6=L_iLRSzD# zW4q?mcj%ek)El0v8USV>ZuE3#%pSiu^y4bwU#!3Hh>pjErTJ_B!)y54*{S^BtGU_- z2PF(r>k%|*$LIdcFJu4t9%XUEVyVrW>D8NCic}JJhz#wl2 z<|C_iTnh_ng^8E7Oz22g_*vT!wN?zSemGQ3F3wUg4Y8!r(!f?=O@2~XhzI%=A6B*t z;#Be)PNc0t8GTS!gs+&`*gXY%GBCVt0*^T1_jN_ExG{f@o(1R>C{i&?E%hWl_Kse!IST9vYvBv{7C*8IQgE2XE7f_;I>J2wgB9cw#|L~(Fe}7Mj!AM zk7V+>aPmt-Ir`NeqOwoxeA|~WF{uE*e!Rondx|wZGduej-a590&CkifOxN$x)Q1oV z2p;IhX>bXxZ13*Afx_3r8)HVmp@6X_5$O}_Jm1qqA4R-ZYhvPyTKwe-`!0QUDOV3i zZCxX&MXxVKZvL+eH74p)%uyU0_D5KUELi(e&&bG;Y|!43u) zyzi>4-$ogknm$WkGy2CY$CL9HEa>HJ-w+z57h2CqNvx6ZPdoPKX>VV)^Mt{$C2c>= zb)jc+(k-7|POnbx6LFY6JmQ-BJDuX(`K)ry-{JJ;l_++6`G*+={Ku%tgNioZ`pFlx*QujeM!v9>L|#kovj1kQSKY=EK;MyRTBT5m;E@yDe|tys@rNiENeTQPI(11>q(tTX<@VB}9*0 zLiCM#O+sml@Ba6>02f6K{F<1Z^$5DVjW6K&ZO9oPf;gy~MpJgp&*FtO>+n+3MD!Kz z`!W+L&`ameum0(J0*JG!O^4jsRvz@vpA-r$6oI?Ftv~dH&J(Jw1t$MNX|pYMjXVSc z!m_GetvP8c-PWq3J;InGrzKEj-4-6LoIp5atZg|B0X%fw9~bYx`*YT0Nd)q6EIzWV z^tR#Lf(P*$ZazC-2zEc%K#A14n2-E8g4H}6QaQHjZ>OT32vQjYz%7*A7=R0#LbcrY zWhZ0AS`V%p;{Khxc3nQ)rO&oEN$?~lMy^=t6p*tqnGG|N_IFE;|F{CN>GmbRw0M9D z7RY|GX?!m9=ghFz!$fnjZC;-?2dafRRWR2pyeJqe16@<(HwxSc`=1;+-IoFb}n48w9;gM*Fas zclg`4W5srhciQSDVtPql`;OsOjz8@+SO8g#W84C{C%U@3Eit*NSR#MGCNo_Qs|cU} zlfw0nn?D&w-n>~mxteA==fKK>pk#I0F$OK#!2{RK+?UK-H~D$vxkKLTxQbUQnh(<{ z9?O(%8~-g^{Lgjq>Yh1tYP>5dYDcly8K)66?&q`*8jT;Ib*fViD@1HRuQ4`_$?TfT zCUgs-BSU-q0C1gGDSByL{q~@hmjG?u;jia6U{-z&U79b(KZCSwt1t}^ZeW;`(m~7fuwBX`@3GEGqz5?HDZD+c z1g99v?pz7;=TwogLd4!A3U#JUcs9)dS4w#MnSvzJ;q#fOFild#F%Lc-tQCUWD#38T#=sU-RKRSVZf_=Tw~SSh&^(r{Pv!GI4###LV7~(jOvc7hLdo{nG^4)n3=t8LbWH zXz3uVT#TRt>QHs|c{{w5LjeCrLNG$Z2V&t~`QwKxmeZW^>6UCc0x{fHKR#5YAP_pm z8e>DwPu96_unWAk^Z`!4$yV~@vBxgd1%CdTw?Aq3Y3nj3dRpqT=3FOdC}qYYi#!k0 zoafzKbmW~$Q`kz&O9o2Uq;DD+Bn?OZ&ncBy`tjo`3@>jXMI%ZT3+mTuV1uZz+^1Tv zscD0^@2N}XfO*RsO~0+o4J~!Qo}vAIDbPkPS+YdMlAjU~kkg1sLDtg4_Npl5R6BLQ zYUhAehu3Y)zDj2WBK-|=AELsLw8-;;H$Miz5$#Suz|pbky)OG@zp2E6)Ow)m%Z2Wg zGunFuq~y}W!XL3J2)%6WQ+`Z~Uw%X2;4{aoSpr{lld8>ZPoId{{GP+JLDYD+t|CRd zYqTm-I+Q`bR>4a{lyT%0Q~>)WF$uWHIj=2R%k`gq$jkh8>?*2v=hekMPL z=%&6Gt-W_&FMeHNv5-94nwz(8zeQj1nD1_I@bz(O+=*a;1;-sgT-o>4ia_i14G`Ye z`gpS(*Y8~$^Z{fiow{`I?p*<=9QI*>4BLjM53!O|oFopT)-9dRUQQ!554GREt9(sv z%r=QXm_xoD?fSe1+911mUEUn0`>*`&=*O}rH+#0x2ChnLIO6d{1huADQHD-z+coFUKO@Dt5N&AC(=l~!wnup^M9wWnvG4Ei|GVu;C zFO;GOgC0^)HXg7eSDcO^ffBx>9Zwp{+?aGi+p=Z*io@#?3g;bs5*Qfx1v{Z3_X4#Q zK(&+Ou6~pjr;AH-f_ml|UD(v5A}AmxBJu{YQC@}M1k3Mu=byFy81Fm68QgK_SBQPt z^Q&*_*K&QiG2`=o&5X>=7w_uD|0yDj-;_TU_m(t^jgOCemBjvT`}sUA?HOiVf^0&R zS_n0(7xSV4bzhZhrW44&T7>QfVyY`6MtgM-OkKrZ=4%e?=PoB>cK1UqO;a!TCW-~`PV@|g^C4+ii64XI^jnD2RRZ>z_ zRYV|D$L{?Q32{TFCEYRO&;7!6?X#fjOL_hjRDw=9)uU}mI6=irs#g%uz4XQtn(DkC z43oxL9gGh?Pb{JxXKc9s{B1-O!|a(GEH5o{sNTMP!-q3R&;S3+D?S5UXazg_^@qF5 z+zZFX##nKZLg#h_HqeHAN*NjzakH>vgyjVczzIat@M2Lk^1lu+^R9)Uz>MWv&vEBq zsCxC3Z!X-!;aVd8L(dyW<&d}Y86o#yJ{jK4kYzpt+d>`@7{;B@+O!4?l~{YTFg!pF zMor>`!se~=qNQB2AB26kU%7f!=b_5AaD_%=0TB`Pg8ym3m#P0|U%~Hti)z-)d{d^G zuk+~7fsROmo)EdXWAIUEXQjDg)U)>sOOmqxtb0>>9+rEuVO#U zqaQL(o4z>xd9v&GAxuYJl-GQe)U{}P3c!&P&8zTjXKo(SUcoT7&8cUFsA0QIjO|Qb3-X%lYsfPiC9z$OGFk4iJqQ2lqJDKN%l)(snQ^sIRX-_o~Ou^=8Z4 z>QTA3CMW|&ndjCM$`y!AFYmq(Rt|o^aJ{^5sG~O}RpytnYjA~@99O|0@XTe{Jh`aY zY|-DI41YS90lL){k|)?`Y}P9@df$i^AFTq5+u2GklTM6p-QQtJ`-;k$6agG&X`9E` zQbG^Wtim0ep{(kuOz2g)e3J9*CpyL%AcD_ zt}9B2k8hHV>bckmiBD!$R-0h~FD%zu4Iq5O%9G|R6y z_Eg_}fOG$R4ZN*{5BeZ!hYmH`YiNgwa25ZIKs}JM`t*&NXP#p~fBhB+YINx| z!SY=$FfXs~ud172ZJCY-fP-%Iqp)w@cynFJ$Gb0=o(c#Jy#=WG2ypjhuNE)a)TI&& zuM8gk(PDAx7|WjxR|=KeH4O*oUcu#GCMbT$?Z2N3fBL9o^t`zrE=T%e*m>WAQyn8c)~ppjW+Y#`SbVv zLmiiT&iEXPwoj%&JUndQtGVrrkjb+4#oQh6K<{?-$<=T`i~SwQ)Hk>?y`aY{i!iC~ zyZDY>)g)XO3m2^bv#)(d{l=B;4Xd5@bd>Y_vM^LlacN%iU_mL9t%g(OH--mmJtb() zw4Uhi9_Cz8|80YtYI67-d%@d}lx(D;)=5jVq9K0=;pc;yrLB16#~>|9iqL#9yWpJ9 zg7vm{v-VeNRQ-X$TDqK%vwJUqV_XIGPTH!J?S^DAgC~7u?%8|44ud#uW#zeE{!KwZ zVmy0QsLy2U6aW7nVsQi8nO5!n+8KfgIHE;2PQLK6=)8! z&I9TS-Lpo8fr*Kz*|)Ecr{WRD`Dhni8J*NIGzQji7$D?wcqCQZGhIV zcDvDkd(=S<0~nN2KagcZB-=o*8HkK&a28OMVVp3(fWU57EjRI!qXBQ$GBGhZg@5Mr zW{IpI`H%KcIJLu)K%a5j*#Go(iMz3}@mtG?^XtE15SLZ^U*1jC30|p0dy{(|5sGdr zb#!z>ww&gI{zopdEL3r#Ru7quQUm6rbeyCha*iM#$GR?QHGBjFFkHW5M{A0Fab}W! zBF@uSbdiU}(BB7zC8IUZ?0LtkA%nl+&$*;pw)7dG-4BU+8wu>0og(7kjI(Z2xUb%3 z`n`J_6${r`L>0RiP7ew3pFAWi9j_SN(es`AvkvXRJZsvQ-89vP>5I+jmbk_=?7g(W7k-*_!WS=FWt=d3B3AJxCSn&Uf#<@ zLAv3^nHDYps2>$>e*`%`ah(0V!DAzxtAc%Wx3eAdcK!Dr_@hV3^q|}RLcF9g`@9$d zpg>q#Z@ICVTghEESjxiB)05UBBe-#+CFGOVtyGRYEDS_hfOb#krDCiyA(XI|Fsh7j zHvUYycJ15RyOWcX!C__hF?f6(lAN@+hUyA!lNSI1f`*1gM9m#}ab845`CjFZnLVE@ zfhILxEkEm9c*!MuYp9EqlA*-?d7D^w3VWWRbukv#O8YB&u4T}=mi>MU)nuUm|MW~_ zXmYX`@sVMqL6gwXH3m$mtjiG(X4A}4I|=Kon3VzSglB}Pc^%f&uyE%Uv>l78{bOSVa|HsH`CK|{upw&TqCu#AbmwMw)?DQ$?{j-GZIJ{Jwf*}K{c0X} zIg$2ER5ikW@CK>ShPjL@bh6fsar<8iO6a>&a@K40cXk?gin1AP&%B;_55zqEXdVM0 z@4cw!-}sbiQb|txtL;3vURwusZ3$DvfBg632W$tT`s~P?c^K>G1E>kyQ3blm9!($Q z_(n4j&OKY^%~BjN3sQ=6%PG#=-rf^_D&t!#vsdVxc*e%u@Zb4^wr+VNJpxlh(A~hG zMAAH`{rp0KwuJ9#A(`{BGF)9U&~Y=x4JAYR!sICrP@1mr)o+5f1&*EGuv-H~JyVAUjp=$uM#A9E>W3Fr z_dlBKzX+BINsLEvP9?dwQrrYp1riHQ2dKd%=H})=o3A1=6Vnq>b9q!^{T{)D!4)eJ z74f~>TS&f%z?EcyDFzuFIBFp??VG`$$M(9l-=C9qhGr7;SUf?%bMk3beeVKVB5jBM zSF`B%o6Lp9plbO0g#>{%k5xFcDB>3zCvjyb^wjr5z&ygq!NJix&9fR$Rfk8xnFWKG z;gfYm$7O(}&%CDh%$wo6Op!0qAzW zO8brE3Eb7`GWqYVva$xWmz0*iZA_z1UMoU#^AICT(utC?vfb#G4Mes)f(?Wq)&PZw z*#M-s3U&f<4nZxd(xi-pw~D7i@>|D;TDSqel4jrvOe}5aT*Y96JmZElb_Du}uVA0v zqW!snMbjUAjl7a|gKqgoCnD}Er}6JejiHj0-6z=K6(No~oO-8r+{@4ZT`?7ap&kD2E0X8#kS8#XKFgBy5+^B9#GK<7vn`I=Zl+9hL(L> zlG$V<`JVA$&fwO2jpmM7j3ZfPzoVGgQeGTj=a;!n43yu$e@8F*u=WR8gs_R%j9qZQ zoo`h#Fu%Qr=i!6PkI(=eP?}(KaBzsNf(+~fkP?EfV2a#({CI5bGP6A{{CYR_VVv8w z@_Y%Ev$Zs5(SNWjtGv|S7S*NvjO6fS+sn#V5BW{q@J6kWO$-|k+z;ei3#tuA_(P}w zi7lo4MB43Mo~XuCs(5eJ`IO3tSLxGJ&4JStFrWt+ZcF}l!UVesSxg9`B-=cGhEn2i-0Z|5# z=@@mqK+brXM%RVX9y?{8&h9oHf-w*5ihnD`X(c57?f0>**MZrbO5OfKYQgL3e*e^z z-)A4vvS~d_;0nGZTG2W0izZEi)-W1QmC3(pKg=+nA@fK<1euTc2aKM=*PsZ;@{Neu2@$JVNtoR>b$^os~_RcCpGfp&1OIYjottLE%~g z`^j|brH?dV-v~%a9dN(wU9PgS`Wk!XYe<)ZBFAsOU|Y57DqxMoXOQMnuieglAqKCB%lZ)8xgq-%&e~H9;zYh3(=Y! zejzF$k^VCxgK6o~_t21BLoO*Z8l@kDFWW{CW&j4_Q@rni;{;X0u<#xcm76HbLY7yR z+LKn}7m_D)Qu`irXVSja>pZ#e5u;iNB7?h%##F{}jRFb?dT>8@~H1?Ql^Kr&|&cCNNrX6xgz(b3p0 zhvU&gdvJQbgPQ;#o0N--ORm6&)9{lR^j)YtE^`#UHuVGgE7lb&9_)I4p`HKk=-#f2 z8-X(Z(^(wHIs4z2&h*nWE!z|AiN+Ofh^I#HJ}m-rNj`up68xNU4F`I{r}ymL`dx(wYvontqPg=@H6e^GEvOZ=@|`bmiOW$Xz+jgq0}Yp$#S_|dEC6_& ze$w%(9j2ng2JujC$4i{tEV(1kAn!CSY^*B#k8f{LmyJbl%c zF^6OFqyE(A;-lv**E?u{lX?#_Ij)c}E$KXPu@qs@@+!>C%>07&`~K>VB9X5h=v+LtktwQ{)CdFY4KqJ^NO#a@tZoPp5=G6VRLuTR8lA-7A zW%@-2N?0$=@rD|M71x&(+;t{Se|P%T26cfF`;!LRN5$oZ#a`Z;KeC)=C|ISpeCLa$ z@|Cm|$-)aw8aKgX7{HRU=}$YHe(nv2jyyny8x&M+8ot^Z^j>bMRXjZ6imGMrjZ{~I zLUHmi2@@C++3A;rHQ>6Q4jBjrekZA7hIIzZRQ)th)T`_>x+!?Kx>#Y`|96nA0o#%C zyeQEgx;DV;aY^!Qdrvj~T(s8X$W4q`FzbI%xN-vG`47>1nR78Ru$Of@d^KQbGhEFt4jj`;ugY8+sdfCoN=E3{m3(;5x|m~zJq}MwKkj& zUWwcTP#Vm>Hf?#iM{h5seZL^>mjbZv5#spK=~E2QDFV=e!F#pQvttVYcAeTmnV4|J zYlU6`+?RYO*rx-CIk;M}YPtP*t6M4zA-;q%yRfhQbmOCPb7DCADs3CsaWl`q_K7J6 z3_4q?l7mMlcN|-O`SN8IyN-y#iCgc8Tzo)?&p}AuPc2@s`%a&TkHpf~6eAFVn=5!e zmlS4AsXP`;U@w)qpJ8u~M$wKGReaUHrSn8PNJ5Be+l;Xx_K$fPa179UtK=eL-62mM z2&R*Vh6a<2jLgAAT_NyCzm5XQQz^P}{rWd#X4eY)W{w)=7~C%r&r>+x7r0Qp_WWpv zI`yy}szN3RAAM_9{0g1-VEn-E79Qr1f$6e{dFwv%cgd z#pjJu7&dsfikv!G%BXeCJ>ltLb?GCO)e6_PD@GhQZMKuA-JaP0uQXH8vc1r^<{Go@ z8CUyn@0MWhWA+W*ayrabNXb^XYKo1jII+1Y2K91y+F4dJAisf9qDmnH(s* zR)d0?4?ptikMveD3619^JrRk(e;^y8WqW>aH*JQ=kFtSm`?bMDyLBOlXL-W1Qd9M1 zv{*(?<}cKhc9ZCVUz*O(8q8@2nEl*XXvwE;-7Gf$yBnk{OIPyO>^*YiL2YJEj$(Kh zLf2MHmOL{O-xOZ4rJ`Sr6j=iEld8DT=H{F&a5a^pe1HTaqoXy#zS{y8Y^I>aU~h|r zSp+2yU^$2R7d{@I$2wfmrXrbfhF|v4(k4m(K};GvaH0J(Jw!W5ZP=hn$UF`rY_4;- z*?Qnqb@a7|L+3F%j9u-gR<2%s?Kd)<2xm+{B7{LPzkmOYw*Wxs5705+L1)_Cp^qOM zkD^vrd!X}qW|N0D{SiBXqn!#f)RYmDm#P0+g%`6BR8HP+E;-vTNR&*o*`FR% zr2X{;J1gsDXef*>=2Tlm`Q&YRUmX+`6u&3-W$sE#Gurq;g`0(Z^S`W@KI7lCi|1V` zZ40yCciO>^*X6gW`>Z)$;6Zl$9^yZ7|8uMuf-_CD$NQ5#+iK>TH|ngH2{p}IO9-5v z>{=O}pAEsl2mX~%`k?)_2~lf)xVzK-?Cnu#yp|(2uVuRy;jMkQ6IuI5DT? z5HHZ6YPh$(2uHvE{=M!B=e_`A8|pzvg9wPQ4BC zf#cl+ID{}>o(|K~HcT;lgL4R)DW^Tu4g$GAAmUroK*fVl#7qJD(3VKpE;P=2pmxkm zD*dYUfX*%HINBvWg`14idyi>JaCa#%?R>$%Y2{94?k+)o{*@1Vcs>6auOmoU0HK)` zD=R80;@t!U1g;gGY7+c-b|@3j7hpPmSyiX4JNVbYhXsublp)!7G{xXNp=uT8HHP-6 zyaWFXOqrQ0?pb7UrS(=~M7t{Z=N0|)f5+KSpn~~8dl;?0O9OweQsgq!Y+N^eTF9jG zU@I}_!}dgPnmq|D|GI?uI(ZH$^LJ1vPx#rJVo9y!6VP+8?Ee8h$!FPwV8Zr+u6syH zgDdfb^HO{4cAh`MGqzMDY{~PtjzP^(DZ+y0&hQe2#0R#;|DI6^!@9h%>*pQ#;Od<(+cfcf&Hl!klC6WT5y&hIM=;zK_KQs)>T2k`IDP%a0N0 z<= z{d;CFd5eBGF)ehOp|;T}?jNnE92{iedq46q$HX|}ROmi@9I1$vELraF!Se5)>qm9_E263@gHzt2@N(@rpM8l9vbNz#u0 z{x)JEcXitXt-yKE_s5(cfwnebamQHGL7L}#eUAqB-GQTz5E3O2DHRW??y zTX8#Z!F-iF(c>pL_UvSRw|CF4qeq{mQcV2(PuHyzzR0lawaPx7J1gfg)!YhPvEt5t zHS6^y5HpsV&>T+=l}CCFce@RZJ#M@({Ed}c>kyeomO}GkPri0y3PAr~!7`4qlI#C*g zf-ZKiV&LLCSnS%77KnCUE@WSU#%Iuv#!aBUWj6|HFSOzx1c8ZHR&HxDwZ$QcI}rjC zrO}lfLi~hMAjz2f^VL9HZm^ab!mX{@j>VCL!NVv_1V*CJ&@2nv&Y=xThfMQ4vZ!8% z>)g0qp=BK2g)pu(Sd6N?E}w=B{PE+*;tS^g*e^t!8P@Kr9)SEak#WIC9Y=>3&NT+J z;iE$mo2k-1H>8m}Bp!){=lD$3MJVp|x^LXL@k%MdfY_K3#NWg#&}Lf`dkfzpxPOdf z9Kg<-b=cD?j)Do`BGP4@i;AZ_x_Otp_C4}4wvK*gt9(jM?0pCJ&L2rB^fTv=n$crV zv!5)nn`brmtGJnIFqvD(hF&5)rEa_aR?=r{m!TKG$ zMhCN4|9^H;r*gsA-&4>^FHrb40NzQ;SppH+S`%uGyBm&G^zyw)o^Hf3wk^`_W9bXkM z&SXzx4uC^IG4Nduyk(g$%GQkLAzUdLd|DG6Mk#-~Mf7{RXv&mA%5w<*7tUw-o`28Z z7x(1?$!dBzS3Cocd|FOy;XwDTlv4xk>Nx!~6jbi(g23FncW>{zTdT78ES+~R{*ea; z-LAJL&h~T0lNOzn5P8S=Ug<-@9RxqG4M7XtKT&Tnm8fk7L@y!jWW}$n{ZI{IKIxcj z?yjUFH=oaw%Dp$TCH7Lm}Fn9ghQ?o+-y_R3NU}Ai1JNt1O?Te`7 zmU}OD>vpzXw7(J&cbP_udMhP`%fP6!rdbYgn(dE;ONc~iW^&NZwj9Nt9Kc}dDh8*= zh%&ClzKGWZ_gd9ilBI~bIuWnoAV`wz zci^`P4(_TswqL{H?*lHT7A}QY(y}m9G0&m1l6jXV zPfGV=x(4aO{NvPyk*zs6DKj-@yzr$Xrw82@1eFR2Z|yjTXta^*@kE-u?7 z*;9zJ!BrKZz=o~V7m6Xd^3ynH@{aH=Kg}J`Ccl68&Pe8^0wx75Woqikepog;ySo!2 zBASOSA>?q45-nMyd?}}e^~~ZtJ^6)SRKF(*8usnfRGVq|CVps*K;mQO_R3=8T89|T zO>T2m>KDXArlMnaN&1LM^ybqCeh=dI#XnzWMMwuR<2w1?PZ@A`+PC(0ZC`1Y-NQL! zexDt?g^0VD>XimUq>p1_Q4LKOikZYQ|Fu)TN(-R3dJIc<6EEWyGXC-fjPhYQJrY7#IcHCi*?jlqZifz0GHOv~=-BdsS7F;8_Vij&#zE zTK>4*B$!U8i-#&pL3waDIyzd*R~{dfph?Sx-uhM!sKnyAy9!gc5pHRs>QZB_=kBUoaoTue1GECrqY zFYM~~XM&ps0G_^93{OBwc?^)DQZdD|jHd$dgx9-64J6`u=-0EhO?t)t zHVWyi+OAVEomkUk_U-zCP}T@^SU?QQu=Elgab__^%;RifQh73Q5!<_Z1t z`@R;FG|PN|IILHeMz)ZrNcw83sT~CEF0_VBVyh+1aN^;wCx%)~F=_=LA2|=5R9|CS zLN768)!+nFy0ds|HX{AQw-fsdp9V$00Fl)vq|_dFVQDC@syaZJz+QVKPgTPnI&gVU z7s8}8ZY*EBMJWa0(tK)+f1iDh1f=TV6KmmX?D%vZS8_aAvTB1-U|-*{W5={2p|C!- zT&N^B;l8^Dhosq41=aiGh_?&b-ZrqEwSyOLJw5mFaS9xDQ|^VAiPDHbLt@j_IC+y7 z)(>$4hVj+sQ`G1BM-uS2K+fXZYfnBJ=s<~*6}-Hs`#daM*AitoP-!HB+3qQ zG`O*fjYH!3%z-!Mp=iAhP;BBIdqYD*QJ!BVN`q4xKgiV}fi{V_c~}abTFv41o4tQl ze+q&tnGg{qtBDn-8GcM?!vt<;v(Da@&5G z9hOp0Im6nhUvo%(%9x|*^h@wFW~7TOTE=q_ZiCZeH?nn< zrXr@5zqVyLCXhga3+pP{E}(x+hbP^%D^KT{$wJS=&xOw4>)0>x`LqLjrBTQ}D=i0Y(2q}q*lwHv}5fnTgOhvpGVHP@1XFImrZ@xNr$Lw6FoGN|ep`TIo zT7$~&II-L6VFJB&>gS&@S?NBG5K>dXB?azHJJ#l zvOyVSPnf=dTW*pdGdbgKhKb}b$lSljU&O+>>2-g<6!3{Ubj-lC-z1OCMdF<#f^uy__(qG)+$Y5Sob8*%%1cCx#izk& zK^VYP4hvuzY9!*N*Pa-xasA|pe#Vll4Si9+XHfzmRnY@DLSWbBvDq2OU$jI1{hIh9 z7&EeFPb7LB)ss8K2c*ReYK$~j{ilWpFuhg>g@>;mly3@7Qa4XZ-nlQ@i!Gm?U=D-vO zlrjo_4ime$wRH9nhWkqG)N8xw5RQhAmMxF zu$*f;npMFL2Mk0Ei>AWP@tZ$!65l8|YU^{9(|x>pU+$rfbO^kG@JJju{Vv3URAuUn zfZ)aBZ_e}3!_>Jp_TGs-P2Zr|Czco)+vhN}F!A1BF+p&v*PM;n&4|uTFH4PiKAP4P z(YI)B=ePNmYVq>h#OQ8y0f|h%ptnLT8*OgK#yA8&@d>Eit7{V|H23r4yK95~|>Ap4<$vfCyo7c_n=b``y=)cC3X;goyg3rePcWm?p%Qx_A8 z3`jfIV?lq^fa^)gm*R08E97@Ez)gHWW)CR1G__ovGX%n*3)yLlXfbxhWe^H>N0WYo z-uwVg%#7;-<|?_nxE z*XereWesBuhG7;B`gWTnau2Ef;6?@5s&oQj(P1)Hw-?pS*1>90`@%*KNO-x}*!p2y zMv*y>v4Sekf{vJ+iijgfTcrD|8Uu43v|jhvHDKmSL8u^|6+`mkF?0_=?>CuL` z*hmL`;d!J5+ZNwhA56vn1lU2}>lXQ(N zX`};UVN}FL`4Ti7M;o8ogffC3YQaek)-*tgMs9=H4$0N~#5rr2aA=q6=DoX8Mc{zqa!Iurof;2yOQEH~ zLNTmy6H5#}alDLMpIqT8WMrJ_dq(oy%u6O9Rn4A_py2x60!>|e zfEi@3g~&YpR#O!sSn&0nYo`)-W*AQP!-H-%m#!(2?FS&`!u6i|Hn)l1k3~Zk@4s#* zw(pPmrntMMTPb*>m{{31j~`Eo-NX{#lzh8m7H9F3rS*)TM8NyuH{POcTC&b zP=$=|_ix2f;~;_zqbQ;d=farBS0abd@0f!RRf2y%CQuFISY#{t_(Ocy*(T6+!DtKrHa=VR~3M3YE8m6=c{XL{~A;JS*9IJX4ki! zzoL20@_GwhGj>UKc%MY)vDo%Wlj+&y*c31x9Soq(~m&hEV+7StA`v-H(O$0qaQv>4YI`j|i+;KoVeC}wwSrH~J_ zAKaJ;MqOJG-AW|U*|sI#8=1uss5v;wAJyiEZf6Y&{G_{aC4Bq7K(RPsqpQEj64+rD zE*03pdHv{%Q;juo-S=^A!uJ|YDdRlODReA_xN<5endO9cyl{!Vf9fBSmJq~w;j_hww4 z!|>7{N?cCp4>sfcI}00Gg|PASSi{@rQk>a@55A6hzaWcz(-_=oDye)O%dmbMY)V#c zsOhFLXc@D@K37pyRgh>0CFZn>mP`+x+s31cLEQ(WQ&3E8m^vuCJ!83K8haAY)a+xOdvF;cwc~!LSK8UX1 z2D_(<_)4K^bW%QOs7s;xi-MDBfhKj*D8)>^9l;C19p&V6aKp0Xq~H=NW95T>)-=1} z%_f$1h(2ZDkvj&rhQ-T{_a7Iq!=w4UOK>WQjQ5tr=Kq zFEt(JJjlXxMX0VXIt5MuH5syHXde%^?&*AqwZx?g)tOb+rQPa&=~%ndpx=Fg-FNgg zLvh@Gi`sa969NTnx0_-nA{L@G7=+JVuuMb;c;U;?uU!1h>>yJ*(dv_{N(-UN)lPj$ z3XHV-xOEJSG-ta1e0&sr*Pi{qs&FZ6bE)xzoeb^J-^w8dtEXlbN1!bHFqXtnUptlp zC^bI64NtFohjQmTYf$sIzjNNoecMH79n!`q@X9p=ra zZC3;V*pVcURCa-Cpu2G}p5S-dzl@mKipA+jn!R`3Z!=@E8 zk`yY;0ei@+6D$ExfzIAAj?xH%95V*#F+q}tO<+GW#CZs|o{f|95#a4ec}LaW-d;mu zP%wsj@e}%A%=MC;9Y(*CyPzenxUXaiBr(|HrwQ>@fNv%l1*N5>4%6Go#oPIF6H-e# zH|+$)PA+Y%!?gx2xN=k!AXiEX6e-ja{Oj7p+JImE1-fJ8^=3zuXaI5ffFo`K@kg2G zBgv3~*~J}KrRk@g&_+mu*&laFQ~GLdZm}B$0sVHrfIQ*d+@s&Un{HXO>F$*VIFSxK;g1-^y8V$$o+qbj3 z2ogEinrlizlJaIpH6<+ang^%8gUukFCg8p^hZp_Ze}Zq)o|~H^p9O3G5jN&$-hFhK zx|Ov-R&(pq~(r@F+ouP3~rm*Lg) zj4wi#1l*~&eS8A*^T!TsMj+V}Q0c(_cY{YaM3f(SR-ld06_gBCJ%is;4(}9wIF+ay zcia5pghB3TsTg%(2%irm<~Br)?k8j=C@_6=R$~3})Fso6=fN+>d4og@ zqw(#5a_3ApxzF+XGTy$)^JY+o8WPM6bhe~LJAgDY0+5lHU}}Jw$Us4U31rC}o^C{E zlLIa_^|6F$x-GedFafR2%eDJJabPFj?Vm6lB8dVN>Ol-no=n*}5OraSZqG?<5)MUZ z9(JL&W@9uoz&-E4mW@ctZDr*rtnu?`-3J@f_8~B)9{5=Trjz~HCh=Vajl=*gN6mTM zlPQpcPc&f5>86g+raY`XJDg@=J1%Ae8$?4YhQ>VE0Vp&mR9&Y!Z^Sh8@W9J~4yWS==;=SOrjCgzP+p#J1PYt|+%ego9 z+Q@s~9mr7C)mFC@Jf9)Y{Lc~KsVE3e7$A(s{{0!qk3tNL%}_Iyg$X{RzWWRWOwf77 zqN#pm5GbII84Zpz++i{plnNM76yYtPn_=Y$!37(F@*M542?_mh8o}9j2fTLwr{?>U zKw0*!S+j;b#Lx9IEW5#I*MRX&@sJP}Rs#a1i&X|P2E?xo|pv$z8T}KWsT@i+anEo8-62mkrerhGcPEh z=MT|s5uj;sAb$x9OD(iTt2sDMHp=})CU>^N%AAT6rkx<4o-35Dh3~@-$geF7;VcE` zrnl$+R{Y#j<&?4!8bLIyhc3@spt$A6OCCkngOK>tqT3koi$+iLquFuQr#?XTc{6=t zPjFj%y(LAiyC4|kraFrt5j|BzMIE%Zeq`AFE0;tHp_GOpob_`(knn~e-Q{PYqN{=S zQ6G`KspZHfN&qKt5QpoTvo+}#e>$H=sx`>Tm%=R;@a+@el`^tiFbo-R4Gxt$$YSug z3!m6Q`)Q4RbY?YWa`*sXmkIdx5ExICMotI{Y?5+KO1>^Uch*OpkrO|za?ih5*1cEY6r=m zd?~RT1&s}S9s&#+2KO$boF@m2Pq*e!jWu>nZ$P_{nHem$ob`uwWvNjB#Bt@qJ(q@E zb3~Z76w#m1!=!b%BY^Dp?uS7^z+mEVNC+z`Hjmb`bzB6QR*Pv5$i!M>=L&qY9!w&^ zhlfpI)0RULJOQKI9sj;jTAMDqsa!-gQ++rDFvqpnr(n|`awm6_VXkQ6?aYQFHvQaJ z6&UTRhlHm~ac^M~0qKW0N1kHz!7p_H&mEUeMh*Bm8lVQ6JUwz582RZ6BBzJnRv0V- z0VAInm&49cgQhGAQW^L2t>~(H!I}{ux}BPE3w<;%hVkPd>ysr>G7ILg1v6js=F%h(eDSQo$AV| zFm`BKzpuPn_Bk=~jPvI|3U z6Yqi@rC-nWAi7f@1!&Okm<9sdF!rV(roL)O_}`U5d+iOJA3{ULL8>WT6WJCwtJphc zyFf!8La`h4v)6{umn?j|9XtHiooLMJzy{d3u(+xR@b7(r_W~6Jo|Y67hvZ|t_$1Us z=Y0Vk;(CO7MK5u}CD05P@YIsu01z`;DRiql&Cl(u5ulfr7{@x)wr(@zxi_8?J4(-1YdUKero3I! z=5g#K{kDd!kWFl?lJoWK+ih(H_k`jav2C6UT@>sd`@Ty(dBAs!!&Go-u)b#HxA=OY z!8AG6f1U+Ji@I~?4r~sBCi zir8XMf!0G5=MCzyK9K(bzjBf4rESp-uK_?H(!CY zZwP{frKKqy64a(N)hwW#pYy#t9}@R4WI5vA;AO93X7_?IKuZ&k|26RnwW0U_gceq~ zIEx`j%EDaCFhw6%4B&$Z8zcoHtg2Vf?xEmG`Fda~vZoq0Eto&Qfww!GWP9TGOGodU z!LsbeZfIZhFgu+tJ124UD0P%bEHD<^y0FbA0g@sl5NoCSad?%i2eD1t2 z>u85BrMZxnpfB&Oe@w7N%qBY4A}8W&NNl1*aLgXfnR~HpQYSa{N5{s|?+57bs#FO} zq3^i!VpoloRJXj8&HdQQnKq^I$*F24W8hDjX^I!VDRd7(1fH>_<;z( z{}n|_5^0F>q?2GcLz=jHkf_0Ph1(#U97M(M~k9W+!!(pW{qouoCJx-`Dp!NW&{povwr>hm^>2#rrKpbN3 z6kS8zeNUxBpeB1o`{@gvIffU7>VnurM0QnP*rs0NLiaP;)@Gw#CX_3bm>w&vK2_po zG1jLvn|7Ms8mMntqfO_#D|@JB>UoM+@g1jwHT>#V37aN%vid^-eaFni@0Vq~4s+sN zliN-l(E8_Deo2MVC7zUX42#q!w0(6z#Lz{*8!|dGhHy<>`529fqZa{ScgQ{pND+aU z5jCY2Dw-ISi6*RS)C??x)1eB;=R<<(Gdx-{+?dK_l9`Z8`j{7C!Ccrv*wETxNPh&# z83&YL3vdv$RZprU1+Sj9YowmXp|U^3ScT2M98UE=3k%mPz)bI4^xuwU7d!aClSrxw z@C+PtJ7O2fv5KqUK4(-tc%qMaQ#*3Ifq<&dK|pt>!6}*P0MH22Y5mbCK!&b*n|A+?V0UEcaV8(hw;16V* z00z&X-CezqYkb4#TLJ( z&K8}W>UkV7HF`6)oj$4A6vv&)(&-stwfpX+U)}4}I|bhtyHRT`JH(lo?&uroeo5_) z_&G5vD?i-1M1Hu1RsCm2P83J(_kVYwCwCBjJtEEk>P2chhL{?7B@&6G69bTQQCT`R zB1Qupshp83RUDPG#-KBZd*2r~0)TGE%z0zL&uK4S2JT~z2F~AfiL$_L8woh!?cfyU zlC{2r^Z&Tr{eBUgs03ppWPzJ={qAjeTGqJ332Q5eV7|ONJR17fKxiV1OPWBJyyo&>Ch8$rw^LS zNDrOsj!JlQRf=OiSP^l!DbMvHW6?| z`3XFm73cMq?{n**ZzuW*PRz%KK~p~girk!>>WhP_ z2D3;Vl(wlAOX?S(Jx8lT4olG837GC&ty*E9=)uf>=>OPz@2IAp^s@!PyVl)*kj>t+r#v(Bl+W|b4Dc?N9+YI?1_<2Tr@)g?C#2nrM?O$l z3L>E5eV?oz&(-`DMH}A5w`R>5z-Gz7zqA3Iumy~v&j2dR0z13ffPMGQfS@^w;8H(0 zWIdA8pCAkfe*E_4H=5D)oShayumQDBCZz@7jfX(kn@5i)DSMH%xYz=eaBYAj;lbIl zTed^nFBwK-0ZPgF7X{X`a=0s~>myFICWyc-dBN!*j->&%a>xd77FeS~qMgV&1B|P; zz(gzqpK;D^`rNEtF>(x~Z7K2h;yC8co;?fBcT|lAp5BZL^-rGaLggH20lW(K@Pr`f z$2cwf4m}tja$6o0QcR%pTI8NTxkbUjj$`ft^#Lcw0R+HlBVeqJMPI@KNf!#@yTFNF z*@u902FSqA&d9li1uTI4gTMg;S8B!m-vjT3ySyytDOm8q*)WU~a|vd^C1A~R_zVb* zdz6^yZg?pgs_OgbQAkMxVM3fO_&|IOGw82Dalk>yfF}a^B?r2%!8t*T0`}IPuUJ~p zrGP_nB#O%m!E%pF9M>{9TkSi?@&tj&pMlAwrIB9McP1pHlyi<7h+(q;nxsS$X+NL= z8N{-JjWjek?p~YR^HCrkMGHC@3zBn!n!$Nr832o#VltWUwI&h)aDN%FFU~MO6f)}_ z3c5xjUIu^yBoF{X!;i|hR&_M&_(ocK@;&k8S(WoYShd>tJ@}melGYJ3lZ0GARjH-D zyT5&>S8%pV=Nz-GQo}Wc12_aQe5}EFXW$SXC>00}K#zWg81T`UfqDa1TozDRzosR4 zP6hqt#W`9?hxOe&6j&M(J)xYy$jbnq2iOi4fG-)q90sjB1=gmw0Oro%8~_8XC~#V0 zB4QYgMw5X`jRQ^LxXW*&(O}v^eqfIa)e5__dgzZSe-Zk z*}VM-0s>s|kG_HkF%V7<$B`7^ukW>~%7RmCJ4me1@<2U`&KCCDIyO5YzXW~S*+7TA}Kg(Dc~*uBjhRAOd6~N z7@PSL1LDQOiB*1hFfusEon1^lh~@z>6*9EEq5>*+So($od%Z38u|ZG+r+dmHS6m$7 zydaFi2EFg)z%9c;&Vaz=gm2_Rxw&0ej#`!cm$)cL1eE_Z!f|Gf9ApSY`~pE{Q(lw};Pw`d+5uPx z$Cl!pAeIjnHe7IV!G|;gPag-(;v5SG>?Q~&_DJjSg97)CRDe-(mQ>7xg%DRjIDq*8 zSjA-l4qpO;-2{j@jwA^6Qi1>r>56^9Ia}cT(9>Y&JI=HR zr>SPYefw7TF5iX?7QiwGG*x^oXKe=fp9N?gK(^8W%;3p`Gb?%(%$HPHY(1OV{lgoSw)4{Zf~aS{wo3qS;*?5$3aj9`j`?b-noBLi#| z1n=koNa-tZHF8#@fGFLGNQNo+99TV;Z_d?h21knl4_ija+!QBz2n3X8fk7%N8RZHA zcgqO?K>bh?fj?`MlLf#O!RoIp0GT?fD*#;rs2c!-F3p_*Ck_0-j{%zm?sfN&%@a>J zGaIO>9ITrI{R6lVocZ+)%;kgYT^mmU0&Lm3HH{M~2Fgb`+yQN`4SpE|LX$Zi5+Vux z@NQ0ULc&GQgGguqI&)$yIH(|)#CyTP<^a)rkf;fP1zhg|NdN-`G7148IuO$hPd&C4 zj8`MzHX*g~31@P)58{vkFj7k!n=g-V>;Rp@LC=AR0l4#RunY%`J`RM*!F5;M_XHFe{`*040I)Q3_KpJ@ z8?_-GQsOM^1i_IUYz_=LfEw=8(69j%H3v=rqw&l&vj>+KPuz&7J`smqOA^dA#Wka6x`$l-ANp8{^5AYf5Cb>cSBH~Qck}+Z>*dTn&K=LJ+$mph zBf_I|=l`bqKaCR5kA7Sk2%MYVrH+zLD{cDK=z*Ss$PI}`#Pfuk&hERlc!r6G1N){Y zxVR3)35M$3ihp;pg~yq@DkJKzK(1@T`lmNK-<>))b#Eirg;l2ShpmK9dT)BKlJUk= z`mX6;9fX2%wLN!(z91d_NuiEQv=E)T#|7WkE#b3!0?CI)J}}ddL~(N!vLADA=Pqn~ z!hMSC=igXxzZq&JcC7@w{;cirl}?XB6wsJS+Tcz20NANx(F5B0OCT(_$S)sEW}pB? z6uW{)-kX9)B$i+O{*}p7Wd8n-a~Hn7%aYa6wF}&~C!gR4Tl)NQ<%pIo%z_z6=$&cO z{^R+tTVwrL#mC$)Avb5*3e529RSus$oK=6-)$xqDUEfyNwx=NLf4wq$%BgFGnz#wL ze2d*922%pNK{-J71pjL?!rp@0gQa7fTKwCU_htW2MFE11af6LYyZ|0C(xn7aZ38RI zBZrfh(~tQEW1NvO;NRXy-KO@MOkkZg1;k*>4{`2b5{hB3<{uUt{7jzMCy(Qo517fN zCU5cN3V-eaHyDustt0H4gG85e{PCOP<^f+A2Je0b0RHjLwnOvZsLXk(7LP9e6}aFw zNv4v2)<|%mb@}P<9O?soP;~A#uLk9fzaDO@tRcTyoo(p)WerTPJ#K|aT9t|R`?b$T zAV)HTei@zM3$0CKNh?WyXPbC8_WmtyCgjoZkIr;D5(_6~m8S=}qq--7<69dpj$>oz z?NBBt@96umF}eGkaFahTC%8%W3_>9bm)VpQurz|T#R?$k7`Zh7FeA11;>6oj+U`{~aMfuo?d+ z4RS`yo;5<=jR{!3wu#aa3rSqJLui{wGB4rM#($enFxYTzVURP*jghFV8*GB|KpCPs zo~CRd@cgrJVoe#{_GRT?R0pD65rr0{1fNx~bg7@CbEPpbSZ3#HvH_L_DbZ)srm+>+ zWOe377+d$Bq)lq_P&zTaSR9$yyVirI;YHg43(@>%GW#Y>w}rhr^WMXN%ZylZa&aVV z;=n&^hhIF-7yx@@t|C_;QZjVxA&PnE_;=UPgjmb$?miMv?;-bp4v6+GxU8_Vm2*{~ zPhvou{1MEg!Lf%JEJhOJU~QlK{ljUm%x;U&p+maA1~m-kq_%){=Cf;S{BzhIn2CP( zhWa^PCHcd{l6Bcez%4a<3UyD&iAmFO>UZogI zRk#9-_QelISkwJVib?o5JM zxkFhl-e&^|Upzm)hgOmrMC7F0`Oi+`udpifLX(0GQ45=xW#`f(VbI@T>!#(Le*NZn zs=}eNVONPPhr;Sm1pWI)SeoEJYS{Wsi7e_8G-H6#l% zLo7W@K2yRr$yOT|G%<@R(twBJ@T0TzUvH`vgN2#$9!Qf zyH5m;Xnu+G>?ceEhJ?7)_&SP7mIKycR>T3U0A!J!G1E{quz)dvo1_3%@$lYu^4~PZuOc%Mx~63njjx*yM#CXPj6c&?DiU_^(`@)(bRh!@`wfSEhUpl*D092ADR4g8OtjcKneSyu#eR*;k>?-mENy zcSUtbA9)Wrn;J4|Wm?v2*s*ihktp;Y^U#a=utaJBW;C{leq2+V=T~X4aK>+Tnl?K^y&0bz>WuR4*VZk%y<<5MEHmauRzK!n&g)&| zeDbI5DN7?l^uSZ7$#uUce2(-A!zHA4TT|4hZ!+b5NJE$g6*D z`oEM^FkM&7o7g*1J-vX*vsC;|YO>IZTqr;?yH*)baH^1W~V?y!RC8^yftXD{y_G5xc;AAXOJ&bcpLs|viY{GsM&My?EtoTSL# z5(q}1?O9BF#n8s4DlgEz0W6#EOk30ScGlH;vWa={g z`g9~hdGL@OwZpk0Ei}*@7bJ5_z>X%Muyw7Od=6~>Y=%|p~ zgOFh@W=VzQqWZO}xoKQ4P?uG!6BbQ3ELV5sw_CQ*Cz*SSyU;0td(~f@zc$>^XzQnC zsS%#%{bpRIljaqiGw#}{6H=vF-Z@hf<-bAz@5bN#=rz!t%G_?N&x<~-u%6yweBO9$utZhh zME~5iUA!wbAy}*oN^d0Va%Xl7$FTZ!W&8SkU%vnSJF63WHk11TM9~OZe(1e5*<+!z zpu#iw?f7JYt{8sB>Gfo(CP022 zklD#US{a%*Ubx`6aird3Ndvt4d3oaieRU{)%#X)mcA|fzX0dCQ38MB2dn7T%YhjR+ z#!YP{(Q?fQ`|R9(P&BOdK8JXBO8Qgx*83x@WrjX^?*~aU| z)hksPy`nEJC!eT%=n*5Ir0W$t-%s%>V10jP4--4F!abLhsa0aHs=+24|5=@-1Sx)) z*Xe(L0orjivBG^}0SuO+)|ElBoMX6oK*9J-0XRd3Cw%%p41r$vHG?p3U(P5d`J4G%(r%&7vx#Zwfd3ry`1a22icS3#oKQhrI|3*?bAzANVP8{ zl)mBS!*tcnM{Gf~IMaT)+P{7YpP@}F%x>i!;q!ld_(d7D+`EK937gQR#7?_Bf1Ns%3yYdhqI;#Z# zU)SkBR`h@J5Nv+=Z`Xfm{eR5#Ur54!Jztw~$Lbl==npcx$*c^i0Q!d&^1uuYe$Ln* zy2P&<{B2@@(9H?=%YJjy!_!v$;D|;O#zAXDWtr+Qm4-45pXHmyO8DyKoDBOuWYHw9 z@nIfHV|=o3pQ%edDg#rW=E~r(Okz{U|08vOmH$6!^nawp|JR2<%l|LM|3Tj6P9i*+ zB2!6e^5-ISl)!N8MBn=du9K`|OL3*{gtcq<8UN7}%Q=YM`ty@z`agN{=hI(l|2I7R zRsR2ml76=7-wWcvjWF21KmGZz6}K{e!Ve6OlLa!*l`-Y;8#%rN$m)(PLO9b`{Zgt3 zm(#v64Fbs@ZqoVwDEQP#DA=DdVlK=DbKmZdp=qEvf+L5k8(!uMy5;8;KIH%GUSbki z!TtOW&f6%K&rx4k_*^lH5tqRc%i$YxWOpp1aD@G1iTGb%{`~nVG}Sili1l&j+RXLi zM+nNYSIP|5XM8=rg)=`As_&C^jqQ10IpbOdL8C3l!83wJqMbHpbo{)+8!tV%mzalv z9N<5yadIpkl;dO@1ToTnRs*HxMdf71xxyRWMq2&}016a34Z;%Ck|7k~>teME;@Y#s~vbB;$+*!;Iq{<;qJ6th3d{(0-f{w)kw zUgo_0pFRB7@VUzNwh`k z0AI$6w!2&(m3=$ZbNpm13Nwr|a0vShyd7#$q;tUzRT*;XPvQKd{P3(JC-@tNTc~WZ zHbzJW_m9a~ptVEY+glS;Vqx;yQ^V&s4DhSCoUAo<5qJE_)H!mJ4DQeTedE~Vc6F5nIdXGQiGOXs)4`*@y{X!-=dskU8GI`e`d2C8<3=a=LrQ`z zNm%}P{BMK)*Xwo~hfH$uLRj5Xhxy%=BM~uA&$9S1j`n8`5Pb0nRMz%Z$b!LMOONMjB~c;w@<8Tcz54CcNMH0h{`&4AyCMfPh4>$1H0!zfzf40Pm{Q{_Z}5bK7esMRN0q}&$SC87U-CV;^&VI1kDCx zn3j^5rUb*E#r(`k3Gfco6sTknw8P?O@l-K0N&(&(RZn#xC#&a&etSIh7n#DGn`;Ab zJyeognx_F7hyKxXc5l5vR8eUjl{$tB(df2Bg!v=274q&v&&t)q#vGX>JC~6OO>0*}^sTFk;MIo|t(iQIy zyry2I@{vbG7pe?Igbt)#xq^buy=XO5of*#59@*(5$ zpW^oBAyZH@q2uMB;_Q%q&Z&**q6<8>%{XH4=od6|NfFI##Sz0MZ%~os3T0`>Q0J!y zJDeinvDr8?dz|7hjauo$EF}h32_x8ACG#Yr&biX?JB9vTWtIbrkV}sbGm%)d&_SGQ ztF=k?@kgL)3*(RX#MNL2xs*+s|d-Co+8I3VVJaJRiac$_& z#-x*q<*goRlYzVDz_al@OreFBwRLxA5lww`gzhYIR=v%wC9sovd0JNJcXv9e9QAGQ zd5jH);7czAqmeb+3$)XN3_p zUC6_zAu!na0e?dMD{QlfiE>34s!{*m=gWzXP+3mU`*Ww9cN!d$&g#y@2cjMl=c=9y z7k=VOv}YMINMv47A!c{in(nLP)a%5!U>npm7fJu6*Yo#l9{C-PJQOWh=$WY6otcm3 z>$!M$?GofH7ofK*L;%)q!|#zekccPwHd{hXNGZDA$V`rDG}ghKaxU5(Qex=on+ixsEMB#Oa=)q?)={hbc}@NfJ)43nsU{=!fS_v zRr7_ou+(`RvH5Bn^#OFi<*s_B;^e%aY<(8y#c(@2nkaNX+maGId+$@wZ@wQv!ye@u2WY%h+}hBuPKK0Std`EAov;_C-s%T5 zT-Gk|(Xw(07OA~K2g1N%fc6O;IwrlaIJQV-p?#QJ(9iBNZqg{(K@&$>i`jQQ*mhXm z9xH5#YSX9-Dwe9Kl(|Hus9uP;KD>OY9fH^ta!=;)|i?m5Q zX=-351DR>a%k&3ds+EKm!~0&KIbxP(ugJSRZp`Ug;mSGzwgFKIGVipjR?mSN$Wu;ubI^A_tvmI>9 zvV%^D3g1JT%9GbHg53tXh74qIyu(Ahq60Lcr;dk>4|sNI6 zR5={=Rf(-vmVR6Q3U64?r2Dggj%}VU&(qrHi$*5tdMds{-3jOk^V;=sBo<>R_l#vN z=AfOX$hA}=4fObe5@Db%OMF>Vt9Ip!uTuugo6(LcnCv44j|*e7vkIR7JbJUoy1Uw$qTKHO_fOq?Gn5T zqd&^+584-O6lyDs!757+cKcC}T80=fa<__ptURt+uJK|%V#8OrlDmqU7z34=Z@Xl0 z7qVU96>Y<7Mb8aTUd=C1Pw_!CgSfh>&gM173oM@YcRMM?iZq7{?^q3PU1cX3O;j54 zvX`JAJjR1(tAr}Y@bNbFvsB28wlNT`u&2DxK+13NNF=G?j_5v{pQ`>-$F(K+t<7nt z;m)u;2I{iv2l>h0%!S`HigmB?EpGgaQAnv&G{!nW2yrDJ@rstXzxjE6?@+Tl;|^~g z5vd=qrUGQh*nW+>kE%!FHSrRz&_?I3P$$sKACMQ_c6Gf93f;AS6Tq12c8Nwzx-o)f zJwlK=Lq`2E7*T{*!k^ZW6H>`1bX2o^K7qR5T-X=J%#hGQ33gUT6V30aLi@oqO6hFO z!U`iIjarsMvFS!FstHvm(a&yDL|c0N#CTQiJQUrrt?em(V|zc&rYu#%_u9NIy=Y;A zs6Nn#e0^b8l1RQO%IFg%XS-HY})VT%zHzs7Y*c`Vx+vH4k?dn+;;TA~s_MGNLbC&q_RFUw}75 z)v31;7R4;eF!=9(&FljUiIZ%~3TjFnNm)9O1FQB!PsQ7*=@*z?n0h$k;@yfI@;J_+ zqn)n$A&3aH!Q}iVl^Opqh9lai4@(wCgoVKe@@k^cif1K4lWkZQj3o3V2zE;Q{=HSg zY_Wj)9PQ?9Tce8MwWMDTk@+o+V1EnkP`B+g$8-Yo5`n3}cH5P`faaN0q0j}MW+4pL zLKRDcCs~RYL~F#n4ts&G)%eoh)`I|&3nkz&BlVD6P$nX}W&M>ZYHVu`rB)<+1O#DO zrnvDm*_{#Zj%yDorVdj7B4=TDF+0L`RVp@R>zpaepHHXikt^USiO(+}C}_Z2e_1^4Jdb7&o4a?psSR!iTscEC=++-^h1F-|^u%fDOF@Co&<(TGTB5$+C7_0SC-DsE-WXj<>#A}&cO%1 zHIm$P^26TD*FGL9menn}vMb~(bcp*+biAJK!aVxgB0J7Spl)t1KQ`}?r!}i(f17rN zAZ)5u779ZV%W*BU{_G4DX}LROO-8$#I|{ zxU4wHm?4brEwfIf+!&dtXkSwwXvau$%N*)M-+L~M^9hDI4TQcD3|nk^JoJdF_|TGP zbozU1SQsmusyku@)gPRHxB`fCCX0$Bm?h26(I-1K1#-KC0qZ`h-#WlYZWiGZC1ug_ ziGE?_bJqtavLwF5sfGS6`8v5Ju6?mld4`d%AJFKAaZ{Z^2hPD64~T=4{-igQJ5!H| z$I!Z$cuE#soPAp}ac0`j(eW*e*DfgmNMndGsDHRg9hv>rHZ+aTv3VD!#8S6wO_jIY zmu;kPy|v)rB>J0l3rPn9$0bviF{6ZxZu`VPo&Q2H+QDDkBeAVLHtdz6JgL(_N=vPH}*e8cr}1?|LC)vbb+df0nAHs|3qYPqbyZ3IEk! znkV>n0Ug>JSj~faSK5^(xVdbrLWYB8t<}0M=F+XOIX_YA@wo&_F+9Xp=vY-=N!=cVz3+MQZPqon@Mb zMYoe@*#r9I4OmfltUFJ>WY23>qJH?;2(ZwXT4xs*ZxR*n^&KQPiqi9eoM?@`Jhm!0 zRzXEaH<=RfzN+F-IVs3_K;ye#UOHcorc9O`!sD)CtqP7l=BXvtp9m4J36_7{mZ0-x zTRQtqkmD}7lskUoM1RpXTWefbz<7+kb(7m&mSctvCBU9pUf^Xt*Wq{N*ua-ThG=b5 zS^XrM_mNn4k?|GdUAq@EiNV1=10$M1kqchK^z**BD~=U}ZkxrUeXh`z3!MSSEGCa& zO;j8@1(av%3sr;FAkAe4EhqjC81-k#Lkh#p5rm1mk+-f_G%GA^zMHy_JkXZIN)lB? zl|#|WJ`>@INUZB2X;)}KYP9K`won<9K?H_Cta9Uql5DT8G4@NUkGR(P^N_9s%VvP} zW^XNk5eHNpakNkKdbzFrqiBc}t1LaN`*I$NA|B)3I^yK~&H&4++Krr^Y9ux`$VEze z@xZe{aHV8cw{nUvKeYnWbCD;IQXF&zWs}Ey^&OmFg%*}MnLOXAJ~P)yJReE^Vp{f0 z@RTyP>}+sFYlyD-*eDsjHd5hoVqrsnyT12F%831D;n4?VipWDTlS@Wl)Y(#yd;gOujL$gF>LIMq9E(oYNw8g$f zF&oP~TLVmb(gg1zXZIJVhg|4b=CQMNW-H@D8_)R< z%=%~RKb!Rtt_U*7UJMLz)-9*#RA^>Tiuc|TttBbBW?m@cr(`GJ@qMu!fUREIMES}{ ztchIF3KHo8N$qxBm@^yDrz>r30noI9vZrs**xgRrYY7`xOX;2d@TN=}B}B%RRJ9rn zdn|)kI^=Ue*;6DW1oX%qQPthJ*860VrEXz3enum!SZoj&YSHbTIy zYxVGasniSKs+)i@D5euHkVsIx503t|(g4 z)1%Ki<&sfDK)oHd_@blDx6wk8=RtY1G~&yWSW?OB)5G0lG5`*S&~sP`Eug* z*VfYH)-{LleIKTF$?7ho69buiSW;8F1gu%`)~a3MzOCW4Wy#%Bk(=F>WmI%ryRz>< z6A;11K38xJl1X%Z+GauWN<=#5gtJ>mA2)72>hsOgzdWplYKo>qGnvnEtnt^hqTG<@ zg1L*M2ZjUkO6K2C70E-xEyETfJug`27&2rbn`GE6@kTbQ&yTywRAl+p{*{W_?EWPw9RJ%`7kIATT3B{Y*Hiq*ZyQzEy2eV{fwM^G)_M%DBB zq(nm#5tW`o@4V*OI-r53mnU15rOgky2pCwq$f#6S(A&<EL*ZjB;n(+^Tt#nD1x`;HHt}uXx9<6>` zT#GP|Uqh{9C%e8L{?l065dcxh#gr=-iD z*QL8@eVPI)wXdLqB_+#8Z}f8V^`bUCQPs*Y55eQgp7JR*e3&-*)O#qk629$^!1; z3X!v$N4(A~nYUABjey|FSUnoa*HbyzjXC9Q6ohnW=uSJ z?7V7NeRwhwOSf{8)Wp#3teakkrA^v5yIdjb$9=qp*`@NDlw`k6i_tMO6_3lKSDwSFlDEZi2{|z`?HRUX2+BP|dFO7MV`0(QDL3fXI z<>0th2NO^A+Pg~W^03ygr^%rSI#TJxV|T1qr2~2Rd1A9kQIF^&q?xmwZI-BIPjlR@ z>JZ>X=n1$wRa)gUQ|MpWbWLPo%uD9X7N>YEci{P{8_Nv4g6?D+qgut>`clOq%9`-m zI^yo{8Hr{r2rU&8`8F|Paun66f9svH%IgX@ zOXM;v$^A^l9Y3pGcd5d*b|*d`pKH>;*V8QeP9R}Vz(x8fgRgPs-pxSGH}hr0+3z_- z|24Laiex2`J}FI=oF2LdkDxa6a(;Tln7_o#O^=>JbZFy@|G8c5U(d?c=R)aPSaT5p zjpB~KW{OJ$yZlr1a~2F#a=c(x(wbN-BG{#iHb&K(R^Wv>nHT$_D(`mMeQaIyVbnYmTajlL%O?Kn_Q7n*V!p;b0UCz_&(Xb~)< z6?jr#UuzsOM~4PrbvO8xbXv2fL<&QXFka3*=I-o)DWFdU*AdGMjj~cKGwgd|llt*l4 z{roeM5%w3TN1++8`}DO9$&@vlI`+4HljvAu-mZS6CngKmS|qWQuj~$0=pTOnW?Js@ zV^4FI9;%J{Lg>4$Ni71hpm?UT1u~M)P|5{2E!9O)t+EnSaW%I<|Gj=@#_5+&LPA2+5VONH09i?EN;3C#D4c*Z?WB zYP0I=+(`#pZP(QD6v~)TL}*~Cl|qJb3jWrC-cOBw4}l70lAc&-h%ji(VFwGJS(QM7 zR->bKrf~QXEm%ZVl>}f9lZN80?KBB17PIAeX23brSKz2D51Qt_98VS&d5CoJsej^@ z+Tp?wM-No#^8$Yr4J{g-edsKRlI8U+RQ6<2sY=sw*S+4nP>f(JA3z*#awx&1WOTO| z6^AHwcC3*Luxt)n3ZPTHo@!r&dI8e0u&=-+x^>v&}+8pfV1?B94U~Jf`;k z)T8pm7!~e)PbTp-(faSFY_V>}cJ*3aI3Eu;On73MAKU~N=FzXgKl}jgJmOVo$E6-T zo+;5>B+zdLe2Eg8BDE>a3Gz~|*@nu|DgJRq{IIyfdew5rAT!2oDue`_HCDA;iA8JO zdT$jBU=NT4Bcq(9b@>3-k3gLq&!fHt<=F^bm9tAJARLhB;n_X*(9b$4PgJ!lFD%7V zD=;A6FF!7!(se_(^^8nft|B{gaDoF&T#TW-MHuxxqNFECiWYt{~Rg?P6u zW25h>ugJ}|Yhp?0`= z-vAcY!5g3Lo(pPSY0lv5AnhR2;Uuqlr@PmRA>&={UvcKbx%^CbyEdz|I+AYl8XsHz zbW3_B?I3Cg*1MKCIsGz&&-$7;+LeS@{4$7Aihc2SN*{OK&_PcxH1=VwlV3EoY9cHr>4ER)o}%R4Mh5#QTXV1R^trJ_fcQ zrzlyNYg3d)*miAp&#s_!gZg_|SF@BK<)4!|+ci-tB}XF3nc)bJCiy*iCegpqeSdjqeVoP5u#~qx_2D zfl&*ZPvQIbocw&)MZP-lL7VZQ!%Lj^gWV@Ls33PVWf73o%Fk0^lFyj9yc6K*gWZ>I zz1f{!aavj$-!^XNbgn;+j9mjAtUe8k#%LZ(Dc)YBbatUp_WeDLj!x0TSN3~DlpQTw zBzLjICLPZWxt|RcZ9y^*+ zm4^WtF5^!}(N9bC=ig9sYmGC6eo*G*hl9B^7^bD8TDTG=YGCAax;P^keLHvk1&AjZ z5JwWf%_^(Wqiwh4nk2J{*^Gx5E#(8;8EGkG@x%5H^UUUBe0-DPHV>Oh5?0CXiJtS> za%7!)bkW%t_L{IZ#G_Y|Woy;qT^vd$D41zd8sM=pbVbwHP*Orpk%H4f5KA}!nYTY9hZi&4)75lSRE$(#g(ypeyWeUA& z%!Zjqox8aw+#*8tW8k-iHRmS78zU|$u?ibcEEuU%KvoV+?ij%i$K9u_hGmikM9qe6 z7VlRh`)arsFrOm`otvOqt)q(_xSbBR0;?1@>XH8zZl`7>L zQSI|EkfF?$nm9CBn#kR7+^F2)en64}LTcn3p^uQfdWIa8bZZmz^3&=W}W z?Z%O!#}VkL&t=ACs{&LNBa9!sOlyBK>n?Tj!OKIVTy%`)bGKHeX;9F+}*Ty2aGlkzRVQU*RlS zPFC**>k_aTX^)Z>ctf_e$LtNR%m3Tda>C`Q<|pXTgyuP4wo}^1S7&6nM+7fOT-&Z+ zTA;IL?DV5eL+y91HZc8_79m6K^p9cNt5L^h@-8mTvvaGFlLN@(?7maf{^Y!i%;hbBV8^i_VPFd zBy{$ic%+wdax?#F59fw8se4^bdi4gE*w^)fLAqXW&BkDiNl_vsk#>Q1Ne+a0qx0`U{B5mayWU)PHe)_kA4V`7@0h#1Eb z=C8RcJ>HvcE!2)<(8o6q9u7$^->SCFYOR`%f;4QYc1d2$S8n|Awj@4x{!$6Gt8d%J z^p2U1VhF+~WtHMTrAHiBs`abN4lnL(r#V(n4}}hHS!cq<*5AC>-7uu70RQGVNbgRHze9$t|0!5{ESllv;l>wE}nlN}8oc*r*SYV?QjeBOt?M$7Mb^|Bo zn#Q?OuUta6Dk2T9-TV~R0l#!-Q+8IMQmx6(Qwf&R4hWfhhtho=Md?;*DIUbSF@X;i8TU>*s#C%8vMWs-NV+pBZfA%65= z>AbqDYU=s(e#uhnR0`7bpbFhvb&Q@pVO!N}1d*n=XV2Cpte@(U5j<|t2`k*HF+6uH zszot=Ad;(sYgqP?>)%zjwe<&f#2?;V?5?-@!j;SWC)`puj?u-(Ts3>0S5LwF!jG^Q z>ItzCs9UMMU7N7qq=hQ3wf-ef>Z*N02ofJYp?r6*=7%x|KONJJ-%qAO4fsb<$Lgj; z2#yDtlg?jcUwlj3vaR&lsE!kF@A%-B+l^zF`tcnFguM6#wQY3SKYPLKT7Z(_5uW%O;H5=kHgf4I8k(ahyYW}DgWuwC zvF=g)`!gSGp-qJ;>+Rr2qCevdyTY!WGW#C;E?L%un=UO)O=B;*7Lq7YC*92t5=n-6 zGU!teUb3GoNaVq-uU86(TO6$IKC;>KirH30*_cf=ycJ)aBn`Nbu~FtNIUS3I72IA@ z6>{e+jdy==OLMua9lrPY+&8IC`;%Id#&v4MF}u~JTLK^*=P`D*a)rb6CewzAymd3I zbrU}Qbd(KowoP!)K1z;2j`eVR?X8`u10QPUmXcR>uMNq%78(*eYpv2a)?^|8^WrW) zJu;-Gw4h)r9b!B@dyUWKQf>LMIWx@3W0N2J2xZ5GSlQ`O=kgTpvo#zys^tcxHZ{-! z*G`roS52irx_L;h374r4Uo5%&iGH@#O*7*0^GfT+cU4zhRZ>{imGNM34TAW2U_&gbWl(%kTuHlWUP|Y5J zN9&Zr>#7&XlCIH?(M_l1@Z(la2+V@f9AYX=!j@Zx%dp8M0U0$?<-C2ttJZ@c@e&%g z-rAlTl6b0&XY4Serb}1mgRifSfyDYuJC!CkIqnbzBw$qc$4?LSml6;4CO`z&_Y2$Q z4};y*`BgWqc4$Kc+>MPo7n@j7Xdj_?VW8o2E1v^%49<7HZszqz3=4!iq!pa2jmSN80?d6O?9E8JkeP7^(<&LqQ9 zN*WKUg0iIr8yWh3m|OR^0kOy+YEz8N2jcdRhf=TiGvfyYpqEd%XFjt}Y<^;tHLKRM z3U^veX?;MaJA0ub!e4N;u!V-`tOv2kU%1Ki)g=ONczwy0QpX2~8AXv<%RV_J&Fi!B z(qz8sxeVJLCOdBNU<#9KbaR8*W83hoi1ZTg%r^uFf^5{l@Tvk?N!P==m&6rn438aY zs`ya5z2y_3O$j1~zVMFTFSa`5DeV!z{Yi&UT}=T?H+N@LoL()F&C#9AVuIe%U_ZyD zNRV9JH^>~o#4VvX0%E~-Ku8Y6ttv9*( z!P6_<;(ukPsHI(cm5?`O)IVcr@gQ}{{)o}dZ>=M@z3vra7Cc`8C3<)Mj>6p|-KqO- z;?J>==!4l&RyI3MFJk$uliqPy#-WMZPW%jLrQ}~OG-;g$d8K|9|gYi^YdxSEe`0y{Jn_D!v#(+A--H_Bj;#vO2Gb42H3i}qo0&A6Bu8H4&H@`QwhTiRTz)tw?AK_onSio3&UvUoo-UWE zI^^*6E;lMSxN;JFfVZ`46F9WrR|#)ZlSM+bQisrt8&=#q-yS^YLA?cG;F*1{1=M5v zPGJc48iGpAGSpwZN^+Z_hua#fe!E0fp{8PsxjVl7c`yUMb^BRLUa-8^r!!K!#BVc5 z$H#r6F~!D{a?kjCSK2Mxdy)$A^uW$|#Nf4`Td%^t#V+Gf2-P%`;a-Ho9Hmy8oA@j5 z;!=ojebtW`8DvUY$O}$LAsFq)^}_)B2hBG4QUl5IodwHS7Omr8Gm7=wwho>36<`yF zfuWdWlxwBTR>c9A;+)iXC{`hlq0JW;l9N(sFpN|P=ObG$v5KXM*b_)1GA`%Pa*+nl zmHwHhB1rA7i}cQ=wc#9S@=GIH*Eas*27NNe#St za1(>ZOodnAUx2d81Tz4jKBq8@l-NCae=$a<`xmb&76Y%pJZ^RIwNBDEmo}yx#iSXh zjG)wzdLZ`vBS&a89AN|-c#iqmu2akt4W1nf0?89wl3L=O64%FU>IOVmK3=hWJE>*$ z>D&t^B~nz%3t0Ui8R#X5{Z@uOc!&>6&g+Mei64IP!3CocIY&416uj+$?I*D}=2MiA zw}JuAC~rIsV#;ryAx)7iCaUj_UcH4ge{8kMTRwlz?=_8>R{gHBTJL_yyq8eMM&&m0 zQ!z}%@?f)eK0FlC)l5=f_)I8Yo9kRV{;}-&b0Dl|^TtdSN|ieVPI_YPndUdSdfHZh z)9P>T7PfnFMczcKMDeXoZ-rO8%I-^GVC@HK8|J7KPs7og6rJ!5NS7rzr0toIOcs$M zamJh5O9}|gC(Nrv?w$h@>`_`wDCtg^-OfK^0^`4~@QSICkQd>bjR*YLC0N=0q{5PU zuKa5r5#U*sbhzDB6W=zKWE(q%;W~flK_KiwlPq+bCl`_M^l_8QEkaZx=&8%u7D`or zfDRMU&i$;>eZesJ_^0LD{k)_|1#<+96s9A)wUn^n_CQ`uqR-49$>xLSY5ltEg3txx z`J$%w!d1!(unuc`lHXArYy6z+8cldUj?pJVxAQ%d3^nlBiH&tx#@o>uC*j$nzU#x0 z*^AqKI}m;o`Rr9C%$Gc?-YMEcD=Dw2Lo)q)MuqlBJ+L5mbSiNG@%GDSGKgBdq#nit zHQSI+EHdZhEUF3O`4i9iMN=*1^;=0W%dP|4azns5iFd%d6&z%$srpd@m~%;2d-9Ky#kUQ;S~l32Vm17_J& zI>n7U+lQg%#|X!W-TAZl=lqL2KA%F`{Z^)Nhc^0KkL#D;7-v;E87Y&d5QVgCQnw#) z&*8;ru^fc;BrSy8w(r}+bQ4PW;%?h{{X_c-e+sfZS#U_WXLHfY5KF1q98R3+;5K^`YQibVh!Ui7M@?c{gM{@KZDO1- zB4=GBcemg>Ml@XFSN5|E_W+Qp1o#tuMBnk>7Sx1P~@if_Ap z-nYQ>F-+hYl~N6a&xmkoelRH2R|9kpM<0AHAvjyl;9{u{DVl4q4dqAtwGzmER=ZXy zhjQJC?{G4=tcmk&Tieln?h4NhmmW#c=)dLqz|Xsfy^}$YlO)Y=wuW)ZD2&K`uF8-2 zQG=w{39lY=A~)=e@1W&ryrSrz;xZU;Ho2gu{t^FV0kzsrQLQj*9zLP~aXwTyCEjHP zo;DM||6*kQ6_^YN%gBsnZzF4PSUS{+*2`MpA;fmJT}%&DNG}^EAj1Qn0)5dW?)K%p zWGKzyWG{_NxCz&j>dzb{3r``K`fh{V(fwCl_@fJQI)_i(#`#ms=MIj_&U-` z>pjLw!fmM`6R^;ehdHUIw{QguygE2W&7cj-xAHRayQ_*C_s@!9%QIqr#194==lwSlFv%_dF9H}XlzkFt42ZWeZ6mC_C znpNA|1t)XT!|E9s%HuD8C)M}05&!-WxjIC8)Z@WVu`Cc9VHT0~qcg-HM4Bgtke6rE z!#W34fa1lUBhV#iC0^G&TYTj4L}7rClGE5D$xwG-p}9b(^^KvmZg|p*TEx{eZZRx# z7c@e&mx0@ix0d&S zaN5nm-Sz`IEuLtzk2yk_(AcHSad!|KL6R2Z?%2Jq&E(zTUd$vW7}E6wf7((}_XA=K z(1|~vdmE!ZNWRSW#goXbhf`9oovhfIzw)4_Dr{g;lG31yGP!ngZ$wr)`h5JFtpWD6 zs{XVrhE!Ex;I8B5Ao!q;Z5*6T1DWdd=PLcHF*6Si`fH~7FYMb=O@#vWfY&*iUgAko z6)>72*m-PyLz@8vbpr*EL71kO_1{lvdXkleRD86&3z}lfe%sShj5d~&wWo{^F)!RVU>Z9m1g?D(`g3m^phNm z{Aa_2Pct%W6`PWaq=0nEMs?$V)~nxLK;bQH{kr06GmsvDEnz_=!B^4w8#x zNZ|axRu@MR{6NwGkZEiGMu}x!zEx3&qERrv*GY#Uj5G1T2`8b_R1RX(od|o>~2o#m_D5W`XJ4K6_?1(9u+di4EsME^EDbY_R$GyB{-E#zc@1i5r>Q zXpoSVO4dfWmPHq$@x{E>8Mm`{7GyW?JUPfc<=pxmyH2UxU8?%TrLzoc&FQdB;MvgJ zEykO92sJWSxp)KW;f3yVY3lqffi3&=2lu?R0N~uFH-$btu_z%$bMEcx4wo+~5Krs- zN1D~&wD0@jYm6TDST5`eKS9z#I!iTAvr2sI5b*hE90|vRNvJ0l`gbo(?r|BVemZ86V6&pLrFI z4KVr`?a(f26P4rN(POL*SldwrJkjo>*IikY6YU$pGQqqJ@*nfKcREpMl%(w;(<43+X#IXE`VASzM1&^Tb7BHYHf z9#Le`82EgluK;h5FUBk^+}60!VJa^~E(nW9*ie_iCK^x z1sB!QezaI`GG*MasxAA>w(#iyIod(#EhzsTNCBvtp`5i`}+p;74PAWiePG{ z!=r&uxC)zB!k=|jz*h(TiZtOLoo{X%zV2ebzd9&d;|5#xE4l9Y^yIEZ@C2n5X|G%7|jh5f+p7 zesf&EtvmI!j(hvw3dbr5;QTS5j7l!x{%Na=eO_b?I%0o>QtQtYFbhDIm0*C5JNDr( zgJm-rvS$D)#w;-d%yR z%^RUj8)jJcGUE2vHFC7YKOO&@CBSc@E?eZ`_svzk9wLv@>ewCrCoOhPQj5=Bi5XfE#X)h~ z%&Jgd7)cK51|gd?&ZVs<|Izdqx^nv`vLxY(Z*wcjkI z!e0j25Z)nZC1`$ida@BlkfF6p`uXZFLI)DFxJRF)w{IX+N>3+gi=>nG(_bR9A<|L8 z_#xo>iZ7ueRL#Km_x?Is)2%RRK3!=dGSs^^Ut>v`icAEp}ci{@6)rsG8*`kbO=hZw?QCll;1Rf zZSNQkxXs1xuo+5yb!}+ZKq}<*Ma8>wtEK4GX8PIQHtGC#4)!_G1*kdYEf7%DP+xhs zBJp6b9L0xz2dt;93|8W!$s2@(;5fMH`Zx<)|8!THYEi}iuCuK0wbEqh(yv?3d~IJh z;!A#w#~dJyBGKs@vJ>NBYS)Vx@@JbBJ$M9Us}1|R+5`cw49KC|8Y5Y)5e`Gy!{>5~ z5P6Cwz$d-!+^86UD`QeCo5O z;5(B|UoL!n$b4aA?HW3oA;mVeoIes$g6|w>-7~3ULr`1#Z&$UrUHtj!fgJKRQU%pv zsVTz{z~yPbbg0MB_t$hS{+ezrr;DSNKe)~~foJ>}C=lKjVY0&|!n48bi0+B5f_BZ^ zSh~La**A@7r{NxjrQCB8(70ptB<-Qr3P-U{MO%#Rw&+QMlenkE&TNTQx=Df>pw3n4 zSWpR143m1uW zWwVnKqi_?dr1HYw>w$-ap4SL|Mo10QPEdy;gwl{EpS;@4BpMJz|B=gD=>d#mc^S&M! z+ZxVrGP^T-a(JqAPUw(1>wDaPQtx5j&_(1&%wepdo9R%;R%uFTW*9p%u0PyUpbmB& zWzC_o$`o@d#0da+%scn7S%NAZEOa9TUUUm||EkT%q0yomA<#jDE+%|ipl@Et$S!Vu z*OD-jox5D)t1QJjZHz|v1Ew3?>%EG z;B{9bM`(;KqS`l-%ed8A`vF7ueu&%uvO^X%vfCc12~UVSmNkEII(n;QTm3gLoy)$+ zAmeW9e*#%8LAAVpNB1#G^Gw`bcY-_kVHq-EVzz^LGQa}^1-XxccEZWiCeMp&*zfIP zYdE{ID*;75fbPOGmw;5xl1JcoG`EOsu|hKF0EqDA*c}5CJGK|n6yrQK)Aoy+@C7EY zn}vU5l7vL(x{?Tq4P{;sG3O* zX%>4o3P9Q5)-;)O%(Kf>91vx9olM^7ix(eA129^m=7y_65WpYB*UM!|lk++mf#Dhb z$a111{qt;OC?L+n2pPx2hKjN<1tsOE^-y>jx#JA8A7WG!s5D&8irt=0SYVurJKm(*7@Tmp!@=&1qHVHMqPy zviw(;bn)~LAAWaY_JNrRWxbJ*Q)gg~0x%lpK33Ee6@D#{z~(rH`;P+URu|x>=}en^ z->~iY;`VivG^VraLm}20AmVY>w}WRd|Lm??V#a%c7i0qLM^9qve60{bm)#fs{9=h# zXiyiS+c~nf2B)LHjHupGh%QGq*PFLxytG9#vgrxbd1H1ik%eF<0}bx2d|58Ydn!-0 zeh+x}F~}N^vX`+A2oV3u!x!KB%Z+Y8dwP~o{3=thvImkS+1EPLVKtiYyc72saL`CX z`-aV}kkdjyoTBZW(JW`geNn@pU^?aNp-hZc{*kGttO4>~eb=y$azY-xU#atHe}bCw z(3}O{g+0a-m1dafg3)K1-^U*l$hZnYe9pi-yyM;-F*QT<;=?kl1Qyq-O+FM7knQcqlenkm)1ovKy-h)Baj|NB!VE(FniaX4?Qt zTl@`pAP&umDqE>F8;SKbf#NZ2pP}Tl~7Y{ z_$h5s98Z3L4)4G2%1-RYc!+mC0k2y@wM6e{)>nD+2=u^0SzmL6b&WbQZbME(hA8+z zq6qF7CX!Ril-v-OOH_zjY8}_`As54?6JHM<@Wxx;`%V^rmi(1**K~&#-q^85c{_4s z`~rd*p^QmBZv1na=YIc8@#)d6d-vh7P<&`nfxRAnSRB-eAgmza3TN5!c$TJs_gO=2 zIT;9z(%-T=Y?4lnIt z29r0J67P{{d2^4h6hw=$3ufggL=%_mvQ#ryIun`^RnsJW z^P4(|O#E)ZO2A?Xy>ix~1AQz9*0>+3Ka$PwRT10<>ReKD1$*s6M>aT#458j-nm+8E zJhD4{EzL#}C~q!>yR6F*jFswi%G^aib@4Xe%Y3QEv_ZN829mCp4v}F3G|s0p>(A^G z^R8rb;RP6};^BTweY@Dnx3l!}m-t=abibqejYHl_s~OH8+nly>?PAHa1D-xW*B0c# zpP{_bko70MHW}1vuADS^L|chSj!m8S#HL1jl~CK%B7_X@=-R)=-_&EN)&d^-*tIid z3q+PgDSo3DzYyQ&=}yYCWMqXy%$eBs_h)9swNNiM%c{*wqhAen#us&pwgBF8>zNdm zEaBx>h7;&9=kq#&VHAuA;;u^t!uJ`6Du}0l{1j7AikNy;_<(P-k8!sX2-!tPVb%aO z{0f*q85Eelf-0=vR|lXy&_Nf0t06R3F#T}J?CHkCYzSQ`u>_6MsbK`3!V*OC0toBhdd9dSQ7CkTZrqKq`LO$m%~M0H0QN$Nyfg{A^mM4g zPt(YhETv+Ty1J6)wzyZHFe{tH^65vHmtCbp*KFt8#Rl?G&cw+(q<#QK( z+60{gQ_4w#kh-n?n^z%$yNG!(uJx(zXkF4jPxM}qI2CK!9%4;lp4=#;&LsP-LN!^HzQl#yos+tx?E9K z#p0w0XcYff7jK#Nz8Eg!kAqcgUXZh~MVy1#jYE7-NTr%u*L`94bgDz)e&M+QP`$kU zv^$2XS3U4`S>&@iUb@>9QU*XiUX?oEb}fTU$U;b;$%2|t{{Wo*S=0)6))A|=K9)M> zQM%9jxnY9clL>#;v}Kg=i%7qq#M5{+h5ZrXL7Luo*0xiO%o$Roz4~;F2=q0q@iw(t zstH$k4A3LJ04t9nhtI|K=^SslUZG+{{s7&2+i4VV4rxJ30CfU5&cREhxEJC>fP51I zja%)py~C-=Icxp>yyOGvwt-#Zz#O%p!kE!QmB@}nNNDFoE~#_srUwcEgi~Em7@m-s zVvN(gEEXN@MFwKPpGtm>-|lndjYX2~Th+Lz{v6*;oo65%zz?GkGQ4GY;|2Z{_=20) zWL>#t%jQD)II7WutH-bQZE6Qhshj1133u={<(V0W`^XvClX9mS-m=Ntv*-OprTLDM zR*R!#FWyTU=@=VrS_Om*>XLu-s|VNL@>%ysekZK{Q#}<90J)aCCpP`j%V;raT0PFi zsp3sg^_w(TmMUsxzAQX89hPd&D(qcIVAv|V2|%^q-f1#eEf^uWt8=QW-m;d_h~J0R zA7Y?2F9jH)~_Ecl0iKynhIB8 zI(6P%!|O5(j^QJX^X{iQeFMD+eX*&tYW_Sx#Oj`WR~uRBXudr#-~p@Nebwhxg8wps ze5lJBTz;RWnnT}nO7ctOy+cC=x&cnV90ckWMIXLfCUi;M79MV22%Ph9eWD2CRkB?k zEyj>Y`R?XGKVx<94(-r-e%A9$&s;b!WDZ}tLvo0(!wmhmX}1*&46ozg7w&dh&EdIJ zcAny8>ce|Tb0p1HaaTJ=F}WTEU2eWZK0yvm;zt}3Y$SG1>v(8eno%MSS@acmq57I1 z*(>iXhEYY|bcZUTQ{JBw+HOXlX>)2mD)tujv|gH^!92z2nV$q?)GKcs0Yp{$A@tS( zmDoS0nSV(1hAFtLdk^rH@bB=JIXE(5?J;dgi*PE5!@!?(In9E5WZ~|z&-oL7wLim{ zMB?7Zhg+dwe3>b+riqBdCd`xesD2xs0h^hp+QjxIHwO@f)QA`uh9HMpWRJy5R9|Sg zNT7Yrq+AMx5@rAg)9|=$q`l&&lOqa9fo=&8ch=h@hvD~%?N1=fFLi||SSaQ1W!z9y zZAky{5<&<)xt_0haJ{069h5%5Yz}}=su!h-a)=Sd@1^e>LJSTJGFH3p&}L4No8I#3 ztH$`zImCIFk(B~TOX~WyXc&u+{yY2SjO?d^zUydXhwY)mRGm(AMuF_BKU;QlWI_*= z>0OL@dEISraH^cj>GNQ}<@e7l~(3Js~0?N+GIJW!k4@>cNW+ zGoGZ|PjC$nKBtV?zl*NQk5W3n#sYHt@kw!ZC`g;go#VWfog-{em-qa9iT6AM(F;Ko zuEn?BYVTJC&sfNQE%uE^CB7RhtX?K*-wi!(0Ox#LlEu>FLOXNYPd+4@cSV>CQrSoD zenFQZ%0HKENyGVSFZJq|N*+Q16|i5QR_z`bTS$&NcxHrhmB`dqRiHX_!lfug{>JiJ z4bO<$_Yq=7fFWM^(hyoxeD-}25iywt=xQ$gyQlZxk@JK^|5^KOf-h?LMlCZq zhX1zaQJ9-`&d1}IMg(Z0?H+9UDV3JDVb2CYhGSl#rcPL+uAEwn=-%<)S#*`8%Z3&% z9n-YZoM0<}JuA~lqy(4Wthk>GTjJvV;xEhD`VUzoiK-Fegu#=j(uW}?f53{6MJ-|4 z_c15-NtuRA7sSz~1s4w-&}N<>F>}rK`B?6_4v`{RhOz&fX9eIBe3PLgoex|nx;z7u zIQK3{dvG`j-MYo|8&vCegN*8V-Lt{-vN&{qM^&%<2ydc*d(LRooT^8>+8Xz z=wEu@8E7_-Q+JdJsEzDG)MVOLvGqK{>a))I5}L$uq!Tv|i7M!EV=ih#uYR+0ma8Ri z-}dCHwEmnDr^*DAZsl_6%2=SI2n>5%YXCz$2_Zcsyj>f@vLXf7QeG1*uOMWAmBeJ|eqM zHm2U4Q>q`0Azr2Y?#;h47k+_)`X_tab*A8l6OuapY6oL(qU;NBQuzfZ_}d}46du%^ z30ztppy6|TTW=!?wgFLy-k383?EIB%SF*Z%t>o5#$6M;`zTyp|2x-`)4qbX|D>vlP zx6!Tw0OK{B_mdz7;V!vL)S(p#b8VTJRiZc)@}zF1C;I&m+t{c=`;>e;y-|hS7H?ZO z&FY0zf;KmAO(<$szV1?iI$n3SyZWlWAm_kM39k%Fz5}~zcFGWllN`^+&YlTGH8^NLvV-cBMDJ!HGT*SBtNZ|pV+qTPoZ0`ES{E~ z^(sgyGUqs=-z+ZUc`xw=4HMKtQnNauz5%a#7Ske3etc+xkQFkd3T+NPN#NKhP7 z_KWVUNb!L^z*%KKCm6tT5NXTeBVa@=A*%?W{&m4X7eFy+GOm4X`)A{G$v#t@48mW( zUq*9^3JT~)BH;SO_4>+9j$`)Wxr1h=`ogQ`A6!)K+M&nNgnoO?%gmmRqK;yKcXhrs zao~sPXPR#%6f%Zt73YS_hEV$BZf(~Q?e{YtP;VE0HZy#Eg0yjrwqQ8q**UQ)9T)qtvW9N8L&|fYNiNi9FqjF z#@usG$uj=wP+#?3uLn{lio19=2uKbq!W#q?$6)RMTo^XdWWQ>968f7gsMSh5(lD+8 zsf1?_42{wuZ5*P58KDiHNh`pZ96*6FZMS?j`%%TRV`ZvKg6N^Dw0)Z#LJ{hZ)Rw8`H0SGEjqkgl3^t;;Sljs!fr`8lqn_OX{Lii!H&{s}b9tJG1Q+d%9oY)rc zIU5zodKKq2+7KKG%c~#`BWs4criCluof1sYn$jG~_J<5|Uh?3}kOexPzDFKdbKBj4 zc|#}89MF_k_^Le$(>S@rPdx>tEQy4DzxbIRliUm5X6$YPm(^(iNG3vEI$7JXT!xCf8R5>5i@eQyOPrng! zC-7vh)S86io5vhBS=_N-m&DqhX5`NP24fM+hBgTjqWa(3+&d?xkTyxLcbT1Oj=Wj4 zXgf@vJjB{8oRM>C8mykOX$HoC%KKP?K~*UjyG0zW#It}wKbmb1+a~j2{w_x*d&;ih z?Ej0`7twJ*t1V?7W%L{Fo6G;xC5Paxl}?L(BMR|iCvWlDF`{*j01<|+3>DQG$Ha=R3YKoWZTYgxwb(hl z0wRrR#SdWj8s7ayiP)Ek;3qq}vCW5#Yu{n#$ztCKlJ~lpd8)rAMl_LiDC0p?YJLcX zgs-7?xBuARX?gSby8gM;1MtLs-05wlBWY* zB)fld7DVFGX4AA&ZT|9OTW?`8=@7LZc+OQJiIX?cT|@q565{=@6e_Uv^@;|q$O9(G zE!j)z%kW3Ms`82>CIr}3#i(z26qYk_;F)u`iE<6nQN{kY+EpwwjeK2?_C;YBQTB6w zQbpQBrcuj_Ir2k^N?=nMP*V3U%9J?qc-Ix=vMhdev1)`o!Bco5>*YHwqBxcc+nOc>3yIe4hSm*%#pRDdntg$qN}t z65Mp0$$!HH^#yw=?zCR^dz$S!F9hq(&-{Q7`tv(EwU@Pk#!*nOhAkE%eQOq0+8D&8 z?<+64-I!PHTg${q3)J{`sdj=_)7=sC zF0)(XK%V!_mI_~^j*U7VF)|A(RnA~2P@)GmWe7nrik;WDMzc6)*A&$=xHkECPiM8a zTCxB&=cUfvqg_0GJ`m;2(c^Z&*TXkJq{~YWet#?%lZbkjbpY8qO2=tp8L<#1dkvb7 zKNeu(>x7v+(VRX0t(xZtUV1hAoKmBzPB!Qo;z|+y0zZ{c^Q{QhLkh1l&MpCr%p$ID zEEEV7TMp5zL?Lmel6Fcs*{392k>YV%@y3UWxjSXRP{WK?Le!~<Iz>xwuoFbMX} za>G0Y%CJu81`9K5Nn19=RKd~*O+~2vTFFvND#Gxr) z+t1P_Q+5ASm1@zrLh1<PM zr~=?zKoe;JbJZjjNev}!r!izlip*!r>gz@bgndKxnS|Fn5& zddwX_R&chS--!Q*gp7K`qjQwi_8OCgKgh_*dyR83Et*gU_;1XONw(!H`8!pW3Rk zYgntYE?S&au;BK!ogYDQ{9P$jrg2b&u*vN$1|%8jrfA17rpcl!yW;s7IbRf4L9#|P z;UFBj7E0g;Ca z$K*T5h&cY1)ZD$nqwsN>4qhLIukU8}b!;tqTHF3dI^Z90cA)P2??TbZCio6v7*WW_ zC7~H{5@<$>kWHdbB<#EpluNqd1H}K=5&KdpZ6J0IO|m>|Pq}SQ>|kCZQ#8ofMWOL0 z1BR;6x6}+ck0%bQ*KhDBdlz(r?#H;T2zZuK8|dkdD8!@C4PD{S1t%`#F==HlM`C)B z^T^Ou%B%64f1e`HiOKqZYnnXH$9R>Z`nSc(mxPR(G|4BZ4{zSi$Jw8~PFbIGRiiA# z-{R^a&9n9<-Og`R>FadCgai8(8dxSs0*W>{P$E3u2Pa#_@7!)}3t%4y3%-+W&! zJh(%Z?Vz&4XNsT%H3edQTAH2x!W<5Bn&dg<0UA$Y0(qg?^&xHZ#^ie|_smqs?yV#h zXze##q;S-H?Dy*jj#r6a*b9*_Czd=5s~8OC?RG#fA%dtPTD~2*W4W>YcmsV#M2DQ) zVsC|i3c<_E3B!_nBQxvi4hcGpj=zJnLDt%`_wUx>8HD%4i1n5GI8OF<6Z4+GA9N*9 zyf+wF`nN0eSBY>iK=A(;YZIE=@GtN}7z6H1^2eDHhtNUE>m%G~wBIR!5z+Yc+_&Z4 z3u78EbhIX@mkF=5!YktYmQP}41+tHYI*uA@SfFeH&=roR@9O)Z$4qZ|fXcg+2n)s5 z<~>(^%g7d+(3Bj$gUN*vU-r!Z`+|G@Uswgm-`oHEM-(K=ox#IU@kY3t5q!${NcRpU zq5>R`tN>d;20rAzMB4vie@IeO9uNb~6vdbu}aP&;ce&9hb$Awx0dl$IrdS)Hk{HcP3gzpxd zsW_QiBDJp`Z*e^>XcZoc})ark- zT;$OK=TeeD$qq>;bCT`ukR8fwx7`i?Z1!}7^7LB$jTGftd9Fm;tYl$n!1LmXZz;n~H&cSTr%gW50iA zz`cy;q~`q2+i;vnHyp}@Jpj&E=?Z`KRZ&_*NBnYmgIccJK8oDa@gkhmozPyJC;dCN zMr&?iF3bFmBt8ZpjYEaW`|W59ftpdqYNK7S75s9G2{(z zFwHR+CJL|r^$!V*3_!y0A@%U=?bB)~>ml_NDLS=}-ZCQ2n0_(Xg=$$Udq1FRrn5U+ zP4Qm9xqM(}SKj+L*g(F0<3k5CJ6MG9F{-@%?Q=J=&esmTUg9*F(l7+R2vPY>i?IWk z?e(36I5)ga&XdDGj2#vtzd5!IBlkK?J)!Y#H1G$&GNB8}Co3*uK__^_$XGnS>zl6k z6^-$$zlI@nLdi|d-ZscR=ANGSPpL477}BnvsuU^bkTJ)f{^56b|7iOf_JJ)FDDn7i zSFUZn1QorJ$m&%p_z#?yD9r)dQ&&H?j9(CLQdNaLv{e4REoZA7x#x3*5ku7^U)DD* z{GpPb_r|^WJ*g`-vLx=r3&$hOG;1@k0=6_A7CCQTjfbx_#XSE?kI=#6#eWH2l*!nA zVyig$>cBZZRAh=?d8|G&*%v8)nw^Kg@UzZJ!($v)+qa~M4aF2;m@ok!vV$Lz+8W0T zs|Q^RNWlqZMSeE_u&5-B77l(-$ctxy%>7!%@`P)$E06DMQgk1W1zI1mE}|oQmmui( z{788-czVRo5WmZxbsi~(IbSf@{74r-Vyd=(^mW)F`&Dy7mrU*-@$H>Fm4%|XEX0l4 zaZ>pyKOk}oD7E3K^RnJlXD>L^)ULrMi9;(W}{?Ut=m5uZ8n>AN-Ly8SRQ zQsrw>Fa__)(HPaERoOe>!8l<>QyXk^hpm)n@Hlu97kBnmQIS=3|GfC-38RgAtz{l? zir691hy0s}T#s4*ThYAO3ac);TVLrHS-$!G;X66a#bcbPDTwe_vL25+3u;VS_lc7x zqp?H-`w510S(R%~Kh)itEfKm>U9!yT``m!lqQYOleqF2a_@1MtopPJA!0@Q);{3#{ zIlxOd*uvaAs*&4ys`kmWR~PHYk01Z};om`L(w+b;#!AcoS}ANb6nK1JR?>=0x2kq6 zAVLH+Ji(yLRX+Kmg=qrmv>bJen#}|2?*6;~8BlKMH|(e9GMn}D0l&NXR5nT~DnwV& z8OO)R83!UZtr=3TW4GNVDu3arJ=&aZct_?9FQS!_k`lY@BL;~ke;Nfd>Zui!mx~ml zGXyJ|#S2uA0yk>L19mzXd}gz|9a5xR=`W5eE|?z{|H>QwX;ZlPJ~zg0tK}eu^EG#e z^L*!PA@h&?+sCV`k2_=8+3jz_9wu{6f|=CBYiepN5odev_WM#LUe?y$>FMpY*Gz1( z)O2|IG{#Q2yQrdqs%5zyq8F_g$=w0?VMpyuS*h(~{ap13kzTDscy)3a|UtE;OyR6zXxcq4gs9Lyx$2PlO} z#@pdn=-%Gm_m?Q(IF+oxC8n`*t8_$4WPiGJ?9$TGgJ3`z1_jzE0l-TR4FK)d_@8)m z5(02PKfiYedBZEeo-erUt&YlHobCo@^Tl_6`}U1mIp@(L9Q5ZCRoI({UtXxOs{?yl zq?3Q{f@$NC!~_W1q8~qgd<%9O%+j&2upoEwPS!&8mDAdjJP=9s7Pt(NJtk&D;QySF z!kF4!$01I;krdy*-NXNWv0C)_@ne2r;r!fOuI((~fp-_;^~A$Y4;kYlAdXc!Rf!7# zjBX>&Prsd9;Rkk=J|M0ViiDDrcuJ1{%`Jet-qL+eOy#ujHSSVaK6$6w#lxepROqPp?eL0Zsy6SC&mBogS{;~fXlUp!1-`5RyIG%u z*#twN&n$YVKuZsJN2H6i_3cj9UUF{qlI`e9#XzcU1IZO&HNN`N6oi2 z4Yb4U?`moi19z7qW=$+CZm2K=%)#cr&_M`zUut>ez5Y93KVzKsHx>=HKyK&k(5G)} zF10+<=ogq5)%lE&Y@*T6^}PZQ4^Mb663}msank>1{Q>cB7~KtQUoIVZsK<0$62}74 zxf@Kr3=l%AREFvy1D1mfUAym}-1WJ-MpIl;V*eeHqXsP7uuJQHO+`lnKVZ9K+w0YX zL_oGWzb5Qs9S0Q-q7|b7U4s69%Um>ZChF-u z#EIO&95W7_aAJ2D2LxegU!(E3k8oTd+a3k>$JLdah87koz0ph(_cl@ipRuvAk&wva zFW@Vi$s6BIU~XYx@I|bP_)&5stDt~4NyzNFL5}U`gs&qbBM;#4&v~$Tyt0alia{|WNxUr9a zUwaXDfAK)J{bM@EXhIEZ0oFxW>G*r>U$wEavL+-YbtXI>XJ%&p>L4CI=57-$5%lK~ zu)Z#jAFn>Ok-ep!*ndl5qr32l2;8hT@q9nxsK2L=Wz zW@b#lQiLB!-nsL^q5FDg4C@X151C{JHw_F7c4IF@1qJOt|3f1G`zzPXCJ;LYdCX^j zOiiU;sq+#Hd3pa%p#Tc`->)cro=VZ%w7-bSe;s>}eIxjYR}wBAPs)F3{{ksMEKq;V z-0?YrOl3o>a9GU>?ek5U*b4(DJ{_I{Tnb*|g8bQ^VYlh}I8K!p3khN-ujqwyii!kA zve4-3fDHmmJ?jdDmge*0HMiO3Q~&?~gqfh897aY)YKWZqPghM6c^X0lhdl$}+wR}p3Jk@cM0cm4j)^L$?FCF9fQ zzTfZnIoEZa>zt49!a)8TIKh{VD|)|txzZ4Li2iJCZQ}Qjp@ROquG+b}U)Zr?oDAY!D+5QTC{ey!Wv4#HZ zS&EXC&f^jm*2?Xnsvb4XkN$!(9>yR8&X-`<<1V6F1i zuMGCFT{k^r;I1Y0CBw!iRNU~w?^f=Uh)rRHORcMfi_g-^Y^IUA{Rq48rO>LI(N6DQMSyYj6Fh)Xta(WQavC&8t^&mFeAZ&`<;?;m77z%{e&qm$iN*v&Xa- z-TuZk+nv;zDDGicewzw?mcoW3iC5RMMh|0SW9j`@KhOv6eou65BDnTiC=7-v-!L*V z3fheR1MP(W_x?zao5~?Y+|(t>&$(3?8F3~^ie)}8LBRT;hiwpI*g&=`f6d6ZCa^Iy z7+U=?_e`9InZ&9WcH;^voiLZNo$(o)noyJSMK{R52fvhM3CryU-Whp%dTQOgc~0l; z&TV`9)Y4MH-jSr(8G7VkO;=z4%h=f1(h+2{`*AaH%R`X~9RmXzhew&}aqF$JNBpaQ zqRuO?yBu%3MA<&>h|!d3M-B%Ox49(m5{Iu@z5C`qKdH>%4|=O@KgY}K=}~1Tx)Y-C zHeST(T&^zHqyA<`h}#FVq7C06joCIop-S7Stf*LrQ@D!$$(B6~1LPEqO)3>Bi1bLs z^dLtY^gc6D!9903xQkiM%l{8pbH_r4;^&Ch?{%INoO)TJQ_pYdK$x#Qrh zf5Ggmt$u+?dq*sH6{M%&J8s=)?Gis+klj<&kUjMLv$MjawDs`q8BZt4gm+V6uB!Jh4-k#W(-dG{O4*&8^ za9Nv}qszYV8YXXy#;#5jN{=&OldE#Uw@Silcf^~w!Z@P)ze=g?u9*6Mx$$c<@OaOw zl!<5c4ppJi!{edDYpkl%!ilasA3AZ{JmuQ1@lrDD$dKSdbBoq{q;8TVB`W-CX+`cBDrv8uqoWhFv9U>OnB~1$mXj(D z+wV)`u-U!uAxX(^05kR;@msf0ZdO37wSict&_KEjppuWrzIG}lp^vc zq1A32_QRTFF~037tThzJk9PgyG^WZwpq2LZ{1x!qQ{s_OjlQ`#ll}P7{z?x^D1FJ- zhP>Qd0?+X5WZx$(EiI{i>)QYZzx4N0-qv(*xOjqKZ}e>Zc*-k)1pM)YT%`z?L9y_T zid%p6RgeFpV(ZotfXRk-?3qW9A2jhejnCxIXMQ+updh=g@}>J< z?d$}91{mYL7n|vOt)h*_&wycF=5J3UTHn;PB{d#5GohLU3cJ$GOz zJ>K;j3>9~VwR?vfjt^JF|NMHhw~=ye(pwc$V$(^@({SJ(F1aigxKlIPH!$$h@MXSn z<@z+!ar~PInd+$&$!K4u|BZXOE}a<14D0rqY`G`Pj70msMsSmH>s3mAibRt4hd+BpJ6h0j;F5%dL^^5dQzO7)!2|GEUSHw37BA=H=2&!Q&^AcJ z1&KNS{Md*t*ig#HqNV-lvyUCipIG_&UZ9zbP-}qOnD@WiIz$)m;LNW37y0Tnb_=#u zx2dIvCk<2qNYhMv%tdZ)BE7L9w`ry1z&{R35sVDhCGR{X816Y;zuv`j>^#*N3^?%- zVCbt7f=rOW0g_5?*4LXwm-=kjW@)B$TSrL0^rXaKL=N0IG?PC=Xl;Z8d6Y3dGxOT9 z;CsU40S93F-<-Du&KA_JtDzA*@Mt4N=O%LV8biZ(PcN_aB^M+CaG2j!x5?#>F44)) zu)Od0murSy8V*k`y!dYwf6LR2isO^pMDmOB?4-&IHe0o8Nu?K(MZPXal8V`?cH**Z85o(sJG;4VnzL?D~3{-fEySq36TJ ztSTMYa}weQyJ4L^YVYo3>T4X?5C_!lV_NzzVBhE1P zF+bW+i|&uRdMNd;j+?8sjdw&ypX3=C8ICa@Oc6X7^BmPrw*ny^i^D9Zy-xG+i#PPG ztgFASk1aQ7pVmtR46I0=y9F34tN_Fe_|sWF^fHh=XM$L&z& z4Gida%j_?vbGP}lmiEYWD$D-4!RRwX_GfD$&NET208n1~CHS5u@<)e6eC7;K)l788 zn};QqAMs=kzLS=^es6+*uCI6U>KGe$LKYC8K_V4S7WZ%Fm~pVwhYDV396I^f(%Z+3 zzz%J7UG}n|C@Nm)xoE*TOvC!5!?N*wwzf98&fCRj z;o;$OjGfAR?w`@qPm83-V*SKU^%3K30p98Kva%O|X+@kyK0W2FS8;T7{Iwx0B(xgB>mQupQZN1`(G70i zQKO!LDb;UrZffesG#4ZqoMfsefgwgoi{Fp&we98H%sl55X`_+cF86Pc$D-MA z1>pVw2Df){A+5Fh_~`T{)9M!h!&+W)UkkeyxgHOo-*vIL75GTB^WebXAbxVv)4#R} zgRi-%sp+PrZ;)eQ-OEwun#(I2{;Lm|W&mi-^y_H;d_Ns-4c8)RIyf=Wz0o7v1FP;c z6^wsx_j@Qd3|d0mJ1<{Lk&#|`=XSH&^CBdEOb8T(8^q^?9s}upnyZs70DBXFbdV{v zU3pnq(Vbxd+wR161ybox@LbrjvuKzd?g@Me=kI51`56(H33?;>Zb;B#AP9(me@Fp| zS}2q$Q0!wUY4*Fty1SHJU0t=SO+=uq#3PR$;Vm~D2Tla;FD2SF0D$mcv}T%)Qf5r6 zt(8hikXKbDxRBz%?mURHpQ}%)ab@i8-W8s1jp*Sv@J5fSVGr*XZl;`V==8E8#mT1C zrGM+Qvh$ho@5c?sz5t)YPhN05Km2CiARJR^8v4XVLsI3IWtbD42w=YAyu zkb8wdVj6ND{n7kXVRF*Vwt6~T@`{Z(P!a3)VnK+HJul+o<~F2lW??bAJ|~I`&Jh>Z z|G7Q;gu9@Pn3j*Zw>DsBT-4*^Y0-xr_dej#D0*ivwE%e%P-eKRYqm2NjL#Tf^*bv; z00bKGIaH+-M8)T3p2*AxjVz~D(o7SC9rbfefF*IM@Z|FD0(z_~?J3u>{bZ%V>m1j3nG4w7u}KzU`Qpx^eQoTEonXMpJKeonm8=O`6k z|0sv7*e$(d0y>BL2m(}kEw14p1Vv!k5o_Ly4aY|ZQ~0tLKRaR*k-Gy%;{^yLhxfCu z9o>^@vI_&Z^4=L1vu4*(QBnCH?@!JR+ok+Wf64>=m}`#yywbBNlqhi<6x;$bI$m)6 ztuT;km!E~e!1OK^s+4K?sjI1pt<-MZJKCE=vC?OU>?EbDSFd&(!68Rk(r?e#a312} z2niwC8wWpV8m0=7L&t7$wyo3u2}-&q_Yb%Kp4AVE#rhG|u79{+3T8My50+WPrM{YF zT$xj2uRcy_PuVi>aDPJY_mVyjF6&=mScwTQUfNFt(8395!jo}{zmg=T9yGtOps>=O zJ(HRJXW6>}>4Z%X`E}x}rfgF4QyPz!vv!Iv=Yp_Frl5rR9q1GRR5xl&YXI`M%_`Zf z{b)u}u=tYnuha+V(@*ZUh~@w}xb#&XpWzc)`+x*1XJjO=use-EJn@bR+ELv>#IL@7or z>qvJS#Fy)EY4IB%zTW1;CelnkYg0 z>c=sw88q{An~74!yP2RKb^Qz~>Ae=_-mIt4l;VFR)Vu%$XU0x;-$=u+2jDwwa+z)5 z`;T>O0)DHT|0t+gPDj$y=RB)y1-(2;^WI1u+B^9G@Z=O%L~X<_3&iY+9b34OVZOSc7u#+W5-s zx;4FOK*)cl5UM!WV^+?8j?If_ND7wUT+zxgt_)F`BAs2F0K5}QeeB1H&fpJyEvSrw zqh)H^HB@Y^u<|rdh2xh`DDl}QpnNp*WAf^Ell|9KU%!5RB}wuz(0o7xkF@;Iohaqw zK4bJ`n99IJUR{0HMXyJEj^4R$OCM6TwaQk3AW(D3m0H1V@f%3hLP58x$#+W?`z6YzxA?C5NzUw+Jp7Zw4Hz@NAv0JQ5U<$AWZ&@k*Y%f zpWI`vA5W+49HP4&;N>%xsEmn5unPTyH2(fXn`awKiSoOfMWX0Ua3pkhSx#04BP&j@&4v)`#2R@^z;aPX5?VWkGR();D=1(i&~<8$HWaE|xZ<31kR+kj#w zJsZH9yZT?DD)&9*kvR)m{z5-Gx=4d)o~|0w&poG(H16wi30_fTV9V&i{!ri_FqkR# z-OLu9+cB>IbsU8i2Ycj1$N569DYb@!s*?k=(c<>1B%gG!bbymXmQ}-pLlZB`Sy#y8!|B%r{)fN z#%br8rHbBtIMos;sG%jlyV64El984ce46gZu3p=LDO!Wu@t--*^c|F_2$t(R+PMhj z@rLa2M+jrrt*z-BsuLPQh-lnlV>}%3Sp9&%v0#1-?>sa-=zQt&WzbTbEun67XZ+ma z;Kxd*(H5qoReUsI#(!0vclei7^AlDB6!#v?1wztzc|UJ-VuO0M5m`=W~A zaCBIX6Nm8=vhrkILWF#9?g3jfOL*&@f6hxrj=%KGAB`#2A3jmfOr%a9h^{iRY@48i z1L0QAynXwY7G+qoT}0)DK&`$+C#E(Fef#$9**RgZ?6YY4RCA~1HTyik7w!=XDI zP(w@g-38!RpmBf6P>uS$LV$*Yo5mlJx}zTuU8;6}JhfKquLI@RW9yp%q_(}3Fq@%R z@U|qN0Ixq8UaeQ>yfXbQE4 zFV}8pfW)Y^0To{$19zbz+e1KAS{3R#|6DP8>3#DnEBXz;h&hU7|DdUSshIrCWT zHCLKde`2Hb)k&7YlymBYCo7g9$o;OH zeafvbIBNmp@NHUak2!d$GZINf(5sx}&8;<{jSEGmqn5|R*;`#Bjq zb&`c_!#Z(Qlcz|6tQL}&fP!{i% zYlB0I@Tnmlb6buwlZmc((<~I*nNgj=Zy6@Gsf7@x;luilfr2}-!7qQ@^RZD4Xs5Mk zi1ceRZPqi~2>RBz8nmFvwol7=kU5Ixn7esU%K;Jd5zheR>XU-8UtsT**O=INd|rz~ zwYJ~-`&R+Q7LVS2O2calQ9@U5Y4?1F>q}nq?ve8G!`+RP*tj@Bhc6kmv)gPDi1fB$ z&K3~y9~3FOiq{;P=%BQO8d=~lTYtF`bmzCOva&LGTavuZt~t1)WuYvMqz+W!2UQA? zqXye`cV=#G7@WHJ7}fcU|0T`8&OBAx5kfKi z^Xkwmt`Ztfe64DX3aM{!huY0HYo`;*nLn!+6$H&rE(fYMD6o{5etC{5*KnrvT-sif z^T3NMKNTcvFXIvu@XsYVF@-o4E(Kn1I1cGA9<580)jI2}!GX(uj5%6erJZry!|c&s zgE$k2&W`&uVDJndzCQZO{53ZFp)=xV=OyjP-`k}p6zhi_;g#Rx)-5}xwquE$$_-$R z-@@pHg1M~(pY)`>RyFOfEVj@G!7&>t&3WUz?VH$2ihOy(jjxv`Z?F)(V7o}39ct2W z?v!`ArR7~LQY`sG`aG;~tmN>^Xo~Ash8P{f(+<^M@D_>6jx3;T4lyjVzmZx_!Er4$ zJ)O1CM_%0>t>FsVkwEc9&1~aDC0ZOR_KDlrq%^L$WBI))ByBsK(-ChpEpZQh)#?SVD`9i zRBDLrX%LOwM;U^Vgh}YHy&vsur1Ip>4UNim=exts7Qwbun_lwrF2*iNdgK=RToirp zBP+R8L{y)c3`Hk~w$+&yXw8z>vf(2Zlz;J}sJy(q=@G}m)8*Nav9EC`aK-LNsDgN} z0FdCM#4O(9qZ}U{3Kgzeb$4Kozoel!=F_#PisJQ~#t%FV8XSSQ@n^Q1UcY`Cumk?W zV40dr`H&ZB7yq3R^J|dzv!ejz1i^*GGq>v? z(N_HDdi?9IOLj|Nm*xqLJN4!W`3tLr*!gEg7qZ)&jUz76am^aR z<#3hBHx5PmF+M-9@`*acM3!*(E-{R_BFrPl+X-#Sms1yY#BZDm>>Xf|K)63XZ+~&+ zck1GCw%LQrE=z#{$A>|OEIJJC8nT>cSC>;H^{*_HxXwlP$6QYoi&|fYw?-7k0OeMs zGmdxe0n>p+x5vj9ZHhN~SA$9YgMb1Q1EX^uoYi(Mt%KVLk6!@+xombH?&GHI%ov+c zhC(XWkoe68__jb1@c@yh$g25?mLJH=^bk0SnPd_bNW>q~nEUhh(L zeed0-ujHGT+)}-!%C@EWAEEs#x<1i*8`(^8BetE=BTcFP$vcdkQo+~Zk#g*6Wa9G{V$gN8k*+Ten z@K%28*;zkYZoqpX_fvj6;`bt{O$|3id*i@`8d=Ssp+id>Kd&L21X?#smKakL27)>^ zf=v^-bqLrGYf`X_mg3~5mj^eGxo&OyuZ-#(mX_XE3m~nitKJum9mEJ-E-J(lK(HV5 zU~<;cS4frb3m+mRuLwpPf=wr~YZ!4}si*!t8t2VBpjzcMML6-_Ug>7p7kamjWnb^J zv+$=U=w(l+tn4jW|H(alwk_c){cekAI`rA=z}1Y%Y)3Cx&=@DOdN^INdENyO6uDD^I*)k?AZigyHysE1VhK58s6SyNvOTAxn! zRBF4f;Jse)v-co(+$B$pTM0x3LO1?XTkoV4> z)R|MRnT`bGQu&KGYBjQ?q{X8Pm0p+dhBH|_jZHohTNFyoVZ?gNd5D$@&|rnG%q(Hr z9h@KJ4R%&@7b6%-i)D_>{?6d%*}&n!$;S~Ivyz&@+L(T{c(5V3S%l#j&9(D6baF!_ z0NA4GFLV`rkERjXqx0E5#+A-C5Lkl;!kJ`~J35N$93%~Z>*ug#gO)AsG0O)^TH-9u zWsH#tAX+IN7d17@{P)%YaEN_>7#}@TNLvzenE?x}TN10L^MgqRt(vjFwuC5~HejHu z>-w3$71E;w*qmyi)<$Y_WfNjubD|2Ot!eeI!TO(2L$!)k(0xs4(9DMLUa?`S(HSFE zjjW-LE55(q>2fqBC$iQ!NxSLy1&k?d^JlPq@>PAJHk3D@Pv*2|oHzh&PrlE-q&2pa zC33dS*@^S9-ZxUfdiOiHhf0Aej{0_TsqetM9Lmupu9+R{XvFtbb+rUqU(oXV%V(3J z{hdh!d=TpBCPCG>v>vABD$tfZPI6b;PXD)WKZWux0D+wba7I*~9p9<^gvGeGDaLzq zVK4%q0biETo+NmBFm3h$Y&HbmsM8k=-UcE%0MiZPR2a` zhtH^PvhYrEP30wKvsRn3htxBdR@MsyL{ZUYrdOM4`P1-Hzu)B|mzT*tUu~Mp*KF{R zvm+WP6Z6a;11nXsh^#Y?dBO5-xKUV~Q#(A;#ky~P*Z&AHsoRyicuX}x={j3e3m>znXfXPF6e)QDOe$c z)uSieKx=OW)B~9v!lqOoah^dTi)AsYvE~?r#%V)f(N}kJs%$J zLf5rXT&5T?!ZAvF)J=LU8hwb_DtY|BO^#ru+iWCSep2uPr-Www>YDLv-DV*1%{!Fs z@2^boaMqWkB^&zdHI7p4di+W9G2`RP?cFA=Iyy6jFaG)LmG4Z`B&VtZIg2iaGizhi zmH%Q*Hwu1&|Ar@Pk;jkJKZVMeAnT`AHxk`%07xPd$O`yu61Dcf{1yW5q316jaEk^H z=;`Y6SvEcFotumWKN4DiG(TF8a~|X|c^?VoU;&H9AT2@t{F}{Ct2uic_1A#=fVe#S z0+HV_23lF?XAA2FWiZ)3N@Zwxe}!pV`E*D*n1N%|GTUxN*9aj;<%4EKg)zPQ?31(HZ_Pu>C^E1hW=?J+DUglYA~JMNx@Sf8W^WbT*LhL{f{`#jkG5 zEQI}(y=t&Z{_P#cN?~{RV+lJ#qsVicbBxjGk*)4!7l#${|4w9nsvI?`UNS6V?j1Q{ z2D!gAK*~>zPK2r=0H}}c7gFfw59Eo0D!dQYT9pGOpBnMl2tdsyf<+ba+#dIyRGe!7 z|4iBdDV@lrEVjO!oE(eQsSkI?;y*@|ohPqgvja8el5xeQETQ(13Mb<)WNcJ0`maCf zMk6J>lPT7)cB20#KFNxNSO2vNK0A(8gDHZNOo@M~J^IO?#D0M`sfvY$9w9t#HPy?c z?`Ipl*SwMZ$l))C;u!Z>8s81Fls}DITO7m54G${Cs%JKur%&|^tt^+Hn+@`)F01c9 zeEqpu>*isP%YyxV-8LFcM>9H$E^o_K(#b;)Ysp?pXAP~(q*#8RJeC=RotgKqc;S{T zMPqeWW50jHS9&uJ8&hWId@(@<&vKxV?m1D<2Bm0Lq>^{VN2V`(OH(4~PuXKNEwv}_ zF0p;1c&f^5{G)GtpDlgom5l)IYxs(--$DSbYF2amB9h~m-m`@bLB=@q88kdM51{=tD3s3 z=!E{T-T^z560&Aqu5b8qhEuh!Jf7{XQOG5Z;0Zrjyo)09&+JWDChah7@7kvSwk__@ zkt=1}x&p^LBR%~-cr_aRCVUqzqfRX_8d2TTj3L(|_?FtpY$ZVeWvtW2i-}v}4Uf00D8)@LQ1cVgUWmal?-Kz9yUxm|AOk~C- zb@$Eiv_@#mk#ASp3ssx?XxjR`(YnzkNEX|P0DW`o|MQViZzcBy^U1S8OHNg?*pORT zCgTZQ7W}HWN(qgoFmW&6BUqQ={`D@|@J@fIU1kLao!44iLQuHH8v*1wCUqU=rHS^@ zN{kP5yi3J|Ve#;9s33*wiA8??u%^L#w z*~2uVk+a~5d_A;i)ju(j?1`g#wTY>Fo_Wf{v~}v%n?-$b*PDZD9K$7vDcFS<&iE5+z?qohFuUKLkm%pD_@$5xTZkY0P6a|UDRwKndz zg4ZKQz7zJAyu_e8#;E1}l!&w>(NM+~uGDw3d0=O3lZa${T&SF5VCTgX`{2!d*E&c% zfw??k$Dvtgm^5x&)s%#Na53Dqcde%THnHS-`=#Z1za1hsS%5jMr)B<%ZQex%n&>Ymnukt7#oPHmQ?J_QXZm z4h+N-*yl!rv(5;*_YrjYeUh@49F;lO<#XSJdGz49y)ACv!2(t{A(DCA-9vG!Ycl;6 zRhz#3*vO#(O!EXm1e8%{iB2yhQX{+lmOzH~_|69CnY^xhiV(YV=q>vP2Jp<_Mp$2N zCy2?c{PjG9CpOk=OzCo)wVDYCDH%!du5>FGF?n$6HFLavrRx&-6THWGj~S0C!~uRr zHr3`kvKH4KZylSP$p7zY$zaUbEyQ{8=h^jzU`Zk&B9dk z$H}qwjj4cL4PTm<#3QC{L`mlg(M>jrGR3TnjE7+Id)Q5;3nlicQE}wRzruNZWT|>C z1xX$>N2GPbp^U)~kVVVS_rZkWFY*l6iyDW2wus6n_C0r?@rEMdvTF0YOTRI=;yr>B zf{Mkg4tGZ!=${rum~*MDxBwAqe5DZYWQOuEs zk}s-N)|h^U-CgUmft9p^S~Ea9O%r&i2W}kj=vA8zj*N7`H^o3~@T%cKP0rxJ(>y*x z4i#1wem7B9gF*RZGusgxOO-(`iH}ya>wGyASjG<+tM^3A1sT*@C8kz-XH4+-spuyU z*~RP3*;jQ+n)w5o!x~qDr(^z4FZ9U;NRL&}Z~IflQ`|k7MjW63uN(CTDl8FbpMi!U z1gpY{X!|k>7;^TiP6?g|ACGo4>KyjfbU9Pe%idn{A~l*P>8y~wR?Zg44qn$((_?P6 zn5eneZzQd_jyPmDM=C`>356Fk%GmgTvfz>}_o{cv@u?C_du$Qx!|ORh?fx1uv9 zzE?K-unZvN@1?U&>VvwR#vVhZ-ZSWYeYUN$|C^Ka3(dOT>g9<6`|zsDf}p*+2Sf$C zu#UVO_9t+tIpfzeLc_TM37ASb1$PryuThh!cyw zTcE}6$5OVgdj8KfYnuyU?FzyBsk41ob4}MCjy<1)+%gaR+g;CfRllJVFgk z=WYku*sxznbcF;|cXjAW9N3Bm3e9`W{FbP6(ht~8B`CIK0uGU_L2EVg=b-jJxW*AP zbWpcLGAUaN`HMDMMcWPDVZnQZ>E7nC-AecLo43oy5e?CDDnUgwoXj|9Zc*Ue3X^-B zV^39_u8$KtkU6jERGz+Ve5Ra}N4FR2iQ(mfQ@8W)=fA%~HT>c#)!QBn5YpH)P}lnf5>9PT+B1>I5y_*sd&|;>V^n zUtM{NIUYnr#OTcbjP<{Vmy`HLk+MW2W(HPlu)87c0j7oW2iZ!DNz6%%g<#>viFp0X z+P-(OjtCR4ihU6K_ZPKmw;E*@Z~DQT665GTeT+U{kc*3pce99tJ7x}~G4Az-rP0cW zSAup*{hH7YlY8UMqp$UK9o^mGoNO0FMdP6M==SG#HqG8-_Vt9>+Li7k$(WZfXU7WI zTu*yq5?v3Qi%cw1uro3L3g%BH0oD!%(@b2;1vuAbl^q(UT^p(eKp-TZ% zpN*BAi85Mey&o@Yx}xLf+B-Z(%w+tEz5co4J9rbE_r`+qDSdrD$WCw2g`d3QlfNFa z6W9}a^4#-mEO>6PmA3MrQO$y7Rh*A>mx=oAdDf#G%x8E!r)$oT{qwjuAaB9Y+naX1 zGw3!Mf_^nhoAttlP;i9yimpqye_|b_38s9 zWhT4&%ZH{|r_Tww61MMwR}uT25~9c^!+9^`mTD`O?ZK%wqer;?LLcxr@fjjL%A^~) z8*$|Xr&P;s7yf&_Dh>u`-(%fl7{a-P*@8WYy|i|L8GrFem14?js<4sr(ysue563I_ zmx~`OzTqx9g*)@_Z?Z)ThmWSvt5BV60`1$kY;2-lBd_QCXTkg=X{*%+x-jeV1xd+K zhlajiBjw!f?NO(%N=$fYse~ttlslq}+t0Ch=JoV&^<8c#MiG}k0*WeL3BEyjjM!c4 zqk}!mI5|i*NfqX`_xQoZjH!1X)>J5{W<~`o8CODSSd&MjvElS8t1ENI(LoV?!W0ro zAceI^RDSNC)gdDb%Up+uDX=QNO26uudh^)=Cw3y<7_R@b>v*&Tw=4&LU1bxf3--p? z`T1V)p9kBu6iH`uI)oab`fEYof;{E9_)ErS+fZI0>QNgTJA1PbTeey(R~hu+q&wMx z5fv5(LAF;6AY{H4b{@`xT9lksS zIYYc0{C}EQZ#jIS!-lx#;p3juAzsU4?a=0g{ZsZkclH=N}UP4+F=br_YBzdpRhAH(v;x&-Fpw~uZ{sT?feUBmhE zk>{VwR8&mt+Um`!SK@Jp(Pg*4bvW$bJ9S2zndVjk-!< z6A#%y6B7QMNEF`vu*Ym%Au}(C?J$pNY?vs5cp9UBbrOuh)Rsov#_IpQBr?PXOVjeZ zm^ZfYm3$6?3s48j3vMmKU?3CMW|+F0>KRc$PIfVX%bMs&@sF4&k|=QX7Bmb7|z8!~Sro-Nr{!SsdNx-q01nA}cGqDDZ2j_>D(`_k_=dAT>qB zAE8&=$q{q*DJD5>$^c@lKbSQExtv}TI3pI=Z~uBx=xbps&cyV_d>ZVi@|pR$S|d}? z&&ElWXF*I+hG&U%No!8QhOPS3$QIg~*z=~ zsdCqFf>$aDwaCCv4cuH}bB0LMsrKIk`E;tPQP(MW=Bqf_S`#3UN}{IS+ZeHmc9Zo1 z(0GM!8HXts!6=J zg>$aZ&9+MvdCpm!HBAym=`# z5Y^t@?KNRuc6;ERDzvt-j(9=y*39he(dO}BfoUh;)TOe9%}q~Rf%5?OJDkYf4eT2LryrAIC5syp04@m->oonhPN|ka^COn0Qz=j zW=5=1T#C}}_~`I+JpcK0ujh24S!Q*<-TNB~8Q-NKb=W{ZsO;hK8|+}#sMy%6Rqj6% zM`MK`&_M7NFZY>CLcE9S1N`Kud^S3`3m=*`X}&cmT&BOX1)3phiVos(-+?Z@QkTj4 zqR!oR)Jr)h@|y_GKJ*-IN68$MuOz<%4(l`QRt+yhDOBhU1y;o)K3 z{F~o$yWof0!Hf<_VXf-X!;5UnZ1sRQ+)TqyzuozvK6R7HG3>%ZF#Vm>vi~mcQ#Mg? zQ1^nl;U;3+dAG&fk0CqI5|KQj&;$y8dw6 zSpS_NCjD7XokU3cl1r_cJS^g&_|xz|OT?MDhj}D`RXh6N-~i*T+YXqgl1AOcp&NaP4vvG%g21&0^ zU4CYYl+iIc+DNdURK+;93C^cMQAT8`NuTm0f&CRnc0H(83AHXZ2E4;N!j>W#!`#I7 z#mdIcw)!rWZI!mrfE9>+kZZB;9i$huZ2x3;dN6#n;q+L@#Do7X`Sy!Yk!)-0p}&?d zF*7^+Yq7QRoL9(qejXM9%SUkj@(d!NNB3&k639L6U0pvx%C-apvBv&I^LnWyiM#9C zR$=`RRz@maR{CwBjCw6uN<8%mYo+&!8Kdv7G}xFhIL^^y_LZGP`EUaw3w_VZa#UAs zp+1MYtkVWuFNuzOQmCq`YB{E(Im5Jzm6rS!C0Hw zk;`hW_!yLV6wAsOi>rb88tZhhlAI|s11IS%iw6zfR%x<+K`zB%XY+z=hURnetxWG> zsbXqi-K3U!jUgQL1UJIHQQt!S!?dFX2_N0inJab5`?y}u%5ZOD=oP6d#1b9tcrCu) zB{L*>hhd9}5Mf-EWYos=JG_b6RlH+NwJ5DmwogA6#(-@c%-(2aLAJ`C=|QeU=qj*% zw4?QX&jGWDcOc|K{5d(t#d2rd{+94g;zinVg2mQ} z=}F7N6@f+it-GhTT4J)~1W5t{MLvc1s0~#~V-E#0AP+{1c6PWH?;4YQzP!7#?x8y5 zIC4&sC&9Ay_V?mf;Yr*?5nbPg7OH7?as2B3TE!+!r$ zqL+&3OM6Sfw>{HJ71cqknq#tD|EY)<-HxUI?uIZc4w2b`yN~9r8$B&zR;a=rqw!xQ zEG{PIBPe+@{k8yM!FwMBEli4K0f6M%KY!lTN}_nm<~T?K3`r$^-iBBDPCC}~T__fW$fSZ4rkLaoE@$EPsV zS&WJ3-StOx3$S(&*i1G%zzim7-_5DRok{Q8-mMJYy`^@V^WXAlv~0pIii^L3PfMXx z^LX@~NtJft83uAC~`d-_+nuSaIu{Kipw{cX^1b<``$=J1I|bi{7{4_+rjkQ^eOES(!)Fy>!9S;T%rW%@2|p$|&qMq*W5y#z?_pvMiij zluUmAflq!($VPvZPV|?dji`sJsU%s>Gt7uDK%I|hW6@0>qSUv zRYXxwPsHN}51X`(_W>`LFall2l(~8tBzbrnmrDP*!ZQ^Q7F%y{M;t1?!P3f$cX}(f zZA3*xLinYU)9@Oak<}tbgF^!rT>vrjk;SiAH-rS@0AIoo!r;OFWBH+yRlD|1>yn-2 zPH9sKWsL^Y#Spxwk6&mg6on-rQCv$z%zvTDb|Lcksi7<$5s@7%$`_YUwoN!JB&~#J zj!ps)A3;=Za+zf8+a9m+-qC(t2>SwR`2LEc8VMrLfd@&fOhdNvcGmfFxLw&`0~!$6 zlrQ`c0fBf53deI<3C@H?CDu@GW`ITzP0syrM6oAX8ai)J!_WoK+uqQv@CEWAI%6S- zi+d!V-x~UKMW0OaDOQeqC3vWGN5~$vfvx)kv`;Cksj11uvS$HWl?<7I&LSZmnG1?D zL)t||U`&9b8tcXWn3Q8D)_?=9hra4He;Un;^`6xojk5+^!aBn0f7UMOF^HVqnWM-Z zX?)PA-x@%<)AsQ`=ZK$gOOz_MbMt+l0~ro|3K8FartylEl{_`ZZU2(tS@@j%eD>PL&f#M%ZUEooN^ZaW7b`MKU)*9sz6W+~zt!S8 zJ;3YcciO6$**c*0wLXrCCb@`GTj$*)eC&ejY-Ub#z5A)=ZRH>mP?Ne1?L@v7cAR~x z@?)gV&pQwWHOK>Wzz>DL913k1yfY+otFudVQwoFvbE0_+teeRI+kd* z7(HG$Fll}uAb&OKcW3A9s<|vt)bwrSNxo+h)_bDIS8rKzPX$^CuX;~Cq+JxeLsj%a z+Z@{)D>h(R_N*9P{OM-@Vxz5Eem+{i!=tdI^Xd--i^E)EiqB*-_hT}C0HPDxbwY^Kdm+QsSsIbPABUjKZSM9UTt5ce9=cX3|%|6tGDK zW-IUc29#9)>iwYZz&-&YpqhKhX#XdGGrifGOaOE#wDhj}0armKbL(nN-ap$*>aF1n zNu!scO@vX}7utYZFy2ahfpG_2Av9)fP!hsICgYgUMo(z1OdNd<4rQ3rfva`Hb+#v^ zr$6_@&zeg6z9xr#Xx58PpqnkyBfFRZ_+FciC}{Nu3#_2^+lL{!{7al5s-tx1iaTO z*RRiPO+WYw@D1&jnDYWd>@+ZqXGU%CcWu)Y0-AbBp*{PB3mecG6!l`Jp639D5~1=B zL}cPr0YT?6F|d==?# zw;G<1E0DV~t@8Bpwd^0Uud=w_pbRh}@>g1Pc@c}PgcU)?)M{5YZy`#5d_~Oi+yzTf zZ5avynAv{KS|2DAyQQ~NY1@{U^7#o)mHmj26{)D@Td&bfmU zzKH-*6Wm*t4GoH)3L>iTBoHP=mXlRL|00i12y&6CI6S{9;(8zXxywrRo}TXM4q30@ znES~xW<+&(U6>&PUIOO6_*%N=?DD=zb6}zsqg1eFAfw&>80Yu z9INgwkG;w(sP51i1#{kFcaR0rDWXogG-9xkyym|6BzT4Ow@0@#$v*#3^jdBstqGcnVX0>RPi}5 z2gNJY@mi>)I`&OpJdnlE40(^pma)m`&!{xt4^3{qFZ1Ku(vW!LXkoI&x90Aok738( zELhzz`JS)J63t^DV)T&s$eTMs9`8Mg91ora3&yJ$vCtl;C zRKLQ~jcy!j%jvQvL!mWSr=qoIj=^(b$Ncxur9)UVHRigLlCV#+euM2R_h$>llJB|3 zl{~;=LbEH-B>}Av${!!*-cCUU3Y|FwB{sJyxgVzsQ6dXY^04d*lFlF(8M3a^ zDLtc=cXlr5`BnwP0{Ov}&MGJv12pmlnm%p!HPqFC`!i}dp@j@+y=(#DmQG8Lm7D-1 zfN(B38q%fpU;>#z)=*vCBWz;gnnncG zY$^ytW?{+hp4p|NepxCsb5pTt##hz~v19&A%S6{#r8f(6N2#w~Kt#ilf7RGZa$t|r zf{(ht6oanEko(bJhm#Ed_wV1H%VXk^^$&=%+`iTNcm%FJHQ$|Z2_dBV)tmNU14 zU?nSdQh=cNbf%An^a7Fqy?JoZg%yxc~eDp6GyIu+X=n^82t%v>5NXyGq&nM?-tQUHM{ zI*@NnQ+mj>9Ieg+@f@g?@Ajf92+uGXhZfA+wva+ zlt)-gS_YL3{KKHvaxQnS4k$+99AJxGSiC}_gBSn!x~Gx$XRjXY0P7ns9{2_O81kv6 z=U`v^@MHhOyMMd{SCEfCuDe{?{O)gow3P>qGba-#l6kR^bhmWp+F5XSvPIW7PJc3g ztakU3$vf$y%QH7gL@^|@FMQeQT_|pR<+xV=>jMTCZ3E_(m~2$&L!_oj_RjM z;wgv4>SP+nVn>|GKl(SsW-S{!TP+$wud2}vMvesp>!JY^K@TA-YcU_CF~-_F=N~aL z;}`BYBHP=i?^s@yEo2aBZaMO5ZebtXD0Vp!MZ$s;6X{_v$g*P!R3|f_Qe3}%_IXAI z8#H*eG#qX5n(r@t$t1Gr^nI0OQvHJ4ARLU`Q6vl!MIcwqZNtEWR0y%pz@-E5<4XLa-I==5Y0L|tsh z-n%`c6D0}a(tF!mWT^nUoraPU9-MA#h$m=Ee=N5_iA&19O~}m5E#N51-`?uIc`IxW zZL>^hO$gepSI1frP)@3j{w!2Md;G7#LMF7m7BYB7X6By$929bQq0j&<2oE*9gSm1$ zf5qMuI(x=^7xM3n&dMCFqZ<+(>2OZyR1h?YYrRoA4X;QM3ThzV)aoFRk25t>WV-J@ zexVd5Bwke}IcQyD5RiX`P!Df{r5N%bVG=80RoW`nk(%xL5Q_^>>nhu7y(#-| zIKP(=+4ir|fEkazO%`dd&4GlECl8U^aNOVGiTmHK#@fzUGw_CY}2#WW^p%O6I_ z2Ooi`z&8v^%|MsL83Yj}5RGGHX8_uw4_l!G8@vaId$9wqfl5e7i1IN=MlTi*Xr$z> zzK8_yxMyI_(mR}jUv(7ZFaGkQZ>x^Cnrg#CZ95YOL5>97Ad zg5`sy=>Zs{Zh<2HE#LL~O+IUnzSoI>reQufc1D3}={5ThHcj_A6zqn}bPo_nnFKl> zPUG+9u`2=Kt$_$@^hVpceA!f(eyJ{RMcY{bwo3Q**c2el^f%f;v=QP_N^IzGnXzC=FVFbtZh2L`+_2D_U@3zPUL zYl^ixSU>14C!j1j=twCaBU*~RgWgt3Zk{9B7`A4QVD$mNBp8fMHVps8WCR0pzk!_`lvv^rMaKExL@}Q|R4{kF=AF6$S9)k4IUIbfh9)Dv{PUyz2 zv3)dhTcnCkMm1IB*D9XybTLxF-a}yX+NNvX(axWJlrctX_Y(yg6;*^@g%0GZ2xVM! zL%s4vhlxlfoX8rwMcIE}##ArQ^B)sWox_{WBV`bpil>*El|K-oU*t%PASXUBJ@}C> zC}NC}!^r(pU*=T}#`wlC5F)EE%b)^(ldUs%VhvklSK5*cxG2(GEaNaA9OlYB>P@G- zqXC=%df8ZLYBoOX+@jdp>|&(~%>UD-v)h8 z+)rhoFdMW(1^_sn+NUXER=L>rY*NylSJ&*(bx)aPd@#|1YD<8w%L)40SRJS`Q@eRU z|91ciQ95lEcNzirg;B~ae`OC^?mN8Nbe<|~n;jCESftRS7D6!8CMKJuNim}4chHg14(2#~5;2b0`z!8^m zTM*?4y=GeDIZJCU`r!w^Xy*i?IO-vNzMs7)BUO5lAp|15T`b?;I`aF z#UHA%bSl1M>y8hHcR8Pr+nhJyyNPVdA;M6otptR@%zy2bYmofQ_pR|71XK%~D7u{KB<- z20!O)o-3$E?%Q9dd9#h&A8)JLUnl9_OAVbtEu#-doJ2k$#HuDF*m9oZ$EiG_+hf{e z6DK77BcvsP$zXXz^0j+jKL3F7Qx@_gsC!TdPYbB^ved`!dpgSISlzp}Y zI^3B+J+S)e_ZwD6)35itK)JprIGiIqgD>X+`=2-%kb!d=0gZT&-HE}7d&-@bi25f#jry0o?R(Hqc+Pk=467oI(N(^PHJ8?8>yFv!89C1yvwtZuTXuCk zHVk;w1ksU(`ZJN*Fx~O8kyZ-T4)uNWi(Abu)U?a_Wt8T68@n+EeLjKWx4!NM+vFcc zAt|ahU$>(>1FO_;i@}$k@WC-+3=ixX7AzP}zu))#5V9;wyYQGA!7-UcVr zW<|M@Q{fo-ps^dlt22rulgZ5`G_`{{S{e!g*J2z~+|@U4`G}U0o5g>L>VlaA^Fn?> zHVPUfY}{2fvwD)+3j%%3kQ08Ad&l~f zl?SD_5@T3>>5xwIgh;1H-$~hokdTun*H#7BFj14dDHZ8`?a#RFH|-|y+Pc;So{8X- z_EhR@4)wA4iwRN$p0lFh0SJFh-ET>H*lWP*s1YNlwDr(DIEX=Z z1-(=_{jELdo$g~~?v4-my7oY_`68Zy&VucuRpgKRR^^EwQ5pPGt~eDqGdm?L^f+=P zM?oyie}4<&Gg8!WoDt|r!efuU8;Kf7NRMLf%5S;~^UvWsceItmP#n&4f6jG+j8V6o zBcI=t!>m5agH57ebjrxpY=9n7dD0Eaa^c0m>#qq)j3CpXv7Mg_K zVj^Wi2Trb5PChk8^zr2VF@gPs4dUl^5d;QaB_K^a`keP6NRPPTea2HCJDTIW3q#7u z_P`;c$k_TmK1J{e)p2w5azq)4v70Vk!rE*{N2TF`VbUQBsrw%?S^QBiXUK|9M*jG~ z+^9yh-~h(kUp17sAB?t=7iT(lk-%-3QDQGO=AUGhALYK7vH2!a*9ksy+cpDQT;y`GWudfp{rvbT4W)Qap#qqAdjl(cdGs1CcZ?@4>J zBZ*hEyZ*@FKMEh4BszBXX7&C^XN*74y-ooU3~XXh_>pbvv#1idC@V9mIR_6&RL=O%lGlm%m?Z= zZ0;~*S&+)cH;0|B<2}1or`e(C;PMwj<{D4poRBcnV(Jf3rN#)|x~RQ2{Li-V)bJa$ zq}$sILc;u=80gMF7n>mb~XP$Sze_T-%LRYFLZl=+^sYHbt za?J;vmXT~0+GSO}ho3>0eW<$K1l?GN8C*$4Qo3;W%&b@T=Z$;Xos1EG>&b%~Pb_w- z=4$fI36`Xs&v7?(#EblV*nBJ$bX{#jm+l<$x+Q$t%R=JwaT(AbkPWjRe=m}$5lQJQ zz-izpgymEneY7iJu>2!@j}F7uKfiBs1HNIsA7#aNGKBuha()DPNp_z-p*&e>mq8y6 zl+W5gD{80k3;;U`8^@DT*z4*TeXa9;&RuY?1s`+Pu569#V|B%Hw|lL1vm7ngq&9|H zFFASELmww_&j4foQg8G8rrmzyXIoCwi~YLwOD|t;ld>+u>h+)%8vh+J7Ow<8uI9-2 zUJ()bA`Laa=AWFjEPl~-7bGb`s~VirU)41=?Li^rx-&Wv=%KvK%VU2c*AlS10F*t7 z74gMZtGd%c(PImUhq(ip196~EW;HXB^k<}m0^r9AeAetLnLh;XyOhY68+f*;thWKJ zvw^U^NY)pvC!lh$iJ~5kjE1htU#AU1|(@OCR zSi-Id-V*|Ib~Mhq37gYE_Z2GqQcK!e)>FTP9>eqa@!#lsgB80im&2z>yu0MBnw#q_ z;7+eoLp8nJ-+S|}m!ExX=u*<`4w$C0&WQ>fwF?fm)1M8G_dcW%5#!Y%P*AY6MUpgv z_>#h=ba1%;!c*z}Tfh3nwS8a;ZR;7VNdA~eHlFO){;IE|d%_w@4Rh;$^W%i?o-tm% zudf+b9ocrDS+F}HasC=>3i}Jrt-O4c5c#zwJ5(y?S4H>T?Vc{&S7yq_FEwWGB=j+@ z84qp1E4t%exAL)UQ2h@?pe&PXvbx{3Qn&6nf8dp3%6gsj@k zM*7~`+c-K9L$-DQ?0S6Cyhl|4AiTOCUn~qC`aS8XRXf?d_Uz~XdW%%Ky0ge)4*J13 zLk;Jx7UMJWn7u7Xfd1~9cY#6DC(vU=j){S~pz^)AC@D;J3rMXGxpX~1l76t=at=gf z$c{@{Mp}c9w}tfIQto;V^z`(Ax;cc_UU39u?_YmqvD(-^y@%Kj0F8roKvvAuw=oJ7 z*M3r5zRrJ+3WckT-v~MJD>d3CH!Dz#L|Ae90t9sb27pHMcb89e14d!?`F`8E90d9)1uZV1s?>vJ5C%&Vsvd!M z`J+ceMm%ZpTP6mqguSB78jrL#haLECh?~An$CCy99Nc_{y?vsoTfzuvNrvL-%dImO zyQhre*XM#Uu#hF?ablZ%&hhoe#Y%BGh-Oq(z)?ZCyJ*y z8Q~;b7yJxuo<~VK4v`xZOyi^^%(qHZiKA0dQgdjHjg(7IL#2%$1?(X9y>aP}Kxuw7 z?c1vIoCxNYeF9XV~7x8ge$>h4OU=Rwx(bjFP)-aXdGOnb~+RO_&S)aNY<>DIH6;jOB^ z1?r96W=)ZUXF!8_FquR0$IpRcVgf+8(SN@J!17p_dvgLn zJgMl}a%5hA+yPWgK|N6dYWVd!Zeh=S7<5|!v$(CwZC+9S{KON8w>gv6g zo&(m^0IL-b;A!dT{Twwe!QODqd$E_CQ)P|%k)u2@Gl#dGDAsP+wqI^K5m{*%hXo^A z*rxVShL~8#N?5pEP32H%Nib$ZLfDUQs9Qe4UdSyW$_HXNGFMFuNvNkJsI0RIS80jJ zo1XU+iE>IH^YJoZJlP3vTV|Q43k!DH8m^OeOKMv_a1k(ETxVSOWZd)Lcr7~<&twFz zniFS`K~%dzS|O96kt|O=oNs0vn6K3gGtMP3uDdF@$*s>SLHLEoR{sF^JJraCN0pl3 zoqNztjmN2Bnti9Z4Y;KBWEz5QBJ{;UBJ@@I$tmp>lLPHx9=4?-Hw2D8GHw_xeA+-9 zqVe7s3&!C;8|bbuic>C^7pL>1BC=h|m>9}2LwX+H6K3q|Z&}PQvJU0$M-H7P?=cCT zy(K(h_RHB!SiCQc{>?2cRZ{qvBE2+;KyZQYO=8^S<|zRz26y&=VbElFd%U?=o6J21rXI^8cb$>N zYNaQ?49}{V1w9?04`hPXV4o<^3Mm802|zeFfKqVK;d1(O7HKFMpwLGE#VdNI8r(In zgQ_#ovdsgny*R+U_z-d$a0U!*hAS+VRukWYC2(@mQ=&Fj!P@53o#Qk0xEUzU11MCo z0^k>pR$3{H1^{fZ5;)2IfYOCA(DM~Cd^ZQA{z|-8t6c5bOThvJa>U8gP3&oMC#U!15=gXH+t-voI-0u=&1`PQ5GmSil>A$ z$FR{P(@3)Ic>9BqaP;ieDXWh%p>bREmP=!Pb1u_{aTu!m0JY;|86-f&y7*SibF3X*cdoC^@PwJk%&=2&bXNxMy^nal=<(Pu@3J&a-M?=RqG# ziRJqe+{i`hb&L{7IsWC56W3K zFAa+=-O99^@IJ!TQ>;*-o+w3=Y~P7z+_}uM!$JQyji?XKjYOTyzIKOus6lh?7#R&& zX)-ewd-2Vi_df5ZvtTUEYbl)`J^R7;5r=dY8*bdM;=P?m{~X~UA)ch4yGj1N+t$5S zvtg`8;;mv(4Rr$<#5{tAnGI~3=hJ;n_#v139=(vxZa1G(9liGY?Zp*tAspbrv3gZ+ zkFe~ypt37cSUpw{P!h@#K)^cEf6)ethS_J&Y@z~ai@aCIn-70xy|Zk|#6ng9Mm46^ z=}n%YIVkC1V;WW@Jz(#7kd!V+hI1^T5m0;%5D+Uit$B0@^qd-i$RAG6moN4J0SZ*q zB0&oa3F=6IXHaV1cr8`XfQy?u9CW_Ejl8kyKL%-w+myV7gv6g%V^@G|@i0EStqc zwGE6hn)lsv4&2D=GSMEhLa{S1Q1Of#o@ASBZayiemtcmf7B8}bv7WQ!Pqpx#;4(w- z(jIoR&@9F2b7SXk@vEt!W?Kpe1@brEejN)$y_BC=u*LOxa|SpSrgk<;BPXIgg!_~; zu~#c`6L8wR9?|?weP51T9O?4IGfjFfb(Piz&N>k_j(~2HA9}5y$ zu*)Gy+1qj}i?&xIu|ipt`MBjY4yq!Rjvql1UuQ^0(>(qIceSCpxzH|xf;o@b2{a1Y z-RUZcvQP^pF_yb&%W2FdDvD#-8UKa@zuwF0M4CBk&X<16f5XTY6tjr3ye?PjhDL?@ zpykqy?~9W6rK0pYRjUjoF)~jmoVT&jO|4M=QWHW7$w1l_&({>wmU#jtQw#|Bo!~d! z9VTb~6nrf)#v`OpP@8Si+e6E>sP<0fnFTA(|vtsB4JwR ztPa==zor`@2?2riLnQb~VyaQ<7l2#?O!MM0FizkXt?%7sqHQ%!6Y(J3a0f*i&Wzo zY*+kYd)23433^d?tCawyigs$|STf~d`3+hq!OxY486L&{$eX405V5?3bEY1Y<0J?> z@1i$8x`n-2Vxg&Qxfe^vA#PX~}R z0AKp`t*D>sTwXyT4|p_H0Y4`IHW~uq5Q{Rm@1Gj(1bi+X;5~_Lz5*8u#-cbiEI#bO z=&N1R28az__wYq`hu5z<&-tSr>}W`ir0SY*8?rW)u9NRiQ0~jo1wtat=}N8)>gPEEDbtf6Gg{Pd5^^=!!^Tr-!-Xw#B<0)6NB*1ShE4G1Lh< zXKW)UHVvb0hya=qz~6z7uw{=IOKz2RLR+!tqJ+8aa@NxKe;en2=0$JxD(m29d9k>H zCM#PfZkuDIMf8Cn*}=^%hD1GnVp5_5f($AT5$f|PoR`r*8Y2BjDxy>PAo{y<}?s7x(N=P_APL>^{y%_ean|6}If9_WD-z3(2_pEr)*! zvs~RNV5ht{t$hpR9KcQqpPn|CKl=6SWM|IiwKf3b^T zuBa*wbw&EAuk(m-v?9WZrGEC3ER`~+JmYG^sdT9R{1;Nx=c+iI8TaWkJZEn{Z1km4 z7q)~bPA4V=3x{11TL;j&qYwm4yR0^iBj5L|mgo!f&l}0_GpFbaH#c~rBUw~UoE2+A zT+>;4QJ%N!5`x(}!@iW*t^72q%0Hk8rSl^t7Q3`vx}qJUt2l;RY&~&i$II3s=+swLhz#HqU2y})i>xBSG+^n)Mf2MjkXjxRya0As%T|=7~oEu3XtD2Erw0WKJS?9 z9-lSWR?7nuzPa40xc|{rvG1D}B%Y4oyry!sdT%O;MMvWRAa9c5mh5e%`BEY$J{7a73{<+uvr8i^&_4%Oh*TadxxfrdYEi*gG_jEANW`PDqzc^*(5> zv?>mg8X!b@2^!{ymnm{TeaE9}W9{td z9CUj`qs(DwGJT#qM58coq#DRTnpw&;zvpQEaIe_?h}$Z-NKg2B#?7iP+hvmWT$ym({l z+pm?|wA`=($`o^XhYfSv%3FT69JLvkxM!C;lBYsHUM;ZY@h z)8v%i68m8X(DBL}_bHy{?zP1JI)(2iW=n)N!QXZnux(aCU>k+0G+*Kh8rx8mbt6-W znJ}<$q_zq-*g?7_wB4!^2-nPfweaa|XnXjI<&btofuQB!mpiX$ePB_q5Zp&lbw9#1lXGFu#SVN;P`Bq4o7;-vNGEqExjKdE=rC2DOk0{Z?pk8k z3Hej6%UjjasIRxI=kI?#pxDIOL@H$k8z&ByK&WtI>%rUk3SETp*@Wi5EsIldgAsAu z(>K^<9IQ|klk~o#a_0V+Rz>!?Yt4D8+*`c#Jlmr5S3Z2PQ#h{L*)_Em+-ub!41gQa z{P5qtY>iu26_yvH{#qsu}2hs#%Rwz3*$x}$C+`VLlo$VYVph-zQ%Qv zhW7lazUaoZAle&#ynIpXZk(a%PL6y2Sy7}!_aq~C16lRHK2)`8)*>DEJZhh^%flFv zyn1SK5zhYolB8=7s!&*iM6IVEeK*(u)|SiTx=M1F0_Ys5yr1DsDvvvkt!H*;)@Ko_ zgcGuS_v$p%Ap7o!j(uzc9ruA-k8za-+FZ#a8+qg=_Bw?-XbC}{F_feop zo?ZJ*Rs=qkv%$S+X%$)5eKriRjGrq_lu$Irx+w0?`<@}+7nKbY+Z=Rk7Z&gNp^|M_w+ z6`0<92(179bWmb2dg6N~7Z-1WqQ`<26O^#F9R!k?-tA!rlC8s!t{uT+BiGP#KdUq; znh?0f4`&nEh@DX3Bp;8L9mHeHAHx#|r9l_l-$;OufiD>ls?ba$4pvF%GRBnpeg8z-y8-_B+9pkJueP$ zhUgyjmYDMFt>at{bUwc2^P|t{?Puh`r}Yv!odKV*pqWaZ);}!gvLrsP>-U9&Ix08F zX6LjYScz`3_=wfgZQ{_AK_H^$LJ# zS%ZeI)>CYHTWqMi^NxraLT|Mm6y|#Gut>(pgh=1RpUeHZlIT1juV-HzJ zbk`9g`a_$DuHb}-xv{!2)3YpgG3GbB(&4-Exly^vRPiCsd~sT~=zVmFj{`Lpq+z7J zTMO!Qw$qjDcb|v>%oQhWSFC6RLT)fxuCwDkCZxar6^HcI;q_?`KN#tstqZh+TO{WR)bs0NDGvX`KRWS zki7bKIh-fCLy~y&9982s#{-Bz(W5TbDm{`cUnF@{XKgOZJk%Q832XGn*yC z|7|Plu(oB|$9Qh#-F2@(8Yjg2Kn7t2t0ZjB3pS=4dP4COT67hl=H8zd5&nbilS)?P zlZiln(aKJ;Zt^qqRYc!Dq4#s!QTv<|9t}meC&HkQkMPWYLDJN(Nl>%0brzSFa8`rM ziyxVV=AwiX)?E3Hj^81-Io;^n+lupWjr<>_$LBcxL(%+q<1dK=ZJvjK>!|fKIXSrj z*im2?;F&_;KC7sz$v$)v3{g`j;}FBBFL82kPzKP!?)>JkU{|4}qtm~wOi8Is)wv!0 zf=g3}9iLRU@Sdv9?EqYUN)8@8MMWZ*Vt`zm!upp4M!mt{4LO2dlYB3^YENja>`bM;K5=N6)UOTC9m+1? z7gH6M!TDvPpD4;5{Ug2E_mUD)BLoAEr?dX=4B#c$&otto|}4ZlC~T) z*U>q-7@8{KAke`wcl$DAWGMHlhUT>|?o6t5Tx>0Uq6h7lmWVYaZqi>vcomQ5jz$A2 z2;;eeDs?0saVpbUZHYg_k6|ylR^s_N;`(;*t#>0D)gwNn#P}}?fBlYXFJvVge)*GM zI|vV*=VlXrw;{7;p+8~y|0qLARs)e}tZUBQAyz+VF7zEx3diS3<`Dtvnq!XYT8rM? z<~cV$OW-f{JQj54J5)L{$oG7u)sSgU*O@ke^SnQo%c44csnhcGLz3=?r^YL{?5wiH zlFux^5#@BcDiPuc(IxVJ7UHdhbdV}ME!QfcxSr+iVKj}`A1b}uqhyTw;Ca2B+M(_f zbGz_A(9ebyu6^nb(JJMYq5Abw+*fk*&49_r1?6w|9v;E02D5qV7efOtHxIVKZmJA= z5$*|c#Kn5z4s(0_d^-0Mg*kCgD|`9CO}8kH=&ir3lHZIWlB0yF8Ha^Nx|)H$q&C(P z)l2M|6Tww?*Xq(E+)XOQUh8+-G$c!9Ph_D@o6AOt)u@S3lO%~ioPN5*{|PCYz6Own z&F%g%nTSnb5MmE1Fj#`{*Xoj-@kRP*B?q{#&NvZ@gshzanHW1x1wpL!+ zK1I;Q5q(o}O>0{_U*rjWY26cH- z&&z^uOkm5DW6wJ`klk$!JTsa-gJ+bnd1XPX(I=CAvZZq`s3%%@>=kZeodD<@zjQWk zndsG2rXuXXV&gsIIWqr=o5#IYI8TF^@n3xCDdF~5ef7+;V?b+C?=8O&)jdbs9Ngv< zX$>Py0(q-%AIF*r@Ip?{Z?n!Dw}m*I7Q9^<|+o*O<*r( zU#kJ`gA~-Mf?>cMRAW*7?buBL_rdbkB1l6T@$RdUk;ax{$Ng8lw59ku2469U3 z;KHBclKLm~k|huaf;G7G}D91?&c^v+TBPw`y?A$TnH#a(chbuU*hV*ez@`E%zNhA2p zw1%^kZ+G`eu~TvJIqC+e3kz5ukssa@%hBBN)(4yDPkGw_ZAb!$+$>m=GORysE`YYm zC>-``lc-%$H-+dmJjz_17qWS!f9u9FTzROSWOeWJ2MzwrS1S1a10~ZheLgPK_AIXo z^tvDajc*6bB&TxYJT1WXq0k?Lg^yXMEqdS$=z5xnxDO_0%gU#U?=WtbOy8k4zdhy4 zE}-D~Rg~v6Fx$K$);xrNIqjrum0Tl38lI6ZqZT%Td<2mOmdp`D4`aq`Zr>` zpI>j<4Nd8%&LzA5C7XBLd5)RbvmE!>eo(j4A9Yh>aFc(FL3{FJG{?UK2miYf)@!9- ztSuX`A~RWi(4kn)&du4N>doE3Z0VPvOr8Nq?|E^eAEO5cYn066fv;@c%v9wx4^(=I zZBsv3jBjvEuVZ-qh;N`X?O_Th@1h_W>5miYiJWjkXl09FOe!CGY-?p!K8_Tv*WOU` z7xviNJc{}dQ zE`eZAXT@z0@Hiy5{=^l=Uk(|B%5gj1h25l0Pu2Tg$PgNe>Vf|Z{U`)lwlWd z19%Bo&jE8ldU<}CF7QP(?-XO=sdie9X{7?T|U&8Lv((A&?N6qPI1cw;KqSXaLD|Q}5%HWaI!B z^(h~z$JxlX{e{^{A%XfS#?5e?cI`2=AQrYM>*fSA(Y1h`h`Fou{0KcoSkWi*&*X(d z6aC~cSbB0{NnF2r1~EE=Bq9Zh`lw8+3rHQfCp0ag;Q2L#mM>27(I$c1y4tb zB}Lqmcz)LiKL<60m{lHJ(>w@%=&*h}CPc>vk$H?*z5F1YS zzBhsw3~Natv);gM_7tk6V}4pg1@v(3f#NXG4|k2(#~Qu^QF|2N6Zr#R4A6^Z1k(67 z0d~7T8R@$*WA6LI`|sNKoBgNi$qOdng!c?J3T;pFT%{zzb9ksddIUBS_F<(wPg{EH z{Qh97Y{h%5?0ZQH-1vvQK~$v5xxilRh3fd|J4hE|f7ciD?u&Cm#4C-`@!raj&{=TNlAt{@H1V~b=y|2p(c5jX6BY65N9ku@Gd)BbxNL9^DT}rR za0;a8Ijau>L2Ifzf5e#^iZGOAHBNox!>=9S;0olbuC+6jbFgsMgiyzSSlWGm?qft_ z%0ds$%{kCIxMZ%Xsl} zP*$M8#1=lyCMbjAx^h=^qjz|$?s3P!>7?G0yVWF2--J8V-9GA(jUIOztG+P_-P8Vv zS7skddKO)*?=B5E=r8)lMfHAa&DN14ENYW|xLgK*6fO@Fy2u*6_&u zRMpu?@lf-tylHKO?P0_#H2iDfbmn~R7&how8oA`nT$KnUDcWvP#LnxK-k*)10(tOX ztXaGR`i+HLyx)IL>U9P-V{qd9WIPUMu#Xp6xpSyr+3+|t9bwc*UU2Wo5j#D# z6d{Y-ZR~?4HL1Yh{7Eh$CdBW`m8~M1&#&v9q^Ye-d3kE5ajh>g`71R^>U%mXv)$$j zT?ezRt9bR=2G`_lpq~%tatEZ#Y`rEge7Q>R=xXSR^p0sV_)cUb zPFBUi?5^m!sA6brW_Mt;*iH4xjVFc2F>REiKT#6+4}U{tjvD6s$(`#AN5`-J8!T(0 zf!}ee#Gq6-n3H%c!?B0mx}=|M2>-37UQ-16Cye zj0mMbhY(0|BKVZ*)4aLUq1Hs&Ls?Rcl@F1D)~h1=7sGHr_W9$}HN?}<+S2tcCZQD8 z+h1?o%kbw4jBRGq&WQPObMXC>;|NNt?3E42|8Dmu89>s&eZ6tT1KbZi0eA=?M4CTv zpGJ)tn!R`fCCF#$X-P){SX&x)jCeo#$n!;;B;8%|-U&>7S|yf%S7S%F*ohG+lsY9M zq&70aIIY&+8eiV~&FYd@#=R^!w$Yb+u?$BamEza6R2M%I>!-20A^SR-<5iafi&|qI zQ>)4@Nwyu(Yo$+CY`hd}e%7d{yR_px34`?2-}I9|K%^qH;YL)gLyZgv#GCHca%EFpl(oufO}c9Ovv>s5F71kGIp1*@Ym37=*5wFIu11?JBSVks#{Nc#{tJ_t+DMERC#BSC7aaz9R)0&?5eLj{=cF*LQ#IO%o zo#f=pj;0Id50NIF{0SmxUe_lWw=&P~6sE_;RNo)bFx~j3znXlnY~pfK zztQ22Cjx0t_yFS7UF3f+{f~DfBt_wm2o4wLvcM^?0go^JXqaVB1W=<5265&`zR< zNz@ber8bwP?cJ27<~t4dyzfgs5pv1PpBjqs`AhB2E1gA4r;L39qvEA`?u9AKf@;#l z4NUS%>b+7K+xI*i(rPSgqvUV5^}L#hB}&#A+bP}p347T`p4489st=_Yflhd7zpwu~0*_bAIK@j_>hueD6W1GPM=;Z;@Rk&SN&~I~9hGuy4b07Ik~7VkV_3nX zcxJnFtCMc0W?`?Fy7CVb+?f@5@;TxqL2T*Hg@K4<2fDNI4!8rSr-T(a@Rz9d8aqsW z%ch=qKR$8O#=#aGV+L}0mtAia@Ixggy9BL-LHNH6J<`lgmscL~AsLJ^@A<76{J>kd z=g}uRmu3KHZa9^kF zQ;>T5$_sZ$b?{Qrlo646>cLCxTp_OL6pp&vMWAvZrw1wrkX4pbvX8CG8!x^y_aNfR z0b@zzM%F1}H;xEv`l$XSV>FpXp8v_7b&P3u}`_^AEAQ#l53W`+S!mehl%RMT(H(6ce}!6nLahWUFwf1r<$ zifG%lDjljj*Csh_er|y)ULT)CN8FdW&1#4GBU>GDPg${|^)44fvDwbc&qhH%zU-h(w0HrVd zL%3RJdYPsWk4gwq`UhXig-iUuYwd{yTl9?iPuO|7R3Lz2*`*n#>)Imi_Gk~monzE& ziF5gbNR>HQ1RQliKSjP(erUa2{xnbbLt}7RZWN7!&zJuML4iEacR25Iz#Z^nGsF_< zUJFpHF*R`h4bwmOw%iSR((G?fsOCoGCbtFj>2-B%_aigy%~-OkWrpAUpR^7Pv8=c( zjr>t>2!7B@w<_)DA*fQ+Z*b}q^HDqa5Qe;xQM(d&WkB|oTx5y^zM{@xxILkX@=fcN zo>zQ`!CMnqAA+aI4t#P}Mf%u?B|xxtytH{)T-??{p+jBai-&dHlpdsdaqbqz23|(X z+PK(Rd;Jt%<0z7~^8w>FN#<5B`|tzNA9Efe|JixYprecaCk_yNtA%ni-5?oQ_=h4r zx~_Fn$xrf}5i7y(W+EnHFM=|5cEINpFirikVn0VehlrSbiI~M5a?l*jJR=_9U6 zeF}Ql#?6#P3=Hl)*1s2O$PM;i&2=XnBk1LdzwAplDufM6B0|HG_S%2I1RJN_<1UrS z`z>o%I((g;SnP18yFLq6Bw`SVp*uFdi2DDIv^1uO#rpMjj^@-I54liM3CG6?`IfaCpn%KiO^#v8J8u1OLWmo%~itw1Vi=g@IqA_Xd@r5L!_hlW8pX31|H#$YFz z4RQ3sPjKDX=EGp+lzXA^Fj1TeI2#b=I?P(=3Q3<8{=SfsEwGXE@5EfZ^(VS%OVITa z)ldb#!F3o*)>RFI_et~e>-RIH1wRFN{=t#Y6Hni+)=-(EMHgczNq@tFu6Z~RY+4uZ z&Zdg%)vnPr1V53ir-mNvouLTuA10;o>`6blaMP;s`b4uLA3dvGs3r|-VA6`-d-&)# zs{n(zu>iQNl;vuhCMzLYXdLq(7&&|#Pm3q0{%cRz&HZXqD-c4)NXO`-e~4w9HU0M( z0KWmT!%ctZ7AT!a1&Y28E}Ef$8#y%OeW!LH=hD8TE!u>`%sWtYg3p6}WLid9bxUeY)afcg*!d+Ko`tWrWYE~1-&iZGa(Vl-oO z=(`&CgW(BSBGI#A&JPb${#_jxBM?L-XaC&2Q3!O=CAb#3IWzT z9uCrTDVJ6Um!C(x>PD1!5++@fVli&PP)hRg4lMC+n9ixpwMH~nIu1Ojbj4*&l2}Bv z(I=`LnkS3zFj=n-NEh<@%Xu6Mrm|xlN({WU7p7gLm1<(p3)+w3H(3_B{E>m zbkcge)R_)wa`m_)cI!t=1DBwVF7s9;|79sskSZPhClHMU|L*_>8|sFgx|ZkhW$~-- zJ|c5k9dvMi%yz{5j103TiEn;CW!E ze7-?oo{=$M|Eik5?J%Nk)>sC2wkKP~G#d#@QdclW*ts|TAcJTm_LRZh7-TM5E~5RU zUoaeOqI=CW`HdlcUxnbe+CT4Jsbh*VIfKfqHhJq`DG9!=^w=OcfWl| zjaKmK`v1?$P7}d_9_x-7>>OvjpQfbX7D5b80nehXiDy7CQ~x9{m=@y9BX&*^_mwUP zQZFmBL=6#Fo?pu*aK0=(LY!@O8%nE3Sn&<4;ROkJrZINova4k@k@*RF($g(6p!$hD z9dQEf2f0L^To>oFJ#<0cz_-VGshW0~p-zcCSy48xs%t(HqndkOm8Co4TzX+1BD!fx zb*C^EEb7Cuwn00qMT3zyAPYt6f@E`g{q}zJvLkK@Lke$K?CrJ>N^c=Ifn{+6F_G_y z2O9{HUhF^qpU)=}X-hTF7NgtBmO5_Wv%&UyX-YWhQ;yAV^MB$0woknh0?@ol$G9at z17Gk%5~btxBP>EI)2e1z)ns}O4P%9T4>{fKDM+*7&RL-3?yTCAz0f2b{`P@{THt$O zLUYpQo37c=vtMRDINp=y*7{2Wp(=P6qZ{}V(6Sv3=-21-jgu;t021;r2lqFROWWvvGvln5v-D)ibrQ`_Bd6wuZyJYY+6mg zfcd4||H_kKc!FQThs-{$qS_-~Lf`au`LcU9^~(IKfO!Qho%&v|&y(R>?D#I)8D?Y+ zNuSv=nwd6L7b;vDP^q0(Ir@VA(x@3S^I2;}|L$$#YLztY7CiGL@d@Szn6ZRwcF|>A zb1O67cWp^NDgmi0`>0REo+x%`Z zwVd>NpO1W(wl@e21vpeil|t#b9BtX*rIRP1 zXz#lYX7%?UMcu;hA22viqEk)_-h*V=DJz2M|5WC|h^L_?*b(?Vzt~JPXm+UKXQ0M`T7Dsl2 zFQMDRapglV_#Uq_!x?eV+i9tLlx81mZUJ zgS8Ct9pyb*-P+F9!2)-Nv}l7ab7Y>0;o1V198sQ8DI+T?fU19p@XYc-n!Z^&>us{F zYnu*B_xnPOxQmtouYoZ3-*ueKV~`09mX-w-O%z+kfgKVXzWm+Bp_gO`4Fm%eIue?y z(YM9pX1Rd55fRRPbAVx`4MTQ9$CwDrS;ViHT`s+9i04v(E`L!;aYBaXxAD2+c5g;1 zPLlq>Z~+q#L7lh%Gj7MKuKc~-kIut9*r)9-9k?7UJ5B04%>l2QTmgS2i6N{N_c_iP zE=I?NWo+J+SYm~y?_#ToK$BwBD|LiELrjHTwYvTUs6k?h+)M8b_it_9Um7?Alb+u* zw4tX7g6tDsX=YeUANkh~0(c8|8WdAQ%0%0HTDC{kWF^IDToTQ}^p41xPI`xaUh;pJ zf9&xA+H|XjqHa3H$5YQ9G)v$f+;TViQr^umhc^dt&Y8?TDs!(|saIF%d19yddw7M& zh-0AW=4P;>PLE*B{ubVE{M));e~K-h?{lU+%7zQ)`Tt<&Zg$Zltr&#eU5=~PXTbeL z;~0gr596b$xSiGSfl`kM%a)|sShW8}iqI!pf!B{+g(x>=3-GF*ztjn!sl)$&?7ew3 z)#3Xtypd2MQ!D9ZoNmQ^ zMo_-&A?>KkQE&lFwB>6*!5j>O&4hZxtu78M3N#HHy!uh-ADbPO?R|e~fP|Gu3J}Nk z@Id+Jv^{gUl+Mp&%*wo$@2+_(P&J>e^;5DW^d#^W>DyHCzmr%^*{jK`C_&#X_<4Qg zIGqG}OoT)Y`wYLra_dyPe$?mGsP8uv{LYWvbl+pgd#p6{sP-dPj!KKDXGBYk$ul_9 zF`<;NyUHGGQAfQ>@I1I=oFHlTp39m>JO2Xmm1c=5S#2pG7tO?(&b-wA4JGw0YP|{DN2^m*g}br{b$42PlifwiWB3yA-*B4?}Yvi4lnmiP4_klU=bjQ_KEY?wbQ*ptjat@A74y#> z6ZT5q(|UGTukSPVi~pU~3Ns>HMsd$soV@}=yPJaF2j<$FH^meRTb}vP<}*(R&iS== zbQ%WS^kc)AvKGa35oE3(%@9GF=r-nmI@TR()$%uJ(u&y^G}h<40K@NCS1A zotOAb9{FPFsYw^J$pIchA^8CFD{r@YVbBm z+F#s@V(p;g5i^o4*T{GEsuiwA>F3>m{mj#YaIdCW*WHsTK7g`<|Uvhb#sK zPt~e^Z(%4J^WRwE1{X* z7cySx?8At5#S#bbh?oIxFC|$XB%W8E*L_`8WS?7L*|fTA@>+O21+F_>FKUW;>!HX$4T$*aNub1L<;p4 zbR0c)bu*R~P8`~2M_E8T69J0}Md+6}XGU&!>G%ixc{#r*q+1b(Uv1%K*%DwQ6o{Ltmf z-GLwfEGq)1_rvs@#;RL{-ORTUUotLBm{0JJh<7DQy!BCP1al7~f9vDQm>8wRV>_-B zdmY*zJfosGgCNNhhk}0*DG00UIZ+#rXHXfhet7s$I;7Tn6k_?=eKUW4$B|>J_NzaoGRZ<0sHmItBCctS#RHjU{dO2o)7ke{@v!Z zAR`$Uh`mMTXu?BFA9X_!m+N0n@4Gsu^lx&YT~xrCQRPIqNkYyQfA!-Y#a$7;I;144 z8&M5O*7B4Rfp%uE-|x6 zmrs;(n)?;`B}K8EajuA+F{-4d%tNPJ9NdYP%vk331~~}s_OLkDE>S`7hO8c|7)!Lq zd&Nc%r(HYTbDbYkLlC7Jvu>hrrMTUufyP+8uw-}MA=)m{CU>mdJ|h!Z)?F6LEnWu< za(s_Azd$IHb4@~o+1$7tejIzMPXNo#PW$hb6umRT9zBrrkoNhg1+LM*ycJ#l(x&Gb zenD=5+wR6($=39JNUX%SV={6;*e3G!=-ZjSKp{=1Bq`E4G?fgGmXeUz_<{| zY4ZN!?Ky}`#h&tySW3TeJY=R-Qako+;6 z_3pbX;R-!f8nH9sfM(42A(?w8nwTtOPhd9AT)Ht#oL0s2uU>7IqG&UL4sZ%Mx7rTM z8p2-H;=Fe&?8pp}sj8`TE!poveOK#9joNb^^Qs|j=On1E zzdkh-!rSRa-A%M~tb_MWkh8#*o*BuZ{O;H{2Dn|dCuXDlYfj(r6ZU7XbS5Qn)I2KQ zg2bHZZt-F^U|HHV*pxfhM4nzNqsTkUNXkrVL@pDG450a!c6L5tX@@(TG=U}&4?%NB z0&mR*%nezRa@B_%hwWtT7YzLg$CM1Tp8k>#oEsqi@hzA`EP>2_uX36M3TlVW`&VNh z`%l-!edr()xra%5&vKRQ1kuKx+}@}2qb!Tu@4cSPtgEJy6Hh%YSGmf1->8~oP}s}b8AipL^M9WsHQj57vxvqH3V zoTqr~za(E$)M?$n7$0*<_u=hIM8Pd2L4$WqD%{T0M{tgegwaHSw?4CN;8u_%c9S5Q z$dl+E0SN&=-OK7&|A=E7C(At6a&LF)gng;2YRGZB+tfYT{yydQ)nf;ib`RDid6Txb zuKRT`#$1uQvN>#AJHC0i$=x>LWbeRuObRTT**D}9K)<)?ks0@u3TK_k0e$3<(V&aB z>1Bm0ZQ1@K7L-rLZ>)NJ9@jVmZJ^g9gVVzKD15Qcrt@Q?*>j;rQA{p_fjpkn%Wp`| z@M6?nzgEI0$}P^AnnP=Ojy_Xbdq*jZc6kZgZxAS)FKM3=#Dro_sK@k$Xkol$?C6%O z9eW~X%9lNw4QvPp9V4^L{j`u1ozf0d$8n&7_JyWu_%wFz`JONd=Yv*b|Z_ex5{O=!l(bXjejai0u<44I6I zgk4S$@h(0K8Vc>oC_B26DpGw}ANfIHb?<#GhvV(w?XC^!tPQfxO~MiZ=`$(rqP8xi z#K$LbinWg$Ybd<-cZb;>a&LMpZMnZhv6MiZx1?wPo$dHtWV1jHyty}IE(eK=0 zpQK$=Iej(=33nG$iD~|)-h6vfV#f~~B1f&b2h(nklkv1qVyr2x-%78tOI9lK(s-u0 zFj0`FGU{h;nooAVpUUjJ^jfrb&fE>42%7MS#%ghIVCLz$tWWWtaARDevf~O7xN|vl zMzU!T`}XW6IahQ!_LG0>l~;-_E|?Jlm~y7_nMN8%FZ&ODyG#Q+T3KIXv=E;c@_v0s3v=sKB3L2#3@p6g% zyayYLJy&P@`EhHH|Fni2wPdOAAp0>k$j~Vim*Us1;;fqnHqU-K$9rf+x9+`)|8#AQ z!cs0$8AKnH74At!-?U^@J8{W>F@}TB;)(a68K$=8nkizR1OdE!E9&jzqPQf-g3A3B zqTZ6~r{A^PKXIs5uex)0=OLr{=OiDa?R=+h=ZvdEYDZC!ME-y)a;8$Ptj(;WnZ_ZO z+z7Hjw+EdZG6Cb%tgY4lZ*SEjUytjM^0-y*d%(f0RgOE6bN+QYw@9$73PZJmo9wMK z5)$qSUu*Jr<*Ic@sdHC$_G6UxHyuypiFf)aXtBS^*Cuy;b+)qT)}`oz5R(G$F+)QO z#w)9$v36WI;+|*pnLan7<633<`HU}_UaOURcgept-j&LDU~ghZ-_7O^>@o;X22CDL zn#}ES0p;-^yW<wcQG3Q#;rtqxbMM;)f3s+P zE2N)TMtgOUi{T{ig@HR-4#<8TwM`ye>$!7G!$!C{|LHwuzYnh&K|-0a(R$F6I_Pw@ z;!>sKjUUuO1`BzP371~&y)V@0r}bk|!cHc6KWB7;ZxZ#MZ_(Enj|CLu>xyk5@xg=s z{Jw0|K@Py8a8<{PUus@r9ITb)TkTmVMU?dkGpMVTv$_r`NcLnP_Xj!!k3H79-Whv1 z46Xb2UmUE+Rp~g#dy9dj*Tf;pLhO#+$+;T9GR0+C{&&{c_@vL$#47TVGoE+Ze}k_- zyDyPf`u#BG>!8GrY5_2%()^vepfa+V$VN7KlTM7aqh&lXWLq zMSbg4>OPT1TSm@Kd)K>oVLE~=eaUvVMbXpDXx|$9VdV~W_DHFXgc)WPdtST!Gt#vS zlfV2|yYJ8Ru9Ht29pddczm$-UZ%ue(mF=Tdy8VR}ix72?8(%2*GH+i%4t~z`C z!*!|TrE5n9ua3$2Q{R_6X`*oI^;oQkSd+EFr&@C?R%*)f-q%TOoDI$vtK&a(uaq>5 z#sBS1I@8mpBBqqMJ16s{I;*g%{%xu53{$FBipn%i>VVF|Ex{$G|E z9G&WKzyMynL%Z&qk966zQV9yqie52X*gZHhs?=>mv8(fN<>uts?$CxM{+SxAI8D)! zmO%fS*3i0T;_0k>3`nmMY;sQQ{b2NdcAYHU*^sDWf4`xAu+fM*OmA>W>WMN*P%haA ztd8kdq%$TSKCLHvmY3#LLFnqweO}cro~&h6E;Ssat%Idx-x19|GKBIb)xzFVqJ_f) zJ{#`Xq~m?~#YO0Nyabcj+v76pQ3I6*W6cAt3GJ79H%pJi=;6G>xZ-IMp7{h(isWO% zxUbJ2aZ?A$8{5u!q+1-1E|{#O>n{IxG+2aEg4RvO-pBs?VMWHh@#hlTLibsfvLg?6 zQ)K+&Qka||04>w=&i$>XxT4}7!q0x@(?N6tEg(zt2wPP8Z*{?LeW^g2penV79+#cj@0PN8uG~7HppVZI42r z`XiW5IV@BC;RoVu>Wa&PWfAJ8j0NI$r@x#!AWXBg%dS~r^Etehec^EANUq^(QUC4uF47+VK<9o<4mFa{*R>f+5)2YG6Z-@6I4YCg z3;Z$3?P6rthcj=#*9G*D;0J20Bzzy|u&me&GFbRBc?y0GAQI18gEde%)l$<$!7lcQ z0lT@sBvo%_ck;XM*@_#U`R`U^V|g?pHE^V+SINeWqe}g}vn)znK+;3Xvufgysxa}= z{txraI7AyfNl8WNz{^6Vy=`56{Z+bUeR+33! zzkXr6|Ik*{^Z&;(jx-P??K*KdvLaINScDnp44tU}P8!?pFpNpY4$b+u-5XJ9c~QXQ z$Kprh_l3*y(WQDf+-EFOg1tp+cpM^tLowBij%mMk)MeS(Y7_N+j~maLlGK_T1Zd#Q z6k_Z7xvqU2k|n65EUWm&?C9r6mM%N2(h~mWga56@i`bjrm2S9)!DjCR&!kqn=g4|0 zL-=efP`+aOFOA!5Yh}XL7uj)^q~8T0KO{!DBbh7%EeOOhBp4<_dW>y!-1T2m1ON`( zA}_uIp=k2ty5VGM$Ft9^C1wtr65;Oo&&D(VpfN5r;fVB0Agye_TQ0`lrE_<3-4I)i zJ&%2|&uIFrsXk5>`*L@l{$+92?uZ%J_ID!*>RY70&;Fz5~E!Y_{FH+ z@1DZQkyP%Lh_MTwUORr;`L!BO##9z}9oM)!Z&esqLWS=$V+Wj(zhs7LG#BO2^%PCHTHG~0#BN&}MMqQ5nW@YMr zHS}ey-#?KVskzC^-WzI`l_FbZAt99BA5?IuLk+ixRrb~MTZAM|A45qP(G=Y2kVq7I zXyVCbwPBT{XG935gga7AuI=gkPGX7x+EF~JzvHUXuEmh_>Qu03@>(sKPPQ%*&}tDX*)Y!T*>Y@C&#s>n_xS$JSj9fT~> z1geAgbE%)9pFCAluvt)N9%h4~aBVMD^Rt7e zd&ey-&YxnOP_K0yuE1Ww4*HKMg_ZhMrY9SmE7iO2)dUq( z<;;4HEMvu}n&nM&A4(Z%EP1ErC>{8-^z!cz&m#S2gjgI;+LXKDaoM!zYtnRHUuWL> zmz=$elJqf{O7aIJN>oAiiMtYaTa1t*#-}u?G}7dWeo{`5PGGDtxu@M^^e;AetFg-% zr;_pflE?IFN*sR0P`R&H&*i?C96#>e@)WdAGFNf@o4myltqrsfn#|t{GWA-4Rd1l^%_(V zSfA}~xplgm%_zFSwrWj#%AECziHGjw!Y(_uD?Q@*58Ibzbt=S)=y|J|)&H@gEYW|P zs1$d#mkYVb@RJ~S*Kh9lOz9_fW~rGFx62RhE3c3)c#vx|zV6tf%QanS68PT^lP(+u4EE5DJAsBYB038sZAV zEm!-$P(I53@#X7eSMb`RkN^5>I?~k+9n#g?BBZNGK*GNF|2bQFb;nOxIooz@#2Z)z z{SZxc@hqA+6du>I>Yibg!{31Uyr)U~WjU6q_{qxx4O8t&Zn28S;wN~22XAzPZ2tTh z>F<}t@$2l-NWsIcwUd9pL%=^~aT)wOXVY{;68G_4Yz;lt*2>7UMkqs64E$iH_ihab&KIsDN4 zvkc>(M?HVD0~~-bqFDExqyFKO^q=SgoTR``|H9Q{9Rx;%xeStvv@>oS694(=tjB-q zjMg9h%kCP*ULkWF8Tk)J9S&Uz+lg^7G0faavI4)$5!N86jyNVxQ6}Sf;O`y&-oO3! z(SKI4r2QyhI>snL^Hbm9fNvsp8B6IG>c5;sSoDJX&-vj0{$4N8_-`GpSl4}ve51*T z#l{~;nv38Fa7%T|Bffj*>i=cI;o|4kO4f-Q>uTtt1G&r@9T7!l@7T zAgSK$Cr|WwkMXn=R@{%ncM9ed3$eLJ1JNgM*B{Q;ZY~0}(SDZ057us>i?Gl?SY5w+ z;(W#BJ-x)eyL!*@=C>vb70}Nx;7%7icMgkV`<(mlZP(z>6;>Soc7pcJpG3@Hv6X}} zn6yS6a0L{H*AONR$Kgcy%yZ~>pu_!nm=wg z5!>^=11IQX2;c95{M$K-lc_WwK{;~}i73OZh5#%hj)h)F}UEpu)Jdz$1b^TNp-%!d>!`*aJ zV!G%th5hNguL=ZTUOq#sa-QBV$Uyjlx;9~m_op-Ff!!xQs2*0=Hv4eS!RTtFo0Q}6 zR>_grae0v>N+WXeMQ@XuFO()2j4zF;Ahw+E8jfcX~ z!|3zvWO^@nt2?XCzZ%OfcC3D{oIQ}eVK%=Xe=_dsmy5E0Klz?^FIf37=9y!g=Tp6+ zHJ^U>Nn)nWb7PaL!+y;8D@^yg=u`gvWNM!DyuZlRSlipR^`6znVrAtktG$bII(>%g zx115f`N6SKf!^(+VlV(n9sXV!TI$%*=Q*;t=;L~MUZ5jHXvy7tKBPmeLw`!v@!6{l z;(--~d82uQd9C@;vDafd9kLy7volH-Gw|iWcu79`TPoj(k;buMPZInwoI%e;SswgH z{2L1Pt(L)mM&Dqgv5yI92_8fj1`^W#pL~xPR4~b`{umqXVI+idy!FQ&{f~k%C#$nd znq2lCDGB(G@6iv~yDk^DJ7MRb@16VG<7(&2W1Uk3HS#91c9EyyOWZ-vt1vdvm&~94 zFc^s}ilA>Y`h8AYXKa7_=YO1nbk0t@ZXd&*iardj74gY|mZ0#z`xYtO8Bpj0qRNw3 z>N_|vIDhFPkF6&%yRu7ey*V~ekzM+n6*YzE!E`8?-P36OnktW7TSqZQ56)6-y?ejN z@gJqe9{GENt)q6YWVHKg;G%eK&0N+$cKY_w-%Gd7h!?D>cKvftoIy9mEQ^)JPX zia%w;%xtcmnjgtg#$cFMBgQHye)URcOP5pMY$rGSFRY};qNsR%e{zhQt!~8N?-)-HrAF|JtqpcE-NGdU-ZPuo34L* zb*psnk1zjE+iXX)SQxwWn$Ncif*#BGaJggobo>+jeSaGbP93(gj6M}YNJA)bKl;&q zLK*_|XyF|A?^r~kBkljG4~Y3>9=??Ed%E;YDi-Hnjg5^pj>V2W0w3_@+BjN)t=B0GT&S#U~Tk23GqxI!Lk?_1OAmJhvZ;|9_%9M+&*`IG63$ zAuaUcW{u*TF)LB8XltjFTU7PFB|V|V{WW4(2?`A=hF%5FmV8}G$O3CxqFm9d4f%gOeihpI5gavh7VVxMRk8-es@s ze}&RZ>3Bc&nEWTWScl>5WX7yIYsJ*rW&WYJkzrNME1!SDO3CS+{)s8-Fwqw>l>NqT zligpmZL9Fup2BS#!eEYlMLcu#t(RJAF1TJu%4N-z(@Dr-&Ckop%d+WRom$kl&CRQR zpJ1E6QSfU0c+E~s`CERwpi_a_2X$Q#n56uLh}0E}N_yId29q z3CS$#N=Mtt|GftPA2!g1ngfw^)z@ShDo3(xMw{wxxa62feXAl#C^hzD!JoMOhNtP= zgKw4HlKSf^&K7$OYcf_QxTaot@BM!cmC)kP2O8beR$dECua}Gss`f693E1LGk0YG~ z2lVHKV3_$S^=z|k24-b9jr+7^9m%FQ+Ufey*s%4&D&U+T{_z49?&y3&Pd zXP8NN?3`8KYqCB%M%8hPNp6#6xdy@GBVU@=@^`i$PCuvIQIw;si_{Fxb?FNAH0)rP z&?x*^w0k&`EpIGq*6Q6c%v3!$*>iBG**;M>Zr_Z;!F9g8gJVIaYc4rn-K+1!PGq%1 zUgE)t@13=dF#`If(tSzD=!FaT=CVus=ak-J4=gdXsXM-H0QjB64||DsvN!r00L*(LiDKXebJ4IfYi|rs<`1LKIHR(&!9{hbm zBk^@FNNRn~S`enrA!$yC7>aA{of7v|9!~t|HmDS{|TYEvul^T1jPA&-~Vs7 zgJ}b55ICf}0-=>2KSus0Y}hn)cin}$Ciz20%I;Yo4(YMyKaj_%enhO>z`)=V?|n0o z12+gQ!W$)iRkXf$er@O@&)Pybg?GGY$E+u}yKK|=rN6QXsR^U^=Mv8SFaK#moPB<8 z_bTp!hieZ>*V5Fl5_wyf9ox)M!+U|H{Ha^3);-aheLOwJ6%B?-Hmid_p5e!b-Pn$; zMgLkTX>}DjwUcSN9mZQQ?s)5-A+O5GiRE3o5BN~(${gUN>Q$M)~U0N1Y7 zp6dRHLoLcQb@(SAI*TvkRNi8VxAX6vA?(Jwi6M!`W)fN>Ge_25P3EVfDDuzCZlxt` zJ7QttD+fxvYbHPGEV}iC^~lNC(QluIDfPwsr_ z_D5wM6t#~#$NofRDCw%-_4|R0=X#S!4e#4e5ePa`-)SVx)JZwBoN8dPtNfxsGP_mb z9)sMwC6O;PMtq!vzSua)rf1aT%y`Ih){MWBn&iH!s%s){1?z{&h|%`QT zKE_wam(Z3y8U_Q+R{3qtc0SDgi=c_7E#+4)s>MqPk2ApOXX;=tWO_EQnNyu;F1Pgx z=lYAcc%F{uRS1G2OT;`m9AO_~+g!SbALiK7ch~+Wqp&*gPtNuKrL_qD@5%qwf%bo! z?!RoK|COdAf311t-FB4y-*W|jAA?*x{bD=PJiJ@wx!3^vz4eSwgZ|Y-jEJQM89f0{ z(2pNK+nzH#CG_^`Tqt*!TQ>}dp+0JBl&dBIQaS$+748w zY;43HyK)qma11ER% zcBFWUe4ATd`kb^uJCf*W1JXc3StnaQ{r>&CE=s^~sPHXoFzlQtlbw?@4039LVmCXl z%I?G8$k(5|@h^vmv710k0DGMWPxh2r%BHt6G9gUEpg|rAHGTW~4oOksPE(y^-w7cr zd0M=6ZRx7!W9?aYq#o{^gc-Pc_HVet_*UPzc{AA1rko2D-6H09KoEwPVY^EY`d5SC zRvGN*nOahEVw`V#`T&Znh0hs}y?gocWgTo_MF&Idq9z{AVSK~42d?ia7+4&_o(mJ< z#12hOO=j<7goQnR|2!ycb|xNVy@aj13t)FIw=-v;na08i}8-krA?}Iso zTmQW)%18N<;)|y{Rkhd;`zxNV>C@NKqZ6@sf1hm)M`92AF1=m)HEjO#W3po3r_Rm; zs6srlF_(lILUD0%;kD+dpTOdkCg2+$6JNFsdrcp@!9G93v6hLFKRjWhIyzAI@$9vK z%OY%#4Aq%e+rkrtL7*x|^hR6FMs8{&(0SWGlk|t*i?f|am!BWq_ z#sN0(-{+4S6dXc*9Fj zeQ;`Fp)gvl+!6e>n1}nf2hrJX5a=2LxlMtUUP@%?joZ@TJ=KEDmr4%~QY{W3$PT2! zV9p}O-z~q%|F_1}B_I@*(z^CjSw84o1o!+V zEYsS4y~8IYoY~Kx3zXdIx$wIjq+_E@cRT{-DxS8a?m#|%+`sHqohfqd+BLL+s0Hwp z62{jLpQQwTExxJ$$r5~wIqX%%W$=#&_;L^rX>mX0HkO7{T2aT&Wl(GSxvh=bu*5nL zv~n9lS)^04viQD!{hCr-Eau_ik&=?a9su%f2RM`-+=rd&II0(`rt1~yFVoVSc-hB0 zcV4{M%GUn1rzf?#TCT))fYsUA`BQs4EeR#-1K91e9!57idkWY@00j%9`P*<6o-p4%XqI?h)6}1H0K$?T5MnP9ijUDMsw(1$6gO`|pqS8y+66 z+C(hBPfblpIQ`VhuMwJ`ehGfI%LKXH9t+hwu&!ZlZeIDjO|=k|R8gr!NN^x|k@BpSd$-OC(GUI@{$yX2Ok*UD(dx`V4=bTB9@)_-e^ z7|xJizkyy0Zm2`Z6_zypeLXyYAHTYWhK8RkQE^Y|qmpt}n;WaBb20|SsHRA_kpx$j zvP`#SFFDj>Xv(iUS$}<*Win+A@v=Uc{wb@S%%SWf=b zykVD-qk1LCyuLlYXviYxRrd2bq5|R8NU$r%R{Yji+M4xA+bx%;ko++^aMPkSQMM37 z^bAU@FGANy3L_h9G2*tysE2>+wRlp}Yss#?v$Fx@$;?0m{MS^)w34Nz<+=W`(b2$v zVmP=JBj*l1`>xBb^&i9sn4!zL-2Y_pTmIj#t77xZU++X-78)9w(hB1v%9M=H104VG z>cFN?FKj@!e&F4*W=Kc~T8yPB*BYjpm)nyPal>&LdrX{$dU&t?h z6JQAK-UCPP!_ZusOWHIF7hh5J^z_UH-7csbOR7=`5(L@P+rsOgQo2FFw2@F!IihvM z9IXtTF9Z9W(uB#aTxSMFTx>tye?E1>JF4@5z8pSTg66r_ZLYL$Xn0Fn`^F;-%DtKS z`D_ox4KH09O1{S$1bfT9?R;)X^6dkyGmH~JiK)+?arYx0U7fwJUYZ>fbX9kLOM2z*zCq8`mfEF1ww>41LeBdRQG|#y` zk}#ouc%L>FsiVQS@*X5QRSW!eE7xY5?MKt28vsK^HLmuQ+zLkG;^N%E{EoZJt5 z1~m&-9Q9eO7*KR|UG%Nl{PDzANnKsN5~N^>HWrW-2opo^MOq&`v3bR3>^6A!=g*(- zJle#+!scwfp3_zKAH=%OfX#F|;tTVWV`p50kNaflGS$lfy9x@uW_(fN_6r#*gYh^F z0P4Myva73WFKiV23wMW7DOu~CQ}app)yY!xrbxa*a4>4FqGDq8plm!0n^ZSBy#;CS zVc3o^)`qvUA%w{s1iuSGoi8^7|LBh-+hondOt`@T?`L4$;7C;q0&)Syg1YD_*ghUh zbWZU`qT5j5QoWGRqxNUoXsfFw$;rk&c~X=}O-04R!eakspLiYY2$?h=c`744oy!J{ z2*sF1iFm(s^3l$i=;-M1mMR4)zzr6KXRM%Px&&g*N%IdM+>_gH92ZA7BX& zdJvlmfly}2@cBsO^VhG8umgDzfaPZyor0=##)&E2gWZPuTRv{PQG_8#~Z4b=AaWN=9S+mC@3Y*qfu|6}c~hn0OE2cKZ_w zp0jwGd?rtqyQy)kES;5KEL!63w_m!->2;Aoc85=0CF8n!ZkIXTu2WiHX!n1)$`BAc z5;i9z_jdTi;(PB_WSZ5h#zbh7p{8qbHTFsX64TWIVzLrrnW;k|;{9iDEhIFKq|pKqQ3<*8SUq^*8OODh zxNm`cWHtEmXwUN>cp6(=Uj$-gVix$Bk%DS{rTEhamhex`WYinzln)IuwN0Ja9Gyr^p9ba45V|xH*uEFpQ zLo-VVaQwx;zjqqih7b_#J~R2XnBPm8`}@dt z4?ANwpnR96?7S}OY3OWvUOC@1a{M5MrjvUHc7XPlX`l39W}v#ZIal+R4XGs0WNipz zGg+uX0(6$AAwT3@1@95QA^M_iZFx>-<&w{+s!4Wu9;lbR0FaYfi~Ioj>}z0SM-9Qw zFCiYVQMr~2Bmm`|L(iMLof(g6AM1$Pdu;@#v2XKIiIc|?`vuLr}@pS5ZGTX}4T^hms8 z3LsCqL^fFuC#T7;VxSox({SYYC>mZEL@ac#m%xVHD9Ul0ZR8n-{p-)EYHn_9TGuuah|Tt&)y32V++%SuNbd(((#sE6 zq)#MzjAdm)Y`r_R^ugALroO)Z@mOZ=+S=Md2|H7C<9l!#2RW2OAE5nR^T;3I;q-59y{}mNe+&(ygy9qO!mZ z9APqM3}+5NlrltfHM%%i0Jr9YwRb<&Ae*B4iZG7r?o)9Lp_vd2&X)s8>T)-~sDVh5 z87zVk_F9_B1o7WX163eUZU%JeC+M0;OBCinFj2p$=`Lo|D*^s@vc#am<(ACyw+Qsc zyu7@bZ2`T#y=Aja{HS4|{v~o`07#RAk`7mQH{rv}S^7U!fEqM=g8^zbw*{gI3{9MG zeSH~-5*5!h5*Q)aX`Vhj>Hr!Nbr2(?XN{n3&Cvouo`R6;t|KrSACS>-pMeBKWJTk| z7{n+*G5nu^j(Sine5KZZj{v&|Y@{!u^?Q_2%!>9+z`kG*XAnUR^*U(3Kd#<92a2=| zzyNuXGm7$l|6&4C>>F};g5;f9)VDw7J{ffr8Wd7$`LjLV(630y=1Tr%5SX7h^c6E& z5|Esdh&pUP@jhKCJ=2cpNF{BlSq%PtgJ*4lTx*~T=Vy66IOtumyyTS zv60}`-@-Ff!F==pjo5LEiJ??VsNC2jo9xDI)< ziX$4$1A_2_BJ=3>pm@rdsh@AWRWrEa>hFZU3fH%=YrYvuHke|4uY+dv%j?J|cF-%-c!xR<0N4dkch0{)maRfMEPMIc_Y= zvNh3u@GgDSDzfHBL}CWxg5l`@taw)6R>t$gP>6ocvJOTKou=IK)n2F1>Yt$duY)|t z@2Ng%*qS`i4PtOAK!wpdtM5X{vTBovYrnfCxQMGypRKL@9;HF+ld>VcGzwDQ@~!qvP0ivVGLY*nzkYZ9w`-E)pt30@0H)=o%k`P zb^gnoVbNcEF7I<_7Wmb!qp1kJ6t1y+2BLM4$>vHI>bI_=Ui_diJMa)uP8Tkq-Z(NU z>X|5n)~>4`!qap#5J@hOTugLQy3~<(SsH99&PmB>qFWdc)Z@1IAV_^&SI2vPyeq%g z67I$HMBKLJA1Z_H5lf92*`Jc6Sz~<(P~<7GI#Cp%v8)Eq4@L6?xD_30YLKV$ji%)u zhss2@(1Y_Xg>(~nU#I&KD6<47g-iRGC60}CK7Zn*bmmOc-up)zm&<^~kxidN5mJB( zzW$lKJ2rN+@0GLKlM@1HrUp*;oYaWOB<$vnf^LbGpQ*#pv!P(STnUk7cStB3P$8Q( z0QcT0VCxJ=vSSdGgnJYn9qpv_)obp_fST0cX`TcpZIzL(e3PW)@Ua}|0loy2S57zn z=Ou`1Zfp#M+e)D6I7%;}{Xd%4`V!0vWk8*NemtBAW{~DcU2OXLc6YV6r-}$DOq>d^ zI+Azg4HAI%Q<_LyN@gZ+i^TAQG!eOWh<=eRu*tsUX|4`^FkPKXL%+Y?%)eHEpAhg3 zD%hS6pr8VR+#V#0wn8{+_8>RFlkhvXGv9;__2>NgmB%3Pf1_3xnKgJi)#2$67`F>T{}+y)g%qmfIo>3hYOFi>i15}=aZ08)X&>x%iZ3dX?adl~0T3W9q3JX+f@WjAL4}7RH!2r(u1aS{-1z>-Vme}+$f(mjN zn$tn@g#sCS92W6A!z2z6$}-+w38jUkTqa_!tLj|@O>mWwF!_xoXbxk*(Zc|k@59sr zXM#4LGPC`eHZr#J`Nma|Eg9y?YTS>bq8h+f%>b?xLdIfH<>8EG6wnv6C@->Q00-fn zx)i=6eK+B^w10m-utaFpTV{_U2MD6HR8;6}(%rrE4Y!H+n!UbFj55n81@u^`%Zh(sjuxd+%45!2AoCeUp5gJSPfoOc!+#C!D z+#x|oKp+G%8~|DG>@F?~7*{e&z??~WjGVW}`y_dJ;09uy+AL8z0sNFw^kz393jz)Q z0Gi!rsSte-WP0*O@ghJ08C1I2GsDjOsRH1h!XS*G9+yL2UOv^9Yc#>NKM?YlNQ+QV z{U+~7dn^2wIl@UHUCg@s7!0>8Pz6^BzNVt8Dq^4`hkB}k^(j}BwlsiBwMp{zKoMwx zrb-~dGj!O^YuoA9OyHiqdxwEr2?Xhj?{C5;Arhj55}LlF*$k?r^(b8uo#_G1G+E%s zq82KO>S26pC*FYBncXUF888EIjz{+rV7>^A%ue)b;3f5CfT`yb@@wLTOtEOo#Q!}1 zQ1CbI?Yuyj4b4dBTBL>G#s@&SA#fkli8>-mnf79L=<8diE zIn`5Yi_(sxJJWL2hi1dK7mib0MrjKmsT!_DUp@dK=lMq#v}r+63V92S@!2Rk_xA1E zku7Wzc85-Ljq0#4X2pX!DA)L`4*_7+9IpaSA_QEGGQ^8icp#cwNUY7gNd=Xy-@51Q&XS6qN_-@UMD*Wx1-9tOcdsthshp5AQcROVWjsn z6xf3w4-Lb0pq1K|p_b&2(^|njMra&*B7>;(k99_2zigH+An;ue2dO@q0vWM@_0_J}5S-IG@uvvqklR!Jyu*4S~C(ARLGzzE&2; z_rk*VLv<(%j#AozN8j-Y3g*p<! z{eHI~cfb-rOwXHi5TelAP^tb{&7nxFSf^MrZ%{-+>gCrsclB# zmBV53a)1@97A^&-9I*v_@e9BocfzUNm5>(kC9oYcJ?S*nD|uQh%M)1T2n~EYJPqGz zSKSD1^&_ILyn>CRz%;9jnD`*e-+B4@n*lDM5ei7U7^mF~$H41Gwoo!0=RD0tR|KFp zjRt?aOwOHV)ho5><2`aj#a$4x4I(jgc(nirK%ZZ;;Q;{962ukH@jN5|SRD%aN=EO< zP2d{=AUB$xA3Gpu1kPw@hW;_0{nPqx)t>oiR&A?G!*gMch2-~Gbh?X(>#;ao4Wr6e zyx)x@eU2y5%?w<=MdmXzV~^4F|F=?Jy2OYsHfwUcHxwQpp&`XL)|H>s_8w;3MRXAz zd$f09Qc!r5{J1GRlP|#*4fHBUen1dF*M&fo+^+peE<6I#%>n?Yc=6)JCdVwnh%AcP z*;zE#~nvLEWA|Bis5;VB81?0l#c(!i375^UY-X<_GdRE_? z9@E81&%WdMY!uFdN-jb=K~MjdZDZyhnoYc+l#h2JWOxBNW@JlOwjMup(HyAM@$9S( zILV05=XA3Gkm+8ZLg_Ncb1r2wwR<_l#fybyWzc+>{AN}i7-R5EHaO3NcsGzhd--p~w#YccXkiVA6D~2Yi z;J&mVps9?A+xEvNhqv!zlam?6!(I&1R<|8=o;Fo3e7z~`I@KFFV%3?;fcEb0pcij| zaSNY)50Hlem1{bwzKjw9zkn0q`g+m=Xa;`Zs$XzgLc5`qFZVyijoWF5Sjh0tZ1on< z4Pg-PEuQj98+nW(>03b40$>XbkfE*tL2^KRteU}6jKC_*4vC3^H`-G2fX8?R1U_h~ zFJDHdSHWSY;a4tV&eCjK#39uWuzaQ(Sfd62MhQ+Tm(Ya(&~fs**B3y?SjAQ?Dhr5s za7sK4=z^baxU%gW-2%FN3T1*I)aHI%tEV@K|B*7`2)UG^kB^Uv z2p1QZ{UCCe9-ZJkt~=kjvGi8H0dfJ8bldO;DDUw-76P>8(=@MsU=5a{k>%*Roms*| zBHM1o_h>1s11p1x++p~M9-0(qHPNT&UI1id3&sMJ{I7Rd?3^*J8zJb-TvD0kZ`GpBZU`rz@aXBmTE^jt<< z`{*EsskqyqWN3zF5{i&_XK&PGBzhbXEW_PKL$K1o;R-a3OrJyZ4e9Ah5fR}ely%!p z!F&*4a88>mzATxH+qQgCOvlKG8J%Et8f)ikks8lEh|)>}HS(jmVHY8;0si7aPzrj_ zfITR8HPGoBJ!;6F=md=HWDupgFUgaTgObgU^AtemNRS$WQd0Rj`uY-Nb*fExyqA`~(Ri_Eba zK&*lui&F>-tVOg|+L;A8baA`=u!l_n?b$>1(D{|&cmJcWbC0SiZ{zrR!!VdeQYTbH zA<+e8x*~K`E*ZL+Bos!8RHlUN#u!RBrL=UJsHW15l1hz}nYYVPDkZ#)C?`pwoJ^5Q z^L>ua&U)9oUVm7%9PQh0KhO91e80P`8YVVoftF>lbZs77#UKU{GG2({78vW!Hvk5( zx;#K7vk(>Hp0%A{L)s?QHDSt1xWegglqgO>z(NZFC%pD}?KCbomC-GMoIL#IkMXUg zvKxa5QK4=3-_S{o_qHFzotwFL$@iI1XGG5<+o7hp+lM;sT5)f!ALz-(5Jq=i+`&J; z%z+51T{g_yn$NP`gK46zJ3jS}g8{xTvkFMWEyiEuIndRwF=Sq5zQE$96@sDbUf%=2 zEGH07;^GP`jvsr46|ed3TNrG_97wfP`Q6_@E&z^=Kr8AJscB$3%3wfuB>uN+2y_nO z5K8p2Cf-P#RvC2-HVPEy5Wt1uS0Ju(q!lwzV@fi+b(r#%pTg>m;`(ik z@S5eahiB0o23txlMjOek%T}r7*ez9UZEZuJE=A14 z0U#6Qc-N>rX5?T%bE;Nky*^-oGqK?_P~l~8zhirj_V@RTDpq`4OwPn5M~R~0aIxOn6j~C%-q#y$l`r`=|X_Mk(5-g7JFfR$+E= z*BM~z>-9cSk&&e%JjG@HKw(@Q6LctEP0jlHgpHd|(>`c#yu)OUG(dbOkLjneS%^V#a2R}S42}RI?adW9f)8AZ_arNq= zco*xRu>JQGW`L?$XV_*n^h|9)z7z{ARxm(5PW1NU2K-?-%EIA|7{&l0>%)0+8K?*AV|3Lm5im@)TAq0E z;w%bsk|3#9XU|^p1<9p4`&+1SkAPeOXTTB<+?HlAW6xQxjU{sUt6yIuqhRFirV9(O zBhHoHRUAeM9b}dhQNnF{$n|Q4NDV=LvBCm4^>RBw^!l6NH5qO*zH~uxAsx#Xg}Bd& zpDHsvbo1}Qx3v|Nvre{RcSyitl~0ut%9H3^!r&Z7zux;>au_Eb;>cUOlkM?7>AHL8I zS2MDH2+rN%-96@8vh1%rVU3IKuKt>b3nc3zKrMhNUE0%Dl>}2NP!~Hm!nMx&-tR8h z^XWEinUsm*;_pbc z5$DdyQb0{(Tam6-$zacdp~fzZop)lEE`${}9rtf$?q@3Eh_8iYGM2js+KHER9-ORf ztgoU%l~Cu0n&4>1BkDBuP@uWGlma_e{8QC-HI*D5`nK(QCL4p8sM$DUJT z&>p9c=)>|J5$t4b3Us>P?6v(J9-cU4iKK{IGk+P$4rrbnz^XKeXUx27aKb5e17{-< zjlT|In!VV`yuEcQ@YlJg8RQ&RCCqNzg-hDz2>4frL1~hw^iG1SWawz|-wOi*DE6u0 zP`HT3ABe3WRI&=h=}06HRwHbOBct0a30onRx&}EqA?}+H+${438`)ZLR##FBS|+7z zN@CVfTi0)kw2H8NI^~lq<^%1udhV_y^sF^R&uiHKd@-hyMOXfv-8g~f9mjykbVf}| zj-sn%;NV=`OeaKk-gOe_7R*x>RUjWPr)ad+D2Bc%G%SlD1v ziRo`DUf{g3(#y`#clQ^cZdw6kqk4)Qb@paYdZ_GwnaI?Skl z*IpgV1?&l=Cq5{DddY|q?$Apcy+#rE8{Q7dU}Lg02l%mYsP9n{YLJM5Pi~-$L7E`2 zPLC}{e=<_}c+It0nDR2p(8%#$A`TErnb43Q+0%22Yr)>5oa7WB5=w&7jjy7orw6qu zPiEHNuNrmWEGvTnW!=3=k84mlp11K=MH**d3o`ljS(K1Ni?I11c?1i;Iw+`0A{+c& zGx5Wp*Tm06X&QRtOcfk@piIV0QAX1~F94v&m@o*DZ;W3w*G58RK{z{8lA-UBdqwW< zDkpU8O}4h@^Yif;icBP8mt2ZvNBSQQ>%EZ0-YrwE;ipm7F!3uCIT0RL_?BE*QzQ29 z{X4bwIwapoYtpAs#|*RaV9jTZ-+#5q=t)vEq}?omsAT51It%VxT)RcVQ)|t%#SUzQ- z%6gO7at&Tz$-1)s8y}*gN%}D5d}+R*Yy{Xed6SzQ9318 ze6wIA4o(NadMy5~i7+n~LozBLYG-OnU;t2*ctQ{btx(3Dfg^LEmFBCfUvAin3mZZ( zl&mHytm3FLs`GErD|@B5%zf*fJ9iSLKw}eyheczp;3!)uhf7TngNyLiPh-USOt^oj zVQMNWo?c!_`1w@oDHx~g{=^uzrxIrK{3#Oo!Qlv4q`^^iBF>2$tPXeUXA6R}KtXeK z-AFDJ7N73<=%?v;Bv`XgDnI&8tki_)Ree&I{_j`QXSWRJc~zKB7`u`)mOD{Z-{iyA z*~I|`C#2HNTjss6T{Q8Ff}D3!@?$3#b;X!-I8xFUrYo%rp7u+f{Fg(~>k-rGW4C^& zL9Le$g$i`8J@|{oqi4MvN36!dCciz7#j5zg`@g*QD2u-m@A`u5V#$;;dMGWj(H`%l c=F1-$Q|&OJ?65**9sQdH&(bt|)s7SY0G%+)PXGV_ diff --git a/src/scenario/scenario.js b/src/scenario/scenario.js index 808307e..dde3116 100644 --- a/src/scenario/scenario.js +++ b/src/scenario/scenario.js @@ -65,8 +65,11 @@ class Scenario extends React.Component { // obtain all component configurations of a scenario let configs = ConfigStore.getState().filter(config => config.scenarioID === parseInt(props.match.params.scenario, 10)); + // obtain all files of a scenario + let files = FileStore.getState().filter(file => file.scenarioID === parseInt(props.match.params.scenario, 10)); + let signals = SignalStore.getState(); - let files = FileStore.getState(); + return { @@ -118,6 +121,13 @@ class Scenario extends React.Component { param: '?scenarioID='+this.state.scenario.id, }); + // load files of selected scenario + AppDispatcher.dispatch({ + type: 'files/start-load', + token: this.state.sessionToken, + param: '?scenarioID='+this.state.scenario.id, + }); + // load ICs to enable that component configs and dashboards work with them AppDispatcher.dispatch({ type: 'ics/start-load', diff --git a/src/widget/edit-widget/edit-widget-control-creator.js b/src/widget/edit-widget/edit-widget-control-creator.js index 3133d29..78bff0c 100644 --- a/src/widget/edit-widget/edit-widget-control-creator.js +++ b/src/widget/edit-widget/edit-widget-control-creator.js @@ -21,7 +21,7 @@ import EditWidgetTextControl from './edit-widget-text-control'; import EditWidgetNumberControl from './edit-widget-number-control'; import EditWidgetColorControl from './edit-widget-color-control'; import EditWidgetTimeControl from './edit-widget-time-control'; -import EditImageWidgetControl from './edit-widget-image-control'; +import EditFileWidgetControl from './edit-widget-file-control'; import EditWidgetSignalControl from './edit-widget-signal-control'; import EditWidgetSignalsControl from './edit-widget-signals-control'; import EditWidgetOrientation from './edit-widget-orientation'; @@ -84,7 +84,7 @@ export default function CreateControls(widgetType = null, widget = null, session // Restrict to only image file types (MIME) //let imageControlFiles = files == null? [] : files.filter(file => file.type.includes('image')); DialogControls.push( - handleChange(e)} onUpload={(f,i) => onUpload(f,i)} />, + handleChange(e)} onUpload={(f,i) => onUpload(f,i)} />, handleChange(e)} /> ); break; @@ -149,7 +149,7 @@ export default function CreateControls(widgetType = null, widget = null, session // Restrict to only xml files (MIME) //let topologyControlFiles = files == null? [] : files.filter( file => file.type.includes('xml')); DialogControls.push( - handleChange(e)} /> + handleChange(e) } onUpload={(f,i) => onUpload(f,i)} /> ); break; diff --git a/src/widget/edit-widget/edit-widget-image-control.js b/src/widget/edit-widget/edit-widget-file-control.js similarity index 83% rename from src/widget/edit-widget/edit-widget-image-control.js rename to src/widget/edit-widget/edit-widget-file-control.js index de98757..298ba01 100644 --- a/src/widget/edit-widget/edit-widget-image-control.js +++ b/src/widget/edit-widget/edit-widget-file-control.js @@ -18,15 +18,14 @@ import React from 'react'; import {FormGroup, FormControl, FormLabel, Button, ProgressBar} from 'react-bootstrap'; -//import AppDispatcher from '../../common/app-dispatcher'; - -class EditImageWidgetControl extends React.Component { +class EditFileWidgetControl extends React.Component { constructor(props) { super(props); this.state = { widget: { }, + files: [], fileList: null, progress: 0 }; @@ -34,7 +33,8 @@ class EditImageWidgetControl extends React.Component { static getDerivedStateFromProps(props, state){ return { - widget: props.widget + widget: props.widget, + files: props.files.filter(file => file.type.includes(props.type)) }; } @@ -47,19 +47,8 @@ class EditImageWidgetControl extends React.Component { formData.append("file", this.state.fileList[key]); } } - - this.props.onUpload(formData,this.props.widget); - // upload files - /* AppDispatcher.dispatch({ - type: 'files/start-upload', - data: formData, - token: this.props.sessionToken, - progressCallback: this.uploadProgress, - finishedCallback: this.clearProgress, - objectType: "widget", - objectID: this.props.widget.id, - });*/ + this.props.onUpload(formData,this.props.widget); } uploadProgress = (e) => { @@ -83,11 +72,11 @@ class EditImageWidgetControl extends React.Component { } let fileOptions = []; - if (this.props.files.length > 0){ + if (this.state.files.length > 0){ fileOptions.push( ) - fileOptions.push(this.props.files.map((file, index) => ( + fileOptions.push(this.state.files.map((file, index) => ( ))) } else { @@ -114,4 +103,4 @@ class EditImageWidgetControl extends React.Component { } } -export default EditImageWidgetControl; +export default EditFileWidgetControl; diff --git a/src/widget/edit-widget/edit-widget.js b/src/widget/edit-widget/edit-widget.js index 30b9fd0..594acf0 100644 --- a/src/widget/edit-widget/edit-widget.js +++ b/src/widget/edit-widget/edit-widget.js @@ -16,10 +16,7 @@ ******************************************************************************/ import React from 'react'; -//import { FormGroup, FormControl, FormLabel } from 'react-bootstrap'; - import Dialog from '../../common/dialogs/dialog'; - import CreateControls from './edit-widget-control-creator'; class EditWidgetDialog extends React.Component { @@ -110,11 +107,11 @@ class EditWidgetDialog extends React.Component { // not a customProperty customProperty = false; } - + if (parts[1] === 'lockAspect') { //not a customProperty customProperty ? changeObject[parts[0]][parts[1]] = e.target.checked : changeObject[e.target.id] = e.target.checked; - + // correct image aspect if turned on if (e.target.checked && (this.state.temporal.customProperties.file !== -1)) { changeObject = this.assignAspectRatio(changeObject, this.state.temporal.customProperties.file); @@ -123,7 +120,7 @@ class EditWidgetDialog extends React.Component { customProperty ? changeObject[parts[0]][parts[1]] = e.target.value : changeObject[e.target.id] = e.target.value; - // get file and update size (if it's an image) + // get file and update size (if it's an image) if ((changeObject.customProperties.file !== -1)&&('lockAspect' in this.state.temporal && this.state.temporal.lockAspect)) { // TODO this if condition requires changes to work!!! changeObject = this.assignAspectRatio(changeObject, e.target.value); @@ -135,7 +132,7 @@ class EditWidgetDialog extends React.Component { }else if(parts[1] === 'orientation'){ customProperty ? changeObject[parts[0]][parts[1]] = e.target.value : changeObject[e.target.id] = e.target.value ; changeObject = this.setNewLockRestrictions(changeObject); - } + } else if (e.target.type === 'number') { customProperty ? changeObject[parts[0]][parts[1]] = Number(e.target.value) : changeObject[e.target.id] = Number(e.target.value); } else if(e.target.id === 'name'){ diff --git a/src/widget/widget-store.js b/src/widget/widget-store.js index f49ca27..ff1ad64 100644 --- a/src/widget/widget-store.js +++ b/src/widget/widget-store.js @@ -29,7 +29,8 @@ class WidgetStore extends ArrayStore { case 'widgets/loaded': - WidgetsDataManager.loadFiles(action.token, action.data); + //WidgetsDataManager.loadFiles(action.token, action.data); + // TODO make sure files of scenario are loaded return super.reduce(state, action); default: diff --git a/src/widget/widget.js b/src/widget/widget.js index 1327414..a2eb294 100644 --- a/src/widget/widget.js +++ b/src/widget/widget.js @@ -88,27 +88,6 @@ class Widget extends React.Component { }; } - componentDidMount() { - if (this.state.sessionToken == null) { - return; - } - - /*AppDispatcher.dispatch({ - type: 'files/start-load', - token: this.state.sessionToken, - param: '?objectID=1&objectType=widget' - });*/ - - // TODO no not load component congfigs here, since they are loaded via the scenario, pass them as props - /* - AppDispatcher.dispatch({ - type: 'configs/start-load', - token: this.state.sessionToken, - param: '?scenarioID=1' // TODO do not hardcode scenarioID! - }); - */ - } - inputDataChanged(widget, data) { // The following assumes that a widget modifies/ uses exactly one signal AppDispatcher.dispatch({ diff --git a/src/widget/widgets-data-manager.js b/src/widget/widgets-data-manager.js index c32417d..aa85a7b 100644 --- a/src/widget/widgets-data-manager.js +++ b/src/widget/widgets-data-manager.js @@ -26,18 +26,6 @@ class WidgetsDataManager extends RestDataManager{ super('widget', '/widgets'); } - loadFiles(token, widgets){ - for (let widget of widgets) { - // request files of widget - RestAPI.get(this.makeURL('/files?objectType=widget&objectID=' + widget.id), token).then(response => { - AppDispatcher.dispatch({ - type: 'files/loaded', - data: response.files - }); - }); - } - } - } export default new WidgetsDataManager() From 5f36915afbb5bf6a03cbac98afa0628a8716d9a3 Mon Sep 17 00:00:00 2001 From: Sonja Happ Date: Wed, 27 May 2020 10:47:52 +0200 Subject: [PATCH 218/391] remove unused imports --- src/widget/widgets-data-manager.js | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/widget/widgets-data-manager.js b/src/widget/widgets-data-manager.js index aa85a7b..61d1cf0 100644 --- a/src/widget/widgets-data-manager.js +++ b/src/widget/widgets-data-manager.js @@ -17,8 +17,6 @@ import RestDataManager from '../common/data-managers/rest-data-manager'; -import RestAPI from "../common/api/rest-api"; -import AppDispatcher from "../common/app-dispatcher"; class WidgetsDataManager extends RestDataManager{ From fdeab76fe6ace38f23ffbda72e193de1dc14142f Mon Sep 17 00:00:00 2001 From: irismarie Date: Wed, 27 May 2020 15:16:41 +0200 Subject: [PATCH 219/391] [WIP] add user functionality for each scenario --- src/scenario/scenario-store.js | 35 +++++++++++++++++++++- src/scenario/scenario.js | 40 +++++++++++++++++++++++++- src/scenario/scenarios-data-manager.js | 14 +++++++++ 3 files changed, 87 insertions(+), 2 deletions(-) diff --git a/src/scenario/scenario-store.js b/src/scenario/scenario-store.js index 777475c..75c77ee 100644 --- a/src/scenario/scenario-store.js +++ b/src/scenario/scenario-store.js @@ -19,4 +19,37 @@ import ScenariosDataManager from './scenarios-data-manager'; import ArrayStore from '../common/array-store'; -export default new ArrayStore('scenarios', ScenariosDataManager); +//export default new ArrayStore('scenarios', ScenariosDataManager); + +class ScenarioStore extends ArrayStore { + constructor() { + super('scenarios', ScenariosDataManager); + } + + getInitialState() { + return { + state: super.getInitialState(), + users: null + }; + } + + getUsers(token, id) { + ScenariosDataManager.getUsers(token, id); + } + + reduce(state, action) { + switch (action.type) { + case 'scenarios/users': + state.users = action.users; + return state; + case 'scenarios/users-error': + return state; + + default: + return super.reduce(state, action); + } + } + +} + +export default new ScenarioStore(); \ No newline at end of file diff --git a/src/scenario/scenario.js b/src/scenario/scenario.js index 005b859..11c2739 100644 --- a/src/scenario/scenario.js +++ b/src/scenario/scenario.js @@ -21,6 +21,7 @@ import { Button } from 'react-bootstrap'; import FileSaver from 'file-saver'; import ScenarioStore from './scenario-store'; +//import ScenariosDataManager from './scenarios-data-manager'; import ICStore from '../ic/ic-store'; import DashboardStore from '../dashboard/dashboard-store'; import ConfigStore from '../componentconfig/config-store'; @@ -43,6 +44,10 @@ import FileStore from "../file/file-store" import WidgetStore from "../widget/widget-store"; class Scenario extends React.Component { + constructor(props) { + super(props); + this.getUsers = true; + } static getStores() { return [ ScenarioStore, ConfigStore, DashboardStore, ICStore, LoginStore, SignalStore, FileStore, WidgetStore]; @@ -51,7 +56,7 @@ class Scenario extends React.Component { static calculateState(prevState, props) { // get selected scenario const sessionToken = LoginStore.getState().token; - + const scenario = ScenarioStore.getState().find(s => s.id === parseInt(props.match.params.scenario, 10)); if (scenario == null) { AppDispatcher.dispatch({ @@ -60,6 +65,21 @@ class Scenario extends React.Component { token: sessionToken }); } + let users = null; + let sc = ScenarioStore.getState().users; + /* + if (sc) { + users = sc.users; + if (users == null && this.getUsers ) { + ScenarioStore.getUsers(sessionToken, props.match.params.scenario); + this.getUsers = false; + } + } + */ + + + + // ScenariosDataManager.getUsers(sessionToken, props.match.params.scenario); // obtain all dashboards of a scenario let dashboards = DashboardStore.getState().filter(dashb => dashb.scenarioID === parseInt(props.match.params.scenario, 10)); @@ -85,6 +105,7 @@ class Scenario extends React.Component { return { scenario, + users, sessionToken, configs, dashboards, @@ -111,6 +132,9 @@ class Scenario extends React.Component { } componentDidMount() { + // get users of scenario + ScenarioStore.getUsers(this.state.sessionToken, this.state.scenario.id); + //load selected scenario AppDispatcher.dispatch({ type: 'scenarios/start-load', @@ -140,6 +164,9 @@ class Scenario extends React.Component { } componentDidUpdate(prevProps, prevState) { +// if (this.state.users) { +// this.getUsers = false; +// } if (this.state.dashboards.length > prevState.dashboards.length) { if (this.addWidgets) { // add widgets // this can only be true after dashboard import, so there is only one dashboard @@ -461,6 +488,17 @@ class Scenario extends React.Component { return

    {this.state.scenario.name}

    +

    Users

    + + + + this.setState({ deleteUserModal: true, modalUserData: this.state.users[index], modalUserIndex: index })} + /> +
    {/*Component Configurations table*/}

    Component Configurations

    diff --git a/src/scenario/scenarios-data-manager.js b/src/scenario/scenarios-data-manager.js index ec4a442..b5e48fe 100644 --- a/src/scenario/scenarios-data-manager.js +++ b/src/scenario/scenarios-data-manager.js @@ -24,6 +24,20 @@ class ScenariosDataManager extends RestDataManager { super('scenario', '/scenarios'); } + getUsers(token, id) { + RestAPI.get(this.makeURL('/scenarios/' + id + '/users/'), token).then(response => { + AppDispatcher.dispatch({ + type: 'scenarios/users', + users: response.users + }); + }).catch(error => { + AppDispatcher.dispatch({ + type: 'scenarios/users-error', + error: error + }) + }) + } + getComponentConfigs(token, id) { RestAPI.get(this.makeURL('/scenarios/' + id + '/configs'), token).then(response => { AppDispatcher.dispatch({ From e90e12fc5c0990be3f2bb20b7670ccd8015002a4 Mon Sep 17 00:00:00 2001 From: Sonja Happ Date: Thu, 28 May 2020 09:59:22 +0200 Subject: [PATCH 220/391] Fix for edit config, select-file; enable upload progress callback; fix startParams update --- src/common/api/rest-api.js | 2 +- src/componentconfig/edit-config.js | 24 ++++-- src/file/files-data-manager.js | 6 +- src/file/select-file.js | 126 +++++++++++++---------------- src/scenario/scenario.js | 10 ++- 5 files changed, 85 insertions(+), 83 deletions(-) diff --git a/src/common/api/rest-api.js b/src/common/api/rest-api.js index 9fa04f1..3bb18d1 100644 --- a/src/common/api/rest-api.js +++ b/src/common/api/rest-api.js @@ -125,7 +125,7 @@ class RestAPI { upload(url, data, token, progressCallback, scenarioID) { return new Promise(function (resolve, reject) { - const req = request.post(url + "?scenarioID=" + scenarioID).send(data); //.on('progress', progressCallback); + const req = request.post(url + "?scenarioID=" + scenarioID).send(data).on('progress', progressCallback); if (token != null) { req.set('Authorization', "Bearer " + token); diff --git a/src/componentconfig/edit-config.js b/src/componentconfig/edit-config.js index db81b14..a69159d 100644 --- a/src/componentconfig/edit-config.js +++ b/src/componentconfig/edit-config.js @@ -32,8 +32,8 @@ class EditConfigDialog extends React.Component { name: '', icID: '', configuration: null, - startParameters: {}, - selectedFileID:0 + startParameters: this.props.config.startParameters, + selectedFileID: this.props.config.selectedFileID }; } @@ -49,7 +49,7 @@ class EditConfigDialog extends React.Component { if (this.state.icID !== '' && this.props.config.icID !== parseInt(this.state.icID)) { data.icID = parseInt(this.state.icID, 10); } - if(this.state.startParameters !== {} && this.props.config.startParameters !== this.state.startParameters){ + if(this.state.startParameters !== {} && JSON.stringify(this.props.config.startParameters) !== JSON.stringify(this.state.startParameters)){ data.startParameters = this.state.startParameters; } if (parseInt(this.state.selectedFileID, 10) !== 0 && @@ -79,9 +79,9 @@ class EditConfigDialog extends React.Component { this.valid = this.isValid() } - handleSelectedFileChange(newFileID){ - console.log("Config file change to: ", newFileID); - this.setState({selectedFileID: newFileID}) + handleSelectedFileChange(event){ + //console.log("Config file change to: ", event.target.value); + this.setState({selectedFileID: event.target.value}) this.valid = this.isValid() } @@ -121,11 +121,19 @@ class EditConfigDialog extends React.Component { - this.handleSelectedFileChange(e)} value={this.state.selectedFileID} scenarioID={this.props.config.scenarioID}/> + this.handleSelectedFileChange(e)} + files={this.props.files} + value={this.state.selectedFileID} + scenarioID={this.props.config.scenarioID} + sessionToken={this.props.sessionToken} + /> Start Parameters - this.handleParameterChange(data)} /> + this.handleParameterChange(data)} />
    diff --git a/src/file/files-data-manager.js b/src/file/files-data-manager.js index 6336c66..cc5cf4b 100644 --- a/src/file/files-data-manager.js +++ b/src/file/files-data-manager.js @@ -38,9 +38,9 @@ class FilesDataManager extends RestDataManager { token: token }); - /*if (finishedCallback) { - finishedCallback(); - }*/ + if (finishedCallback) { + finishedCallback(response.file.id); + } }).catch(error => { AppDispatcher.dispatch({ type: 'files/upload-error', diff --git a/src/file/select-file.js b/src/file/select-file.js index bceee4a..132caf9 100644 --- a/src/file/select-file.js +++ b/src/file/select-file.js @@ -16,56 +16,20 @@ ******************************************************************************/ import React from 'react'; -import { Container } from 'flux/utils'; -import { FormGroup, FormControl, FormLabel, Button, Col } from 'react-bootstrap'; - -import FileStore from './file-store'; -import LoginStore from '../user/login-store'; - +import { FormGroup, FormControl, FormLabel, Button, Col, ProgressBar } from 'react-bootstrap'; import AppDispatcher from '../common/app-dispatcher'; -import Icon from "../common/icon"; class SelectFile extends React.Component { - static getStores() { - return [ FileStore, LoginStore ]; + + constructor() { + super(); + + this.state = { + uploadFile: null, + uploadProgress: 0 + } } - - static calculateState(prevState, props) { - - let files = FileStore.getState().filter((file) => { - return (file.scenarioID === props.scenarioID) - }); - - return { - files: files, - sessionToken: LoginStore.getState().token, - selectedFile: '', - uploadFile: null, - uploadProgress: 0 - }; - } - - /*componentDidMount() { - AppDispatcher.dispatch({ - type: 'files/start-load', - token: this.state.sessionToken - }); - }*/ - - static getDerivedStateFromProps(props, state){ - - - } - - handleChange(event) { - - // send file ID to callback - if (this.props.onChange != null) { - this.props.onChange(event.target.value); - } - }; - selectUploadFile(event) { this.setState({ uploadFile: event.target.files[0] }); }; @@ -78,39 +42,46 @@ class SelectFile extends React.Component { AppDispatcher.dispatch({ type: 'files/start-upload', data: formData, - token: this.state.sessionToken, - //progressCallback: this.updateUploadProgress, - //finishedCallback: this.clearProgress, + token: this.props.sessionToken, + progressCallback: this.updateUploadProgress, + finishedCallback: this.clearProgress, scenarioID: this.props.scenarioID, }); + + // TODO make sure that edit config dialog remains open after clicking "Upload" button }; - updateUploadProgress = (event) => {// TODO: this callback does not work properly (access to setState) + updateUploadProgress = (event) => { this.setState({ uploadProgress: parseInt(event.percent.toFixed(), 10) }); }; - clearProgress = () => { // TODO this callback does not work properly (access to setState) - if (this.props.onChange != null) { - this.props.onChange(this.state.files[this.state.files.length - 1].id); + clearProgress = (newFileID) => { + /*if (this.props.onChange != null) { + let event = {} + event["target"] = {} + event.target["value"] = newFileID + this.props.onChange(event); } this.setState({ uploadProgress: 0 }); + */ + }; render() { let fileOptions; - if (this.state.files.length > 0){ - fileOptions = this.state.files.map(f => + if (this.props.files.length > 0){ + fileOptions = this.props.files.map(f => ); } else { - fileOptions = + fileOptions = } - /*const progressBarStyle = { + const progressBarStyle = { marginLeft: '100px', - marginTop: '-25px' - };*/ + marginTop: '-40px' + }; return
    @@ -119,29 +90,44 @@ class SelectFile extends React.Component { - this.handleChange(event)}> + this.props.onChange(event)}> {fileOptions} - - this.selectUploadFile(event)} /> + + this.selectUploadFile(event)} /> - - - {/* - + + + - */} +
    ; } } -let fluxContainerConverter = require('../common/FluxContainerConverter'); -export default Container.create(fluxContainerConverter.convert(SelectFile), { withProps: true }); +export default SelectFile; diff --git a/src/scenario/scenario.js b/src/scenario/scenario.js index dde3116..27642e8 100644 --- a/src/scenario/scenario.js +++ b/src/scenario/scenario.js @@ -467,7 +467,15 @@ class Scenario extends React.Component {
    - this.closeEditConfigModal(data)} config={this.state.modalConfigData} ics={this.state.ics} /> + this.closeEditConfigModal(data)} + config={this.state.modalConfigData} + ics={this.state.ics} + files={this.state.files} + sessionToken={this.state.sessionToken} + /> + this.importConfig(data)} ics={this.state.ics} /> this.closeDeleteConfigModal(c)} /> From 704c36ab90b792a56354a631aa61518c851431dd Mon Sep 17 00:00:00 2001 From: Sonja Happ Date: Thu, 28 May 2020 11:27:21 +0200 Subject: [PATCH 221/391] Move import logic from Iris to RestDataManager and object stores (to be tested!) --- src/common/data-managers/rest-data-manager.js | 39 ++++++++++++++- src/componentconfig/config-store.js | 29 ++++++++++++ src/dashboard/dashboard-store.js | 37 ++++++++++++++- src/scenario/scenario-store.js | 47 ++++++++++++++++++- src/scenario/scenarios.js | 33 +++++++++++-- 5 files changed, 177 insertions(+), 8 deletions(-) diff --git a/src/common/data-managers/rest-data-manager.js b/src/common/data-managers/rest-data-manager.js index 271f4c6..5076fb8 100644 --- a/src/common/data-managers/rest-data-manager.js +++ b/src/common/data-managers/rest-data-manager.js @@ -133,16 +133,51 @@ class RestDataManager { } - add(object, token = null, param = null) { + add(object, token = null, param = null, subObjects = null) { var obj = {}; obj[this.type] = this.filterKeys(object); - RestAPI.post(this.requestURL('load/add',null,param), obj, token).then(response => { AppDispatcher.dispatch({ type: this.type + 's/added', data: response[this.type], token: token }); + + // check if POST is done for import of object and issue dispatches of sub-objects + if (subObjects !== null){ + // there are sub-objects to be added for an import + for (let objectType of subObjects){ + let type = Object.keys(objectType) // type can be dashboards, configs, widgets, ... + type = type[0]; + for (let newObj of objectType[type]){ + + // set the ID of the object that the sub-object shall be associated with + if(type === "configs" || type === "dashboards"){ + // the main object is a scenario + newObj.scenarioID = response[this.type].id + } else if (type === "widgets") { + // the main object is a dashboard + newObj.dashboardID = response[this.type].id + } else if (type === "signals") { + // the main object is a component configuration + newObj.configID = response[this.type].id + } + + console.log("Adding new object of type", type, "with content", newObj, "to object of type ", this.type, "with ID ", response[this.type].id) + // iterate over all objects of type 'type' add issue add dispatch + AppDispatcher.dispatch({ + type: type + '/start-add', + data: newObj, + token: token + }) + + } + } + + + } + + }).catch(error => { AppDispatcher.dispatch({ type: this.type + 's/add-error', diff --git a/src/componentconfig/config-store.js b/src/componentconfig/config-store.js index b67377d..990275d 100644 --- a/src/componentconfig/config-store.js +++ b/src/componentconfig/config-store.js @@ -33,6 +33,35 @@ class ConfigStore extends ArrayStore { ConfigsDataManager.loadFiles(action.token, action.data); return super.reduce(state, action); + case 'configs/start-add': + // Check if this is a recursive component config import or not + if (action.data.hasOwnProperty("outputMapping") || action.data.hasOwnProperty("inputMapping")) { + // import + let subObjects = [] + let outputMapping = {} + let inputMapping = {} + + if (action.data.hasOwnProperty("outputMapping")){ + outputMapping["signals"] = action.data.outputMapping + subObjects.push(outputMapping) + delete action.data.outputMapping; // remove outputMapping signals from config object + } + if (action.data.hasOwnProperty("inputMapping")){ + inputMapping["signals"] = action.data.inputMapping + subObjects.push(inputMapping) + delete action.data.inputMapping; // remove inputMapping signals from config object + } + + // action.data should now contain the config and no sub-objects + // sub-objects are treated in add method of RestDataManager + this.dataManager.add(action.data, action.token,action.param, subObjects); + return state + + } else { + // no import + return super.reduce(state, action); + } + default: return super.reduce(state, action); diff --git a/src/dashboard/dashboard-store.js b/src/dashboard/dashboard-store.js index 4e850ab..23b28d6 100644 --- a/src/dashboard/dashboard-store.js +++ b/src/dashboard/dashboard-store.js @@ -18,4 +18,39 @@ import ArrayStore from '../common/array-store'; import DashboardsDataManager from './dashboards-data-manager'; -export default new ArrayStore('dashboards', DashboardsDataManager); +class DashboardStore extends ArrayStore { + constructor() { + super('dashboards', DashboardsDataManager); + } + + reduce(state, action) { + switch (action.type) { + case 'dashboards/start-add': + + // Check if this is a recursive dashboard import or not + if (action.data.hasOwnProperty("widgets")) { + // import + let subObjects = [] + let widgets = {} + widgets["widgets"] = action.data.widgets + subObjects.push(widgets) + delete action.data.widgets; // remove widgets from dashboard object + + // action.data should now contain the dashboard and no sub-objects + // sub-objects are treated in add method of RestDataManager + this.dataManager.add(action.data, action.token,action.param, subObjects); + return state + + } else { + // no import + return super.reduce(state, action); + } + + default: + return super.reduce(state, action); + } + } + +} + +export default new DashboardStore(); diff --git a/src/scenario/scenario-store.js b/src/scenario/scenario-store.js index 777475c..6043b68 100644 --- a/src/scenario/scenario-store.js +++ b/src/scenario/scenario-store.js @@ -19,4 +19,49 @@ import ScenariosDataManager from './scenarios-data-manager'; import ArrayStore from '../common/array-store'; -export default new ArrayStore('scenarios', ScenariosDataManager); +class ScenarioStore extends ArrayStore{ + constructor() { + super('scenarios', ScenariosDataManager); + } + + reduce(state, action) { + switch (action.type) { + case 'scenarios/start-add': + + // Check if this is a recursive scenario import or not + if (action.data.hasOwnProperty("configs") || action.data.hasOwnProperty("dashboards")) { + // import + let subObjects = [] + let configs = {} + let dashboards = {} + + if (action.data.hasOwnProperty("configs")){ + configs["configs"] = action.data.configs + subObjects.push(configs) + delete action.data.configs; // remove configs from scenario object + } + if (action.data.hasOwnProperty("dashboards")){ + dashboards["dashboards"] = action.data.dashboards + subObjects.push(dashboards) + delete action.data.dashboards; // remove dashboards from scenario object + } + + // action.data should now contain the scenario and no sub-objects + // sub-objects are treated in add method of RestDataManager + this.dataManager.add(action.data, action.token,action.param, subObjects); + return state + + } else { + // no import + return super.reduce(state, action); + } + + default: + return super.reduce(state, action); + } + } + + +} + +export default new ScenarioStore(); diff --git a/src/scenario/scenarios.js b/src/scenario/scenarios.js index c00d8f6..19688bc 100644 --- a/src/scenario/scenarios.js +++ b/src/scenario/scenarios.js @@ -74,12 +74,27 @@ class Scenarios extends Component { } componentDidUpdate(prevProps, prevState) { + + for (let i = prevState.scenarios.length; i < this.state.scenarios.length; i++) { + AppDispatcher.dispatch({ + type: 'dashboards/start-load', + token: this.state.sessionToken, + param: '?scenarioID=' + this.state.scenarios[i].id + }); + AppDispatcher.dispatch({ + type: 'configs/start-load', + token: this.state.sessionToken, + param: '?scenarioID=' + this.state.scenarios[i].id + }); + } + // when length of scenarios array has increased, either add data (after import) // or load data (after export) + /* if (this.state.scenarios.length > prevState.scenarios.length) { if (this.addDashboards || this.addConfigs) { let scenarioID = this.state.scenarios[this.state.scenarios.length - 1].id; - + if (this.addDashboards) { this.dashboardsToAdd.forEach((dashboard) => { if (dashboard.widgets) { @@ -124,8 +139,11 @@ class Scenarios extends Component { }); } } + + } + // when length of dashboards array has increased, either add widgets (after import) // or load widgets (after export) if (this.state.dashboards.length > prevState.dashboards.length) { @@ -167,11 +185,16 @@ class Scenarios extends Component { } } + + + */ } closeNewModal(data) { this.setState({ newModal: false }); + + // TODO create dispatch here to add scenario to Backend database! } showDeleteModal(id) { @@ -240,9 +263,9 @@ class Scenarios extends Component { this.setState({ importModal: false }); if (data) { - let newScenario = JSON.parse(JSON.stringify(data)); + //let newScenario = JSON.parse(JSON.stringify(data)); // temporarily store dashboard data until scenario is created - if (data.dashboards) { + /*if (data.dashboards) { this.addDashboards = true; this.dashboardsToAdd = data.dashboards; } @@ -251,9 +274,11 @@ class Scenarios extends Component { this.configsToAdd = data.configs; } delete newScenario.dashboards; + */ + AppDispatcher.dispatch({ type: 'scenarios/start-add', - data: newScenario, + data: data, token: this.state.sessionToken, }); } From 93ca536f40c0805f002f353519650361347e5457 Mon Sep 17 00:00:00 2001 From: irismarie Date: Thu, 28 May 2020 12:09:46 +0200 Subject: [PATCH 222/391] moved action handling to LoginStore as it's derived directly from ReduceStore --- src/scenario/scenario-store.js | 25 +------------------------ src/scenario/scenario.js | 22 ++-------------------- src/user/login-store.js | 9 ++++++++- 3 files changed, 11 insertions(+), 45 deletions(-) diff --git a/src/scenario/scenario-store.js b/src/scenario/scenario-store.js index 75c77ee..be89e90 100644 --- a/src/scenario/scenario-store.js +++ b/src/scenario/scenario-store.js @@ -19,37 +19,14 @@ import ScenariosDataManager from './scenarios-data-manager'; import ArrayStore from '../common/array-store'; -//export default new ArrayStore('scenarios', ScenariosDataManager); - class ScenarioStore extends ArrayStore { constructor() { - super('scenarios', ScenariosDataManager); - } - - getInitialState() { - return { - state: super.getInitialState(), - users: null - }; + super('scenarios', ScenariosDataManager); } getUsers(token, id) { ScenariosDataManager.getUsers(token, id); } - - reduce(state, action) { - switch (action.type) { - case 'scenarios/users': - state.users = action.users; - return state; - case 'scenarios/users-error': - return state; - - default: - return super.reduce(state, action); - } - } - } export default new ScenarioStore(); \ No newline at end of file diff --git a/src/scenario/scenario.js b/src/scenario/scenario.js index 11c2739..b8e3f5a 100644 --- a/src/scenario/scenario.js +++ b/src/scenario/scenario.js @@ -43,11 +43,8 @@ import EditSignalMapping from "../signal/edit-signal-mapping"; import FileStore from "../file/file-store" import WidgetStore from "../widget/widget-store"; + class Scenario extends React.Component { - constructor(props) { - super(props); - this.getUsers = true; - } static getStores() { return [ ScenarioStore, ConfigStore, DashboardStore, ICStore, LoginStore, SignalStore, FileStore, WidgetStore]; @@ -65,22 +62,8 @@ class Scenario extends React.Component { token: sessionToken }); } - let users = null; - let sc = ScenarioStore.getState().users; - /* - if (sc) { - users = sc.users; - if (users == null && this.getUsers ) { - ScenarioStore.getUsers(sessionToken, props.match.params.scenario); - this.getUsers = false; - } - } - */ - - - // ScenariosDataManager.getUsers(sessionToken, props.match.params.scenario); - + let users = LoginStore.getState().scenarioUsers; // obtain all dashboards of a scenario let dashboards = DashboardStore.getState().filter(dashb => dashb.scenarioID === parseInt(props.match.params.scenario, 10)); @@ -132,7 +115,6 @@ class Scenario extends React.Component { } componentDidMount() { - // get users of scenario ScenarioStore.getUsers(this.state.sessionToken, this.state.scenario.id); //load selected scenario diff --git a/src/user/login-store.js b/src/user/login-store.js index 0b461e2..c5718db 100644 --- a/src/user/login-store.js +++ b/src/user/login-store.js @@ -30,7 +30,8 @@ class LoginStore extends ReduceStore { return { currentUser: null, token: null, - loginMessage: null + loginMessage: null, + scenarioUsers: null }; } @@ -76,7 +77,13 @@ class LoginStore extends ReduceStore { // If it was an error and hasn't been handled, the credentials must have been wrong. state = Object.assign({}, state, { loginMessage: 'Wrong credentials! Please try again.' }); } + return state; + case 'scenarios/users': + state.scenarioUsers = action.users; + return state; + + case 'scenarios/users-error': return state; default: From 01edd657104c0c8e71203527f7d12c1b0e09d1b5 Mon Sep 17 00:00:00 2001 From: Sonja Happ Date: Fri, 29 May 2020 10:07:53 +0200 Subject: [PATCH 223/391] Scenario import and export working #216 --- src/common/data-managers/rest-data-manager.js | 5 +- src/componentconfig/config-store.js | 1 - src/componentconfig/configs-data-manager.js | 44 ++--- src/dashboard/dashboard-store.js | 1 + src/dashboard/dashboards-data-manager.js | 27 ++- src/scenario/import-scenario.js | 9 - src/scenario/scenario-store.js | 1 + src/scenario/scenarios-data-manager.js | 49 +++-- src/scenario/scenarios.js | 172 +++--------------- 9 files changed, 98 insertions(+), 211 deletions(-) diff --git a/src/common/data-managers/rest-data-manager.js b/src/common/data-managers/rest-data-manager.js index 5076fb8..fb23eff 100644 --- a/src/common/data-managers/rest-data-manager.js +++ b/src/common/data-managers/rest-data-manager.js @@ -99,7 +99,7 @@ class RestDataManager { }); if (this.onLoad != null) { - this.onLoad(data); + this.onLoad(data, token); } }).catch(error => { AppDispatcher.dispatch({ @@ -121,7 +121,7 @@ class RestDataManager { }); if (this.onLoad != null) { - this.onLoad(data); + this.onLoad(data, token); } }).catch(error => { AppDispatcher.dispatch({ @@ -163,7 +163,6 @@ class RestDataManager { newObj.configID = response[this.type].id } - console.log("Adding new object of type", type, "with content", newObj, "to object of type ", this.type, "with ID ", response[this.type].id) // iterate over all objects of type 'type' add issue add dispatch AppDispatcher.dispatch({ type: type + '/start-add', diff --git a/src/componentconfig/config-store.js b/src/componentconfig/config-store.js index 990275d..6a1911e 100644 --- a/src/componentconfig/config-store.js +++ b/src/componentconfig/config-store.js @@ -29,7 +29,6 @@ class ConfigStore extends ArrayStore { case 'configs/loaded': - ConfigsDataManager.loadSignals(action.token, action.data); ConfigsDataManager.loadFiles(action.token, action.data); return super.reduce(state, action); diff --git a/src/componentconfig/configs-data-manager.js b/src/componentconfig/configs-data-manager.js index c0ac6c9..64245a8 100644 --- a/src/componentconfig/configs-data-manager.js +++ b/src/componentconfig/configs-data-manager.js @@ -26,43 +26,35 @@ class ConfigDataManager extends RestDataManager { this.onLoad = this.onConfigsLoad; } - onConfigsLoad(data) { + onConfigsLoad(data, token) { if (!Array.isArray(data)) data = [ data ]; - for (let config of data) - this.loadICData(config); - } + for (let config of data) { - loadICData(config) { - AppDispatcher.dispatch({ - type: 'icData/prepare', - inputLength: parseInt(config.inputLength, 10), - outputLength: parseInt(config.outputLength, 10), - id: config.icID - }); - } + // prepare IC data + AppDispatcher.dispatch({ + type: 'icData/prepare', + inputLength: parseInt(config.inputLength, 10), + outputLength: parseInt(config.outputLength, 10), + id: config.icID + }); - loadSignals(token, configs){ - - for (let config of configs) { // request in signals - RestAPI.get(this.makeURL('/signals?direction=in&configID=' + config.id), token).then(response => { - AppDispatcher.dispatch({ - type: 'signals/loaded', - data: response.signals - }); + AppDispatcher.dispatch({ + type: 'signals/start-load', + token: token, + param: '?direction=in&configID=' + config.id, }); // request out signals - RestAPI.get(this.makeURL('/signals?direction=out&configID=' + config.id), token).then(response => { - AppDispatcher.dispatch({ - type: 'signals/loaded', - data: response.signals - }); + AppDispatcher.dispatch({ + type: 'signals/start-load', + token: token, + param: '?direction=out&configID=' + config.id, }); - } + } loadFiles(token, configs){ diff --git a/src/dashboard/dashboard-store.js b/src/dashboard/dashboard-store.js index 23b28d6..5219135 100644 --- a/src/dashboard/dashboard-store.js +++ b/src/dashboard/dashboard-store.js @@ -24,6 +24,7 @@ class DashboardStore extends ArrayStore { } reduce(state, action) { + switch (action.type) { case 'dashboards/start-add': diff --git a/src/dashboard/dashboards-data-manager.js b/src/dashboard/dashboards-data-manager.js index b35c58d..94c847f 100644 --- a/src/dashboard/dashboards-data-manager.js +++ b/src/dashboard/dashboards-data-manager.js @@ -16,5 +16,30 @@ ******************************************************************************/ import RestDataManager from '../common/data-managers/rest-data-manager'; +import AppDispatcher from "../common/app-dispatcher"; -export default new RestDataManager('dashboard', '/dashboards'); +class DashboardsDataManager extends RestDataManager{ + constructor() { + super('dashboard', '/dashboards'); + this.onLoad = this.onDashboardsLoad + } + + onDashboardsLoad(data, token){ + + if (!Array.isArray(data)) { + data = [data]; + } + + console.log("onDashboardsLoad"); + for (let dashboard of data){ + AppDispatcher.dispatch({ + type: 'widgets/start-load', + token: token, + param: '?dashboardID=' + dashboard.id + }); + } + } + +} + +export default new DashboardsDataManager(); diff --git a/src/scenario/import-scenario.js b/src/scenario/import-scenario.js index 90c33be..a6b9a23 100644 --- a/src/scenario/import-scenario.js +++ b/src/scenario/import-scenario.js @@ -52,15 +52,6 @@ class ImportScenarioDialog extends React.Component { } handleChange(e, index) { - /*if (e.target.id === 'icID') { - const configs = this.state.configs; - configs[index].icID = JSON.parse(e.target.value); - - this.setState({ configs: configs }); - - return; - }*/ - this.setState({ [e.target.id]: e.target.value }); // check all controls diff --git a/src/scenario/scenario-store.js b/src/scenario/scenario-store.js index 6043b68..15a14f3 100644 --- a/src/scenario/scenario-store.js +++ b/src/scenario/scenario-store.js @@ -26,6 +26,7 @@ class ScenarioStore extends ArrayStore{ reduce(state, action) { switch (action.type) { + case 'scenarios/start-add': // Check if this is a recursive scenario import or not diff --git a/src/scenario/scenarios-data-manager.js b/src/scenario/scenarios-data-manager.js index ec4a442..a59d9a4 100644 --- a/src/scenario/scenarios-data-manager.js +++ b/src/scenario/scenarios-data-manager.js @@ -16,41 +16,36 @@ ******************************************************************************/ import RestDataManager from '../common/data-managers/rest-data-manager'; -import RestAPI from "../common/api/rest-api"; import AppDispatcher from "../common/app-dispatcher"; class ScenariosDataManager extends RestDataManager { constructor() { super('scenario', '/scenarios'); + + this.onLoad = this.onScenariosLoad } - getComponentConfigs(token, id) { - RestAPI.get(this.makeURL('/scenarios/' + id + '/configs'), token).then(response => { - AppDispatcher.dispatch({ - type: 'scenarios/configs', - configs: response.configs - }); - }).catch(error => { - AppDispatcher.dispatch({ - type: 'scenarios/configs-error', - error: error - }); - }); - } + onScenariosLoad(data, token){ - getDashboards(token, id) { - RestAPI.get(this.makeURL('/scenarios/' + id + '/dashboards'), token).then(response => { - AppDispatcher.dispatch({ - type: 'scenarios/dashboards', - dashboards: response.dashboards - }); - }).catch(error => { - AppDispatcher.dispatch({ - type: 'scenarios/dashboards-error', - error: error - }); - }); - } + if (!Array.isArray(data)) { + data = [data]; + } + for (let scenario of data){ + AppDispatcher.dispatch({ + type: 'configs/start-load', + token: token, + param: '?scenarioID=' + scenario.id + }); + + AppDispatcher.dispatch({ + type: 'dashboards/start-load', + token: token, + param: '?scenarioID=' + scenario.id + }); + + // TODO add dispatch for files + } + } } export default new ScenariosDataManager(); diff --git a/src/scenario/scenarios.js b/src/scenario/scenarios.js index 19688bc..84fc34c 100644 --- a/src/scenario/scenarios.js +++ b/src/scenario/scenarios.js @@ -26,6 +26,7 @@ import LoginStore from '../user/login-store'; import DashboardStore from '../dashboard/dashboard-store'; import WidgetStore from "../widget/widget-store"; import ConfigStore from '../componentconfig/config-store'; +import SignalStore from '../signal/signal-store' import Icon from '../common/icon'; import Table from '../common/table'; @@ -40,21 +41,16 @@ import DeleteDialog from '../common/dialogs/delete-dialog'; class Scenarios extends Component { static getStores() { - return [ScenarioStore, LoginStore, DashboardStore, WidgetStore, ConfigStore]; + return [ScenarioStore, LoginStore, DashboardStore, WidgetStore, ConfigStore, SignalStore]; } static calculateState() { - const scenarios = ScenarioStore.getState(); - const sessionToken = LoginStore.getState().token; - - let dashboards = DashboardStore.getState(); - let configs = ConfigStore.getState(); return { - scenarios, - dashboards, - configs, - sessionToken, + scenarios: ScenarioStore.getState(), + dashboards: DashboardStore.getState(), + configs: ConfigStore.getState(), + sessionToken: LoginStore.getState().token, newModal: false, deleteModal: false, @@ -73,133 +69,20 @@ class Scenarios extends Component { }); } - componentDidUpdate(prevProps, prevState) { - - for (let i = prevState.scenarios.length; i < this.state.scenarios.length; i++) { - AppDispatcher.dispatch({ - type: 'dashboards/start-load', - token: this.state.sessionToken, - param: '?scenarioID=' + this.state.scenarios[i].id - }); - AppDispatcher.dispatch({ - type: 'configs/start-load', - token: this.state.sessionToken, - param: '?scenarioID=' + this.state.scenarios[i].id - }); - } - - // when length of scenarios array has increased, either add data (after import) - // or load data (after export) - /* - if (this.state.scenarios.length > prevState.scenarios.length) { - if (this.addDashboards || this.addConfigs) { - let scenarioID = this.state.scenarios[this.state.scenarios.length - 1].id; - - if (this.addDashboards) { - this.dashboardsToAdd.forEach((dashboard) => { - if (dashboard.widgets) { - this.addWidgets = true; - } - dashboard.scenarioID = scenarioID; - AppDispatcher.dispatch({ - type: 'dashboards/start-add', - token: this.state.sessionToken, - data: dashboard - }); - }) - this.addDashboards = false; - } - - if (this.addConfigs) { - this.configsToAdd.forEach((config) => { - config.scenarioID = scenarioID; - AppDispatcher.dispatch({ - type: 'configs/start-add', - token: this.state.sessionToken, - data: config - }) - }) - delete this.configsToAdd; - this.addConfigs = false; - } - - } - else { - let scenarios = Object.assign([], this.state.scenarios); // copying neccessary? - for (var i = prevState.scenarios.length; i < scenarios.length; i++) { - AppDispatcher.dispatch({ - type: 'dashboards/start-load', - token: this.state.sessionToken, - param: '?scenarioID=' + scenarios[i].id - }); - AppDispatcher.dispatch({ - type: 'configs/start-load', - token: this.state.sessionToken, - param: '?scenarioID=' + scenarios[i].id - }); - } - } - - - } - - - // when length of dashboards array has increased, either add widgets (after import) - // or load widgets (after export) - if (this.state.dashboards.length > prevState.dashboards.length) { - if (this.addWidgets && !this.addDashboards) { // add widget data - let dashboards = Object.assign([], this.state.dashboards); - for (var j = prevState.dashboards.length; j < dashboards.length; j++) { - let dboard = dashboards[j]; - let dboardID = dboard.id; - let dashboard = this.dashboardsToAdd.shift(); - if (dashboard.name !== dboard.name) { - console.log("Cannot add widgets, dashboard was not added as expected!"); - this.addWidgets = false; - return; - } - dashboard.widgets.forEach((widget) => { - widget.dashboardID = dboardID; - AppDispatcher.dispatch({ - type: 'widgets/start-add', - token: this.state.sessionToken, - data: widget - }); - }); - } - - if (this.dashboardsToAdd.length === 0) { - delete this.dashboardsToAdd; - this.addWidgets = false; - } - } - else { // load widget data - let dashboards = Object.assign([], this.state.dashboards); - for (var j = prevState.dashboards.length; j < dashboards.length; j++) { - AppDispatcher.dispatch({ - type: 'widgets/start-load', - token: this.state.sessionToken, - param: '?dashboardID=' + dashboards[j].id - }) - } - } - - } - - - */ - } - - closeNewModal(data) { + if(data) { + AppDispatcher.dispatch({ + type: 'scenarios/start-add', + data: data, + token: this.state.sessionToken, + }); + } this.setState({ newModal: false }); - - // TODO create dispatch here to add scenario to Backend database! } showDeleteModal(id) { // get scenario by id - var deleteScenario; + let deleteScenario; this.state.scenarios.forEach((scenario) => { if (scenario.id === id) { @@ -263,19 +146,6 @@ class Scenarios extends Component { this.setState({ importModal: false }); if (data) { - //let newScenario = JSON.parse(JSON.stringify(data)); - // temporarily store dashboard data until scenario is created - /*if (data.dashboards) { - this.addDashboards = true; - this.dashboardsToAdd = data.dashboards; - } - if (data.configs) { - this.addConfigs = true; - this.configsToAdd = data.configs; - } - delete newScenario.dashboards; - */ - AppDispatcher.dispatch({ type: 'scenarios/start-add', data: data, @@ -304,6 +174,20 @@ class Scenarios extends Component { let jsonObj = scenario; configs.forEach((config) => { + let signals = JSON.parse(JSON.stringify(SignalStore.getState().filter(s => s.configID === parseInt(config.id, 10)))); + signals.forEach((signal) => { + delete signal.configID; + delete signal.id; + }) + + // two separate lists for inputMapping and outputMapping + let inputSignals = signals.filter(s => s.direction === 'in'); + let outputSignals = signals.filter(s => s.direction === 'out'); + + // add signal mappings to config + config["inputMapping"] = inputSignals; + config["outputMapping"] = outputSignals; + delete config.id; delete config.scenarioID; }) From 342ed5d83d6163fb02e49f6720a7f598b3915ae4 Mon Sep 17 00:00:00 2001 From: Sonja Happ Date: Fri, 29 May 2020 10:27:09 +0200 Subject: [PATCH 224/391] Dashboard import export working #216 --- src/dashboard/import-dashboard.js | 44 +++++++++++++------------------ 1 file changed, 19 insertions(+), 25 deletions(-) diff --git a/src/dashboard/import-dashboard.js b/src/dashboard/import-dashboard.js index b44e1f8..47e5216 100644 --- a/src/dashboard/import-dashboard.js +++ b/src/dashboard/import-dashboard.js @@ -67,27 +67,6 @@ class ImportDashboardDialog extends React.Component { // read IC const dashboard = JSON.parse(event.target.result); - /*let defaultIC = ""; - if (self.props.configs != null) { - defaultIC = self.props.configs[0].icID; - } - - dashboard.widgets.forEach(widget => { - switch (widget.type) { - case 'Value': - case 'Plot': - case 'Table': - case 'PlotTable': - case 'Gauge': - break; - - default: - break; - } - }); - - */ - self.imported = true; self.valid = true; self.setState({ name: dashboard.name, widgets: dashboard.widgets, grid: dashboard.grid }); @@ -107,21 +86,36 @@ class ImportDashboardDialog extends React.Component { this.valid = name; // return state to control - if (target === 'name') return name ? "success" : "error"; + if (target === 'name'){ + return name; + } } render() { return ( - this.onClose(c)} onReset={() => this.resetState()} valid={this.valid}> + this.onClose(c)} + onReset={() => this.resetState()} + valid={this.valid}>
    Dashboard File this.loadFile(e.target.files)} /> - + Name - this.handleChange(e)} /> + this.handleChange(e)} + /> From 7241e2c01b9884ebf9c35c91c98403a42de13382 Mon Sep 17 00:00:00 2001 From: Sonja Happ Date: Fri, 29 May 2020 11:33:49 +0200 Subject: [PATCH 225/391] Component Config import and export working #216 --- src/componentconfig/import-config.js | 65 +++++++++----- src/dashboard/dashboards-data-manager.js | 1 - src/scenario/scenario.js | 108 ++++++++--------------- src/scenario/scenarios.js | 2 + src/signal/signals-data-manager.js | 1 - 5 files changed, 83 insertions(+), 94 deletions(-) diff --git a/src/componentconfig/import-config.js b/src/componentconfig/import-config.js index 89c1986..b11a69e 100644 --- a/src/componentconfig/import-config.js +++ b/src/componentconfig/import-config.js @@ -17,18 +17,19 @@ import React from 'react'; import { FormGroup, FormControl, FormLabel } from 'react-bootstrap'; -import _ from 'lodash'; import Dialog from '../common/dialogs/dialog'; class ImportConfigDialog extends React.Component { imported = false; + valid = false; constructor(props) { super(props); this.state = { - config: {} + config: {}, + name: '', }; } @@ -39,12 +40,13 @@ class ImportConfigDialog extends React.Component { return; } - this.props.onClose(this.state.config); + this.props.onClose(this.state); } resetState = () => { this.setState({ - config: {} + config: {}, + name: '' }); this.imported = false; @@ -58,46 +60,65 @@ class ImportConfigDialog extends React.Component { } // create file reader - const reader = new FileReader(); - const self = this; + let reader = new FileReader(); + let self = this; reader.onload = event => { const config = JSON.parse(event.target.result); - config.icID = this.props.ics.length > 0 ? this.props.ics[0]._id : null; - self.imported = true; - - this.setState({ config: config }); + self.valid = true; + this.setState({name: config.name, config: config }); }; reader.readAsText(file); } - handleICChange = event => { - const config = this.state.config; + handleChange(e, index) { + this.setState({ [e.target.id]: e.target.value }); + } - config.icID = event.target.value; + validateForm(target) { + // check all controls + let name = true; - this.setState({ config: config }); + if (this.state.name === '') { + name = false; + } + this.valid = name; + + // return state to control + if (target === 'name'){ + return name; + } } render() { return ( - this.onClose(c)} onReset={this.resetState} valid={this.imported}> + this.onClose(c)} + onReset={() => this.resetState()} + valid={this.valid} >
    Component Configuration File - - Infrastructure Component - - {this.props.ics.map(ic => ( - - ))} - + + Name + this.handleChange(e)} + /> +
    diff --git a/src/dashboard/dashboards-data-manager.js b/src/dashboard/dashboards-data-manager.js index 94c847f..451d3bf 100644 --- a/src/dashboard/dashboards-data-manager.js +++ b/src/dashboard/dashboards-data-manager.js @@ -30,7 +30,6 @@ class DashboardsDataManager extends RestDataManager{ data = [data]; } - console.log("onDashboardsLoad"); for (let dashboard of data){ AppDispatcher.dispatch({ type: 'widgets/start-load', diff --git a/src/scenario/scenario.js b/src/scenario/scenario.js index 005b859..ed20600 100644 --- a/src/scenario/scenario.js +++ b/src/scenario/scenario.js @@ -118,20 +118,6 @@ class Scenario extends React.Component { token: this.state.sessionToken }); - // load component configurations for selected scenario - AppDispatcher.dispatch({ - type: 'configs/start-load', - token: this.state.sessionToken, - param: '?scenarioID='+this.state.scenario.id - }); - - // load dashboards of selected scenario - AppDispatcher.dispatch({ - type: 'dashboards/start-load', - token: this.state.sessionToken, - param: '?scenarioID='+this.state.scenario.id - }); - // load ICs to enable that component configs and dashboards work with them AppDispatcher.dispatch({ type: 'ics/start-load', @@ -139,36 +125,6 @@ class Scenario extends React.Component { }); } - componentDidUpdate(prevProps, prevState) { - if (this.state.dashboards.length > prevState.dashboards.length) { - if (this.addWidgets) { // add widgets - // this can only be true after dashboard import, so there is only one dashboard - // (the newest) and this dashboards ID is used - let dashboardID = this.state.dashboards[this.state.dashboards.length - 1].id; - this.widgetsToAdd.forEach((widget) => { - widget.dashboardID = dashboardID; - AppDispatcher.dispatch({ - type: 'widgets/start-add', - data: widget, - token: this.state.sessionToken, - }) - }) - this.addWidgets = false; - this.widgetsToAdd = []; - } - else { // get widgets - let dashboards = Object.assign([], this.state.dashboards); - for (var i = prevState.dashboards.length; i < this.state.dashboards.length; i++) { - AppDispatcher.dispatch({ - type: 'widgets/start-load', - token: this.state.sessionToken, - param: '?dashboardID=' + dashboards[i].id - }) - } - } - } - } - /* ############################################## * Component Configuration modification methods @@ -223,33 +179,47 @@ class Scenario extends React.Component { }); } - importConfig(config){ + importConfig(data){ this.setState({ importConfigModal: false }); - if (config == null) { + if (data == null) { return; } - config.scenario = this.state.scenario.id; + let newConfig = JSON.parse(JSON.stringify(data.config)) + + newConfig["scenarioID"] = this.state.scenario.id; + newConfig.name = data.name; AppDispatcher.dispatch({ type: 'configs/start-add', - data: config, + data: newConfig, token: this.state.sessionToken }); - - this.setState({ scenario: {} }, () => { - AppDispatcher.dispatch({ - type: 'scenarios/start-load', - data: this.props.match.params.scenario, - token: this.state.sessionToken - }); - }); } exportConfig(index) { // filter properties - const config = Object.assign({}, this.state.configs[index]); + let config = JSON.parse(JSON.stringify(this.state.configs[index])); + + let signals = JSON.parse(JSON.stringify(SignalStore.getState().filter(s => s.configID === parseInt(config.id, 10)))); + signals.forEach((signal) => { + delete signal.configID; + delete signal.id; + }) + + // two separate lists for inputMapping and outputMapping + let inputSignals = signals.filter(s => s.direction === 'in'); + let outputSignals = signals.filter(s => s.direction === 'out'); + + // add signal mappings to config + config["inputMapping"] = inputSignals; + config["outputMapping"] = outputSignals; + + delete config.id; + delete config.scenarioID; + delete config.inputLength; + delete config.outputLength; // show save dialog const blob = new Blob([JSON.stringify(config, null, 2)], { type: 'application/json' }); @@ -356,12 +326,7 @@ class Scenario extends React.Component { if (data) { let newDashboard = JSON.parse(JSON.stringify(data)); newDashboard["scenarioID"] = this.state.scenario.id; - // temporarily store widget data until dashboard is created - if (data.widgets) { - this.addWidgets = true; - this.widgetsToAdd = data.widgets; - } - delete newDashboard.widgets; + AppDispatcher.dispatch({ type: 'dashboards/start-add', data: newDashboard, @@ -372,16 +337,19 @@ class Scenario extends React.Component { exportDashboard(index) { // filter properties - const dashboard = Object.assign({}, this.state.dashboards[index]); + let dashboard = JSON.parse(JSON.stringify(this.state.dashboards[index])); - let widgets = WidgetStore.getState().filter(w => w.dashboardID === parseInt(dashboard.id, 10)); + let widgets = JSON.parse(JSON.stringify(WidgetStore.getState().filter(w => w.dashboardID === parseInt(dashboard.id, 10)))); + widgets.forEach((widget) => { + delete widget.dashboardID; + delete widget.id; + }) + dashboard["widgets"] = widgets; + delete dashboard.scenarioID; + delete dashboard.id; - - var jsonObj = dashboard; - jsonObj["widgets"] = widgets; - // show save dialog - const blob = new Blob([JSON.stringify(jsonObj, null, 2)], { type: 'application/json' }); + const blob = new Blob([JSON.stringify(dashboard, null, 2)], { type: 'application/json' }); FileSaver.saveAs(blob, 'dashboard - ' + dashboard.name + '.json'); } diff --git a/src/scenario/scenarios.js b/src/scenario/scenarios.js index 84fc34c..22711a7 100644 --- a/src/scenario/scenarios.js +++ b/src/scenario/scenarios.js @@ -190,6 +190,8 @@ class Scenarios extends Component { delete config.id; delete config.scenarioID; + delete config.inputLength; + delete config.outputLength; }) jsonObj["configs"] = configs; diff --git a/src/signal/signals-data-manager.js b/src/signal/signals-data-manager.js index 768bc7a..2e6cf98 100644 --- a/src/signal/signals-data-manager.js +++ b/src/signal/signals-data-manager.js @@ -27,7 +27,6 @@ class SignalsDataManager extends RestDataManager{ reloadConfig(token, data){ // request in signals - console.log("Reloading component config due to signal add/remove") RestAPI.get(this.makeURL('/configs/' + data.configID), token).then(response => { AppDispatcher.dispatch({ type: 'configs/edited', From 5e607f77d044f4fec9d98ec24c03dea20b620c46 Mon Sep 17 00:00:00 2001 From: Sonja Happ Date: Fri, 29 May 2020 11:53:29 +0200 Subject: [PATCH 226/391] remove file load from component config --- src/componentconfig/config-store.js | 2 -- src/componentconfig/configs-data-manager.js | 12 ------------ 2 files changed, 14 deletions(-) diff --git a/src/componentconfig/config-store.js b/src/componentconfig/config-store.js index 6a1911e..65f1d7c 100644 --- a/src/componentconfig/config-store.js +++ b/src/componentconfig/config-store.js @@ -28,8 +28,6 @@ class ConfigStore extends ArrayStore { switch (action.type) { case 'configs/loaded': - - ConfigsDataManager.loadFiles(action.token, action.data); return super.reduce(state, action); case 'configs/start-add': diff --git a/src/componentconfig/configs-data-manager.js b/src/componentconfig/configs-data-manager.js index 426c4a6..59f5a66 100644 --- a/src/componentconfig/configs-data-manager.js +++ b/src/componentconfig/configs-data-manager.js @@ -56,18 +56,6 @@ class ConfigDataManager extends RestDataManager { } } - - loadFiles(token, configs){ - for (let config of configs) { - // request files of config - RestAPI.get(this.makeURL('/files?scenarioID' + config.scenarioID), token).then(response => { - AppDispatcher.dispatch({ - type: 'files/loaded', - data: response.files - }); - }); - } - } } export default new ConfigDataManager(); From 86288b39bfbb3937c0fcd5529887998ed82d01c9 Mon Sep 17 00:00:00 2001 From: Sonja Happ Date: Fri, 29 May 2020 12:34:20 +0200 Subject: [PATCH 227/391] removed unused import --- src/componentconfig/configs-data-manager.js | 1 - 1 file changed, 1 deletion(-) diff --git a/src/componentconfig/configs-data-manager.js b/src/componentconfig/configs-data-manager.js index 59f5a66..3fdca3f 100644 --- a/src/componentconfig/configs-data-manager.js +++ b/src/componentconfig/configs-data-manager.js @@ -17,7 +17,6 @@ import RestDataManager from '../common/data-managers/rest-data-manager'; import AppDispatcher from '../common/app-dispatcher'; -import RestAPI from "../common/api/rest-api"; class ConfigDataManager extends RestDataManager { constructor() { From 86af9c8f7fa8580f041fa57f9ed61aef5fe24419 Mon Sep 17 00:00:00 2001 From: Sonja Happ Date: Fri, 29 May 2020 13:26:43 +0200 Subject: [PATCH 228/391] add option for no file selected --- src/file/select-file.js | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/src/file/select-file.js b/src/file/select-file.js index 132caf9..bf7469a 100644 --- a/src/file/select-file.js +++ b/src/file/select-file.js @@ -69,11 +69,15 @@ class SelectFile extends React.Component { render() { - let fileOptions; + let fileOptions = []; if (this.props.files.length > 0){ - fileOptions = this.props.files.map(f => + fileOptions.push( + + ) + + fileOptions.push(this.props.files.map(f => - ); + )); } else { fileOptions = } From 95c735de9ba83d8a0e6850f0c8281ec573c705c6 Mon Sep 17 00:00:00 2001 From: Sonja Happ Date: Fri, 29 May 2020 13:27:04 +0200 Subject: [PATCH 229/391] remove a log comment, fix indentation --- src/dashboard/dashboard.js | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/src/dashboard/dashboard.js b/src/dashboard/dashboard.js index fb00237..489f366 100644 --- a/src/dashboard/dashboard.js +++ b/src/dashboard/dashboard.js @@ -310,13 +310,12 @@ class Dashboard extends Component { startEditing(){ this.state.widgets.forEach( widget => { if(widget.type === 'Slider' || widget.type === 'NumberInput' || widget.type === 'Button'){ - console.log("we should move in here"); - AppDispatcher.dispatch({ - type: 'widgets/start-edit', - token: this.state.sessionToken, - data: widget - }); - } + AppDispatcher.dispatch({ + type: 'widgets/start-edit', + token: this.state.sessionToken, + data: widget + }); + } }); this.setState({ editing: true }); }; From b7ee4bb35c794a82d63c33ad4707e6f1753547ad Mon Sep 17 00:00:00 2001 From: irismarie Date: Sun, 31 May 2020 13:51:43 +0200 Subject: [PATCH 230/391] [WIP] delete user --- src/scenario/scenario-store.js | 4 ++ src/scenario/scenario.js | 51 ++++++++++++++++++++++++-- src/scenario/scenarios-data-manager.js | 7 ++++ 3 files changed, 59 insertions(+), 3 deletions(-) diff --git a/src/scenario/scenario-store.js b/src/scenario/scenario-store.js index 7ca1c17..1f08ffb 100644 --- a/src/scenario/scenario-store.js +++ b/src/scenario/scenario-store.js @@ -29,6 +29,10 @@ class ScenarioStore extends ArrayStore{ ScenariosDataManager.getUsers(token, id); } + deleteUser(token, id, username) { + ScenariosDataManager.deleteUser(token, id, username); + } + reduce(state, action) { switch (action.type) { diff --git a/src/scenario/scenario.js b/src/scenario/scenario.js index 33a1722..2828767 100644 --- a/src/scenario/scenario.js +++ b/src/scenario/scenario.js @@ -17,7 +17,7 @@ import React from 'react'; import { Container } from 'flux/utils'; -import { Button } from 'react-bootstrap'; +import { Button, DropdownButton, Dropdown } from 'react-bootstrap'; import FileSaver from 'file-saver'; import ScenarioStore from './scenario-store'; @@ -42,12 +42,14 @@ import EditConfigDialog from "../componentconfig/edit-config"; import EditSignalMapping from "../signal/edit-signal-mapping"; import FileStore from "../file/file-store" import WidgetStore from "../widget/widget-store"; +import UsersStore from '../user/users-store'; + class Scenario extends React.Component { static getStores() { - return [ ScenarioStore, ConfigStore, DashboardStore, ICStore, LoginStore, SignalStore, FileStore, WidgetStore]; + return [ ScenarioStore, ConfigStore, DashboardStore, ICStore, LoginStore, SignalStore, FileStore, WidgetStore, UsersStore]; } static calculateState(prevState, props) { @@ -64,6 +66,12 @@ class Scenario extends React.Component { } let users = LoginStore.getState().scenarioUsers; + let allUsers = UsersStore.getState(); + let allUserNames = []; + allUsers.forEach((user) => { + allUserNames.push(user.username); + }); + // obtain all dashboards of a scenario let dashboards = DashboardStore.getState().filter(dashb => dashb.scenarioID === parseInt(props.match.params.scenario, 10)); @@ -80,6 +88,8 @@ class Scenario extends React.Component { return { scenario, users, + allUsers, + allUserNames, sessionToken, configs, dashboards, @@ -101,6 +111,9 @@ class Scenario extends React.Component { deleteDashboardModal: false, importDashboardModal: false, modalDashboardData: {}, + + addUserModal: false, + deleteUserName: '', } } @@ -119,8 +132,22 @@ class Scenario extends React.Component { type: 'ics/start-load', token: this.state.sessionToken }); + + // load users + AppDispatcher.dispatch({ + type: 'users/start-load', + token: this.state.sessionToken + }); } + // add User to Scenario + addUser() { + + } + + closeDeleteUserModal() { + ScenarioStore.deleteUser(this.state.sessionToken, this.state.scenario.id, this.state.deleteUserName); + } /* ############################################## * Component Configuration modification methods @@ -418,6 +445,8 @@ class Scenario extends React.Component { return

    {this.state.scenario.name}

    + + {/*Scenario Users table*/}

    Users

    @@ -426,10 +455,26 @@ class Scenario extends React.Component { title='' width='200' deleteButton - onDelete={(index) => this.setState({ deleteUserModal: true, modalUserData: this.state.users[index], modalUserIndex: index })} + onDelete={(index) => this.setState({ deleteUserModal: true, deleteUserName: this.state.users[index].username, modalUserIndex: index })} />
    +
    + this.addUser()} + // style={buttonStyle}> User + > + {this.state.allUserNames.map((opt,i) => ( + + {opt} + + ))} + +
    + + this.closeDeleteUserModal(c)} /> + {/*Component Configurations table*/}

    Component Configurations

    diff --git a/src/scenario/scenarios-data-manager.js b/src/scenario/scenarios-data-manager.js index 756816a..9854901 100644 --- a/src/scenario/scenarios-data-manager.js +++ b/src/scenario/scenarios-data-manager.js @@ -41,6 +41,13 @@ class ScenariosDataManager extends RestDataManager { }) } + deleteUser(token, id, username) { + RestAPI.delete(this.requestURL('remove/update', 'user', 'username='+username), token).then(response => { + + }) + //super.remove(user, token, "scenarioID="+id); + } + onScenariosLoad(data, token){ if (!Array.isArray(data)) { From e3e096248437a5afebd0e41c2dbe292a3bb1436b Mon Sep 17 00:00:00 2001 From: Sonja Happ Date: Tue, 2 Jun 2020 14:51:38 +0200 Subject: [PATCH 231/391] lamp widget able to use output signals, switching of color works #218 --- src/widget/widgets/lamp.js | 22 ++++++++++++---------- 1 file changed, 12 insertions(+), 10 deletions(-) diff --git a/src/widget/widgets/lamp.js b/src/widget/widgets/lamp.js index 7a89c04..939caed 100644 --- a/src/widget/widgets/lamp.js +++ b/src/widget/widgets/lamp.js @@ -25,7 +25,6 @@ class WidgetLamp extends Component { this.state = { value: '', - threshold: 0 }; } @@ -34,28 +33,31 @@ class WidgetLamp extends Component { return{ value: ''}; } - const ic = props.icIDs[0]; + // get the signal with the selected signal ID let signalID = props.widget.signalIDs[0]; - let widgetSignal = props.signals.find(sig => sig.id === signalID); + let signal = props.signals.filter(s => s.id === signalID) + // determine ID of infrastructure component related to signal[0] (there is only one signal for a lamp widget) + let icID = props.icIDs[signal[0].id]; - // update value + // check if data available if (props.data == null - || props.data[ic] == null - || props.data[ic].output == null - || props.data[ic].output.values == null) { + || props.data[icID] == null + || props.data[icID].output == null + || props.data[icID].output.values == null) { return{value:''}; } // check if value has changed - const signalData = props.data[ic].output.values[widgetSignal.index]; - if (signalData != null && state.value !== signalData[signalData.length - 1].y) { - return { value: signalData[signalData.length - 1].y }; + const data = props.data[icID].output.values[signal[0].index-1]; + if (data != null && Number(state.value) !== data[data.length - 1].y) { + return { value: data[data.length - 1].y }; } return null; } render() { + let colors = EditWidgetColorControl.ColorPalette; let color; From 39790b530ef545a995d8d89e0295970711112fa2 Mon Sep 17 00:00:00 2001 From: Sonja Happ Date: Tue, 2 Jun 2020 15:04:05 +0200 Subject: [PATCH 232/391] value widget displays output signal value #218 --- src/widget/widgets/value.js | 27 ++++++++++++--------------- 1 file changed, 12 insertions(+), 15 deletions(-) diff --git a/src/widget/widgets/value.js b/src/widget/widgets/value.js index f143cd0..0468b3e 100644 --- a/src/widget/widgets/value.js +++ b/src/widget/widgets/value.js @@ -33,31 +33,28 @@ class WidgetValue extends Component { return null; } - // TODO does the following line make sense? - const ICid = props.icIDs[0]; + // get the signal with the selected signal ID let signalID = props.widget.signalIDs[0]; - let signal = props.signals.find(sig => sig.id === signalID); + let signal = props.signals.filter(s => s.id === signalID) + // determine ID of infrastructure component related to signal[0] (there is only one signal for a value widget) + let icID = props.icIDs[signal[0].id]; - - // update value - let value = ''; - if (props.data == null - || props.data[ICid] == null - || props.data[ICid].output == null - || props.data[ICid].output.values == null) { + // check if data available + let value = '' + if (props.data == null || props.data[icID] == null || props.data[icID].output == null || props.data[icID].output.values == null) { value = ''; } else { // check if value has changed - const signalData = props.data[ICid].output.values[signal.index]; - if (signalData != null && state.value !== signalData[signalData.length - 1].y) { - value = signalData[signalData.length - 1].y + const data = props.data[icID].output.values[signal[0].index - 1]; + if (data != null && Number(state.value) !== data[data.length - 1].y) { + value = data[data.length - 1].y; } } // Update unit (assuming there is exactly one signal for this widget) let unit = ''; if(signal !== undefined){ - unit = signal.unit; + unit = signal[0].unit; } return { @@ -77,7 +74,7 @@ class WidgetValue extends Component { {Number.isNaN(value_to_render) ? NaN : format('.3s')(value_to_render)} {this.props.widget.customProperties.showUnit && [{this.state.unit}] - } + } ); } From 11d3f11e2fd0fad4286d5fdbb65f572d086fde27 Mon Sep 17 00:00:00 2001 From: Sonja Happ Date: Tue, 2 Jun 2020 15:17:59 +0200 Subject: [PATCH 233/391] Table widget displays output signal values and units #218 --- src/widget/widgets/table.js | 91 +++++++++++++++---------------------- 1 file changed, 37 insertions(+), 54 deletions(-) diff --git a/src/widget/widgets/table.js b/src/widget/widgets/table.js index 54383a8..089eec0 100644 --- a/src/widget/widgets/table.js +++ b/src/widget/widgets/table.js @@ -27,72 +27,55 @@ class WidgetTable extends Component { this.state = { rows: [], - sequence: null, - showUnit: false }; } - static getDerivedStateFromProps(props, state){ - if(props.widget.signalIDs.length === 0){ - return{ - rows: [], - sequence: null, - }; - } + let rows = []; + let signalID, sig; + for (signalID of props.widget.signalIDs) { + for (sig of props.signals) { + if (signalID === sig.id) { + // sig is a selected signal, get data + // determine ID of infrastructure component related to signal (via config) + let icID = props.icIDs[sig.id] + // distinguish between input and output signals + if (sig.direction === "out") { + if (props.data[icID] != null && props.data[icID].output != null && props.data[icID].output.values != null) { + if (props.data[icID].output.values[sig.index-1] !== undefined) { + let data = props.data[icID].output.values[sig.index-1]; + rows.push({ + name: sig.name, + unit: sig.unit, + value: data[data.length - 1].y + }); - const ICid = props.icIDs[0]; - let widgetSignals = props.signals.find(sig => { - for (let id of props.widget.signalIDs){ - if (id === sig.id){ - return true; - } - } - return false; - }); + } + } + } else if (sig.direction === "in") { + if (props.data[icID] != null && props.data[icID].input != null && props.data[icID].input.values != null) { + if (props.data[icID].input.values[sig.index-1] !== undefined) { + let data = props.data[icID].input.values[sig.index-1]; + rows.push({ + name: sig.name, + unit: sig.unit, + value: data[data.length - 1].y + }); + } + } + } + } // sig is selected signal + } // loop over props.signals + } // loop over selected signals - // check data - if (props.data == null - || props.data[ICid] == null - || props.data[ICid].output == null - || props.data[ICid].output.values.length === 0 - || props.data[ICid].output.values[0].length === 0) { + return {rows: rows} - // clear values - return{ - rows: [], - sequence: null, - showUnit: false, - }; - } - - // get rows - const rows = []; - - props.data[ICid].output.values.forEach((signal, index) => { - let s = widgetSignals.find( sig => sig.index === index); - // if the signal is used by the widget - if (s !== undefined) { - // push data of the signal - rows.push({ - name: s.name, - unit: s.unit, - value: signal[signal.length - 1].y - }); - } - }); - - return { - showUnit: props.showUnit, - rows: rows, - sequence: props.data[ICid].output.sequence - }; } render() { - + let rows = this.state.rows; if(rows.length === 0){ From ce26514758be550df4096480de1efc1333096ff7 Mon Sep 17 00:00:00 2001 From: Sonja Happ Date: Tue, 2 Jun 2020 17:16:13 +0200 Subject: [PATCH 234/391] Button widget toggles input signal #218 --- src/ic/ic-data-store.js | 2 +- src/widget/widget.js | 23 +++++++++++++++++++---- 2 files changed, 20 insertions(+), 5 deletions(-) diff --git a/src/ic/ic-data-store.js b/src/ic/ic-data-store.js index 6de8669..bca9a95 100644 --- a/src/ic/ic-data-store.js +++ b/src/ic/ic-data-store.js @@ -109,7 +109,7 @@ class ICDataStore extends ReduceStore { // update message properties state[action.ic].input.timestamp = Date.now(); state[action.ic].input.sequence++; - state[action.ic].input.values[action.signal] = action.data; + state[action.ic].input.values[action.signal-1] = action.data; ICDataDataManager.send(state[action.ic].input, action.ic); diff --git a/src/widget/widget.js b/src/widget/widget.js index a2eb294..c611d52 100644 --- a/src/widget/widget.js +++ b/src/widget/widget.js @@ -72,8 +72,12 @@ class Widget extends React.Component { for (let id of props.data.signalIDs){ let signal = signals.find(s => s.id === id); - let config = configs.find(m => m.id === signal.configID); - icIDs[signal.id] = config.icID; + if (signal !== undefined) { + let config = configs.find(m => m.id === signal.configID); + if (config !== undefined){ + icIDs[signal.id] = config.icID; + } + } } return { @@ -90,10 +94,21 @@ class Widget extends React.Component { inputDataChanged(widget, data) { // The following assumes that a widget modifies/ uses exactly one signal + + // get the signal with the selected signal ID + let signalID = widget.signalIDs[0]; + let signal = this.state.signals.filter(s => s.id === signalID) + if (signal.length === 0){ + console.warn("Unable to send signal for signal ID", signalID, ". Signal not found."); + return; + } + // determine ID of infrastructure component related to signal[0] + // Remark: there is only one selected signal for an input type widget + let icID = this.state.icIDs[signal[0].id]; AppDispatcher.dispatch({ type: 'icData/inputChanged', - ic: this.state.icIDs[0], - signal: this.state.signals[0].index, + ic: icID, + signal: signal[0].index, data }); } From 0bed9b3b73c52e95083ba5cd82f5fa05b1ce1530 Mon Sep 17 00:00:00 2001 From: Laura Fuentes Grau Date: Wed, 3 Jun 2020 00:13:25 +0200 Subject: [PATCH 235/391] wip: create edit files option --- src/dashboard/dashboard-button-group.js | 7 + src/dashboard/dashboard.js | 69 ++++++++ src/file/edit-files.js | 201 ++++++++++++++++++++++++ 3 files changed, 277 insertions(+) create mode 100644 src/file/edit-files.js diff --git a/src/dashboard/dashboard-button-group.js b/src/dashboard/dashboard-button-group.js index 9fda299..8baeece 100644 --- a/src/dashboard/dashboard-button-group.js +++ b/src/dashboard/dashboard-button-group.js @@ -65,11 +65,18 @@ class DashboardButtonGroup extends React.Component { ); } + buttons.push( + + ); + buttons.push( ); + } return
    diff --git a/src/dashboard/dashboard.js b/src/dashboard/dashboard.js index 489f366..2ced5ef 100644 --- a/src/dashboard/dashboard.js +++ b/src/dashboard/dashboard.js @@ -22,6 +22,7 @@ import classNames from 'classnames'; import Widget from '../widget/widget'; import EditWidget from '../widget/edit-widget/edit-widget'; +import EditFiles from '../file/edit-files' import WidgetContextMenu from '../widget/widget-context-menu'; import WidgetToolbox from '../widget/widget-toolbox'; import WidgetArea from '../widget/widget-area'; @@ -121,6 +122,8 @@ class Dashboard extends Component { paused: prevState.paused || false, editModal: false, + filesEditModal: false, + filesEditSaveState: prevState.filesEditSaveState || [], modalData: null, modalIndex: null, widgetChangeData: [], @@ -262,6 +265,63 @@ class Dashboard extends Component { this.setState({ editModal: true, modalData: widget, modalIndex: index }); }; + startEditFiles(){ + let tempFiles = []; + this.state.files.forEach( file => { + tempFiles.push({ + id: file.id, + name: file.name + }); + }) + this.setState({filesEditModal: true, filesEditSaveState: tempFiles}); + } + + closeEditFiles(files,deleteData,addData){ + + if(files || deleteData || addData){ + + if(addData.length > 0){ + let formData = new FormData(); + addData.forEach( file => { + delete file.id; + formData.append("file", file); + }); + AppDispatcher.dispatch({ + type: 'files/start-upload', + data: formData, + token: this.state.sessionToken, + scenarioID: this.state.dashboard.scenarioID, + }); + } + + if(deleteData.length > 0){ + deleteData.forEach( file => { + AppDispatcher.dispatch({ + type: 'files/start-remove', + data: file, + token: this.state.sessionToken + }); + }); + } + } + let formData = new FormData(); + files.forEach( file => { + if(file.type === "application/octet-stream"){ + let originalFile = this.state.filesEditSaveState.find(element => parseInt(element.id,10) === parseInt(file.id,10)); + if(originalFile.name !== file.name){ + formData.append("file", file); + AppDispatcher.dispatch({ + type: 'files/start-edit', + token: this.state.sessionToken, + data: formData + }); + } + } + }) + + this.setState({ filesEditModal: false, filesEditSaveState: [] }); + } + uploadFile(data,widget){ AppDispatcher.dispatch({ type: 'files/start-upload', @@ -416,6 +476,7 @@ class Dashboard extends Component { onFullscreen={this.props.toggleFullscreen} onPause={this.pauseData.bind(this)} onUnpause={this.unpauseData.bind(this)} + onEditFiles = {this.startEditFiles.bind(this)} />
    @@ -473,6 +534,14 @@ class Dashboard extends Component { files={this.state.files} /> + + ; diff --git a/src/file/edit-files.js b/src/file/edit-files.js new file mode 100644 index 0000000..341c5cd --- /dev/null +++ b/src/file/edit-files.js @@ -0,0 +1,201 @@ +/** + * This file is part of VILLASweb. + * + * VILLASweb is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * VILLASweb is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with VILLASweb. If not, see . + ******************************************************************************/ + +import React from 'react'; +import {FormGroup, FormControl, FormLabel, Button} from 'react-bootstrap'; + + +import Dialog from '../common/dialogs/dialog'; + + +class EditFilesDialog extends React.Component { + valid = true; + + + constructor(props) { + super(props); + + this.state = { + files: [], + selectedFile: {}, + deleteData: [], + addData: [], + addFile: {} + }; + } + + static getDerivedStateFromProps(props, state){ + return { + files: props.files + }; + } + + + + onClose(canceled) { + if (canceled === false) { + if (this.validChanges()) { + this.props.onClose(this.state.files,this.state.deleteData,this.state.addData); + } + } else { + this.props.onClose(); + } + } +//can you add file to state array? + addFile(){ + let addFile = this.state.addFile[0]; + addFile.id = this.state.files[this.state.files.length -1 ].id +1; + let tempFiles = this.state.files; + tempFiles.push(addFile); + this.setState({files: tempFiles}); + + let tempAddFiles = this.state.addData; + tempAddFiles.push(addFile); + this.setState({addData: tempAddFiles}); + + this.setState({addFile: {}}); + + } + + deleteFile(){ + let tempFiles = this.state.files; + let changeId = false; + for (let i = 0; i < tempFiles.length; i++) { + if(changeId){ + tempFiles[i-1] = tempFiles[i]; + } + else if(tempFiles[i].id === this.state.selectedFile.id){ + changeId = true; + } + } + tempFiles.pop(); + this.setState({files: tempFiles}); + + if(this.state.selectedFile.type !== "application/octet-stream"){ + let tempAddFiles = this.state.addData; + let changePosition = false; + for (let i = 0; i < tempAddFiles.length; i++) { + if(changePosition){ + tempAddFiles[i-1] = tempAddFiles[i]; + } + else if(tempAddFiles[i].id === this.state.selectedFile.id){ + changePosition = true; + } + } + tempAddFiles.pop(); + this.setState({addData: tempAddFiles}); + } + else{ + let tempDeleteFiles = this.state.deleteData; + tempDeleteFiles.push(this.state.selectedFile); + this.setState({deleteData: tempDeleteFiles}); + } + + + } + + + handleChange(e) { + + if(e.target.id === "selectedFile"){ + let tempFile = this.state.files.find(element => element.id === parseInt(e.target.value, 10)); + + this.setState({ [e.target.id]: tempFile }); + } + else if(e.target.id === "name"){ + if(this.state.selectedFile.type === "application/octet-stream"){ + + let tempFile = this.state.selectedFile; + tempFile.name = e.target.value; + this.setState({selectedFile: tempFile}); + let tempFileList = this.state.files; + tempFileList[tempFile.id - 1] = tempFile; + this.setState({files: tempFileList}); + } + else { + const newFile = new File([this.state.selectedFile], e.target.value , {type: this.state.selectedFile.type}); + this.setState({selectedFile: newFile}); + let tempFileList = this.state.files; + newFile.id = this.state.selectedFile.id; + tempFileList[newFile.id - 1] = newFile; + this.setState({files: tempFileList}); + + let tempAddFiles = this.state.addData; + for (let i = 0; i < tempAddFiles.length; i++) { + if(tempAddFiles[i].id === newFile.id){ + tempAddFiles[i] = newFile; + } + } + this.setState({addData: tempAddFiles}); + + } + + } + + + } + + validChanges() { + return true; + } + + render() { + + let fileOptions = []; + if (this.state.files.length > 0){ + fileOptions.push( + + ) + fileOptions.push(this.state.files.map((file, index) => ( + + ))) + } else { + fileOptions = + } + + return ( + this.onClose(c)} valid={true}> +
    + + Image + this.handleChange(e)}>{fileOptions} + + + + {"File Name"} + this.handleChange(e)} /> + + + + + + + Upload + this.setState({ addFile: e.target.files })} /> + + + +
    +
    + ); + } +} + +export default EditFilesDialog; From 0fe5bdcc58b1fc072f29b0b1315f6d2e4c9e94bd Mon Sep 17 00:00:00 2001 From: irismarie Date: Wed, 3 Jun 2020 10:38:43 +0200 Subject: [PATCH 236/391] add/remove user to/from scenario (only admin) --- src/scenario/scenario-store.js | 54 +++++++++++++++++++++++++- src/scenario/scenario.js | 15 ++++--- src/scenario/scenarios-data-manager.js | 42 ++++++++++++++++---- 3 files changed, 97 insertions(+), 14 deletions(-) diff --git a/src/scenario/scenario-store.js b/src/scenario/scenario-store.js index 1f08ffb..9cfc16b 100644 --- a/src/scenario/scenario-store.js +++ b/src/scenario/scenario-store.js @@ -25,14 +25,59 @@ class ScenarioStore extends ArrayStore{ super('scenarios', ScenariosDataManager); } + // calls to VILLASweb backend getUsers(token, id) { ScenariosDataManager.getUsers(token, id); } + addUser(token, id, username) { + ScenariosDataManager.addUser(token, id, username); + } + deleteUser(token, id, username) { ScenariosDataManager.deleteUser(token, id, username); } + /* store functions, called when calls to backend have returned */ + // save users after they are loaded ('getUsers' call) + saveUsers(state, action) { + let scenarioID = action.scenarioID; + state.forEach((element, index, array) => { + if (element.id === scenarioID) { + array[index]["users"] = action.users; + this.__emitChange(); + return state; + } + }) + } + + // save new user after it was added to scenario ('addUser' call) + saveUser(state, action) { + let scenarioID = action.scenarioID; + state.forEach((element, index, array) => { + if (element.id === scenarioID) { + array[index]["users"].push(action.user); + this.__emitChange(); + return state; + } + }) + } + + // remove user from ScenarioStore + removeUser(state, action) { + let scenarioID = action.scenarioID; + state.forEach((element, index, array) => { + if (element.id === scenarioID) { + const userindex = array[index]["users"].indexOf(action.user); + if (index > -1) { + array[index]["users"].splice(userindex, 1); + } + this.__emitChange(); + return state; + } + }) + } + reduce(state, action) { switch (action.type) { @@ -66,7 +111,14 @@ class ScenarioStore extends ArrayStore{ return super.reduce(state, action); } -// case 'scenarios/users/start-load': + case 'scenarios/users': + return this.saveUsers(state, action); + + case 'scenarios/user-added': + return this.saveUser(state, action); + + case 'scenarios/user-deleted': + return this.removeUser(state, action); default: return super.reduce(state, action); diff --git a/src/scenario/scenario.js b/src/scenario/scenario.js index 2828767..706b0c2 100644 --- a/src/scenario/scenario.js +++ b/src/scenario/scenario.js @@ -56,6 +56,7 @@ class Scenario extends React.Component { // get selected scenario const sessionToken = LoginStore.getState().token; + let users = null; const scenario = ScenarioStore.getState().find(s => s.id === parseInt(props.match.params.scenario, 10)); if (scenario == null) { AppDispatcher.dispatch({ @@ -64,8 +65,10 @@ class Scenario extends React.Component { token: sessionToken }); } + else { + users = scenario.users; + } - let users = LoginStore.getState().scenarioUsers; let allUsers = UsersStore.getState(); let allUserNames = []; allUsers.forEach((user) => { @@ -114,6 +117,7 @@ class Scenario extends React.Component { addUserModal: false, deleteUserName: '', + deleteUserModal: false, } } @@ -141,11 +145,13 @@ class Scenario extends React.Component { } // add User to Scenario - addUser() { - + addUser(userindex) { + let username = this.state.allUserNames[userindex]; + ScenarioStore.addUser(this.state.sessionToken, this.state.scenario.id, username); } closeDeleteUserModal() { + this.setState({deleteUserModal: false}); ScenarioStore.deleteUser(this.state.sessionToken, this.state.scenario.id, this.state.deleteUserName); } @@ -462,8 +468,7 @@ class Scenario extends React.Component {
    this.addUser()} - // style={buttonStyle}> User + onSelect={(index) => this.addUser(index)} > {this.state.allUserNames.map((opt,i) => ( diff --git a/src/scenario/scenarios-data-manager.js b/src/scenario/scenarios-data-manager.js index 9854901..bfa3422 100644 --- a/src/scenario/scenarios-data-manager.js +++ b/src/scenario/scenarios-data-manager.js @@ -24,14 +24,31 @@ class ScenariosDataManager extends RestDataManager { constructor() { super('scenario', '/scenarios'); - this.onLoad = this.onScenariosLoad + this.onLoad = this.onScenariosLoad } getUsers(token, id) { RestAPI.get(this.makeURL('/scenarios/' + id + '/users/'), token).then(response => { AppDispatcher.dispatch({ type: 'scenarios/users', - users: response.users + users: response.users, + scenarioID: id + }); + }).catch(error => { + AppDispatcher.dispatch({ + type: 'scenarios/users-error', + error: error + }) + }) + } + + addUser(token, id, username) { + let path = id + '/user'; + RestAPI.put(this.requestURL('load/add', path, '?username=' + username), null, token).then(response => { + AppDispatcher.dispatch({ + type: 'scenarios/user-added', + user: response.user, + scenarioID: id }); }).catch(error => { AppDispatcher.dispatch({ @@ -42,19 +59,28 @@ class ScenariosDataManager extends RestDataManager { } deleteUser(token, id, username) { - RestAPI.delete(this.requestURL('remove/update', 'user', 'username='+username), token).then(response => { - + let path = id + '/user'; + RestAPI.delete(this.makeURL(this.url + '/' + path + '?username=' + username), token).then(response => { + AppDispatcher.dispatch({ + type: 'scenarios/user-deleted', + user: response.user, + scenarioID: id + }); + }).catch(error => { + AppDispatcher.dispatch({ + type: 'scenarios/users-error', + error: error + }) }) - //super.remove(user, token, "scenarioID="+id); } - onScenariosLoad(data, token){ + onScenariosLoad(data, token) { if (!Array.isArray(data)) { data = [data]; } - for (let scenario of data){ + for (let scenario of data) { AppDispatcher.dispatch({ type: 'configs/start-load', token: token, @@ -70,7 +96,7 @@ class ScenariosDataManager extends RestDataManager { AppDispatcher.dispatch({ type: 'files/start-load', token: token, - param: '?scenarioID='+scenario.id, + param: '?scenarioID=' + scenario.id, }); } } From a5a7d2cf9713cd375880949f6c9d33dc34c69272 Mon Sep 17 00:00:00 2001 From: Sonja Happ Date: Wed, 3 Jun 2020 14:34:26 +0200 Subject: [PATCH 237/391] Input widgets (slider, button, number input) are working with input signals; button only reacts to left click #218 --- src/widget/widget.js | 125 +++++++++++++++++++++++++++++------ src/widget/widgets/button.js | 29 +++++--- src/widget/widgets/input.js | 65 +++++++++--------- src/widget/widgets/slider.js | 57 +++++++--------- 4 files changed, 182 insertions(+), 94 deletions(-) diff --git a/src/widget/widget.js b/src/widget/widget.js index c611d52..809c65a 100644 --- a/src/widget/widget.js +++ b/src/widget/widget.js @@ -85,14 +85,24 @@ class Widget extends React.Component { signals: signals, icIDs: icIDs, files: FileStore.getState(), - - sequence: prevState != null ? prevState.sequence + 1 : 0, - sessionToken: LoginStore.getState().token }; } - inputDataChanged(widget, data) { + inputDataChanged(widget, data, controlID) { + // controlID is the path to the widget customProperty that is changed (for example 'value') + + // modify the widget customProperty + if (controlID !== '') { + let updatedWidget = JSON.parse(JSON.stringify(widget)); + updatedWidget.customProperties[controlID] = data; + AppDispatcher.dispatch({ + type: 'widgets/start-edit', + token: this.state.sessionToken, + data: updatedWidget + }); + } + // The following assumes that a widget modifies/ uses exactly one signal // get the signal with the selected signal ID @@ -116,37 +126,112 @@ class Widget extends React.Component { createWidget(widget) { if (widget.type === 'CustomAction') { - return + return } else if (widget.type === 'Action') { - return + return } else if (widget.type === 'Lamp') { - return + return } else if (widget.type === 'Value') { - return + return } else if (widget.type === 'Plot') { - return + return } else if (widget.type === 'Table') { - return + return } else if (widget.type === 'Label') { - return + return } else if (widget.type === 'PlotTable') { - return this.props.onWidgetStatusChange(w, this.props.index)} paused={this.props.paused} /> + return this.props.onWidgetStatusChange(w, this.props.index)} + paused={this.props.paused} + /> } else if (widget.type === 'Image') { - return + return } else if (widget.type === 'Button') { - return this.inputDataChanged(widget, value)} signals={this.state.signals} /> + return this.inputDataChanged(widget, value, controlID)} + signals={this.state.signals} + /> } else if (widget.type === 'NumberInput') { - return this.inputDataChanged(widget, value)} signals={this.state.signals} /> + return this.inputDataChanged(widget, value, controlID)} + signals={this.state.signals} + /> } else if (widget.type === 'Slider') { - return this.props.onWidgetStatusChange(w, this.props.index) } onInputChanged={value => this.inputDataChanged(widget, value)} signals={this.state.signals}/> + return this.props.onWidgetStatusChange(w, this.props.index) } + onInputChanged={(value, controlID) => this.inputDataChanged(widget, value, controlID)} + signals={this.state.signals} + /> } else if (widget.type === 'Gauge') { - return + return } else if (widget.type === 'Box') { - return + return } else if (widget.type === 'HTML') { - return + return } else if (widget.type === 'Topology') { - return + return } return null; diff --git a/src/widget/widgets/button.js b/src/widget/widgets/button.js index 977a8ae..e3a11a0 100644 --- a/src/widget/widgets/button.js +++ b/src/widget/widgets/button.js @@ -30,32 +30,41 @@ class WidgetButton extends Component { onPress(e) { - if (!this.props.widget.customProperties.toggle) { + if (e.button === 0 && !this.props.widget.customProperties.toggle) { this.setState({ pressed: true }); this.valueChanged(this.props.widget.customProperties.on_value); } } onRelease(e) { - - let nextState = false; - if (this.props.widget.customProperties.toggle) { - nextState = !this.state.pressed; + + if (e.button === 0) { + let nextState = false; + if (this.props.widget.customProperties.toggle) { + nextState = !this.state.pressed; + } + this.props.widget.customProperties.pressed = nextState; + this.setState({pressed: nextState}); + this.valueChanged(nextState ? this.props.widget.customProperties.on_value : this.props.widget.customProperties.off_value); } - this.props.widget.customProperties.pressed = nextState; - this.setState({ pressed: nextState }); - this.valueChanged(nextState ? this.props.widget.customProperties.on_value : this.props.widget.customProperties.off_value); } valueChanged(newValue) { if (this.props.onInputChanged) - this.props.onInputChanged(newValue); + this.props.onInputChanged(newValue, 'pressed'); } render() { return (
    - +
    ); } diff --git a/src/widget/widgets/input.js b/src/widget/widgets/input.js index 58273ad..7fe7c38 100644 --- a/src/widget/widgets/input.js +++ b/src/widget/widgets/input.js @@ -31,53 +31,47 @@ class WidgetInput extends Component { static getDerivedStateFromProps(props, state){ - let returnState = {}; + let value = '' + let unit = '' - if(props.widget.customProperties.value !== ''){ - returnState["value"] = props.widget.customProperties.value; - } - - if(props.widget.signalIDs.length === 0){ - if (props.widget.customProperties.default_value && state.value === undefined && props.widget.customProperties.value === '') { - returnState["value"] = props.widget.customProperties.default_value; - } else { // if no default available - if (returnState !== {}){ - return returnState; - } - else{ - return null; - } - } - } - - // Update value - if (props.widget.customProperties.default_value && this.state.value === undefined && props.widget.customProperties.value === '') { - returnState["value"] = props.widget.customProperties.default_value; + if(props.widget.customProperties.hasOwnProperty('value') && props.widget.customProperties.value !== state.value){ + // set value to customProperties.value if this property exists and the value is different from current state + value = Number(props.widget.customProperties.value); + } else if (props.widget.customProperties.hasOwnProperty('default_value') && state.value === ''){ + // if customProperties.default_value exists and value has been assigned yet, set the value to the default_value + value = Number(props.widget.customProperties.default_value) } // Update unit (assuming there is exactly one signal for this widget) let signalID = props.widget.signalIDs[0]; let signal = props.signals.find(sig => sig.id === signalID); if(signal !== undefined){ - returnState["unit"] = signal.unit; + unit = signal.unit; } - if (returnState !== {}){ - return returnState; - } - else{ - return null; + if (unit !== '' && value !== ''){ + // unit and value have changed + return {unit: unit, value: value}; + } else if (unit !== ''){ + // only unit has changed + return {unit: unit} + } else if (value !== ''){ + // only value has changed + return {value: value} + } else{ + // nothing has changed + return null } } valueIsChanging(newValue) { - this.setState({ value: newValue }); - this.props.widget.customProperties.value = newValue; + this.setState({ value: Number(newValue) }); + this.props.widget.customProperties.value = Number(newValue); } valueChanged(newValue) { if (this.props.onInputChanged) { - this.props.onInputChanged(newValue); + this.props.onInputChanged(Number(newValue), 'value'); } } @@ -97,7 +91,16 @@ class WidgetInput extends Component {
    - this.handleKeyPress(e) } onBlur={ (e) => this.valueChanged(this.state.value) } onChange={ (e) => this.valueIsChanging(e.target.value) } placeholder="Enter value" value={ this.state.value } /> + this.handleKeyPress(e) } + onBlur={ (e) => this.valueChanged(this.state.value) } + onChange={ (e) => this.valueIsChanging(e.target.value) } + placeholder="Enter value" + value={ this.state.value } + /> {this.props.widget.customProperties.showUnit? ( {this.state.unit} diff --git a/src/widget/widgets/slider.js b/src/widget/widgets/slider.js index ce76fc6..89f4da7 100644 --- a/src/widget/widgets/slider.js +++ b/src/widget/widgets/slider.js @@ -40,47 +40,38 @@ class WidgetSlider extends Component { } static getDerivedStateFromProps(props, state){ - let returnState = {}; - if(props.widget.customProperties.value !== ''){ - returnState["value"] = props.widget.customProperties.value; + let value = '' + let unit = '' + + if(props.widget.customProperties.hasOwnProperty('value') && props.widget.customProperties.value !== state.value){ + // set value to customProperties.value if this property exists and the value is different from current state + value = Number(props.widget.customProperties.value); + } else if (props.widget.customProperties.hasOwnProperty('default_value') && state.value === ''){ + // if customProperties.default_value exists and value has been assigned yet, set the value to the default_value + value = Number(props.widget.customProperties.default_value) } - if(props.widget.signalIDs.length === 0){ - - // set value to default - if (props.widget.customProperties.default_value && state.value === undefined && props.widget.customProperties.value === '') { - returnState["value"] = props.widget.customProperties.default_value; - } else { // if no default available - if (returnState !== {}){ - return returnState; - } - else{ - return null; - } - } - - } - - // Update value - if (props.widget.customProperties.default_value && state.value === undefined && props.widget.customProperties.value === '') { - returnState["value"] = props.widget.customProperties.default_value; - } - // Update unit (assuming there is exactly one signal for this widget) let signalID = props.widget.signalIDs[0]; let signal = props.signals.find(sig => sig.id === signalID); if(signal !== undefined){ - returnState["unit"] = signal.unit; + unit = signal.unit; } - if (returnState !== {}){ - return returnState; + if (unit !== '' && value !== ''){ + // unit and value have changed + return {unit: unit, value: value}; + } else if (unit !== ''){ + // only unit has changed + return {unit: unit} + } else if (value !== ''){ + // only value has changed + return {value: value} + } else { + // nothing has changed + return null } - else{ - return null; - } - } componentDidUpdate(prevProps: Readonly

    , prevState: Readonly, snapshot: SS): void { @@ -114,7 +105,7 @@ class WidgetSlider extends Component { valueChanged(newValue) { if (this.props.onInputChanged) { - this.props.onInputChanged(newValue); + this.props.onInputChanged(newValue, 'value'); } } @@ -124,7 +115,7 @@ class WidgetSlider extends Component { let fields = { name: this.props.widget.name, control: this.valueIsChanging(v) } onAfterChange={ (v) => this.valueChanged(v) }/>, - value: { format('.3s')(Number.parseFloat(this.state.value)) }, + value: { format('.2f')(Number.parseFloat(this.state.value)) }, unit: { this.state.unit } } From 64b8a812001ee48b25b13c14693aff7d2c548568 Mon Sep 17 00:00:00 2001 From: Sonja Happ Date: Thu, 4 Jun 2020 14:25:53 +0200 Subject: [PATCH 238/391] Started revision of VILLASweb documentation --- doc/Requirements.md | 16 +++++++++ doc/Structure.md | 79 +++++++++++++++++++++++++++++++++++++++++++++ doc/development.md | 69 +++++++++++++++++++++++++++++++++++++++ 3 files changed, 164 insertions(+) create mode 100644 doc/Requirements.md create mode 100644 doc/Structure.md create mode 100644 doc/development.md diff --git a/doc/Requirements.md b/doc/Requirements.md new file mode 100644 index 0000000..c53871b --- /dev/null +++ b/doc/Requirements.md @@ -0,0 +1,16 @@ +# Requirements {#web-requirements} + +## Services + - NodeJS: Runs VILLASweb frontend + - Go: Runs VILLASweb backend + - PostgreSQL database (min version 11): Backend database + - [swag](https://github.com/swaggo/swag): For automated API documentation creation + - NGinX: Webserver and reverse proxy for backends (only for production) + - Docker: Container management system + +## Installed on your local computer + - NodeJS with npm + - Go (at least version 1.11) + - [swag](https://github.com/swaggo/swag) + - Docker + diff --git a/doc/Structure.md b/doc/Structure.md new file mode 100644 index 0000000..4399f0c --- /dev/null +++ b/doc/Structure.md @@ -0,0 +1,79 @@ +# VILLASweb data structure {#web-datastructure} + +This document describes how data (scenarios, infrastructure components, users etc., not only live data) is structured in VILLASweb. + +## Data model + +![Datamodel](../src/img/datamodel.png) + +VILLASweb features the following data classes: + + - Users + - Infrastructure Components + - Scenarios + * Component Configurations and Signals + * Dashboards and Widgets + * Files + +### Users +- You need a username and a password to authenticate in VILLASweb +- There exist three categories of users: Guest, User, and Admin +- Guests have only read access and cannot modify anything +- Users are normal users, they have access to their scenarios, can see available infrastructure components, and modify their accounts (except for their role) +- Admin users have full access to everything, they are the only users that can create new users or change the role of existing users. Only admin users can add or modify infrastructure components. + +### Infrastructure Components +- Components of research infrastructure +- Category: for example simulator, gateway, amplifier, database, etc. +- Type: for example RTDS, OpalRT, VILLASnode, Cassandra +- Can only be added/ modified by admin users + +### Scenarios +- A collection of component configurations, dashboards, and files for a specific experiment +- Users can have access to multiple scenarios +- Users can be added to and removed from scenarios + +### Component Configurations and Signals +- Configure an infrastructure component for the use in a specific scenario +- Input signals: Signals that can be modified in VILLASweb +- Output signals: Signals that can be visualized on dashboards of VILLASweb +- Parameters: Additional configuration parameters of the infrastructure component +- Signals are the actual live data that is displayed or modified through VILLASweb dashboards + +### Dashboards and Widgets +- Visualize ongoing experiments in real-time +- Interact with ongoing experiments in real-time +- Use widgets to design the dashboard according to the needs + +### Files +- Files can be added to scenarios optionally +- Can be images, model files, CIM xml files +- Can be used in widgets or component configurations + +## Setup strategy + +The easiest way to start from scratch is the following (assuming the infrastructure components are already configured by an admin user, see below): + +1. Create a new scenario. +2. Create and configure a new component configuration and link it with an available infrastructure component. +3. Configure the input and output signals of the component configuration according to the signals provided by the selected infrastructure component. The number of signals and their order (index starting at 1) must match. +4. Create a new dashboard and add widgets as desired. Configure the widgets by right-clicking to open the edit menu +5. If needed, files can be added to the scenario and used by component configurations or widgets (models, images, CIM-files, etc.) +6. For collaboration with other users, users can be added to a scenario + +### Setup of infrastructure components + +In the "Infrastructure Components" menu point admin users can create and edit components to be used in experiments. Normal uses can view the available components, but not edit them. +The components are global at any time and are shared among all users of VILLASweb. + +To create a new infrastructure component, you need to provide: +- Name +- Category (see above for examples) +- Type (see above for examples) +- Location +- Host (network address of the component) + +At the moment, you need to know the input and output signals of the infrastructure component a priori to be able to create compatible component configurations by hand. +An auto-detection mechanism for signals is planned for future releases. + +> Hint: At least one infrastructure component is required to receive data in VILLASweb. diff --git a/doc/development.md b/doc/development.md new file mode 100644 index 0000000..259fb19 --- /dev/null +++ b/doc/development.md @@ -0,0 +1,69 @@ +# Development {#web-development} + +- @subpage web-datastructure + +In order to get started with VILLASweb, you might also want to check our our [demo project](https://git.rwth-aachen.de/acs/public/villas/Demo) which is simple to setup using Docker Compose. + +## Frontend + +### Description + +The website itself based on the React JavaScript framework. + +### Required + + - NodeJS with npm + +### Setup + + - `git clone git@git.rwth-aachen.de/acs/public/villas/web.git` to copy the project on your computer + - `cd VILLASweb` + - `npm install` + +### Running + + - `npm start` + +This runs the development server for the website on your local computer at port 3000. +The backend must be running to make the website work. + +## Backend + +### Description + +The backend of VILLASweb uses the programming language Go and a PostgreSQL data base. + +### Required + + - Go (min version 1.11) + - Running PostgreSQL data base (min version 11) + - [swag](https://github.com/swaggo/swag) + +### Setup and Running + + - `git clone git@git.rwth-aachen.de/acs/public/villas/web-backend-go.git` to copy the project on your computer + - `cd VILLASweb-backend-go` + - `go mod tidy` + - `go run start.go [params]` + +To obtain a list of available parameters use `go run start.go --help`. +To run the tests use `go test $(go list ./... ) -p 1` in the top-level folder of the repo. + +Running the backend will only work if the PostgreSQL database is setup properly. Otherwise, you will get error messages. + +### Auto-generate the API documentation + +The documentation of the VILLASweb API in the OpenAPI format can be auto-generated from the source code documentation using the tool swag. +To do this run the following in the top-level folder of the repo: + +- `go mod tidy` +- `go install github.com/swaggo/swag/cmd/swag` +- `swag init -p pascalcase -g "start.go" -o "./doc/api/"` + +The `.yaml` and `.json` files in OpenAPI swagger format are created in the output folder `doc/api`. + +### PostgreSQL database setup + +Please check the [Readme file in the backend repository](https://git.rwth-aachen.de/acs/public/villas/web-backend-go) for some useful hints on the local setup of the PostreSQL database. + + From 5623c9d3ff2056f5d7b5c31779f5c693c7956ff6 Mon Sep 17 00:00:00 2001 From: Sonja Happ Date: Wed, 10 Jun 2020 14:54:07 +0200 Subject: [PATCH 239/391] Gauge widget uses signals (min/ max not working properly) #218 --- src/widget/widgets/gauge.js | 43 ++++++++++++++++++++----------------- 1 file changed, 23 insertions(+), 20 deletions(-) diff --git a/src/widget/widgets/gauge.js b/src/widget/widgets/gauge.js index cd778ad..60412b5 100644 --- a/src/widget/widgets/gauge.js +++ b/src/widget/widgets/gauge.js @@ -80,30 +80,33 @@ class WidgetGauge extends Component { static getDerivedStateFromProps(props, state){ if(props.widget.signalIDs.length === 0){ - return null; + return{ value: 0}; } + + // get the signal with the selected signal ID + let signalID = props.widget.signalIDs[0]; + let signal = props.signals.filter(s => s.id === signalID) + // determine ID of infrastructure component related to signal[0] (there is only one signal for a lamp widget) + let icID = props.icIDs[signal[0].id]; + let returnState = {} returnState["useColorZones"] = props.widget.customProperties.colorZones; // Update unit (assuming there is exactly one signal for this widget) - let signalID = props.widget.signalIDs[0]; - let widgetSignal = props.signals.find(sig => sig.id === signalID); - if(widgetSignal !== undefined){ - returnState["unit"] = widgetSignal.unit; + if(signal !== undefined){ + returnState["unit"] = signal[0].unit; } - const ICid = props.icIDs[0]; - // update value + + // check if data available if (props.data == null - || props.data[ICid] == null - || props.data[ICid].output == null - || props.data[ICid].output.values == null - || props.data[ICid].output.values.length === 0 - || props.data[ICid].output.values[0].length === 0) { - returnState["value"] = 0; - return returnState; + || props.data[icID] == null + || props.data[icID].output == null + || props.data[icID].output.values == null) { + returnState["value"] = 0; + return returnState; } // memorize if min or max value is updated @@ -112,14 +115,14 @@ class WidgetGauge extends Component { let updateMaxValue = false; // check if value has changed - const signalData = props.data[ICid].output.values[widgetSignal.index]; + const data = props.data[icID].output.values[signal[0].index-1]; // Take just 3 decimal positions // Note: Favor this method over Number.toFixed(n) in order to avoid a type conversion, since it returns a String - if (signalData != null) { - const value = Math.round(signalData[signalData.length - 1].y * 1e3) / 1e3; + if (data != null) { + const value = Math.round(data[data.length - 1].y * 1e3) / 1e3; let minValue = null; let maxValue = null; - + if ((state.value !== value && value != null) || props.widget.customProperties.valueUseMinMax || state.useMinMaxChange) { //value has changed updateValue = true; @@ -129,7 +132,7 @@ class WidgetGauge extends Component { minValue = state.minValue; maxValue = state.maxValue; - + if (minValue == null || state.useMinMaxChange) { minValue = value - 0.5; updateLabels = true; @@ -215,7 +218,7 @@ class WidgetGauge extends Component { if (zones != null) { // adapt range 0-100 to actual min-max const step = (maxValue - minValue) / 100; - + zones = zones.map(zone => { return Object.assign({}, zone, { min: (zone.min * step) + +minValue, max: zone.max * step + +minValue, strokeStyle: '#' + zone.strokeStyle }); }); From 65680561986d28e50d776e424e3544cbc5d00b81 Mon Sep 17 00:00:00 2001 From: Laura Fuentes Grau Date: Fri, 12 Jun 2020 18:49:11 +0200 Subject: [PATCH 240/391] Gauge Widget: display issues while connected to a signal fixed --- src/dashboard/dashboard.js | 4 ++-- src/widget/widgets/gauge.js | 40 ++++++++++++++----------------------- 2 files changed, 17 insertions(+), 27 deletions(-) diff --git a/src/dashboard/dashboard.js b/src/dashboard/dashboard.js index 2ced5ef..67ded60 100644 --- a/src/dashboard/dashboard.js +++ b/src/dashboard/dashboard.js @@ -339,7 +339,7 @@ class Dashboard extends Component { AppDispatcher.dispatch({ type: 'widgets/start-load', token: this.state.sessionToken, - param: '?dashboardID=1' + param: '?dashboardID=' + this.state.dashboard.id }); this.setState({ editModal: false }); @@ -433,7 +433,7 @@ class Dashboard extends Component { AppDispatcher.dispatch({ type: 'widgets/start-load', token: this.state.sessionToken, - param: '?dashboardID=1' + param: '?dashboardID=' + this.state.dashboard.id }); this.setState({ editing: false, widgetChangeData: [], widgetAddData: []}); diff --git a/src/widget/widgets/gauge.js b/src/widget/widgets/gauge.js index 60412b5..b273701 100644 --- a/src/widget/widgets/gauge.js +++ b/src/widget/widgets/gauge.js @@ -29,9 +29,10 @@ class WidgetGauge extends Component { this.state = { value: 0, unit: '', + signalID: '', minValue: null, maxValue: null, - useColorZones: false, + colorZones: [], useMinMax: false, useMinMaxChange: false, }; @@ -48,13 +49,7 @@ class WidgetGauge extends Component { } componentDidUpdate(prevProps: Readonly

    , prevState: Readonly, snapshot: SS): void { - if(prevState.minValue !== this.state.minValue){ - this.gauge.setMinValue(this.state.minValue); - } - if(prevState.maxValue !== this.state.maxValue){ - this.gauge.maxValue = this.state.maxValue - } - + // update gauge's value if(prevState.value !== this.state.value){ this.gauge.set(this.state.value) @@ -65,8 +60,8 @@ class WidgetGauge extends Component { } // update labels - if(prevState.minValue !== this.state.minValue || prevState.maxValue !== this.state.maxValue || prevState.useColorZones !== this.state.useColorZones - || prevState.useMinMax !== this.state.useMinMax){ + if(prevState.minValue !== this.state.minValue || prevState.maxValue !== this.state.maxValue || prevState.colorZones !== this.state.colorZones + || prevState.useMinMax !== this.state.useMinMax || prevState.signalID !== this.state.signalID){ this.gauge = new Gauge(this.gaugeCanvas).setOptions(this.computeGaugeOptions(this.props.widget)); this.gauge.maxValue = this.state.maxValue; this.gauge.setMinValue(this.state.minValue); @@ -91,8 +86,11 @@ class WidgetGauge extends Component { let returnState = {} - returnState["useColorZones"] = props.widget.customProperties.colorZones; + returnState["colorZones"] = props.widget.customProperties.zones; + if(signalID){ + returnState["signalID"] = signalID; + } // Update unit (assuming there is exactly one signal for this widget) if(signal !== undefined){ returnState["unit"] = signal[0].unit; @@ -133,13 +131,13 @@ class WidgetGauge extends Component { minValue = state.minValue; maxValue = state.maxValue; - if (minValue == null || state.useMinMaxChange) { + if (minValue == null || (!props.widget.customProperties.valueUseMinMax && (value < minValue || signalID !== state.signalID)) ||state.useMinMaxChange) { minValue = value - 0.5; updateLabels = true; updateMinValue = true; } - if (maxValue == null || state.useMinMaxChange) { + if (maxValue == null || (!props.widget.customProperties.valueUseMinMax && (value > maxValue || signalID !== state.signalID)) || state.useMinMaxChange) { maxValue = value + 0.5; updateLabels = true; updateMaxValue = true; @@ -147,17 +145,12 @@ class WidgetGauge extends Component { } if (props.widget.customProperties.valueUseMinMax) { - if (state.minValue > props.widget.customProperties.valueMin) { minValue = props.widget.customProperties.valueMin; updateMinValue = true; - updateLabels = true; - } - - if (state.maxValue < props.widget.customProperties.valueMax) { maxValue = props.widget.customProperties.valueMax; updateMaxValue = true; updateLabels = true; - } + } if (updateLabels === false && state.gauge) { @@ -177,10 +170,7 @@ class WidgetGauge extends Component { if(props.widget.customProperties.valueUseMinMax !== state.useMinMax){ returnState["useMinMax"] = props.widget.customProperties.valueUseMinMax; } - if(props.widget.customProperties.colorZones !== state.useColorZones){ - returnState["useColorZones"] = props.widget.customProperties.colorZones; - } - + // prepare returned state if(updateValue === true){ returnState["value"] = value; @@ -248,8 +238,8 @@ class WidgetGauge extends Component { colorStop: '#6EA2B0', strokeColor: '#E0E0E0', highDpiSupport: true, - limitMax: false, - limitMin: false + limitMax: widget.customProperties.valueUseMinMax || false, + limitMin: widget.customProperties.valueUseMinMax || false }; } From 3065ef88894055fe54ef2480e6c7cd9270841d49 Mon Sep 17 00:00:00 2001 From: Laura Fuentes Grau Date: Fri, 12 Jun 2020 19:17:43 +0200 Subject: [PATCH 241/391] Fix for Gauge Widget: Widget now doesn't look broken if no signal is selected #221 --- src/widget/widgets/gauge.js | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/widget/widgets/gauge.js b/src/widget/widgets/gauge.js index b273701..00ffa93 100644 --- a/src/widget/widgets/gauge.js +++ b/src/widget/widgets/gauge.js @@ -75,7 +75,7 @@ class WidgetGauge extends Component { static getDerivedStateFromProps(props, state){ if(props.widget.signalIDs.length === 0){ - return{ value: 0}; + return{ value: 0, minValue: 0, maxValue: 10}; } // get the signal with the selected signal ID @@ -103,8 +103,7 @@ class WidgetGauge extends Component { || props.data[icID] == null || props.data[icID].output == null || props.data[icID].output.values == null) { - returnState["value"] = 0; - return returnState; + return{ value: 0, minValue: 0, maxValue: 10}; } // memorize if min or max value is updated @@ -202,7 +201,7 @@ class WidgetGauge extends Component { for (let i = 0; i < labelCount; i++) { labels.push(minValue + labelStep * i); } - + // calculate zones let zones = this.props.widget.customProperties.colorZones ? this.props.widget.customProperties.zones : null; if (zones != null) { @@ -214,6 +213,7 @@ class WidgetGauge extends Component { }); } + if(this.state.signalID !== ''){ this.gauge.setOptions({ staticLabels: { font: '10px "Helvetica Neue"', @@ -224,6 +224,7 @@ class WidgetGauge extends Component { staticZones: zones }); } + } computeGaugeOptions(widget) { return { From 94f88ecfdbee4ebf1688aff93e25b5c22c283bc8 Mon Sep 17 00:00:00 2001 From: Laura Fuentes Grau Date: Sun, 14 Jun 2020 17:53:40 +0200 Subject: [PATCH 242/391] Fix for Edit Layout: pressing Cancel now deletes every newly added widget --- src/dashboard/dashboard.js | 35 ++++++++++++++--------------------- 1 file changed, 14 insertions(+), 21 deletions(-) diff --git a/src/dashboard/dashboard.js b/src/dashboard/dashboard.js index 67ded60..2f558e0 100644 --- a/src/dashboard/dashboard.js +++ b/src/dashboard/dashboard.js @@ -127,7 +127,7 @@ class Dashboard extends Component { modalData: null, modalIndex: null, widgetChangeData: [], - widgetAddData:prevState.widgetAddData || [], + widgetOrigIDs: prevState.widgetOrigIDs || [], maxWidgetHeight: maxHeight || null, dropZoneHeight: maxHeight +80 || null, @@ -214,10 +214,6 @@ class Dashboard extends Component { handleDrop(widget) { widget.dashboardID = this.state.dashboard.id; - let tempChanges = this.state.widgetAddData; - tempChanges.push(widget); - - this.setState({ widgetAddData: tempChanges}) AppDispatcher.dispatch({ type: 'widgets/start-add', @@ -368,7 +364,9 @@ class Dashboard extends Component { startEditing(){ + let originalIDs = []; this.state.widgets.forEach( widget => { + originalIDs.push(widget.id); if(widget.type === 'Slider' || widget.type === 'NumberInput' || widget.type === 'Button'){ AppDispatcher.dispatch({ type: 'widgets/start-edit', @@ -377,7 +375,7 @@ class Dashboard extends Component { }); } }); - this.setState({ editing: true }); + this.setState({ editing: true, widgetOrigIDs: originalIDs }); }; saveEditing() { @@ -396,7 +394,7 @@ class Dashboard extends Component { data: widget }); }); - this.setState({ editing: false, widgetChangeData: [], widgetAddData: [] }); + this.setState({ editing: false, widgetChangeData: []}); }; saveChanges() { @@ -414,28 +412,23 @@ class Dashboard extends Component { cancelEditing() { //raw widget has no id -> cannot be deleted in its original form - let temp = []; - this.state.widgetAddData.forEach(rawWidget => { this.state.widgets.forEach(widget => { - if(widget.y === rawWidget.y && widget.x === rawWidget.x && widget.type === rawWidget.type){ - temp.push(widget); + let tempID = this.state.widgetOrigIDs.find(element => element === widget.id); + if(typeof tempID === 'undefined'){ + AppDispatcher.dispatch({ + type: 'widgets/start-remove', + data: widget, + token: this.state.sessionToken + }); } }) - }) - - temp.forEach( widget => { - AppDispatcher.dispatch({ - type: 'widgets/start-remove', - data: widget, - token: this.state.sessionToken - }); - }); + AppDispatcher.dispatch({ type: 'widgets/start-load', token: this.state.sessionToken, param: '?dashboardID=' + this.state.dashboard.id }); - this.setState({ editing: false, widgetChangeData: [], widgetAddData: []}); + this.setState({ editing: false, widgetChangeData: []}); }; From fa6652e5514125127d38b334fdabb9152195f70b Mon Sep 17 00:00:00 2001 From: Laura Fuentes Grau Date: Thu, 18 Jun 2020 12:42:08 +0200 Subject: [PATCH 243/391] (wip) styling added to the dashboard edit toolbar #227 --- src/widget/toolbox-item.js | 4 ++-- src/widget/widget-toolbox.js | 28 ++++++++++++++-------------- 2 files changed, 16 insertions(+), 16 deletions(-) diff --git a/src/widget/toolbox-item.js b/src/widget/toolbox-item.js index 013c4cf..b61bdc4 100644 --- a/src/widget/toolbox-item.js +++ b/src/widget/toolbox-item.js @@ -51,7 +51,7 @@ class ToolboxItem extends React.Component { if (this.props.disabled === false) { return this.props.connectDragSource(

    - + {this.props.icon && } {this.props.name} @@ -61,7 +61,7 @@ class ToolboxItem extends React.Component { else { return (
    - + {this.props.icon && } {this.props.name} diff --git a/src/widget/widget-toolbox.js b/src/widget/widget-toolbox.js index 9a4309b..820b02a 100644 --- a/src/widget/widget-toolbox.js +++ b/src/widget/widget-toolbox.js @@ -39,20 +39,20 @@ class WidgetToolbox extends React.Component { const topologyItemMsg = thereIsTopologyWidget? 'Currently only one is supported' : ''; return
    - - - - - - - - - - - - - - + + + + + + + + + + + + + +
    From c4781b86f16e32e8b44ed0b8a5cc00044bed3757 Mon Sep 17 00:00:00 2001 From: Sonja Happ Date: Thu, 18 Jun 2020 17:05:47 +0200 Subject: [PATCH 244/391] Work on edit file, use table of files instead of dropdown menu, fix upload callbacks; sizing of dialog window not working, Cancel button of dialog window obsolete #219 --- src/dashboard/dashboard.js | 59 +---- src/file/edit-files.js | 226 ++++++++---------- .../edit-widget-control-creator.js | 6 +- .../edit-widget/edit-widget-file-control.js | 37 +-- src/widget/edit-widget/edit-widget.js | 3 +- 5 files changed, 106 insertions(+), 225 deletions(-) diff --git a/src/dashboard/dashboard.js b/src/dashboard/dashboard.js index 2f558e0..cf4e656 100644 --- a/src/dashboard/dashboard.js +++ b/src/dashboard/dashboard.js @@ -272,60 +272,9 @@ class Dashboard extends Component { this.setState({filesEditModal: true, filesEditSaveState: tempFiles}); } - closeEditFiles(files,deleteData,addData){ - - if(files || deleteData || addData){ - - if(addData.length > 0){ - let formData = new FormData(); - addData.forEach( file => { - delete file.id; - formData.append("file", file); - }); - AppDispatcher.dispatch({ - type: 'files/start-upload', - data: formData, - token: this.state.sessionToken, - scenarioID: this.state.dashboard.scenarioID, - }); - } - - if(deleteData.length > 0){ - deleteData.forEach( file => { - AppDispatcher.dispatch({ - type: 'files/start-remove', - data: file, - token: this.state.sessionToken - }); - }); - } - } - let formData = new FormData(); - files.forEach( file => { - if(file.type === "application/octet-stream"){ - let originalFile = this.state.filesEditSaveState.find(element => parseInt(element.id,10) === parseInt(file.id,10)); - if(originalFile.name !== file.name){ - formData.append("file", file); - AppDispatcher.dispatch({ - type: 'files/start-edit', - token: this.state.sessionToken, - data: formData - }); - } - } - }) - - this.setState({ filesEditModal: false, filesEditSaveState: [] }); - } - - uploadFile(data,widget){ - AppDispatcher.dispatch({ - type: 'files/start-upload', - data: data, - token: this.state.sessionToken, - scenarioID: this.state.dashboard.scenarioID, - }); + closeEditFiles(){ + // TODO do we need this if the dispatches happen in the dialog? } closeEdit(data){ @@ -422,7 +371,7 @@ class Dashboard extends Component { }); } }) - + AppDispatcher.dispatch({ type: 'widgets/start-load', token: this.state.sessionToken, @@ -521,7 +470,6 @@ class Dashboard extends Component { sessionToken={this.state.sessionToken} show={this.state.editModal} onClose={this.closeEdit.bind(this)} - onUpload = {this.uploadFile.bind(this)} widget={this.state.modalData} signals={this.state.signals} files={this.state.files} @@ -533,6 +481,7 @@ class Dashboard extends Component { onClose={this.closeEditFiles.bind(this)} signals={this.state.signals} files={this.state.files} + scenarioID={this.state.dashboard.scenarioID} /> diff --git a/src/file/edit-files.js b/src/file/edit-files.js index 341c5cd..4df19d5 100644 --- a/src/file/edit-files.js +++ b/src/file/edit-files.js @@ -16,10 +16,11 @@ ******************************************************************************/ import React from 'react'; -import {FormGroup, FormControl, FormLabel, Button} from 'react-bootstrap'; - - +import {FormGroup, FormControl, Button, Col, ProgressBar} from 'react-bootstrap'; import Dialog from '../common/dialogs/dialog'; +import AppDispatcher from "../common/app-dispatcher"; +import Table from "../common/table"; +import TableColumn from "../common/table-column"; class EditFilesDialog extends React.Component { @@ -30,168 +31,133 @@ class EditFilesDialog extends React.Component { super(props); this.state = { - files: [], - selectedFile: {}, - deleteData: [], - addData: [], - addFile: {} + uploadFile: null, + uploadProgress: 0 }; } - static getDerivedStateFromProps(props, state){ - return { - files: props.files - }; - } - - - onClose(canceled) { if (canceled === false) { if (this.validChanges()) { - this.props.onClose(this.state.files,this.state.deleteData,this.state.addData); + this.props.onClose(); } } else { this.props.onClose(); } } -//can you add file to state array? - addFile(){ - let addFile = this.state.addFile[0]; - addFile.id = this.state.files[this.state.files.length -1 ].id +1; - let tempFiles = this.state.files; - tempFiles.push(addFile); - this.setState({files: tempFiles}); - let tempAddFiles = this.state.addData; - tempAddFiles.push(addFile); - this.setState({addData: tempAddFiles}); + selectUploadFile(event) { + this.setState({ uploadFile: event.target.files[0] }); + }; - this.setState({addFile: {}}); + startFileUpload(){ + // upload file + const formData = new FormData(); + formData.append("file", this.state.uploadFile); + + AppDispatcher.dispatch({ + type: 'files/start-upload', + data: formData, + token: this.props.sessionToken, + progressCallback: this.updateUploadProgress, + finishedCallback: this.clearProgress, + scenarioID: this.props.scenarioID, + }); + + // TODO make sure that dialog remains open after clicking "Upload" button + }; + + updateUploadProgress = (event) => { + this.setState({ uploadProgress: parseInt(event.percent.toFixed(), 10) }); + }; + + clearProgress = (newFileID) => { + /*if (this.props.onChange != null) { + let event = {} + event["target"] = {} + event.target["value"] = newFileID + this.props.onChange(event); + } + */ + this.setState({ uploadProgress: 0 }); + + + }; + + deleteFile(index){ + + let file = this.props.files[index] + AppDispatcher.dispatch({ + type: 'files/start-remove', + data: file, + token: this.props.sessionToken + }); + + // TODO make sure that dialog remains open after clicking delete button } - deleteFile(){ - let tempFiles = this.state.files; - let changeId = false; - for (let i = 0; i < tempFiles.length; i++) { - if(changeId){ - tempFiles[i-1] = tempFiles[i]; - } - else if(tempFiles[i].id === this.state.selectedFile.id){ - changeId = true; - } - } - tempFiles.pop(); - this.setState({files: tempFiles}); - - if(this.state.selectedFile.type !== "application/octet-stream"){ - let tempAddFiles = this.state.addData; - let changePosition = false; - for (let i = 0; i < tempAddFiles.length; i++) { - if(changePosition){ - tempAddFiles[i-1] = tempAddFiles[i]; - } - else if(tempAddFiles[i].id === this.state.selectedFile.id){ - changePosition = true; - } - } - tempAddFiles.pop(); - this.setState({addData: tempAddFiles}); - } - else{ - let tempDeleteFiles = this.state.deleteData; - tempDeleteFiles.push(this.state.selectedFile); - this.setState({deleteData: tempDeleteFiles}); - } - - - } - - - handleChange(e) { - - if(e.target.id === "selectedFile"){ - let tempFile = this.state.files.find(element => element.id === parseInt(e.target.value, 10)); - - this.setState({ [e.target.id]: tempFile }); - } - else if(e.target.id === "name"){ - if(this.state.selectedFile.type === "application/octet-stream"){ - - let tempFile = this.state.selectedFile; - tempFile.name = e.target.value; - this.setState({selectedFile: tempFile}); - let tempFileList = this.state.files; - tempFileList[tempFile.id - 1] = tempFile; - this.setState({files: tempFileList}); - } - else { - const newFile = new File([this.state.selectedFile], e.target.value , {type: this.state.selectedFile.type}); - this.setState({selectedFile: newFile}); - let tempFileList = this.state.files; - newFile.id = this.state.selectedFile.id; - tempFileList[newFile.id - 1] = newFile; - this.setState({files: tempFileList}); - - let tempAddFiles = this.state.addData; - for (let i = 0; i < tempAddFiles.length; i++) { - if(tempAddFiles[i].id === newFile.id){ - tempAddFiles[i] = newFile; - } - } - this.setState({addData: tempAddFiles}); - - } - - } - - - } - - validChanges() { - return true; - } render() { let fileOptions = []; - if (this.state.files.length > 0){ + if (this.props.files.length > 0){ fileOptions.push( ) - fileOptions.push(this.state.files.map((file, index) => ( + fileOptions.push(this.props.files.map((file, index) => ( ))) } else { fileOptions = } - + + const progressBarStyle = { + marginLeft: '100px', + marginTop: '-40px' + }; + return ( - this.onClose(c)} valid={true}> +
    - - Image +
    + + + + + this.deleteFile(index)} + /> +
    + + + this.handleChange(e)}>{fileOptions} - - - - {"File Name"} - this.handleChange(e)} /> - + disabled={this.props.disabled} + type='file' + onChange={(event) => this.selectUploadFile(event)} /> - - - - Upload - this.setState({ addFile: e.target.files })} /> + + - + + +
    ); diff --git a/src/widget/edit-widget/edit-widget-control-creator.js b/src/widget/edit-widget/edit-widget-control-creator.js index 78bff0c..5c12734 100644 --- a/src/widget/edit-widget/edit-widget-control-creator.js +++ b/src/widget/edit-widget/edit-widget-control-creator.js @@ -33,7 +33,7 @@ import EditWidgetMinMaxControl from './edit-widget-min-max-control'; import EditWidgetHTMLContent from './edit-widget-html-content'; import EditWidgetParametersControl from './edit-widget-parameters-control'; -export default function CreateControls(widgetType = null, widget = null, sessionToken = null, files = null, signals, handleChange, onUpload) { +export default function CreateControls(widgetType = null, widget = null, sessionToken = null, files = null, signals, handleChange) { // Use a list to concatenate the controls according to the widget type var DialogControls = []; @@ -84,7 +84,7 @@ export default function CreateControls(widgetType = null, widget = null, session // Restrict to only image file types (MIME) //let imageControlFiles = files == null? [] : files.filter(file => file.type.includes('image')); DialogControls.push( - handleChange(e)} onUpload={(f,i) => onUpload(f,i)} />, + handleChange(e)} />, handleChange(e)} /> ); break; @@ -149,7 +149,7 @@ export default function CreateControls(widgetType = null, widget = null, session // Restrict to only xml files (MIME) //let topologyControlFiles = files == null? [] : files.filter( file => file.type.includes('xml')); DialogControls.push( - handleChange(e) } onUpload={(f,i) => onUpload(f,i)} /> + handleChange(e) } /> ); break; diff --git a/src/widget/edit-widget/edit-widget-file-control.js b/src/widget/edit-widget/edit-widget-file-control.js index 298ba01..a55aa23 100644 --- a/src/widget/edit-widget/edit-widget-file-control.js +++ b/src/widget/edit-widget/edit-widget-file-control.js @@ -16,7 +16,7 @@ ******************************************************************************/ import React from 'react'; -import {FormGroup, FormControl, FormLabel, Button, ProgressBar} from 'react-bootstrap'; +import {FormGroup, FormControl, FormLabel} from 'react-bootstrap'; class EditFileWidgetControl extends React.Component { @@ -24,41 +24,16 @@ class EditFileWidgetControl extends React.Component { super(props); this.state = { - widget: { }, files: [], - fileList: null, - progress: 0 }; } static getDerivedStateFromProps(props, state){ return { - widget: props.widget, files: props.files.filter(file => file.type.includes(props.type)) }; } - startFileUpload = () => { - // get selected file - let formData = new FormData(); - - for (let key in this.state.fileList) { - if (this.state.fileList.hasOwnProperty(key) && this.state.fileList[key] instanceof File) { - formData.append("file", this.state.fileList[key]); - } - } - - this.props.onUpload(formData,this.props.widget); - } - - uploadProgress = (e) => { - this.setState({ progress: Math.round(e.percent) }); - } - - clearProgress = () => { - this.setState({ progress: 0 }); - } - handleFileChange(e){ this.props.handleChange({ target: { id: this.props.controlId, value: e.target.value } }); } @@ -88,17 +63,9 @@ class EditFileWidgetControl extends React.Component { Image this.handleFileChange(e)}>{fileOptions}
    - - - Upload - this.setState({ fileList: e.target.files }) } /> - - - -
    ; } } diff --git a/src/widget/edit-widget/edit-widget.js b/src/widget/edit-widget/edit-widget.js index 594acf0..01cffdb 100644 --- a/src/widget/edit-widget/edit-widget.js +++ b/src/widget/edit-widget/edit-widget.js @@ -177,8 +177,7 @@ class EditWidgetDialog extends React.Component { this.props.sessionToken, this.props.files, this.props.signals, - (e) => this.handleChange(e), - (f,i) => this.props.onUpload(f,i)); + (e) => this.handleChange(e)); } return ( From 5844efdbbb6bfd6f9cea9a024ee84934bc398038 Mon Sep 17 00:00:00 2001 From: Sonja Happ Date: Fri, 19 Jun 2020 09:34:46 +0200 Subject: [PATCH 245/391] Removed plot-table widget as it is redundant to plot widget #218 --- .../widget/edit-widget-control-creator.js | 1 - src/ic/ic-data-data-manager.js | 2 +- src/styles/widgets.css | 64 --------- .../edit-widget-control-creator.js | 8 -- src/widget/widget-factory.js | 11 -- src/widget/widget-toolbox.js | 1 - src/widget/widget.js | 11 -- src/widget/widgets/plot-table.js | 130 ------------------ 8 files changed, 1 insertion(+), 227 deletions(-) delete mode 100644 src/widget/widgets/plot-table.js diff --git a/src/__tests__/widget/edit-widget-control-creator.js b/src/__tests__/widget/edit-widget-control-creator.js index 73efcd9..7f1dded 100644 --- a/src/__tests__/widget/edit-widget-control-creator.js +++ b/src/__tests__/widget/edit-widget-control-creator.js @@ -30,7 +30,6 @@ describe('edit widget control creator', () => { { args: { widgetType: 'Table' }, result: { controlNumber: 2, controlTypes: [EditWidgetCheckboxControl] } }, { args: { widgetType: 'Image' }, result: { controlNumber: 2, controlTypes: [EditFileWidgetControl, EditWidgetAspectControl] } }, { args: { widgetType: 'Gauge' }, result: { controlNumber: 6, controlTypes: [EditWidgetTextControl, EditWidgetSignalControl, EditWidgetCheckboxControl, EditWidgetColorZonesControl, EditWidgetMinMaxControl] } }, - { args: { widgetType: 'PlotTable' }, result: { controlNumber: 5, controlTypes: [EditWidgetSignalsControl, EditWidgetTextControl, EditWidgetTimeControl, EditWidgetMinMaxControl] } }, { args: { widgetType: 'Slider' }, result: { controlNumber: 9, controlTypes: [EditWidgetTextControl, EditWidgetOrientation, EditWidgetSignalControl, EditWidgetCheckboxControl, EditWidgetCheckboxControl, EditWidgetMinMaxControl, EditWidgetNumberControl, EditWidgetNumberControl] } }, { args: { widgetType: 'Button' }, result: { controlNumber: 6, controlTypes: [EditWidgetTextControl, EditWidgetSignalControl, EditWidgetCheckboxControl, EditWidgetNumberControl, EditWidgetNumberControl] } }, { args: { widgetType: 'Box' }, result: { controlNumber: 2, controlTypes: [EditWidgetColorControl, EditWidgetColorControl] } }, diff --git a/src/ic/ic-data-data-manager.js b/src/ic/ic-data-data-manager.js index 5aebae9..2e09a7c 100644 --- a/src/ic/ic-data-data-manager.js +++ b/src/ic/ic-data-data-manager.js @@ -58,7 +58,7 @@ class IcDataDataManager { if (socket == null) { return false; } - + console.log("Sending to IC", identifier, "message: ", message); const data = this.messageToBuffer(message); socket.send(data); diff --git a/src/styles/widgets.css b/src/styles/widgets.css index 4e367a3..192acdd 100644 --- a/src/styles/widgets.css +++ b/src/styles/widgets.css @@ -115,65 +115,6 @@ div[class*="-widget"] .btn[disabled], .btn.disabled, div[class*="-widget"] input /* End edit menu: Colors */ -/* PlotTable widget */ -.plot-table-widget, .plot-widget, .value-widget, .image-widget, .label-widget { - width: 100%; - height: 100%; - padding: 3px 6px; -} - -.plot-table-widget { - display: -webkit-flex; - display: flex; - flex-direction: column; -} - -.plot-table-widget .content { - -webkit-flex: 1 0 auto; - flex: 1 0 auto; - display: -webkit-flex; - display: flex; - flex-direction: column; -} - -.table-plot-row { - -webkit-flex: 1 0 auto; - flex: 1 0 auto; - display: -webkit-flex; - display: flex; -} - -.plot-table-widget .widget-table { - -webkit-flex: 1 0 auto; - flex: 1 0 auto; - flex-basis: 90px; - max-width: 50%; - display: flex; - flex-direction: column; - justify-content: center; - margin-right: 10px; -} - -.plot-table-widget small { - text-align: center; -} - -.plot-table-widget .checkbox label { - height: 100%; - width: 100%; - padding: 6px 12px; - overflow-x: hidden; -} - -.plot-table-widget .btn { - padding: 0px; -} - -.plot-table-widget input[type="checkbox"] { - display: none; -} -/* End PlotTable Widget */ - /* Plot Widget */ .plot-widget { display: -webkit-flex; @@ -438,8 +379,3 @@ div[class*="-widget"] label { border: 2px solid; } /* End box widget */ - -.plot-table-widget .widget-plot { - -webkit-flex: 1 0 auto; - flex: 1 0 auto; -} diff --git a/src/widget/edit-widget/edit-widget-control-creator.js b/src/widget/edit-widget/edit-widget-control-creator.js index 5c12734..90ded85 100644 --- a/src/widget/edit-widget/edit-widget-control-creator.js +++ b/src/widget/edit-widget/edit-widget-control-creator.js @@ -97,14 +97,6 @@ export default function CreateControls(widgetType = null, widget = null, session handleChange(e)} /> ); break; - case 'PlotTable': - DialogControls.push( - handleChange(e)} />, - handleChange(e)} />, - handleChange(e)} />, - handleChange(e)} /> - ); - break; case 'Slider': DialogControls.push( handleChange(e)} />, diff --git a/src/widget/widget-factory.js b/src/widget/widget-factory.js index 4586464..1360988 100644 --- a/src/widget/widget-factory.js +++ b/src/widget/widget-factory.js @@ -105,17 +105,6 @@ class WidgetFactory { widget.customProperties.fontColor = 0; widget.customProperties.resizeTopBottomLock = true; break; - case 'PlotTable': - widget.customProperties.ylabel = ''; - widget.minWidth = 200; - widget.minHeight = 100; - widget.width = 600; - widget.height = 300; - widget.customProperties.time = 60; - widget.customProperties.yMin = 0; - widget.customProperties.yMax = 10; - widget.customProperties.yUseMinMax = false; - break; case 'Image': widget.minWidth = 20; widget.minHeight = 20; diff --git a/src/widget/widget-toolbox.js b/src/widget/widget-toolbox.js index 820b02a..60be4af 100644 --- a/src/widget/widget-toolbox.js +++ b/src/widget/widget-toolbox.js @@ -45,7 +45,6 @@ class WidgetToolbox extends React.Component { - diff --git a/src/widget/widget.js b/src/widget/widget.js index 809c65a..11fe5c2 100644 --- a/src/widget/widget.js +++ b/src/widget/widget.js @@ -35,7 +35,6 @@ import WidgetValue from './widgets/value'; import WidgetPlot from './widgets/plot'; import WidgetTable from './widgets/table'; import WidgetLabel from './widgets/label'; -import WidgetPlotTable from './widgets/plot-table'; import WidgetImage from './widgets/image'; import WidgetButton from './widgets/button'; import WidgetInput from './widgets/input'; @@ -170,16 +169,6 @@ class Widget extends React.Component { return - } else if (widget.type === 'PlotTable') { - return this.props.onWidgetStatusChange(w, this.props.index)} - paused={this.props.paused} - /> } else if (widget.type === 'Image') { return . - ******************************************************************************/ - -import React, { Component } from 'react'; -import { FormGroup } from 'react-bootstrap'; -import Plot from '../widget-plot/plot'; -import PlotLegend from '../widget-plot/plot-legend'; - -class WidgetPlotTable extends Component { - constructor(props) { - super(props); - this.state = { - signals: [], - data: [] - }; - } - - static getDerivedStateFromProps(props, state){ - let intersection = [] - let data = []; - let signalID, sig; - for (signalID of props.widget.signalIDs) { - for (sig of props.signals) { - if (signalID === sig.id) { - intersection.push(sig); - - // sig is a selected signal, get data - // determine ID of infrastructure component related to signal (via config) - let icID = props.icIDs[sig.id] - - // distinguish between input and output signals - if (sig.direction === "out") { - if (props.data[icID] != null && props.data[icID].output != null && props.data[icID].output.values != null) { - if (props.data[icID].output.values[sig.index-1] !== undefined) { - data.push(props.data[icID].output.values[sig.index-1]); - } - } - } else if (sig.direction === "in") { - if (props.data[icID] != null && props.data[icID].input != null && props.data[icID].input.values != null) { - if (props.data[icID].input.values[sig.index-1] !== undefined) { - data.push(props.data[icID].input.values[sig.index-1]); - } - } - } - } // sig is selected signal - } // loop over props.signals - } // loop over selected signals - - return {signals: intersection, data: data} - } - - // updateSignalSelection(signal, checked) { - // // Update the selected signals and propagate to parent component - // var new_widget = Object.assign({}, this.props.widget, { - // checkedSignals: checked ? this.state.signals.concat(signal) : this.state.signals.filter((idx) => idx !== signal) - // }); - // this.props.onWidgetChange(new_widget); - // } - - render() { - let checkBoxes = []; - - let showLegend = false; - if (this.state.signals.length > 0) { - - showLegend = true; - - // Create checkboxes using the signal indices from component config - // checkBoxes = this.state.signals.map((signal) => { - // let checked = this.state.signals.indexOf(signal) > -1; - // let chkBxClasses = classNames({ - // 'btn': true, - // 'btn-default': true, - // 'active': checked - // }); - // return this.updateSignalSelection(signal, e.target.checked)}> {signal.name} - // }); - } - - return ( -
    -
    -
    -
    - {checkBoxes.length > 0 ? ( - - {checkBoxes} - - ) : (Use edit menu to change selected signals.) - } -
    - -
    - -
    -
    - {showLegend ? ( - ) : (
    ) - } -
    -
    - ); - } -} -export default WidgetPlotTable; From b07a804bf3a15d6dcd047a8ab9d86b4dbb6af983 Mon Sep 17 00:00:00 2001 From: Sonja Happ Date: Fri, 19 Jun 2020 09:51:25 +0200 Subject: [PATCH 246/391] Consider signal direction when connecting signals with widgets (out signals only for display widgets and in signals only for manipulation widgets) #218 --- .../edit-widget/edit-widget-control-creator.js | 18 +++++++++--------- .../edit-widget/edit-widget-signal-control.js | 10 ++++++---- .../edit-widget/edit-widget-signals-control.js | 16 +++++++++++++--- 3 files changed, 28 insertions(+), 16 deletions(-) diff --git a/src/widget/edit-widget/edit-widget-control-creator.js b/src/widget/edit-widget/edit-widget-control-creator.js index 90ded85..1b2f996 100644 --- a/src/widget/edit-widget/edit-widget-control-creator.js +++ b/src/widget/edit-widget/edit-widget-control-creator.js @@ -47,20 +47,20 @@ export default function CreateControls(widgetType = null, widget = null, session break; case 'Action': DialogControls.push( - handleChange(e)} />, + handleChange(e)} direction={'in'} />, ); break; case 'Value': DialogControls.push( handleChange(e)} />, - handleChange(e)} />, + handleChange(e)} direction={'out'}/>, handleChange(e)} />, handleChange(e)} /> ); break; case 'Lamp': DialogControls.push( - handleChange(e)} />, + handleChange(e)} direction={'out'}/>, handleChange(e)} />, handleChange(e)} />, handleChange(e)} />, @@ -69,14 +69,14 @@ export default function CreateControls(widgetType = null, widget = null, session case 'Plot': DialogControls.push( handleChange(e)} />, - handleChange(e)} />, + handleChange(e)} direction={'out'}/>, handleChange(e)} />, handleChange(e)} /> ); break; case 'Table': DialogControls.push( - handleChange(e)} />, + handleChange(e)} direction={'out'}/>, handleChange(e)} /> ); break; @@ -91,7 +91,7 @@ export default function CreateControls(widgetType = null, widget = null, session case 'Gauge': DialogControls.push( handleChange(e)} />, - handleChange(e)} />, + handleChange(e)} direction={'out'}/>, handleChange(e)} />, handleChange(e)} />, handleChange(e)} /> @@ -101,7 +101,7 @@ export default function CreateControls(widgetType = null, widget = null, session DialogControls.push( handleChange(e)} />, handleChange(e)} />, - handleChange(e)} />, + handleChange(e)} direction={'in'}/>, handleChange(e)} />, handleChange(e)} />, handleChange(e)} />, @@ -112,7 +112,7 @@ export default function CreateControls(widgetType = null, widget = null, session case 'Button': DialogControls.push( handleChange(e)} />, - handleChange(e)} />, + handleChange(e)} direction={'in'}/>, handleChange(e)} />, handleChange(e)} />, handleChange(e)} /> @@ -148,7 +148,7 @@ export default function CreateControls(widgetType = null, widget = null, session case 'NumberInput': DialogControls.push( handleChange(e)} />, - handleChange(e)} />, + handleChange(e)} direction={'in'}/>, handleChange(e)} /> ); break; diff --git a/src/widget/edit-widget/edit-widget-signal-control.js b/src/widget/edit-widget/edit-widget-signal-control.js index aaa9c24..cc9135d 100644 --- a/src/widget/edit-widget/edit-widget-signal-control.js +++ b/src/widget/edit-widget/edit-widget-signal-control.js @@ -23,13 +23,15 @@ class EditWidgetSignalControl extends Component { super(props); this.state = { - widget: {} + widget: {}, + signals: [] }; } static getDerivedStateFromProps(props, state){ return { - widget: props.widget + widget: props.widget, + signals: props.signals.filter(s => s.direction === props.direction) }; } @@ -51,10 +53,10 @@ class EditWidgetSignalControl extends Component { this.handleSignalChange(e)}> { - this.props.signals.length === 0 ? ( + this.state.signals.length === 0 ? ( ) : ( - this.props.signals.map((signal, index) => ( + this.state.signals.map((signal, index) => ( )) ) diff --git a/src/widget/edit-widget/edit-widget-signals-control.js b/src/widget/edit-widget/edit-widget-signals-control.js index 109df2e..ad4658b 100644 --- a/src/widget/edit-widget/edit-widget-signals-control.js +++ b/src/widget/edit-widget/edit-widget-signals-control.js @@ -23,7 +23,17 @@ class EditWidgetSignalsControl extends Component { super(props); this.state = { + widget: {}, + signals: [], + checkedSignals: props.widget[props.controlId] + }; + } + + + static getDerivedStateFromProps(props, state){ + return { widget: props.widget, + signals: props.signals.filter(s => s.direction === props.direction), checkedSignals: props.widget[props.controlId] }; } @@ -48,10 +58,10 @@ class EditWidgetSignalsControl extends Component { Signals { - this.props.signals === 0 || !this.state.widget.hasOwnProperty(this.props.controlId)? ( + this.state.signals === 0 || !this.state.widget.hasOwnProperty(this.props.controlId)? ( No signals available ) : ( - this.props.signals.map((signal, index) => ( + this.state.signals.map((signal, index) => ( this.handleSignalChange(e.target.checked, signal.id)}> )) - ) + ) } ); From 622a5d3f22434924cd6217c9f580828f064bc829 Mon Sep 17 00:00:00 2001 From: Sonja Happ Date: Fri, 19 Jun 2020 15:13:33 +0200 Subject: [PATCH 247/391] fixes for color control, selected color is now checked --- .../edit-widget/edit-widget-color-control.js | 11 ++++++++- .../edit-widget-control-creator.js | 2 +- .../edit-widget/edit-widget-number-control.js | 23 ++++++++++++++----- 3 files changed, 28 insertions(+), 8 deletions(-) diff --git a/src/widget/edit-widget/edit-widget-color-control.js b/src/widget/edit-widget/edit-widget-color-control.js index c031597..2158a55 100644 --- a/src/widget/edit-widget/edit-widget-color-control.js +++ b/src/widget/edit-widget/edit-widget-color-control.js @@ -75,7 +75,16 @@ class EditWidgetColorControl extends Component { 'checked': idx === (isCustomProperty ? this.state.widget[parts[0]][parts[1]] : this.state.widget[this.props.controlId]) }); - return ( this.props.handleChange({target: { id: this.props.controlId, value: idx}})} />) + return ( this.props.handleChange({target: { id: this.props.controlId, value: idx}})} />) } ) } diff --git a/src/widget/edit-widget/edit-widget-control-creator.js b/src/widget/edit-widget/edit-widget-control-creator.js index 1b2f996..2b656dc 100644 --- a/src/widget/edit-widget/edit-widget-control-creator.js +++ b/src/widget/edit-widget/edit-widget-control-creator.js @@ -122,7 +122,7 @@ export default function CreateControls(widgetType = null, widget = null, session DialogControls.push( handleChange(e)} />, handleChange(e)} />, - handleChange(e)} /> + handleChange(e)} /> ); break; case 'Label': diff --git a/src/widget/edit-widget/edit-widget-number-control.js b/src/widget/edit-widget/edit-widget-number-control.js index 5354863..3b3101f 100644 --- a/src/widget/edit-widget/edit-widget-number-control.js +++ b/src/widget/edit-widget/edit-widget-number-control.js @@ -25,25 +25,36 @@ class EditWidgetNumberControl extends Component { this.state = { widget: { customProperties:{} - } + } }; } - + static getDerivedStateFromProps(props, state){ return{ - widget: props.widget + widget: props.widget }; - } + } render() { let step = 1; if(this.props.controlId ==='customProperties.background_color_opacity'){ step = 0.1; - } + } + + let parts = this.props.controlId.split('.'); + let isCustomProperty = true; + if (parts.length === 1){ + isCustomProperty = false; + } + return ( {this.props.label} - this.props.handleChange(e)} /> + this.props.handleChange(e)} /> ); } From da74f199f721c953dee42ab64e004d293ddaf06d Mon Sep 17 00:00:00 2001 From: irismarie Date: Fri, 19 Jun 2020 15:30:50 +0200 Subject: [PATCH 248/391] input user to add in text field --- src/scenario/scenario-store.js | 11 +-- src/scenario/scenario.js | 131 ++++++++++++++------------------- 2 files changed, 63 insertions(+), 79 deletions(-) diff --git a/src/scenario/scenario-store.js b/src/scenario/scenario-store.js index 9cfc16b..92edbdd 100644 --- a/src/scenario/scenario-store.js +++ b/src/scenario/scenario-store.js @@ -39,8 +39,9 @@ class ScenarioStore extends ArrayStore{ } /* store functions, called when calls to backend have returned */ + // save users after they are loaded ('getUsers' call) - saveUsers(state, action) { + storeUsers(state, action) { let scenarioID = action.scenarioID; state.forEach((element, index, array) => { if (element.id === scenarioID) { @@ -52,7 +53,7 @@ class ScenarioStore extends ArrayStore{ } // save new user after it was added to scenario ('addUser' call) - saveUser(state, action) { + storeUser(state, action) { let scenarioID = action.scenarioID; state.forEach((element, index, array) => { if (element.id === scenarioID) { @@ -71,8 +72,8 @@ class ScenarioStore extends ArrayStore{ const userindex = array[index]["users"].indexOf(action.user); if (index > -1) { array[index]["users"].splice(userindex, 1); + this.__emitChange(); } - this.__emitChange(); return state; } }) @@ -112,10 +113,10 @@ class ScenarioStore extends ArrayStore{ } case 'scenarios/users': - return this.saveUsers(state, action); + return this.storeUsers(state, action); case 'scenarios/user-added': - return this.saveUser(state, action); + return this.storeUser(state, action); case 'scenarios/user-deleted': return this.removeUser(state, action); diff --git a/src/scenario/scenario.js b/src/scenario/scenario.js index 706b0c2..4053023 100644 --- a/src/scenario/scenario.js +++ b/src/scenario/scenario.js @@ -17,11 +17,11 @@ import React from 'react'; import { Container } from 'flux/utils'; -import { Button, DropdownButton, Dropdown } from 'react-bootstrap'; +import { Button, InputGroup, FormControl } from 'react-bootstrap'; + import FileSaver from 'file-saver'; import ScenarioStore from './scenario-store'; -//import ScenariosDataManager from './scenarios-data-manager'; import ICStore from '../ic/ic-store'; import DashboardStore from '../dashboard/dashboard-store'; import ConfigStore from '../componentconfig/config-store'; @@ -42,21 +42,18 @@ import EditConfigDialog from "../componentconfig/edit-config"; import EditSignalMapping from "../signal/edit-signal-mapping"; import FileStore from "../file/file-store" import WidgetStore from "../widget/widget-store"; -import UsersStore from '../user/users-store'; class Scenario extends React.Component { static getStores() { - return [ ScenarioStore, ConfigStore, DashboardStore, ICStore, LoginStore, SignalStore, FileStore, WidgetStore, UsersStore]; + return [ScenarioStore, ConfigStore, DashboardStore, ICStore, LoginStore, SignalStore, FileStore, WidgetStore]; } static calculateState(prevState, props) { // get selected scenario const sessionToken = LoginStore.getState().token; - - let users = null; const scenario = ScenarioStore.getState().find(s => s.id === parseInt(props.match.params.scenario, 10)); if (scenario == null) { AppDispatcher.dispatch({ @@ -65,15 +62,6 @@ class Scenario extends React.Component { token: sessionToken }); } - else { - users = scenario.users; - } - - let allUsers = UsersStore.getState(); - let allUserNames = []; - allUsers.forEach((user) => { - allUserNames.push(user.username); - }); // obtain all dashboards of a scenario let dashboards = DashboardStore.getState().filter(dashb => dashb.scenarioID === parseInt(props.match.params.scenario, 10)); @@ -87,12 +75,8 @@ class Scenario extends React.Component { let signals = SignalStore.getState(); - return { scenario, - users, - allUsers, - allUserNames, sessionToken, configs, dashboards, @@ -115,7 +99,6 @@ class Scenario extends React.Component { importDashboardModal: false, modalDashboardData: {}, - addUserModal: false, deleteUserName: '', deleteUserModal: false, } @@ -136,22 +119,18 @@ class Scenario extends React.Component { type: 'ics/start-load', token: this.state.sessionToken }); - - // load users - AppDispatcher.dispatch({ - type: 'users/start-load', - token: this.state.sessionToken - }); } - // add User to Scenario - addUser(userindex) { - let username = this.state.allUserNames[userindex]; - ScenarioStore.addUser(this.state.sessionToken, this.state.scenario.id, username); + /* ############################################## + * User modification methods + ############################################## */ + + addUser() { + ScenarioStore.addUser(this.state.sessionToken, this.state.scenario.id, this.userToAdd); } closeDeleteUserModal() { - this.setState({deleteUserModal: false}); + this.setState({ deleteUserModal: false }); ScenarioStore.deleteUser(this.state.sessionToken, this.state.scenario.id, this.state.deleteUserName); } @@ -159,7 +138,7 @@ class Scenario extends React.Component { * Component Configuration modification methods ############################################## */ - addConfig(){ + addConfig() { const config = { scenarioID: this.state.scenario.id, name: 'New Component Configuration', @@ -175,8 +154,8 @@ class Scenario extends React.Component { } - closeEditConfigModal(data){ - this.setState({ editConfigModal : false }); + closeEditConfigModal(data) { + this.setState({ editConfigModal: false }); if (data) { AppDispatcher.dispatch({ @@ -201,7 +180,7 @@ class Scenario extends React.Component { }); } - importConfig(data){ + importConfig(data) { this.setState({ importConfigModal: false }); if (data == null) { @@ -303,7 +282,7 @@ class Scenario extends React.Component { getICName(icID) { for (let ic of this.state.ics) { if (ic.id === icID) { - return ic.name || ic.uuid; + return ic.name || ic.uuid; } } } @@ -313,7 +292,7 @@ class Scenario extends React.Component { ############################################## */ closeNewDashboardModal(data) { - this.setState({ newDashboardModal : false }); + this.setState({ newDashboardModal: false }); if (data) { let newDashboard = data; // add default grid value and scenarioID @@ -328,7 +307,7 @@ class Scenario extends React.Component { } } - closeDeleteDashboardModal(confirmDelete){ + closeDeleteDashboardModal(confirmDelete) { this.setState({ deleteDashboardModal: false }); if (confirmDelete === false) { @@ -379,9 +358,9 @@ class Scenario extends React.Component { * Signal modification methods ############################################## */ - closeDeleteSignalModal(data){ + closeDeleteSignalModal(data) { // data contains the signal to be deleted - if (data){ + if (data) { AppDispatcher.dispatch({ type: 'signals/start-remove', @@ -392,7 +371,7 @@ class Scenario extends React.Component { } } - closeNewSignalModal(data){ + closeNewSignalModal(data) { //data contains the new signal incl. configID and direction if (data) { AppDispatcher.dispatch({ @@ -403,17 +382,17 @@ class Scenario extends React.Component { } } - closeEditSignalsModal(data, direction){ + closeEditSignalsModal(data, direction) { - if( direction === "in") { - this.setState({editInputSignalsModal: false}); - } else if( direction === "out"){ - this.setState({editOutputSignalsModal: false}); + if (direction === "in") { + this.setState({ editInputSignalsModal: false }); + } else if (direction === "out") { + this.setState({ editOutputSignalsModal: false }); } else { return; // no valid direction } - if (data){ + if (data) { //data is an array of signals for (let sig of data) { //dispatch changes to signals @@ -431,7 +410,7 @@ class Scenario extends React.Component { * File modification methods ############################################## */ - getFileName(id){ + getFileName(id) { for (let file of this.state.files) { if (file.id === id) { return file.name; @@ -454,38 +433,42 @@ class Scenario extends React.Component { {/*Scenario Users table*/}

    Users

    - - - - this.setState({ deleteUserModal: true, deleteUserName: this.state.users[index].username, modalUserIndex: index })} +
    +
    + + + this.setState({ deleteUserModal: true, deleteUserName: this.state.scenario.users[index].username, modalUserIndex: index })} /> -
    + -
    - this.addUser(index)} - > - {this.state.allUserNames.map((opt,i) => ( - - {opt} - - ))} - + + this.userToAdd = e.target.value} + /> + + + +
    this.closeDeleteUserModal(c)} /> + {/*Component Configurations table*/}

    Component Configurations

    this.onConfigChecked(index, event)} width='30' /> - this.getFileName(selectedFileID)}/> + this.getFileName(selectedFileID)} /> + ]} />
    @@ -557,7 +540,7 @@ class Scenario extends React.Component { onDelete={(data) => this.closeDeleteSignalModal(data)} direction="Input" signals={this.state.signals} - configID={this.state.modalConfigData.id}/> + configID={this.state.modalConfigData.id} /> {/*Dashboard table*/}

    Dashboards

    @@ -581,10 +564,10 @@ class Scenario extends React.Component {
    - this.closeNewDashboardModal(data)}/> - this.closeImportDashboardModal(data)} /> + this.closeNewDashboardModal(data)} /> + this.closeImportDashboardModal(data)} /> - this.closeDeleteDashboardModal(e)}/> + this.closeDeleteDashboardModal(e)} />
    ; From d8fdf33dbcecb204249d6f2e8856beb0187be293 Mon Sep 17 00:00:00 2001 From: Laura Fuentes Grau Date: Sun, 21 Jun 2020 16:43:21 +0200 Subject: [PATCH 249/391] Fix for edit files: table now has a fixed layout/ doesn't protrude out from dialog and close/cancel button closes dialog #219 --- src/dashboard/dashboard.js | 2 +- src/file/edit-files.js | 21 ++++++++++++--------- src/styles/app.css | 21 +++++++++++++++++++++ 3 files changed, 34 insertions(+), 10 deletions(-) diff --git a/src/dashboard/dashboard.js b/src/dashboard/dashboard.js index cf4e656..5000ede 100644 --- a/src/dashboard/dashboard.js +++ b/src/dashboard/dashboard.js @@ -273,7 +273,7 @@ class Dashboard extends Component { } closeEditFiles(){ - + this.setState({ filesEditModal: false }); // TODO do we need this if the dispatches happen in the dialog? } diff --git a/src/file/edit-files.js b/src/file/edit-files.js index 4df19d5..047c2da 100644 --- a/src/file/edit-files.js +++ b/src/file/edit-files.js @@ -38,7 +38,7 @@ class EditFilesDialog extends React.Component { onClose(canceled) { if (canceled === false) { - if (this.validChanges()) { + if (true) { this.props.onClose(); } } else { @@ -64,6 +64,7 @@ class EditFilesDialog extends React.Component { scenarioID: this.props.scenarioID, }); + this.setState({ uploadFile: null }); // TODO make sure that dialog remains open after clicking "Upload" button }; @@ -118,21 +119,23 @@ class EditFilesDialog extends React.Component { }; return ( - + this.onClose(c)} valid={true}>
    -
    - - - - + +
    +
    + + + + this.deleteFile(index)} />
    - +
    Date: Sun, 21 Jun 2020 17:57:35 +0200 Subject: [PATCH 250/391] Fix for edit files: dialog now stays open after adding/deleting file, cancel button deleted #219 --- src/common/dialogs/dialog.js | 2 +- src/dashboard/dashboard.js | 2 +- src/file/edit-files.js | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/common/dialogs/dialog.js b/src/common/dialogs/dialog.js index cc387d9..9b3a2c8 100644 --- a/src/common/dialogs/dialog.js +++ b/src/common/dialogs/dialog.js @@ -56,7 +56,7 @@ class Dialog extends React.Component { - + {this.props.blendOutCancel?
    : }
    diff --git a/src/dashboard/dashboard.js b/src/dashboard/dashboard.js index 5000ede..874eb10 100644 --- a/src/dashboard/dashboard.js +++ b/src/dashboard/dashboard.js @@ -122,7 +122,7 @@ class Dashboard extends Component { paused: prevState.paused || false, editModal: false, - filesEditModal: false, + filesEditModal: prevState.filesEditModal || false, filesEditSaveState: prevState.filesEditSaveState || [], modalData: null, modalIndex: null, diff --git a/src/file/edit-files.js b/src/file/edit-files.js index 047c2da..c47c733 100644 --- a/src/file/edit-files.js +++ b/src/file/edit-files.js @@ -119,7 +119,7 @@ class EditFilesDialog extends React.Component { }; return ( - this.onClose(c)} valid={true}> + this.onClose(c)} blendOutCancel = {true} valid={true}>
    From eb1756852b77b90a27cc8052ae9537ed9c66726b Mon Sep 17 00:00:00 2001 From: Sonja Happ Date: Tue, 23 Jun 2020 09:34:33 +0200 Subject: [PATCH 251/391] Modify send command to IC buttons (point 1 of #225) --- src/ic/ic-action.js | 3 ++- src/scenario/scenario.js | 21 ++++++++++++++++----- 2 files changed, 18 insertions(+), 6 deletions(-) diff --git a/src/ic/ic-action.js b/src/ic/ic-action.js index 4e787af..6a9e591 100644 --- a/src/ic/ic-action.js +++ b/src/ic/ic-action.js @@ -55,11 +55,12 @@ class ICAction extends React.Component { )); return
    + Send command to infrastructure component {actionList} - +
    ; diff --git a/src/scenario/scenario.js b/src/scenario/scenario.js index 0e4b9ed..e7cd701 100644 --- a/src/scenario/scenario.js +++ b/src/scenario/scenario.js @@ -234,12 +234,18 @@ class Scenario extends React.Component { this.setState({ selectedConfigs: selectedConfigs }); } - runAction = action => { + runAction(action) { + + if(action.data.action === 'none'){ + console.warn("No command selected. Nothing was sent."); + return; + } + for (let index of this.state.selectedConfigs) { // get IC for component config let ic = null; for (let component of this.state.ics) { - if (component._id === this.state.configs[index].icID) { + if (component.id === this.state.configs[index].icID) { ic = component; } } @@ -410,11 +416,15 @@ class Scenario extends React.Component { marginLeft: '10px' }; + const tableHeadingStyle = { + paddingTop: '30px' + } + return

    {this.state.scenario.name}

    {/*Component Configurations table*/} -

    Component Configurations

    +

    Component Configurations

    this.onConfigChecked(index, event)} width='30' /> @@ -447,8 +457,9 @@ class Scenario extends React.Component {
    this.runAction(action)} actions={[ + { id: '-1', title: 'Select command', data: { action: 'none' } }, { id: '0', title: 'Start', data: { action: 'start' } }, { id: '1', title: 'Stop', data: { action: 'stop' } }, { id: '2', title: 'Pause', data: { action: 'pause' } }, @@ -493,7 +504,7 @@ class Scenario extends React.Component { configID={this.state.modalConfigData.id}/> {/*Dashboard table*/} -

    Dashboards

    +

    Dashboards

    From 24650a0b08c8f49df62cccfddfe5e5e63287f755 Mon Sep 17 00:00:00 2001 From: Sonja Happ Date: Tue, 23 Jun 2020 09:37:08 +0200 Subject: [PATCH 252/391] fix endpoint for sending commands to ICs --- src/ic/ics-data-manager.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ic/ics-data-manager.js b/src/ic/ics-data-manager.js index 73d3e91..2925b1b 100644 --- a/src/ic/ics-data-manager.js +++ b/src/ic/ics-data-manager.js @@ -26,7 +26,7 @@ class IcsDataManager extends RestDataManager { doActions(ic, action, token = null) { // TODO: Make only infrastructure component id dependent - RestAPI.post(this.makeURL(this.url + '/' + ic.id), action, token).then(response => { + RestAPI.post(this.makeURL(this.url + '/' + ic.id + '/action'), action, token).then(response => { AppDispatcher.dispatch({ type: 'ics/action-started', data: response From b00912488252d6b324d81367e8358ddc9f334dc0 Mon Sep 17 00:00:00 2001 From: Sonja Happ Date: Tue, 23 Jun 2020 09:39:08 +0200 Subject: [PATCH 253/391] remove todo --- src/ic/ics-data-manager.js | 1 - 1 file changed, 1 deletion(-) diff --git a/src/ic/ics-data-manager.js b/src/ic/ics-data-manager.js index 2925b1b..89455c3 100644 --- a/src/ic/ics-data-manager.js +++ b/src/ic/ics-data-manager.js @@ -25,7 +25,6 @@ class IcsDataManager extends RestDataManager { } doActions(ic, action, token = null) { - // TODO: Make only infrastructure component id dependent RestAPI.post(this.makeURL(this.url + '/' + ic.id + '/action'), action, token).then(response => { AppDispatcher.dispatch({ type: 'ics/action-started', From ea5311a43b1fcd5ee571907a01f349d519c97028 Mon Sep 17 00:00:00 2001 From: Sonja Happ Date: Tue, 23 Jun 2020 11:28:08 +0200 Subject: [PATCH 254/391] remove todos --- src/file/edit-files.js | 4 ---- 1 file changed, 4 deletions(-) diff --git a/src/file/edit-files.js b/src/file/edit-files.js index c47c733..4f3c8a7 100644 --- a/src/file/edit-files.js +++ b/src/file/edit-files.js @@ -65,7 +65,6 @@ class EditFilesDialog extends React.Component { }); this.setState({ uploadFile: null }); - // TODO make sure that dialog remains open after clicking "Upload" button }; updateUploadProgress = (event) => { @@ -93,9 +92,6 @@ class EditFilesDialog extends React.Component { data: file, token: this.props.sessionToken }); - - // TODO make sure that dialog remains open after clicking delete button - } From ef1d960cd48abbb9f39263ae1a92a445f278ea73 Mon Sep 17 00:00:00 2001 From: Sonja Happ Date: Tue, 23 Jun 2020 11:48:37 +0200 Subject: [PATCH 255/391] improve signal mapping dialog (point 2 of #225) --- src/scenario/scenario.js | 68 +++++---------------- src/signal/edit-signal-mapping.js | 99 ++++++++++++++++--------------- 2 files changed, 66 insertions(+), 101 deletions(-) diff --git a/src/scenario/scenario.js b/src/scenario/scenario.js index e7cd701..3e2d7cd 100644 --- a/src/scenario/scenario.js +++ b/src/scenario/scenario.js @@ -49,6 +49,10 @@ class Scenario extends React.Component { } static calculateState(prevState, props) { + if (prevState == null) { + prevState = {}; + } + // get selected scenario const sessionToken = LoginStore.getState().token; @@ -86,12 +90,12 @@ class Scenario extends React.Component { deleteConfigModal: false, importConfigModal: false, editConfigModal: false, - modalConfigData: {}, + modalConfigData: (prevState.modalConfigData !== {} && prevState.modalConfigData !== undefined )? prevState.modalConfigData : {}, selectedConfigs: [], modalConfigIndex: 0, - editOutputSignalsModal: false, - editInputSignalsModal: false, + editOutputSignalsModal: prevState.editOutputSignalsModal || false, + editInputSignalsModal: prevState.editInputSignalsModal || false, newDashboardModal: false, deleteDashboardModal: false, @@ -346,52 +350,12 @@ class Scenario extends React.Component { * Signal modification methods ############################################## */ - closeDeleteSignalModal(data){ - // data contains the signal to be deleted - if (data){ - - AppDispatcher.dispatch({ - type: 'signals/start-remove', - data: data, - token: this.state.sessionToken - }); - - } - } - - closeNewSignalModal(data){ - //data contains the new signal incl. configID and direction - if (data) { - AppDispatcher.dispatch({ - type: 'signals/start-add', - data: data, - token: this.state.sessionToken - }); - } - } - - closeEditSignalsModal(data, direction){ - + closeEditSignalsModal(direction){ if( direction === "in") { this.setState({editInputSignalsModal: false}); } else if( direction === "out"){ this.setState({editOutputSignalsModal: false}); - } else { - return; // no valid direction } - - if (data){ - //data is an array of signals - for (let sig of data) { - //dispatch changes to signals - AppDispatcher.dispatch({ - type: 'signals/start-edit', - data: sig, - token: this.state.sessionToken, - }); - } - } - } /* ############################################## @@ -488,20 +452,20 @@ class Scenario extends React.Component { this.closeEditSignalsModal(data, direction)} - onAdd={(data) => this.closeNewSignalModal(data)} - onDelete={(data) => this.closeDeleteSignalModal(data)} + onCloseEdit={(direction) => this.closeEditSignalsModal(direction)} direction="Output" signals={this.state.signals} - configID={this.state.modalConfigData.id} /> + configID={this.state.modalConfigData.id} + sessionToken={this.state.sessionToken} + /> this.closeEditSignalsModal(data, direction)} - onAdd={(data) => this.closeNewSignalModal(data)} - onDelete={(data) => this.closeDeleteSignalModal(data)} + onCloseEdit={(direction) => this.closeEditSignalsModal(direction)} direction="Input" signals={this.state.signals} - configID={this.state.modalConfigData.id}/> + configID={this.state.modalConfigData.id} + sessionToken={this.state.sessionToken} + /> {/*Dashboard table*/}

    Dashboards

    diff --git a/src/signal/edit-signal-mapping.js b/src/signal/edit-signal-mapping.js index 0bfac11..178194f 100644 --- a/src/signal/edit-signal-mapping.js +++ b/src/signal/edit-signal-mapping.js @@ -18,35 +18,29 @@ import React from 'react'; import PropTypes from 'prop-types'; import {Button, FormGroup, FormLabel, FormText} from 'react-bootstrap'; - import Table from '../common/table'; import TableColumn from '../common/table-column'; import Dialog from "../common/dialogs/dialog"; - -import SignalStore from "./signal-store" import Icon from "../common/icon"; +import AppDispatcher from "../common/app-dispatcher"; class EditSignalMapping extends React.Component { - valid = false; - - static getStores() { - return [ SignalStore]; - } constructor(props) { - super(props); + super(props); - let dir = ""; - if ( this.props.direction === "Output"){ - dir = "out"; - } else if ( this.props.direction === "Input" ){ - dir = "in"; - } + let dir = ""; + if ( this.props.direction === "Output"){ + dir = "out"; + } else if ( this.props.direction === "Input" ){ + dir = "in"; + } - this.state = { - dir, - signals: [], - }; + + this.state = { + dir, + signals: [] + }; } static getDerivedStateFromProps(props, state){ @@ -63,55 +57,52 @@ class EditSignalMapping extends React.Component { onClose(canceled) { - if (canceled === false) { - if (this.valid) { - let data = this.state.signals; - - //forward modified signals back to callback function - this.props.onCloseEdit(data, this.state.dir) - } - } else { - this.props.onCloseEdit(null, this.state.dir); - } - } - - onDelete(e){ - console.log("On signal delete"); + this.props.onCloseEdit(this.state.dir) } - handleMappingChange = (event, row, column) => { const signals = this.state.signals; + let sig = {} if (column === 1) { // Name change if (event.target.value !== '') { - signals[row].name = event.target.value; - this.setState({signals: signals}); - this.valid = true; + sig = this.state.signals[row]; + sig.name = event.target.value; } } else if (column === 2) { // unit change if (event.target.value !== '') { - signals[row].unit = event.target.value; - this.setState({signals: signals}); - this.valid = true; + sig = this.state.signals[row]; + sig.unit = event.target.value; } } else if (column === 0) { //index change - - signals[row].index = parseInt(event.target.value, 10); - this.setState({signals: signals}); - this.valid = true; + sig = this.state.signals[row]; + sig.index = parseInt(event.target.value, 10); } + + if (sig !== {}){ + //dispatch changes to signal + AppDispatcher.dispatch({ + type: 'signals/start-edit', + data: sig, + token: this.props.sessionToken, + }); + } + }; handleDelete = (index) => { let data = this.state.signals[index] - this.props.onDelete(data); + + AppDispatcher.dispatch({ + type: 'signals/start-remove', + data: data, + token: this.props.sessionToken + }); }; handleAdd = () => { - console.log("add signal"); let newSignal = { configID: this.props.configID, @@ -121,12 +112,15 @@ class EditSignalMapping extends React.Component { index: 999 }; - this.props.onAdd(newSignal) + AppDispatcher.dispatch({ + type: 'signals/start-add', + data: newSignal, + token: this.props.sessionToken + }); }; resetState() { - this.valid=false; let signals = this.props.signals.filter((sig) => { return (sig.configID === this.props.configID) && (sig.direction === this.state.dir); @@ -143,7 +137,14 @@ class EditSignalMapping extends React.Component { return( - this.onClose(c)} onReset={() => this.resetState()} valid={this.valid}> + this.onClose(c)} + onReset={() => this.resetState()} + valid={true}> {this.props.direction} Mapping From 5ea80ae44d32a8965be1b3b9ae2c4b680638edfb Mon Sep 17 00:00:00 2001 From: Sonja Happ Date: Tue, 23 Jun 2020 11:51:18 +0200 Subject: [PATCH 256/391] remove unused variable --- src/signal/edit-signal-mapping.js | 1 - 1 file changed, 1 deletion(-) diff --git a/src/signal/edit-signal-mapping.js b/src/signal/edit-signal-mapping.js index 178194f..43235bc 100644 --- a/src/signal/edit-signal-mapping.js +++ b/src/signal/edit-signal-mapping.js @@ -61,7 +61,6 @@ class EditSignalMapping extends React.Component { } handleMappingChange = (event, row, column) => { - const signals = this.state.signals; let sig = {} if (column === 1) { // Name change From 85390df0b8c0ec64d09e02c98b6154fa8203782f Mon Sep 17 00:00:00 2001 From: Sonja Happ Date: Tue, 23 Jun 2020 15:04:36 +0200 Subject: [PATCH 257/391] fix labelManipulation function of ICs (naming of labels changed with transition to bootstrap 4.5), state now showing colored. --- src/common/table.js | 5 ++++- src/ic/ics.js | 23 ++++++++++++----------- src/styles/app.css | 2 +- 3 files changed, 17 insertions(+), 13 deletions(-) diff --git a/src/common/table.js b/src/common/table.js index 020f9bd..6ffd303 100644 --- a/src/common/table.js +++ b/src/common/table.js @@ -85,15 +85,18 @@ class CustomTable extends Component { labelContent = child.props.labelModifier(labelContent, data); } + let labelStyle = child.props.labelStyle(data[labelKey], data) + cell.push(   - + {labelContent.toString()} ); } + if (child.props.dataIndex) { cell.push(index); } diff --git a/src/ic/ics.js b/src/ic/ics.js index 603e474..e24cd93 100644 --- a/src/ic/ics.js +++ b/src/ic/ics.js @@ -220,39 +220,40 @@ class InfrastructureComponents extends Component { return Date.now() - new Date(component.stateUpdatedAt) > fiveMinutes; } - static stateLabelStyle(state, component){ - var style = [ 'label' ]; + stateLabelStyle(state, component){ + + var style = [ 'badge' ]; if (InfrastructureComponents.isICOutdated(component) && state !== 'shutdown') { - style.push('label-outdated'); + style.push('badge-outdated'); } switch (state) { case 'running': - style.push('label-success'); + style.push('badge-success'); break; case 'paused': - style.push('label-info'); + style.push('badge-info'); break; case 'idle': - style.push('label-primary'); + style.push('badge-primary'); break; case 'error': - style.push('label-danger'); + style.push('badge-danger'); break; case 'shutdown': - style.push('label-warning'); + style.push('badge-warning'); break; default: - style.push('label-default'); + style.push('badge-default'); } - return style.join(' '); + return style.join(' ') } static stateUpdateModifier(updatedAt) { @@ -273,7 +274,7 @@ class InfrastructureComponents extends Component {
    this.onICChecked(index, event)} width='30' /> - + this.stateLabelStyle(state, component)} /> diff --git a/src/styles/app.css b/src/styles/app.css index e51cf0c..97c6548 100644 --- a/src/styles/app.css +++ b/src/styles/app.css @@ -400,6 +400,6 @@ body { margin-right: 0 !important; } -.label-outdated { +.badge-outdated { opacity: 0.4; } From 78942826182bdfc476b5c72154c7f06fac38e6ad Mon Sep 17 00:00:00 2001 From: Sonja Happ Date: Tue, 23 Jun 2020 15:22:25 +0200 Subject: [PATCH 258/391] show running state of scenario with icon (closes #223) --- src/common/table.js | 6 +++--- src/scenario/scenarios.js | 11 ++++++++++- 2 files changed, 13 insertions(+), 4 deletions(-) diff --git a/src/common/table.js b/src/common/table.js index 6ffd303..b4edea3 100644 --- a/src/common/table.js +++ b/src/common/table.js @@ -63,7 +63,7 @@ class CustomTable extends Component { let cell = []; if (content != null) { - content = content.toString(); + //content = content.toString(); // check if cell should be a link const linkKey = child.props.linkKey; @@ -79,7 +79,7 @@ class CustomTable extends Component { // add label to content const labelKey = child.props.labelKey; if (labelKey && data[labelKey] != null) { - var labelContent = data[labelKey]; + let labelContent = data[labelKey]; if (child.props.labelModifier) { labelContent = child.props.labelModifier(labelContent, data); @@ -90,7 +90,7 @@ class CustomTable extends Component { cell.push(   - {labelContent.toString()} + {labelContent} ); diff --git a/src/scenario/scenarios.js b/src/scenario/scenarios.js index 22711a7..aceca0f 100644 --- a/src/scenario/scenarios.js +++ b/src/scenario/scenarios.js @@ -214,6 +214,15 @@ class Scenarios extends Component { FileSaver.saveAs(blob, 'scenario - ' + scenario.name + '.json'); } + modifyRunningColumn(running){ + + if(running){ + return + } else { + return + } + + } render() { const buttonStyle = { @@ -227,7 +236,7 @@ class Scenarios extends Component {
    - + this.modifyRunningColumn(running)}/> Date: Tue, 23 Jun 2020 15:26:30 +0200 Subject: [PATCH 259/391] fix for running state of scenarios, show active state of users with icon instead of text. --- src/scenario/scenarios.js | 4 ++-- src/user/users.js | 14 ++++++++++++-- 2 files changed, 14 insertions(+), 4 deletions(-) diff --git a/src/scenario/scenarios.js b/src/scenario/scenarios.js index aceca0f..87aa7e5 100644 --- a/src/scenario/scenarios.js +++ b/src/scenario/scenarios.js @@ -217,9 +217,9 @@ class Scenarios extends Component { modifyRunningColumn(running){ if(running){ - return - } else { return + } else { + return } } diff --git a/src/user/users.js b/src/user/users.js index 7deb4b3..d97c539 100644 --- a/src/user/users.js +++ b/src/user/users.js @@ -122,6 +122,16 @@ class Users extends Component { } }; + modifyActiveColumn(active){ + + if(active){ + return + } else { + return + } + + } + render() { return ( @@ -132,8 +142,8 @@ class Users extends Component { - this.getHumanRoleName(role)} /> - + this.getHumanRoleName(role)} /> + this.modifyActiveColumn(active)} /> this.setState({ editModal: true, modalData: this.state.users[index] })} onDelete={index => this.setState({ deleteModal: true, modalData: this.state.users[index] })} />
    From 781f83afd37d76b16a0ddeed78a557a89a4970e0 Mon Sep 17 00:00:00 2001 From: Sonja Happ Date: Tue, 23 Jun 2020 16:43:52 +0200 Subject: [PATCH 260/391] Work on user add/remove from scenarios: use async dispatches instead of function calls; list of users updates now after adding/removing a user, a notification is shown upon error #220 --- src/scenario/scenario-store.js | 76 +++++++++-------------- src/scenario/scenario.js | 85 ++++++++++++++++---------- src/scenario/scenarios-data-manager.js | 18 +++--- src/user/login-store.js | 7 --- 4 files changed, 90 insertions(+), 96 deletions(-) diff --git a/src/scenario/scenario-store.js b/src/scenario/scenario-store.js index 92edbdd..8164229 100644 --- a/src/scenario/scenario-store.js +++ b/src/scenario/scenario-store.js @@ -18,6 +18,7 @@ import ScenariosDataManager from './scenarios-data-manager'; import ArrayStore from '../common/array-store'; +import NotificationsDataManager from "../common/data-managers/notifications-data-manager"; class ScenarioStore extends ArrayStore{ @@ -25,58 +26,18 @@ class ScenarioStore extends ArrayStore{ super('scenarios', ScenariosDataManager); } - // calls to VILLASweb backend - getUsers(token, id) { - ScenariosDataManager.getUsers(token, id); - } - - addUser(token, id, username) { - ScenariosDataManager.addUser(token, id, username); - } - - deleteUser(token, id, username) { - ScenariosDataManager.deleteUser(token, id, username); - } - - /* store functions, called when calls to backend have returned */ - + // store function, called when calls to backend have returned // save users after they are loaded ('getUsers' call) storeUsers(state, action) { let scenarioID = action.scenarioID; state.forEach((element, index, array) => { if (element.id === scenarioID) { array[index]["users"] = action.users; - this.__emitChange(); - return state; } }) - } + this.__emitChange(); + return state; - // save new user after it was added to scenario ('addUser' call) - storeUser(state, action) { - let scenarioID = action.scenarioID; - state.forEach((element, index, array) => { - if (element.id === scenarioID) { - array[index]["users"].push(action.user); - this.__emitChange(); - return state; - } - }) - } - - // remove user from ScenarioStore - removeUser(state, action) { - let scenarioID = action.scenarioID; - state.forEach((element, index, array) => { - if (element.id === scenarioID) { - const userindex = array[index]["users"].indexOf(action.user); - if (index > -1) { - array[index]["users"].splice(userindex, 1); - this.__emitChange(); - } - return state; - } - }) } reduce(state, action) { @@ -112,14 +73,33 @@ class ScenarioStore extends ArrayStore{ return super.reduce(state, action); } - case 'scenarios/users': + case 'scenarios/start-load-users': + this.dataManager.getUsers(action.token, action.data); + return super.reduce(state, action); + + case 'scenarios/users-loaded': return this.storeUsers(state, action); - case 'scenarios/user-added': - return this.storeUser(state, action); + case 'scenarios/add-user': + this.dataManager.addUser(action.token, action.data, action.username); + return super.reduce(state, action); - case 'scenarios/user-deleted': - return this.removeUser(state, action); + case 'scenarios/remove-user': + this.dataManager.deleteUser(action.token, action.data, action.username) + return super.reduce(state, action); + + case 'scenarios/users-error': + if (action.error && !action.error.handled && action.error.response) { + + const SCENARIO_USERS_ERROR_NOTIFICATION = { + title: 'Failed to modify scenario users ', + message: action.error.response.body.message, + level: 'error' + }; + NotificationsDataManager.addNotification(SCENARIO_USERS_ERROR_NOTIFICATION); + + } + return super.reduce(state, action); default: return super.reduce(state, action); diff --git a/src/scenario/scenario.js b/src/scenario/scenario.js index 5a51cad..8d3495e 100644 --- a/src/scenario/scenario.js +++ b/src/scenario/scenario.js @@ -108,7 +108,6 @@ class Scenario extends React.Component { } componentDidMount() { - ScenarioStore.getUsers(this.state.sessionToken, this.state.scenario.id); //load selected scenario AppDispatcher.dispatch({ @@ -117,6 +116,13 @@ class Scenario extends React.Component { token: this.state.sessionToken }); + + AppDispatcher.dispatch({ + type: 'scenarios/start-load-users', + data: this.state.scenario.id, + token: this.state.sessionToken + }); + // load ICs to enable that component configs and dashboards work with them AppDispatcher.dispatch({ type: 'ics/start-load', @@ -129,12 +135,23 @@ class Scenario extends React.Component { ############################################## */ addUser() { - ScenarioStore.addUser(this.state.sessionToken, this.state.scenario.id, this.userToAdd); + AppDispatcher.dispatch({ + type: 'scenarios/add-user', + data: this.state.scenario.id, + username: this.userToAdd, + token: this.state.sessionToken + }); } closeDeleteUserModal() { this.setState({ deleteUserModal: false }); - ScenarioStore.deleteUser(this.state.sessionToken, this.state.scenario.id, this.state.deleteUserName); + + AppDispatcher.dispatch({ + type: 'scenarios/remove-user', + data: this.state.scenario.id, + username: this.state.deleteUserName, + token: this.state.sessionToken + }); } /* ############################################## @@ -404,36 +421,6 @@ class Scenario extends React.Component { return

    {this.state.scenario.name}

    - {/*Scenario Users table*/} -

    Users

    -
    - - - - this.setState({ deleteUserModal: true, deleteUserName: this.state.scenario.users[index].username, modalUserIndex: index })} - /> -
    - - - this.userToAdd = e.target.value} - /> - - - -
    -
    - - this.closeDeleteUserModal(c)} /> {/*Component Configurations table*/} @@ -544,6 +531,38 @@ class Scenario extends React.Component { this.closeDeleteDashboardModal(e)} /> + {/*Scenario Users table*/} +

    Users sharing this scenario

    +
    + + + + this.setState({ deleteUserModal: true, deleteUserName: this.state.scenario.users[index].username, modalUserIndex: index })} + /> +
    + + + this.userToAdd = e.target.value} + /> + + + +

    +
    + + this.closeDeleteUserModal(c)} /> + +
    ; } } diff --git a/src/scenario/scenarios-data-manager.js b/src/scenario/scenarios-data-manager.js index bfa3422..bd89f31 100644 --- a/src/scenario/scenarios-data-manager.js +++ b/src/scenario/scenarios-data-manager.js @@ -28,9 +28,9 @@ class ScenariosDataManager extends RestDataManager { } getUsers(token, id) { - RestAPI.get(this.makeURL('/scenarios/' + id + '/users/'), token).then(response => { + RestAPI.get(this.makeURL('/scenarios/' + id + '/users'), token).then(response => { AppDispatcher.dispatch({ - type: 'scenarios/users', + type: 'scenarios/users-loaded', users: response.users, scenarioID: id }); @@ -46,10 +46,11 @@ class ScenariosDataManager extends RestDataManager { let path = id + '/user'; RestAPI.put(this.requestURL('load/add', path, '?username=' + username), null, token).then(response => { AppDispatcher.dispatch({ - type: 'scenarios/user-added', - user: response.user, - scenarioID: id + type: 'scenarios/start-load-users', + data: id, + token: token }); + }).catch(error => { AppDispatcher.dispatch({ type: 'scenarios/users-error', @@ -62,10 +63,11 @@ class ScenariosDataManager extends RestDataManager { let path = id + '/user'; RestAPI.delete(this.makeURL(this.url + '/' + path + '?username=' + username), token).then(response => { AppDispatcher.dispatch({ - type: 'scenarios/user-deleted', - user: response.user, - scenarioID: id + type: 'scenarios/start-load-users', + data: id, + token: token }); + }).catch(error => { AppDispatcher.dispatch({ type: 'scenarios/users-error', diff --git a/src/user/login-store.js b/src/user/login-store.js index c5718db..47e603d 100644 --- a/src/user/login-store.js +++ b/src/user/login-store.js @@ -79,13 +79,6 @@ class LoginStore extends ReduceStore { } return state; - case 'scenarios/users': - state.scenarioUsers = action.users; - return state; - - case 'scenarios/users-error': - return state; - default: return state; } From 9817fe32a5334e9bf76fe5587a3bc463b1affa7b Mon Sep 17 00:00:00 2001 From: Sonja Happ Date: Wed, 24 Jun 2020 09:25:26 +0200 Subject: [PATCH 261/391] update package versions --- package-lock.json | 235 +++++++++++++++++++++++----------------------- package.json | 14 +-- 2 files changed, 125 insertions(+), 124 deletions(-) diff --git a/package-lock.json b/package-lock.json index 4b0a113..56c4421 100644 --- a/package-lock.json +++ b/package-lock.json @@ -4,6 +4,11 @@ "lockfileVersion": 1, "requires": true, "dependencies": { + "@ant-design/css-animation": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/@ant-design/css-animation/-/css-animation-1.7.2.tgz", + "integrity": "sha512-bvVOe7A+r7lws58B7r+fgnQDK90cV45AXuvGx6i5CCSX1W/M3AJnHsNggDANBxEtWdNdFWcDd5LorB+RdSIlBw==" + }, "@babel/code-frame": { "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.3.tgz", @@ -1105,37 +1110,37 @@ "integrity": "sha512-ij4wRiunFfaJxjB0BdrYHIH8FxBJpOwNPhhAcunlmPdXudL1WQV1qoP9un6JsEBAgQH+7UXyyjh0g7jTxXK6tg==" }, "@fortawesome/fontawesome-common-types": { - "version": "0.2.28", - "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-common-types/-/fontawesome-common-types-0.2.28.tgz", - "integrity": "sha512-gtis2/5yLdfI6n0ia0jH7NJs5i/Z/8M/ZbQL6jXQhCthEOe5Cr5NcQPhgTvFxNOtURE03/ZqUcEskdn2M+QaBg==" + "version": "0.2.29", + "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-common-types/-/fontawesome-common-types-0.2.29.tgz", + "integrity": "sha512-cY+QfDTbZ7XVxzx7jxbC98Oxr/zc7R2QpTLqTxqlfyXDrAJjzi/xUIqAUsygELB62JIrbsWxtSRhayKFkGI7MA==" }, "@fortawesome/fontawesome-svg-core": { - "version": "1.2.28", - "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-svg-core/-/fontawesome-svg-core-1.2.28.tgz", - "integrity": "sha512-4LeaNHWvrneoU0i8b5RTOJHKx7E+y7jYejplR7uSVB34+mp3Veg7cbKk7NBCLiI4TyoWS1wh9ZdoyLJR8wSAdg==", + "version": "1.2.29", + "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-svg-core/-/fontawesome-svg-core-1.2.29.tgz", + "integrity": "sha512-xmPmP2t8qrdo8RyKihTkGb09RnZoc+7HFBCnr0/6ZhStdGDSLeEd7ajV181+2W29NWIFfylO13rU+s3fpy3cnA==", "requires": { - "@fortawesome/fontawesome-common-types": "^0.2.28" + "@fortawesome/fontawesome-common-types": "^0.2.29" }, "dependencies": { "@fortawesome/fontawesome-common-types": { - "version": "0.2.28", - "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-common-types/-/fontawesome-common-types-0.2.28.tgz", - "integrity": "sha512-gtis2/5yLdfI6n0ia0jH7NJs5i/Z/8M/ZbQL6jXQhCthEOe5Cr5NcQPhgTvFxNOtURE03/ZqUcEskdn2M+QaBg==" + "version": "0.2.29", + "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-common-types/-/fontawesome-common-types-0.2.29.tgz", + "integrity": "sha512-cY+QfDTbZ7XVxzx7jxbC98Oxr/zc7R2QpTLqTxqlfyXDrAJjzi/xUIqAUsygELB62JIrbsWxtSRhayKFkGI7MA==" } } }, "@fortawesome/free-solid-svg-icons": { - "version": "5.13.0", - "resolved": "https://registry.npmjs.org/@fortawesome/free-solid-svg-icons/-/free-solid-svg-icons-5.13.0.tgz", - "integrity": "sha512-IHUgDJdomv6YtG4p3zl1B5wWf9ffinHIvebqQOmV3U+3SLw4fC+LUCCgwfETkbTtjy5/Qws2VoVf6z/ETQpFpg==", + "version": "5.13.1", + "resolved": "https://registry.npmjs.org/@fortawesome/free-solid-svg-icons/-/free-solid-svg-icons-5.13.1.tgz", + "integrity": "sha512-LQH/0L1p4+rqtoSHa9qFYR84hpuRZKqaQ41cfBQx8b68p21zoWSekTAeA54I/2x9VlCHDLFlG74Nmdg4iTPQOg==", "requires": { - "@fortawesome/fontawesome-common-types": "^0.2.28" + "@fortawesome/fontawesome-common-types": "^0.2.29" } }, "@fortawesome/react-fontawesome": { - "version": "0.1.9", - "resolved": "https://registry.npmjs.org/@fortawesome/react-fontawesome/-/react-fontawesome-0.1.9.tgz", - "integrity": "sha512-49V3WNysLZU5fZ3sqSuys4nGRytsrxJktbv3vuaXkEoxv22C6T7TEG0TW6+nqVjMnkfCQd5xOnmJoZHMF78tOw==", + "version": "0.1.11", + "resolved": "https://registry.npmjs.org/@fortawesome/react-fontawesome/-/react-fontawesome-0.1.11.tgz", + "integrity": "sha512-sClfojasRifQKI0OPqTy8Ln8iIhnxR/Pv/hukBhWnBz9kQRmqi6JSH3nghlhAY7SUeIIM7B5/D2G8WjX0iepVg==", "requires": { "prop-types": "^15.7.2" } @@ -1923,14 +1928,6 @@ "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-6.2.0.tgz", "integrity": "sha512-7evsyfH1cLOCdAzZAd43Cic04yKydNx0cF+7tiA19p1XnLLPU4dpCQOqpjqwokFe//vS0QqfqqjCS2JkiIs0cA==" }, - "add-dom-event-listener": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/add-dom-event-listener/-/add-dom-event-listener-1.1.0.tgz", - "integrity": "sha512-WCxx1ixHT0GQU9hb0KI/mhgRQhnU+U3GvwY6ZvVjYq8rsihIGoaIOUbY0yMPBxLH5MDtr0kz3fisWGNcbWW7Jw==", - "requires": { - "object-assign": "4.x" - } - }, "add-event-listener": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/add-event-listener/-/add-event-listener-0.0.1.tgz", @@ -3491,24 +3488,11 @@ "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=" }, - "component-classes": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/component-classes/-/component-classes-1.2.6.tgz", - "integrity": "sha1-xkI5TDYYpNiwuJGe/Mu9kw5c1pE=", - "requires": { - "component-indexof": "0.0.3" - } - }, "component-emitter": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==" }, - "component-indexof": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/component-indexof/-/component-indexof-0.0.3.tgz", - "integrity": "sha1-EdCRMSI5648yyPJa6csAL/6NPCQ=" - }, "compose-function": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/compose-function/-/compose-function-3.0.3.tgz", @@ -3778,15 +3762,6 @@ "urix": "^0.1.0" } }, - "css-animation": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/css-animation/-/css-animation-1.6.1.tgz", - "integrity": "sha512-/48+/BaEaHRY6kNQ2OIPzKf9A6g8WjZYjhiNDNuIVbsm5tXCGIAsHDjB4Xu1C4vXJtUWZo26O68OQkDpNBaPog==", - "requires": { - "babel-runtime": "6.x", - "component-classes": "^1.2.5" - } - }, "css-blank-pseudo": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/css-blank-pseudo/-/css-blank-pseudo-0.1.4.tgz", @@ -4431,9 +4406,9 @@ } }, "dom-align": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/dom-align/-/dom-align-1.11.1.tgz", - "integrity": "sha512-hN42DmUgtweBx0iBjDLO4WtKOMcK8yBmPx/fgdsgQadLuzPu/8co3oLdK5yMmeM/vnUd3yDyV6qV8/NzxBexQg==" + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/dom-align/-/dom-align-1.12.0.tgz", + "integrity": "sha512-YkoezQuhp3SLFGdOlr5xkqZ640iXrnHAwVYcDg8ZKRUtO7mSzSC2BA5V0VuyAwPSJA4CLIc6EDDJh4bEsD2+zA==" }, "dom-converter": { "version": "0.2.0", @@ -5159,9 +5134,9 @@ "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=" }, "eventemitter3": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.0.tgz", - "integrity": "sha512-qerSRB0p+UDEssxTtm6EDKcE7W4OaoisfIMl4CngyEhjpYglocpNg6UEqCvemdGhosAsg4sO2dXJOdyBifPGCg==" + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.4.tgz", + "integrity": "sha512-rlaVLnVxtxvoyLsQQFBx53YmXHDxRIzzTLbdfxqi4yocpSjAxXwkU0cScM5JgSKMqEhrZpnvQ2D9gjylR0AimQ==" }, "events": { "version": "3.1.0", @@ -5703,22 +5678,9 @@ } }, "follow-redirects": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.11.0.tgz", - "integrity": "sha512-KZm0V+ll8PfBrKwMzdo5D13b1bur9Iq9Zd/RMmAoQQcl2PxxFml8cxXPaaPYVbV0RjNjq1CU7zIzAOqtUPudmA==", - "requires": { - "debug": "^3.0.0" - }, - "dependencies": { - "debug": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", - "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", - "requires": { - "ms": "^2.1.1" - } - } - } + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.12.1.tgz", + "integrity": "sha512-tmRv0AVuR7ZyouUHLeNSiO6pqulF7dYa3s19c6t+wz9LD69/uSzdMxJ2S91nTI9U3rt/IldxpzMOFejp6f0hjg==" }, "for-in": { "version": "1.0.2", @@ -6413,9 +6375,9 @@ "integrity": "sha1-ksnBN0w1CF912zWexWzCV8u5P6Q=" }, "http-proxy": { - "version": "1.18.0", - "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.0.tgz", - "integrity": "sha512-84I2iJM/n1d4Hdgc6y2+qY5mDaz2PUVjlg9znE9byl+q0uC3DeByqBGReQu5tpLK0TAqTIXScRUV+dg7+bUPpQ==", + "version": "1.18.1", + "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", + "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", "requires": { "eventemitter3": "^4.0.0", "follow-redirects": "^1.0.0", @@ -8183,9 +8145,9 @@ } }, "jszip": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.4.0.tgz", - "integrity": "sha512-gZAOYuPl4EhPTXT0GjhI3o+ZAz3su6EhLrKUoAivcKqyqC7laS5JEv4XWZND9BgcDcF83vI85yGbDmDR6UhrIg==", + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.5.0.tgz", + "integrity": "sha512-WRtu7TPCmYePR1nazfrtuF216cIVon/3GWOvHS9QR5bIwSbnxtdpma6un3jyGGNhHsKCSzn5Ypk+EkDRvTGiFA==", "requires": { "lie": "~3.3.0", "pako": "~1.0.2", @@ -11103,73 +11065,112 @@ } }, "rc-align": { - "version": "3.0.0-rc.1", - "resolved": "https://registry.npmjs.org/rc-align/-/rc-align-3.0.0-rc.1.tgz", - "integrity": "sha512-GbofumhCUb7SxP410j/fbtR2M9Zml+eoZSdaliZh6R3NhfEj5zP4jcO3HG3S9C9KIcXQQtd/cwVHkb9Y0KU7Hg==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/rc-align/-/rc-align-4.0.1.tgz", + "integrity": "sha512-RQ5Fhxl0LW+zsxbY8dxAcpXdaHkHH2jzRSSpvBTS7G9LMK3T+WRcn4ovjg/eqAESM6TdTx0hfqWF2S1pO75jxQ==", "requires": { + "@babel/runtime": "^7.10.1", "classnames": "2.x", "dom-align": "^1.7.0", - "rc-util": "^4.12.0", + "rc-util": "^5.0.1", "resize-observer-polyfill": "^1.5.1" + }, + "dependencies": { + "@babel/runtime": { + "version": "7.10.3", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.10.3.tgz", + "integrity": "sha512-RzGO0RLSdokm9Ipe/YD+7ww8X2Ro79qiXZF3HU9ljrM+qnJmH1Vqth+hbiQZy761LnMJTMitHDuKVYTk3k4dLw==", + "requires": { + "regenerator-runtime": "^0.13.4" + } + }, + "regenerator-runtime": { + "version": "0.13.5", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.5.tgz", + "integrity": "sha512-ZS5w8CpKFinUzOwW3c83oPeVXoNsrLsaCoLtJvAClH135j/R77RuymhiSErhm2lKcwSCIpmvIWSbDkIfAqKQlA==" + } } }, "rc-animate": { - "version": "2.11.1", - "resolved": "https://registry.npmjs.org/rc-animate/-/rc-animate-2.11.1.tgz", - "integrity": "sha512-1NyuCGFJG/0Y+9RKh5y/i/AalUCA51opyyS/jO2seELpgymZm2u9QV3xwODwEuzkmeQ1BDPxMLmYLcTJedPlkQ==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/rc-animate/-/rc-animate-3.1.0.tgz", + "integrity": "sha512-8FsM+3B1H+0AyTyGggY6JyVldHTs1CyYT8CfTmG/nGHHXlecvSLeICJhcKgRLjUiQlctNnRtB1rwz79cvBVmrw==", "requires": { - "babel-runtime": "6.x", + "@ant-design/css-animation": "^1.7.2", "classnames": "^2.2.6", - "css-animation": "^1.3.2", - "prop-types": "15.x", "raf": "^3.4.0", - "rc-util": "^4.15.3", - "react-lifecycles-compat": "^3.0.4" + "rc-util": "^5.0.1" } }, "rc-slider": { - "version": "9.2.4", - "resolved": "https://registry.npmjs.org/rc-slider/-/rc-slider-9.2.4.tgz", - "integrity": "sha512-wSr7vz+WtzzGqsGU2rTQ4mmLz9fkuIDMPYMYm8ygYFvxQ2Rh4uRhOWHYI0R8krNK5k1bGycckYxmQqUIvLAh3w==", + "version": "9.3.1", + "resolved": "https://registry.npmjs.org/rc-slider/-/rc-slider-9.3.1.tgz", + "integrity": "sha512-c52PWPyrfJWh28K6dixAm0906L3/4MUIxqrNQA4TLnC/Z+cBNycWJUZoJerpwSOE1HdM3XDwixCsmtFc/7aWlQ==", "requires": { - "babel-runtime": "6.x", + "@babel/runtime": "^7.10.1", "classnames": "^2.2.5", "rc-tooltip": "^4.0.0", - "rc-util": "^4.0.4", - "shallowequal": "^1.1.0", - "warning": "^4.0.3" + "rc-util": "^5.0.0", + "shallowequal": "^1.1.0" + }, + "dependencies": { + "@babel/runtime": { + "version": "7.10.3", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.10.3.tgz", + "integrity": "sha512-RzGO0RLSdokm9Ipe/YD+7ww8X2Ro79qiXZF3HU9ljrM+qnJmH1Vqth+hbiQZy761LnMJTMitHDuKVYTk3k4dLw==", + "requires": { + "regenerator-runtime": "^0.13.4" + } + }, + "regenerator-runtime": { + "version": "0.13.5", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.5.tgz", + "integrity": "sha512-ZS5w8CpKFinUzOwW3c83oPeVXoNsrLsaCoLtJvAClH135j/R77RuymhiSErhm2lKcwSCIpmvIWSbDkIfAqKQlA==" + } } }, "rc-tooltip": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/rc-tooltip/-/rc-tooltip-4.0.3.tgz", - "integrity": "sha512-HNyBh9/fPdds0DXja8JQX0XTIHmZapB3lLzbdn74aNSxXG1KUkt+GK4X1aOTRY5X9mqm4uUKdeFrn7j273H8gw==", + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/rc-tooltip/-/rc-tooltip-4.2.1.tgz", + "integrity": "sha512-oykuaGsHg7RFvPUaxUpxo7ScEqtH61C66x4JUmjlFlSS8gSx2L8JFtfwM1D68SLBxUqGqJObtxj4TED75gQTiA==", "requires": { - "rc-trigger": "^4.0.0" + "rc-trigger": "^4.2.1" } }, "rc-trigger": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/rc-trigger/-/rc-trigger-4.0.2.tgz", - "integrity": "sha512-to5S1NhK10rWHIgQpoQdwIhuDc2Ok4R4/dh5NLrDt6C+gqkohsdBCYiPk97Z+NwGhRU8N+dbf251bivX8DkzQg==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/rc-trigger/-/rc-trigger-4.3.0.tgz", + "integrity": "sha512-jnGNzosXmDdivMBjPCYe/AfOXTpJU2/xQ9XukgoXDQEoZq/9lcI1r7eUIfq70WlWpLxlUEqQktiV3hwyy6Nw9g==", "requires": { + "@babel/runtime": "^7.10.1", "classnames": "^2.2.6", - "prop-types": "15.x", "raf": "^3.4.1", - "rc-align": "^3.0.0-rc.0", - "rc-animate": "^2.10.2", - "rc-util": "^4.20.0" + "rc-align": "^4.0.0", + "rc-animate": "^3.0.0", + "rc-util": "^5.0.1" + }, + "dependencies": { + "@babel/runtime": { + "version": "7.10.3", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.10.3.tgz", + "integrity": "sha512-RzGO0RLSdokm9Ipe/YD+7ww8X2Ro79qiXZF3HU9ljrM+qnJmH1Vqth+hbiQZy761LnMJTMitHDuKVYTk3k4dLw==", + "requires": { + "regenerator-runtime": "^0.13.4" + } + }, + "regenerator-runtime": { + "version": "0.13.5", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.5.tgz", + "integrity": "sha512-ZS5w8CpKFinUzOwW3c83oPeVXoNsrLsaCoLtJvAClH135j/R77RuymhiSErhm2lKcwSCIpmvIWSbDkIfAqKQlA==" + } } }, "rc-util": { - "version": "4.20.5", - "resolved": "https://registry.npmjs.org/rc-util/-/rc-util-4.20.5.tgz", - "integrity": "sha512-f67s4Dt1quBYhrVPq5QMKmK3eS2hN1NNIAyhaiG0HmvqiGYAXMQ7SP2AlGqv750vnzhJs38JklbkWT1/wjhFPg==", + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/rc-util/-/rc-util-5.0.4.tgz", + "integrity": "sha512-cd19RCrE0DJH6UcJ9+V3eaXA/5sNWyVKOKkWl8ZM2OqgNzVb8fv0obf/TkuvSN43tmTsgqY8k7OqpFYHhmef8g==", "requires": { - "add-dom-event-listener": "^1.1.0", - "prop-types": "^15.5.10", "react-is": "^16.12.0", - "react-lifecycles-compat": "^3.0.4", "shallowequal": "^1.1.0" }, "dependencies": { @@ -12417,9 +12418,9 @@ "integrity": "sha512-vTxrZz4dX5W86M6oVWVdOVe72ZiPs41Oi7Z6Km4W5Turyz28mrXSJhhEBZoRtzJWIv3833WKVwLSDWWkEfupMg==" }, "sass": { - "version": "1.26.5", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.26.5.tgz", - "integrity": "sha512-FG2swzaZUiX53YzZSjSakzvGtlds0lcbF+URuU9mxOv7WBh7NhXEVDa4kPKN4hN6fC2TkOTOKqiqp6d53N9X5Q==", + "version": "1.26.9", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.26.9.tgz", + "integrity": "sha512-t8AkRVi+xvba4yZiLWkJdgJHBFCB3Dh4johniQkPy9ywkgFHNasXFEFP+RG/F6LhQ+aoE4aX+IorIWQjS0esVw==", "requires": { "chokidar": ">=2.0.0 <4.0.0" } @@ -13909,9 +13910,9 @@ "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=" }, "typescript": { - "version": "3.9.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.9.2.tgz", - "integrity": "sha512-q2ktq4n/uLuNNShyayit+DTobV2ApPEo/6so68JaD5ojvc/6GClBipedB9zNWYxRSAlZXAe405Rlijzl6qDiSw==" + "version": "3.9.5", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.9.5.tgz", + "integrity": "sha512-hSAifV3k+i6lEoCJ2k6R2Z/rp/H3+8sdmcn5NrS3/3kE7+RyZXm9aqvxWqjEXHAd8b0pShatpcdMTvEdvAJltQ==" }, "ua-parser-js": { "version": "0.7.20", diff --git a/package.json b/package.json index 69cea14..0f50af1 100644 --- a/package.json +++ b/package.json @@ -3,9 +3,9 @@ "version": "0.1.0", "private": true, "dependencies": { - "@fortawesome/fontawesome-svg-core": "^1.2.28", - "@fortawesome/free-solid-svg-icons": "^5.13.0", - "@fortawesome/react-fontawesome": "^0.1.9", + "@fortawesome/fontawesome-svg-core": "^1.2.29", + "@fortawesome/free-solid-svg-icons": "^5.13.1", + "@fortawesome/react-fontawesome": "^0.1.11", "babel-runtime": "^6.26.0", "bootstrap": "^4.5.0", "classnames": "^2.2.6", @@ -22,13 +22,13 @@ "gaugeJS": "^1.3.7", "handlebars": "^4.7.6", "jquery": "^3.5.1", - "jszip": "^3.4.0", + "jszip": "^3.5.0", "libcimsvg": "git+https://git.rwth-aachen.de/acs/public/cim/pintura-npm-package.git", "lodash": "^4.17.15", "node-sass": "^4.14.1", "popper.js": "^1.16.1", "prop-types": "^15.7.2", - "rc-slider": "^9.2.4", + "rc-slider": "^9.3.1", "react": "^16.13.1", "react-bootstrap": "^1.0.1", "react-contexify": "^4.1.1", @@ -45,9 +45,9 @@ "react-router-dom": "^5.2.0", "react-scripts": "^3.4.1", "react-svg-pan-zoom": "^3.8.0", - "sass": "^1.26.5", + "sass": "^1.26.9", "superagent": "^5.2.2", - "typescript": "^3.9.2", + "typescript": "^3.9.5", "validator": "^12.2.0" }, "devDependencies": { From b8a45447109dfed0517c5c2976078af58befa433 Mon Sep 17 00:00:00 2001 From: Sonja Happ Date: Wed, 24 Jun 2020 15:32:07 +0200 Subject: [PATCH 262/391] Querying VILLASnode API works, API endpoint hardcoded for now, processing of response missing #224 --- src/scenario/scenario.js | 36 ++++++++++++++++++++++++++++++ src/signal/signal-store.js | 27 ++++++++++++++++++++-- src/signal/signals-data-manager.js | 20 +++++++++++++++++ 3 files changed, 81 insertions(+), 2 deletions(-) diff --git a/src/scenario/scenario.js b/src/scenario/scenario.js index 8d3495e..ee54a36 100644 --- a/src/scenario/scenario.js +++ b/src/scenario/scenario.js @@ -392,6 +392,37 @@ class Scenario extends React.Component { } } + signalsAutoConf(index){ + let componentConfig = this.state.configs[index]; + console.log("Signal AutoConf for CC: ", componentConfig); + + // determine host of infrastructure component + let ic = this.state.ics.filter(ic => ic.id === componentConfig.icID) + console.log("Signal AutoConf for IC: ", ic); + + let request = {}; + request["id"] = this.uuidv4(); + request["action"] = "config" + + // TODO add parameter for API host in data model of infrastructure component + let api = 'https://villas.k8s.eonerc.rwth-aachen.de/ws/api/v1' + + AppDispatcher.dispatch({ + type: 'signals/start-autoconfig', + data: request, + url: api + }); + + } + + uuidv4() { + return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) { + // eslint-disable-next-line + var r = Math.random() * 16 | 0, v = c === 'x' ? r : (r & 0x3 | 0x8); + return v.toString(16); + }); + } + /* ############################################## * File modification methods ############################################## */ @@ -441,6 +472,11 @@ class Scenario extends React.Component { editButton onEdit={index => this.setState({ editInputSignalsModal: true, modalConfigData: this.state.configs[index], modalConfigIndex: index })} /> + this.signalsAutoConf(index)} + /> this.getICName(icID)} /> { + AppDispatcher.dispatch({ + type: 'signals/autoconfig-loaded', + data: response + }); + }).catch(error => { + AppDispatcher.dispatch({ + type: 'signals/autoconfig-error', + error: error + }) + }) + } + } export default new SignalsDataManager() From 8523b9e3542e3df6cd2ca3698cb32771092b0c16 Mon Sep 17 00:00:00 2001 From: irismarie Date: Thu, 25 Jun 2020 13:05:40 +0200 Subject: [PATCH 263/391] show border of box widget, closes #228 --- src/styles/widgets.css | 4 ++-- src/widget/widget-factory.js | 1 + src/widget/widgets/box.js | 4 +--- 3 files changed, 4 insertions(+), 5 deletions(-) diff --git a/src/styles/widgets.css b/src/styles/widgets.css index 192acdd..4a8c976 100644 --- a/src/styles/widgets.css +++ b/src/styles/widgets.css @@ -373,9 +373,9 @@ div[class*="-widget"] label { /* End table widget*/ /* Begin box widget */ -.box-widget .border { +.box-widget { width: 100%; height: 100%; - border: 2px solid; + border: 2px solid lightgray; } /* End box widget */ diff --git a/src/widget/widget-factory.js b/src/widget/widget-factory.js index 1360988..8b08117 100644 --- a/src/widget/widget-factory.js +++ b/src/widget/widget-factory.js @@ -168,6 +168,7 @@ class WidgetFactory { widget.width = 100; widget.height = 100; widget.customProperties.border_color = 0; + widget.customProperties.background_color = 9; widget.customProperties.background_color_opacity = 0.5; widget.z = 0; break; diff --git a/src/widget/widgets/box.js b/src/widget/widgets/box.js index ff470f3..88e7c67 100644 --- a/src/widget/widgets/box.js +++ b/src/widget/widgets/box.js @@ -31,10 +31,8 @@ class WidgetBox extends Component { } return ( -
    -
    +
    { } -
    ); } From b317cc095a05038106035bc2a692db4d05b34b26 Mon Sep 17 00:00:00 2001 From: Laura Fuentes Grau Date: Thu, 25 Jun 2020 18:01:26 +0200 Subject: [PATCH 264/391] wip: make dashboard manually resizable #230 --- src/dashboard/dashboard.js | 30 ++++++++++++++++++++++++++---- src/styles/app.css | 2 +- src/widget/widget-area.js | 7 +------ src/widget/widget-toolbox.js | 16 +++++++++++++++- 4 files changed, 43 insertions(+), 12 deletions(-) diff --git a/src/dashboard/dashboard.js b/src/dashboard/dashboard.js index 874eb10..86763a2 100644 --- a/src/dashboard/dashboard.js +++ b/src/dashboard/dashboard.js @@ -120,6 +120,7 @@ class Dashboard extends Component { editing: prevState.editing || false, paused: prevState.paused || false, + dropZoneHeight: prevState.dropZoneHeight || maxHeight +80, editModal: false, filesEditModal: prevState.filesEditModal || false, @@ -130,7 +131,6 @@ class Dashboard extends Component { widgetOrigIDs: prevState.widgetOrigIDs || [], maxWidgetHeight: maxHeight || null, - dropZoneHeight: maxHeight +80 || null, }; } @@ -389,6 +389,27 @@ class Dashboard extends Component { this.forceUpdate(); }; + setDashboardSize(value) { + const maxHeight = Object.values(this.state.widgets).reduce((currentHeight, widget) => { + const absolutHeight = widget.y + widget.height; + + return absolutHeight > currentHeight ? absolutHeight : currentHeight; + }, 0); + let tempSize = null; + if(value === -1){ + tempSize = this.state.dropZoneHeight - 50; + if(tempSize > maxHeight +80){ + this.setState({dropZoneHeight: tempSize}); + } + } + else{ + tempSize = this.state.dropZoneHeight + 50; + this.setState( {dropZoneHeight: tempSize}); + return tempSize; + } + + } + pauseData(){ this.setState({ paused: true }); }; @@ -402,6 +423,7 @@ class Dashboard extends Component { const grid = this.state.dashboard.grid; const boxClasses = classNames('section', 'box', { 'fullscreen-padding': this.props.isFullscreen }); let draggable = this.state.editing; + let dropZoneHeight = this.state.dropZoneHeight; return
    @@ -424,10 +446,10 @@ class Dashboard extends Component {
    e.preventDefault() }> {this.state.editing && - + } {!draggable?( - + {this.state.widgets != null && Object.keys(this.state.widgets).map(widgetKey => ( ) : ( - + {this.state.widgets != null && Object.keys(this.state.widgets).map(widgetKey => ( { - const absolutHeight = widget.y + widget.height; - return absolutHeight > currentHeight ? absolutHeight : currentHeight; - }, 0); - - return + return {this.props.children} diff --git a/src/widget/widget-toolbox.js b/src/widget/widget-toolbox.js index 60be4af..06bf481 100644 --- a/src/widget/widget-toolbox.js +++ b/src/widget/widget-toolbox.js @@ -18,6 +18,8 @@ import React from 'react'; import PropTypes from 'prop-types'; import Slider from 'rc-slider'; +import { Button } from 'react-bootstrap'; +import Icon from "../common/icon"; import ToolboxItem from './toolbox-item'; @@ -57,6 +59,17 @@ class WidgetToolbox extends React.Component {
    Grid: { this.props.grid > 1 ? this.props.grid : 'Disabled' } + +
    +
    +
    +
    + +
    ; @@ -66,7 +79,8 @@ class WidgetToolbox extends React.Component { WidgetToolbox.propTypes = { widgets: PropTypes.array, grid: PropTypes.number, - onGridChange: PropTypes.func + onGridChange: PropTypes.func, + onDashboardSizeChange: PropTypes.func }; export default WidgetToolbox; From 453ed4b154a769fe31e4d1f0e0aa939e99a1330a Mon Sep 17 00:00:00 2001 From: Sonja Happ Date: Fri, 26 Jun 2020 10:49:54 +0200 Subject: [PATCH 265/391] new scalingFactor signal parameter is editable in signal mapping dialog window #130 --- src/signal/edit-signal-mapping.js | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/signal/edit-signal-mapping.js b/src/signal/edit-signal-mapping.js index 43235bc..cf5ac2e 100644 --- a/src/signal/edit-signal-mapping.js +++ b/src/signal/edit-signal-mapping.js @@ -73,6 +73,11 @@ class EditSignalMapping extends React.Component { sig = this.state.signals[row]; sig.unit = event.target.value; } + } else if (column === 3) { // scaling factor change + if (parseFloat(event.target.value) !== 0.0) { + sig = this.state.signals[row]; + sig.scalingFactor = parseFloat(event.target.value); + } } else if (column === 0) { //index change sig = this.state.signals[row]; sig.index = parseInt(event.target.value, 10); @@ -108,7 +113,8 @@ class EditSignalMapping extends React.Component { direction: this.state.dir, name: "PlaceholderName", unit: "PlaceholderUnit", - index: 999 + index: 999, + scalingFactor: 1.0 }; AppDispatcher.dispatch({ @@ -152,6 +158,7 @@ class EditSignalMapping extends React.Component { this.handleMappingChange(e, row, column)} /> this.handleMappingChange(e, row, column)} /> this.handleMappingChange(e, row, column)} /> + this.handleMappingChange(e, row, column)} /> this.handleDelete(index)} /> From 24ccc9eca95c8e51cb2f0e28fa0bcc46a2d47020 Mon Sep 17 00:00:00 2001 From: Sonja Happ Date: Fri, 26 Jun 2020 12:02:35 +0200 Subject: [PATCH 266/391] improve signal mapping dialog, table widget applies scaling Factor for signals and changes legend accordingly #130 --- src/common/table-column.js | 1 + src/common/table.js | 2 +- src/signal/edit-signal-mapping.js | 73 +++++++++++++++++++------------ src/widget/widgets/table.js | 15 ++++--- 4 files changed, 56 insertions(+), 35 deletions(-) diff --git a/src/common/table-column.js b/src/common/table-column.js index 748035a..53b99e5 100644 --- a/src/common/table-column.js +++ b/src/common/table-column.js @@ -29,6 +29,7 @@ class TableColumn extends Component { linkKey: '', dataIndex: false, inlineEditable: false, + inputType: 'text', clickable: false, labelKey: null, checkbox: false, diff --git a/src/common/table.js b/src/common/table.js index b4edea3..d68191a 100644 --- a/src/common/table.js +++ b/src/common/table.js @@ -205,7 +205,7 @@ class CustomTable extends Component { return ( {(this.state.editCell[0] === cellIndex && this.state.editCell[1] === rowIndex ) ? ( - children[cellIndex].props.onInlineChange(event, rowIndex, cellIndex)} ref={ref => { this.activeInput = ref; }} /> + children[cellIndex].props.onInlineChange(event, rowIndex, cellIndex)} ref={ref => { this.activeInput = ref; }} /> ) : ( {cell.map((element, elementIndex) => ( diff --git a/src/signal/edit-signal-mapping.js b/src/signal/edit-signal-mapping.js index cf5ac2e..0c64108 100644 --- a/src/signal/edit-signal-mapping.js +++ b/src/signal/edit-signal-mapping.js @@ -39,7 +39,8 @@ class EditSignalMapping extends React.Component { this.state = { dir, - signals: [] + signals: [], + modifiedSignalIDs : [] }; } @@ -51,46 +52,60 @@ class EditSignalMapping extends React.Component { }); return { - signals: signals + signals: signals, }; } onClose(canceled) { + + for (let signalID of this.state.modifiedSignalIDs){ + + let sig = this.state.signals.find(s => s.id === signalID); + + //dispatch changes to signal + AppDispatcher.dispatch({ + type: 'signals/start-edit', + data: sig, + token: this.props.sessionToken, + }); + } + this.props.onCloseEdit(this.state.dir) } handleMappingChange = (event, row, column) => { - let sig = {} + + let signals = this.state.signals; + let modifiedSignals = this.state.modifiedSignalIDs; + if (column === 1) { // Name change - if (event.target.value !== '') { - sig = this.state.signals[row]; - sig.name = event.target.value; - } + signals[row].name = event.target.value; + if (modifiedSignals.find(id => id === signals[row].id) === undefined){ + modifiedSignals.push(signals[row].id); + } } else if (column === 2) { // unit change - if (event.target.value !== '') { - sig = this.state.signals[row]; - sig.unit = event.target.value; - } + signals[row].unit = event.target.value; + if (modifiedSignals.find(id => id === signals[row].id) === undefined){ + modifiedSignals.push(signals[row].id); + } } else if (column === 3) { // scaling factor change - if (parseFloat(event.target.value) !== 0.0) { - sig = this.state.signals[row]; - sig.scalingFactor = parseFloat(event.target.value); + signals[row].scalingFactor = parseFloat(event.target.value); + if (modifiedSignals.find(id => id === signals[row].id) === undefined){ + modifiedSignals.push(signals[row].id); } } else if (column === 0) { //index change - sig = this.state.signals[row]; - sig.index = parseInt(event.target.value, 10); + signals[row].index =parseInt(event.target.value, 10); + if (modifiedSignals.find(id => id === signals[row].id) === undefined){ + modifiedSignals.push(signals[row].id); + } } - if (sig !== {}){ - //dispatch changes to signal - AppDispatcher.dispatch({ - type: 'signals/start-edit', - data: sig, - token: this.props.sessionToken, - }); - } + this.setState({ + signals: signals, + modifiedSignalIDs: modifiedSignals + }) }; @@ -145,7 +160,7 @@ class EditSignalMapping extends React.Component { this.onClose(c)} onReset={() => this.resetState()} @@ -155,10 +170,10 @@ class EditSignalMapping extends React.Component { {this.props.direction} Mapping Click Index, Name or Unit cell to edit - this.handleMappingChange(e, row, column)} /> - this.handleMappingChange(e, row, column)} /> - this.handleMappingChange(e, row, column)} /> - this.handleMappingChange(e, row, column)} /> + this.handleMappingChange(e, row, column)} /> + this.handleMappingChange(e, row, column)} /> + this.handleMappingChange(e, row, column)} /> + this.handleMappingChange(e, row, column)} /> this.handleDelete(index)} />
    diff --git a/src/widget/widgets/table.js b/src/widget/widgets/table.js index 089eec0..3ecc59a 100644 --- a/src/widget/widgets/table.js +++ b/src/widget/widgets/table.js @@ -41,15 +41,20 @@ class WidgetTable extends Component { // determine ID of infrastructure component related to signal (via config) let icID = props.icIDs[sig.id] + let signalName = sig.name; + if(sig.scalingFactor !== 1.0){ + signalName = signalName + "(x" + String(sig.scalingFactor) + ")"; + } + // distinguish between input and output signals if (sig.direction === "out") { if (props.data[icID] != null && props.data[icID].output != null && props.data[icID].output.values != null) { if (props.data[icID].output.values[sig.index-1] !== undefined) { let data = props.data[icID].output.values[sig.index-1]; rows.push({ - name: sig.name, + name: signalName, unit: sig.unit, - value: data[data.length - 1].y + value: data[data.length - 1].y * sig.scalingFactor }); } @@ -59,9 +64,9 @@ class WidgetTable extends Component { if (props.data[icID].input.values[sig.index-1] !== undefined) { let data = props.data[icID].input.values[sig.index-1]; rows.push({ - name: sig.name, + name: signalName, unit: sig.unit, - value: data[data.length - 1].y + value: data[data.length - 1].y * sig.scalingFactor }); } } @@ -86,7 +91,7 @@ class WidgetTable extends Component { var columns = [ , - + ]; if (this.props.widget.customProperties.showUnit) From fd5e6e476f875dad37397e7fb933d1ac29e10619 Mon Sep 17 00:00:00 2001 From: Sonja Happ Date: Fri, 26 Jun 2020 13:26:23 +0200 Subject: [PATCH 267/391] gauge widget considers signal scaling factor #130 --- src/widget/widgets/gauge.js | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/widget/widgets/gauge.js b/src/widget/widgets/gauge.js index 00ffa93..3aa3e3b 100644 --- a/src/widget/widgets/gauge.js +++ b/src/widget/widgets/gauge.js @@ -49,7 +49,7 @@ class WidgetGauge extends Component { } componentDidUpdate(prevProps: Readonly

    , prevState: Readonly, snapshot: SS): void { - + // update gauge's value if(prevState.value !== this.state.value){ this.gauge.set(this.state.value) @@ -116,7 +116,7 @@ class WidgetGauge extends Component { // Take just 3 decimal positions // Note: Favor this method over Number.toFixed(n) in order to avoid a type conversion, since it returns a String if (data != null) { - const value = Math.round(data[data.length - 1].y * 1e3) / 1e3; + const value = signal[0].scalingFactor * Math.round(data[data.length - 1].y * 1e3) / 1e3; let minValue = null; let maxValue = null; @@ -149,7 +149,7 @@ class WidgetGauge extends Component { maxValue = props.widget.customProperties.valueMax; updateMaxValue = true; updateLabels = true; - + } if (updateLabels === false && state.gauge) { @@ -169,7 +169,7 @@ class WidgetGauge extends Component { if(props.widget.customProperties.valueUseMinMax !== state.useMinMax){ returnState["useMinMax"] = props.widget.customProperties.valueUseMinMax; } - + // prepare returned state if(updateValue === true){ returnState["value"] = value; @@ -201,7 +201,7 @@ class WidgetGauge extends Component { for (let i = 0; i < labelCount; i++) { labels.push(minValue + labelStep * i); } - + // calculate zones let zones = this.props.widget.customProperties.colorZones ? this.props.widget.customProperties.zones : null; if (zones != null) { From e8893f165ed1fba7c7ea0d56770dfbefac8ae704 Mon Sep 17 00:00:00 2001 From: Sonja Happ Date: Fri, 26 Jun 2020 15:57:47 +0200 Subject: [PATCH 268/391] Lamp and plot widgets consider signal scaling #130 --- src/widget/widget-plot/plot-legend.js | 2 +- src/widget/widgets/lamp.js | 4 ++-- src/widget/widgets/plot.js | 27 +++++++++++++++++++++++++-- 3 files changed, 28 insertions(+), 5 deletions(-) diff --git a/src/widget/widget-plot/plot-legend.js b/src/widget/widget-plot/plot-legend.js index f3f4cd6..5ac618c 100644 --- a/src/widget/widget-plot/plot-legend.js +++ b/src/widget/widget-plot/plot-legend.js @@ -27,7 +27,7 @@ class PlotLegend extends React.Component {

      {this.props.signals.map(signal =>
    • - {signal.name} + {signal.name + "(x" + signal.scalingFactor + ")"} {signal.unit}
    • )} diff --git a/src/widget/widgets/lamp.js b/src/widget/widgets/lamp.js index 939caed..c0ca9a0 100644 --- a/src/widget/widgets/lamp.js +++ b/src/widget/widgets/lamp.js @@ -49,8 +49,8 @@ class WidgetLamp extends Component { // check if value has changed const data = props.data[icID].output.values[signal[0].index-1]; - if (data != null && Number(state.value) !== data[data.length - 1].y) { - return { value: data[data.length - 1].y }; + if (data != null && Number(state.value) !== signal[0].scalingFactor * data[data.length - 1].y) { + return { value: signal[0].scalingFactor * data[data.length - 1].y }; } return null; diff --git a/src/widget/widgets/plot.js b/src/widget/widgets/plot.js index 20245e2..e87e7d1 100644 --- a/src/widget/widgets/plot.js +++ b/src/widget/widgets/plot.js @@ -49,13 +49,31 @@ class WidgetPlot extends React.Component { if (sig.direction === "out") { if (props.data[icID] != null && props.data[icID].output != null && props.data[icID].output.values != null) { if (props.data[icID].output.values[sig.index-1] !== undefined) { - data.push(props.data[icID].output.values[sig.index-1]); + let values = props.data[icID].output.values[sig.index-1]; + if(sig.scalingFactor !== 1) { + let scaledValues = JSON.parse(JSON.stringify(values)); + for (let i=0; i< scaledValues.length; i++){ + scaledValues[i].y = scaledValues[i].y * sig.scalingFactor; + } + data.push(scaledValues); + } else { + data.push(values); + } } } } else if (sig.direction === "in") { if (props.data[icID] != null && props.data[icID].input != null && props.data[icID].input.values != null) { if (props.data[icID].input.values[sig.index-1] !== undefined) { - data.push(props.data[icID].input.values[sig.index-1]); + let values = props.data[icID].output.values[sig.index-1]; + if(sig.scalingFactor !== 1) { + let scaledValues = JSON.parse(JSON.stringify(values)); + for (let i=0; i< scaledValues.length; i++){ + scaledValues[i].y = scaledValues[i].y * sig.scalingFactor; + } + data.push(scaledValues); + } else { + data.push(values); + } } } } @@ -67,6 +85,11 @@ class WidgetPlot extends React.Component { } + + scaleData(data, scaleFactor){ + // data is an array of value pairs x,y + } + render() { return
      From 209649ead864987e0b5c25dc67ec2c12a626fe25 Mon Sep 17 00:00:00 2001 From: Sonja Happ Date: Mon, 29 Jun 2020 11:20:56 +0200 Subject: [PATCH 269/391] Value widget considers signal scaling factor #130 --- src/widget/widgets/value.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/widget/widgets/value.js b/src/widget/widgets/value.js index 0468b3e..8c4c5a9 100644 --- a/src/widget/widgets/value.js +++ b/src/widget/widgets/value.js @@ -47,7 +47,7 @@ class WidgetValue extends Component { // check if value has changed const data = props.data[icID].output.values[signal[0].index - 1]; if (data != null && Number(state.value) !== data[data.length - 1].y) { - value = data[data.length - 1].y; + value = signal[0].scalingFactor * data[data.length - 1].y; } } @@ -66,12 +66,12 @@ class WidgetValue extends Component { render() { let value_to_render = Number(this.state.value); - let value_width = this.props.widget.customProperties.textSize*(value_to_render < 1000 ? (2):(3)); + let value_width = this.props.widget.customProperties.textSize*(Math.abs(value_to_render) < 1000 ? (5):(8)); let unit_width = this.props.widget.customProperties.textSize*(this.state.unit.length + 0.7); return (
      {this.props.widget.name} - {Number.isNaN(value_to_render) ? NaN : format('.3s')(value_to_render)} + {Number.isNaN(value_to_render) ? NaN : format('.3f')(value_to_render)} {this.props.widget.customProperties.showUnit && [{this.state.unit}] } From ec99815eb1a4e557af314c1d868e47fc8bd39544 Mon Sep 17 00:00:00 2001 From: Sonja Happ Date: Mon, 29 Jun 2020 12:10:37 +0200 Subject: [PATCH 270/391] fix for sending of data to IC --- src/ic/ic-data-store.js | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/ic/ic-data-store.js b/src/ic/ic-data-store.js index bca9a95..7a81698 100644 --- a/src/ic/ic-data-store.js +++ b/src/ic/ic-data-store.js @@ -111,8 +111,11 @@ class ICDataStore extends ReduceStore { state[action.ic].input.sequence++; state[action.ic].input.values[action.signal-1] = action.data; - ICDataDataManager.send(state[action.ic].input, action.ic); + // copy of state needed because changes are not yet propagated + let input = JSON.parse(JSON.stringify(state[action.ic].input)); + ICDataDataManager.send(input, action.ic); + this.__emitChange(); return state; default: From 547d6c387735820d4943974527dac3a32e68b043 Mon Sep 17 00:00:00 2001 From: Sonja Happ Date: Mon, 29 Jun 2020 12:13:02 +0200 Subject: [PATCH 271/391] Input widgets (button, number input, slider) consider scaling factor of signal #130 , fix for widget parameter update upon signal value change --- src/widget/widget.js | 12 ++++++------ src/widget/widgets/button.js | 20 ++++++++++++-------- src/widget/widgets/input.js | 2 +- src/widget/widgets/slider.js | 2 +- 4 files changed, 20 insertions(+), 16 deletions(-) diff --git a/src/widget/widget.js b/src/widget/widget.js index 11fe5c2..e2faeb1 100644 --- a/src/widget/widget.js +++ b/src/widget/widget.js @@ -88,13 +88,13 @@ class Widget extends React.Component { }; } - inputDataChanged(widget, data, controlID) { + inputDataChanged(widget, data, controlID, controlValue) { // controlID is the path to the widget customProperty that is changed (for example 'value') // modify the widget customProperty if (controlID !== '') { let updatedWidget = JSON.parse(JSON.stringify(widget)); - updatedWidget.customProperties[controlID] = data; + updatedWidget.customProperties[controlID] = controlValue; AppDispatcher.dispatch({ type: 'widgets/start-edit', token: this.state.sessionToken, @@ -118,7 +118,7 @@ class Widget extends React.Component { type: 'icData/inputChanged', ic: icID, signal: signal[0].index, - data + data: signal[0].scalingFactor * data }); } @@ -179,14 +179,14 @@ class Widget extends React.Component { return this.inputDataChanged(widget, value, controlID)} + onInputChanged={(value, controlID, controlValue) => this.inputDataChanged(widget, value, controlID, controlValue)} signals={this.state.signals} /> } else if (widget.type === 'NumberInput') { return this.inputDataChanged(widget, value, controlID)} + onInputChanged={(value, controlID, controlValue) => this.inputDataChanged(widget, value, controlID, controlValue)} signals={this.state.signals} /> } else if (widget.type === 'Slider') { @@ -194,7 +194,7 @@ class Widget extends React.Component { widget={widget} editing={this.props.editing} onWidgetChange={(w) => this.props.onWidgetStatusChange(w, this.props.index) } - onInputChanged={(value, controlID) => this.inputDataChanged(widget, value, controlID)} + onInputChanged={(value, controlID, controlValue) => this.inputDataChanged(widget, value, controlID, controlValue)} signals={this.state.signals} /> } else if (widget.type === 'Gauge') { diff --git a/src/widget/widgets/button.js b/src/widget/widgets/button.js index e3a11a0..e95e740 100644 --- a/src/widget/widgets/button.js +++ b/src/widget/widgets/button.js @@ -28,11 +28,16 @@ class WidgetButton extends Component { } } + static getDerivedStateFromProps(props, state){ + return { + pressed: props.widget.customProperties.pressed + } + } + onPress(e) { if (e.button === 0 && !this.props.widget.customProperties.toggle) { - this.setState({ pressed: true }); - this.valueChanged(this.props.widget.customProperties.on_value); + this.valueChanged(this.props.widget.customProperties.on_value, true); } } @@ -43,15 +48,14 @@ class WidgetButton extends Component { if (this.props.widget.customProperties.toggle) { nextState = !this.state.pressed; } - this.props.widget.customProperties.pressed = nextState; - this.setState({pressed: nextState}); - this.valueChanged(nextState ? this.props.widget.customProperties.on_value : this.props.widget.customProperties.off_value); + this.valueChanged(nextState ? this.props.widget.customProperties.on_value : this.props.widget.customProperties.off_value, nextState); } } - valueChanged(newValue) { - if (this.props.onInputChanged) - this.props.onInputChanged(newValue, 'pressed'); + valueChanged(newValue, pressed) { + if (this.props.onInputChanged) { + this.props.onInputChanged(newValue, 'pressed', pressed); + } } render() { diff --git a/src/widget/widgets/input.js b/src/widget/widgets/input.js index 7fe7c38..0b87617 100644 --- a/src/widget/widgets/input.js +++ b/src/widget/widgets/input.js @@ -71,7 +71,7 @@ class WidgetInput extends Component { valueChanged(newValue) { if (this.props.onInputChanged) { - this.props.onInputChanged(Number(newValue), 'value'); + this.props.onInputChanged(Number(newValue), 'value', Number(newValue)); } } diff --git a/src/widget/widgets/slider.js b/src/widget/widgets/slider.js index 89f4da7..10bb055 100644 --- a/src/widget/widgets/slider.js +++ b/src/widget/widgets/slider.js @@ -105,7 +105,7 @@ class WidgetSlider extends Component { valueChanged(newValue) { if (this.props.onInputChanged) { - this.props.onInputChanged(newValue, 'value'); + this.props.onInputChanged(newValue, 'value', newValue); } } From c00c16ddb540ab5a3305cbe9c6f5a43ce2a6c88f Mon Sep 17 00:00:00 2001 From: Sonja Happ Date: Wed, 1 Jul 2020 13:10:46 +0200 Subject: [PATCH 272/391] receive config of VILLASnode based on apihost parameter of IC --- src/scenario/scenario.js | 11 ++--------- src/signal/signals-data-manager.js | 1 - 2 files changed, 2 insertions(+), 10 deletions(-) diff --git a/src/scenario/scenario.js b/src/scenario/scenario.js index ee54a36..6f93ed7 100644 --- a/src/scenario/scenario.js +++ b/src/scenario/scenario.js @@ -394,23 +394,16 @@ class Scenario extends React.Component { signalsAutoConf(index){ let componentConfig = this.state.configs[index]; - console.log("Signal AutoConf for CC: ", componentConfig); - // determine host of infrastructure component - let ic = this.state.ics.filter(ic => ic.id === componentConfig.icID) - console.log("Signal AutoConf for IC: ", ic); - + let ic = this.state.ics.find(ic => ic.id === componentConfig.icID) let request = {}; request["id"] = this.uuidv4(); request["action"] = "config" - // TODO add parameter for API host in data model of infrastructure component - let api = 'https://villas.k8s.eonerc.rwth-aachen.de/ws/api/v1' - AppDispatcher.dispatch({ type: 'signals/start-autoconfig', data: request, - url: api + url: ic.apihost }); } diff --git a/src/signal/signals-data-manager.js b/src/signal/signals-data-manager.js index 653d051..94fa1b4 100644 --- a/src/signal/signals-data-manager.js +++ b/src/signal/signals-data-manager.js @@ -42,7 +42,6 @@ class SignalsDataManager extends RestDataManager{ // data contains the request data: { action, id, (request)} // See documentation of VILLASnode API: https://villas.fein-aachen.org/doc/node-dev-api-node.html - console.log("startAutoConfig: POST to ", url, ": ", data); RestAPI.post(url, data).then(response => { AppDispatcher.dispatch({ type: 'signals/autoconfig-loaded', From f038cfe0c87f3736a4f55bf285af34d7c16dac77 Mon Sep 17 00:00:00 2001 From: Sonja Happ Date: Wed, 1 Jul 2020 13:56:06 +0200 Subject: [PATCH 273/391] Add notifications, auto conf only for VILLASnode ICs #224 --- src/scenario/scenario.js | 14 ++++++++++++++ src/signal/signal-store.js | 8 ++++++++ 2 files changed, 22 insertions(+) diff --git a/src/scenario/scenario.js b/src/scenario/scenario.js index 6f93ed7..8c91c95 100644 --- a/src/scenario/scenario.js +++ b/src/scenario/scenario.js @@ -42,6 +42,7 @@ import EditConfigDialog from "../componentconfig/edit-config"; import EditSignalMapping from "../signal/edit-signal-mapping"; import FileStore from "../file/file-store" import WidgetStore from "../widget/widget-store"; +import NotificationsDataManager from "../common/data-managers/notifications-data-manager"; class Scenario extends React.Component { @@ -396,6 +397,19 @@ class Scenario extends React.Component { let componentConfig = this.state.configs[index]; // determine host of infrastructure component let ic = this.state.ics.find(ic => ic.id === componentConfig.icID) + if(!ic.type.includes("VILLASnode") && !ic.type.includes("villasnode") && !ic.type.includes("VILLASNODE")){ + let message = "Cannot autoconfigure signals for IC type " + ic.type + " of category " + ic.category + ". This is only possible for gateway ICs of type 'VILLASnode'." + console.warn(message); + + const SIGNAL_AUTOCONF_WARN_NOTIFICATION = { + title: 'Failed to load signal config for IC ' + ic.name, + message: message, + level: 'warning' + }; + NotificationsDataManager.addNotification(SIGNAL_AUTOCONF_WARN_NOTIFICATION); + return; + } + let request = {}; request["id"] = this.uuidv4(); request["action"] = "config" diff --git a/src/signal/signal-store.js b/src/signal/signal-store.js index c947e56..e41b10c 100644 --- a/src/signal/signal-store.js +++ b/src/signal/signal-store.js @@ -40,6 +40,14 @@ class SignalStore extends ArrayStore{ case 'signals/autoconfig-loaded': console.log("AutoConfig Loaded: ", action.data) // TODO save signal config contained in action.data + + const SIGNAL_AUTOCONF_INFO_NOTIFICATION = { + title: 'Signal configuration loaded successfully.', + message: '', + level: 'info' + }; + NotificationsDataManager.addNotification(SIGNAL_AUTOCONF_INFO_NOTIFICATION); + return super.reduce(state, action); case 'signals/autoconfig-error': From 02ae930f7c431f7986726c8fcb96bd6ff2524284 Mon Sep 17 00:00:00 2001 From: Laura Fuentes Grau Date: Wed, 1 Jul 2020 19:59:25 +0200 Subject: [PATCH 274/391] Dropzoneheight now saved as dashboard property #230 , deleted unnecessary code, (wip) added tooltips to dashboard resizing buttons #235 --- src/dashboard/dashboard.js | 71 ++++++++++++------------------------ src/widget/widget-toolbox.js | 6 ++- 2 files changed, 28 insertions(+), 49 deletions(-) diff --git a/src/dashboard/dashboard.js b/src/dashboard/dashboard.js index 86763a2..05f69e1 100644 --- a/src/dashboard/dashboard.js +++ b/src/dashboard/dashboard.js @@ -73,6 +73,10 @@ class Dashboard extends Component { return thisWidgetHeight > maxHeightSoFar? thisWidgetHeight : maxHeightSoFar; }, 0); + if(dashboard.height === 0 || maxHeight + 80 > dashboard.height) + { + dashboard.height = maxHeight + 80; + } // filter component configurations to the ones that belong to this scenario let configs = [] @@ -108,7 +112,7 @@ class Dashboard extends Component { return ICused; }); } - + return { dashboard, widgets, @@ -120,7 +124,6 @@ class Dashboard extends Component { editing: prevState.editing || false, paused: prevState.paused || false, - dropZoneHeight: prevState.dropZoneHeight || maxHeight +80, editModal: false, filesEditModal: prevState.filesEditModal || false, @@ -188,25 +191,6 @@ class Dashboard extends Component { } } - /* - * Adapt the area's height with the position of the new widget. - * Return true if the height increased, otherwise false. - */ - increaseHeightWithWidget(widget) { - let increased = false; - let thisWidgetHeight = widget.y + widget.height; - - if (thisWidgetHeight > this.state.maxWidgetHeight) { - increased = true; - - this.setState({ - maxWidgetHeight: thisWidgetHeight, - dropZoneHeight: thisWidgetHeight + 40 - }); - } - - return increased; - } transformToWidgetsList(widgets) { return Object.keys(widgets).map( (key) => widgets[key]); @@ -238,24 +222,6 @@ class Dashboard extends Component { } - /* - * Set the initial height state based on the existing widgets - */ - computeHeightWithWidgets(widgets) { - // Compute max height from widgets - let maxHeight = Object.keys(widgets).reduce( (maxHeightSoFar, widgetKey) => { - let thisWidget = widgets[widgetKey]; - let thisWidgetHeight = thisWidget.y + thisWidget.height; - - return thisWidgetHeight > maxHeightSoFar? thisWidgetHeight : maxHeightSoFar; - }, 0); - - this.setState({ - maxWidgetHeight: maxHeight, - dropZoneHeight: maxHeight + 80 - }); - } - editWidget(widget, index){ this.setState({ editModal: true, modalData: widget, modalIndex: index }); @@ -377,6 +343,12 @@ class Dashboard extends Component { token: this.state.sessionToken, param: '?dashboardID=' + this.state.dashboard.id }); + + AppDispatcher.dispatch({ + type: 'dashboards/start-load', + data: this.props.match.params.dashboard, + token: this.state.sessionToken + }); this.setState({ editing: false, widgetChangeData: []}); }; @@ -395,19 +367,22 @@ class Dashboard extends Component { return absolutHeight > currentHeight ? absolutHeight : currentHeight; }, 0); - let tempSize = null; + let dashboard = this.state.dashboard; if(value === -1){ - tempSize = this.state.dropZoneHeight - 50; - if(tempSize > maxHeight +80){ - this.setState({dropZoneHeight: tempSize}); + + let tempHeight = this.state.dashboard.height - 50; + + if(tempHeight > (maxHeight + 80)){ + dashboard.height = tempHeight; + this.setState({dashboard}); } } else{ - tempSize = this.state.dropZoneHeight + 50; - this.setState( {dropZoneHeight: tempSize}); - return tempSize; + dashboard.height = this.state.dashboard.height +50; + this.setState( {dashboard}); } - + + this.forceUpdate(); } pauseData(){ @@ -423,7 +398,7 @@ class Dashboard extends Component { const grid = this.state.dashboard.grid; const boxClasses = classNames('section', 'box', { 'fullscreen-padding': this.props.isFullscreen }); let draggable = this.state.editing; - let dropZoneHeight = this.state.dropZoneHeight; + let dropZoneHeight = this.state.dashboard.height; return
      diff --git a/src/widget/widget-toolbox.js b/src/widget/widget-toolbox.js index 06bf481..18912f1 100644 --- a/src/widget/widget-toolbox.js +++ b/src/widget/widget-toolbox.js @@ -18,7 +18,7 @@ import React from 'react'; import PropTypes from 'prop-types'; import Slider from 'rc-slider'; -import { Button } from 'react-bootstrap'; +import { Button, OverlayTrigger, Tooltip } from 'react-bootstrap'; import Icon from "../common/icon"; import ToolboxItem from './toolbox-item'; @@ -64,12 +64,16 @@ class WidgetToolbox extends React.Component {
      + Increase dashboard height } > + + Decrease dashboard height } > +
      ; From 8ec62483472a4402a6e111e043869ebceaffd8dd Mon Sep 17 00:00:00 2001 From: Sonja Happ Date: Thu, 2 Jul 2020 09:11:05 +0200 Subject: [PATCH 275/391] revise development and requirements documentation --- doc/Requirements.md | 18 +++++++----------- doc/development.md | 13 +++++++------ 2 files changed, 14 insertions(+), 17 deletions(-) diff --git a/doc/Requirements.md b/doc/Requirements.md index c53871b..2ec0efe 100644 --- a/doc/Requirements.md +++ b/doc/Requirements.md @@ -1,16 +1,12 @@ # Requirements {#web-requirements} -## Services - - NodeJS: Runs VILLASweb frontend - - Go: Runs VILLASweb backend - - PostgreSQL database (min version 11): Backend database +## Services and tools required for development + - [NodeJS with npm](https://nodejs.org/en/): Runs VILLASweb frontend + - [Go](https://golang.org/): Runs VILLASweb backend + - [PostgreSQL database](https://www.postgresql.org/) (min version 11): Backend database - [swag](https://github.com/swaggo/swag): For automated API documentation creation - - NGinX: Webserver and reverse proxy for backends (only for production) - - Docker: Container management system + - [Docker](https://www.docker.com/): Container management system -## Installed on your local computer - - NodeJS with npm - - Go (at least version 1.11) - - [swag](https://github.com/swaggo/swag) - - Docker +## Additional requirements for productive use + - [NGinX](https://www.nginx.com/): Webserver and reverse proxy for backends diff --git a/doc/development.md b/doc/development.md index 259fb19..5b29595 100644 --- a/doc/development.md +++ b/doc/development.md @@ -8,11 +8,11 @@ In order to get started with VILLASweb, you might also want to check our our [de ### Description -The website itself based on the React JavaScript framework. +The website itself based on the [React JavaScript framework](https://reactjs.org/) and the [Flux library](https://facebook.github.io/flux/). ### Required - - NodeJS with npm + - [NodeJS with npm](https://nodejs.org/en/) ### Setup @@ -25,18 +25,19 @@ The website itself based on the React JavaScript framework. - `npm start` This runs the development server for the website on your local computer at port 3000. -The backend must be running to make the website work. +The backend must be running to make the website work. +Type `http://localhost:3000/` in the address field of your browser to open the website. ## Backend ### Description -The backend of VILLASweb uses the programming language Go and a PostgreSQL data base. +The backend of VILLASweb uses the programming language Go and a PostgreSQL database. ### Required - - Go (min version 1.11) - - Running PostgreSQL data base (min version 11) + - [Go](https://golang.org/) (min version 1.11) + - [PostgreSQL database](https://www.postgresql.org/) (min version 11) - [swag](https://github.com/swaggo/swag) ### Setup and Running From b31f0a571d08cfc0b5a63e48fd2b0e49b0246f86 Mon Sep 17 00:00:00 2001 From: Sonja Happ Date: Thu, 2 Jul 2020 09:29:51 +0200 Subject: [PATCH 276/391] start documentation of production use --- doc/Production.md | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) create mode 100644 doc/Production.md diff --git a/doc/Production.md b/doc/Production.md new file mode 100644 index 0000000..fe38b4c --- /dev/null +++ b/doc/Production.md @@ -0,0 +1,18 @@ +# Production Setup {#web-production} + +For development setup instructions see @ref web-development. +The production setup is based on docker. +Clone the [frontend](https://git.rwth-aachen.de/acs/public/villas/web) and [backend](https://git.rwth-aachen.de/acs/public/villas/web-backend-go) repositories on your computer and build the Docker images for both: + +#### Frontend + - `cd VILLASweb` + - `docker build -t villasweb-frontend .` + +#### Backend + - `cd ..\VILLASweb-backend-go` + - `docker build -t villasweb-backend .` + +#### TODO Docker compose and/or Kubernetes +Run the production docker-compose file: + - `docker-compose -f docker-compose-production.yml up -d` + From 284afb27e79acfbccc830e81a24cd491d4ecab6d Mon Sep 17 00:00:00 2001 From: Sonja Happ Date: Thu, 2 Jul 2020 10:03:11 +0200 Subject: [PATCH 277/391] Work on production documentation; add draft of example VILLASnode configuration --- doc/Production.md | 70 +++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 67 insertions(+), 3 deletions(-) diff --git a/doc/Production.md b/doc/Production.md index fe38b4c..b53ca7e 100644 --- a/doc/Production.md +++ b/doc/Production.md @@ -1,18 +1,82 @@ # Production Setup {#web-production} +## Setting up VILLASweb for production + For development setup instructions see @ref web-development. The production setup is based on docker. Clone the [frontend](https://git.rwth-aachen.de/acs/public/villas/web) and [backend](https://git.rwth-aachen.de/acs/public/villas/web-backend-go) repositories on your computer and build the Docker images for both: -#### Frontend +### Frontend - `cd VILLASweb` - `docker build -t villasweb-frontend .` -#### Backend +### Backend - `cd ..\VILLASweb-backend-go` - `docker build -t villasweb-backend .` -#### TODO Docker compose and/or Kubernetes +### WIP Docker compose and/or Kubernetes Run the production docker-compose file: - `docker-compose -f docker-compose-production.yml up -d` + +## Configure VILLASnode to get data into VILLASweb + +### Install VILLASnode + +See: @ref node-installation + +### Create a VILLASnode demo data source + +1. Create a new empty configuration file with the following contents and save it as `webdemo.conf`: + +> WIP this example configuration requires revision! +``` +nodes = { + sine = { + type = "signal" + + signal = "mixed" + values = 5 + rate = 25 + frequency = 5 + } + + web = { + type = "websocket" + + destinations = [ + "TODO" + ] + } + } + + paths = ( + { + in = "sine" + out = "web" + } + ) +``` + +The node `sine` is a software signal generator for 5 signals. +The node `web` is the websocket interface to stream the data generated by the `sine` node to the browser. + +> Note: If you do not want to use your local system as the destination for the websocket node, +>change the option `destinations` of the `web` node to the destination of your production environment, for example `https://my.production.environment/ws/webdemo`. + +### Start the VILLASnode gateway + +Run the following command on your system: + +```bash +villas node webdemo.conf +``` +> Note: Change the path to the configuration file accordingly. The `villas` command will only work if VILLASnode is installed on your system. + +### Visualize real-time data in VILLASweb Dashboards +1. Use the VILLASweb frontend to create a new infrastructure component for the VILLASnode gateway from above (Admin user required). +2. Set the `host` parameter of the component to the target you used as the `web.destinations` parameter in the configuration from above. +3. Create a new scenario in VILLASweb and within that scenario create a new component configuration that uses the infrastructure component you created under 2. +4. WIP: Use the signal auto-configure function to retrieve the signal configuration of the VILLASnode automatically. +5. Create a new dashboard with widgets of your choice and link these widgets to the signals received from the infrastructure component. +6. Enjoy what you see. From 347fa12b7a585b7d607e71b95f171d16088fa756 Mon Sep 17 00:00:00 2001 From: Sonja Happ Date: Thu, 2 Jul 2020 10:06:20 +0200 Subject: [PATCH 278/391] fix indentation --- doc/Production.md | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/doc/Production.md b/doc/Production.md index b53ca7e..e5fd20c 100644 --- a/doc/Production.md +++ b/doc/Production.md @@ -33,27 +33,27 @@ See: @ref node-installation ``` nodes = { sine = { - type = "signal" - - signal = "mixed" - values = 5 - rate = 25 - frequency = 5 + type = "signal" + + signal = "mixed" + values = 5 + rate = 25 + frequency = 5 } web = { - type = "websocket" - - destinations = [ - "TODO" - ] + type = "websocket" + + destinations = [ + "TODO" + ] } } paths = ( { - in = "sine" - out = "web" + in = "sine" + out = "web" } ) ``` From fe731815cbedd8cd4551bb2e82d1d4cf4be32515 Mon Sep 17 00:00:00 2001 From: Sonja Happ Date: Thu, 2 Jul 2020 10:20:16 +0200 Subject: [PATCH 279/391] revision of README --- README.md | 34 +++++++++++++++------------------- 1 file changed, 15 insertions(+), 19 deletions(-) diff --git a/README.md b/README.md index 41ba215..76c1608 100644 --- a/README.md +++ b/README.md @@ -1,43 +1,39 @@ # VILLASweb -## Description - -This is VILLASweb, the website displaying and processing simulation data in the web browser. The term __frontend__ refers to this project, the actual website. - -The frontend connects to __two__ backends: _VILLASweb-backend-go_ and _VILLASnode_. - -VILLASnode provides actual simulation data via websockets. VILLASweb-backend-go provides any other data like user accounts, infrastructure components and configurations, dashboards etc. - +This is VILLASweb, the website to configure real-time co-simulations and display simulation real-time data in the web browser. +The term **frontend** refers to this project, the actual website. +The frontend connects to **two** backends: [VILLASweb-backend-go](https://git.rwth-aachen.de/acs/public/villas/web-backend-go) and [VILLASnode](https://git.rwth-aachen.de/acs/public/villas/node). +VILLASnode provides actual simulation data via websockets. VILLASweb-backend-go provides any other data such as user accounts, infrastructure components and configurations, dashboards etc. For more information on the backends see their repositories. ## Frameworks - The frontend is build upon [ReactJS](https://facebook.github.io/react/) and [Flux](https://facebook.github.io/flux/). - React is responsible for rendering the UI and Flux for handling the data and communication with the backends. For more information also have a look at REACT.md - -Additional libraries are used, for a complete list see package.json. +Additional libraries are used, for a complete list see the file `package.json`. ## Data model - ![Datamodel](src/img/datamodel.png) ## Quick start - -We recommend Docker to get started quickly: - ```bash -$ git clone --recursive git@git.rwth-aachen.de:VILLASframework/VILLASweb.git -$ cd VILLASweb +$ git clone --recursive https://git.rwth-aachen.de/acs/public/villas/web.git +$ cd web $ npm install $ npm start ``` - We recommend to start the VILLASweb-backend-go before the frontend. If you want to use test data (including some test users), you can start the backend with the parameter `-mode=test`. Please check the repository of the VILLASweb-backend-go to find information on the test user login names and passwords. The testing mode is NOT intended for production deployments. +## Documentation + +More details on the setup and usage of VILLASweb is available here: +- [Requirements](doc/Requirements.md) +- [Structure and datamodel](doc/Structure.md) +- [Development setup](doc/development.md) +- [Production setup](doc/Production.md) + ## Copyright 2020, Institute for Automation of Complex Power Systems, EONERC From cc156d751bcb6e880ed35a272eb31778021c2f05 Mon Sep 17 00:00:00 2001 From: Sonja Happ Date: Mon, 6 Jul 2020 11:33:11 +0200 Subject: [PATCH 280/391] implement signal auto config functionality based on response from VILLASnode API (to be tested) #224 --- src/scenario/scenario.js | 8 +- src/signal/signal-store.js | 10 +-- src/signal/signals-data-manager.js | 129 ++++++++++++++++++++++++++++- 3 files changed, 135 insertions(+), 12 deletions(-) diff --git a/src/scenario/scenario.js b/src/scenario/scenario.js index 8c91c95..d509e52 100644 --- a/src/scenario/scenario.js +++ b/src/scenario/scenario.js @@ -410,14 +410,18 @@ class Scenario extends React.Component { return; } + let splitHost = ic.host.split("/") let request = {}; request["id"] = this.uuidv4(); - request["action"] = "config" + request["action"] = "nodes" AppDispatcher.dispatch({ type: 'signals/start-autoconfig', data: request, - url: ic.apihost + url: ic.apihost, + socketname: splitHost[splitHost.length -1], + token: this.state.sessionToken, + configID: componentConfig.id }); } diff --git a/src/signal/signal-store.js b/src/signal/signal-store.js index e41b10c..ff4d228 100644 --- a/src/signal/signal-store.js +++ b/src/signal/signal-store.js @@ -34,19 +34,13 @@ class SignalStore extends ArrayStore{ return super.reduce(state, action); case 'signals/start-autoconfig': - this.dataManager.startAutoConfig(action.data, action.url) + this.dataManager.startAutoConfig(action.data, action.url, action.socketname, action.token, action.configID) return super.reduce(state, action); case 'signals/autoconfig-loaded': console.log("AutoConfig Loaded: ", action.data) // TODO save signal config contained in action.data - - const SIGNAL_AUTOCONF_INFO_NOTIFICATION = { - title: 'Signal configuration loaded successfully.', - message: '', - level: 'info' - }; - NotificationsDataManager.addNotification(SIGNAL_AUTOCONF_INFO_NOTIFICATION); + this.dataManager.saveSignals(action.data, action.token, action.configID, action.socketname); return super.reduce(state, action); diff --git a/src/signal/signals-data-manager.js b/src/signal/signals-data-manager.js index 94fa1b4..c8f7127 100644 --- a/src/signal/signals-data-manager.js +++ b/src/signal/signals-data-manager.js @@ -18,6 +18,7 @@ import RestDataManager from '../common/data-managers/rest-data-manager'; import RestAPI from "../common/api/rest-api"; import AppDispatcher from "../common/app-dispatcher"; +import NotificationsDataManager from "../common/data-managers/notifications-data-manager"; class SignalsDataManager extends RestDataManager{ @@ -36,7 +37,7 @@ class SignalsDataManager extends RestDataManager{ } - startAutoConfig(data, url){ + startAutoConfig(data, url, socketname, token, configID){ // This function queries the VILLASnode API to obtain the configuration of the VILLASnode located at url // Endpoint: http[s]://server:port/api/v1 (to be generated based on IC host, port 4000) // data contains the request data: { action, id, (request)} @@ -45,7 +46,10 @@ class SignalsDataManager extends RestDataManager{ RestAPI.post(url, data).then(response => { AppDispatcher.dispatch({ type: 'signals/autoconfig-loaded', - data: response + data: response, + token: token, + socketname: socketname, + configID: configID }); }).catch(error => { AppDispatcher.dispatch({ @@ -55,6 +59,127 @@ class SignalsDataManager extends RestDataManager{ }) } + saveSignals(data, token, configID, socketname){ + // data.response contains the response from the VILLASnode API, an array of node configurations + + if(!data.hasOwnProperty("response")){ + const SIGNAL_AUTOCONF_ERROR_NOTIFICATION = { + title: 'Failed to load signal config ', + message: 'VILLASnode returned no response field.', + level: 'error' + }; + NotificationsDataManager.addNotification(SIGNAL_AUTOCONF_ERROR_NOTIFICATION); + return; + } + + let configured = false; + let error = false; + for(let nodeConfig of data.response){ + if(!nodeConfig.hasOwnProperty("name")){ + console.warn("Could not parse the following node config because it lacks a name parameter:", nodeConfig); + } else if(nodeConfig.name === socketname){ + if(configured){ + const SIGNAL_AUTOCONF_WARNING_NOTIFICATION = { + title: 'There might be a problem with the signal auto-config', + message: 'VILLASnode returned multiple node configurations for the websocket ' + socketname + '. This is a problem of the VILLASnode.', + level: 'warning' + }; + NotificationsDataManager.addNotification(SIGNAL_AUTOCONF_WARNING_NOTIFICATION); + continue; + } + // signals are not yet configured: + console.log("Adding signals of websocket: ", nodeConfig); + let index_in = 1 + let index_out = 1 + + if(!nodeConfig.in.hasOwnProperty("signals")){ + const SIGNAL_AUTOCONF_ERROR_NOTIFICATION = { + title: 'Failed to load in signal config ', + message: 'No field for in signals contained in response.', + level: 'error' + }; + NotificationsDataManager.addNotification(SIGNAL_AUTOCONF_ERROR_NOTIFICATION); + error = true; + } else{ + + // add all in signals + for(let inSig of nodeConfig.in.signals) { + console.log("adding input signal:", inSig); + + if (inSig.enabled) { + let newSignal = { + configID: configID, + direction: 'in', + name: inSig.hasOwnProperty("name") ? inSig.name : "in_" + String(index_in), + unit: inSig.hasOwnProperty("unit") ? inSig.unit : '-', + index: index_in, + scalingFactor: 1.0 + }; + + AppDispatcher.dispatch({ + type: 'signals/start-add', + data: newSignal, + token: token + }); + + index_in++; + } + } + } + + if(!nodeConfig.out.hasOwnProperty("signals")){ + const SIGNAL_AUTOCONF_ERROR_NOTIFICATION = { + title: 'Failed to load out signal config ', + message: 'No field for out signals contained in response.', + level: 'error' + }; + NotificationsDataManager.addNotification(SIGNAL_AUTOCONF_ERROR_NOTIFICATION); + error=true; + }else { + + // add all out signals + + for (let outSig of nodeConfig.out.signals) { + console.log("adding output signal:", outSig); + + if (outSig.enabled) { + let newSignal = { + configID: configID, + direction: 'out', + name: outSig.hasOwnProperty("name") ? outSig.name : "out_" + String(index_out), + unit: outSig.hasOwnProperty("unit") ? outSig.unit : '-', + index: index_out, + scalingFactor: 1.0 + }; + + AppDispatcher.dispatch({ + type: 'signals/start-add', + data: newSignal, + token: token + }); + + index_out++; + } + } + } + + console.log("Configured", index_in-1, "input signals and", index_out-1, "output signals"); + configured=true; + } + + } + + if(!error) { + const SIGNAL_AUTOCONF_INFO_NOTIFICATION = { + title: 'Signal configuration loaded successfully.', + message: '', + level: 'info' + }; + NotificationsDataManager.addNotification(SIGNAL_AUTOCONF_INFO_NOTIFICATION); + } + + } + } export default new SignalsDataManager() From 1f6a4a07ba47cb0ba5a81e9a37dd6c007dbd8f00 Mon Sep 17 00:00:00 2001 From: Sonja Happ Date: Mon, 6 Jul 2020 12:50:40 +0200 Subject: [PATCH 281/391] Add API host parameter to IC table, make the parameter editable --- src/ic/edit-ic.js | 11 +++++++++++ src/ic/ics.js | 1 + 2 files changed, 12 insertions(+) diff --git a/src/ic/edit-ic.js b/src/ic/edit-ic.js index 404642c..e91c8ef 100644 --- a/src/ic/edit-ic.js +++ b/src/ic/edit-ic.js @@ -31,6 +31,7 @@ class EditICDialog extends React.Component { this.state = { name: '', host: '', + apihost: '', type: '', category: '', properties: {}, @@ -50,6 +51,10 @@ class EditICDialog extends React.Component { data.host = this.state.host; } + if (this.state.apihost != null && this.state.apihost !== "" && this.state.apihost !== "http://" && this.state.apihost !== this.props.ic.apihost) { + data.apihost = this.state.apihost; + } + if (this.state.type != null && this.state.type !== "" && this.state.type !== this.props.ic.type) { data.type = this.state.type; } @@ -77,6 +82,7 @@ class EditICDialog extends React.Component { this.setState({ name: this.props.ic.name, host: this.props.ic.host, + apihost: this.props.ic.apihost, type: this.props.ic.type, category: this.props.ic.category, properties: _.merge({}, _.get(this.props.ic, 'rawProperties'), _.get(this.props.ic, 'properties')) @@ -97,6 +103,11 @@ class EditICDialog extends React.Component { this.handleChange(e)} /> + + API Host + this.handleChange(e)} /> + + Category (e.g. Simulator, Gateway, ...) this.handleChange(e)} /> diff --git a/src/ic/ics.js b/src/ic/ics.js index e24cd93..5cd7719 100644 --- a/src/ic/ics.js +++ b/src/ic/ics.js @@ -280,6 +280,7 @@ class InfrastructureComponents extends Component { {/* */} + Date: Mon, 6 Jul 2020 16:57:49 +0200 Subject: [PATCH 282/391] Show multiple selected files in component config table; add column for simulation model; allow for selection of multiple files per component config in edit dialog #234 --- package-lock.json | 9 +++++ package.json | 1 + src/componentconfig/edit-config.js | 56 ++++++++++++++++++++---------- src/scenario/scenario.js | 21 ++++++++--- 4 files changed, 64 insertions(+), 23 deletions(-) diff --git a/package-lock.json b/package-lock.json index 56c4421..5ad0112 100644 --- a/package-lock.json +++ b/package-lock.json @@ -8902,6 +8902,15 @@ "resolved": "https://registry.npmjs.org/multicast-dns-service-types/-/multicast-dns-service-types-1.1.0.tgz", "integrity": "sha1-iZ8R2WhuXgXLkbNdXw5jt3PPyQE=" }, + "multiselect-react-dropdown": { + "version": "1.5.7", + "resolved": "https://registry.npmjs.org/multiselect-react-dropdown/-/multiselect-react-dropdown-1.5.7.tgz", + "integrity": "sha512-bDlXYEzpV/5p5G5nIFRrZ/Ndf8CSYWliZ62n/5imfjLy0K2/dNx6sFmk4W/Phq83bzPUDK/RI4553yCk6YzZwg==", + "requires": { + "react": "^16.7.0", + "react-dom": "^16.7.0" + } + }, "mute-stream": { "version": "0.0.8", "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", diff --git a/package.json b/package.json index 0f50af1..11aceb7 100644 --- a/package.json +++ b/package.json @@ -25,6 +25,7 @@ "jszip": "^3.5.0", "libcimsvg": "git+https://git.rwth-aachen.de/acs/public/cim/pintura-npm-package.git", "lodash": "^4.17.15", + "multiselect-react-dropdown": "^1.5.7", "node-sass": "^4.14.1", "popper.js": "^1.16.1", "prop-types": "^15.7.2", diff --git a/src/componentconfig/edit-config.js b/src/componentconfig/edit-config.js index a69159d..ba6e413 100644 --- a/src/componentconfig/edit-config.js +++ b/src/componentconfig/edit-config.js @@ -17,6 +17,7 @@ import React from 'react'; import {FormGroup, FormControl, FormLabel} from 'react-bootstrap'; +import { Multiselect } from 'multiselect-react-dropdown' import Dialog from '../common/dialogs/dialog'; import ParametersEditor from '../common/parameters-editor'; import SelectFile from "../file/select-file"; @@ -28,12 +29,11 @@ class EditConfigDialog extends React.Component { super(props); this.state = { - selectedFile: null, name: '', icID: '', configuration: null, startParameters: this.props.config.startParameters, - selectedFileID: this.props.config.selectedFileID + fileIDs: this.props.config.fileIDs }; } @@ -52,9 +52,13 @@ class EditConfigDialog extends React.Component { if(this.state.startParameters !== {} && JSON.stringify(this.props.config.startParameters) !== JSON.stringify(this.state.startParameters)){ data.startParameters = this.state.startParameters; } - if (parseInt(this.state.selectedFileID, 10) !== 0 && - this.props.config.selectedFileID !== parseInt(this.state.selectedFileID)) { - data.selectedFileID = parseInt(this.state.selectedFileID, 10); + + let IDs = [] + for(let e of this.state.fileIDs){ + IDs.push(e.id) + } + if (JSON.stringify(IDs) !== JSON.stringify(this.props.config.fileIDs)){ + data.fileIDs = IDs; } //forward modified config to callback function @@ -79,10 +83,19 @@ class EditConfigDialog extends React.Component { this.valid = this.isValid() } - handleSelectedFileChange(event){ - //console.log("Config file change to: ", event.target.value); - this.setState({selectedFileID: event.target.value}) + onFileSelect(selectedList, selectedItem) { + this.setState({ + fileIDs: selectedList + }) + this.valid = this.isValid() + } + + onFileRemove(selectedList, removedItem) { + + this.setState({ + fileIDs: selectedList + }) this.valid = this.isValid() } @@ -91,9 +104,7 @@ class EditConfigDialog extends React.Component { return this.state.name !== '' || this.state.icID !== '' || this.state.startParameters !== {} - || this.state.selectedFile != null || this.state.configuration != null - || this.state.selectedFileID !== 0; } resetState() { @@ -105,6 +116,15 @@ class EditConfigDialog extends React.Component { ); + let configFileOptions = []; + for(let file of this.props.files) { + configFileOptions.push( + {name: file.name, id: file.id} + ); + } + + + return ( this.onClose(c)} onReset={() => this.resetState()} valid={this.valid}>
      @@ -121,14 +141,14 @@ class EditConfigDialog extends React.Component { - this.handleSelectedFileChange(e)} - files={this.props.files} - value={this.state.selectedFileID} - scenarioID={this.props.config.scenarioID} - sessionToken={this.props.sessionToken} + this.onFileSelect(selectedList, selectedItem)} + onRemove={(selectedList, removedItem) => this.onFileRemove(selectedList, removedItem)} + displayValue={'name'} + placeholder={'Select file(s)...'} /> diff --git a/src/scenario/scenario.js b/src/scenario/scenario.js index 8d3495e..8e2ceda 100644 --- a/src/scenario/scenario.js +++ b/src/scenario/scenario.js @@ -396,12 +396,22 @@ class Scenario extends React.Component { * File modification methods ############################################## */ - getFileName(id) { - for (let file of this.state.files) { - if (file.id === id) { - return file.name; + getListOfFiles(fileIDs, type) { + + let fileList = ''; + + for (let id of fileIDs){ + for (let file of this.state.files) { + if (file.id === id && (type === 'all' || file.type.includes(type))) { + fileList = fileList + '\n' + file.name; + } } } + + + + + return fileList; } /* ############################################## @@ -428,7 +438,8 @@ class Scenario extends React.Component { this.onConfigChecked(index, event)} width='30' /> - this.getFileName(selectedFileID)} /> + this.getListOfFiles(fileIDs, 'all')} /> + this.getListOfFiles(fileIDs, 'xml')} /> Date: Mon, 6 Jul 2020 16:58:25 +0200 Subject: [PATCH 283/391] remove unused import --- src/componentconfig/edit-config.js | 1 - 1 file changed, 1 deletion(-) diff --git a/src/componentconfig/edit-config.js b/src/componentconfig/edit-config.js index ba6e413..2e277b1 100644 --- a/src/componentconfig/edit-config.js +++ b/src/componentconfig/edit-config.js @@ -20,7 +20,6 @@ import {FormGroup, FormControl, FormLabel} from 'react-bootstrap'; import { Multiselect } from 'multiselect-react-dropdown' import Dialog from '../common/dialogs/dialog'; import ParametersEditor from '../common/parameters-editor'; -import SelectFile from "../file/select-file"; class EditConfigDialog extends React.Component { valid = false; From a20dff47a9fe54380fc230605fbce8658ada67c6 Mon Sep 17 00:00:00 2001 From: Laura Fuentes Grau Date: Tue, 7 Jul 2020 21:34:21 +0200 Subject: [PATCH 284/391] wip: adding tooltips , cosmetic changes #235 --- src/common/table.js | 11 +++--- src/dashboard/dashboard-button-group.js | 48 ++++++++++++++++--------- src/dashboard/dashboard.js | 1 - src/widget/toolbox-item.js | 2 +- src/widget/widget-toolbox.js | 9 +++-- 5 files changed, 46 insertions(+), 25 deletions(-) diff --git a/src/common/table.js b/src/common/table.js index d68191a..87a52be 100644 --- a/src/common/table.js +++ b/src/common/table.js @@ -17,7 +17,7 @@ import React, { Component } from 'react'; import _ from 'lodash'; -import { Table, Button, FormControl, FormLabel, FormCheck } from 'react-bootstrap'; +import { Table, Button, FormControl, FormLabel, FormCheck, Tooltip, OverlayTrigger } from 'react-bootstrap'; import { Link } from 'react-router-dom'; import Icon from './icon'; @@ -103,11 +103,13 @@ class CustomTable extends Component { // add buttons if (child.props.editButton) { - cell.push(); + cell.push( Edit } > + ); } if (child.props.deleteButton) { - cell.push(); + cell.push( Delete } > + ); } if (child.props.checkbox) { @@ -117,7 +119,8 @@ class CustomTable extends Component { } if (child.props.exportButton) { - cell.push(); + cell.push( Export } > + ); } return cell; diff --git a/src/dashboard/dashboard-button-group.js b/src/dashboard/dashboard-button-group.js index 8baeece..b18e5b3 100644 --- a/src/dashboard/dashboard-button-group.js +++ b/src/dashboard/dashboard-button-group.js @@ -17,13 +17,13 @@ import React from 'react'; import PropTypes from 'prop-types'; -import { Button } from 'react-bootstrap'; +import { Button,OverlayTrigger, Tooltip } from 'react-bootstrap'; import Icon from "../common/icon"; class DashboardButtonGroup extends React.Component { render() { const buttonStyle = { - marginLeft: '8px' + marginLeft: '12px', }; const buttons = []; @@ -35,46 +35,60 @@ class DashboardButtonGroup extends React.Component { if (this.props.editing) { buttons.push( - , - + , + Discard changes } > + + ); } else { if (this.props.fullscreen !== true) { buttons.push( - + ); } if (this.props.paused) { buttons.push( - + ); } else { buttons.push( - + ); } buttons.push( - + ); buttons.push( - + ); } diff --git a/src/dashboard/dashboard.js b/src/dashboard/dashboard.js index 05f69e1..e45d6aa 100644 --- a/src/dashboard/dashboard.js +++ b/src/dashboard/dashboard.js @@ -240,7 +240,6 @@ class Dashboard extends Component { closeEditFiles(){ this.setState({ filesEditModal: false }); - // TODO do we need this if the dispatches happen in the dialog? } closeEdit(data){ diff --git a/src/widget/toolbox-item.js b/src/widget/toolbox-item.js index b61bdc4..4703aee 100644 --- a/src/widget/toolbox-item.js +++ b/src/widget/toolbox-item.js @@ -51,7 +51,7 @@ class ToolboxItem extends React.Component { if (this.props.disabled === false) { return this.props.connectDragSource(
      - + {this.props.icon && } {this.props.name} diff --git a/src/widget/widget-toolbox.js b/src/widget/widget-toolbox.js index 18912f1..b2fb527 100644 --- a/src/widget/widget-toolbox.js +++ b/src/widget/widget-toolbox.js @@ -54,6 +54,11 @@ class WidgetToolbox extends React.Component { + Drag and drop widgets onto the dashboard } > + +
      @@ -65,12 +70,12 @@ class WidgetToolbox extends React.Component {
      Increase dashboard height } > - Decrease dashboard height } > - From f3f58696caa349b03720b67e3d67d369889ba1a2 Mon Sep 17 00:00:00 2001 From: Laura Fuentes Grau Date: Tue, 7 Jul 2020 21:37:46 +0200 Subject: [PATCH 285/391] edit files button added to scenario page #219 --- src/scenario/scenario.js | 41 ++++++++++++++++++++++++++++++++++++++-- 1 file changed, 39 insertions(+), 2 deletions(-) diff --git a/src/scenario/scenario.js b/src/scenario/scenario.js index 8d3495e..0b9df12 100644 --- a/src/scenario/scenario.js +++ b/src/scenario/scenario.js @@ -17,7 +17,7 @@ import React from 'react'; import { Container } from 'flux/utils'; -import { Button, InputGroup, FormControl } from 'react-bootstrap'; +import { Button, InputGroup, FormControl, Tooltip, OverlayTrigger } from 'react-bootstrap'; import FileSaver from 'file-saver'; @@ -35,6 +35,7 @@ import TableColumn from '../common/table-column'; import ImportConfigDialog from '../componentconfig/import-config'; import ImportDashboardDialog from "../dashboard/import-dashboard"; import NewDashboardDialog from "../dashboard/new-dashboard"; +import EditFiles from '../file/edit-files' import ICAction from '../ic/ic-action'; import DeleteDialog from '../common/dialogs/delete-dialog'; @@ -93,6 +94,8 @@ class Scenario extends React.Component { modalConfigData: (prevState.modalConfigData !== {} && prevState.modalConfigData !== undefined )? prevState.modalConfigData : {}, selectedConfigs: [], modalConfigIndex: 0, + filesEditModal: prevState.filesEditModal || false, + filesEditSaveState: prevState.filesEditSaveState || [], editOutputSignalsModal: prevState.editOutputSignalsModal || false, editInputSignalsModal: prevState.editInputSignalsModal || false, @@ -391,6 +394,24 @@ class Scenario extends React.Component { this.setState({editOutputSignalsModal: false}); } } + + onEditFiles(){ + console.log("here r the files in scenario:"); + console.log(this.state.file); + let tempFiles = []; + this.state.files.forEach( file => { + tempFiles.push({ + id: file.id, + name: file.name + }); + }) + this.setState({filesEditModal: true, filesEditSaveState: tempFiles}); + } + + closeEditFiles(){ + this.setState({ filesEditModal: false }); + // TODO do we need this if the dispatches happen in the dialog? + } /* ############################################## * File modification methods @@ -419,8 +440,24 @@ class Scenario extends React.Component { } return
      +
      + Add, edit or delete files of scenario } > + + +

      {this.state.scenario.name}

      + + {/*Component Configurations table*/} @@ -443,7 +480,7 @@ class Scenario extends React.Component { /> this.getICName(icID)} /> Date: Wed, 8 Jul 2020 14:49:59 +0200 Subject: [PATCH 286/391] fix for widgets that use signals in case no signal is selected --- src/widget/widgets/gauge.js | 166 ++++++++++++++++++----------------- src/widget/widgets/input.js | 12 +-- src/widget/widgets/lamp.js | 29 +++--- src/widget/widgets/slider.js | 10 ++- src/widget/widgets/value.js | 46 +++++----- 5 files changed, 138 insertions(+), 125 deletions(-) diff --git a/src/widget/widgets/gauge.js b/src/widget/widgets/gauge.js index 3aa3e3b..629784e 100644 --- a/src/widget/widgets/gauge.js +++ b/src/widget/widgets/gauge.js @@ -81,114 +81,116 @@ class WidgetGauge extends Component { // get the signal with the selected signal ID let signalID = props.widget.signalIDs[0]; let signal = props.signals.filter(s => s.id === signalID) - // determine ID of infrastructure component related to signal[0] (there is only one signal for a lamp widget) - let icID = props.icIDs[signal[0].id]; - let returnState = {} + if(signal.length > 0) { + // determine ID of infrastructure component related to signal[0] (there is only one signal for a lamp widget) + let icID = props.icIDs[signal[0].id]; - returnState["colorZones"] = props.widget.customProperties.zones; + let returnState = {} - if(signalID){ - returnState["signalID"] = signalID; - } - // Update unit (assuming there is exactly one signal for this widget) - if(signal !== undefined){ - returnState["unit"] = signal[0].unit; - } + returnState["colorZones"] = props.widget.customProperties.zones; - // update value + if (signalID) { + returnState["signalID"] = signalID; + } + // Update unit (assuming there is exactly one signal for this widget) + if (signal !== undefined) { + returnState["unit"] = signal[0].unit; + } - // check if data available - if (props.data == null - || props.data[icID] == null - || props.data[icID].output == null - || props.data[icID].output.values == null) { - return{ value: 0, minValue: 0, maxValue: 10}; - } + // update value - // memorize if min or max value is updated - let updateValue = false; - let updateMinValue = false; - let updateMaxValue = false; + // check if data available + if (props.data == null + || props.data[icID] == null + || props.data[icID].output == null + || props.data[icID].output.values == null) { + return {value: 0, minValue: 0, maxValue: 10}; + } - // check if value has changed - const data = props.data[icID].output.values[signal[0].index-1]; - // Take just 3 decimal positions - // Note: Favor this method over Number.toFixed(n) in order to avoid a type conversion, since it returns a String - if (data != null) { - const value = signal[0].scalingFactor * Math.round(data[data.length - 1].y * 1e3) / 1e3; - let minValue = null; - let maxValue = null; + // memorize if min or max value is updated + let updateValue = false; + let updateMinValue = false; + let updateMaxValue = false; - if ((state.value !== value && value != null) || props.widget.customProperties.valueUseMinMax || state.useMinMaxChange) { - //value has changed - updateValue = true; + // check if value has changed + const data = props.data[icID].output.values[signal[0].index - 1]; + // Take just 3 decimal positions + // Note: Favor this method over Number.toFixed(n) in order to avoid a type conversion, since it returns a String + if (data != null) { + const value = signal[0].scalingFactor * Math.round(data[data.length - 1].y * 1e3) / 1e3; + let minValue = null; + let maxValue = null; - // update min-max if needed - let updateLabels = false; + if ((state.value !== value && value != null) || props.widget.customProperties.valueUseMinMax || state.useMinMaxChange) { + //value has changed + updateValue = true; - minValue = state.minValue; - maxValue = state.maxValue; + // update min-max if needed + let updateLabels = false; - if (minValue == null || (!props.widget.customProperties.valueUseMinMax && (value < minValue || signalID !== state.signalID)) ||state.useMinMaxChange) { - minValue = value - 0.5; - updateLabels = true; - updateMinValue = true; - } + minValue = state.minValue; + maxValue = state.maxValue; - if (maxValue == null || (!props.widget.customProperties.valueUseMinMax && (value > maxValue || signalID !== state.signalID)) || state.useMinMaxChange) { - maxValue = value + 0.5; - updateLabels = true; - updateMaxValue = true; - returnState["useMinMaxChange"] = false; - } + if (minValue == null || (!props.widget.customProperties.valueUseMinMax && (value < minValue || signalID !== state.signalID)) || state.useMinMaxChange) { + minValue = value - 0.5; + updateLabels = true; + updateMinValue = true; + } - if (props.widget.customProperties.valueUseMinMax) { + if (maxValue == null || (!props.widget.customProperties.valueUseMinMax && (value > maxValue || signalID !== state.signalID)) || state.useMinMaxChange) { + maxValue = value + 0.5; + updateLabels = true; + updateMaxValue = true; + returnState["useMinMaxChange"] = false; + } + + if (props.widget.customProperties.valueUseMinMax) { minValue = props.widget.customProperties.valueMin; updateMinValue = true; maxValue = props.widget.customProperties.valueMax; updateMaxValue = true; updateLabels = true; - } - - if (updateLabels === false && state.gauge) { - // check if min/max changed - if (minValue > state.gauge.minValue) { - minValue = state.gauge.minValue; - updateMinValue = true; } - if (maxValue < state.gauge.maxValue) { - maxValue = state.gauge.maxValue; - updateMaxValue = true; + if (updateLabels === false && state.gauge) { + // check if min/max changed + if (minValue > state.gauge.minValue) { + minValue = state.gauge.minValue; + updateMinValue = true; + } + + if (maxValue < state.gauge.maxValue) { + maxValue = state.gauge.maxValue; + updateMaxValue = true; + } } } - } - if(props.widget.customProperties.valueUseMinMax !== state.useMinMax){ - returnState["useMinMax"] = props.widget.customProperties.valueUseMinMax; - } + if (props.widget.customProperties.valueUseMinMax !== state.useMinMax) { + returnState["useMinMax"] = props.widget.customProperties.valueUseMinMax; + } - // prepare returned state - if(updateValue === true){ - returnState["value"] = value; - } - if(updateMinValue === true){ - returnState["minValue"] = minValue; - } - if(updateMaxValue === true){ - returnState["maxValue"] = maxValue; - } - - if (returnState !== {}){ - return returnState; - } - else{ - return null; - } - } // if there is signal data + // prepare returned state + if (updateValue === true) { + returnState["value"] = value; + } + if (updateMinValue === true) { + returnState["minValue"] = minValue; + } + if (updateMaxValue === true) { + returnState["maxValue"] = maxValue; + } + if (returnState !== {}) { + return returnState; + } else { + return null; + } + } // if there is signal data + } + return null; } diff --git a/src/widget/widgets/input.js b/src/widget/widgets/input.js index 0b87617..142f4e2 100644 --- a/src/widget/widgets/input.js +++ b/src/widget/widgets/input.js @@ -42,11 +42,13 @@ class WidgetInput extends Component { value = Number(props.widget.customProperties.default_value) } - // Update unit (assuming there is exactly one signal for this widget) - let signalID = props.widget.signalIDs[0]; - let signal = props.signals.find(sig => sig.id === signalID); - if(signal !== undefined){ - unit = signal.unit; + if (props.widget.signalIDs.length > 0) { + // Update unit (assuming there is exactly one signal for this widget) + let signalID = props.widget.signalIDs[0]; + let signal = props.signals.find(sig => sig.id === signalID); + if (signal !== undefined) { + unit = signal.unit; + } } if (unit !== '' && value !== ''){ diff --git a/src/widget/widgets/lamp.js b/src/widget/widgets/lamp.js index c0ca9a0..c6fd5e6 100644 --- a/src/widget/widgets/lamp.js +++ b/src/widget/widgets/lamp.js @@ -36,21 +36,24 @@ class WidgetLamp extends Component { // get the signal with the selected signal ID let signalID = props.widget.signalIDs[0]; let signal = props.signals.filter(s => s.id === signalID) - // determine ID of infrastructure component related to signal[0] (there is only one signal for a lamp widget) - let icID = props.icIDs[signal[0].id]; - // check if data available - if (props.data == null - || props.data[icID] == null - || props.data[icID].output == null - || props.data[icID].output.values == null) { - return{value:''}; - } + if(signal.length>0) { + // determine ID of infrastructure component related to signal[0] (there is only one signal for a lamp widget) + let icID = props.icIDs[signal[0].id]; - // check if value has changed - const data = props.data[icID].output.values[signal[0].index-1]; - if (data != null && Number(state.value) !== signal[0].scalingFactor * data[data.length - 1].y) { - return { value: signal[0].scalingFactor * data[data.length - 1].y }; + // check if data available + if (props.data == null + || props.data[icID] == null + || props.data[icID].output == null + || props.data[icID].output.values == null) { + return {value: ''}; + } + + // check if value has changed + const data = props.data[icID].output.values[signal[0].index - 1]; + if (data != null && Number(state.value) !== signal[0].scalingFactor * data[data.length - 1].y) { + return {value: signal[0].scalingFactor * data[data.length - 1].y}; + } } return null; diff --git a/src/widget/widgets/slider.js b/src/widget/widgets/slider.js index 10bb055..8e7e2ff 100644 --- a/src/widget/widgets/slider.js +++ b/src/widget/widgets/slider.js @@ -53,10 +53,12 @@ class WidgetSlider extends Component { } // Update unit (assuming there is exactly one signal for this widget) - let signalID = props.widget.signalIDs[0]; - let signal = props.signals.find(sig => sig.id === signalID); - if(signal !== undefined){ - unit = signal.unit; + if (props.widget.signalIDs.length > 0) { + let signalID = props.widget.signalIDs[0]; + let signal = props.signals.find(sig => sig.id === signalID); + if (signal !== undefined) { + unit = signal.unit; + } } if (unit !== '' && value !== ''){ diff --git a/src/widget/widgets/value.js b/src/widget/widgets/value.js index 8c4c5a9..482a94f 100644 --- a/src/widget/widgets/value.js +++ b/src/widget/widgets/value.js @@ -36,31 +36,35 @@ class WidgetValue extends Component { // get the signal with the selected signal ID let signalID = props.widget.signalIDs[0]; let signal = props.signals.filter(s => s.id === signalID) - // determine ID of infrastructure component related to signal[0] (there is only one signal for a value widget) - let icID = props.icIDs[signal[0].id]; + if(signal.length>0) { + // determine ID of infrastructure component related to signal[0] (there is only one signal for a value widget) + let icID = props.icIDs[signal[0].id]; - // check if data available - let value = '' - if (props.data == null || props.data[icID] == null || props.data[icID].output == null || props.data[icID].output.values == null) { - value = ''; - } else { - // check if value has changed - const data = props.data[icID].output.values[signal[0].index - 1]; - if (data != null && Number(state.value) !== data[data.length - 1].y) { - value = signal[0].scalingFactor * data[data.length - 1].y; + // check if data available + let value = '' + if (props.data == null || props.data[icID] == null || props.data[icID].output == null || props.data[icID].output.values == null) { + value = ''; + } else { + // check if value has changed + const data = props.data[icID].output.values[signal[0].index - 1]; + if (data != null && Number(state.value) !== data[data.length - 1].y) { + value = signal[0].scalingFactor * data[data.length - 1].y; + } } + + // Update unit (assuming there is exactly one signal for this widget) + let unit = ''; + if (signal !== undefined) { + unit = signal[0].unit; + } + + return { + value: value, + unit: unit, + }; } - // Update unit (assuming there is exactly one signal for this widget) - let unit = ''; - if(signal !== undefined){ - unit = signal[0].unit; - } - - return { - value: value, - unit: unit, - }; + return null; } From bb09c691f876cab3a18548a6b8b5b093893aae95 Mon Sep 17 00:00:00 2001 From: Sonja Happ Date: Wed, 8 Jul 2020 15:42:40 +0200 Subject: [PATCH 287/391] generalize edit file control --- src/widget/edit-widget/edit-widget-file-control.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/widget/edit-widget/edit-widget-file-control.js b/src/widget/edit-widget/edit-widget-file-control.js index a55aa23..21868ce 100644 --- a/src/widget/edit-widget/edit-widget-file-control.js +++ b/src/widget/edit-widget/edit-widget-file-control.js @@ -49,7 +49,7 @@ class EditFileWidgetControl extends React.Component { let fileOptions = []; if (this.state.files.length > 0){ fileOptions.push( - + ) fileOptions.push(this.state.files.map((file, index) => ( @@ -60,7 +60,7 @@ class EditFileWidgetControl extends React.Component { return
      - Image + File Date: Wed, 8 Jul 2020 15:44:01 +0200 Subject: [PATCH 288/391] widget edit dialog remains open even if widget component is updated in the meantime --- src/dashboard/dashboard.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/dashboard/dashboard.js b/src/dashboard/dashboard.js index e45d6aa..9c3590b 100644 --- a/src/dashboard/dashboard.js +++ b/src/dashboard/dashboard.js @@ -112,7 +112,7 @@ class Dashboard extends Component { return ICused; }); } - + return { dashboard, widgets, @@ -125,7 +125,7 @@ class Dashboard extends Component { editing: prevState.editing || false, paused: prevState.paused || false, - editModal: false, + editModal: prevState.editModal || false, filesEditModal: prevState.filesEditModal || false, filesEditSaveState: prevState.filesEditSaveState || [], modalData: null, From 9303b0b2c2d92dcc2235cf076945fe2845038b2b Mon Sep 17 00:00:00 2001 From: Sonja Happ Date: Wed, 8 Jul 2020 15:45:57 +0200 Subject: [PATCH 289/391] Fixing edit of Topology window, file changes work now #217 --- src/widget/widgets/topology.js | 90 ++++++++++++++++------------------ 1 file changed, 42 insertions(+), 48 deletions(-) diff --git a/src/widget/widgets/topology.js b/src/widget/widgets/topology.js index 8aad399..1eb64fc 100644 --- a/src/widget/widgets/topology.js +++ b/src/widget/widgets/topology.js @@ -65,19 +65,12 @@ function show(element) { if(element !== undefined) { element.style.visibility = 'inherit'; } - else{ - console.log("MouseOver, show, element undefined.") - } } function hide(element) { if (element !== undefined) { element.style.visibility = 'hidden'; - } else { - console.log("MouseLeave, hide, element undefined.") } - - } // De-initialize functions @@ -91,25 +84,45 @@ class WidgetTopology extends React.Component { super(props); this.svgElem = React.createRef(); this.Viewer = null; - this.dashboardState = 'initial' - this.message = '' - let file = this.props.files.find(file => file.id === parseInt(this.props.widget.customProperties.file, 10)); this.state = { - file: file + file: this.props.files.find(file => file.id === parseInt(this.props.widget.customProperties.file, 10)), + dashboardState: 'initial', + message: '' }; } static getDerivedStateFromProps(props, state){ + // find the selected file of the widget, is undefined if no file is selected let file = props.files.find(file => file.id === parseInt(props.widget.customProperties.file, 10)); - if (state.file === undefined || state.file.id !== file.id) { - return{ - file: file - }; + let dashboardState = state.dashboardState; + let message = state.message; + + if(file === undefined){ + dashboardState = 'show_message'; + message = 'Select a topology model.' + } else if (!file.hasOwnProperty('data') && dashboardState === 'show_message'){ + // data of file is missing, start download + dashboardState = 'loading'; + message = ''; + AppDispatcher.dispatch({ + type: 'files/start-download', + data: file.id, + token: props.token + }); + } else if (file.hasOwnProperty('data') && (dashboardState === 'loading'|| dashboardState === 'show_message')){ + //file is available set state to ready + dashboardState = 'ready' + message = ''; } - return null + + return{ + file: file, + dashboardState:dashboardState, + message: message, + }; } componentDidMount() { @@ -124,13 +137,12 @@ class WidgetTopology extends React.Component { //this.Viewer.fitToViewer(); - // Query the file referenced by the widget - let widgetFile = parseInt(this.props.widget.customProperties.file, 10); - if (widgetFile !== -1 && this.state.file === undefined) { - this.dashboardState = 'loading'; + // Query the file referenced by the widget (if any) + if (this.state.file !== undefined) { + this.setState({dashboardState: 'loading'}); AppDispatcher.dispatch({ type: 'files/start-download', - data: widgetFile, + data: this.state.file.id, token: this.props.token }); } @@ -142,43 +154,25 @@ class WidgetTopology extends React.Component { componentDidUpdate(prevProps: Readonly

      , prevState: Readonly, snapshot: SS): void { - if(this.state.file === undefined) { - // No file has been selected - this.dashboardState = 'show_message'; - this.message = 'Select a topology model first.'; - return; - } - - if((prevState.file === undefined && this.state.file !== undefined) - || (this.state.file.id !== prevState.file.id && this.state.file.id !== -1)) { - // if file has changed, download new file - this.dashboardState = 'loading'; - AppDispatcher.dispatch({ - type: 'files/start-download', - data: this.state.file.id, - token: this.props.token - }); - } else if (this.state.file.hasOwnProperty("data") && this.dashboardState === 'loading') { - // data of file has been newly downloaded (did not exist in previous state) - this.dashboardState = 'ready'; - - } else if(this.state.file.hasOwnProperty("data") && this.dashboardState === 'ready'){ + if(this.state.dashboardState === 'ready'){ + //Topology file incl data downloaded, init SVG (should happen only once!) if (this.svgElem) { let cimsvgInstance = new cimsvg(this.svgElem.current); cimsvg.setCimsvg(cimsvgInstance); cimsvgInstance.setFileCount(1); // transform data blob into string format this.state.file.data.text().then(function(content) { - cimsvgInstance.loadFile(content); - cimsvgInstance.fit(); - attachComponentEvents(); + cimsvgInstance.loadFile(content); + cimsvgInstance.fit(); + attachComponentEvents(); }); + this.setState({dashboardState: 'loaded'}); } else { console.error("The svgElem variable is not initialized before the attempt to create the cimsvg instance."); } - } + } } render() { @@ -192,11 +186,11 @@ class WidgetTopology extends React.Component { position: "right" } - switch(this.dashboardState) { + switch(this.state.dashboardState) { case 'loading': markup =

      ; break; case 'show_message': - markup =
      { this.message }
      ; break; + markup =
      { this.state.message }
      ; break; default: markup = (
      Date: Wed, 8 Jul 2020 16:41:55 +0200 Subject: [PATCH 290/391] Add edit button to model file column, prepare placeholder for Pintura start #234 --- src/scenario/scenario.js | 51 ++++++++++++++++++++++++++++++++++++---- 1 file changed, 46 insertions(+), 5 deletions(-) diff --git a/src/scenario/scenario.js b/src/scenario/scenario.js index 8e2ceda..59b7804 100644 --- a/src/scenario/scenario.js +++ b/src/scenario/scenario.js @@ -396,14 +396,18 @@ class Scenario extends React.Component { * File modification methods ############################################## */ - getListOfFiles(fileIDs, type) { + getListOfFiles(fileIDs, types) { let fileList = ''; for (let id of fileIDs){ for (let file of this.state.files) { - if (file.id === id && (type === 'all' || file.type.includes(type))) { - fileList = fileList + '\n' + file.name; + if (file.id === id && types.some(e => file.type.includes(e))) { + if (fileList === ''){ + fileList = file.name + } else { + fileList = fileList + ';' + file.name; + } } } } @@ -414,6 +418,37 @@ class Scenario extends React.Component { return fileList; } + startPintura(configIndex){ + let config = this.state.configs[configIndex]; + + // get xml / CIM file + let files = [] + for (let id of config.fileIDs){ + for (let file of this.state.files) { + if (file.id === id && ['xml'].some(e => file.type.includes(e))) { + files.push(file); + } + } + } + + if(files.length > 1){ + // more than one CIM file... + console.warn("There is more than one CIM file selected in this component configuration. I will open them all in a separate tab.") + } + + let base_host = 'aaa.bbb.ccc.ddd/api/v2/files/' + for (let file of files) { + // endpoint param serves for download and upload of CIM file, token is required for authentication + let params = { + token: this.state.sessionToken, + endpoint: base_host + String(file.id), + } + + // TODO start Pintura for editing CIM/ XML file from here + console.warn("Starting Pintura... and nothing happens so far :-) ", params) + } + } + /* ############################################## * Render method ############################################## */ @@ -438,8 +473,14 @@ class Scenario extends React.Component {
      this.onConfigChecked(index, event)} width='30' /> - this.getListOfFiles(fileIDs, 'all')} /> - this.getListOfFiles(fileIDs, 'xml')} /> + this.getListOfFiles(fileIDs, ['json', 'JSON'])} /> + this.getListOfFiles(fileIDs, ['xml'])} + editButton + onEdit={(index) => this.startPintura(index)} + /> Date: Wed, 8 Jul 2020 17:02:29 +0200 Subject: [PATCH 291/391] Fix Dropdown Item import --- src/ic/ic-action.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/ic/ic-action.js b/src/ic/ic-action.js index 6a9e591..51d2cd2 100644 --- a/src/ic/ic-action.js +++ b/src/ic/ic-action.js @@ -16,7 +16,7 @@ ******************************************************************************/ import React from 'react'; -import { Button, ButtonToolbar, DropdownButton, DropdownItem } from 'react-bootstrap'; +import { Button, ButtonToolbar, DropdownButton, Dropdown } from 'react-bootstrap'; class ICAction extends React.Component { constructor(props) { @@ -49,9 +49,9 @@ class ICAction extends React.Component { render() { const actionList = this.props.actions.map(action => ( - + {action.title} - + )); return
      From 564906cf252eed4206a0e8e29a17668cbe3809b6 Mon Sep 17 00:00:00 2001 From: irismarie Date: Wed, 8 Jul 2020 17:50:41 +0200 Subject: [PATCH 292/391] corrected grid snapping, solves #232 notes: -was already snapping to grid but didn't look like it because toolbox border was shifting everything by 3px -drag function wasn't updating the position, this.rnd.updatePosition doesn't work inside onDrag -snapping while dragging is done by dragGrid property --- src/styles/app.css | 2 +- src/widget/editable-widget-container.js | 18 +++++------------- 2 files changed, 6 insertions(+), 14 deletions(-) diff --git a/src/styles/app.css b/src/styles/app.css index 797512a..98888f1 100644 --- a/src/styles/app.css +++ b/src/styles/app.css @@ -305,7 +305,7 @@ body { } .toolbox-dropzone-editing { - border: 3px dashed #e1e1e1; + outline: 3px dashed #e1e1e1; } .toolbox-dropzone-active { diff --git a/src/widget/editable-widget-container.js b/src/widget/editable-widget-container.js index 5ac2a55..91f691d 100644 --- a/src/widget/editable-widget-container.js +++ b/src/widget/editable-widget-container.js @@ -31,7 +31,6 @@ class EditableWidgetContainer extends React.Component { if (this.props.grid === 1) { return value; } - return Math.round(value / this.props.grid) * this.props.grid; } @@ -41,28 +40,22 @@ class EditableWidgetContainer extends React.Component { } }; - drag = (event, data) => { - const x = this.snapToGrid(data.x); - const y = this.snapToGrid(data.y); - - if (x !== data.x || y !== data.y) { - this.rnd.updatePosition({ x, y }); - } - }; - dragStop = (event, data) => { const widget = this.props.widget; - widget.x = this.snapToGrid(data.x); widget.y = this.snapToGrid(data.y); + + if (widget.x !== data.x || widget.y !== data.y) { + this.rnd.updatePosition({ x: widget.x, y: widget.y}); + } + if (this.props.onWidgetChange != null) { this.props.onWidgetChange(widget, this.props.index); } }; resizeStop = (event, direction, ref,delta, position) => { - const widget = this.props.widget; // resize depends on direction @@ -119,7 +112,6 @@ class EditableWidgetContainer extends React.Component { className={widgetClasses} onResizeStart={this.borderWasClicked} onResizeStop={this.resizeStop} - onDrag={this.drag} onDragStop={this.dragStop} dragGrid={gridArray} resizeGrid={gridArray} From ed26cd16fd217edfc4504b3e29c06367a083eab3 Mon Sep 17 00:00:00 2001 From: irismarie Date: Thu, 9 Jul 2020 15:58:39 +0200 Subject: [PATCH 293/391] delete unused function --- src/scenario/scenarios.js | 13 ------------- 1 file changed, 13 deletions(-) diff --git a/src/scenario/scenarios.js b/src/scenario/scenarios.js index 87aa7e5..63432ce 100644 --- a/src/scenario/scenarios.js +++ b/src/scenario/scenarios.js @@ -117,19 +117,6 @@ class Scenarios extends Component { }); }; - showEditModal(id) { - // get scenario by id - var editScenario; - - this.state.scenarios.forEach((scenario) => { - if (scenario.id === id) { - editScenario = scenario; - } - }); - - this.setState({ editModal: true, modalScenario: editScenario }); - } - closeEditModal(data) { this.setState({ editModal: false }); From 5567bb433ccc94a57ce12bf4dc4bd77c0253ce9f Mon Sep 17 00:00:00 2001 From: irismarie Date: Thu, 9 Jul 2020 16:04:38 +0200 Subject: [PATCH 294/391] edit dashboard name, closes #233 --- src/dashboard/edit-dashboard.js | 6 +++--- src/scenario/scenario.js | 20 ++++++++++++++++++++ 2 files changed, 23 insertions(+), 3 deletions(-) diff --git a/src/dashboard/edit-dashboard.js b/src/dashboard/edit-dashboard.js index 7de6012..900a6c8 100644 --- a/src/dashboard/edit-dashboard.js +++ b/src/dashboard/edit-dashboard.js @@ -21,14 +21,14 @@ import { FormGroup, FormControl, FormLabel } from 'react-bootstrap'; import Dialog from '../common/dialogs/dialog'; class EditDashboardDialog extends React.Component { - valid: false; + valid = true; constructor(props) { super(props); this.state = { name: '', - _id: '' + id: '' } } @@ -49,7 +49,7 @@ class EditDashboardDialog extends React.Component { resetState() { this.setState({ name: this.props.dashboard.name, - _id: this.props.dashboard._id + id: this.props.dashboard.id }); } diff --git a/src/scenario/scenario.js b/src/scenario/scenario.js index 615f0ed..1155aa1 100644 --- a/src/scenario/scenario.js +++ b/src/scenario/scenario.js @@ -35,6 +35,7 @@ import TableColumn from '../common/table-column'; import ImportConfigDialog from '../componentconfig/import-config'; import ImportDashboardDialog from "../dashboard/import-dashboard"; import NewDashboardDialog from "../dashboard/new-dashboard"; +import EditDashboardDialog from '../dashboard/edit-dashboard'; import EditFiles from '../file/edit-files' import ICAction from '../ic/ic-action'; @@ -101,6 +102,7 @@ class Scenario extends React.Component { editInputSignalsModal: prevState.editInputSignalsModal || false, newDashboardModal: false, + dashboardEditModal: prevState.dashboardEditModal || false, deleteDashboardModal: false, importDashboardModal: false, modalDashboardData: {}, @@ -336,6 +338,21 @@ class Scenario extends React.Component { } } + closeEditDashboardModal(data) { + this.setState({ dashboardEditModal: false }); + + let editDashboard = this.state.modalDashboardData; + + if (data != null) { + editDashboard.name = data.name; + AppDispatcher.dispatch({ + type: 'dashboards/start-edit', + data: editDashboard, + token: this.state.sessionToken + }); + } + } + closeDeleteDashboardModal(confirmDelete) { this.setState({ deleteDashboardModal: false }); @@ -600,8 +617,10 @@ class Scenario extends React.Component { this.setState({ dashboardEditModal: true, modalDashboardData: this.state.dashboards[index] })} onDelete={(index) => this.setState({ deleteDashboardModal: true, modalDashboardData: this.state.dashboards[index], modalDashboardIndex: index })} onExport={index => this.exportDashboard(index)} /> @@ -615,6 +634,7 @@ class Scenario extends React.Component {
      this.closeNewDashboardModal(data)} /> + this.closeEditDashboardModal(data)} /> this.closeImportDashboardModal(data)} /> this.closeDeleteDashboardModal(e)} /> From 51fafbf61b4ca2927e128cb1b1d3504f67ad43fe Mon Sep 17 00:00:00 2001 From: irismarie Date: Fri, 10 Jul 2020 13:08:24 +0200 Subject: [PATCH 295/391] added padding, closes #244 --- src/widget/toolbox-item.js | 4 ++-- src/widget/widget-toolbox.js | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/widget/toolbox-item.js b/src/widget/toolbox-item.js index 4703aee..7df6cfc 100644 --- a/src/widget/toolbox-item.js +++ b/src/widget/toolbox-item.js @@ -51,7 +51,7 @@ class ToolboxItem extends React.Component { if (this.props.disabled === false) { return this.props.connectDragSource(
      - + {this.props.icon && } {this.props.name} @@ -61,7 +61,7 @@ class ToolboxItem extends React.Component { else { return (
      - + {this.props.icon && } {this.props.name} diff --git a/src/widget/widget-toolbox.js b/src/widget/widget-toolbox.js index b2fb527..04e8492 100644 --- a/src/widget/widget-toolbox.js +++ b/src/widget/widget-toolbox.js @@ -70,7 +70,7 @@ class WidgetToolbox extends React.Component {
      Increase dashboard height } > - From b7a1ec106b39ed97d3b5293886163dcdff999fbf Mon Sep 17 00:00:00 2001 From: irismarie Date: Fri, 10 Jul 2020 16:38:04 +0200 Subject: [PATCH 296/391] remove text from input after submitting (scenario user), closes #237 --- src/scenario/scenario.js | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/src/scenario/scenario.js b/src/scenario/scenario.js index 1155aa1..09f8712 100644 --- a/src/scenario/scenario.js +++ b/src/scenario/scenario.js @@ -107,6 +107,7 @@ class Scenario extends React.Component { importDashboardModal: false, modalDashboardData: {}, + userToAdd: '', deleteUserName: '', deleteUserModal: false, } @@ -139,13 +140,19 @@ class Scenario extends React.Component { * User modification methods ############################################## */ + onUserInputChange(e) { + this.setState({userToAdd: e.target.value}); + } + addUser() { AppDispatcher.dispatch({ type: 'scenarios/add-user', data: this.state.scenario.id, - username: this.userToAdd, + username: this.state.userToAdd, token: this.state.sessionToken }); + + this.setState({userToAdd: ''}); } closeDeleteUserModal() { @@ -657,7 +664,9 @@ class Scenario extends React.Component { this.userToAdd = e.target.value} + onChange={(e) => this.onUserInputChange(e)} + value={this.state.userToAdd} + type="text" /> , Discard changes } > ); @@ -51,7 +59,7 @@ class DashboardButtonGroup extends React.Component { buttons.push( Change to fullscreen view } > ); @@ -61,7 +69,7 @@ class DashboardButtonGroup extends React.Component { buttons.push( Continue simulation } > ); @@ -69,7 +77,7 @@ class DashboardButtonGroup extends React.Component { buttons.push( Pause simulation } > ); @@ -78,7 +86,7 @@ class DashboardButtonGroup extends React.Component { buttons.push( Add, edit or delete files of scenario } > ); @@ -86,7 +94,7 @@ class DashboardButtonGroup extends React.Component { buttons.push( Add widgets and edit layout } > ); diff --git a/src/ic/ic-action.js b/src/ic/ic-action.js index 51d2cd2..80c60e0 100644 --- a/src/ic/ic-action.js +++ b/src/ic/ic-action.js @@ -16,7 +16,7 @@ ******************************************************************************/ import React from 'react'; -import { Button, ButtonToolbar, DropdownButton, Dropdown } from 'react-bootstrap'; +import { Button, ButtonToolbar, DropdownButton, Dropdown, Tooltip, OverlayTrigger } from 'react-bootstrap'; class ICAction extends React.Component { constructor(props) { @@ -48,6 +48,8 @@ class ICAction extends React.Component { }; render() { + let showTooltip = this.state.selectedAction.id === '-1'; + const actionList = this.props.actions.map(action => ( {action.title} @@ -55,14 +57,25 @@ class ICAction extends React.Component { )); return
      - Send command to infrastructure component + {showTooltip ? + + Select command for infrastructure component } > + + {actionList} + + + Send command to infrastructure component } > + + + + : {actionList} - + }
      ; } } diff --git a/src/scenario/scenario.js b/src/scenario/scenario.js index 09f8712..5b413f3 100644 --- a/src/scenario/scenario.js +++ b/src/scenario/scenario.js @@ -508,11 +508,17 @@ class Scenario extends React.Component { paddingTop: '30px' } + const iconStyle = { + color: '#007bff', + height: '25px', + width : '25px' + } + return
      Add, edit or delete files of scenario } >
      diff --git a/src/widget/toolbox-item.js b/src/widget/toolbox-item.js index 7df6cfc..f1ebb93 100644 --- a/src/widget/toolbox-item.js +++ b/src/widget/toolbox-item.js @@ -51,7 +51,7 @@ class ToolboxItem extends React.Component { if (this.props.disabled === false) { return this.props.connectDragSource(
      - + {this.props.icon && } {this.props.name} diff --git a/src/widget/widget-toolbox.js b/src/widget/widget-toolbox.js index 04e8492..07c3a36 100644 --- a/src/widget/widget-toolbox.js +++ b/src/widget/widget-toolbox.js @@ -37,6 +37,12 @@ class WidgetToolbox extends React.Component { render() { // Only one topology widget at the time is supported + const iconStyle = { + color: '#007bff', + height: '25px', + width : '25px' + } + const thereIsTopologyWidget = this.props.widgets != null && Object.values(this.props.widgets).filter(w => w.type === 'Topology').length > 0; const topologyItemMsg = thereIsTopologyWidget? 'Currently only one is supported' : ''; @@ -70,13 +76,13 @@ class WidgetToolbox extends React.Component {
      Increase dashboard height } > - Decrease dashboard height } > -
      From b42425a0e5a81134c6ae496e2b35b3f5835fadd0 Mon Sep 17 00:00:00 2001 From: irismarie Date: Tue, 14 Jul 2020 15:51:48 +0200 Subject: [PATCH 298/391] added line widget (#206) --- src/styles/widgets.css | 11 ++++++ .../edit-widget-control-creator.js | 8 +++- src/widget/widget-factory.js | 7 ++++ src/widget/widget-toolbox.js | 1 + src/widget/widget.js | 6 +++ src/widget/widgets/line.js | 39 +++++++++++++++++++ 6 files changed, 71 insertions(+), 1 deletion(-) create mode 100644 src/widget/widgets/line.js diff --git a/src/styles/widgets.css b/src/styles/widgets.css index 4a8c976..102a311 100644 --- a/src/styles/widgets.css +++ b/src/styles/widgets.css @@ -379,3 +379,14 @@ div[class*="-widget"] label { border: 2px solid lightgray; } /* End box widget */ + +/* Begin line widget */ +.line-widget { + width: 100%; + height: 1%; + border: 2px solid red; + transform: rotate(0deg); +} + + +/* End line widget */ diff --git a/src/widget/edit-widget/edit-widget-control-creator.js b/src/widget/edit-widget/edit-widget-control-creator.js index 2b656dc..1cf26ad 100644 --- a/src/widget/edit-widget/edit-widget-control-creator.js +++ b/src/widget/edit-widget/edit-widget-control-creator.js @@ -144,7 +144,6 @@ export default function CreateControls(widgetType = null, widget = null, session handleChange(e) } /> ); break; - case 'NumberInput': DialogControls.push( handleChange(e)} />, @@ -152,6 +151,13 @@ export default function CreateControls(widgetType = null, widget = null, session handleChange(e)} /> ); break; + case 'Line': + DialogControls.push( + handleChange(e)} />, + handleChange(e)} />, + handleChange(e)} /> + ); + break; default: console.log('Non-valid widget type: ' + widgetType); diff --git a/src/widget/widget-factory.js b/src/widget/widget-factory.js index 8b08117..285e2ed 100644 --- a/src/widget/widget-factory.js +++ b/src/widget/widget-factory.js @@ -180,6 +180,13 @@ class WidgetFactory { widget.height = 400; widget.customProperties.file = -1; // ID of file, -1 means non selected break; + case 'Line': + widget.height = 50; + widget.customProperties.border_color = 8; + WidgetSlider.customPropertier.border_width = 2; + widget.customProperties.margin_top = 15; + widget.customProperties.rotation = 0; + break; default: widget.width = 100; diff --git a/src/widget/widget-toolbox.js b/src/widget/widget-toolbox.js index 07c3a36..5236ece 100644 --- a/src/widget/widget-toolbox.js +++ b/src/widget/widget-toolbox.js @@ -53,6 +53,7 @@ class WidgetToolbox extends React.Component { + diff --git a/src/widget/widget.js b/src/widget/widget.js index e2faeb1..7b647db 100644 --- a/src/widget/widget.js +++ b/src/widget/widget.js @@ -43,6 +43,7 @@ import WidgetGauge from './widgets/gauge'; import WidgetBox from './widgets/box'; import WidgetHTML from './widgets/html'; import WidgetTopology from './widgets/topology'; +import WidgetLine from './widgets/line'; import '../styles/widgets.css'; @@ -221,6 +222,11 @@ class Widget extends React.Component { files={this.state.files} token={this.state.sessionToken} /> + } else if (widget.type === 'Line') { + return } return null; diff --git a/src/widget/widgets/line.js b/src/widget/widgets/line.js new file mode 100644 index 0000000..9ccc4eb --- /dev/null +++ b/src/widget/widgets/line.js @@ -0,0 +1,39 @@ +/** + * This file is part of VILLASweb. + * + * VILLASweb is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * VILLASweb is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with VILLASweb. If not, see . + ******************************************************************************/ + +import React, { Component } from 'react'; + +import EditWidgetColorControl from '../edit-widget/edit-widget-color-control'; +import EditWidgetNumberControl from '../edit-widget/edit-widget-number-control'; + +class WidgetLine extends Component { + render() { + const lineStyle = { + borderColor: EditWidgetColorControl.ColorPalette[this.props.widget.customProperties.border_color], + transform: 'rotate(' + this.props.widget.customProperties.rotation + 'deg)', + borderWidth: '' + this.props.widget.customProperties.border_width + 'px' + }; + + return ( +
      + { } +
      + ); + } +} + +export default WidgetLine; From e628a5559305f81f6a74c6f53f094a53a4547dcb Mon Sep 17 00:00:00 2001 From: irismarie Date: Tue, 14 Jul 2020 16:02:15 +0200 Subject: [PATCH 299/391] fixed issue with line default value --- src/widget/widget-factory.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/widget/widget-factory.js b/src/widget/widget-factory.js index 285e2ed..ac2a8d8 100644 --- a/src/widget/widget-factory.js +++ b/src/widget/widget-factory.js @@ -181,9 +181,9 @@ class WidgetFactory { widget.customProperties.file = -1; // ID of file, -1 means non selected break; case 'Line': - widget.height = 50; - widget.customProperties.border_color = 8; - WidgetSlider.customPropertier.border_width = 2; + widget.height = 20; + widget.customProperties.border_color = 0; + widget.customProperties.border_width = 2; widget.customProperties.margin_top = 15; widget.customProperties.rotation = 0; break; From e1e9c61c64e28a4e891e13f3f372ebf44a30ce8d Mon Sep 17 00:00:00 2001 From: irismarie Date: Tue, 14 Jul 2020 16:47:25 +0200 Subject: [PATCH 300/391] increase default height so line can be edited more easily --- src/widget/widget-factory.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/widget/widget-factory.js b/src/widget/widget-factory.js index ac2a8d8..0e16c84 100644 --- a/src/widget/widget-factory.js +++ b/src/widget/widget-factory.js @@ -181,7 +181,7 @@ class WidgetFactory { widget.customProperties.file = -1; // ID of file, -1 means non selected break; case 'Line': - widget.height = 20; + widget.height = 30; widget.customProperties.border_color = 0; widget.customProperties.border_width = 2; widget.customProperties.margin_top = 15; From 7a065ea5c567b9cc77f0eb0bab1305c7874f9521 Mon Sep 17 00:00:00 2001 From: irismarie Date: Tue, 14 Jul 2020 16:52:28 +0200 Subject: [PATCH 301/391] increase dialog size for signal editing, see #246 --- src/common/dialogs/dialog.js | 2 +- src/signal/edit-signal-mapping.js | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/src/common/dialogs/dialog.js b/src/common/dialogs/dialog.js index 9b3a2c8..4cc15af 100644 --- a/src/common/dialogs/dialog.js +++ b/src/common/dialogs/dialog.js @@ -46,7 +46,7 @@ class Dialog extends React.Component { render() { return ( - + {this.props.title} diff --git a/src/signal/edit-signal-mapping.js b/src/signal/edit-signal-mapping.js index 0c64108..59d2818 100644 --- a/src/signal/edit-signal-mapping.js +++ b/src/signal/edit-signal-mapping.js @@ -164,7 +164,8 @@ class EditSignalMapping extends React.Component { blendOutCancel = {true} onClose={(c) => this.onClose(c)} onReset={() => this.resetState()} - valid={true}> + valid={true} + size='lg'> {this.props.direction} Mapping From b1d8c1fd390420295ea2defd195e5aea7ff77b14 Mon Sep 17 00:00:00 2001 From: irismarie Date: Tue, 14 Jul 2020 17:03:25 +0200 Subject: [PATCH 302/391] remove unused import --- src/widget/widgets/line.js | 1 - 1 file changed, 1 deletion(-) diff --git a/src/widget/widgets/line.js b/src/widget/widgets/line.js index 9ccc4eb..680ca03 100644 --- a/src/widget/widgets/line.js +++ b/src/widget/widgets/line.js @@ -18,7 +18,6 @@ import React, { Component } from 'react'; import EditWidgetColorControl from '../edit-widget/edit-widget-color-control'; -import EditWidgetNumberControl from '../edit-widget/edit-widget-number-control'; class WidgetLine extends Component { render() { From 765a0a61afc9fd8bdaac93c4525ebdc522f73d51 Mon Sep 17 00:00:00 2001 From: irismarie Date: Tue, 14 Jul 2020 17:37:19 +0200 Subject: [PATCH 303/391] fix error, see #206 --- src/widget/edit-widget/edit-widget-control-creator.js | 2 +- src/widget/widget-factory.js | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/src/widget/edit-widget/edit-widget-control-creator.js b/src/widget/edit-widget/edit-widget-control-creator.js index 1cf26ad..b26bc04 100644 --- a/src/widget/edit-widget/edit-widget-control-creator.js +++ b/src/widget/edit-widget/edit-widget-control-creator.js @@ -155,7 +155,7 @@ export default function CreateControls(widgetType = null, widget = null, session DialogControls.push( handleChange(e)} />, handleChange(e)} />, - handleChange(e)} /> + handleChange(e)} /> ); break; diff --git a/src/widget/widget-factory.js b/src/widget/widget-factory.js index 0e16c84..3fe95e6 100644 --- a/src/widget/widget-factory.js +++ b/src/widget/widget-factory.js @@ -182,6 +182,7 @@ class WidgetFactory { break; case 'Line': widget.height = 30; + widget.width = 150; widget.customProperties.border_color = 0; widget.customProperties.border_width = 2; widget.customProperties.margin_top = 15; From 63ac373191ad3dd8e016ccc996e067232f7676e8 Mon Sep 17 00:00:00 2001 From: Sonja Happ Date: Wed, 15 Jul 2020 11:18:29 +0200 Subject: [PATCH 304/391] time shows in plot edit dialog, closes #247 --- .../edit-widget/edit-widget-time-control.js | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/src/widget/edit-widget/edit-widget-time-control.js b/src/widget/edit-widget/edit-widget-time-control.js index 21b135d..23fb368 100644 --- a/src/widget/edit-widget/edit-widget-time-control.js +++ b/src/widget/edit-widget/edit-widget-time-control.js @@ -23,7 +23,7 @@ class EditWidgetTimeControl extends Component { super(props); this.state = { - widget: { + widget: { } }; } @@ -36,10 +36,23 @@ class EditWidgetTimeControl extends Component { render() { + let parts = this.props.controlId.split('.'); + let isCustomProperty = true; + if (parts.length === 1){ + isCustomProperty = false; + } + return ( Time - this.props.handleChange(e)} /> + this.props.handleChange(e)} + /> Time in seconds ); From dd13535e67c7fe8d822dbae7e6d19d6c85e910b3 Mon Sep 17 00:00:00 2001 From: Sonja Happ Date: Wed, 15 Jul 2020 11:28:22 +0200 Subject: [PATCH 305/391] renaming Host of IC to WebSocket Endpoint for more clarity, closes #242 --- src/ic/ics.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ic/ics.js b/src/ic/ics.js index e24cd93..db3b812 100644 --- a/src/ic/ics.js +++ b/src/ic/ics.js @@ -279,7 +279,7 @@ class InfrastructureComponents extends Component { {/* */} - + Date: Wed, 15 Jul 2020 12:33:51 +0200 Subject: [PATCH 306/391] Host is optional now, backend update required, closes #241 --- src/ic/new-ic.js | 4 ---- 1 file changed, 4 deletions(-) diff --git a/src/ic/new-ic.js b/src/ic/new-ic.js index 9f0dbb1..93f1e83 100644 --- a/src/ic/new-ic.js +++ b/src/ic/new-ic.js @@ -80,10 +80,6 @@ class NewICDialog extends React.Component { uuid = false; } - if (this.state.host === '') { - host = false; - } - if (this.state.type === '') { type = false; } From ceadb074854d80c0c2e503dd67d546747be9fb14 Mon Sep 17 00:00:00 2001 From: Sonja Happ Date: Wed, 15 Jul 2020 12:34:31 +0200 Subject: [PATCH 307/391] Fix an issue showing update time of IC in table, backend update required --- package-lock.json | 5 +++++ package.json | 1 + src/ic/ics.js | 11 ++++++----- 3 files changed, 12 insertions(+), 5 deletions(-) diff --git a/package-lock.json b/package-lock.json index 5ad0112..225cb05 100644 --- a/package-lock.json +++ b/package-lock.json @@ -8870,6 +8870,11 @@ "minimist": "^1.2.5" } }, + "moment": { + "version": "2.27.0", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.27.0.tgz", + "integrity": "sha512-al0MUK7cpIcglMv3YF13qSgdAIqxHTO7brRtaz3DlSULbqfazqkc5kEjNrLDOM7fsjshoFIihnU8snrP7zUvhQ==" + }, "move-concurrently": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/move-concurrently/-/move-concurrently-1.0.1.tgz", diff --git a/package.json b/package.json index 11aceb7..31cf318 100644 --- a/package.json +++ b/package.json @@ -25,6 +25,7 @@ "jszip": "^3.5.0", "libcimsvg": "git+https://git.rwth-aachen.de/acs/public/cim/pintura-npm-package.git", "lodash": "^4.17.15", + "moment": "^2.27.0", "multiselect-react-dropdown": "^1.5.7", "node-sass": "^4.14.1", "popper.js": "^1.16.1", diff --git a/src/ic/ics.js b/src/ic/ics.js index db3b812..de97d21 100644 --- a/src/ic/ics.js +++ b/src/ic/ics.js @@ -20,6 +20,7 @@ import { Container } from 'flux/utils'; import { Button } from 'react-bootstrap'; import FileSaver from 'file-saver'; import _ from 'lodash'; +import moment from 'moment' import AppDispatcher from '../common/app-dispatcher'; import InfrastructureComponentStore from './ic-store'; @@ -256,10 +257,10 @@ class InfrastructureComponents extends Component { return style.join(' ') } - static stateUpdateModifier(updatedAt) { - const date = new Date(updatedAt); - - return date.toLocaleString('de-DE'); + stateUpdateModifier(updatedAt) { + let dateFormat = 'ddd, DD MMM YYYY HH:mm:ss'; + let dateTime = moment.utc(updatedAt, dateFormat); + return dateTime.toLocaleString('de-DE'); } render() { @@ -280,7 +281,7 @@ class InfrastructureComponents extends Component { {/* */} - + this.stateUpdateModifier(stateUpdateAt)} /> Date: Wed, 15 Jul 2020 13:33:40 +0200 Subject: [PATCH 308/391] Add UUID of IC in edit IC dialog window, closes #240 ; increase size of edit IC dialog --- src/ic/edit-ic.js | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/src/ic/edit-ic.js b/src/ic/edit-ic.js index 404642c..3c3795a 100644 --- a/src/ic/edit-ic.js +++ b/src/ic/edit-ic.js @@ -85,8 +85,17 @@ class EditICDialog extends React.Component { render() { return ( - this.onClose(c)} onReset={() => this.resetState()} valid={this.valid}> + this.onClose(c)} + onReset={() => this.resetState()} + valid={this.valid} + size='lg' + > + UUID: {this.props.ic.uuid} Name this.handleChange(e)} /> From 22da583f657d62f737f5509f6bb0cb97f9492550 Mon Sep 17 00:00:00 2001 From: Sonja Happ Date: Wed, 15 Jul 2020 13:48:28 +0200 Subject: [PATCH 309/391] Make properties of IC editable #243 --- src/ic/edit-ic.js | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/src/ic/edit-ic.js b/src/ic/edit-ic.js index 3c3795a..e5784e0 100644 --- a/src/ic/edit-ic.js +++ b/src/ic/edit-ic.js @@ -73,6 +73,10 @@ class EditICDialog extends React.Component { this.setState({ [e.target.id]: e.target.value }); } + handlePropertiesChange(data) { + this.setState({ properties: data }); + } + resetState() { this.setState({ name: this.props.ic.name, @@ -118,7 +122,11 @@ class EditICDialog extends React.Component { Properties - + this.handlePropertiesChange(data)} + /> From 708482ec1f03caa1d7f391d4755beb1e35525acb Mon Sep 17 00:00:00 2001 From: Laura Fuentes Grau Date: Wed, 15 Jul 2020 14:09:44 +0200 Subject: [PATCH 310/391] wip: make file (name) editable #219, edit files dialog now big enough to encompass table --- src/common/array-store.js | 5 ++ src/common/data-managers/rest-data-manager.js | 10 ++- src/file/edit-file-name.js | 79 +++++++++++++++++++ src/file/edit-files.js | 49 +++++++++--- src/scenario/scenario.js | 2 - src/styles/app.css | 21 ----- 6 files changed, 128 insertions(+), 38 deletions(-) create mode 100644 src/file/edit-file-name.js diff --git a/src/common/array-store.js b/src/common/array-store.js index 0c536f0..1c045e7 100644 --- a/src/common/array-store.js +++ b/src/common/array-store.js @@ -128,7 +128,12 @@ class ArrayStore extends ReduceStore { return super.reduce(state, action); case this.type + '/start-edit': + if(action.id){ + this.dataManager.update(action.data, action.token,action.param,action.id); + } + else{ this.dataManager.update(action.data, action.token,action.param); + } return state; case this.type + '/edited': diff --git a/src/common/data-managers/rest-data-manager.js b/src/common/data-managers/rest-data-manager.js index fb23eff..7727a4e 100644 --- a/src/common/data-managers/rest-data-manager.js +++ b/src/common/data-managers/rest-data-manager.js @@ -68,7 +68,11 @@ class RestDataManager { } } case 'remove/update': - if(param === null){ + if(id !== null){ + return this.makeURL(this.url + '/' + id); + + } + else if(param === null){ return this.makeURL(this.url + '/' + object.id); } else{ @@ -201,11 +205,11 @@ class RestDataManager { }); } - update(object, token = null, param = null) { + update(object, token = null, param = null, id = null) { var obj = {}; obj[this.type] = this.filterKeys(object); - RestAPI.put(this.requestURL('remove/update',null,param,object), obj, token).then(response => { + RestAPI.put(this.requestURL('remove/update',id,param,object), obj, token).then(response => { AppDispatcher.dispatch({ type: this.type + 's/edited', data: response[this.type] diff --git a/src/file/edit-file-name.js b/src/file/edit-file-name.js new file mode 100644 index 0000000..05481b3 --- /dev/null +++ b/src/file/edit-file-name.js @@ -0,0 +1,79 @@ +/** + * This file is part of VILLASweb. + * + * VILLASweb is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * VILLASweb is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with VILLASweb. If not, see . + ******************************************************************************/ + +import React from 'react'; +import {FormGroup, FormControl, FormLabel, Col} from 'react-bootstrap'; + +import Dialog from '../common/dialogs/dialog'; + +class EditFileName extends React.Component { + valid = true; + + constructor(props) { + super(props); + + this.state = { + file: {}, + + }; + } + + onClose = canceled => { + if (canceled) { + if (this.props.onClose != null) { + this.props.onClose(); + } + + return; + } + + if (this.valid && this.props.onClose != null) { + this.props.onClose(this.state.file); + } + }; + + handleChange = event => { + this.props.file.name = event.target.value; + this.setState({file: this.props.file}); + + let name = true; + + if (this.state.name === '') { + name = false; + } + + this.valid = name; + + }; + + + + render() { + return this.onClose(c)} valid={true}> +
      + + Name + + + + + +
      ; + } +} + +export default EditFileName; diff --git a/src/file/edit-files.js b/src/file/edit-files.js index 4f3c8a7..3e2e003 100644 --- a/src/file/edit-files.js +++ b/src/file/edit-files.js @@ -21,6 +21,7 @@ import Dialog from '../common/dialogs/dialog'; import AppDispatcher from "../common/app-dispatcher"; import Table from "../common/table"; import TableColumn from "../common/table-column"; +import EditFileName from "./edit-file-name"; class EditFilesDialog extends React.Component { @@ -32,7 +33,9 @@ class EditFilesDialog extends React.Component { this.state = { uploadFile: null, - uploadProgress: 0 + uploadProgress: 0, + editModal: false, + modalFile: {} }; } @@ -84,6 +87,22 @@ class EditFilesDialog extends React.Component { }; + closeEditModal(data){ + if(data !== {} || data !== "undefined"){ + const formData = new FormData(); + formData.append("object", data); + + AppDispatcher.dispatch({ + type: 'files/start-edit', + data: formData, + token: this.props.sessionToken, + id: data.id + }); + } + + this.setState({editModal: false}); + } + deleteFile(index){ let file = this.props.files[index] @@ -114,24 +133,24 @@ class EditFilesDialog extends React.Component { marginTop: '-40px' }; + return ( - this.onClose(c)} blendOutCancel = {true} valid={true}> + this.onClose(c)} blendOutCancel = {true} valid={true} size = 'lg'>
      -
      -
      - - - - +
      + + + + this.deleteFile(index)} + editButton + onEdit={index => this.setState({ editModal: true, modalFile: this.props.files[index] })} />
      -
      -
      +
      + + this.closeEditModal(data)} file={this.state.modalFile} /> + +
    + + ); } } diff --git a/src/scenario/scenario.js b/src/scenario/scenario.js index 5b413f3..44a332f 100644 --- a/src/scenario/scenario.js +++ b/src/scenario/scenario.js @@ -420,8 +420,6 @@ class Scenario extends React.Component { } onEditFiles(){ - console.log("here r the files in scenario:"); - console.log(this.state.file); let tempFiles = []; this.state.files.forEach( file => { tempFiles.push({ diff --git a/src/styles/app.css b/src/styles/app.css index 98888f1..84d330e 100644 --- a/src/styles/app.css +++ b/src/styles/app.css @@ -272,27 +272,6 @@ body { supported by Chrome and Opera */ } -.edit-table table { - background-color: #fff; - table-layout: fixed; - word-wrap: break-word; - width: 467px; -} - -.edit-table th { - position: sticky; - top: 0; - text-align: left; -} - -.edit-table td{ - text-align: left; -} - -.edit-table td { - padding: 2px 8px !important; -} - /** * Toolbox */ From 57e38089b023e33f7f0f9b905fb3fe10407572da Mon Sep 17 00:00:00 2001 From: Laura Fuentes Grau Date: Wed, 15 Jul 2020 16:07:12 +0200 Subject: [PATCH 311/391] Resize dashboard buttons now work as expected if the dashboard is empty, decrease button disabled if min dashboard height has been reached #230 --- src/dashboard/dashboard.js | 10 +++++++--- src/widget/widget-toolbox.js | 18 +++++++++++++++++- 2 files changed, 24 insertions(+), 4 deletions(-) diff --git a/src/dashboard/dashboard.js b/src/dashboard/dashboard.js index 9c3590b..584a4f2 100644 --- a/src/dashboard/dashboard.js +++ b/src/dashboard/dashboard.js @@ -73,7 +73,10 @@ class Dashboard extends Component { return thisWidgetHeight > maxHeightSoFar? thisWidgetHeight : maxHeightSoFar; }, 0); - if(dashboard.height === 0 || maxHeight + 80 > dashboard.height) + if(dashboard.height === 0){ + dashboard.height = 400; + } + else if(maxHeight + 80 > dashboard.height) { dashboard.height = maxHeight + 80; } @@ -367,11 +370,12 @@ class Dashboard extends Component { return absolutHeight > currentHeight ? absolutHeight : currentHeight; }, 0); let dashboard = this.state.dashboard; + if(value === -1){ let tempHeight = this.state.dashboard.height - 50; - if(tempHeight > (maxHeight + 80)){ + if(tempHeight >= 400 && tempHeight >= (maxHeight + 80)){ dashboard.height = tempHeight; this.setState({dashboard}); } @@ -420,7 +424,7 @@ class Dashboard extends Component {
    e.preventDefault() }> {this.state.editing && - + } {!draggable?( diff --git a/src/widget/widget-toolbox.js b/src/widget/widget-toolbox.js index 5236ece..f8d6390 100644 --- a/src/widget/widget-toolbox.js +++ b/src/widget/widget-toolbox.js @@ -35,7 +35,23 @@ class WidgetToolbox extends React.Component { } }; + disableDecrease(){ + const maxHeight = Object.values(this.props.widgets).reduce((currentHeight, widget) => { + const absolutHeight = widget.y + widget.height; + + return absolutHeight > currentHeight ? absolutHeight : currentHeight; + }, 0); + + if(this.props.dashboard.height <= 400 || this.props.dashboard.height <= maxHeight + 80){ + return true; + } + + return false; + } + render() { + + const disableDecrease = this.disableDecrease(); // Only one topology widget at the time is supported const iconStyle = { color: '#007bff', @@ -82,7 +98,7 @@ class WidgetToolbox extends React.Component { Decrease dashboard height } > - From 3c1e5107d479fe1d2154b6f2de88dda397599784 Mon Sep 17 00:00:00 2001 From: Sonja Happ Date: Mon, 20 Jul 2020 09:47:58 +0200 Subject: [PATCH 312/391] Update package versions --- package-lock.json | 153 ++++++++++++++++++++++++++++------------------ package.json | 14 ++--- 2 files changed, 100 insertions(+), 67 deletions(-) diff --git a/package-lock.json b/package-lock.json index 225cb05..116a654 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1110,31 +1110,31 @@ "integrity": "sha512-ij4wRiunFfaJxjB0BdrYHIH8FxBJpOwNPhhAcunlmPdXudL1WQV1qoP9un6JsEBAgQH+7UXyyjh0g7jTxXK6tg==" }, "@fortawesome/fontawesome-common-types": { - "version": "0.2.29", - "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-common-types/-/fontawesome-common-types-0.2.29.tgz", - "integrity": "sha512-cY+QfDTbZ7XVxzx7jxbC98Oxr/zc7R2QpTLqTxqlfyXDrAJjzi/xUIqAUsygELB62JIrbsWxtSRhayKFkGI7MA==" + "version": "0.2.30", + "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-common-types/-/fontawesome-common-types-0.2.30.tgz", + "integrity": "sha512-TsRwpTuKwFNiPhk1UfKgw7zNPeV5RhNp2Uw3pws+9gDAkPGKrtjR1y2lI3SYn7+YzyfuNknflpBA1LRKjt7hMg==" }, "@fortawesome/fontawesome-svg-core": { - "version": "1.2.29", - "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-svg-core/-/fontawesome-svg-core-1.2.29.tgz", - "integrity": "sha512-xmPmP2t8qrdo8RyKihTkGb09RnZoc+7HFBCnr0/6ZhStdGDSLeEd7ajV181+2W29NWIFfylO13rU+s3fpy3cnA==", + "version": "1.2.30", + "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-svg-core/-/fontawesome-svg-core-1.2.30.tgz", + "integrity": "sha512-E3sAXATKCSVnT17HYmZjjbcmwihrNOCkoU7dVMlasrcwiJAHxSKeZ+4WN5O+ElgO/FaYgJmASl8p9N7/B/RttA==", "requires": { - "@fortawesome/fontawesome-common-types": "^0.2.29" + "@fortawesome/fontawesome-common-types": "^0.2.30" }, "dependencies": { "@fortawesome/fontawesome-common-types": { - "version": "0.2.29", - "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-common-types/-/fontawesome-common-types-0.2.29.tgz", - "integrity": "sha512-cY+QfDTbZ7XVxzx7jxbC98Oxr/zc7R2QpTLqTxqlfyXDrAJjzi/xUIqAUsygELB62JIrbsWxtSRhayKFkGI7MA==" + "version": "0.2.30", + "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-common-types/-/fontawesome-common-types-0.2.30.tgz", + "integrity": "sha512-TsRwpTuKwFNiPhk1UfKgw7zNPeV5RhNp2Uw3pws+9gDAkPGKrtjR1y2lI3SYn7+YzyfuNknflpBA1LRKjt7hMg==" } } }, "@fortawesome/free-solid-svg-icons": { - "version": "5.13.1", - "resolved": "https://registry.npmjs.org/@fortawesome/free-solid-svg-icons/-/free-solid-svg-icons-5.13.1.tgz", - "integrity": "sha512-LQH/0L1p4+rqtoSHa9qFYR84hpuRZKqaQ41cfBQx8b68p21zoWSekTAeA54I/2x9VlCHDLFlG74Nmdg4iTPQOg==", + "version": "5.14.0", + "resolved": "https://registry.npmjs.org/@fortawesome/free-solid-svg-icons/-/free-solid-svg-icons-5.14.0.tgz", + "integrity": "sha512-M933RDM8cecaKMWDSk3FRYdnzWGW7kBBlGNGfvqLVwcwhUPNj9gcw+xZMrqBdRqxnSXdl3zWzTCNNGEtFUq67Q==", "requires": { - "@fortawesome/fontawesome-common-types": "^0.2.29" + "@fortawesome/fontawesome-common-types": "^0.2.30" } }, "@fortawesome/react-fontawesome": { @@ -1366,9 +1366,9 @@ "integrity": "sha512-shAmDyaQC4H92APFoIaVDHCx5bStIocgvbwQyxPRrbUY20V1EYTbSDchWbuwlMG3V17cprZhA6+78JfB+3DTPw==" }, "@popperjs/core": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.3.3.tgz", - "integrity": "sha512-yEvVC8RfhRPkD9TUn7cFcLcgoJePgZRAOR7T21rcRY5I8tpuhzeWfGa7We7tB14fe9R7wENdqUABcMdwD4SQLw==" + "version": "2.4.4", + "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.4.4.tgz", + "integrity": "sha512-1oO6+dN5kdIA3sKPZhRGJTfGVP4SWV6KqlMOwry4J3HfyD68sl/3KmG7DeYUzvN+RbhXDnv/D8vNNB8168tAMg==" }, "@react-dnd/asap": { "version": "4.0.0", @@ -1391,9 +1391,9 @@ "integrity": "sha512-INJYZQJP7g+IoDUh/475NlGiTeMfwTXUEr3tmRneckHIxNolGOW9CTq83S8cxq0CgJwwcMzMJFchxvlwe7Rk8Q==" }, "@restart/hooks": { - "version": "0.3.22", - "resolved": "https://registry.npmjs.org/@restart/hooks/-/hooks-0.3.22.tgz", - "integrity": "sha512-tW0T3hP6emYNOc76/iC96rlu+f7JYLSVk/Wnn+7dj1gJUcw4CkQNLy16vx2mBLtVKsFMZ9miVEZXat8blruDHQ==", + "version": "0.3.25", + "resolved": "https://registry.npmjs.org/@restart/hooks/-/hooks-0.3.25.tgz", + "integrity": "sha512-m2v3N5pxTsIiSH74/sb1yW8D9RxkJidGW+5Mfwn/lHb2QzhZNlaU1su7abSyT9EGf0xS/0waLjrf7/XxQHUk7w==", "requires": { "lodash": "^4.17.15", "lodash-es": "^4.17.15" @@ -1545,6 +1545,11 @@ "@babel/types": "^7.3.0" } }, + "@types/classnames": { + "version": "2.2.10", + "resolved": "https://registry.npmjs.org/@types/classnames/-/classnames-2.2.10.tgz", + "integrity": "sha512-1UzDldn9GfYYEsWWnn/P4wkTlkZDH7lDb0wBMGbtIQc9zXEQq7FlKBdZUn6OBqD8sKZZ2RQO2mAjGpXiDGoRmQ==" + }, "@types/color-name": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/@types/color-name/-/color-name-1.1.1.tgz", @@ -1579,6 +1584,11 @@ "hoist-non-react-statics": "^3.3.0" } }, + "@types/invariant": { + "version": "2.2.33", + "resolved": "https://registry.npmjs.org/@types/invariant/-/invariant-2.2.33.tgz", + "integrity": "sha512-/jUNmS8d4bCKdqslfxW6dg/9Gksfzxz67IYfqApHn+HvHlMVXwYv2zpTDnS/yaK9BB0i0GlBTaYci0EFE62Hmw==" + }, "@types/istanbul-lib-coverage": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.1.tgz", @@ -1640,6 +1650,14 @@ "csstype": "^2.2.0" } }, + "@types/react-transition-group": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/@types/react-transition-group/-/react-transition-group-4.4.0.tgz", + "integrity": "sha512-/QfLHGpu+2fQOqQaXh8MG9q03bFENooTb/it4jr5kKaZlDQfWvjqWZg48AwzPVMBHlRuTRAY7hRHCEOXz5kV6w==", + "requires": { + "@types/react": "*" + } + }, "@types/stack-utils": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-1.0.1.tgz", @@ -4428,9 +4446,9 @@ }, "dependencies": { "@babel/runtime": { - "version": "7.9.2", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.9.2.tgz", - "integrity": "sha512-NE2DtOdufG7R5vnfQUTehdTfNycfUANEtCa9PssN9O/xmTzP4E08UI797ixaei6hBEVL9BI/PsdJS5x7mWoB9Q==", + "version": "7.10.5", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.10.5.tgz", + "integrity": "sha512-otddXKhdNn7d0ptoFRHtMLa8LqDxLYwTjB4nYgM1yy5N6gU/MUf8zqyyLltCH3yAVitBzmwK4us+DD0l/MauAg==", "requires": { "regenerator-runtime": "^0.13.4" } @@ -5733,9 +5751,9 @@ } }, "formidable": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/formidable/-/formidable-1.2.1.tgz", - "integrity": "sha512-Fs9VRguL0gqGHkXS5GQiMCr1VhZBxz0JnJs4JmMp/2jL18Fmbzvv7vOFRU+U8TBkHEE/CX1qDXzJplVULgsLeg==" + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/formidable/-/formidable-1.2.2.tgz", + "integrity": "sha512-V8gLm+41I/8kguQ4/o1D3RIHRmhYFG4pnNyonvua+40rqcEmT4+V71yaZ3B457xbbgCsCfjSPi65u/W6vK1U5Q==" }, "forwarded": { "version": "0.1.2", @@ -8331,9 +8349,9 @@ } }, "lodash": { - "version": "4.17.15", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", - "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==" + "version": "4.17.19", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.19.tgz", + "integrity": "sha512-JNvd8XER9GQX0v2qJgsaN/mzFCNA5BRe/j8JN9d+tWyGLSodKQHKFicdwNYzWwI3wjRnaKPsGj1XkBjx/F96DQ==" }, "lodash-es": { "version": "4.17.15", @@ -11258,29 +11276,34 @@ } }, "react-bootstrap": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/react-bootstrap/-/react-bootstrap-1.0.1.tgz", - "integrity": "sha512-xMHwsvDN7sIv26P9wWiosWjITZije2dRCjEJHVfV2KFoSJY+8uv2zttEw0XMB7xviQcW3zuIGLJXuj8vf6lYEg==", + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/react-bootstrap/-/react-bootstrap-1.2.2.tgz", + "integrity": "sha512-G+QcEyBqFtakBNghdDugie+yU/ABDeqw3n+SOeRGxEn1m0dbIyHTroZpectcQk6FB3aS4RJGkZTuLVYH86Cu2A==", "requires": { "@babel/runtime": "^7.4.2", "@restart/context": "^2.1.4", "@restart/hooks": "^0.3.21", - "@types/react": "^16.9.23", + "@types/classnames": "^2.2.10", + "@types/invariant": "^2.2.33", + "@types/prop-types": "^15.7.3", + "@types/react": "^16.9.35", + "@types/react-transition-group": "^4.4.0", + "@types/warning": "^3.0.0", "classnames": "^2.2.6", "dom-helpers": "^5.1.2", "invariant": "^2.2.4", "prop-types": "^15.7.2", "prop-types-extra": "^1.1.0", - "react-overlays": "^3.1.2", + "react-overlays": "^4.0.0", "react-transition-group": "^4.0.0", "uncontrollable": "^7.0.0", "warning": "^4.0.3" }, "dependencies": { "@types/react": { - "version": "16.9.34", - "resolved": "https://registry.npmjs.org/@types/react/-/react-16.9.34.tgz", - "integrity": "sha512-8AJlYMOfPe1KGLKyHpflCg5z46n0b5DbRfqDksxBLBTUpB75ypDBAO9eCUcjNwE6LCUslwTz00yyG/X9gaVtow==", + "version": "16.9.43", + "resolved": "https://registry.npmjs.org/@types/react/-/react-16.9.43.tgz", + "integrity": "sha512-PxshAFcnJqIWYpJbLPriClH53Z2WlJcVZE+NP2etUtWQs2s7yIMj3/LDKZT/5CHJ/F62iyjVCDu2H3jHEXIxSg==", "requires": { "@types/prop-types": "*", "csstype": "^2.2.0" @@ -11666,9 +11689,9 @@ } }, "react-overlays": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/react-overlays/-/react-overlays-3.1.3.tgz", - "integrity": "sha512-FH82W0R9lFJm/YCTDeSvEKQxXyTaZmjMEQlAjRhgjQhknTkyMsft+X4Wep5l95QveqdxGVxl/P41WUOzTGJUcw==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/react-overlays/-/react-overlays-4.0.0.tgz", + "integrity": "sha512-LpznWocwgeB5oWKg6cDdkqKP7MbX4ClKbJqgZGUMXPRBBYcqrgM6TjjZ/8DeurNU//GuqwQMjhmo/JVma4XEWw==", "requires": { "@babel/runtime": "^7.4.5", "@popperjs/core": "^2.0.0", @@ -11809,9 +11832,9 @@ } }, "react-transition-group": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-4.3.0.tgz", - "integrity": "sha512-1qRV1ZuVSdxPlPf4O8t7inxUGpdyO5zG9IoNfJxSO0ImU2A1YWkEQvFPuIPZmMLkg5hYs7vv5mMOyfgSkvAwvw==", + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-4.4.1.tgz", + "integrity": "sha512-Djqr7OQ2aPUiYurhPalTrVy9ddmFCCzwhqQmtN+J3+3DzLO209Fdr70QrN8Z3DsglWql6iY1lDWAfpFiBtuKGw==", "requires": { "@babel/runtime": "^7.5.5", "dom-helpers": "^5.0.1", @@ -12432,9 +12455,9 @@ "integrity": "sha512-vTxrZz4dX5W86M6oVWVdOVe72ZiPs41Oi7Z6Km4W5Turyz28mrXSJhhEBZoRtzJWIv3833WKVwLSDWWkEfupMg==" }, "sass": { - "version": "1.26.9", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.26.9.tgz", - "integrity": "sha512-t8AkRVi+xvba4yZiLWkJdgJHBFCB3Dh4johniQkPy9ywkgFHNasXFEFP+RG/F6LhQ+aoE4aX+IorIWQjS0esVw==", + "version": "1.26.10", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.26.10.tgz", + "integrity": "sha512-bzN0uvmzfsTvjz0qwccN1sPm2HxxpNI/Xa+7PlUEMS+nQvbyuEK7Y0qFqxlPHhiNHb1Ze8WQJtU31olMObkAMw==", "requires": { "chokidar": ">=2.0.0 <4.0.0" } @@ -13441,21 +13464,21 @@ } }, "superagent": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/superagent/-/superagent-5.2.2.tgz", - "integrity": "sha512-pMWBUnIllK4ZTw7p/UaobiQPwAO5w/1NRRTDpV0FTVNmECztsxKspj3ZWEordVEaqpZtmOQJJna4yTLyC/q7PQ==", + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/superagent/-/superagent-5.3.1.tgz", + "integrity": "sha512-wjJ/MoTid2/RuGCOFtlacyGNxN9QLMgcpYLDQlWFIhhdJ93kNscFonGvrpAHSCVjRVj++DGCglocF7Aej1KHvQ==", "requires": { "component-emitter": "^1.3.0", "cookiejar": "^2.1.2", "debug": "^4.1.1", "fast-safe-stringify": "^2.0.7", "form-data": "^3.0.0", - "formidable": "^1.2.1", + "formidable": "^1.2.2", "methods": "^1.1.2", - "mime": "^2.4.4", - "qs": "^6.9.1", - "readable-stream": "^3.4.0", - "semver": "^6.3.0" + "mime": "^2.4.6", + "qs": "^6.9.4", + "readable-stream": "^3.6.0", + "semver": "^7.3.2" }, "dependencies": { "form-data": { @@ -13468,10 +13491,15 @@ "mime-types": "^2.1.12" } }, + "mime": { + "version": "2.4.6", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.6.tgz", + "integrity": "sha512-RZKhC3EmpBchfTGBVb8fb+RL2cWyw/32lshnsETttkBAyAUXSGHxbEJWWRXc751DrIxG1q04b8QwMbAwkRPpUA==" + }, "qs": { - "version": "6.9.1", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.9.1.tgz", - "integrity": "sha512-Cxm7/SS/y/Z3MHWSxXb8lIFqgqBowP5JMlTUFyJN88y0SGQhVmZnqFK/PeuMX9LzUyWsqqhNxIyg0jlzq946yA==" + "version": "6.9.4", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.9.4.tgz", + "integrity": "sha512-A1kFqHekCTM7cz0udomYUoYNWjBebHm/5wzU/XqrBRBNWectVH0QIiN+NEcZ0Dte5hvzHwbr8+XQmguPhJ6WdQ==" }, "readable-stream": { "version": "3.6.0", @@ -13482,6 +13510,11 @@ "string_decoder": "^1.1.1", "util-deprecate": "^1.0.1" } + }, + "semver": { + "version": "7.3.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz", + "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==" } } }, @@ -13924,9 +13957,9 @@ "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=" }, "typescript": { - "version": "3.9.5", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.9.5.tgz", - "integrity": "sha512-hSAifV3k+i6lEoCJ2k6R2Z/rp/H3+8sdmcn5NrS3/3kE7+RyZXm9aqvxWqjEXHAd8b0pShatpcdMTvEdvAJltQ==" + "version": "3.9.7", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.9.7.tgz", + "integrity": "sha512-BLbiRkiBzAwsjut4x/dsibSTB6yWpwT5qWmC2OfuCg3GgVQCSgMs4vEctYPhsaGtd0AeuuHMkjZ2h2WG8MSzRw==" }, "ua-parser-js": { "version": "0.7.20", diff --git a/package.json b/package.json index 31cf318..ccb7409 100644 --- a/package.json +++ b/package.json @@ -3,8 +3,8 @@ "version": "0.1.0", "private": true, "dependencies": { - "@fortawesome/fontawesome-svg-core": "^1.2.29", - "@fortawesome/free-solid-svg-icons": "^5.13.1", + "@fortawesome/fontawesome-svg-core": "^1.2.30", + "@fortawesome/free-solid-svg-icons": "^5.14.0", "@fortawesome/react-fontawesome": "^0.1.11", "babel-runtime": "^6.26.0", "bootstrap": "^4.5.0", @@ -24,7 +24,7 @@ "jquery": "^3.5.1", "jszip": "^3.5.0", "libcimsvg": "git+https://git.rwth-aachen.de/acs/public/cim/pintura-npm-package.git", - "lodash": "^4.17.15", + "lodash": "^4.17.19", "moment": "^2.27.0", "multiselect-react-dropdown": "^1.5.7", "node-sass": "^4.14.1", @@ -32,7 +32,7 @@ "prop-types": "^15.7.2", "rc-slider": "^9.3.1", "react": "^16.13.1", - "react-bootstrap": "^1.0.1", + "react-bootstrap": "^1.2.2", "react-contexify": "^4.1.1", "react-d3": "^0.4.0", "react-dnd": "^10.0.2", @@ -47,9 +47,9 @@ "react-router-dom": "^5.2.0", "react-scripts": "^3.4.1", "react-svg-pan-zoom": "^3.8.0", - "sass": "^1.26.9", - "superagent": "^5.2.2", - "typescript": "^3.9.5", + "sass": "^1.26.10", + "superagent": "^5.3.1", + "typescript": "^3.9.7", "validator": "^12.2.0" }, "devDependencies": { From 13359db606036f4a648f74f0e9d74c975fde6646 Mon Sep 17 00:00:00 2001 From: Sonja Happ Date: Mon, 20 Jul 2020 15:00:09 +0200 Subject: [PATCH 313/391] Improve displaying of signal scalingFactor for Plot, Table, Value and Gauge widgets; closes #248 --- src/styles/widgets.css | 16 ++++++++++++ src/widget/widget-plot/plot-legend.js | 32 +++++++++++++++++++---- src/widget/widgets/gauge.js | 28 +++++++++++++++----- src/widget/widgets/table.js | 37 +++++++++++++++++++-------- src/widget/widgets/value.js | 11 +++++++- 5 files changed, 100 insertions(+), 24 deletions(-) diff --git a/src/styles/widgets.css b/src/styles/widgets.css index 102a311..78996ab 100644 --- a/src/styles/widgets.css +++ b/src/styles/widgets.css @@ -181,6 +181,22 @@ span.signal-unit::after { font-style: normal; } +span.signal-scale { + color: grey; + font-style: italic; + font-weight: 200; +} + +span.signal-scale::before { + content: '(x'; + font-style: italic; +} + +span.signal-scale::after { + content: ')'; + font-style: italic; +} + /* End Plots */ .single-value-widget { diff --git a/src/widget/widget-plot/plot-legend.js b/src/widget/widget-plot/plot-legend.js index 5ac618c..75add6d 100644 --- a/src/widget/widget-plot/plot-legend.js +++ b/src/widget/widget-plot/plot-legend.js @@ -19,17 +19,39 @@ import React from 'react'; import { scaleOrdinal} from 'd3-scale'; import {schemeCategory10} from 'd3-scale-chromatic' +function Legend(props){ + const signal = props.sig; + const hasScalingFactor = (signal.scalingFactor !== 1); + + + if(hasScalingFactor){ + return ( +
  • + {signal.name} + {signal.unit} + {signal.scalingFactor} +
  • + ) + } else { + return ( +
  • + {signal.name} + {signal.unit} +
  • + ) + } + +} + class PlotLegend extends React.Component { render() { const colorScale = scaleOrdinal(schemeCategory10); return
      - {this.props.signals.map(signal => -
    • - {signal.name + "(x" + signal.scalingFactor + ")"} - {signal.unit} -
    • + { + this.props.signals.map( signal => + )}
    ; diff --git a/src/widget/widgets/gauge.js b/src/widget/widgets/gauge.js index 629784e..e1f8bfc 100644 --- a/src/widget/widgets/gauge.js +++ b/src/widget/widgets/gauge.js @@ -29,6 +29,7 @@ class WidgetGauge extends Component { this.state = { value: 0, unit: '', + scalingFactor: 1.0, signalID: '', minValue: null, maxValue: null, @@ -96,6 +97,7 @@ class WidgetGauge extends Component { // Update unit (assuming there is exactly one signal for this widget) if (signal !== undefined) { returnState["unit"] = signal[0].unit; + returnState["scalingFactor"] = signal[0].scalingFactor; } // update value @@ -105,7 +107,11 @@ class WidgetGauge extends Component { || props.data[icID] == null || props.data[icID].output == null || props.data[icID].output.values == null) { - return {value: 0, minValue: 0, maxValue: 10}; + + returnState["value"] = 0; + returnState["minValue"] = 0; + returnState["maxValue"] = 10; + return returnState; } // memorize if min or max value is updated @@ -183,12 +189,14 @@ class WidgetGauge extends Component { returnState["maxValue"] = maxValue; } - if (returnState !== {}) { - return returnState; - } else { - return null; - } + } // if there is signal data + + if (JSON.stringify(returnState) !== JSON.stringify({})) { + return returnState; + } else { + return null; + } } return null; @@ -248,13 +256,19 @@ class WidgetGauge extends Component { render() { const componentClass = this.props.editing ? "gauge-widget editing" : "gauge-widget"; + let scaleText = ""; + if(this.state.scalingFactor !== 1){ + scaleText = " (x" + this.state.scalingFactor + ")" + } return (
    {this.props.widget.name}
    this.gaugeCanvas = node} /> -
    {this.state.unit}
    +
    {this.state.unit + scaleText}
    {this.state.value}
    + +
    ); } diff --git a/src/widget/widgets/table.js b/src/widget/widgets/table.js index 3ecc59a..2a31cc8 100644 --- a/src/widget/widgets/table.js +++ b/src/widget/widgets/table.js @@ -41,22 +41,27 @@ class WidgetTable extends Component { // determine ID of infrastructure component related to signal (via config) let icID = props.icIDs[sig.id] - let signalName = sig.name; - if(sig.scalingFactor !== 1.0){ - signalName = signalName + "(x" + String(sig.scalingFactor) + ")"; - } - // distinguish between input and output signals if (sig.direction === "out") { if (props.data[icID] != null && props.data[icID].output != null && props.data[icID].output.values != null) { if (props.data[icID].output.values[sig.index-1] !== undefined) { + console.log("Table: sig", sig) let data = props.data[icID].output.values[sig.index-1]; rows.push({ - name: signalName, + name: sig.name, unit: sig.unit, - value: data[data.length - 1].y * sig.scalingFactor + value: data[data.length - 1].y * sig.scalingFactor, + scalingFactor: sig.scalingFactor }); + } else { + // no data available + rows.push({ + name: sig.name, + unit: sig.unit, + value: NaN, + scalingFactor: sig.scalingFactor + }) } } } else if (sig.direction === "in") { @@ -64,10 +69,19 @@ class WidgetTable extends Component { if (props.data[icID].input.values[sig.index-1] !== undefined) { let data = props.data[icID].input.values[sig.index-1]; rows.push({ - name: signalName, + name: sig.name, unit: sig.unit, - value: data[data.length - 1].y * sig.scalingFactor + value: data[data.length - 1].y * sig.scalingFactor, + scalingFactor: sig.scalingFactor }); + } else { + // no data available + rows.push({ + name: sig.name, + unit: sig.unit, + value: NaN, + scalingFactor: sig.scalingFactor + }) } } } @@ -91,11 +105,12 @@ class WidgetTable extends Component { var columns = [ , - + , + ]; if (this.props.widget.customProperties.showUnit) - columns.push() + columns.push() return (
    diff --git a/src/widget/widgets/value.js b/src/widget/widgets/value.js index 482a94f..22a1629 100644 --- a/src/widget/widgets/value.js +++ b/src/widget/widgets/value.js @@ -24,7 +24,8 @@ class WidgetValue extends Component { this.state = { value: '', - unit: '' + unit: '', + scalingFactor: 1.0 }; } @@ -54,13 +55,16 @@ class WidgetValue extends Component { // Update unit (assuming there is exactly one signal for this widget) let unit = ''; + let scalingFactor = '' if (signal !== undefined) { unit = signal[0].unit; + scalingFactor = signal[0].scalingFactor } return { value: value, unit: unit, + scalingFactor: scalingFactor }; } @@ -72,6 +76,7 @@ class WidgetValue extends Component { let value_to_render = Number(this.state.value); let value_width = this.props.widget.customProperties.textSize*(Math.abs(value_to_render) < 1000 ? (5):(8)); let unit_width = this.props.widget.customProperties.textSize*(this.state.unit.length + 0.7); + const showScalingFactor = (this.state.scalingFactor !== 1); return (
    {this.props.widget.name} @@ -79,6 +84,10 @@ class WidgetValue extends Component { {this.props.widget.customProperties.showUnit && [{this.state.unit}] } + {showScalingFactor && + {this.state.scalingFactor} + } +
    ); } From fc1db841702faed32533b0e62453e14b2f6e6031 Mon Sep 17 00:00:00 2001 From: Sonja Happ Date: Mon, 20 Jul 2020 16:26:22 +0200 Subject: [PATCH 314/391] WIP: begin fixing application router, use token from local storage instead of LoginStore; IC websocket connects not yet working when loading dashboard #245 --- src/app.js | 17 +++++++++++------ src/common/header-menu.js | 3 ++- src/common/home.js | 10 +++++++++- src/common/menu-sidebar.js | 2 +- src/dashboard/dashboard.js | 30 ++++++++++++++++++------------ src/ic/ics.js | 2 +- src/router.js | 12 ++++++++++++ src/scenario/scenario.js | 19 +++++++++++-------- src/scenario/scenarios.js | 5 ++--- src/user/login.js | 2 +- src/user/user.js | 10 +++------- src/user/users.js | 11 +++++------ 12 files changed, 76 insertions(+), 47 deletions(-) diff --git a/src/app.js b/src/app.js index aa9ce6a..cddc5de 100644 --- a/src/app.js +++ b/src/app.js @@ -87,8 +87,13 @@ class App extends React.Component { }; render() { - if (this.state.token == null) { - return (); + + let token = localStorage.getItem("token"); + let currentUser = JSON.parse(localStorage.getItem("currentUser")); + + if (token == null || currentUser == null) { + console.log("APP redirecting to logout/ login") + return (); } return ( @@ -99,7 +104,7 @@ class App extends React.Component { */} - + @@ -110,17 +115,17 @@ class App extends React.Component {
    - +
    - + - +
    diff --git a/src/common/header-menu.js b/src/common/header-menu.js index 6105f76..9c6f7eb 100644 --- a/src/common/header-menu.js +++ b/src/common/header-menu.js @@ -27,11 +27,12 @@ export default class HeaderMenu extends React.Component {
    • Home
    • -
    • Scenarios
    • +
    • Scenarios
    • Infrastructure Components
    • { this.props.currentRole === 'Admin' ?
    • User Management
    • : '' } +
    • Account
    • Logout
    ; diff --git a/src/common/home.js b/src/common/home.js index 0aee6b9..4bf124f 100644 --- a/src/common/home.js +++ b/src/common/home.js @@ -19,6 +19,7 @@ import React from 'react'; import config from '../config'; import LoginStore from "../user/login-store"; +import {Redirect} from "react-router-dom"; class Home extends React.Component { constructor(props) { @@ -38,6 +39,13 @@ class Home extends React.Component { } render() { + + let currentUser = JSON.parse(localStorage.getItem("currentUser")); + if (currentUser == null){ + console.log("HOME redirecting to logout/ login") + return (); + } + return (
    diff --git a/src/dashboard/dashboard.js b/src/dashboard/dashboard.js index 584a4f2..0611196 100644 --- a/src/dashboard/dashboard.js +++ b/src/dashboard/dashboard.js @@ -28,7 +28,6 @@ import WidgetToolbox from '../widget/widget-toolbox'; import WidgetArea from '../widget/widget-area'; import DashboardButtonGroup from './dashboard-button-group'; -import LoginStore from '../user/login-store'; import DashboardStore from './dashboard-store'; import SignalStore from '../signal/signal-store' import FileStore from '../file/file-store'; @@ -43,7 +42,7 @@ class Dashboard extends Component { static lastWidgetKey = 0; static getStores() { - return [ DashboardStore, LoginStore,FileStore, WidgetStore, SignalStore, ConfigStore, ICStore]; + return [ DashboardStore, FileStore, WidgetStore, SignalStore, ConfigStore, ICStore]; } static calculateState(prevState, props) { @@ -51,7 +50,7 @@ class Dashboard extends Component { prevState = {}; } - const sessionToken = LoginStore.getState().token; + const sessionToken = localStorage.getItem("token"); let dashboard = DashboardStore.getState().find(d => d.id === parseInt(props.match.params.dashboard, 10)); if (dashboard == null){ @@ -73,20 +72,22 @@ class Dashboard extends Component { return thisWidgetHeight > maxHeightSoFar? thisWidgetHeight : maxHeightSoFar; }, 0); - if(dashboard.height === 0){ - dashboard.height = 400; - } - else if(maxHeight + 80 > dashboard.height) - { - dashboard.height = maxHeight + 80; - } + // filter component configurations to the ones that belong to this scenario let configs = [] let files = [] - if (dashboard !== null) { + if (dashboard !== undefined) { configs = ConfigStore.getState().filter(config => config.scenarioID === dashboard.scenarioID); files = FileStore.getState().filter(file => file.scenarioID === dashboard.scenarioID); + + if(dashboard.height === 0){ + dashboard.height = 400; + } + else if(maxHeight + 80 > dashboard.height) + { + dashboard.height = maxHeight + 80; + } } // filter signals to the ones belonging to the scenario at hand @@ -154,10 +155,11 @@ class Dashboard extends Component { AppDispatcher.dispatch({ type: 'widgets/start-load', token: this.state.sessionToken, - param: '?dashboardID=' + this.state.dashboard.id + param: '?dashboardID=' + parseInt(this.props.match.params.dashboard, 10), }); // open web sockets if ICs are already known + // TODO opening websockets has to be moved to componentDidUpdate and should be done as soon as ICs are loaded! if(this.state.ics.length > 0){ console.log("Starting to open IC websockets:", this.state.ics); AppDispatcher.dispatch({ @@ -398,6 +400,10 @@ class Dashboard extends Component { render() { + if (this.state.dashboard === undefined){ + return
    {"Loading Dashboard..."}
    + } + const grid = this.state.dashboard.grid; const boxClasses = classNames('section', 'box', { 'fullscreen-padding': this.props.isFullscreen }); let draggable = this.state.editing; diff --git a/src/ic/ics.js b/src/ic/ics.js index de97d21..aa275ec 100644 --- a/src/ic/ics.js +++ b/src/ic/ics.js @@ -75,7 +75,7 @@ class InfrastructureComponents extends Component { }); return { - sessionToken: LoginStore.getState().token, + sessionToken: localStorage.getItem("token"), ics: ics, modalIC: {}, deleteModal: false, diff --git a/src/router.js b/src/router.js index 348a231..6c3ba30 100644 --- a/src/router.js +++ b/src/router.js @@ -21,6 +21,12 @@ import { BrowserRouter, Route, Switch } from 'react-router-dom'; import App from './app'; import Login from './user/login'; import Logout from './user/logout'; +import Home from './common/home'; +import Scenarios from './scenario/scenarios'; +import Scenario from './scenario/scenario'; +import InfrastructureComponents from './ic/ics'; +import Users from './user/users'; +import User from "./user/user"; class Root extends React.Component { render() { @@ -30,6 +36,12 @@ class Root extends React.Component { + + + + + + ); diff --git a/src/scenario/scenario.js b/src/scenario/scenario.js index 44a332f..a8f42ee 100644 --- a/src/scenario/scenario.js +++ b/src/scenario/scenario.js @@ -25,7 +25,6 @@ import ScenarioStore from './scenario-store'; import ICStore from '../ic/ic-store'; import DashboardStore from '../dashboard/dashboard-store'; import ConfigStore from '../componentconfig/config-store'; -import LoginStore from '../user/login-store'; import SignalStore from '../signal/signal-store' import AppDispatcher from '../common/app-dispatcher'; @@ -48,7 +47,7 @@ import WidgetStore from "../widget/widget-store"; class Scenario extends React.Component { static getStores() { - return [ ScenarioStore, ConfigStore, DashboardStore, ICStore, LoginStore, SignalStore, FileStore, WidgetStore]; + return [ ScenarioStore, ConfigStore, DashboardStore, ICStore, SignalStore, FileStore, WidgetStore]; } static calculateState(prevState, props) { @@ -57,10 +56,10 @@ class Scenario extends React.Component { } // get selected scenario - const sessionToken = LoginStore.getState().token; + const sessionToken = localStorage.getItem("token"); const scenario = ScenarioStore.getState().find(s => s.id === parseInt(props.match.params.scenario, 10)); - if (scenario == null) { + if (scenario === undefined) { AppDispatcher.dispatch({ type: 'scenarios/start-load', data: props.match.params.scenario, @@ -118,14 +117,14 @@ class Scenario extends React.Component { //load selected scenario AppDispatcher.dispatch({ type: 'scenarios/start-load', - data: this.state.scenario.id, + data: parseInt(this.props.match.params.scenario, 10), token: this.state.sessionToken }); AppDispatcher.dispatch({ type: 'scenarios/start-load-users', - data: this.state.scenario.id, + data: parseInt(this.props.match.params.scenario, 10), token: this.state.sessionToken }); @@ -418,7 +417,7 @@ class Scenario extends React.Component { this.setState({editOutputSignalsModal: false}); } } - + onEditFiles(){ let tempFiles = []; this.state.files.forEach( file => { @@ -508,10 +507,14 @@ class Scenario extends React.Component { const iconStyle = { color: '#007bff', - height: '25px', + height: '25px', width : '25px' } + if(this.state.scenario === undefined){ + return

    Loading Scenario...

    ; + } + return
    Add, edit or delete files of scenario } > diff --git a/src/scenario/scenarios.js b/src/scenario/scenarios.js index 63432ce..f093d7a 100644 --- a/src/scenario/scenarios.js +++ b/src/scenario/scenarios.js @@ -22,7 +22,6 @@ import FileSaver from 'file-saver'; import AppDispatcher from '../common/app-dispatcher'; import ScenarioStore from './scenario-store'; -import LoginStore from '../user/login-store'; import DashboardStore from '../dashboard/dashboard-store'; import WidgetStore from "../widget/widget-store"; import ConfigStore from '../componentconfig/config-store'; @@ -41,7 +40,7 @@ import DeleteDialog from '../common/dialogs/delete-dialog'; class Scenarios extends Component { static getStores() { - return [ScenarioStore, LoginStore, DashboardStore, WidgetStore, ConfigStore, SignalStore]; + return [ScenarioStore, DashboardStore, WidgetStore, ConfigStore, SignalStore]; } static calculateState() { @@ -50,7 +49,7 @@ class Scenarios extends Component { scenarios: ScenarioStore.getState(), dashboards: DashboardStore.getState(), configs: ConfigStore.getState(), - sessionToken: LoginStore.getState().token, + sessionToken: localStorage.getItem("token"), newModal: false, deleteModal: false, diff --git a/src/user/login.js b/src/user/login.js index ee78945..c2791da 100644 --- a/src/user/login.js +++ b/src/user/login.js @@ -73,7 +73,7 @@ class Login extends Component { render() { if (this.state.currentUser != null) { - return (); + return (); } return ( diff --git a/src/user/user.js b/src/user/user.js index 6ab4b82..6c7e0df 100644 --- a/src/user/user.js +++ b/src/user/user.js @@ -20,10 +20,8 @@ import { Container } from 'flux/utils'; import {Button, Col, Row} from 'react-bootstrap'; import AppDispatcher from '../common/app-dispatcher'; -import LoginStore from './login-store'; import UsersStore from './users-store'; - import Icon from '../common/icon'; import EditOwnUserDialog from './edit-own-user' import NotificationsDataManager from "../common/data-managers/notifications-data-manager" @@ -31,17 +29,15 @@ import NotificationsDataManager from "../common/data-managers/notifications-data class User extends Component { static getStores() { - return [ LoginStore, UsersStore ]; + return [ UsersStore ]; } static calculateState(prevState, props) { prevState = prevState || {}; - let user = LoginStore.getState().currentUser; - return { - currentUser: user, - token: LoginStore.getState().token, + currentUser: JSON.parse(localStorage.getItem("currentUser")), + token: localStorage.getItem("token"), editModal: false, }; } diff --git a/src/user/users.js b/src/user/users.js index d97c539..f6f03df 100644 --- a/src/user/users.js +++ b/src/user/users.js @@ -20,7 +20,6 @@ import { Container } from 'flux/utils'; import { Button } from 'react-bootstrap'; import AppDispatcher from '../common/app-dispatcher'; -import LoginStore from './login-store'; import UsersStore from './users-store'; import Icon from '../common/icon'; @@ -34,23 +33,23 @@ import NotificationsDataManager from "../common/data-managers/notifications-data class Users extends Component { static getStores() { - return [ LoginStore, UsersStore ]; + return [ UsersStore ]; } static calculateState(prevState, props) { - let tokenState = LoginStore.getState().token; + let token = localStorage.getItem("token"); // If there is a token available and this method was called as a result of loading users - if (!prevState && tokenState) { + if (!prevState && token) { AppDispatcher.dispatch({ type: 'users/start-load', - token: tokenState + token: token }); } return { - token: tokenState, + token: token, users: UsersStore.getState(), newModal: false, From 0e9888478f720e01b6219f519bb79e362b078758 Mon Sep 17 00:00:00 2001 From: Sonja Happ Date: Tue, 21 Jul 2020 10:39:27 +0200 Subject: [PATCH 315/391] scenario user list needs no link --- src/scenario/scenario.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/scenario/scenario.js b/src/scenario/scenario.js index a8f42ee..fcd1300 100644 --- a/src/scenario/scenario.js +++ b/src/scenario/scenario.js @@ -658,7 +658,7 @@ class Scenario extends React.Component {

    Users sharing this scenario

    - + Date: Tue, 21 Jul 2020 10:41:19 +0200 Subject: [PATCH 316/391] add scenario and dashboard routes to router #245 #231 --- src/router.js | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/router.js b/src/router.js index 6c3ba30..05cf900 100644 --- a/src/router.js +++ b/src/router.js @@ -24,6 +24,7 @@ import Logout from './user/logout'; import Home from './common/home'; import Scenarios from './scenario/scenarios'; import Scenario from './scenario/scenario'; +import Dashboard from './dashboard/dashboard' import InfrastructureComponents from './ic/ics'; import Users from './user/users'; import User from "./user/user"; @@ -38,6 +39,8 @@ class Root extends React.Component { + + From 16ded98415ec9319cc31549e5bca438f606043d9 Mon Sep 17 00:00:00 2001 From: Sonja Happ Date: Tue, 21 Jul 2020 10:44:32 +0200 Subject: [PATCH 317/391] open websockets in componentDidUpdate, load more data upon mount or update, #245 #231 --- src/dashboard/dashboard.js | 38 +++++++++++++++++++++++++++++++++----- 1 file changed, 33 insertions(+), 5 deletions(-) diff --git a/src/dashboard/dashboard.js b/src/dashboard/dashboard.js index 0611196..ee3c247 100644 --- a/src/dashboard/dashboard.js +++ b/src/dashboard/dashboard.js @@ -41,6 +41,7 @@ import 'react-contexify/dist/ReactContexify.min.css'; class Dashboard extends Component { static lastWidgetKey = 0; + static webSocketsOpened = false; static getStores() { return [ DashboardStore, FileStore, WidgetStore, SignalStore, ConfigStore, ICStore]; } @@ -158,16 +159,43 @@ class Dashboard extends Component { param: '?dashboardID=' + parseInt(this.props.match.params.dashboard, 10), }); - // open web sockets if ICs are already known - // TODO opening websockets has to be moved to componentDidUpdate and should be done as soon as ICs are loaded! - if(this.state.ics.length > 0){ + // load ICs to enable that component configs and dashboards work with them + AppDispatcher.dispatch({ + type: 'ics/start-load', + token: this.state.sessionToken + }); + + + + } + + componentDidUpdate(prevProps: Readonly

    , prevState: Readonly, snapshot: SS) { + // open web sockets if ICs are already known and sockets are not opened yet + if(!Dashboard.webSocketsOpened && this.state.ics.length > 0){ console.log("Starting to open IC websockets:", this.state.ics); AppDispatcher.dispatch({ type: 'ics/open-sockets', data: this.state.ics }); - } else { - console.log("ICs unknown in componentDidMount", this.state.dashboard) + + Dashboard.webSocketsOpened = true; + } + + if(this.state.configs.length === 0 && this.state.dashboard !== undefined) { + // load configs + AppDispatcher.dispatch({ + type: 'configs/start-load', + token: this.state.sessionToken, + param: '?scenarioID=' + this.state.dashboard.scenarioID + }); + } + + if(this.state.files.length === 0 && this.state.dashboard !== undefined){ + AppDispatcher.dispatch({ + type: 'files/start-load', + param: '?scenarioID=' + this.state.dashboard.scenarioID, + token: this.state.sessionToken + }); } } From f2c85dea432646d5f82983f87b9eba95c619a4d7 Mon Sep 17 00:00:00 2001 From: Laura Fuentes Grau Date: Tue, 21 Jul 2020 21:42:51 +0200 Subject: [PATCH 318/391] Droppable widgets in dashboard layout mode now sorted into categories #235 --- package-lock.json | 5 ++ package.json | 1 + src/widget/widget-toolbox.js | 106 ++++++++++++++++++++++++++++++----- 3 files changed, 99 insertions(+), 13 deletions(-) diff --git a/package-lock.json b/package-lock.json index 116a654..0f4ba67 100644 --- a/package-lock.json +++ b/package-lock.json @@ -11311,6 +11311,11 @@ } } }, + "react-collapse": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/react-collapse/-/react-collapse-5.0.1.tgz", + "integrity": "sha512-cN2tkxBWizhPQ2JHfe0aUSJtmMthKA17NZkTElpiQ2snQAAi1hssXZ2fv88rAPNNvG5ss4t0PbOZT0TIl9Lk3Q==" + }, "react-contexify": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/react-contexify/-/react-contexify-4.1.1.tgz", diff --git a/package.json b/package.json index ccb7409..acf1e4a 100644 --- a/package.json +++ b/package.json @@ -33,6 +33,7 @@ "rc-slider": "^9.3.1", "react": "^16.13.1", "react-bootstrap": "^1.2.2", + "react-collapse": "^5.0.1", "react-contexify": "^4.1.1", "react-d3": "^0.4.0", "react-dnd": "^10.0.2", diff --git a/src/widget/widget-toolbox.js b/src/widget/widget-toolbox.js index f8d6390..a4e25e8 100644 --- a/src/widget/widget-toolbox.js +++ b/src/widget/widget-toolbox.js @@ -20,10 +20,20 @@ import PropTypes from 'prop-types'; import Slider from 'rc-slider'; import { Button, OverlayTrigger, Tooltip } from 'react-bootstrap'; import Icon from "../common/icon"; +import {Collapse} from 'react-collapse'; import ToolboxItem from './toolbox-item'; class WidgetToolbox extends React.Component { + constructor(props) { + super(props); + + this.state = { + showCosmeticWidgets: false, + showDisplayingWidgets: false, + showManipulationWidgets: false + }; +} onGridChange = value => { // value 0 would block all widgets, set 1 as 'grid disabled' if (value === 0) { @@ -49,7 +59,39 @@ class WidgetToolbox extends React.Component { return false; } + showWidgets(value){ + let tempValue = false; + switch(value){ + case 'cosmetic': + tempValue = !this.state.showCosmeticWidgets; + this.setState({showCosmeticWidgets: tempValue}); + break; + case 'displaying': + tempValue = !this.state.showDisplayingWidgets; + this.setState({showDisplayingWidgets: tempValue}); + break; + case 'manipulation': + tempValue = !this.state.showManipulationWidgets; + this.setState({showManipulationWidgets: tempValue}); + break; + default: + break; + } + } + render() { + let cosmeticIcon = 'chevron-up'; + let displayingIcon = 'chevron-up'; + let manipulationIcon = 'chevron-up'; + if(this.state.showCosmeticWidgets){ + cosmeticIcon = 'chevron-down'; + } + if(this.state.showDisplayingWidgets){ + displayingIcon = 'chevron-down'; + } + if(this.state.showManipulationWidgets){ + manipulationIcon = 'chevron-down'; + } const disableDecrease = this.disableDecrease(); // Only one topology widget at the time is supported @@ -63,25 +105,44 @@ class WidgetToolbox extends React.Component { const topologyItemMsg = thereIsTopologyWidget? 'Currently only one is supported' : ''; return

    - - - - + + + - - - - - - - - Drag and drop widgets onto the dashboard } > - + + + + + + + + + + + Drag and drop widgets onto the dashboard } > + + + + + + + + + Drag and drop widgets onto the dashboard } > + + + +
    @@ -90,8 +151,27 @@ class WidgetToolbox extends React.Component {
    +
    + Cosmetic Widgets } > + + + Displaying Widgets } > + + + Manipulation Widgets } > + + Increase dashboard height } > @@ -125,48 +125,48 @@ class WidgetToolbox extends React.Component { - Drag and drop widgets onto the dashboard } > - - + - Drag and drop widgets onto the dashboard } > - - +
    Grid: { this.props.grid > 1 ? this.props.grid : 'Disabled' } - +
    - +
    - Cosmetic Widgets } > + Show/ hide available Cosmetic Widgets } > - Displaying Widgets } > + Show/ hide available Displaying Widgets } > - Manipulation Widgets } > + Show/ hide available Manipulation Widgets } > Decrease dashboard height } >
    From 9ed698f428364483640ed5ab3348bc138acc30bb Mon Sep 17 00:00:00 2001 From: Laura Fuentes Grau Date: Sun, 26 Jul 2020 17:11:33 +0200 Subject: [PATCH 320/391] Infrastructure Components:edit, delete and add buttons only visible to users with admin role #239 --- src/ic/ics.js | 23 ++++++++++++++++++++--- 1 file changed, 20 insertions(+), 3 deletions(-) diff --git a/src/ic/ics.js b/src/ic/ics.js index aa275ec..4a1273e 100644 --- a/src/ic/ics.js +++ b/src/ic/ics.js @@ -73,6 +73,7 @@ class InfrastructureComponents extends Component { return a.stateUpdatedAt < b.stateUpdatedAt; } }); + const currentUser = LoginStore.getState().currentUser; return { sessionToken: localStorage.getItem("token"), @@ -80,7 +81,8 @@ class InfrastructureComponents extends Component { modalIC: {}, deleteModal: false, - selectedICs: [] + selectedICs: [], + currentUser: currentUser }; } @@ -282,6 +284,7 @@ class InfrastructureComponents extends Component { {/* */} this.stateUpdateModifier(stateUpdateAt)} /> + {this.state.currentUser.role === "Admin" ? this.setState({ editModal: true, modalIC: this.state.ics[index], modalIndex: index })} onExport={index => this.exportIC(index)} onDelete={index => this.setState({ deleteModal: true, modalIC: this.state.ics[index], modalIndex: index })} - /> + /> + : + this.exportIC(index)} + /> + }
    @@ -301,9 +311,16 @@ class InfrastructureComponents extends Component {
    -
    + + {this.state.currentUser.role === "Admin" ? +
    + +
    + : +
    + }
    From ae53a167011bd76e8dc9a2049c947f2d7cbab37d Mon Sep 17 00:00:00 2001 From: Laura Fuentes Grau Date: Mon, 27 Jul 2020 12:42:53 +0200 Subject: [PATCH 321/391] Infrastructure Components:only export button visible to users without admin role #239 --- src/ic/ics.js | 34 +++++++++++++++++----------------- 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/src/ic/ics.js b/src/ic/ics.js index 4a1273e..8ab77a3 100644 --- a/src/ic/ics.js +++ b/src/ic/ics.js @@ -302,24 +302,24 @@ class InfrastructureComponents extends Component { /> } - -
    - -
    - -
    - -
    - {this.state.currentUser.role === "Admin" ? -
    - -
    - : -
    +
    + +
    + : +
    + } + + {this.state.currentUser.role === "Admin" ? +
    + + +
    + : +
    }
    From 3bd4c2036552dfe8d3eb24fc8276fdf0c4ef600b Mon Sep 17 00:00:00 2001 From: Laura Fuentes Grau Date: Tue, 28 Jul 2020 18:46:43 +0200 Subject: [PATCH 322/391] WIP: replacing current color choosing mechanisms with a color picker #251 --- package-lock.json | 36 +++++++++ package.json | 1 + src/widget/edit-widget/color-picker.js | 79 +++++++++++++++++++ .../edit-widget/edit-widget-color-control.js | 74 ++++++++--------- 4 files changed, 148 insertions(+), 42 deletions(-) create mode 100644 src/widget/edit-widget/color-picker.js diff --git a/package-lock.json b/package-lock.json index 0f4ba67..aa96b4a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1179,6 +1179,11 @@ "@hapi/hoek": "^8.3.0" } }, + "@icons/material": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/@icons/material/-/material-0.2.4.tgz", + "integrity": "sha512-QPcGmICAPbGLGb6F/yNf/KzKqvFx8z5qx3D1yFqVAjoFmXK35EgyW+cJ57Te3CNsmzblwtzakLGFqHPqrfb4Tw==" + }, "@jest/console": { "version": "24.9.0", "resolved": "https://registry.npmjs.org/@jest/console/-/console-24.9.0.tgz", @@ -8510,6 +8515,11 @@ "object-visit": "^1.0.0" } }, + "material-colors": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/material-colors/-/material-colors-1.2.6.tgz", + "integrity": "sha512-6qE4B9deFBIa9YSpOc9O0Sgc43zTeVYbgDT5veRKSlB2+ZuHNoVVxA1L/ckMUayV9Ay9y7Z/SZCLcGteW9i7bg==" + }, "md5.js": { "version": "1.3.5", "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", @@ -11316,6 +11326,19 @@ "resolved": "https://registry.npmjs.org/react-collapse/-/react-collapse-5.0.1.tgz", "integrity": "sha512-cN2tkxBWizhPQ2JHfe0aUSJtmMthKA17NZkTElpiQ2snQAAi1hssXZ2fv88rAPNNvG5ss4t0PbOZT0TIl9Lk3Q==" }, + "react-color": { + "version": "2.18.1", + "resolved": "https://registry.npmjs.org/react-color/-/react-color-2.18.1.tgz", + "integrity": "sha512-X5XpyJS6ncplZs74ak0JJoqPi+33Nzpv5RYWWxn17bslih+X7OlgmfpmGC1fNvdkK7/SGWYf1JJdn7D2n5gSuQ==", + "requires": { + "@icons/material": "^0.2.4", + "lodash": "^4.17.11", + "material-colors": "^1.2.1", + "prop-types": "^15.5.10", + "reactcss": "^1.2.0", + "tinycolor2": "^1.4.1" + } + }, "react-contexify": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/react-contexify/-/react-contexify-4.1.1.tgz", @@ -11847,6 +11870,14 @@ "prop-types": "^15.6.2" } }, + "reactcss": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/reactcss/-/reactcss-1.2.3.tgz", + "integrity": "sha512-KiwVUcFu1RErkI97ywr8nvx8dNOpT03rbnma0SSalTYjkrPYaEajR4a/MRt6DZ46K6arDRbWMNHF+xH7G7n/8A==", + "requires": { + "lodash": "^4.0.1" + } + }, "read-pkg": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", @@ -13796,6 +13827,11 @@ "resolved": "https://registry.npmjs.org/tiny-warning/-/tiny-warning-1.0.3.tgz", "integrity": "sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA==" }, + "tinycolor2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/tinycolor2/-/tinycolor2-1.4.1.tgz", + "integrity": "sha1-9PrTM0R7wLB9TcjpIJ2POaisd+g=" + }, "tmp": { "version": "0.0.33", "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", diff --git a/package.json b/package.json index acf1e4a..c0546c5 100644 --- a/package.json +++ b/package.json @@ -34,6 +34,7 @@ "react": "^16.13.1", "react-bootstrap": "^1.2.2", "react-collapse": "^5.0.1", + "react-color": "^2.18.1", "react-contexify": "^4.1.1", "react-d3": "^0.4.0", "react-dnd": "^10.0.2", diff --git a/src/widget/edit-widget/color-picker.js b/src/widget/edit-widget/color-picker.js new file mode 100644 index 0000000..a4b84a1 --- /dev/null +++ b/src/widget/edit-widget/color-picker.js @@ -0,0 +1,79 @@ +/** + * This file is part of VILLASweb. + * + * VILLASweb is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * VILLASweb is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with VILLASweb. If not, see . + ******************************************************************************/ + +import React from 'react'; +import { SketchPicker } from 'react-color'; +import Dialog from '../../common/dialogs/dialog'; + + +class ColorPicker extends React.Component { + valid = true; + + constructor(props) { + super(props); + + this.state = { + color: null + }; + } + + static getDerivedStateFromProps(props, state){ + let parts = props.controlId.split('.'); + let isCustomProperty = true; + if (parts.length === 1){ + isCustomProperty = false; + } + let color = (isCustomProperty ? props.widget[parts[0]][parts[1]] : props.widget[props.controlId]); + + return { + color: color + }; + } + + handleChangeComplete = (color) => { + this.setState({ color: color.hex }); + }; + + onClose = canceled => { + if (canceled) { + if (this.props.onClose != null) { + this.props.onClose(); + } + + return; + } + + if (this.valid && this.props.onClose != null) { + this.props.onClose(this.state.color); + } + }; + + render() { + return this.onClose(c)} valid={true}> +
    + + + +
    ; + } +} + +export default ColorPicker; diff --git a/src/widget/edit-widget/edit-widget-color-control.js b/src/widget/edit-widget/edit-widget-color-control.js index 2158a55..f5039d2 100644 --- a/src/widget/edit-widget/edit-widget-color-control.js +++ b/src/widget/edit-widget/edit-widget-color-control.js @@ -16,10 +16,12 @@ ******************************************************************************/ import React, { Component } from 'react'; -import { FormGroup, Col, Row, FormCheck, FormLabel } from 'react-bootstrap'; -import classNames from 'classnames'; +import { FormGroup, OverlayTrigger, Tooltip , FormLabel, Button } from 'react-bootstrap'; import { scaleOrdinal } from 'd3-scale'; -import {schemeCategory10} from 'd3-scale-chromatic' +import {schemeCategory10} from 'd3-scale-chromatic'; +import ColorPicker from './color-picker' +import Icon from "../../common/icon"; + // schemeCategory20 no longer available in d3 class EditWidgetColorControl extends Component { @@ -38,9 +40,8 @@ class EditWidgetColorControl extends Component { super(props); this.state = { - widget: { - - } + widget: {}, + showColorPicker: false }; } @@ -50,47 +51,36 @@ class EditWidgetColorControl extends Component { }; } - render() { + openColorPicker = () =>{ + this.setState({showColorPicker: true}) + } - let parts = this.props.controlId.split('.'); - let isCustomProperty = true; - if (parts.length === 1){ - isCustomProperty = false; + closeEditModal = (data) => { + this.setState({showColorPicker: false}) + if(data){ + this.props.handleChange({target: { id: this.props.controlId, value: data}}); } + } + + render() { + const currentColor = this.state.widget[this.props.controlId]; + return ( - - - - { this.props.label } - - - { - EditWidgetColorControl.ColorPalette.map( (color, idx ) => { - let colorStyle = { - background: color, - borderColor: color - }; + + {this.props.label} - let checkedClass = classNames({ - 'checked': idx === (isCustomProperty ? this.state.widget[parts[0]][parts[1]] : this.state.widget[this.props.controlId]) - }); +
    + Change color } > + + +
    - return ( this.props.handleChange({target: { id: this.props.controlId, value: idx}})} />) - } - ) - } - -
    -
    ) + this.closeEditModal(data)} widget={this.state.widget} controlId={this.props.controlId} /> + + + ) } } From 45d7e554496c1d253a7077d48ad32fd811c98e84 Mon Sep 17 00:00:00 2001 From: Laura Fuentes Grau Date: Fri, 31 Jul 2020 14:35:59 +0200 Subject: [PATCH 323/391] Color Picker now works for widgets using edit-widget-color-control #251 --- src/widget/edit-widget/color-picker.js | 29 +++++++---- .../edit-widget/edit-widget-color-control.js | 51 ++++++++++++------- src/widget/widget-factory.js | 16 +++--- src/widget/widgets/box.js | 7 +-- src/widget/widgets/label.js | 3 +- src/widget/widgets/lamp.js | 6 +-- src/widget/widgets/line.js | 4 +- 7 files changed, 65 insertions(+), 51 deletions(-) diff --git a/src/widget/edit-widget/color-picker.js b/src/widget/edit-widget/color-picker.js index a4b84a1..b150f33 100644 --- a/src/widget/edit-widget/color-picker.js +++ b/src/widget/edit-widget/color-picker.js @@ -27,25 +27,27 @@ class ColorPicker extends React.Component { super(props); this.state = { - color: null + widget: {} }; } static getDerivedStateFromProps(props, state){ - let parts = props.controlId.split('.'); - let isCustomProperty = true; - if (parts.length === 1){ - isCustomProperty = false; - } - let color = (isCustomProperty ? props.widget[parts[0]][parts[1]] : props.widget[props.controlId]); return { - color: color + widget: props.widget }; } handleChangeComplete = (color) => { - this.setState({ color: color.hex }); + let parts = this.props.controlId.split('.'); + let isCustomProperty = true; + if (parts.length === 1){ + isCustomProperty = false; + } + + let temp = this.state.widget; + isCustomProperty ? temp[parts[0]][parts[1]] = color.hex : temp[this.props.controlId] = color.hex; + this.setState({ widget: temp }); }; onClose = canceled => { @@ -58,15 +60,20 @@ class ColorPicker extends React.Component { } if (this.valid && this.props.onClose != null) { - this.props.onClose(this.state.color); + this.props.onClose(this.state.widget); } }; render() { + let parts = this.props.controlId.split('.'); + let isCustomProperty = true; + if (parts.length === 1){ + isCustomProperty = false; + } return this.onClose(c)} valid={true}>
    diff --git a/src/widget/edit-widget/edit-widget-color-control.js b/src/widget/edit-widget/edit-widget-color-control.js index f5039d2..407a970 100644 --- a/src/widget/edit-widget/edit-widget-color-control.js +++ b/src/widget/edit-widget/edit-widget-color-control.js @@ -17,8 +17,6 @@ import React, { Component } from 'react'; import { FormGroup, OverlayTrigger, Tooltip , FormLabel, Button } from 'react-bootstrap'; -import { scaleOrdinal } from 'd3-scale'; -import {schemeCategory10} from 'd3-scale-chromatic'; import ColorPicker from './color-picker' import Icon from "../../common/icon"; @@ -26,22 +24,13 @@ import Icon from "../../common/icon"; class EditWidgetColorControl extends Component { - static get ColorPalette() { - let colorCount = 0; - const colors = []; - const colorScale = scaleOrdinal(schemeCategory10); - while (colorCount < 10) { colors.push(colorScale(colorCount)); colorCount++; } - colors.unshift('#000', '#FFF'); // include black and white - - return colors; - } - constructor(props) { super(props); this.state = { widget: {}, - showColorPicker: false + showColorPicker: false, + originalColor: null }; } @@ -52,18 +41,44 @@ class EditWidgetColorControl extends Component { } openColorPicker = () =>{ - this.setState({showColorPicker: true}) + let parts = this.props.controlId.split('.'); + let isCustomProperty = true; + if (parts.length === 1){ + isCustomProperty = false; + } + let color = (isCustomProperty ? this.props.widget[parts[0]][parts[1]] : this.props.widget[this.props.controlId]); + + this.setState({showColorPicker: true, originalColor: color}); } closeEditModal = (data) => { this.setState({showColorPicker: false}) - if(data){ - this.props.handleChange({target: { id: this.props.controlId, value: data}}); + if(typeof data === 'undefined'){ + let parts = this.props.controlId.split('.'); + let isCustomProperty = true; + if (parts.length === 1) { + isCustomProperty = false; + } + + let temp = this.state.widget; + isCustomProperty ? temp[parts[0]][parts[1]] = this.state.originalColor : temp[this.props.controlId] = this.state.originalColor; + this.setState({ widget: temp }); } } render() { - const currentColor = this.state.widget[this.props.controlId]; + let parts = this.props.controlId.split('.'); + let isCustomProperty = true; + if (parts.length === 1){ + isCustomProperty = false; + } + let color = (isCustomProperty ? this.props.widget[parts[0]][parts[1]] : this.props.widget[this.props.controlId]); + let style = { + backgroundColor: color, + width: '260px', + height: '40px' + } + return ( @@ -71,7 +86,7 @@ class EditWidgetColorControl extends Component {
    Change color } > - diff --git a/src/widget/widget-factory.js b/src/widget/widget-factory.js index 3fe95e6..dd2c77b 100644 --- a/src/widget/widget-factory.js +++ b/src/widget/widget-factory.js @@ -63,8 +63,8 @@ class WidgetFactory { widget.minHeight = 5; widget.width = 20; widget.height = 20; - widget.customProperties.on_color = 6; - widget.customProperties.off_color = 8; + widget.customProperties.on_color = '#4287f5'; + widget.customProperties.off_color = '#4287f5'; widget.customProperties.threshold = 0.5; break; case 'Value': @@ -102,7 +102,7 @@ class WidgetFactory { widget.height = 35; widget.name = 'Label'; widget.customProperties.textSize = 32; - widget.customProperties.fontColor = 0; + widget.customProperties.fontColor = '#4287f5'; widget.customProperties.resizeTopBottomLock = true; break; case 'Image': @@ -118,8 +118,8 @@ class WidgetFactory { widget.minHeight = 50; widget.width = 100; widget.height = 100; - widget.customProperties.background_color = 1; - widget.customProperties.font_color = 0; + widget.customProperties.background_color = '#4287f5'; + widget.customProperties.font_color = '#4287f5'; widget.customProperties.on_value = 1; widget.customProperties.off_value = 0; widget.customProperties.toggle = false; @@ -167,8 +167,8 @@ class WidgetFactory { widget.minHeight = 50; widget.width = 100; widget.height = 100; - widget.customProperties.border_color = 0; - widget.customProperties.background_color = 9; + widget.customProperties.border_color = '#4287f5'; + widget.customProperties.background_color = '#961520'; widget.customProperties.background_color_opacity = 0.5; widget.z = 0; break; @@ -183,7 +183,7 @@ class WidgetFactory { case 'Line': widget.height = 30; widget.width = 150; - widget.customProperties.border_color = 0; + widget.customProperties.border_color = '#4287f5'; widget.customProperties.border_width = 2; widget.customProperties.margin_top = 15; widget.customProperties.rotation = 0; diff --git a/src/widget/widgets/box.js b/src/widget/widgets/box.js index 88e7c67..bd0dbee 100644 --- a/src/widget/widgets/box.js +++ b/src/widget/widgets/box.js @@ -17,16 +17,13 @@ import React, { Component } from 'react'; -import EditWidgetColorControl from '../edit-widget/edit-widget-color-control'; class WidgetBox extends Component { render() { - let colors = EditWidgetColorControl.ColorPalette; - let colorStyle = { - borderColor: colors[this.props.widget.customProperties.border_color], - backgroundColor: colors[this.props.widget.customProperties.background_color], + borderColor: this.props.widget.customProperties.border_color, + backgroundColor: this.props.widget.customProperties.background_color, opacity: this.props.widget.customProperties.background_color_opacity, } diff --git a/src/widget/widgets/label.js b/src/widget/widgets/label.js index a7431e2..048e0e1 100644 --- a/src/widget/widgets/label.js +++ b/src/widget/widgets/label.js @@ -17,13 +17,12 @@ import React, { Component } from 'react'; -import EditWidgetColorControl from '../edit-widget/edit-widget-color-control'; class WidgetLabel extends Component { render() { const style = { fontSize: this.props.widget.customProperties.textSize + 'px', - color: EditWidgetColorControl.ColorPalette[this.props.widget.customProperties.fontColor] + color: this.props.widget.customProperties.fontColor }; return ( diff --git a/src/widget/widgets/lamp.js b/src/widget/widgets/lamp.js index c6fd5e6..a686f37 100644 --- a/src/widget/widgets/lamp.js +++ b/src/widget/widgets/lamp.js @@ -17,7 +17,6 @@ import React, { Component } from 'react'; -import EditWidgetColorControl from '../edit-widget/edit-widget-color-control'; class WidgetLamp extends Component { constructor(props) { @@ -61,13 +60,12 @@ class WidgetLamp extends Component { render() { - let colors = EditWidgetColorControl.ColorPalette; let color; if (Number(this.state.value) > Number(this.props.widget.customProperties.threshold)) - color = colors[this.props.widget.customProperties.on_color]; + color = this.props.widget.customProperties.on_color; else - color = colors[this.props.widget.customProperties.off_color]; + color = this.props.widget.customProperties.off_color; let style = { backgroundColor: color, diff --git a/src/widget/widgets/line.js b/src/widget/widgets/line.js index 680ca03..bee3112 100644 --- a/src/widget/widgets/line.js +++ b/src/widget/widgets/line.js @@ -17,12 +17,10 @@ import React, { Component } from 'react'; -import EditWidgetColorControl from '../edit-widget/edit-widget-color-control'; - class WidgetLine extends Component { render() { const lineStyle = { - borderColor: EditWidgetColorControl.ColorPalette[this.props.widget.customProperties.border_color], + borderColor: this.props.widget.customProperties.border_color, transform: 'rotate(' + this.props.widget.customProperties.rotation + 'deg)', borderWidth: '' + this.props.widget.customProperties.border_width + 'px' }; From 1430c650ae3bf01458a0dee2b186cc2fd9854461 Mon Sep 17 00:00:00 2001 From: Laura Fuentes Grau Date: Sun, 2 Aug 2020 15:09:38 +0200 Subject: [PATCH 324/391] Opacity now changeable through color picker #251 --- src/widget/edit-widget/color-picker.js | 25 ++++++++++++++++++- .../edit-widget/edit-widget-color-control.js | 9 ++++++- .../edit-widget-control-creator.js | 1 - src/widget/widget-factory.js | 7 +++++- src/widget/widgets/label.js | 3 ++- src/widget/widgets/lamp.js | 10 ++++++-- src/widget/widgets/line.js | 1 + 7 files changed, 49 insertions(+), 7 deletions(-) diff --git a/src/widget/edit-widget/color-picker.js b/src/widget/edit-widget/color-picker.js index b150f33..81a08b2 100644 --- a/src/widget/edit-widget/color-picker.js +++ b/src/widget/edit-widget/color-picker.js @@ -38,6 +38,16 @@ class ColorPicker extends React.Component { }; } + hexToRgb = (hex,opacity) => { + var result = /^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(hex); + return result ? { + r: parseInt(result[1], 16), + g: parseInt(result[2], 16), + b: parseInt(result[3], 16), + a: opacity + } : null; + } + handleChangeComplete = (color) => { let parts = this.props.controlId.split('.'); let isCustomProperty = true; @@ -47,6 +57,8 @@ class ColorPicker extends React.Component { let temp = this.state.widget; isCustomProperty ? temp[parts[0]][parts[1]] = color.hex : temp[this.props.controlId] = color.hex; + isCustomProperty ? temp[parts[0]][parts[1] + "_opacity"] = color.rgb.a : temp[this.props.controlId +"_opacity"] = color.rgb.a; + this.setState({ widget: temp }); }; @@ -65,15 +77,26 @@ class ColorPicker extends React.Component { }; render() { + let disableOpacity = false; let parts = this.props.controlId.split('.'); let isCustomProperty = true; if (parts.length === 1){ isCustomProperty = false; } + + if(this.state.widget.type === "Box" && parts[1] === "border_color"){ + disableOpacity = true; + } + + let hexColor = isCustomProperty ? this.state.widget[parts[0]][parts[1]]: this.state.widget[this.props.controlId]; + let opacity = isCustomProperty ? this.state.widget[parts[0]][parts[1] + "_opacity"]: this.state.widget[this.props.controlId + "_opacity"]; + let rgbColor = this.hexToRgb(hexColor, opacity); + return this.onClose(c)} valid={true}> diff --git a/src/widget/edit-widget/edit-widget-color-control.js b/src/widget/edit-widget/edit-widget-color-control.js index 407a970..c50039f 100644 --- a/src/widget/edit-widget/edit-widget-color-control.js +++ b/src/widget/edit-widget/edit-widget-color-control.js @@ -73,19 +73,26 @@ class EditWidgetColorControl extends Component { isCustomProperty = false; } let color = (isCustomProperty ? this.props.widget[parts[0]][parts[1]] : this.props.widget[this.props.controlId]); + let opacity = (isCustomProperty ? this.props.widget[parts[0]][parts[1] + "_opacity"] : this.props.widget[this.props.controlId + "_opacity"]); let style = { backgroundColor: color, + opacity: opacity, width: '260px', height: '40px' } + let tooltipText = "Change color and opacity"; + if(this.state.widget.type === "Box" && parts[1] === "border_color"){ + tooltipText = "Change border color"; + } + return ( {this.props.label}
    - Change color } > + {tooltipText} } > diff --git a/src/widget/edit-widget/edit-widget-control-creator.js b/src/widget/edit-widget/edit-widget-control-creator.js index b26bc04..0cc0713 100644 --- a/src/widget/edit-widget/edit-widget-control-creator.js +++ b/src/widget/edit-widget/edit-widget-control-creator.js @@ -122,7 +122,6 @@ export default function CreateControls(widgetType = null, widget = null, session DialogControls.push( handleChange(e)} />, handleChange(e)} />, - handleChange(e)} /> ); break; case 'Label': diff --git a/src/widget/widget-factory.js b/src/widget/widget-factory.js index dd2c77b..29a0b6c 100644 --- a/src/widget/widget-factory.js +++ b/src/widget/widget-factory.js @@ -64,7 +64,9 @@ class WidgetFactory { widget.width = 20; widget.height = 20; widget.customProperties.on_color = '#4287f5'; + widget.customProperties.on_color_opacity = 1; widget.customProperties.off_color = '#4287f5'; + widget.customProperties.off_color_opacity = 1; widget.customProperties.threshold = 0.5; break; case 'Value': @@ -103,6 +105,7 @@ class WidgetFactory { widget.name = 'Label'; widget.customProperties.textSize = 32; widget.customProperties.fontColor = '#4287f5'; + widget.customProperties.fontColor_opacity = 1; widget.customProperties.resizeTopBottomLock = true; break; case 'Image': @@ -168,8 +171,9 @@ class WidgetFactory { widget.width = 100; widget.height = 100; widget.customProperties.border_color = '#4287f5'; + widget.customProperties.border_color_opacity = 1; widget.customProperties.background_color = '#961520'; - widget.customProperties.background_color_opacity = 0.5; + widget.customProperties.background_color_opacity = 1; widget.z = 0; break; case 'HTML': @@ -184,6 +188,7 @@ class WidgetFactory { widget.height = 30; widget.width = 150; widget.customProperties.border_color = '#4287f5'; + widget.customProperties.border_color_opacity = 1; widget.customProperties.border_width = 2; widget.customProperties.margin_top = 15; widget.customProperties.rotation = 0; diff --git a/src/widget/widgets/label.js b/src/widget/widgets/label.js index 048e0e1..2a29e1f 100644 --- a/src/widget/widgets/label.js +++ b/src/widget/widgets/label.js @@ -22,7 +22,8 @@ class WidgetLabel extends Component { render() { const style = { fontSize: this.props.widget.customProperties.textSize + 'px', - color: this.props.widget.customProperties.fontColor + color: this.props.widget.customProperties.fontColor, + opacity: this.props.widget.customProperties.fontColor_opacity, }; return ( diff --git a/src/widget/widgets/lamp.js b/src/widget/widgets/lamp.js index a686f37..d43aadf 100644 --- a/src/widget/widgets/lamp.js +++ b/src/widget/widgets/lamp.js @@ -61,14 +61,20 @@ class WidgetLamp extends Component { render() { let color; + let opacity; - if (Number(this.state.value) > Number(this.props.widget.customProperties.threshold)) + if (Number(this.state.value) > Number(this.props.widget.customProperties.threshold)){ color = this.props.widget.customProperties.on_color; - else + opacity = this.props.widget.customProperties.on_color_opacity; + } + else{ color = this.props.widget.customProperties.off_color; + opacity = this.props.widget.customProperties.off_color_opacity; + } let style = { backgroundColor: color, + opacity: opacity } return ( diff --git a/src/widget/widgets/line.js b/src/widget/widgets/line.js index bee3112..e587f62 100644 --- a/src/widget/widgets/line.js +++ b/src/widget/widgets/line.js @@ -21,6 +21,7 @@ class WidgetLine extends Component { render() { const lineStyle = { borderColor: this.props.widget.customProperties.border_color, + opacity: this.props.widget.customProperties.border_color_opacity, transform: 'rotate(' + this.props.widget.customProperties.rotation + 'deg)', borderWidth: '' + this.props.widget.customProperties.border_width + 'px' }; From ed2733f1f0f545636af387ff69afe55cfeb264d7 Mon Sep 17 00:00:00 2001 From: Sonja Happ Date: Mon, 24 Aug 2020 09:04:54 +0200 Subject: [PATCH 325/391] Fixing query of files and configs for scenario upon loading dashboard #253 --- src/dashboard/dashboard.js | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/src/dashboard/dashboard.js b/src/dashboard/dashboard.js index ee3c247..ff3c135 100644 --- a/src/dashboard/dashboard.js +++ b/src/dashboard/dashboard.js @@ -165,8 +165,6 @@ class Dashboard extends Component { token: this.state.sessionToken }); - - } componentDidUpdate(prevProps: Readonly

    , prevState: Readonly, snapshot: SS) { @@ -181,23 +179,23 @@ class Dashboard extends Component { Dashboard.webSocketsOpened = true; } - if(this.state.configs.length === 0 && this.state.dashboard !== undefined) { - // load configs + if(prevState.dashboard === undefined && this.state.dashboard !== undefined){ + // the dashboard was loaded, so that the scenarioID is available + + // load configs of scenario AppDispatcher.dispatch({ type: 'configs/start-load', token: this.state.sessionToken, param: '?scenarioID=' + this.state.dashboard.scenarioID }); - } - if(this.state.files.length === 0 && this.state.dashboard !== undefined){ + // load files of scenario AppDispatcher.dispatch({ type: 'files/start-load', param: '?scenarioID=' + this.state.dashboard.scenarioID, token: this.state.sessionToken }); } - } componentWillUnmount() { From 5d71bca9549f16281754f27f3f856633a0994e91 Mon Sep 17 00:00:00 2001 From: Sonja Happ Date: Mon, 24 Aug 2020 09:05:35 +0200 Subject: [PATCH 326/391] Update package versions (security updates) --- package-lock.json | 4284 +++++++++++++++------------------------------ package.json | 18 +- 2 files changed, 1452 insertions(+), 2850 deletions(-) diff --git a/package-lock.json b/package-lock.json index 0f4ba67..ba61ff2 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,19 +10,19 @@ "integrity": "sha512-bvVOe7A+r7lws58B7r+fgnQDK90cV45AXuvGx6i5CCSX1W/M3AJnHsNggDANBxEtWdNdFWcDd5LorB+RdSIlBw==" }, "@babel/code-frame": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.3.tgz", - "integrity": "sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz", + "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==", "requires": { - "@babel/highlight": "^7.8.3" + "@babel/highlight": "^7.10.4" } }, "@babel/compat-data": { - "version": "7.9.0", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.9.0.tgz", - "integrity": "sha512-zeFQrr+284Ekvd9e7KAX954LkapWiOmQtsfHirhxqfdlX6MEC32iRE+pqUGlYIBchdevaCwvzxWGSy/YBNI85g==", + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.11.0.tgz", + "integrity": "sha512-TPSvJfv73ng0pfnEOh17bYMPQbI95+nGWc71Ss4vZdRBHTDqmM9Z8ZV4rYz8Ks7sfzc95n30k6ODIq5UGnXcYQ==", "requires": { - "browserslist": "^4.9.1", + "browserslist": "^4.12.0", "invariant": "^2.2.4", "semver": "^5.5.0" }, @@ -70,13 +70,12 @@ } }, "@babel/generator": { - "version": "7.9.5", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.9.5.tgz", - "integrity": "sha512-GbNIxVB3ZJe3tLeDm1HSn2AhuD/mVcyLDpgtLXa5tplmWrJdF/elxB56XNqCuD6szyNkDi6wuoKXln3QeBmCHQ==", + "version": "7.11.4", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.11.4.tgz", + "integrity": "sha512-Rn26vueFx0eOoz7iifCN2UHT6rGtnkSGWSoDRIy8jZN3B91PzeSULbswfLoOWuTuAcNwpG/mxy+uCTDnZ9Mp1g==", "requires": { - "@babel/types": "^7.9.5", + "@babel/types": "^7.11.0", "jsesc": "^2.5.1", - "lodash": "^4.17.13", "source-map": "^0.5.0" }, "dependencies": { @@ -88,48 +87,48 @@ } }, "@babel/helper-annotate-as-pure": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.8.3.tgz", - "integrity": "sha512-6o+mJrZBxOoEX77Ezv9zwW7WV8DdluouRKNY/IR5u/YTMuKHgugHOzYWlYvYLpLA9nPsQCAAASpCIbjI9Mv+Uw==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.10.4.tgz", + "integrity": "sha512-XQlqKQP4vXFB7BN8fEEerrmYvHp3fK/rBkRFz9jaJbzK0B1DSfej9Kc7ZzE8Z/OnId1jpJdNAZ3BFQjWG68rcA==", "requires": { - "@babel/types": "^7.8.3" + "@babel/types": "^7.10.4" } }, "@babel/helper-builder-binary-assignment-operator-visitor": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.8.3.tgz", - "integrity": "sha512-5eFOm2SyFPK4Rh3XMMRDjN7lBH0orh3ss0g3rTYZnBQ+r6YPj7lgDyCvPphynHvUrobJmeMignBr6Acw9mAPlw==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.10.4.tgz", + "integrity": "sha512-L0zGlFrGWZK4PbT8AszSfLTM5sDU1+Az/En9VrdT8/LmEiJt4zXt+Jve9DCAnQcbqDhCI+29y/L93mrDzddCcg==", "requires": { - "@babel/helper-explode-assignable-expression": "^7.8.3", - "@babel/types": "^7.8.3" + "@babel/helper-explode-assignable-expression": "^7.10.4", + "@babel/types": "^7.10.4" } }, "@babel/helper-builder-react-jsx": { - "version": "7.9.0", - "resolved": "https://registry.npmjs.org/@babel/helper-builder-react-jsx/-/helper-builder-react-jsx-7.9.0.tgz", - "integrity": "sha512-weiIo4gaoGgnhff54GQ3P5wsUQmnSwpkvU0r6ZHq6TzoSzKy4JxHEgnxNytaKbov2a9z/CVNyzliuCOUPEX3Jw==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-react-jsx/-/helper-builder-react-jsx-7.10.4.tgz", + "integrity": "sha512-5nPcIZ7+KKDxT1427oBivl9V9YTal7qk0diccnh7RrcgrT/pGFOjgGw1dgryyx1GvHEpXVfoDF6Ak3rTiWh8Rg==", "requires": { - "@babel/helper-annotate-as-pure": "^7.8.3", - "@babel/types": "^7.9.0" + "@babel/helper-annotate-as-pure": "^7.10.4", + "@babel/types": "^7.10.4" } }, "@babel/helper-builder-react-jsx-experimental": { - "version": "7.9.5", - "resolved": "https://registry.npmjs.org/@babel/helper-builder-react-jsx-experimental/-/helper-builder-react-jsx-experimental-7.9.5.tgz", - "integrity": "sha512-HAagjAC93tk748jcXpZ7oYRZH485RCq/+yEv9SIWezHRPv9moZArTnkUNciUNzvwHUABmiWKlcxJvMcu59UwTg==", + "version": "7.10.5", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-react-jsx-experimental/-/helper-builder-react-jsx-experimental-7.10.5.tgz", + "integrity": "sha512-Buewnx6M4ttG+NLkKyt7baQn7ScC/Td+e99G914fRU8fGIUivDDgVIQeDHFa5e4CRSJQt58WpNHhsAZgtzVhsg==", "requires": { - "@babel/helper-annotate-as-pure": "^7.8.3", - "@babel/helper-module-imports": "^7.8.3", - "@babel/types": "^7.9.5" + "@babel/helper-annotate-as-pure": "^7.10.4", + "@babel/helper-module-imports": "^7.10.4", + "@babel/types": "^7.10.5" } }, "@babel/helper-compilation-targets": { - "version": "7.8.7", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.8.7.tgz", - "integrity": "sha512-4mWm8DCK2LugIS+p1yArqvG1Pf162upsIsjE7cNBjez+NjliQpVhj20obE520nao0o14DaTnFJv+Fw5a0JpoUw==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.10.4.tgz", + "integrity": "sha512-a3rYhlsGV0UHNDvrtOXBg8/OpfV0OKTkxKPzIplS1zpx7CygDcWWxckxZeDd3gzPzC4kUT0A4nVFDK0wGMh4MQ==", "requires": { - "@babel/compat-data": "^7.8.6", - "browserslist": "^4.9.1", + "@babel/compat-data": "^7.10.4", + "browserslist": "^4.12.0", "invariant": "^2.2.4", "levenary": "^1.1.1", "semver": "^5.5.0" @@ -143,222 +142,228 @@ } }, "@babel/helper-create-class-features-plugin": { - "version": "7.9.5", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.9.5.tgz", - "integrity": "sha512-IipaxGaQmW4TfWoXdqjY0TzoXQ1HRS0kPpEgvjosb3u7Uedcq297xFqDQiCcQtRRwzIMif+N1MLVI8C5a4/PAA==", + "version": "7.10.5", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.10.5.tgz", + "integrity": "sha512-0nkdeijB7VlZoLT3r/mY3bUkw3T8WG/hNw+FATs/6+pG2039IJWjTYL0VTISqsNHMUTEnwbVnc89WIJX9Qed0A==", "requires": { - "@babel/helper-function-name": "^7.9.5", - "@babel/helper-member-expression-to-functions": "^7.8.3", - "@babel/helper-optimise-call-expression": "^7.8.3", - "@babel/helper-plugin-utils": "^7.8.3", - "@babel/helper-replace-supers": "^7.8.6", - "@babel/helper-split-export-declaration": "^7.8.3" + "@babel/helper-function-name": "^7.10.4", + "@babel/helper-member-expression-to-functions": "^7.10.5", + "@babel/helper-optimise-call-expression": "^7.10.4", + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/helper-replace-supers": "^7.10.4", + "@babel/helper-split-export-declaration": "^7.10.4" } }, "@babel/helper-create-regexp-features-plugin": { - "version": "7.8.8", - "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.8.8.tgz", - "integrity": "sha512-LYVPdwkrQEiX9+1R29Ld/wTrmQu1SSKYnuOk3g0CkcZMA1p0gsNxJFj/3gBdaJ7Cg0Fnek5z0DsMULePP7Lrqg==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.10.4.tgz", + "integrity": "sha512-2/hu58IEPKeoLF45DBwx3XFqsbCXmkdAay4spVr2x0jYgRxrSNp+ePwvSsy9g6YSaNDcKIQVPXk1Ov8S2edk2g==", "requires": { - "@babel/helper-annotate-as-pure": "^7.8.3", - "@babel/helper-regex": "^7.8.3", + "@babel/helper-annotate-as-pure": "^7.10.4", + "@babel/helper-regex": "^7.10.4", "regexpu-core": "^4.7.0" } }, "@babel/helper-define-map": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-define-map/-/helper-define-map-7.8.3.tgz", - "integrity": "sha512-PoeBYtxoZGtct3md6xZOCWPcKuMuk3IHhgxsRRNtnNShebf4C8YonTSblsK4tvDbm+eJAw2HAPOfCr+Q/YRG/g==", + "version": "7.10.5", + "resolved": "https://registry.npmjs.org/@babel/helper-define-map/-/helper-define-map-7.10.5.tgz", + "integrity": "sha512-fMw4kgFB720aQFXSVaXr79pjjcW5puTCM16+rECJ/plGS+zByelE8l9nCpV1GibxTnFVmUuYG9U8wYfQHdzOEQ==", "requires": { - "@babel/helper-function-name": "^7.8.3", - "@babel/types": "^7.8.3", - "lodash": "^4.17.13" + "@babel/helper-function-name": "^7.10.4", + "@babel/types": "^7.10.5", + "lodash": "^4.17.19" } }, "@babel/helper-explode-assignable-expression": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.8.3.tgz", - "integrity": "sha512-N+8eW86/Kj147bO9G2uclsg5pwfs/fqqY5rwgIL7eTBklgXjcOJ3btzS5iM6AitJcftnY7pm2lGsrJVYLGjzIw==", + "version": "7.11.4", + "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.11.4.tgz", + "integrity": "sha512-ux9hm3zR4WV1Y3xXxXkdG/0gxF9nvI0YVmKVhvK9AfMoaQkemL3sJpXw+Xbz65azo8qJiEz2XVDUpK3KYhH3ZQ==", "requires": { - "@babel/traverse": "^7.8.3", - "@babel/types": "^7.8.3" + "@babel/types": "^7.10.4" } }, "@babel/helper-function-name": { - "version": "7.9.5", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.9.5.tgz", - "integrity": "sha512-JVcQZeXM59Cd1qanDUxv9fgJpt3NeKUaqBqUEvfmQ+BCOKq2xUgaWZW2hr0dkbyJgezYuplEoh5knmrnS68efw==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.10.4.tgz", + "integrity": "sha512-YdaSyz1n8gY44EmN7x44zBn9zQ1Ry2Y+3GTA+3vH6Mizke1Vw0aWDM66FOYEPw8//qKkmqOckrGgTYa+6sceqQ==", "requires": { - "@babel/helper-get-function-arity": "^7.8.3", - "@babel/template": "^7.8.3", - "@babel/types": "^7.9.5" + "@babel/helper-get-function-arity": "^7.10.4", + "@babel/template": "^7.10.4", + "@babel/types": "^7.10.4" } }, "@babel/helper-get-function-arity": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.8.3.tgz", - "integrity": "sha512-FVDR+Gd9iLjUMY1fzE2SR0IuaJToR4RkCDARVfsBBPSP53GEqSFjD8gNyxg246VUyc/ALRxFaAK8rVG7UT7xRA==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.4.tgz", + "integrity": "sha512-EkN3YDB+SRDgiIUnNgcmiD361ti+AVbL3f3Henf6dqqUyr5dMsorno0lJWJuLhDhkI5sYEpgj6y9kB8AOU1I2A==", "requires": { - "@babel/types": "^7.8.3" + "@babel/types": "^7.10.4" } }, "@babel/helper-hoist-variables": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.8.3.tgz", - "integrity": "sha512-ky1JLOjcDUtSc+xkt0xhYff7Z6ILTAHKmZLHPxAhOP0Nd77O+3nCsd6uSVYur6nJnCI029CrNbYlc0LoPfAPQg==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.10.4.tgz", + "integrity": "sha512-wljroF5PgCk2juF69kanHVs6vrLwIPNp6DLD+Lrl3hoQ3PpPPikaDRNFA+0t81NOoMt2DL6WW/mdU8k4k6ZzuA==", "requires": { - "@babel/types": "^7.8.3" + "@babel/types": "^7.10.4" } }, "@babel/helper-member-expression-to-functions": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.8.3.tgz", - "integrity": "sha512-fO4Egq88utkQFjbPrSHGmGLFqmrshs11d46WI+WZDESt7Wu7wN2G2Iu+NMMZJFDOVRHAMIkB5SNh30NtwCA7RA==", + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.11.0.tgz", + "integrity": "sha512-JbFlKHFntRV5qKw3YC0CvQnDZ4XMwgzzBbld7Ly4Mj4cbFy3KywcR8NtNctRToMWJOVvLINJv525Gd6wwVEx/Q==", "requires": { - "@babel/types": "^7.8.3" + "@babel/types": "^7.11.0" } }, "@babel/helper-module-imports": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.8.3.tgz", - "integrity": "sha512-R0Bx3jippsbAEtzkpZ/6FIiuzOURPcMjHp+Z6xPe6DtApDJx+w7UYyOLanZqO8+wKR9G10s/FmHXvxaMd9s6Kg==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.10.4.tgz", + "integrity": "sha512-nEQJHqYavI217oD9+s5MUBzk6x1IlvoS9WTPfgG43CbMEeStE0v+r+TucWdx8KFGowPGvyOkDT9+7DHedIDnVw==", "requires": { - "@babel/types": "^7.8.3" + "@babel/types": "^7.10.4" } }, "@babel/helper-module-transforms": { - "version": "7.9.0", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.9.0.tgz", - "integrity": "sha512-0FvKyu0gpPfIQ8EkxlrAydOWROdHpBmiCiRwLkUiBGhCUPRRbVD2/tm3sFr/c/GWFrQ/ffutGUAnx7V0FzT2wA==", + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.11.0.tgz", + "integrity": "sha512-02EVu8COMuTRO1TAzdMtpBPbe6aQ1w/8fePD2YgQmxZU4gpNWaL9gK3Jp7dxlkUlUCJOTaSeA+Hrm1BRQwqIhg==", "requires": { - "@babel/helper-module-imports": "^7.8.3", - "@babel/helper-replace-supers": "^7.8.6", - "@babel/helper-simple-access": "^7.8.3", - "@babel/helper-split-export-declaration": "^7.8.3", - "@babel/template": "^7.8.6", - "@babel/types": "^7.9.0", - "lodash": "^4.17.13" + "@babel/helper-module-imports": "^7.10.4", + "@babel/helper-replace-supers": "^7.10.4", + "@babel/helper-simple-access": "^7.10.4", + "@babel/helper-split-export-declaration": "^7.11.0", + "@babel/template": "^7.10.4", + "@babel/types": "^7.11.0", + "lodash": "^4.17.19" } }, "@babel/helper-optimise-call-expression": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.8.3.tgz", - "integrity": "sha512-Kag20n86cbO2AvHca6EJsvqAd82gc6VMGule4HwebwMlwkpXuVqrNRj6CkCV2sKxgi9MyAUnZVnZ6lJ1/vKhHQ==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.10.4.tgz", + "integrity": "sha512-n3UGKY4VXwXThEiKrgRAoVPBMqeoPgHVqiHZOanAJCG9nQUL2pLRQirUzl0ioKclHGpGqRgIOkgcIJaIWLpygg==", "requires": { - "@babel/types": "^7.8.3" + "@babel/types": "^7.10.4" } }, "@babel/helper-plugin-utils": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz", - "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==" + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", + "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==" }, "@babel/helper-regex": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-regex/-/helper-regex-7.8.3.tgz", - "integrity": "sha512-BWt0QtYv/cg/NecOAZMdcn/waj/5P26DR4mVLXfFtDokSR6fyuG0Pj+e2FqtSME+MqED1khnSMulkmGl8qWiUQ==", + "version": "7.10.5", + "resolved": "https://registry.npmjs.org/@babel/helper-regex/-/helper-regex-7.10.5.tgz", + "integrity": "sha512-68kdUAzDrljqBrio7DYAEgCoJHxppJOERHOgOrDN7WjOzP0ZQ1LsSDRXcemzVZaLvjaJsJEESb6qt+znNuENDg==", "requires": { - "lodash": "^4.17.13" + "lodash": "^4.17.19" } }, "@babel/helper-remap-async-to-generator": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.8.3.tgz", - "integrity": "sha512-kgwDmw4fCg7AVgS4DukQR/roGp+jP+XluJE5hsRZwxCYGg+Rv9wSGErDWhlI90FODdYfd4xG4AQRiMDjjN0GzA==", + "version": "7.11.4", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.11.4.tgz", + "integrity": "sha512-tR5vJ/vBa9wFy3m5LLv2faapJLnDFxNWff2SAYkSE4rLUdbp7CdObYFgI7wK4T/Mj4UzpjPwzR8Pzmr5m7MHGA==", "requires": { - "@babel/helper-annotate-as-pure": "^7.8.3", - "@babel/helper-wrap-function": "^7.8.3", - "@babel/template": "^7.8.3", - "@babel/traverse": "^7.8.3", - "@babel/types": "^7.8.3" + "@babel/helper-annotate-as-pure": "^7.10.4", + "@babel/helper-wrap-function": "^7.10.4", + "@babel/template": "^7.10.4", + "@babel/types": "^7.10.4" } }, "@babel/helper-replace-supers": { - "version": "7.8.6", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.8.6.tgz", - "integrity": "sha512-PeMArdA4Sv/Wf4zXwBKPqVj7n9UF/xg6slNRtZW84FM7JpE1CbG8B612FyM4cxrf4fMAMGO0kR7voy1ForHHFA==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.10.4.tgz", + "integrity": "sha512-sPxZfFXocEymYTdVK1UNmFPBN+Hv5mJkLPsYWwGBxZAxaWfFu+xqp7b6qWD0yjNuNL2VKc6L5M18tOXUP7NU0A==", "requires": { - "@babel/helper-member-expression-to-functions": "^7.8.3", - "@babel/helper-optimise-call-expression": "^7.8.3", - "@babel/traverse": "^7.8.6", - "@babel/types": "^7.8.6" + "@babel/helper-member-expression-to-functions": "^7.10.4", + "@babel/helper-optimise-call-expression": "^7.10.4", + "@babel/traverse": "^7.10.4", + "@babel/types": "^7.10.4" } }, "@babel/helper-simple-access": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.8.3.tgz", - "integrity": "sha512-VNGUDjx5cCWg4vvCTR8qQ7YJYZ+HBjxOgXEl7ounz+4Sn7+LMD3CFrCTEU6/qXKbA2nKg21CwhhBzO0RpRbdCw==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.10.4.tgz", + "integrity": "sha512-0fMy72ej/VEvF8ULmX6yb5MtHG4uH4Dbd6I/aHDb/JVg0bbivwt9Wg+h3uMvX+QSFtwr5MeItvazbrc4jtRAXw==", "requires": { - "@babel/template": "^7.8.3", - "@babel/types": "^7.8.3" + "@babel/template": "^7.10.4", + "@babel/types": "^7.10.4" + } + }, + "@babel/helper-skip-transparent-expression-wrappers": { + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.11.0.tgz", + "integrity": "sha512-0XIdiQln4Elglgjbwo9wuJpL/K7AGCY26kmEt0+pRP0TAj4jjyNq1MjoRvikrTVqKcx4Gysxt4cXvVFXP/JO2Q==", + "requires": { + "@babel/types": "^7.11.0" } }, "@babel/helper-split-export-declaration": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.8.3.tgz", - "integrity": "sha512-3x3yOeyBhW851hroze7ElzdkeRXQYQbFIb7gLK1WQYsw2GWDay5gAJNw1sWJ0VFP6z5J1whqeXH/WCdCjZv6dA==", + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.11.0.tgz", + "integrity": "sha512-74Vejvp6mHkGE+m+k5vHY93FX2cAtrw1zXrZXRlG4l410Nm9PxfEiVTn1PjDPV5SnmieiueY4AFg2xqhNFuuZg==", "requires": { - "@babel/types": "^7.8.3" + "@babel/types": "^7.11.0" } }, "@babel/helper-validator-identifier": { - "version": "7.9.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.9.5.tgz", - "integrity": "sha512-/8arLKUFq882w4tWGj9JYzRpAlZgiWUJ+dtteNTDqrRBz9Iguck9Rn3ykuBDoUwh2TO4tSAJlrxDUOXWklJe4g==" + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz", + "integrity": "sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw==" }, "@babel/helper-wrap-function": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.8.3.tgz", - "integrity": "sha512-LACJrbUET9cQDzb6kG7EeD7+7doC3JNvUgTEQOx2qaO1fKlzE/Bf05qs9w1oXQMmXlPO65lC3Tq9S6gZpTErEQ==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.10.4.tgz", + "integrity": "sha512-6py45WvEF0MhiLrdxtRjKjufwLL1/ob2qDJgg5JgNdojBAZSAKnAjkyOCNug6n+OBl4VW76XjvgSFTdaMcW0Ug==", "requires": { - "@babel/helper-function-name": "^7.8.3", - "@babel/template": "^7.8.3", - "@babel/traverse": "^7.8.3", - "@babel/types": "^7.8.3" + "@babel/helper-function-name": "^7.10.4", + "@babel/template": "^7.10.4", + "@babel/traverse": "^7.10.4", + "@babel/types": "^7.10.4" } }, "@babel/helpers": { - "version": "7.9.2", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.9.2.tgz", - "integrity": "sha512-JwLvzlXVPjO8eU9c/wF9/zOIN7X6h8DYf7mG4CiFRZRvZNKEF5dQ3H3V+ASkHoIB3mWhatgl5ONhyqHRI6MppA==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.10.4.tgz", + "integrity": "sha512-L2gX/XeUONeEbI78dXSrJzGdz4GQ+ZTA/aazfUsFaWjSe95kiCuOZ5HsXvkiw3iwF+mFHSRUfJU8t6YavocdXA==", "requires": { - "@babel/template": "^7.8.3", - "@babel/traverse": "^7.9.0", - "@babel/types": "^7.9.0" + "@babel/template": "^7.10.4", + "@babel/traverse": "^7.10.4", + "@babel/types": "^7.10.4" } }, "@babel/highlight": { - "version": "7.9.0", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.9.0.tgz", - "integrity": "sha512-lJZPilxX7Op3Nv/2cvFdnlepPXDxi29wxteT57Q965oc5R9v86ztx0jfxVrTcBk8C2kcPkkDa2Z4T3ZsPPVWsQ==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz", + "integrity": "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==", "requires": { - "@babel/helper-validator-identifier": "^7.9.0", + "@babel/helper-validator-identifier": "^7.10.4", "chalk": "^2.0.0", "js-tokens": "^4.0.0" } }, "@babel/parser": { - "version": "7.9.4", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.9.4.tgz", - "integrity": "sha512-bC49otXX6N0/VYhgOMh4gnP26E9xnDZK3TmbNpxYzzz9BQLBosQwfyOe9/cXUU3txYhTzLCbcqd5c8y/OmCjHA==" + "version": "7.11.4", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.11.4.tgz", + "integrity": "sha512-MggwidiH+E9j5Sh8pbrX5sJvMcsqS5o+7iB42M9/k0CD63MjYbdP4nhSh7uB5wnv2/RVzTZFTxzF/kIa5mrCqA==" }, "@babel/plugin-proposal-async-generator-functions": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.8.3.tgz", - "integrity": "sha512-NZ9zLv848JsV3hs8ryEh7Uaz/0KsmPLqv0+PdkDJL1cJy0K4kOCFa8zc1E3mp+RHPQcpdfb/6GovEsW4VDrOMw==", + "version": "7.10.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.10.5.tgz", + "integrity": "sha512-cNMCVezQbrRGvXJwm9fu/1sJj9bHdGAgKodZdLqOQIpfoH3raqmRPBM17+lh7CzhiKRRBrGtZL9WcjxSoGYUSg==", "requires": { - "@babel/helper-plugin-utils": "^7.8.3", - "@babel/helper-remap-async-to-generator": "^7.8.3", + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/helper-remap-async-to-generator": "^7.10.4", "@babel/plugin-syntax-async-generators": "^7.8.0" } }, "@babel/plugin-proposal-class-properties": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.8.3.tgz", - "integrity": "sha512-EqFhbo7IosdgPgZggHaNObkmO1kNUe3slaKu54d5OWvy+p9QIKOzK1GAEpAIsZtWVtPXUHSMcT4smvDrCfY4AA==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.10.4.tgz", + "integrity": "sha512-vhwkEROxzcHGNu2mzUC0OFFNXdZ4M23ib8aRRcJSsW8BZK9pQMD7QB7csl97NBbgGZO7ZyHUyKDnxzOaP4IrCg==", "requires": { - "@babel/helper-create-class-features-plugin": "^7.8.3", - "@babel/helper-plugin-utils": "^7.8.3" + "@babel/helper-create-class-features-plugin": "^7.10.4", + "@babel/helper-plugin-utils": "^7.10.4" } }, "@babel/plugin-proposal-decorators": { @@ -372,76 +377,104 @@ } }, "@babel/plugin-proposal-dynamic-import": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.8.3.tgz", - "integrity": "sha512-NyaBbyLFXFLT9FP+zk0kYlUlA8XtCUbehs67F0nnEg7KICgMc2mNkIeu9TYhKzyXMkrapZFwAhXLdnt4IYHy1w==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.10.4.tgz", + "integrity": "sha512-up6oID1LeidOOASNXgv/CFbgBqTuKJ0cJjz6An5tWD+NVBNlp3VNSBxv2ZdU7SYl3NxJC7agAQDApZusV6uFwQ==", "requires": { - "@babel/helper-plugin-utils": "^7.8.3", + "@babel/helper-plugin-utils": "^7.10.4", "@babel/plugin-syntax-dynamic-import": "^7.8.0" } }, - "@babel/plugin-proposal-json-strings": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.8.3.tgz", - "integrity": "sha512-KGhQNZ3TVCQG/MjRbAUwuH+14y9q0tpxs1nWWs3pbSleRdDro9SAMMDyye8HhY1gqZ7/NqIc8SKhya0wRDgP1Q==", + "@babel/plugin-proposal-export-namespace-from": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.10.4.tgz", + "integrity": "sha512-aNdf0LY6/3WXkhh0Fdb6Zk9j1NMD8ovj3F6r0+3j837Pn1S1PdNtcwJ5EG9WkVPNHPxyJDaxMaAOVq4eki0qbg==", "requires": { - "@babel/helper-plugin-utils": "^7.8.3", + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3" + } + }, + "@babel/plugin-proposal-json-strings": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.10.4.tgz", + "integrity": "sha512-fCL7QF0Jo83uy1K0P2YXrfX11tj3lkpN7l4dMv9Y9VkowkhkQDwFHFd8IiwyK5MZjE8UpbgokkgtcReH88Abaw==", + "requires": { + "@babel/helper-plugin-utils": "^7.10.4", "@babel/plugin-syntax-json-strings": "^7.8.0" } }, - "@babel/plugin-proposal-nullish-coalescing-operator": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.8.3.tgz", - "integrity": "sha512-TS9MlfzXpXKt6YYomudb/KU7nQI6/xnapG6in1uZxoxDghuSMZsPb6D2fyUwNYSAp4l1iR7QtFOjkqcRYcUsfw==", + "@babel/plugin-proposal-logical-assignment-operators": { + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.11.0.tgz", + "integrity": "sha512-/f8p4z+Auz0Uaf+i8Ekf1iM7wUNLcViFUGiPxKeXvxTSl63B875YPiVdUDdem7hREcI0E0kSpEhS8tF5RphK7Q==", "requires": { - "@babel/helper-plugin-utils": "^7.8.3", + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" + } + }, + "@babel/plugin-proposal-nullish-coalescing-operator": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.10.4.tgz", + "integrity": "sha512-wq5n1M3ZUlHl9sqT2ok1T2/MTt6AXE0e1Lz4WzWBr95LsAZ5qDXe4KnFuauYyEyLiohvXFMdbsOTMyLZs91Zlw==", + "requires": { + "@babel/helper-plugin-utils": "^7.10.4", "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.0" } }, "@babel/plugin-proposal-numeric-separator": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.8.3.tgz", - "integrity": "sha512-jWioO1s6R/R+wEHizfaScNsAx+xKgwTLNXSh7tTC4Usj3ItsPEhYkEpU4h+lpnBwq7NBVOJXfO6cRFYcX69JUQ==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.10.4.tgz", + "integrity": "sha512-73/G7QoRoeNkLZFxsoCCvlg4ezE4eM+57PnOqgaPOozd5myfj7p0muD1mRVJvbUWbOzD+q3No2bWbaKy+DJ8DA==", "requires": { - "@babel/helper-plugin-utils": "^7.8.3", - "@babel/plugin-syntax-numeric-separator": "^7.8.3" + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-syntax-numeric-separator": "^7.10.4" } }, "@babel/plugin-proposal-object-rest-spread": { - "version": "7.9.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.9.5.tgz", - "integrity": "sha512-VP2oXvAf7KCYTthbUHwBlewbl1Iq059f6seJGsxMizaCdgHIeczOr7FBqELhSqfkIl04Fi8okzWzl63UKbQmmg==", + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.11.0.tgz", + "integrity": "sha512-wzch41N4yztwoRw0ak+37wxwJM2oiIiy6huGCoqkvSTA9acYWcPfn9Y4aJqmFFJ70KTJUu29f3DQ43uJ9HXzEA==", "requires": { - "@babel/helper-plugin-utils": "^7.8.3", + "@babel/helper-plugin-utils": "^7.10.4", "@babel/plugin-syntax-object-rest-spread": "^7.8.0", - "@babel/plugin-transform-parameters": "^7.9.5" + "@babel/plugin-transform-parameters": "^7.10.4" } }, "@babel/plugin-proposal-optional-catch-binding": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.8.3.tgz", - "integrity": "sha512-0gkX7J7E+AtAw9fcwlVQj8peP61qhdg/89D5swOkjYbkboA2CVckn3kiyum1DE0wskGb7KJJxBdyEBApDLLVdw==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.10.4.tgz", + "integrity": "sha512-LflT6nPh+GK2MnFiKDyLiqSqVHkQnVf7hdoAvyTnnKj9xB3docGRsdPuxp6qqqW19ifK3xgc9U5/FwrSaCNX5g==", "requires": { - "@babel/helper-plugin-utils": "^7.8.3", + "@babel/helper-plugin-utils": "^7.10.4", "@babel/plugin-syntax-optional-catch-binding": "^7.8.0" } }, "@babel/plugin-proposal-optional-chaining": { - "version": "7.9.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.9.0.tgz", - "integrity": "sha512-NDn5tu3tcv4W30jNhmc2hyD5c56G6cXx4TesJubhxrJeCvuuMpttxr0OnNCqbZGhFjLrg+NIhxxC+BK5F6yS3w==", + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.11.0.tgz", + "integrity": "sha512-v9fZIu3Y8562RRwhm1BbMRxtqZNFmFA2EG+pT2diuU8PT3H6T/KXoZ54KgYisfOFZHV6PfvAiBIZ9Rcz+/JCxA==", "requires": { - "@babel/helper-plugin-utils": "^7.8.3", + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/helper-skip-transparent-expression-wrappers": "^7.11.0", "@babel/plugin-syntax-optional-chaining": "^7.8.0" } }, - "@babel/plugin-proposal-unicode-property-regex": { - "version": "7.8.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.8.8.tgz", - "integrity": "sha512-EVhjVsMpbhLw9ZfHWSx2iy13Q8Z/eg8e8ccVWt23sWQK5l1UdkoLJPN5w69UA4uITGBnEZD2JOe4QOHycYKv8A==", + "@babel/plugin-proposal-private-methods": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.10.4.tgz", + "integrity": "sha512-wh5GJleuI8k3emgTg5KkJK6kHNsGEr0uBTDBuQUBJwckk9xs1ez79ioheEVVxMLyPscB0LfkbVHslQqIzWV6Bw==", "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.8.8", - "@babel/helper-plugin-utils": "^7.8.3" + "@babel/helper-create-class-features-plugin": "^7.10.4", + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-proposal-unicode-property-regex": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.10.4.tgz", + "integrity": "sha512-H+3fOgPnEXFL9zGYtKQe4IDOPKYlZdF1kqFDQRRb8PK4B8af1vAGK04tF5iQAAsui+mHNBQSAtd2/ndEDe9wuA==", + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.10.4", + "@babel/helper-plugin-utils": "^7.10.4" } }, "@babel/plugin-syntax-async-generators": { @@ -452,12 +485,20 @@ "@babel/helper-plugin-utils": "^7.8.0" } }, - "@babel/plugin-syntax-decorators": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.8.3.tgz", - "integrity": "sha512-8Hg4dNNT9/LcA1zQlfwuKR8BUc/if7Q7NkTam9sGTcJphLwpf2g4S42uhspQrIrR+dpzE0dtTqBVFoHl8GtnnQ==", + "@babel/plugin-syntax-class-properties": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.10.4.tgz", + "integrity": "sha512-GCSBF7iUle6rNugfURwNmCGG3Z/2+opxAMLs1nND4bhEG5PuxTIggDBoeYYSujAlLtsupzOHYJQgPS3pivwXIA==", "requires": { - "@babel/helper-plugin-utils": "^7.8.3" + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-syntax-decorators": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.10.4.tgz", + "integrity": "sha512-2NaoC6fAk2VMdhY1eerkfHV+lVYC1u8b+jmRJISqANCJlTxYy19HGdIkkQtix2UtkcPuPu+IlDgrVseZnU03bw==", + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" } }, "@babel/plugin-syntax-dynamic-import": { @@ -468,14 +509,22 @@ "@babel/helper-plugin-utils": "^7.8.0" } }, - "@babel/plugin-syntax-flow": { + "@babel/plugin-syntax-export-namespace-from": { "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.8.3.tgz", - "integrity": "sha512-innAx3bUbA0KSYj2E2MNFSn9hiCeowOFLxlsuhXzw8hMQnzkDomUr9QCD7E9VF60NmnG1sNTuuv6Qf4f8INYsg==", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz", + "integrity": "sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==", "requires": { "@babel/helper-plugin-utils": "^7.8.3" } }, + "@babel/plugin-syntax-flow": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.10.4.tgz", + "integrity": "sha512-yxQsX1dJixF4qEEdzVbst3SZQ58Nrooz8NV9Z9GL4byTE25BvJgl5lf0RECUf0fh28rZBb/RYTWn/eeKwCMrZQ==", + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, "@babel/plugin-syntax-json-strings": { "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", @@ -485,11 +534,19 @@ } }, "@babel/plugin-syntax-jsx": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.8.3.tgz", - "integrity": "sha512-WxdW9xyLgBdefoo0Ynn3MRSkhe5tFVxxKNVdnZSh318WrG2e2jH+E9wd/++JsqcLJZPfz87njQJ8j2Upjm0M0A==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.10.4.tgz", + "integrity": "sha512-KCg9mio9jwiARCB7WAcQ7Y1q+qicILjoK8LP/VkPkEKaf5dkaZZK1EcTe91a3JJlZ3qy6L5s9X52boEYi8DM9g==", "requires": { - "@babel/helper-plugin-utils": "^7.8.3" + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-syntax-logical-assignment-operators": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", + "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" } }, "@babel/plugin-syntax-nullish-coalescing-operator": { @@ -501,11 +558,11 @@ } }, "@babel/plugin-syntax-numeric-separator": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.8.3.tgz", - "integrity": "sha512-H7dCMAdN83PcCmqmkHB5dtp+Xa9a6LKSvA2hiFBC/5alSHxM5VgWZXFqDi0YFe8XNGT6iCa+z4V4zSt/PdZ7Dw==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", + "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", "requires": { - "@babel/helper-plugin-utils": "^7.8.3" + "@babel/helper-plugin-utils": "^7.10.4" } }, "@babel/plugin-syntax-object-rest-spread": { @@ -533,111 +590,110 @@ } }, "@babel/plugin-syntax-top-level-await": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.8.3.tgz", - "integrity": "sha512-kwj1j9lL/6Wd0hROD3b/OZZ7MSrZLqqn9RAZ5+cYYsflQ9HZBIKCUkr3+uL1MEJ1NePiUbf98jjiMQSv0NMR9g==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.10.4.tgz", + "integrity": "sha512-ni1brg4lXEmWyafKr0ccFWkJG0CeMt4WV1oyeBW6EFObF4oOHclbkj5cARxAPQyAQ2UTuplJyK4nfkXIMMFvsQ==", "requires": { - "@babel/helper-plugin-utils": "^7.8.3" + "@babel/helper-plugin-utils": "^7.10.4" } }, "@babel/plugin-syntax-typescript": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.8.3.tgz", - "integrity": "sha512-GO1MQ/SGGGoiEXY0e0bSpHimJvxqB7lktLLIq2pv8xG7WZ8IMEle74jIe1FhprHBWjwjZtXHkycDLZXIWM5Wfg==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.10.4.tgz", + "integrity": "sha512-oSAEz1YkBCAKr5Yiq8/BNtvSAPwkp/IyUnwZogd8p+F0RuYQQrLeRUzIQhueQTTBy/F+a40uS7OFKxnkRvmvFQ==", "requires": { - "@babel/helper-plugin-utils": "^7.8.3" + "@babel/helper-plugin-utils": "^7.10.4" } }, "@babel/plugin-transform-arrow-functions": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.8.3.tgz", - "integrity": "sha512-0MRF+KC8EqH4dbuITCWwPSzsyO3HIWWlm30v8BbbpOrS1B++isGxPnnuq/IZvOX5J2D/p7DQalQm+/2PnlKGxg==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.10.4.tgz", + "integrity": "sha512-9J/oD1jV0ZCBcgnoFWFq1vJd4msoKb/TCpGNFyyLt0zABdcvgK3aYikZ8HjzB14c26bc7E3Q1yugpwGy2aTPNA==", "requires": { - "@babel/helper-plugin-utils": "^7.8.3" + "@babel/helper-plugin-utils": "^7.10.4" } }, "@babel/plugin-transform-async-to-generator": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.8.3.tgz", - "integrity": "sha512-imt9tFLD9ogt56Dd5CI/6XgpukMwd/fLGSrix2httihVe7LOGVPhyhMh1BU5kDM7iHD08i8uUtmV2sWaBFlHVQ==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.10.4.tgz", + "integrity": "sha512-F6nREOan7J5UXTLsDsZG3DXmZSVofr2tGNwfdrVwkDWHfQckbQXnXSPfD7iO+c/2HGqycwyLST3DnZ16n+cBJQ==", "requires": { - "@babel/helper-module-imports": "^7.8.3", - "@babel/helper-plugin-utils": "^7.8.3", - "@babel/helper-remap-async-to-generator": "^7.8.3" + "@babel/helper-module-imports": "^7.10.4", + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/helper-remap-async-to-generator": "^7.10.4" } }, "@babel/plugin-transform-block-scoped-functions": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.8.3.tgz", - "integrity": "sha512-vo4F2OewqjbB1+yaJ7k2EJFHlTP3jR634Z9Cj9itpqNjuLXvhlVxgnjsHsdRgASR8xYDrx6onw4vW5H6We0Jmg==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.10.4.tgz", + "integrity": "sha512-WzXDarQXYYfjaV1szJvN3AD7rZgZzC1JtjJZ8dMHUyiK8mxPRahynp14zzNjU3VkPqPsO38CzxiWO1c9ARZ8JA==", "requires": { - "@babel/helper-plugin-utils": "^7.8.3" + "@babel/helper-plugin-utils": "^7.10.4" } }, "@babel/plugin-transform-block-scoping": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.8.3.tgz", - "integrity": "sha512-pGnYfm7RNRgYRi7bids5bHluENHqJhrV4bCZRwc5GamaWIIs07N4rZECcmJL6ZClwjDz1GbdMZFtPs27hTB06w==", + "version": "7.11.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.11.1.tgz", + "integrity": "sha512-00dYeDE0EVEHuuM+26+0w/SCL0BH2Qy7LwHuI4Hi4MH5gkC8/AqMN5uWFJIsoXZrAphiMm1iXzBw6L2T+eA0ew==", "requires": { - "@babel/helper-plugin-utils": "^7.8.3", - "lodash": "^4.17.13" + "@babel/helper-plugin-utils": "^7.10.4" } }, "@babel/plugin-transform-classes": { - "version": "7.9.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.9.5.tgz", - "integrity": "sha512-x2kZoIuLC//O5iA7PEvecB105o7TLzZo8ofBVhP79N+DO3jaX+KYfww9TQcfBEZD0nikNyYcGB1IKtRq36rdmg==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.10.4.tgz", + "integrity": "sha512-2oZ9qLjt161dn1ZE0Ms66xBncQH4In8Sqw1YWgBUZuGVJJS5c0OFZXL6dP2MRHrkU/eKhWg8CzFJhRQl50rQxA==", "requires": { - "@babel/helper-annotate-as-pure": "^7.8.3", - "@babel/helper-define-map": "^7.8.3", - "@babel/helper-function-name": "^7.9.5", - "@babel/helper-optimise-call-expression": "^7.8.3", - "@babel/helper-plugin-utils": "^7.8.3", - "@babel/helper-replace-supers": "^7.8.6", - "@babel/helper-split-export-declaration": "^7.8.3", + "@babel/helper-annotate-as-pure": "^7.10.4", + "@babel/helper-define-map": "^7.10.4", + "@babel/helper-function-name": "^7.10.4", + "@babel/helper-optimise-call-expression": "^7.10.4", + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/helper-replace-supers": "^7.10.4", + "@babel/helper-split-export-declaration": "^7.10.4", "globals": "^11.1.0" } }, "@babel/plugin-transform-computed-properties": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.8.3.tgz", - "integrity": "sha512-O5hiIpSyOGdrQZRQ2ccwtTVkgUDBBiCuK//4RJ6UfePllUTCENOzKxfh6ulckXKc0DixTFLCfb2HVkNA7aDpzA==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.10.4.tgz", + "integrity": "sha512-JFwVDXcP/hM/TbyzGq3l/XWGut7p46Z3QvqFMXTfk6/09m7xZHJUN9xHfsv7vqqD4YnfI5ueYdSJtXqqBLyjBw==", "requires": { - "@babel/helper-plugin-utils": "^7.8.3" + "@babel/helper-plugin-utils": "^7.10.4" } }, "@babel/plugin-transform-destructuring": { - "version": "7.9.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.9.5.tgz", - "integrity": "sha512-j3OEsGel8nHL/iusv/mRd5fYZ3DrOxWC82x0ogmdN/vHfAP4MYw+AFKYanzWlktNwikKvlzUV//afBW5FTp17Q==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.10.4.tgz", + "integrity": "sha512-+WmfvyfsyF603iPa6825mq6Qrb7uLjTOsa3XOFzlYcYDHSS4QmpOWOL0NNBY5qMbvrcf3tq0Cw+v4lxswOBpgA==", "requires": { - "@babel/helper-plugin-utils": "^7.8.3" + "@babel/helper-plugin-utils": "^7.10.4" } }, "@babel/plugin-transform-dotall-regex": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.8.3.tgz", - "integrity": "sha512-kLs1j9Nn4MQoBYdRXH6AeaXMbEJFaFu/v1nQkvib6QzTj8MZI5OQzqmD83/2jEM1z0DLilra5aWO5YpyC0ALIw==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.10.4.tgz", + "integrity": "sha512-ZEAVvUTCMlMFAbASYSVQoxIbHm2OkG2MseW6bV2JjIygOjdVv8tuxrCTzj1+Rynh7ODb8GivUy7dzEXzEhuPaA==", "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.8.3", - "@babel/helper-plugin-utils": "^7.8.3" + "@babel/helper-create-regexp-features-plugin": "^7.10.4", + "@babel/helper-plugin-utils": "^7.10.4" } }, "@babel/plugin-transform-duplicate-keys": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.8.3.tgz", - "integrity": "sha512-s8dHiBUbcbSgipS4SMFuWGqCvyge5V2ZeAWzR6INTVC3Ltjig/Vw1G2Gztv0vU/hRG9X8IvKvYdoksnUfgXOEQ==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.10.4.tgz", + "integrity": "sha512-GL0/fJnmgMclHiBTTWXNlYjYsA7rDrtsazHG6mglaGSTh0KsrW04qml+Bbz9FL0LcJIRwBWL5ZqlNHKTkU3xAA==", "requires": { - "@babel/helper-plugin-utils": "^7.8.3" + "@babel/helper-plugin-utils": "^7.10.4" } }, "@babel/plugin-transform-exponentiation-operator": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.8.3.tgz", - "integrity": "sha512-zwIpuIymb3ACcInbksHaNcR12S++0MDLKkiqXHl3AzpgdKlFNhog+z/K0+TGW+b0w5pgTq4H6IwV/WhxbGYSjQ==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.10.4.tgz", + "integrity": "sha512-S5HgLVgkBcRdyQAHbKj+7KyuWx8C6t5oETmUuwz1pt3WTWJhsUV0WIIXuVvfXMxl/QQyHKlSCNNtaIamG8fysw==", "requires": { - "@babel/helper-builder-binary-assignment-operator-visitor": "^7.8.3", - "@babel/helper-plugin-utils": "^7.8.3" + "@babel/helper-builder-binary-assignment-operator-visitor": "^7.10.4", + "@babel/helper-plugin-utils": "^7.10.4" } }, "@babel/plugin-transform-flow-strip-types": { @@ -650,190 +706,199 @@ } }, "@babel/plugin-transform-for-of": { - "version": "7.9.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.9.0.tgz", - "integrity": "sha512-lTAnWOpMwOXpyDx06N+ywmF3jNbafZEqZ96CGYabxHrxNX8l5ny7dt4bK/rGwAh9utyP2b2Hv7PlZh1AAS54FQ==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.10.4.tgz", + "integrity": "sha512-ItdQfAzu9AlEqmusA/65TqJ79eRcgGmpPPFvBnGILXZH975G0LNjP1yjHvGgfuCxqrPPueXOPe+FsvxmxKiHHQ==", "requires": { - "@babel/helper-plugin-utils": "^7.8.3" + "@babel/helper-plugin-utils": "^7.10.4" } }, "@babel/plugin-transform-function-name": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.8.3.tgz", - "integrity": "sha512-rO/OnDS78Eifbjn5Py9v8y0aR+aSYhDhqAwVfsTl0ERuMZyr05L1aFSCJnbv2mmsLkit/4ReeQ9N2BgLnOcPCQ==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.10.4.tgz", + "integrity": "sha512-OcDCq2y5+E0dVD5MagT5X+yTRbcvFjDI2ZVAottGH6tzqjx/LKpgkUepu3hp/u4tZBzxxpNGwLsAvGBvQ2mJzg==", "requires": { - "@babel/helper-function-name": "^7.8.3", - "@babel/helper-plugin-utils": "^7.8.3" + "@babel/helper-function-name": "^7.10.4", + "@babel/helper-plugin-utils": "^7.10.4" } }, "@babel/plugin-transform-literals": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.8.3.tgz", - "integrity": "sha512-3Tqf8JJ/qB7TeldGl+TT55+uQei9JfYaregDcEAyBZ7akutriFrt6C/wLYIer6OYhleVQvH/ntEhjE/xMmy10A==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.10.4.tgz", + "integrity": "sha512-Xd/dFSTEVuUWnyZiMu76/InZxLTYilOSr1UlHV+p115Z/Le2Fi1KXkJUYz0b42DfndostYlPub3m8ZTQlMaiqQ==", "requires": { - "@babel/helper-plugin-utils": "^7.8.3" + "@babel/helper-plugin-utils": "^7.10.4" } }, "@babel/plugin-transform-member-expression-literals": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.8.3.tgz", - "integrity": "sha512-3Wk2EXhnw+rP+IDkK6BdtPKsUE5IeZ6QOGrPYvw52NwBStw9V1ZVzxgK6fSKSxqUvH9eQPR3tm3cOq79HlsKYA==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.10.4.tgz", + "integrity": "sha512-0bFOvPyAoTBhtcJLr9VcwZqKmSjFml1iVxvPL0ReomGU53CX53HsM4h2SzckNdkQcHox1bpAqzxBI1Y09LlBSw==", "requires": { - "@babel/helper-plugin-utils": "^7.8.3" + "@babel/helper-plugin-utils": "^7.10.4" } }, "@babel/plugin-transform-modules-amd": { - "version": "7.9.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.9.0.tgz", - "integrity": "sha512-vZgDDF003B14O8zJy0XXLnPH4sg+9X5hFBBGN1V+B2rgrB+J2xIypSN6Rk9imB2hSTHQi5OHLrFWsZab1GMk+Q==", + "version": "7.10.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.10.5.tgz", + "integrity": "sha512-elm5uruNio7CTLFItVC/rIzKLfQ17+fX7EVz5W0TMgIHFo1zY0Ozzx+lgwhL4plzl8OzVn6Qasx5DeEFyoNiRw==", "requires": { - "@babel/helper-module-transforms": "^7.9.0", - "@babel/helper-plugin-utils": "^7.8.3", - "babel-plugin-dynamic-import-node": "^2.3.0" + "@babel/helper-module-transforms": "^7.10.5", + "@babel/helper-plugin-utils": "^7.10.4", + "babel-plugin-dynamic-import-node": "^2.3.3" } }, "@babel/plugin-transform-modules-commonjs": { - "version": "7.9.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.9.0.tgz", - "integrity": "sha512-qzlCrLnKqio4SlgJ6FMMLBe4bySNis8DFn1VkGmOcxG9gqEyPIOzeQrA//u0HAKrWpJlpZbZMPB1n/OPa4+n8g==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.10.4.tgz", + "integrity": "sha512-Xj7Uq5o80HDLlW64rVfDBhao6OX89HKUmb+9vWYaLXBZOma4gA6tw4Ni1O5qVDoZWUV0fxMYA0aYzOawz0l+1w==", "requires": { - "@babel/helper-module-transforms": "^7.9.0", - "@babel/helper-plugin-utils": "^7.8.3", - "@babel/helper-simple-access": "^7.8.3", - "babel-plugin-dynamic-import-node": "^2.3.0" + "@babel/helper-module-transforms": "^7.10.4", + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/helper-simple-access": "^7.10.4", + "babel-plugin-dynamic-import-node": "^2.3.3" } }, "@babel/plugin-transform-modules-systemjs": { - "version": "7.9.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.9.0.tgz", - "integrity": "sha512-FsiAv/nao/ud2ZWy4wFacoLOm5uxl0ExSQ7ErvP7jpoihLR6Cq90ilOFyX9UXct3rbtKsAiZ9kFt5XGfPe/5SQ==", + "version": "7.10.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.10.5.tgz", + "integrity": "sha512-f4RLO/OL14/FP1AEbcsWMzpbUz6tssRaeQg11RH1BP/XnPpRoVwgeYViMFacnkaw4k4wjRSjn3ip1Uw9TaXuMw==", "requires": { - "@babel/helper-hoist-variables": "^7.8.3", - "@babel/helper-module-transforms": "^7.9.0", - "@babel/helper-plugin-utils": "^7.8.3", - "babel-plugin-dynamic-import-node": "^2.3.0" + "@babel/helper-hoist-variables": "^7.10.4", + "@babel/helper-module-transforms": "^7.10.5", + "@babel/helper-plugin-utils": "^7.10.4", + "babel-plugin-dynamic-import-node": "^2.3.3" } }, "@babel/plugin-transform-modules-umd": { - "version": "7.9.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.9.0.tgz", - "integrity": "sha512-uTWkXkIVtg/JGRSIABdBoMsoIeoHQHPTL0Y2E7xf5Oj7sLqwVsNXOkNk0VJc7vF0IMBsPeikHxFjGe+qmwPtTQ==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.10.4.tgz", + "integrity": "sha512-mohW5q3uAEt8T45YT7Qc5ws6mWgJAaL/8BfWD9Dodo1A3RKWli8wTS+WiQ/knF+tXlPirW/1/MqzzGfCExKECA==", "requires": { - "@babel/helper-module-transforms": "^7.9.0", - "@babel/helper-plugin-utils": "^7.8.3" + "@babel/helper-module-transforms": "^7.10.4", + "@babel/helper-plugin-utils": "^7.10.4" } }, "@babel/plugin-transform-named-capturing-groups-regex": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.8.3.tgz", - "integrity": "sha512-f+tF/8UVPU86TrCb06JoPWIdDpTNSGGcAtaD9mLP0aYGA0OS0j7j7DHJR0GTFrUZPUU6loZhbsVZgTh0N+Qdnw==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.10.4.tgz", + "integrity": "sha512-V6LuOnD31kTkxQPhKiVYzYC/Jgdq53irJC/xBSmqcNcqFGV+PER4l6rU5SH2Vl7bH9mLDHcc0+l9HUOe4RNGKA==", "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.8.3" + "@babel/helper-create-regexp-features-plugin": "^7.10.4" } }, "@babel/plugin-transform-new-target": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.8.3.tgz", - "integrity": "sha512-QuSGysibQpyxexRyui2vca+Cmbljo8bcRckgzYV4kRIsHpVeyeC3JDO63pY+xFZ6bWOBn7pfKZTqV4o/ix9sFw==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.10.4.tgz", + "integrity": "sha512-YXwWUDAH/J6dlfwqlWsztI2Puz1NtUAubXhOPLQ5gjR/qmQ5U96DY4FQO8At33JN4XPBhrjB8I4eMmLROjjLjw==", "requires": { - "@babel/helper-plugin-utils": "^7.8.3" + "@babel/helper-plugin-utils": "^7.10.4" } }, "@babel/plugin-transform-object-super": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.8.3.tgz", - "integrity": "sha512-57FXk+gItG/GejofIyLIgBKTas4+pEU47IXKDBWFTxdPd7F80H8zybyAY7UoblVfBhBGs2EKM+bJUu2+iUYPDQ==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.10.4.tgz", + "integrity": "sha512-5iTw0JkdRdJvr7sY0vHqTpnruUpTea32JHmq/atIWqsnNussbRzjEDyWep8UNztt1B5IusBYg8Irb0bLbiEBCQ==", "requires": { - "@babel/helper-plugin-utils": "^7.8.3", - "@babel/helper-replace-supers": "^7.8.3" + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/helper-replace-supers": "^7.10.4" } }, "@babel/plugin-transform-parameters": { - "version": "7.9.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.9.5.tgz", - "integrity": "sha512-0+1FhHnMfj6lIIhVvS4KGQJeuhe1GI//h5uptK4PvLt+BGBxsoUJbd3/IW002yk//6sZPlFgsG1hY6OHLcy6kA==", + "version": "7.10.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.10.5.tgz", + "integrity": "sha512-xPHwUj5RdFV8l1wuYiu5S9fqWGM2DrYc24TMvUiRrPVm+SM3XeqU9BcokQX/kEUe+p2RBwy+yoiR1w/Blq6ubw==", "requires": { - "@babel/helper-get-function-arity": "^7.8.3", - "@babel/helper-plugin-utils": "^7.8.3" + "@babel/helper-get-function-arity": "^7.10.4", + "@babel/helper-plugin-utils": "^7.10.4" } }, "@babel/plugin-transform-property-literals": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.8.3.tgz", - "integrity": "sha512-uGiiXAZMqEoQhRWMK17VospMZh5sXWg+dlh2soffpkAl96KAm+WZuJfa6lcELotSRmooLqg0MWdH6UUq85nmmg==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.10.4.tgz", + "integrity": "sha512-ofsAcKiUxQ8TY4sScgsGeR2vJIsfrzqvFb9GvJ5UdXDzl+MyYCaBj/FGzXuv7qE0aJcjWMILny1epqelnFlz8g==", "requires": { - "@babel/helper-plugin-utils": "^7.8.3" + "@babel/helper-plugin-utils": "^7.10.4" } }, "@babel/plugin-transform-react-constant-elements": { - "version": "7.9.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.9.0.tgz", - "integrity": "sha512-wXMXsToAUOxJuBBEHajqKLFWcCkOSLshTI2ChCFFj1zDd7od4IOxiwLCOObNUvOpkxLpjIuaIdBMmNt6ocCPAw==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.10.4.tgz", + "integrity": "sha512-cYmQBW1pXrqBte1raMkAulXmi7rjg3VI6ZLg9QIic8Hq7BtYXaWuZSxsr2siOMI6SWwpxjWfnwhTUrd7JlAV7g==", "requires": { - "@babel/helper-plugin-utils": "^7.8.3" + "@babel/helper-plugin-utils": "^7.10.4" } }, "@babel/plugin-transform-react-display-name": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.8.3.tgz", - "integrity": "sha512-3Jy/PCw8Fe6uBKtEgz3M82ljt+lTg+xJaM4og+eyu83qLT87ZUSckn0wy7r31jflURWLO83TW6Ylf7lyXj3m5A==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.10.4.tgz", + "integrity": "sha512-Zd4X54Mu9SBfPGnEcaGcOrVAYOtjT2on8QZkLKEq1S/tHexG39d9XXGZv19VfRrDjPJzFmPfTAqOQS1pfFOujw==", "requires": { - "@babel/helper-plugin-utils": "^7.8.3" + "@babel/helper-plugin-utils": "^7.10.4" } }, "@babel/plugin-transform-react-jsx": { - "version": "7.9.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.9.4.tgz", - "integrity": "sha512-Mjqf3pZBNLt854CK0C/kRuXAnE6H/bo7xYojP+WGtX8glDGSibcwnsWwhwoSuRg0+EBnxPC1ouVnuetUIlPSAw==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.10.4.tgz", + "integrity": "sha512-L+MfRhWjX0eI7Js093MM6MacKU4M6dnCRa/QPDwYMxjljzSCzzlzKzj9Pk4P3OtrPcxr2N3znR419nr3Xw+65A==", "requires": { - "@babel/helper-builder-react-jsx": "^7.9.0", - "@babel/helper-builder-react-jsx-experimental": "^7.9.0", - "@babel/helper-plugin-utils": "^7.8.3", - "@babel/plugin-syntax-jsx": "^7.8.3" + "@babel/helper-builder-react-jsx": "^7.10.4", + "@babel/helper-builder-react-jsx-experimental": "^7.10.4", + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-syntax-jsx": "^7.10.4" } }, "@babel/plugin-transform-react-jsx-development": { - "version": "7.9.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.9.0.tgz", - "integrity": "sha512-tK8hWKrQncVvrhvtOiPpKrQjfNX3DtkNLSX4ObuGcpS9p0QrGetKmlySIGR07y48Zft8WVgPakqd/bk46JrMSw==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.10.4.tgz", + "integrity": "sha512-RM3ZAd1sU1iQ7rI2dhrZRZGv0aqzNQMbkIUCS1txYpi9wHQ2ZHNjo5TwX+UD6pvFW4AbWqLVYvKy5qJSAyRGjQ==", "requires": { - "@babel/helper-builder-react-jsx-experimental": "^7.9.0", - "@babel/helper-plugin-utils": "^7.8.3", - "@babel/plugin-syntax-jsx": "^7.8.3" + "@babel/helper-builder-react-jsx-experimental": "^7.10.4", + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-syntax-jsx": "^7.10.4" } }, "@babel/plugin-transform-react-jsx-self": { - "version": "7.9.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.9.0.tgz", - "integrity": "sha512-K2ObbWPKT7KUTAoyjCsFilOkEgMvFG+y0FqOl6Lezd0/13kMkkjHskVsZvblRPj1PHA44PrToaZANrryppzTvQ==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.10.4.tgz", + "integrity": "sha512-yOvxY2pDiVJi0axdTWHSMi5T0DILN+H+SaeJeACHKjQLezEzhLx9nEF9xgpBLPtkZsks9cnb5P9iBEi21En3gg==", "requires": { - "@babel/helper-plugin-utils": "^7.8.3", - "@babel/plugin-syntax-jsx": "^7.8.3" + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-syntax-jsx": "^7.10.4" } }, "@babel/plugin-transform-react-jsx-source": { - "version": "7.9.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.9.0.tgz", - "integrity": "sha512-K6m3LlSnTSfRkM6FcRk8saNEeaeyG5k7AVkBU2bZK3+1zdkSED3qNdsWrUgQBeTVD2Tp3VMmerxVO2yM5iITmw==", + "version": "7.10.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.10.5.tgz", + "integrity": "sha512-wTeqHVkN1lfPLubRiZH3o73f4rfon42HpgxUSs86Nc+8QIcm/B9s8NNVXu/gwGcOyd7yDib9ikxoDLxJP0UiDA==", "requires": { - "@babel/helper-plugin-utils": "^7.8.3", - "@babel/plugin-syntax-jsx": "^7.8.3" + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-syntax-jsx": "^7.10.4" + } + }, + "@babel/plugin-transform-react-pure-annotations": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.10.4.tgz", + "integrity": "sha512-+njZkqcOuS8RaPakrnR9KvxjoG1ASJWpoIv/doyWngId88JoFlPlISenGXjrVacZUIALGUr6eodRs1vmPnF23A==", + "requires": { + "@babel/helper-annotate-as-pure": "^7.10.4", + "@babel/helper-plugin-utils": "^7.10.4" } }, "@babel/plugin-transform-regenerator": { - "version": "7.8.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.8.7.tgz", - "integrity": "sha512-TIg+gAl4Z0a3WmD3mbYSk+J9ZUH6n/Yc57rtKRnlA/7rcCvpekHXe0CMZHP1gYp7/KLe9GHTuIba0vXmls6drA==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.10.4.tgz", + "integrity": "sha512-3thAHwtor39A7C04XucbMg17RcZ3Qppfxr22wYzZNcVIkPHfpM9J0SO8zuCV6SZa265kxBJSrfKTvDCYqBFXGw==", "requires": { "regenerator-transform": "^0.14.2" } }, "@babel/plugin-transform-reserved-words": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.8.3.tgz", - "integrity": "sha512-mwMxcycN3omKFDjDQUl+8zyMsBfjRFr0Zn/64I41pmjv4NJuqcYlEtezwYtw9TFd9WR1vN5kiM+O0gMZzO6L0A==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.10.4.tgz", + "integrity": "sha512-hGsw1O6Rew1fkFbDImZIEqA8GoidwTAilwCyWqLBM9f+e/u/sQMQu7uX6dyokfOayRuuVfKOW4O7HvaBWM+JlQ==", "requires": { - "@babel/helper-plugin-utils": "^7.8.3" + "@babel/helper-plugin-utils": "^7.10.4" } }, "@babel/plugin-transform-runtime": { @@ -855,127 +920,144 @@ } }, "@babel/plugin-transform-shorthand-properties": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.8.3.tgz", - "integrity": "sha512-I9DI6Odg0JJwxCHzbzW08ggMdCezoWcuQRz3ptdudgwaHxTjxw5HgdFJmZIkIMlRymL6YiZcped4TTCB0JcC8w==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.10.4.tgz", + "integrity": "sha512-AC2K/t7o07KeTIxMoHneyX90v3zkm5cjHJEokrPEAGEy3UCp8sLKfnfOIGdZ194fyN4wfX/zZUWT9trJZ0qc+Q==", "requires": { - "@babel/helper-plugin-utils": "^7.8.3" + "@babel/helper-plugin-utils": "^7.10.4" } }, "@babel/plugin-transform-spread": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.8.3.tgz", - "integrity": "sha512-CkuTU9mbmAoFOI1tklFWYYbzX5qCIZVXPVy0jpXgGwkplCndQAa58s2jr66fTeQnA64bDox0HL4U56CFYoyC7g==", + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.11.0.tgz", + "integrity": "sha512-UwQYGOqIdQJe4aWNyS7noqAnN2VbaczPLiEtln+zPowRNlD+79w3oi2TWfYe0eZgd+gjZCbsydN7lzWysDt+gw==", "requires": { - "@babel/helper-plugin-utils": "^7.8.3" + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/helper-skip-transparent-expression-wrappers": "^7.11.0" } }, "@babel/plugin-transform-sticky-regex": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.8.3.tgz", - "integrity": "sha512-9Spq0vGCD5Bb4Z/ZXXSK5wbbLFMG085qd2vhL1JYu1WcQ5bXqZBAYRzU1d+p79GcHs2szYv5pVQCX13QgldaWw==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.10.4.tgz", + "integrity": "sha512-Ddy3QZfIbEV0VYcVtFDCjeE4xwVTJWTmUtorAJkn6u/92Z/nWJNV+mILyqHKrUxXYKA2EoCilgoPePymKL4DvQ==", "requires": { - "@babel/helper-plugin-utils": "^7.8.3", - "@babel/helper-regex": "^7.8.3" + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/helper-regex": "^7.10.4" } }, "@babel/plugin-transform-template-literals": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.8.3.tgz", - "integrity": "sha512-820QBtykIQOLFT8NZOcTRJ1UNuztIELe4p9DCgvj4NK+PwluSJ49we7s9FB1HIGNIYT7wFUJ0ar2QpCDj0escQ==", + "version": "7.10.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.10.5.tgz", + "integrity": "sha512-V/lnPGIb+KT12OQikDvgSuesRX14ck5FfJXt6+tXhdkJ+Vsd0lDCVtF6jcB4rNClYFzaB2jusZ+lNISDk2mMMw==", "requires": { - "@babel/helper-annotate-as-pure": "^7.8.3", - "@babel/helper-plugin-utils": "^7.8.3" + "@babel/helper-annotate-as-pure": "^7.10.4", + "@babel/helper-plugin-utils": "^7.10.4" } }, "@babel/plugin-transform-typeof-symbol": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.8.4.tgz", - "integrity": "sha512-2QKyfjGdvuNfHsb7qnBBlKclbD4CfshH2KvDabiijLMGXPHJXGxtDzwIF7bQP+T0ysw8fYTtxPafgfs/c1Lrqg==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.10.4.tgz", + "integrity": "sha512-QqNgYwuuW0y0H+kUE/GWSR45t/ccRhe14Fs/4ZRouNNQsyd4o3PG4OtHiIrepbM2WKUBDAXKCAK/Lk4VhzTaGA==", "requires": { - "@babel/helper-plugin-utils": "^7.8.3" + "@babel/helper-plugin-utils": "^7.10.4" } }, "@babel/plugin-transform-typescript": { - "version": "7.9.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.9.4.tgz", - "integrity": "sha512-yeWeUkKx2auDbSxRe8MusAG+n4m9BFY/v+lPjmQDgOFX5qnySkUY5oXzkp6FwPdsYqnKay6lorXYdC0n3bZO7w==", + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.11.0.tgz", + "integrity": "sha512-edJsNzTtvb3MaXQwj8403B7mZoGu9ElDJQZOKjGUnvilquxBA3IQoEIOvkX/1O8xfAsnHS/oQhe2w/IXrr+w0w==", "requires": { - "@babel/helper-create-class-features-plugin": "^7.8.3", - "@babel/helper-plugin-utils": "^7.8.3", - "@babel/plugin-syntax-typescript": "^7.8.3" + "@babel/helper-create-class-features-plugin": "^7.10.5", + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-syntax-typescript": "^7.10.4" + } + }, + "@babel/plugin-transform-unicode-escapes": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.10.4.tgz", + "integrity": "sha512-y5XJ9waMti2J+e7ij20e+aH+fho7Wb7W8rNuu72aKRwCHFqQdhkdU2lo3uZ9tQuboEJcUFayXdARhcxLQ3+6Fg==", + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" } }, "@babel/plugin-transform-unicode-regex": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.8.3.tgz", - "integrity": "sha512-+ufgJjYdmWfSQ+6NS9VGUR2ns8cjJjYbrbi11mZBTaWm+Fui/ncTLFF28Ei1okavY+xkojGr1eJxNsWYeA5aZw==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.10.4.tgz", + "integrity": "sha512-wNfsc4s8N2qnIwpO/WP2ZiSyjfpTamT2C9V9FDH/Ljub9zw6P3SjkXcFmc0RQUt96k2fmIvtla2MMjgTwIAC+A==", "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.8.3", - "@babel/helper-plugin-utils": "^7.8.3" + "@babel/helper-create-regexp-features-plugin": "^7.10.4", + "@babel/helper-plugin-utils": "^7.10.4" } }, "@babel/preset-env": { - "version": "7.9.5", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.9.5.tgz", - "integrity": "sha512-eWGYeADTlPJH+wq1F0wNfPbVS1w1wtmMJiYk55Td5Yu28AsdR9AsC97sZ0Qq8fHqQuslVSIYSGJMcblr345GfQ==", + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.11.0.tgz", + "integrity": "sha512-2u1/k7rG/gTh02dylX2kL3S0IJNF+J6bfDSp4DI2Ma8QN6Y9x9pmAax59fsCk6QUQG0yqH47yJWA+u1I1LccAg==", "requires": { - "@babel/compat-data": "^7.9.0", - "@babel/helper-compilation-targets": "^7.8.7", - "@babel/helper-module-imports": "^7.8.3", - "@babel/helper-plugin-utils": "^7.8.3", - "@babel/plugin-proposal-async-generator-functions": "^7.8.3", - "@babel/plugin-proposal-dynamic-import": "^7.8.3", - "@babel/plugin-proposal-json-strings": "^7.8.3", - "@babel/plugin-proposal-nullish-coalescing-operator": "^7.8.3", - "@babel/plugin-proposal-numeric-separator": "^7.8.3", - "@babel/plugin-proposal-object-rest-spread": "^7.9.5", - "@babel/plugin-proposal-optional-catch-binding": "^7.8.3", - "@babel/plugin-proposal-optional-chaining": "^7.9.0", - "@babel/plugin-proposal-unicode-property-regex": "^7.8.3", + "@babel/compat-data": "^7.11.0", + "@babel/helper-compilation-targets": "^7.10.4", + "@babel/helper-module-imports": "^7.10.4", + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-proposal-async-generator-functions": "^7.10.4", + "@babel/plugin-proposal-class-properties": "^7.10.4", + "@babel/plugin-proposal-dynamic-import": "^7.10.4", + "@babel/plugin-proposal-export-namespace-from": "^7.10.4", + "@babel/plugin-proposal-json-strings": "^7.10.4", + "@babel/plugin-proposal-logical-assignment-operators": "^7.11.0", + "@babel/plugin-proposal-nullish-coalescing-operator": "^7.10.4", + "@babel/plugin-proposal-numeric-separator": "^7.10.4", + "@babel/plugin-proposal-object-rest-spread": "^7.11.0", + "@babel/plugin-proposal-optional-catch-binding": "^7.10.4", + "@babel/plugin-proposal-optional-chaining": "^7.11.0", + "@babel/plugin-proposal-private-methods": "^7.10.4", + "@babel/plugin-proposal-unicode-property-regex": "^7.10.4", "@babel/plugin-syntax-async-generators": "^7.8.0", + "@babel/plugin-syntax-class-properties": "^7.10.4", "@babel/plugin-syntax-dynamic-import": "^7.8.0", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3", "@babel/plugin-syntax-json-strings": "^7.8.0", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.0", - "@babel/plugin-syntax-numeric-separator": "^7.8.0", + "@babel/plugin-syntax-numeric-separator": "^7.10.4", "@babel/plugin-syntax-object-rest-spread": "^7.8.0", "@babel/plugin-syntax-optional-catch-binding": "^7.8.0", "@babel/plugin-syntax-optional-chaining": "^7.8.0", - "@babel/plugin-syntax-top-level-await": "^7.8.3", - "@babel/plugin-transform-arrow-functions": "^7.8.3", - "@babel/plugin-transform-async-to-generator": "^7.8.3", - "@babel/plugin-transform-block-scoped-functions": "^7.8.3", - "@babel/plugin-transform-block-scoping": "^7.8.3", - "@babel/plugin-transform-classes": "^7.9.5", - "@babel/plugin-transform-computed-properties": "^7.8.3", - "@babel/plugin-transform-destructuring": "^7.9.5", - "@babel/plugin-transform-dotall-regex": "^7.8.3", - "@babel/plugin-transform-duplicate-keys": "^7.8.3", - "@babel/plugin-transform-exponentiation-operator": "^7.8.3", - "@babel/plugin-transform-for-of": "^7.9.0", - "@babel/plugin-transform-function-name": "^7.8.3", - "@babel/plugin-transform-literals": "^7.8.3", - "@babel/plugin-transform-member-expression-literals": "^7.8.3", - "@babel/plugin-transform-modules-amd": "^7.9.0", - "@babel/plugin-transform-modules-commonjs": "^7.9.0", - "@babel/plugin-transform-modules-systemjs": "^7.9.0", - "@babel/plugin-transform-modules-umd": "^7.9.0", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.8.3", - "@babel/plugin-transform-new-target": "^7.8.3", - "@babel/plugin-transform-object-super": "^7.8.3", - "@babel/plugin-transform-parameters": "^7.9.5", - "@babel/plugin-transform-property-literals": "^7.8.3", - "@babel/plugin-transform-regenerator": "^7.8.7", - "@babel/plugin-transform-reserved-words": "^7.8.3", - "@babel/plugin-transform-shorthand-properties": "^7.8.3", - "@babel/plugin-transform-spread": "^7.8.3", - "@babel/plugin-transform-sticky-regex": "^7.8.3", - "@babel/plugin-transform-template-literals": "^7.8.3", - "@babel/plugin-transform-typeof-symbol": "^7.8.4", - "@babel/plugin-transform-unicode-regex": "^7.8.3", + "@babel/plugin-syntax-top-level-await": "^7.10.4", + "@babel/plugin-transform-arrow-functions": "^7.10.4", + "@babel/plugin-transform-async-to-generator": "^7.10.4", + "@babel/plugin-transform-block-scoped-functions": "^7.10.4", + "@babel/plugin-transform-block-scoping": "^7.10.4", + "@babel/plugin-transform-classes": "^7.10.4", + "@babel/plugin-transform-computed-properties": "^7.10.4", + "@babel/plugin-transform-destructuring": "^7.10.4", + "@babel/plugin-transform-dotall-regex": "^7.10.4", + "@babel/plugin-transform-duplicate-keys": "^7.10.4", + "@babel/plugin-transform-exponentiation-operator": "^7.10.4", + "@babel/plugin-transform-for-of": "^7.10.4", + "@babel/plugin-transform-function-name": "^7.10.4", + "@babel/plugin-transform-literals": "^7.10.4", + "@babel/plugin-transform-member-expression-literals": "^7.10.4", + "@babel/plugin-transform-modules-amd": "^7.10.4", + "@babel/plugin-transform-modules-commonjs": "^7.10.4", + "@babel/plugin-transform-modules-systemjs": "^7.10.4", + "@babel/plugin-transform-modules-umd": "^7.10.4", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.10.4", + "@babel/plugin-transform-new-target": "^7.10.4", + "@babel/plugin-transform-object-super": "^7.10.4", + "@babel/plugin-transform-parameters": "^7.10.4", + "@babel/plugin-transform-property-literals": "^7.10.4", + "@babel/plugin-transform-regenerator": "^7.10.4", + "@babel/plugin-transform-reserved-words": "^7.10.4", + "@babel/plugin-transform-shorthand-properties": "^7.10.4", + "@babel/plugin-transform-spread": "^7.11.0", + "@babel/plugin-transform-sticky-regex": "^7.10.4", + "@babel/plugin-transform-template-literals": "^7.10.4", + "@babel/plugin-transform-typeof-symbol": "^7.10.4", + "@babel/plugin-transform-unicode-escapes": "^7.10.4", + "@babel/plugin-transform-unicode-regex": "^7.10.4", "@babel/preset-modules": "^0.1.3", - "@babel/types": "^7.9.5", - "browserslist": "^4.9.1", + "@babel/types": "^7.11.0", + "browserslist": "^4.12.0", "core-js-compat": "^3.6.2", "invariant": "^2.2.2", "levenary": "^1.1.1", @@ -1002,16 +1084,17 @@ } }, "@babel/preset-react": { - "version": "7.9.4", - "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.9.4.tgz", - "integrity": "sha512-AxylVB3FXeOTQXNXyiuAQJSvss62FEotbX2Pzx3K/7c+MKJMdSg6Ose6QYllkdCFA8EInCJVw7M/o5QbLuA4ZQ==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.10.4.tgz", + "integrity": "sha512-BrHp4TgOIy4M19JAfO1LhycVXOPWdDbTRep7eVyatf174Hff+6Uk53sDyajqZPu8W1qXRBiYOfIamek6jA7YVw==", "requires": { - "@babel/helper-plugin-utils": "^7.8.3", - "@babel/plugin-transform-react-display-name": "^7.8.3", - "@babel/plugin-transform-react-jsx": "^7.9.4", - "@babel/plugin-transform-react-jsx-development": "^7.9.0", - "@babel/plugin-transform-react-jsx-self": "^7.9.0", - "@babel/plugin-transform-react-jsx-source": "^7.9.0" + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-transform-react-display-name": "^7.10.4", + "@babel/plugin-transform-react-jsx": "^7.10.4", + "@babel/plugin-transform-react-jsx-development": "^7.10.4", + "@babel/plugin-transform-react-jsx-self": "^7.10.4", + "@babel/plugin-transform-react-jsx-source": "^7.10.4", + "@babel/plugin-transform-react-pure-annotations": "^7.10.4" } }, "@babel/preset-typescript": { @@ -1039,54 +1122,54 @@ } }, "@babel/runtime-corejs3": { - "version": "7.9.2", - "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.9.2.tgz", - "integrity": "sha512-HHxmgxbIzOfFlZ+tdeRKtaxWOMUoCG5Mu3wKeUmOxjYrwb3AAHgnmtCUbPPK11/raIWLIBK250t8E2BPO0p7jA==", + "version": "7.11.2", + "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.11.2.tgz", + "integrity": "sha512-qh5IR+8VgFz83VBa6OkaET6uN/mJOhHONuy3m1sgF0CV6mXdPSEBdA7e1eUbVvyNtANjMbg22JUv71BaDXLY6A==", "requires": { "core-js-pure": "^3.0.0", "regenerator-runtime": "^0.13.4" }, "dependencies": { "regenerator-runtime": { - "version": "0.13.5", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.5.tgz", - "integrity": "sha512-ZS5w8CpKFinUzOwW3c83oPeVXoNsrLsaCoLtJvAClH135j/R77RuymhiSErhm2lKcwSCIpmvIWSbDkIfAqKQlA==" + "version": "0.13.7", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz", + "integrity": "sha512-a54FxoJDIr27pgf7IgeQGxmqUNYrcV338lf/6gH456HZ/PhX+5BcwHXG9ajESmwe6WRO0tAzRUrRmNONWgkrew==" } } }, "@babel/template": { - "version": "7.8.6", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.8.6.tgz", - "integrity": "sha512-zbMsPMy/v0PWFZEhQJ66bqjhH+z0JgMoBWuikXybgG3Gkd/3t5oQ1Rw2WQhnSrsOmsKXnZOx15tkC4qON/+JPg==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.4.tgz", + "integrity": "sha512-ZCjD27cGJFUB6nmCB1Enki3r+L5kJveX9pq1SvAUKoICy6CZ9yD8xO086YXdYhvNjBdnekm4ZnaP5yC8Cs/1tA==", "requires": { - "@babel/code-frame": "^7.8.3", - "@babel/parser": "^7.8.6", - "@babel/types": "^7.8.6" + "@babel/code-frame": "^7.10.4", + "@babel/parser": "^7.10.4", + "@babel/types": "^7.10.4" } }, "@babel/traverse": { - "version": "7.9.5", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.9.5.tgz", - "integrity": "sha512-c4gH3jsvSuGUezlP6rzSJ6jf8fYjLj3hsMZRx/nX0h+fmHN0w+ekubRrHPqnMec0meycA2nwCsJ7dC8IPem2FQ==", + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.11.0.tgz", + "integrity": "sha512-ZB2V+LskoWKNpMq6E5UUCrjtDUh5IOTAyIl0dTjIEoXum/iKWkoIEKIRDnUucO6f+2FzNkE0oD4RLKoPIufDtg==", "requires": { - "@babel/code-frame": "^7.8.3", - "@babel/generator": "^7.9.5", - "@babel/helper-function-name": "^7.9.5", - "@babel/helper-split-export-declaration": "^7.8.3", - "@babel/parser": "^7.9.0", - "@babel/types": "^7.9.5", + "@babel/code-frame": "^7.10.4", + "@babel/generator": "^7.11.0", + "@babel/helper-function-name": "^7.10.4", + "@babel/helper-split-export-declaration": "^7.11.0", + "@babel/parser": "^7.11.0", + "@babel/types": "^7.11.0", "debug": "^4.1.0", "globals": "^11.1.0", - "lodash": "^4.17.13" + "lodash": "^4.17.19" } }, "@babel/types": { - "version": "7.9.5", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.9.5.tgz", - "integrity": "sha512-XjnvNqenk818r5zMaba+sLQjnbda31UfUURv3ei0qPQw4u+j2jMyJ5b11y8ZHYTRSI3NnInQkkkRT4fLqqPdHg==", + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.11.0.tgz", + "integrity": "sha512-O53yME4ZZI0jO1EVGtF1ePGl0LHirG4P1ibcD80XyzZcKhcMFeCXmh4Xb1ifGBIV233Qg12x4rBfQgA+tmOukA==", "requires": { - "@babel/helper-validator-identifier": "^7.9.5", - "lodash": "^4.17.13", + "@babel/helper-validator-identifier": "^7.10.4", + "lodash": "^4.17.19", "to-fast-properties": "^2.0.0" } }, @@ -1509,9 +1592,9 @@ } }, "@types/babel__core": { - "version": "7.1.7", - "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.7.tgz", - "integrity": "sha512-RL62NqSFPCDK2FM1pSDH0scHpJvsXtZNiYlMB73DgPBaG1E38ZYVL+ei5EkWRbr+KC4YNiAUNBnRj+bgwpgjMw==", + "version": "7.1.9", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.9.tgz", + "integrity": "sha512-sY2RsIJ5rpER1u3/aQ8OFSI7qGIy8o1NEEbgb2UaJcvOtXOMpd39ko723NBpjQFg9SIX7TXtjejZVGeIMLhoOw==", "requires": { "@babel/parser": "^7.1.0", "@babel/types": "^7.0.0", @@ -1538,9 +1621,9 @@ } }, "@types/babel__traverse": { - "version": "7.0.10", - "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.0.10.tgz", - "integrity": "sha512-74fNdUGrWsgIB/V9kTO5FGHPWYY6Eqn+3Z7L6Hc4e/BxjYV7puvBqp5HwsVYYfLm6iURYBNCx4Ut37OF9yitCw==", + "version": "7.0.13", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.0.13.tgz", + "integrity": "sha512-i+zS7t6/s9cdQvbqKDARrcbrPvtJGlbYsMkazo03nTAK3RX9FNrLllXys22uiTGJapPOTZTQ35nHh4ISph4SLQ==", "requires": { "@babel/types": "^7.3.0" } @@ -1560,17 +1643,11 @@ "resolved": "https://registry.npmjs.org/@types/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz", "integrity": "sha512-OCutwjDZ4aFS6PB1UZ988C4YgwlBHJd6wCeQqaLdmadZ/7e+w79+hbMUFC1QXDNCmdyoRfAFdm0RypzwR+Qpag==" }, - "@types/events": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@types/events/-/events-3.0.0.tgz", - "integrity": "sha512-EaObqwIvayI5a8dCzhFrjKzVwKLxjoG9T6Ppd5CEo07LRKfQ8Yokw54r5+Wq7FaBQ+yXRvQAYPrHwya1/UFt9g==" - }, "@types/glob": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.1.1.tgz", - "integrity": "sha512-1Bh06cbWJUHMC97acuD6UMG29nMt0Aqz1vF3guLfG+kHHJhy3AyohZFFxYk2f7Q1SQIrNwvncxAE0N/9s70F2w==", + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.1.3.tgz", + "integrity": "sha512-SEYeGAIQIQX8NN6LDKprLjbrd5dARM5EXsd8GI/A5l0apYI1fGMWgPHSe4ZKL4eozlAyI+doUE9XbYS4xCkQ1w==", "requires": { - "@types/events": "*", "@types/minimatch": "*", "@types/node": "*" } @@ -1590,9 +1667,9 @@ "integrity": "sha512-/jUNmS8d4bCKdqslfxW6dg/9Gksfzxz67IYfqApHn+HvHlMVXwYv2zpTDnS/yaK9BB0i0GlBTaYci0EFE62Hmw==" }, "@types/istanbul-lib-coverage": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.1.tgz", - "integrity": "sha512-hRJD2ahnnpLgsj6KWMYSrmXkM3rm2Dl1qkx6IOFD5FnuNPXJIG5L0dhgKXCYTRMGzU4n0wImQ/xfmRc4POUFlg==" + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.3.tgz", + "integrity": "sha512-sz7iLqvVUg1gIedBOvlkxPlc8/uVzyS5OwGz1cKjXzkl3FpL3al0crU8YGU1WoHkxn0Wxbw5tyi6hvzJKNzFsw==" }, "@types/istanbul-lib-report": { "version": "3.0.0", @@ -1603,18 +1680,18 @@ } }, "@types/istanbul-reports": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-1.1.1.tgz", - "integrity": "sha512-UpYjBi8xefVChsCoBpKShdxTllC9pwISirfoZsUa2AAdQg/Jd2KQGtSbw+ya7GPo7x/wAPlH6JBhKhAsXUEZNA==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-1.1.2.tgz", + "integrity": "sha512-P/W9yOX/3oPZSpaYOCQzGqgCQRXn0FFO/V8bWrCQs+wLmvVVxk6CRBXALEvNs9OHIatlnlFokfhuDo2ug01ciw==", "requires": { "@types/istanbul-lib-coverage": "*", "@types/istanbul-lib-report": "*" } }, "@types/json-schema": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.4.tgz", - "integrity": "sha512-8+KAKzEvSUdeo+kmqnKrqgeE+LcA0tjYWFY7RPProVYwnqDjukzO+3b6dLD56rYX5TdWejnEOLJYOIeh4CXKuA==" + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.5.tgz", + "integrity": "sha512-7+2BITlgjgDhH0vvwZU/HZJVyk+2XUlvxXe8dFMedNX/aMkaOq++rMAFXc0tM7ij15QaWlbdQASBR9dihi+bDQ==" }, "@types/minimatch": { "version": "3.0.3", @@ -1622,9 +1699,9 @@ "integrity": "sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA==" }, "@types/node": { - "version": "13.13.4", - "resolved": "https://registry.npmjs.org/@types/node/-/node-13.13.4.tgz", - "integrity": "sha512-x26ur3dSXgv5AwKS0lNfbjpCakGIduWU1DU91Zz58ONRWrIKGunmZBNv4P7N+e27sJkiGDsw/3fT4AtsqQBrBA==" + "version": "14.6.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-14.6.0.tgz", + "integrity": "sha512-mikldZQitV94akrc4sCcSjtJfsTKt4p+e/s0AGscVA6XArQ9kFclP+ZiYUMnq987rc6QlYxXv/EivqlfSLxpKA==" }, "@types/parse-json": { "version": "4.0.0", @@ -1637,9 +1714,9 @@ "integrity": "sha512-KfRL3PuHmqQLOG+2tGpRO26Ctg+Cq1E01D2DMriKEATHgWLfeNDmq9e29Q9WIky0dQ3NPkd1mzYH8Lm936Z9qw==" }, "@types/q": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/@types/q/-/q-1.5.2.tgz", - "integrity": "sha512-ce5d3q03Ex0sy4R14722Rmt6MT07Ua+k4FwDfdcToYJcMKNtRVQvJ6JCAPdAmAnbRb6CsX6aYb9m96NGod9uTw==" + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/@types/q/-/q-1.5.4.tgz", + "integrity": "sha512-1HcDas8SEj4z1Wc696tH56G8OlRaH/sqZOynNNB+HF0WOeXPaxTtbYzJY2oEfiUxjSKjhCKr+MvR7dCHcEelug==" }, "@types/react": { "version": "16.9.17", @@ -1669,9 +1746,9 @@ "integrity": "sha1-DSUBJorY+ZYrdA04fEZU9fjiPlI=" }, "@types/yargs": { - "version": "13.0.8", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-13.0.8.tgz", - "integrity": "sha512-XAvHLwG7UQ+8M4caKIH0ZozIOYay5fQkAgyIXegXT9jPtdIGdhga+sUEdAr1CiG46aB+c64xQEYyEzlwWVTNzA==", + "version": "13.0.10", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-13.0.10.tgz", + "integrity": "sha512-MU10TSgzNABgdzKvQVW1nuuT+sgBMWeXNc3XOs5YXV5SDAK+PPja2eUuBNB9iqElu03xyEDqlnGw0jgl4nbqGQ==", "requires": { "@types/yargs-parser": "*" } @@ -1682,50 +1759,57 @@ "integrity": "sha512-FA/BWv8t8ZWJ+gEOnLLd8ygxH/2UFbAvgEonyfN6yWGLKc7zVjbpl2Y4CTjid9h2RfgPP6SEt6uHwEOply00yw==" }, "@typescript-eslint/eslint-plugin": { - "version": "2.29.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-2.29.0.tgz", - "integrity": "sha512-X/YAY7azKirENm4QRpT7OVmzok02cSkqeIcLmdz6gXUQG4Hk0Fi9oBAynSAyNXeGdMRuZvjBa0c1Lu0dn/u6VA==", + "version": "2.34.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-2.34.0.tgz", + "integrity": "sha512-4zY3Z88rEE99+CNvTbXSyovv2z9PNOVffTWD2W8QF5s2prBQtwN2zadqERcrHpcR7O/+KMI3fcTAmUUhK/iQcQ==", "requires": { - "@typescript-eslint/experimental-utils": "2.29.0", + "@typescript-eslint/experimental-utils": "2.34.0", "functional-red-black-tree": "^1.0.1", "regexpp": "^3.0.0", "tsutils": "^3.17.1" } }, "@typescript-eslint/experimental-utils": { - "version": "2.29.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-2.29.0.tgz", - "integrity": "sha512-H/6VJr6eWYstyqjWXBP2Nn1hQJyvJoFdDtsHxGiD+lEP7piGnGpb/ZQd+z1ZSB1F7dN+WsxUDh8+S4LwI+f3jw==", + "version": "2.34.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-2.34.0.tgz", + "integrity": "sha512-eS6FTkq+wuMJ+sgtuNTtcqavWXqsflWcfBnlYhg/nS4aZ1leewkXGbvBhaapn1q6qf4M71bsR1tez5JTRMuqwA==", "requires": { "@types/json-schema": "^7.0.3", - "@typescript-eslint/typescript-estree": "2.29.0", + "@typescript-eslint/typescript-estree": "2.34.0", "eslint-scope": "^5.0.0", "eslint-utils": "^2.0.0" } }, "@typescript-eslint/parser": { - "version": "2.29.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-2.29.0.tgz", - "integrity": "sha512-H78M+jcu5Tf6m/5N8iiFblUUv+HJDguMSdFfzwa6vSg9lKR8Mk9BsgeSjO8l2EshKnJKcbv0e8IDDOvSNjl0EA==", + "version": "2.34.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-2.34.0.tgz", + "integrity": "sha512-03ilO0ucSD0EPTw2X4PntSIRFtDPWjrVq7C3/Z3VQHRC7+13YB55rcJI3Jt+YgeHbjUdJPcPa7b23rXCBokuyA==", "requires": { "@types/eslint-visitor-keys": "^1.0.0", - "@typescript-eslint/experimental-utils": "2.29.0", - "@typescript-eslint/typescript-estree": "2.29.0", + "@typescript-eslint/experimental-utils": "2.34.0", + "@typescript-eslint/typescript-estree": "2.34.0", "eslint-visitor-keys": "^1.1.0" } }, "@typescript-eslint/typescript-estree": { - "version": "2.29.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-2.29.0.tgz", - "integrity": "sha512-3YGbtnWy4az16Egy5Fj5CckkVlpIh0MADtAQza+jiMADRSKkjdpzZp/5WuvwK/Qib3Z0HtzrDFeWanS99dNhnA==", + "version": "2.34.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-2.34.0.tgz", + "integrity": "sha512-OMAr+nJWKdlVM9LOqCqh3pQQPwxHAN7Du8DR6dmwCrAmxtiXQnhHJ6tBNtf+cggqfo51SG/FCwnKhXCIM7hnVg==", "requires": { "debug": "^4.1.1", "eslint-visitor-keys": "^1.1.0", "glob": "^7.1.6", "is-glob": "^4.0.1", "lodash": "^4.17.15", - "semver": "^6.3.0", + "semver": "^7.3.2", "tsutils": "^3.17.1" + }, + "dependencies": { + "semver": { + "version": "7.3.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz", + "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==" + } } }, "@webassemblyjs/ast": { @@ -1897,9 +1981,9 @@ "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==" }, "abab": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.3.tgz", - "integrity": "sha512-tsFzPpcttalNjFBCFMqsKYQcWxxen1pgJR56by//QwvJc4/OUS3kPOOttx2tSIfjsylB0pYu7f5D3K1RCxUnUg==" + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.4.tgz", + "integrity": "sha512-Eu9ELJWCz/c1e9gTiCY+FceWxcqzjYEbqMgtndnuSqZSUCOL73TWNK2mHfIj4Cw2E/ongOp+JISVNCmovt2KYQ==" }, "abbrev": { "version": "1.1.1", @@ -1916,9 +2000,9 @@ } }, "acorn": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.1.1.tgz", - "integrity": "sha512-add7dgA5ppRPxCFJoAGfMDi7PIBXq1RtGo7BhbLaxwrXPOmw8gq48Y9ozT01hUKy9byMjlR20EJhu5zlkErEkg==" + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.0.tgz", + "integrity": "sha512-+G7P8jJmCHr+S+cLfQxygbWhXy+8YTVGzAkpEbcLo2mLoL7tij/VG41QSHACSf5QgYRhMZYHuNc6drJaO0Da+w==" }, "acorn-globals": { "version": "4.3.4", @@ -1999,9 +2083,9 @@ } }, "aggregate-error": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.0.1.tgz", - "integrity": "sha512-quoaXsZ9/BLNae5yiNoUz+Nhkwz83GhWwtYFglcjEQB2NDHCIpApbqXxIFnm4Pq/Nvhrsq5sYJFyohrrxnTGAA==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", + "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", "requires": { "clean-stack": "^2.0.0", "indent-string": "^4.0.0" @@ -2024,9 +2108,9 @@ "integrity": "sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ==" }, "ajv-keywords": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.4.1.tgz", - "integrity": "sha512-RO1ibKvd27e6FEShVFfPALuHI3WjSVNeK5FIsmme/LYRNxjKuNj+Dt7bucLa6NdSv3JcVTyMlm9kGR84z1XpaQ==" + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==" }, "alphanum-sort": { "version": "1.0.2", @@ -2207,13 +2291,21 @@ } }, "asn1.js": { - "version": "4.10.1", - "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.10.1.tgz", - "integrity": "sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw==", + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-5.4.1.tgz", + "integrity": "sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA==", "requires": { "bn.js": "^4.0.0", "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0" + "minimalistic-assert": "^1.0.0", + "safer-buffer": "^2.1.0" + }, + "dependencies": { + "bn.js": { + "version": "4.11.9", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", + "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==" + } } }, "assert": { @@ -2284,17 +2376,17 @@ "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==" }, "autoprefixer": { - "version": "9.7.6", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-9.7.6.tgz", - "integrity": "sha512-F7cYpbN7uVVhACZTeeIeealwdGM6wMtfWARVLTy5xmKtgVdBNJvbDRoCK3YO1orcs7gv/KwYlb3iXwu9Ug9BkQ==", + "version": "9.8.6", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-9.8.6.tgz", + "integrity": "sha512-XrvP4VVHdRBCdX1S3WXVD8+RyG9qeb1D5Sn1DeLiG2xfSpzellk5k54xbUERJ3M5DggQxes39UGOTP8CFrEGbg==", "requires": { - "browserslist": "^4.11.1", - "caniuse-lite": "^1.0.30001039", - "chalk": "^2.4.2", + "browserslist": "^4.12.0", + "caniuse-lite": "^1.0.30001109", + "colorette": "^1.2.1", "normalize-range": "^0.1.2", "num2fraction": "^1.2.2", - "postcss": "^7.0.27", - "postcss-value-parser": "^4.0.3" + "postcss": "^7.0.32", + "postcss-value-parser": "^4.1.0" } }, "aws-sign2": { @@ -2308,9 +2400,9 @@ "integrity": "sha512-Uvq6hVe90D0B2WEnUqtdgY1bATGz3mw33nH9Y+dmA+w5DHvUmBgkr5rM/KCHpCsiFNRUfokW/szpPPgMK2hm4A==" }, "axobject-query": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-2.1.2.tgz", - "integrity": "sha512-ICt34ZmrVt8UQnvPl6TVyDTkmhXmAyAT4Jh5ugfGUX4MOrZ+U/ZY6/sdylRw3qGNr9Ub5AJsaHeDMzNLehRdOQ==" + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-2.2.0.tgz", + "integrity": "sha512-Td525n+iPOOyUQIeBfcASuG6uJsDOITl7Mds5gFyerkWiX7qhUTdYUBlSgNMyVqtSJqwpt1kXGLdUt6SykLMRA==" }, "babel-code-frame": { "version": "6.26.0", @@ -2435,46 +2527,6 @@ "find-up": "^3.0.0", "istanbul-lib-instrument": "^3.3.0", "test-exclude": "^5.2.3" - }, - "dependencies": { - "find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", - "requires": { - "locate-path": "^3.0.0" - } - }, - "locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", - "requires": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - } - }, - "p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "requires": { - "p-try": "^2.0.0" - } - }, - "p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", - "requires": { - "p-limit": "^2.0.0" - } - }, - "p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==" - } } }, "babel-plugin-jest-hoist": { @@ -2517,13 +2569,13 @@ } }, "parse-json": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.0.0.tgz", - "integrity": "sha512-OOY5b7PAEFV0E2Fir1KOkxchnZNCdowAJgQ5NuxjpBKTRP3pQhwkrkxqQjeoKJ+fO7bCpmIZaogI4eZGDMEGOw==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.1.0.tgz", + "integrity": "sha512-+mi/lmVVNKFNVyLXV31ERiy2CY5E1/F6QtJFEzoChPRwwngMNXRDQ9GJ5WdE2Z2P4AujsOi0/+2qHID68KwfIQ==", "requires": { "@babel/code-frame": "^7.0.0", "error-ex": "^1.3.1", - "json-parse-better-errors": "^1.0.1", + "json-parse-even-better-errors": "^2.3.0", "lines-and-columns": "^1.1.6" } }, @@ -2594,6 +2646,50 @@ "babel-plugin-transform-react-remove-prop-types": "0.4.24" }, "dependencies": { + "@babel/plugin-proposal-class-properties": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.8.3.tgz", + "integrity": "sha512-EqFhbo7IosdgPgZggHaNObkmO1kNUe3slaKu54d5OWvy+p9QIKOzK1GAEpAIsZtWVtPXUHSMcT4smvDrCfY4AA==", + "requires": { + "@babel/helper-create-class-features-plugin": "^7.8.3", + "@babel/helper-plugin-utils": "^7.8.3" + } + }, + "@babel/plugin-proposal-nullish-coalescing-operator": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.8.3.tgz", + "integrity": "sha512-TS9MlfzXpXKt6YYomudb/KU7nQI6/xnapG6in1uZxoxDghuSMZsPb6D2fyUwNYSAp4l1iR7QtFOjkqcRYcUsfw==", + "requires": { + "@babel/helper-plugin-utils": "^7.8.3", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.0" + } + }, + "@babel/plugin-proposal-numeric-separator": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.8.3.tgz", + "integrity": "sha512-jWioO1s6R/R+wEHizfaScNsAx+xKgwTLNXSh7tTC4Usj3ItsPEhYkEpU4h+lpnBwq7NBVOJXfO6cRFYcX69JUQ==", + "requires": { + "@babel/helper-plugin-utils": "^7.8.3", + "@babel/plugin-syntax-numeric-separator": "^7.8.3" + } + }, + "@babel/plugin-proposal-optional-chaining": { + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.9.0.tgz", + "integrity": "sha512-NDn5tu3tcv4W30jNhmc2hyD5c56G6cXx4TesJubhxrJeCvuuMpttxr0OnNCqbZGhFjLrg+NIhxxC+BK5F6yS3w==", + "requires": { + "@babel/helper-plugin-utils": "^7.8.3", + "@babel/plugin-syntax-optional-chaining": "^7.8.0" + } + }, + "@babel/plugin-transform-react-display-name": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.8.3.tgz", + "integrity": "sha512-3Jy/PCw8Fe6uBKtEgz3M82ljt+lTg+xJaM4og+eyu83qLT87ZUSckn0wy7r31jflURWLO83TW6Ylf7lyXj3m5A==", + "requires": { + "@babel/helper-plugin-utils": "^7.8.3" + } + }, "@babel/preset-env": { "version": "7.9.0", "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.9.0.tgz", @@ -2683,9 +2779,9 @@ } }, "regenerator-runtime": { - "version": "0.13.5", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.5.tgz", - "integrity": "sha512-ZS5w8CpKFinUzOwW3c83oPeVXoNsrLsaCoLtJvAClH135j/R77RuymhiSErhm2lKcwSCIpmvIWSbDkIfAqKQlA==" + "version": "0.13.7", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz", + "integrity": "sha512-a54FxoJDIr27pgf7IgeQGxmqUNYrcV338lf/6gH456HZ/PhX+5BcwHXG9ajESmwe6WRO0tAzRUrRmNONWgkrew==" }, "semver": { "version": "5.7.1", @@ -2815,9 +2911,9 @@ "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==" }, "bn.js": { - "version": "4.11.8", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz", - "integrity": "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==" + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.1.3.tgz", + "integrity": "sha512-GkTiFpjFtUzU9CbMeJ5iazkCzGL3jrhzerzZIuqLABjbwRaFt33I9tUdSNryIptM+RxDet6OKm2WnLXzW51KsQ==" }, "body-parser": { "version": "1.19.0", @@ -2880,9 +2976,9 @@ "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24=" }, "bootstrap": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-4.5.0.tgz", - "integrity": "sha512-Z93QoXvodoVslA+PWNdk23Hze4RBYIkpb5h8I2HY2Tu2h7A0LpAgLcyrhrSUyo2/Oxm2l1fRZPs1e5hnxnliXA==" + "version": "4.5.2", + "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-4.5.2.tgz", + "integrity": "sha512-vlGn0bcySYl/iV+BGA544JkkZP5LB3jsmkeKLFQakCOwCM3AOk7VkldBz4jrzSe+Z0Ezn99NVXa1o45cQY4R6A==" }, "brace-expansion": { "version": "1.1.11", @@ -2986,20 +3082,46 @@ "requires": { "bn.js": "^4.1.0", "randombytes": "^2.0.1" + }, + "dependencies": { + "bn.js": { + "version": "4.11.9", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", + "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==" + } } }, "browserify-sign": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.0.4.tgz", - "integrity": "sha1-qk62jl17ZYuqa/alfmMMvXqT0pg=", + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.2.1.tgz", + "integrity": "sha512-/vrA5fguVAKKAVTNJjgSm1tRQDHUU6DbwO9IROu/0WAzC8PKhucDSh18J0RMvVeHAn5puMd+QHC2erPRNf8lmg==", "requires": { - "bn.js": "^4.1.1", - "browserify-rsa": "^4.0.0", - "create-hash": "^1.1.0", - "create-hmac": "^1.1.2", - "elliptic": "^6.0.0", - "inherits": "^2.0.1", - "parse-asn1": "^5.0.0" + "bn.js": "^5.1.1", + "browserify-rsa": "^4.0.1", + "create-hash": "^1.2.0", + "create-hmac": "^1.1.7", + "elliptic": "^6.5.3", + "inherits": "^2.0.4", + "parse-asn1": "^5.1.5", + "readable-stream": "^3.6.0", + "safe-buffer": "^5.2.0" + }, + "dependencies": { + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + }, + "safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" + } } }, "browserify-zlib": { @@ -3011,14 +3133,14 @@ } }, "browserslist": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.12.0.tgz", - "integrity": "sha512-UH2GkcEDSI0k/lRkuDSzFl9ZZ87skSy9w2XAn1MsZnL+4c4rqbBd3e82UWHbYDpztABrPBhZsTEeuxVfHppqDg==", + "version": "4.14.0", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.14.0.tgz", + "integrity": "sha512-pUsXKAF2lVwhmtpeA3LJrZ76jXuusrNyhduuQs7CDFf9foT4Y38aQOserd2lMe5DSSrjf3fx34oHwryuvxAUgQ==", "requires": { - "caniuse-lite": "^1.0.30001043", - "electron-to-chromium": "^1.3.413", - "node-releases": "^1.1.53", - "pkg-up": "^2.0.0" + "caniuse-lite": "^1.0.30001111", + "electron-to-chromium": "^1.3.523", + "escalade": "^3.0.2", + "node-releases": "^1.1.60" } }, "bser": { @@ -3183,9 +3305,9 @@ } }, "caniuse-lite": { - "version": "1.0.30001048", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001048.tgz", - "integrity": "sha512-g1iSHKVxornw0K8LG9LLdf+Fxnv7T1Z+mMsf0/YYLclQX4Cd522Ap0Lrw6NFqHgezit78dtyWxzlV2Xfc7vgRg==" + "version": "1.0.30001117", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001117.tgz", + "integrity": "sha512-4tY0Fatzdx59kYjQs+bNxUwZB03ZEBgVmJ1UkFPz/Q8OLiUUbjct2EdpnXj0fvFTPej2EkbPIG0w8BWsjAyk1Q==" }, "capture-exit": { "version": "2.0.0", @@ -3375,9 +3497,9 @@ } }, "cli-width": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.1.tgz", - "integrity": "sha512-GRMWDxpOB6Dgk2E5Uo+3eEBvtOOlimMmpbFiKuLFnQzYDavtLFY3K5ona41jgN/WdRZtG7utuVSVTL4HbZHGkw==" + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-3.0.0.tgz", + "integrity": "sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==" }, "cliui": { "version": "5.0.0", @@ -3483,6 +3605,11 @@ "simple-swizzle": "^0.2.2" } }, + "colorette": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.2.1.tgz", + "integrity": "sha512-puCDz0CzydiSYOrnXpz/PKd69zRrribezjtE9yd4zvytoRc8+RY/KJPvtPFKZS3E3wP6neGyMe0vOTlHO5L3Pw==" + }, "combined-stream": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", @@ -3699,12 +3826,19 @@ } }, "create-ecdh": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.3.tgz", - "integrity": "sha512-GbEHQPMOswGpKXM9kCWVrremUcBmjteUaQ01T9rkKCPDXfUHX0IoP9LpHYo2NPFampa4e+/pFDc3jQdxrxQLaw==", + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.4.tgz", + "integrity": "sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A==", "requires": { "bn.js": "^4.1.0", - "elliptic": "^6.0.0" + "elliptic": "^6.5.3" + }, + "dependencies": { + "bn.js": { + "version": "4.11.9", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", + "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==" + } } }, "create-hash": { @@ -3888,9 +4022,9 @@ } }, "css-what": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/css-what/-/css-what-3.2.1.tgz", - "integrity": "sha512-WwOrosiQTvyms+Ti5ZC5vGEK0Vod3FTt1ca+payZqvKuGJF+dq7bG63DstxtN0dpm6FxY27a/zS3Wten+gEtGw==" + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-3.3.0.tgz", + "integrity": "sha512-pv9JPyatiPaQ6pf4OvD/dbfm0o5LviWmwxNWzblYf/1u9QZd0ihV+PMwy5jdQWQ3349kZmKEx9WXuSka2dM4cg==" }, "cssdb": { "version": "4.4.0", @@ -4043,9 +4177,9 @@ "integrity": "sha1-vEZ0gAQ3iyGjYMn8fPUjF5B2L7g=" }, "d3-array": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-2.4.0.tgz", - "integrity": "sha512-KQ41bAF2BMakf/HdKT865ALd4cgND6VcIztVQZUTt0+BH3RWy6ZYnHghVXf6NFjt2ritLr8H1T8LreAAlfiNcw==" + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-2.6.0.tgz", + "integrity": "sha512-1TgzIGb6hrHKSCGccdL209Ibk41HCeyv5znFEvJfBsBGhD3qpoHt/2W2ECpyLxpG1k7aNJz0BYrmLpVs9hIGNQ==" }, "d3-axis": { "version": "1.0.12", @@ -4058,9 +4192,9 @@ "integrity": "sha512-TzNPeJy2+iEepfiL92LAAB7fvnp/dV2YwANPVHdDWmYMm23qIJBYww3qT8I8C1wXrmrg4UWs7BKc2tKIgyjzHg==" }, "d3-format": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/d3-format/-/d3-format-1.4.3.tgz", - "integrity": "sha512-mm/nE2Y9HgGyjP+rKIekeITVgBtX97o1nrvHCWX8F/yBYyevUTvu9vb5pUnKwrcSw7o7GuwMOWjS9gFDs4O+uQ==" + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/d3-format/-/d3-format-2.0.0.tgz", + "integrity": "sha512-Ab3S6XuE/Q+flY96HXT0jOXcM4EAClYFnRGY5zsjRGNy6qCYrQsMffs7cV5Q9xejb35zxW5hf/guKw34kvIKsA==" }, "d3-interpolate": { "version": "1.4.0", @@ -4076,15 +4210,15 @@ "integrity": "sha512-VLaYcn81dtHVTjEHd8B+pbe9yHWpXKZUC87PzoFmsFrJqgFwDe/qxfp5MlfsfM1V5E/iVt0MmEbWQ7FVIXh/bg==" }, "d3-scale": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-3.2.1.tgz", - "integrity": "sha512-huz5byJO/6MPpz6Q8d4lg7GgSpTjIZW/l+1MQkzKfu2u8P6hjaXaStOpmyrD6ymKoW87d2QVFCKvSjLwjzx/rA==", + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-3.2.2.tgz", + "integrity": "sha512-3Mvi5HfqPFq0nlyeFlkskGjeqrR/790pINMHc4RXKJ2E6FraTd3juaRIRZZHyMAbi3LjAMW0EH4FB1WgoGyeXg==", "requires": { "d3-array": "1.2.0 - 2", - "d3-format": "1", - "d3-interpolate": "^1.2.0", - "d3-time": "1", - "d3-time-format": "2" + "d3-format": "1 - 2", + "d3-interpolate": "1.2.0 - 2", + "d3-time": "1 - 2", + "d3-time-format": "2 - 3" } }, "d3-scale-chromatic": { @@ -4097,9 +4231,9 @@ } }, "d3-selection": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/d3-selection/-/d3-selection-1.4.1.tgz", - "integrity": "sha512-BTIbRjv/m5rcVTfBs4AMBLKs4x8XaaLkwm28KWu9S2vKNqXkXt2AH2Qf0sdPZHjFxcWg/YL53zcqAz+3g4/7PA==" + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/d3-selection/-/d3-selection-1.4.2.tgz", + "integrity": "sha512-SJ0BqYihzOjDnnlfyeHT0e30k0K1+5sR3d5fNueCNeuhZTnGw4M4o8mqJchSwgKMXCNFo+e2VTChiSJ0vYtXkg==" }, "d3-shape": { "version": "1.3.7", @@ -4115,9 +4249,9 @@ "integrity": "sha512-Xh0isrZ5rPYYdqhAVk8VLnMEidhz5aP7htAADH6MfzgmmicPkTo8LhkLxci61/lCB7n7UmE3bN0leRt+qvkLxA==" }, "d3-time-format": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/d3-time-format/-/d3-time-format-2.2.3.tgz", - "integrity": "sha512-RAHNnD8+XvC4Zc4d2A56Uw0yJoM7bsvOlJR33bclxq399Rak/b9bhvu/InjxdWhPtkgU53JJcleJTGkNRnN6IA==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/d3-time-format/-/d3-time-format-2.3.0.tgz", + "integrity": "sha512-guv6b2H37s2Uq/GefleCDtbe0XZAuy7Wa49VGkPVPMfLL9qObgBST3lEHJBMUp8S7NdLQAGIvr2KXk8Hc98iKQ==", "requires": { "d3-time": "1" } @@ -4382,6 +4516,13 @@ "bn.js": "^4.1.0", "miller-rabin": "^4.0.0", "randombytes": "^2.0.0" + }, + "dependencies": { + "bn.js": { + "version": "4.11.9", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", + "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==" + } } }, "dir-glob": { @@ -4437,26 +4578,31 @@ } }, "dom-helpers": { - "version": "5.1.4", - "resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-5.1.4.tgz", - "integrity": "sha512-TjMyeVUvNEnOnhzs6uAn9Ya47GmMo3qq7m+Lr/3ON0Rs5kHvb8I+SQYjLUSYn7qhEm0QjW0yrBkvz9yOrwwz1A==", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-5.2.0.tgz", + "integrity": "sha512-Ru5o9+V8CpunKnz5LGgWXkmrH/20cGKwcHwS4m73zIvs54CN9epEmT/HLqFJW3kXpakAFkEdzgy1hzlJe3E4OQ==", "requires": { "@babel/runtime": "^7.8.7", - "csstype": "^2.6.7" + "csstype": "^3.0.2" }, "dependencies": { "@babel/runtime": { - "version": "7.10.5", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.10.5.tgz", - "integrity": "sha512-otddXKhdNn7d0ptoFRHtMLa8LqDxLYwTjB4nYgM1yy5N6gU/MUf8zqyyLltCH3yAVitBzmwK4us+DD0l/MauAg==", + "version": "7.11.2", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.11.2.tgz", + "integrity": "sha512-TeWkU52so0mPtDcaCTxNBI/IHiz0pZgr8VEFqXFtZWpYD08ZB6FaSwVAS8MKRQAP3bYKiVjwysOJgMFY28o6Tw==", "requires": { "regenerator-runtime": "^0.13.4" } }, + "csstype": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.0.2.tgz", + "integrity": "sha512-ofovWglpqoqbfLNOTBNZLSbMuGrblAf1efvvArGKOZMBrIoJeu5UsAipQolkijtyQx5MtAzT/J9IHj/CEY1mJw==" + }, "regenerator-runtime": { - "version": "0.13.5", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.5.tgz", - "integrity": "sha512-ZS5w8CpKFinUzOwW3c83oPeVXoNsrLsaCoLtJvAClH135j/R77RuymhiSErhm2lKcwSCIpmvIWSbDkIfAqKQlA==" + "version": "0.13.7", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz", + "integrity": "sha512-a54FxoJDIr27pgf7IgeQGxmqUNYrcV338lf/6gH456HZ/PhX+5BcwHXG9ajESmwe6WRO0tAzRUrRmNONWgkrew==" } } }, @@ -4539,9 +4685,9 @@ "integrity": "sha512-YXQl1DSa4/PQyRfgrv6aoNjhasp/p4qs9FjJ4q4cQk+8m4r6k4ZSiEyytKG8f8W9gi8WsQtIObNmKd+tMzNTmA==" }, "duplexer": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.1.tgz", - "integrity": "sha1-rOb/gIwc5mtX0ev5eXessCM0z8E=" + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz", + "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==" }, "duplexify": { "version": "3.7.1", @@ -4569,14 +4715,14 @@ "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" }, "electron-to-chromium": { - "version": "1.3.418", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.418.tgz", - "integrity": "sha512-i2QrQtHes5fK/F9QGG5XacM5WKEuR322fxTYF9e8O9Gu0mc0WmjjwGpV8c7Htso6Zf2Di18lc3SIPxmMeRFBug==" + "version": "1.3.544", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.544.tgz", + "integrity": "sha512-jx6H7M1db76Q/dI3MadZC4qwNTvpiq8tdYEJswxexrIm5bH+LKRdg+VAteMF1tJJbBLrcuogE9N3nxT3Dp1gag==" }, "elliptic": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.2.tgz", - "integrity": "sha512-f4x70okzZbIQl/NSRLkI/+tteV/9WqL98zx+SQ69KbXxmVrmjwsNUPn/gYJJ0sHvEak24cZgHIPegRePAtA/xw==", + "version": "6.5.3", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.3.tgz", + "integrity": "sha512-IMqzv5wNQf+E6aHeIqATs0tOLeOTwj1QKbRcS3jBbYkl5oLAserA8yJTT7/VyHUYG91PRmPyeQDObKLPpeS4dw==", "requires": { "bn.js": "^4.4.0", "brorand": "^1.0.1", @@ -4585,6 +4731,13 @@ "inherits": "^2.0.1", "minimalistic-assert": "^1.0.0", "minimalistic-crypto-utils": "^1.0.0" + }, + "dependencies": { + "bn.js": { + "version": "4.11.9", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", + "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==" + } } }, "emoji-regex": { @@ -4619,9 +4772,9 @@ } }, "enhanced-resolve": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.1.1.tgz", - "integrity": "sha512-98p2zE+rL7/g/DzMHMTF4zZlCgeVdJ7yr6xzEpJRYwFYrGi9ANdn5DnJURg6RpBkyk60XYDnWIv51VfIhfNGuA==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.3.0.tgz", + "integrity": "sha512-3e87LvavsdxyoCfGusJnrZ5G8SLPOFeHSNpZI/ATL9a5leXo2k0w6MKnbqhdBad9qTobSfB20Ld7UmgoNbAZkQ==", "requires": { "graceful-fs": "^4.1.2", "memory-fs": "^0.5.0", @@ -4640,9 +4793,9 @@ } }, "entities": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-2.0.0.tgz", - "integrity": "sha512-D9f7V0JSRwIxlRI2mjMqufDrRDnx8p+eEOz7aUM9SuvF8gsBzra0/6tbjl1m8eQHrZlYj6PxqE00hZ1SAIKPLw==" + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.0.3.tgz", + "integrity": "sha512-MyoZ0jgnLvB2X3Lg5HqpFmn1kybDiIfEQmKzTb5apr51Rb+T3KdmMiqa70T+bhGnyv7bQ6WMj2QMHpGMmlrUYQ==" }, "errno": { "version": "0.1.7", @@ -4661,21 +4814,21 @@ } }, "es-abstract": { - "version": "1.17.5", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.5.tgz", - "integrity": "sha512-BR9auzDbySxOcfog0tLECW8l28eRGpDpU3Dm3Hp4q/N+VtLTmyj4EUN088XZWQDW/hzj6sYRDXeOFsaAODKvpg==", + "version": "1.17.6", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.6.tgz", + "integrity": "sha512-Fr89bON3WFyUi5EvAeI48QTWX0AyekGgLA8H+c+7fbfCkJwRWRMLd8CQedNEyJuoYYhmtEqY92pgte1FAhBlhw==", "requires": { "es-to-primitive": "^1.2.1", "function-bind": "^1.1.1", "has": "^1.0.3", "has-symbols": "^1.0.1", - "is-callable": "^1.1.5", - "is-regex": "^1.0.5", + "is-callable": "^1.2.0", + "is-regex": "^1.1.0", "object-inspect": "^1.7.0", "object-keys": "^1.1.1", "object.assign": "^4.1.0", - "string.prototype.trimleft": "^2.1.1", - "string.prototype.trimright": "^2.1.1" + "string.prototype.trimend": "^1.0.1", + "string.prototype.trimstart": "^1.0.1" } }, "es-to-primitive": { @@ -4722,6 +4875,11 @@ "ext": "^1.1.2" } }, + "escalade": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.0.2.tgz", + "integrity": "sha512-gPYAU37hYCUhW5euPeR+Y74F7BL+IBsV93j5cvGriSaD1aG6MGsqsV1yamRdrWrb2j3aiZvb0X+UBOWpx3JWtQ==" + }, "escape-html": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", @@ -4733,9 +4891,9 @@ "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" }, "escodegen": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.14.1.tgz", - "integrity": "sha512-Bmt7NcRySdIfNPfU2ZoXDrrXsG9ZjvDxcAlMfDUgRBjLOWTuIACXPBFJH7Z+cLb40JeQco5toikyc9t9P8E9SQ==", + "version": "1.14.3", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.14.3.tgz", + "integrity": "sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw==", "requires": { "esprima": "^4.0.1", "estraverse": "^4.2.0", @@ -4834,9 +4992,9 @@ } }, "eslint-import-resolver-node": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.3.tgz", - "integrity": "sha512-b8crLDo0M5RSe5YG8Pu2DYBj71tSB6OvXkfzwbJU2w7y8P4/yo0MyF8jU26IEuEuHF2K5/gcAJE3LhQGqBBbVg==", + "version": "0.3.4", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.4.tgz", + "integrity": "sha512-ogtf+5AB/O+nM6DIeBUNr2fuT7ot9Qg/1harBfBtaP13ekEWFQEEMP94BCB7zaNW3gyY+8SHYF00rnqYwXKWOA==", "requires": { "debug": "^2.6.9", "resolve": "^1.13.1" @@ -4894,11 +5052,49 @@ "ms": "2.0.0" } }, + "find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "requires": { + "locate-path": "^2.0.0" + } + }, + "locate-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", + "requires": { + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" + } + }, "ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" }, + "p-limit": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", + "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", + "requires": { + "p-try": "^1.0.0" + } + }, + "p-locate": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", + "requires": { + "p-limit": "^1.1.0" + } + }, + "p-try": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", + "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=" + }, "pkg-dir": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-2.0.0.tgz", @@ -4953,6 +5149,14 @@ "isarray": "^1.0.0" } }, + "find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "requires": { + "locate-path": "^2.0.0" + } + }, "load-json-file": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz", @@ -4964,11 +5168,41 @@ "strip-bom": "^3.0.0" } }, + "locate-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", + "requires": { + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" + } + }, "ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" }, + "p-limit": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", + "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", + "requires": { + "p-try": "^1.0.0" + } + }, + "p-locate": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", + "requires": { + "p-limit": "^1.1.0" + } + }, + "p-try": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", + "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=" + }, "parse-json": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", @@ -5077,26 +5311,26 @@ "integrity": "sha512-iXTCFcOmlWvw4+TOE8CLWj6yX1GwzT0Y6cUfHHZqWnSk144VmVIRcVGtUAzrLES7C798lmvnt02C7rxaOX1HNA==" }, "eslint-scope": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.0.0.tgz", - "integrity": "sha512-oYrhJW7S0bxAFDvWqzvMPRm6pcgcnWc4QnofCAqRTRfQC0JcwenzGglTtsLyIuuWFfkqDG9vz67cnttSd53djw==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.0.tgz", + "integrity": "sha512-iiGRvtxWqgtx5m8EyQUJihBloE4EnYeGE/bz1wSPwJE6tZuJUtHlhqDM4Xj2ukE8Dyy1+HCZ4hE0fzIVMzb58w==", "requires": { "esrecurse": "^4.1.0", "estraverse": "^4.1.1" } }, "eslint-utils": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.0.0.tgz", - "integrity": "sha512-0HCPuJv+7Wv1bACm8y5/ECVfYdfsAm9xmVb7saeFlxjPYALefjhbYoCkBjPdPzGH8wWyTpAez82Fh3VKYEZ8OA==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", + "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", "requires": { "eslint-visitor-keys": "^1.1.0" } }, "eslint-visitor-keys": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.1.0.tgz", - "integrity": "sha512-8y9YjtM1JBJU/A9Kc+SbaOV4y29sSWckBwMHa+FGtVj5gN/sbnKDf6xJUl+8g7FAij9LVaP8C24DUiH/f/2Z9A==" + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==" }, "espree": { "version": "6.2.1", @@ -5122,9 +5356,9 @@ }, "dependencies": { "estraverse": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.1.0.tgz", - "integrity": "sha512-FyohXK+R0vE+y1nHLoBM7ZTyqRpqAlhdZHCWIWEviFLiGB8b04H6bQs8G+XTthacvT8VuwvteiP7RJSxMs8UEw==" + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", + "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==" } } }, @@ -5152,14 +5386,14 @@ "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=" }, "eventemitter3": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.4.tgz", - "integrity": "sha512-rlaVLnVxtxvoyLsQQFBx53YmXHDxRIzzTLbdfxqi4yocpSjAxXwkU0cScM5JgSKMqEhrZpnvQ2D9gjylR0AimQ==" + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.5.tgz", + "integrity": "sha512-QR0rh0YiPuxuDQ6+T9GAO/xWTExXpxIes1Nl9RykNGTnE1HJmkuEfxJH9cubjIOQZ/GH4qNBR4u8VSHaKiWs4g==" }, "events": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/events/-/events-3.1.0.tgz", - "integrity": "sha512-Rv+u8MLHNOdMjTAFeT3nCjHn2aGlx435FP/sDHNaRhDEMwyI/aB22Kj2qIN8R0cw3z28psEQLYwxVKLsKrMgWg==" + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.2.0.tgz", + "integrity": "sha512-/46HWwbfCX2xTawVfkKLGxMifJYQBWMwY1mjywRtb4c9x8l5NP3KoJtnIOiL1hfdRkIuYhETxQlo62IF8tcnlg==" }, "eventsource": { "version": "1.0.7", @@ -5336,9 +5570,9 @@ }, "dependencies": { "type": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/type/-/type-2.0.0.tgz", - "integrity": "sha512-KBt58xCHry4Cejnc2ISQAF7QY+ORngsWfxezO68+12hKV6lQY8P/psIkcbjeHWn7MqcgciWJyCCevFMJdIXpow==" + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/type/-/type-2.1.0.tgz", + "integrity": "sha512-G9absDWvhAWCV2gmF1zKud3OyC61nZDwWvBL2DApaVFogI07CprggiQAOOjvp2NRjYWFzPyu7vwtDrQFq8jeSA==" } } }, @@ -5650,11 +5884,11 @@ } }, "find-up": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", "requires": { - "locate-path": "^2.0.0" + "locate-path": "^3.0.0" } }, "flat-cache": { @@ -5696,9 +5930,9 @@ } }, "follow-redirects": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.12.1.tgz", - "integrity": "sha512-tmRv0AVuR7ZyouUHLeNSiO6pqulF7dYa3s19c6t+wz9LD69/uSzdMxJ2S91nTI9U3rt/IldxpzMOFejp6f0hjg==" + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.13.0.tgz", + "integrity": "sha512-aq6gF1BEKje4a9i9+5jimNFIpq4Q1WiwBToeRK5NvZBd/TRsmW8BsJfOEGkr76TbOyPVD3OVDN910EcUNtRYEA==" }, "for-in": { "version": "1.0.2", @@ -6181,12 +6415,30 @@ } }, "hash-base": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.0.4.tgz", - "integrity": "sha1-X8hoaEfs1zSZQDMZprCj8/auSRg=", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.1.0.tgz", + "integrity": "sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==", "requires": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" + "inherits": "^2.0.4", + "readable-stream": "^3.6.0", + "safe-buffer": "^5.2.0" + }, + "dependencies": { + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + }, + "safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" + } } }, "hash.js": { @@ -6289,9 +6541,9 @@ "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==" }, "html-minifier-terser": { - "version": "5.0.5", - "resolved": "https://registry.npmjs.org/html-minifier-terser/-/html-minifier-terser-5.0.5.tgz", - "integrity": "sha512-cBSFFghQh/uHcfSiL42KxxIRMF7A144+3E44xdlctIjxEmkEfCvouxNyFH2wysXk1fCGBPwtcr3hDWlGTfkDew==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/html-minifier-terser/-/html-minifier-terser-5.1.1.tgz", + "integrity": "sha512-ZPr5MNObqnV/T9akshPKbVgyOqLmy+Bxo7juKCfTfnjNniTAMdy4hz21YQqoofMBJD2kdREaqPPdThoR78Tgxg==", "requires": { "camel-case": "^4.1.1", "clean-css": "^4.2.3", @@ -6387,11 +6639,6 @@ } } }, - "http-parser-js": { - "version": "0.4.10", - "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.4.10.tgz", - "integrity": "sha1-ksnBN0w1CF912zWexWzCV8u5P6Q=" - }, "http-proxy": { "version": "1.18.1", "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", @@ -6556,20 +6803,20 @@ "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==" }, "inquirer": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-7.1.0.tgz", - "integrity": "sha512-5fJMWEmikSYu0nv/flMc475MhGbB7TSPd/2IpFV4I4rMklboCH2rQjYY5kKiYGHqUF9gvaambupcJFFG9dvReg==", + "version": "7.3.3", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-7.3.3.tgz", + "integrity": "sha512-JG3eIAj5V9CwcGvuOmoo6LB9kbAYT8HXffUl6memuszlwDC/qvFAJw49XJ5NROSFNPxp3iQg1GqkFhaY/CR0IA==", "requires": { "ansi-escapes": "^4.2.1", - "chalk": "^3.0.0", + "chalk": "^4.1.0", "cli-cursor": "^3.1.0", - "cli-width": "^2.0.0", + "cli-width": "^3.0.0", "external-editor": "^3.0.3", "figures": "^3.0.0", - "lodash": "^4.17.15", + "lodash": "^4.17.19", "mute-stream": "0.0.8", "run-async": "^2.4.0", - "rxjs": "^6.5.3", + "rxjs": "^6.6.0", "string-width": "^4.1.0", "strip-ansi": "^6.0.0", "through": "^2.3.6" @@ -6585,9 +6832,9 @@ } }, "chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", "requires": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -6656,11 +6903,6 @@ "loose-envify": "^1.0.0" } }, - "invert-kv": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-2.0.0.tgz", - "integrity": "sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA==" - }, "ip": { "version": "1.1.5", "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz", @@ -6713,9 +6955,9 @@ "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" }, "is-callable": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.5.tgz", - "integrity": "sha512-ESKv5sMCJB2jnHTWZ3O5itG+O128Hsus4K4Qh1h2/cgn2vbgnLSVqfV46AeJA9D5EeeLa9w81KUXMtn34zhX+Q==" + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.0.tgz", + "integrity": "sha512-pyVD9AaGLxtg6srb2Ng6ynWJqkHU9bEM087AKck0w8QwDarTfNcpIYoU8x8Hv2Icm8u6kFJM18Dag8lyqGkviw==" }, "is-ci": { "version": "2.0.0", @@ -6774,9 +7016,9 @@ "integrity": "sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE=" }, "is-docker": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.0.0.tgz", - "integrity": "sha512-pJEdRugimx4fBMra5z2/5iRdZ63OhYV0vr0Dwm5+xtW4D1FvRkB8hamMIhnWfyJeDdyr/aa7BDyNbtG38VxgoQ==" + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.1.1.tgz", + "integrity": "sha512-ZOoqiXfEwtGknTiuDEy8pN2CfE3TxMHprvNer1mXiqwkOT77Rw3YVrUQ52EqAOU3QAWDQ+bQdx7HJzrv7LS2Hw==" }, "is-extendable": { "version": "0.1.1", @@ -6811,6 +7053,11 @@ "is-extglob": "^2.1.1" } }, + "is-negative-zero": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.0.tgz", + "integrity": "sha1-lVOxIbD6wohp2p7UWeIMdUN4hGE=" + }, "is-number": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", @@ -6859,11 +7106,11 @@ } }, "is-regex": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.5.tgz", - "integrity": "sha512-vlKW17SNq44owv5AQR3Cq0bQPEb8+kF3UKZ2fiZNOWtztYE5i0CzCZxFDwO58qAOWtxdBRVO/V5Qin1wjCqFYQ==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.1.tgz", + "integrity": "sha512-1+QkEcxiLlB7VEyFtyBg94e08OAsvq7FUBgApTq/w2ymCLyKJgDPsybBENVtA7XCQEgEXxKPonG+mvYRxh/LIg==", "requires": { - "has": "^1.0.3" + "has-symbols": "^1.0.1" } }, "is-regexp": { @@ -7237,486 +7484,12 @@ }, "dependencies": { "fsevents": { - "version": "1.2.12", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.12.tgz", - "integrity": "sha512-Ggd/Ktt7E7I8pxZRbGIs7vwqAPscSESMrCSkx2FtWeqmheJgCo2R74fTsZFCifr0VTPwqRpPv17+6b8Zp7th0Q==", + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.13.tgz", + "integrity": "sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==", "optional": true, "requires": { - "nan": "^2.12.1", - "node-pre-gyp": "*" - }, - "dependencies": { - "abbrev": { - "version": "1.1.1", - "bundled": true, - "optional": true - }, - "ansi-regex": { - "version": "2.1.1", - "bundled": true, - "optional": true - }, - "aproba": { - "version": "1.2.0", - "bundled": true, - "optional": true - }, - "are-we-there-yet": { - "version": "1.1.5", - "bundled": true, - "optional": true, - "requires": { - "delegates": "^1.0.0", - "readable-stream": "^2.0.6" - } - }, - "balanced-match": { - "version": "1.0.0", - "bundled": true, - "optional": true - }, - "brace-expansion": { - "version": "1.1.11", - "bundled": true, - "optional": true, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "chownr": { - "version": "1.1.4", - "bundled": true, - "optional": true - }, - "code-point-at": { - "version": "1.1.0", - "bundled": true, - "optional": true - }, - "concat-map": { - "version": "0.0.1", - "bundled": true, - "optional": true - }, - "console-control-strings": { - "version": "1.1.0", - "bundled": true, - "optional": true - }, - "core-util-is": { - "version": "1.0.2", - "bundled": true, - "optional": true - }, - "debug": { - "version": "3.2.6", - "bundled": true, - "optional": true, - "requires": { - "ms": "^2.1.1" - } - }, - "deep-extend": { - "version": "0.6.0", - "bundled": true, - "optional": true - }, - "delegates": { - "version": "1.0.0", - "bundled": true, - "optional": true - }, - "detect-libc": { - "version": "1.0.3", - "bundled": true, - "optional": true - }, - "fs-minipass": { - "version": "1.2.7", - "bundled": true, - "optional": true, - "requires": { - "minipass": "^2.6.0" - } - }, - "fs.realpath": { - "version": "1.0.0", - "bundled": true, - "optional": true - }, - "gauge": { - "version": "2.7.4", - "bundled": true, - "optional": true, - "requires": { - "aproba": "^1.0.3", - "console-control-strings": "^1.0.0", - "has-unicode": "^2.0.0", - "object-assign": "^4.1.0", - "signal-exit": "^3.0.0", - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1", - "wide-align": "^1.1.0" - } - }, - "glob": { - "version": "7.1.6", - "bundled": true, - "optional": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "has-unicode": { - "version": "2.0.1", - "bundled": true, - "optional": true - }, - "iconv-lite": { - "version": "0.4.24", - "bundled": true, - "optional": true, - "requires": { - "safer-buffer": ">= 2.1.2 < 3" - } - }, - "ignore-walk": { - "version": "3.0.3", - "bundled": true, - "optional": true, - "requires": { - "minimatch": "^3.0.4" - } - }, - "inflight": { - "version": "1.0.6", - "bundled": true, - "optional": true, - "requires": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "inherits": { - "version": "2.0.4", - "bundled": true, - "optional": true - }, - "ini": { - "version": "1.3.5", - "bundled": true, - "optional": true - }, - "is-fullwidth-code-point": { - "version": "1.0.0", - "bundled": true, - "optional": true, - "requires": { - "number-is-nan": "^1.0.0" - } - }, - "isarray": { - "version": "1.0.0", - "bundled": true, - "optional": true - }, - "minimatch": { - "version": "3.0.4", - "bundled": true, - "optional": true, - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "minimist": { - "version": "1.2.5", - "bundled": true, - "optional": true - }, - "minipass": { - "version": "2.9.0", - "bundled": true, - "optional": true, - "requires": { - "safe-buffer": "^5.1.2", - "yallist": "^3.0.0" - } - }, - "minizlib": { - "version": "1.3.3", - "bundled": true, - "optional": true, - "requires": { - "minipass": "^2.9.0" - } - }, - "mkdirp": { - "version": "0.5.3", - "bundled": true, - "optional": true, - "requires": { - "minimist": "^1.2.5" - } - }, - "ms": { - "version": "2.1.2", - "bundled": true, - "optional": true - }, - "needle": { - "version": "2.3.3", - "bundled": true, - "optional": true, - "requires": { - "debug": "^3.2.6", - "iconv-lite": "^0.4.4", - "sax": "^1.2.4" - } - }, - "node-pre-gyp": { - "version": "0.14.0", - "bundled": true, - "optional": true, - "requires": { - "detect-libc": "^1.0.2", - "mkdirp": "^0.5.1", - "needle": "^2.2.1", - "nopt": "^4.0.1", - "npm-packlist": "^1.1.6", - "npmlog": "^4.0.2", - "rc": "^1.2.7", - "rimraf": "^2.6.1", - "semver": "^5.3.0", - "tar": "^4.4.2" - } - }, - "nopt": { - "version": "4.0.3", - "bundled": true, - "optional": true, - "requires": { - "abbrev": "1", - "osenv": "^0.1.4" - } - }, - "npm-bundled": { - "version": "1.1.1", - "bundled": true, - "optional": true, - "requires": { - "npm-normalize-package-bin": "^1.0.1" - } - }, - "npm-normalize-package-bin": { - "version": "1.0.1", - "bundled": true, - "optional": true - }, - "npm-packlist": { - "version": "1.4.8", - "bundled": true, - "optional": true, - "requires": { - "ignore-walk": "^3.0.1", - "npm-bundled": "^1.0.1", - "npm-normalize-package-bin": "^1.0.1" - } - }, - "npmlog": { - "version": "4.1.2", - "bundled": true, - "optional": true, - "requires": { - "are-we-there-yet": "~1.1.2", - "console-control-strings": "~1.1.0", - "gauge": "~2.7.3", - "set-blocking": "~2.0.0" - } - }, - "number-is-nan": { - "version": "1.0.1", - "bundled": true, - "optional": true - }, - "object-assign": { - "version": "4.1.1", - "bundled": true, - "optional": true - }, - "once": { - "version": "1.4.0", - "bundled": true, - "optional": true, - "requires": { - "wrappy": "1" - } - }, - "os-homedir": { - "version": "1.0.2", - "bundled": true, - "optional": true - }, - "os-tmpdir": { - "version": "1.0.2", - "bundled": true, - "optional": true - }, - "osenv": { - "version": "0.1.5", - "bundled": true, - "optional": true, - "requires": { - "os-homedir": "^1.0.0", - "os-tmpdir": "^1.0.0" - } - }, - "path-is-absolute": { - "version": "1.0.1", - "bundled": true, - "optional": true - }, - "process-nextick-args": { - "version": "2.0.1", - "bundled": true, - "optional": true - }, - "rc": { - "version": "1.2.8", - "bundled": true, - "optional": true, - "requires": { - "deep-extend": "^0.6.0", - "ini": "~1.3.0", - "minimist": "^1.2.0", - "strip-json-comments": "~2.0.1" - } - }, - "readable-stream": { - "version": "2.3.7", - "bundled": true, - "optional": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "rimraf": { - "version": "2.7.1", - "bundled": true, - "optional": true, - "requires": { - "glob": "^7.1.3" - } - }, - "safe-buffer": { - "version": "5.1.2", - "bundled": true, - "optional": true - }, - "safer-buffer": { - "version": "2.1.2", - "bundled": true, - "optional": true - }, - "sax": { - "version": "1.2.4", - "bundled": true, - "optional": true - }, - "semver": { - "version": "5.7.1", - "bundled": true, - "optional": true - }, - "set-blocking": { - "version": "2.0.0", - "bundled": true, - "optional": true - }, - "signal-exit": { - "version": "3.0.2", - "bundled": true, - "optional": true - }, - "string-width": { - "version": "1.0.2", - "bundled": true, - "optional": true, - "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" - } - }, - "string_decoder": { - "version": "1.1.1", - "bundled": true, - "optional": true, - "requires": { - "safe-buffer": "~5.1.0" - } - }, - "strip-ansi": { - "version": "3.0.1", - "bundled": true, - "optional": true, - "requires": { - "ansi-regex": "^2.0.0" - } - }, - "strip-json-comments": { - "version": "2.0.1", - "bundled": true, - "optional": true - }, - "tar": { - "version": "4.4.13", - "bundled": true, - "optional": true, - "requires": { - "chownr": "^1.1.1", - "fs-minipass": "^1.2.5", - "minipass": "^2.8.6", - "minizlib": "^1.2.1", - "mkdirp": "^0.5.0", - "safe-buffer": "^5.1.2", - "yallist": "^3.0.3" - } - }, - "util-deprecate": { - "version": "1.0.2", - "bundled": true, - "optional": true - }, - "wide-align": { - "version": "1.1.3", - "bundled": true, - "optional": true, - "requires": { - "string-width": "^1.0.2 || 2" - } - }, - "wrappy": { - "version": "1.0.2", - "bundled": true, - "optional": true - }, - "yallist": { - "version": "3.1.1", - "bundled": true, - "optional": true - } + "nan": "^2.12.1" } } } @@ -7788,9 +7561,9 @@ } }, "jest-pnp-resolver": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.1.tgz", - "integrity": "sha512-pgFw2tm54fzgYvc/OHrnysABEObZCUNFnhjoRjaVOCN8NYc032/gVjPaHD4Aq6ApkSieWtfKAFQtmDKAmhupnQ==" + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.2.tgz", + "integrity": "sha512-olV41bKSMm8BdnuMsewT4jqlZ8+3TCARAXjZGT9jcoSnrfUnRCqnMoF9XEeoWjbzObpqF9dRhHQj0Xb9QdF6/w==" }, "jest-regex-util": { "version": "24.9.0", @@ -8025,9 +7798,9 @@ "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" }, "js-yaml": { - "version": "3.13.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", - "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", + "version": "3.14.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.0.tgz", + "integrity": "sha512-/4IbIeHcD9VMHFqDR/gQ7EdZdLimOvW2DdcxFjdyyZ9NsbS+ccrXqVWDtab/lRl5AlUqmpBx8EhPaWR+OtY17A==", "requires": { "argparse": "^1.0.7", "esprima": "^4.0.0" @@ -8088,6 +7861,11 @@ "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==" }, + "json-parse-even-better-errors": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.0.tgz", + "integrity": "sha512-o3aP+RsWDJZayj1SbHNQAI8x0v3T3SKiGoZlNYfbUP1S3omJQ6i9CnqADqkSPaOAxwua4/1YWx5CM7oiChJt2Q==" + }, "json-schema": { "version": "0.2.3", "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", @@ -8154,11 +7932,11 @@ } }, "jsx-ast-utils": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-2.2.3.tgz", - "integrity": "sha512-EdIHFMm+1BPynpKOpdPqiOsvnIrInRGJD7bzPZdPkjitQEqpdpUuFpq4T0npZFKTiB3RhWFdGN+oqOJIdhDhQA==", + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-2.4.1.tgz", + "integrity": "sha512-z1xSldJ6imESSzOjd3NNkieVJKRlKYSOtMG8SFyCj2FIrvSaSuli/WjpBkEzCBoR9bYYYFgqJw61Xhu7Lcgk+w==", "requires": { - "array-includes": "^3.0.3", + "array-includes": "^3.1.1", "object.assign": "^4.1.0" } }, @@ -8205,14 +7983,6 @@ "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz", "integrity": "sha1-odePw6UEdMuAhF07O24dpJpEbo4=" }, - "lcid": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/lcid/-/lcid-2.0.0.tgz", - "integrity": "sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA==", - "requires": { - "invert-kv": "^2.0.0" - } - }, "left-pad": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/left-pad/-/left-pad-1.3.0.tgz", @@ -8340,18 +8110,18 @@ } }, "locate-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", - "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", "requires": { - "p-locate": "^2.0.0", + "p-locate": "^3.0.0", "path-exists": "^3.0.0" } }, "lodash": { - "version": "4.17.19", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.19.tgz", - "integrity": "sha512-JNvd8XER9GQX0v2qJgsaN/mzFCNA5BRe/j8JN9d+tWyGLSodKQHKFicdwNYzWwI3wjRnaKPsGj1XkBjx/F96DQ==" + "version": "4.17.20", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz", + "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==" }, "lodash-es": { "version": "4.17.15", @@ -8484,14 +8254,6 @@ "resolved": "https://registry.npmjs.org/mamacro/-/mamacro-0.0.3.tgz", "integrity": "sha512-qMEwh+UujcQ+kbz3T6V+wAmO2U8veoq2w+3wY8MquqwVA3jChfwY+Tk52GZKDfACEPjuZ7r2oJLejwpt8jtwTA==" }, - "map-age-cleaner": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz", - "integrity": "sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w==", - "requires": { - "p-defer": "^1.0.0" - } - }, "map-cache": { "version": "0.2.2", "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", @@ -8530,16 +8292,6 @@ "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=" }, - "mem": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/mem/-/mem-4.3.0.tgz", - "integrity": "sha512-qX2bG48pTqYRVmDB37rn/6PT7LcR8T7oAX3bf99u1Tt1nzxYfxkgqDwUwolPlXweM0XzBOBFzSx4kfp7KP1s/w==", - "requires": { - "map-age-cleaner": "^0.1.1", - "mimic-fn": "^2.0.0", - "p-is-promise": "^2.0.0" - } - }, "memory-fs": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz", @@ -8668,9 +8420,9 @@ "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==" }, "merge2": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.3.0.tgz", - "integrity": "sha512-2j4DAdlBOkiSZIsaXk4mTE3sRS02yBHAtfy127xRV3bQUFqXkjHCHLW6Scv7DwNRbIWNHH8zpnz9zMaKXIdvYw==" + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==" }, "methods": { "version": "1.1.2", @@ -8716,12 +8468,19 @@ "requires": { "bn.js": "^4.0.0", "brorand": "^1.0.1" + }, + "dependencies": { + "bn.js": { + "version": "4.11.9", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", + "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==" + } } }, "mime": { - "version": "2.4.4", - "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.4.tgz", - "integrity": "sha512-LRxmNwziLPT828z+4YkNzloCFC2YM4wrB99k+AV5ZbEyfGNWfG8SO1FUXLmLDBSo89NrJZ4DIWeLjy1CHGhMGA==" + "version": "2.4.6", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.6.tgz", + "integrity": "sha512-RZKhC3EmpBchfTGBVb8fb+RL2cWyw/32lshnsETttkBAyAUXSGHxbEJWWRXc751DrIxG1q04b8QwMbAwkRPpUA==" }, "mime-db": { "version": "1.43.0", @@ -8797,9 +8556,9 @@ "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" }, "minipass": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.1.tgz", - "integrity": "sha512-UFqVihv6PQgwj8/yTGvl9kPz7xIAY+R5z6XYjRInD3Gk3qx6QGSD6zEcpeG4Dy/lQnv1J6zv8ejV90hyYIKf3w==", + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.3.tgz", + "integrity": "sha512-Mgd2GdMVzY+x3IJ+oHnVM+KG3lA5c8tnabyJKmHSaG2kAGpudxuOf8ToDkhumF7UzME7DecbQE9uOZhNm7PuJg==", "requires": { "yallist": "^4.0.0" } @@ -8821,9 +8580,9 @@ } }, "minipass-pipeline": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.2.tgz", - "integrity": "sha512-3JS5A2DKhD2g0Gg8x3yamO0pj7YeKGwVlDS90pF++kxptwx/F+B//roxf9SqYil5tQo65bijy+dAuAFZmYOouA==", + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz", + "integrity": "sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==", "requires": { "minipass": "^3.0.0" } @@ -9123,9 +8882,9 @@ } }, "node-releases": { - "version": "1.1.53", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.53.tgz", - "integrity": "sha512-wp8zyQVwef2hpZ/dJH7SfSrIPD6YoJz6BDQDpGEkcA0s3LpAQoxBIYmfIq6QAhC1DhwsyCgTaTTcONwX8qzCuQ==" + "version": "1.1.60", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.60.tgz", + "integrity": "sha512-gsO4vjEdQaTusZAEebUWp2a5d7dF5DYoIpDG7WySnk7BuZDW+GPpHXoXXuYawRBr/9t5q54tirPz79kFIWg4dA==" }, "node-sass": { "version": "4.14.1", @@ -9339,9 +9098,9 @@ "integrity": "sha512-JPKn0GMu+Fa3zt3Bmr66JhokJU5BaNBIh4ZeTlaCBzrBsOeXzwcKKAK1tbLiPKgvwmPXsDvvLHoWh5Bm7ofIYg==" }, "object-inspect": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.7.0.tgz", - "integrity": "sha512-a7pEHdh1xKIAgTySUGgLMx/xwDZskN1Ud6egYYN3EdRW4ZMPNEDUTF+hwy2LUC+Bl+SyLXANnwz/jyh/qutKUw==" + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.8.0.tgz", + "integrity": "sha512-jLdtEOB112fORuypAyl/50VRVIBIdVQOSUUGQHzJ4xBSbit81zRarz7GThkEFZy1RceYrWYcPcBFPQwHyAc1gA==" }, "object-is": { "version": "1.1.2", @@ -9382,13 +9141,12 @@ } }, "object.entries": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.1.tgz", - "integrity": "sha512-ilqR7BgdyZetJutmDPfXCDffGa0/Yzl2ivVNpbx/g4UeWrCdRnFDUBrKJGLhGieRHDATnyZXWBeCb29k9CJysQ==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.2.tgz", + "integrity": "sha512-BQdB9qKmb/HyNdMNWVr7O3+z5MUIx3aiegEIJqjMBbBf0YT9RRxTJSim4mzFqtyr7PDAHigq0N9dO0m0tRakQA==", "requires": { "define-properties": "^1.1.3", - "es-abstract": "^1.17.0-next.1", - "function-bind": "^1.1.1", + "es-abstract": "^1.17.5", "has": "^1.0.3" } }, @@ -9458,26 +9216,29 @@ } }, "onetime": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.0.tgz", - "integrity": "sha512-5NcSkPHhwTVFIQN+TUqXoS5+dlElHXdpAWu9I0HP20YOtIi+aZ0Ct82jdlILDxjLEAWwvm+qj1m6aEtsDVmm6Q==", + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", "requires": { "mimic-fn": "^2.1.0" } }, "open": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/open/-/open-7.0.3.tgz", - "integrity": "sha512-sP2ru2v0P290WFfv49Ap8MF6PkzGNnGlAwHweB4WR4mr5d2d0woiCluUeJ218w7/+PmoBy9JmYgD5A4mLcWOFA==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/open/-/open-7.2.0.tgz", + "integrity": "sha512-4HeyhxCvBTI5uBePsAdi55C5fmqnWZ2e2MlmvWi5KW5tdH5rxoiv/aMtbeVxKZc3eWkT1GymMnLG8XC4Rq4TDQ==", "requires": { "is-docker": "^2.0.0", "is-wsl": "^2.1.1" }, "dependencies": { "is-wsl": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.1.1.tgz", - "integrity": "sha512-umZHcSrwlDHo2TGMXv0DZ8dIUGunZ2Iv68YZnrmCiBPkZ4aaOhtv7pXJKeki9k3qJ3RJr0cDyitcl5wEH3AYog==" + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", + "requires": { + "is-docker": "^2.0.0" + } } } }, @@ -9529,16 +9290,6 @@ "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=" }, - "os-locale": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-3.1.0.tgz", - "integrity": "sha512-Z8l3R4wYWM40/52Z+S265okfFj8Kt2cC2MKY+xNi3kFs+XGI7WXu/I309QQQYbRW4ijiZ+yxs9pqEhJh0DqW3Q==", - "requires": { - "execa": "^1.0.0", - "lcid": "^2.0.0", - "mem": "^4.0.0" - } - }, "os-tmpdir": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", @@ -9553,11 +9304,6 @@ "os-tmpdir": "^1.0.0" } }, - "p-defer": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-1.0.0.tgz", - "integrity": "sha1-n26xgvbJqozXQwBKfU+WsZaw+ww=" - }, "p-each-series": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/p-each-series/-/p-each-series-1.0.0.tgz", @@ -9571,25 +9317,20 @@ "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=" }, - "p-is-promise": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/p-is-promise/-/p-is-promise-2.1.0.tgz", - "integrity": "sha512-Y3W0wlRPK8ZMRbNq97l4M5otioeA5lm1z7bkNkxCka8HSPjR0xRWmpCmc9utiaLP9Jb1eD8BgeIxTW4AIF45Pg==" - }, "p-limit": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", - "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", "requires": { - "p-try": "^1.0.0" + "p-try": "^2.0.0" } }, "p-locate": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", - "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", "requires": { - "p-limit": "^1.1.0" + "p-limit": "^2.0.0" } }, "p-map": { @@ -9614,9 +9355,9 @@ } }, "p-try": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", - "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=" + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==" }, "pako": { "version": "1.0.10", @@ -9658,13 +9399,12 @@ } }, "parse-asn1": { - "version": "5.1.5", - "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.5.tgz", - "integrity": "sha512-jkMYn1dcJqF6d5CpU689bq7w/b5ALS9ROVSpQDPrZsqqesUJii9qutvoT5ltGedNXMO2e16YUWIghG9KxaViTQ==", + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.6.tgz", + "integrity": "sha512-RnZRo1EPU6JBnra2vGHj0yhp6ebyjBZpmUCLHWiFhxlzvBCCpAuZ7elsBp1PVAbQN0/04VD/19rfzlBSwLstMw==", "requires": { - "asn1.js": "^4.0.0", + "asn1.js": "^5.2.0", "browserify-aes": "^1.0.0", - "create-hash": "^1.1.0", "evp_bytestokey": "^1.0.0", "pbkdf2": "^3.0.3", "safe-buffer": "^5.1.1" @@ -9768,9 +9508,9 @@ "dev": true }, "pbkdf2": { - "version": "3.0.17", - "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.0.17.tgz", - "integrity": "sha512-U/il5MsrZp7mGg3mSQfn742na2T+1/vHDCG5/iTI3X9MKUuYUZVLQhyRsg06mCgDBTd57TxzgZt7P+fYfjRLtA==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.1.tgz", + "integrity": "sha512-4Ejy1OPxi9f2tt1rRV7Go7zmfDQ+ZectEQz3VGUQhgq62HtIRPDyG/JtnwIxs6x3uNMwo2V7q1fMvKjb+Tnpqg==", "requires": { "create-hash": "^1.1.2", "create-hmac": "^1.1.4", @@ -9821,54 +9561,14 @@ "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", "requires": { "find-up": "^3.0.0" - }, - "dependencies": { - "find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", - "requires": { - "locate-path": "^3.0.0" - } - }, - "locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", - "requires": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - } - }, - "p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "requires": { - "p-try": "^2.0.0" - } - }, - "p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", - "requires": { - "p-limit": "^2.0.0" - } - }, - "p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==" - } } }, "pkg-up": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-2.0.0.tgz", - "integrity": "sha1-yBmscoBZpGHKscOImivjxJoATX8=", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-3.1.0.tgz", + "integrity": "sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA==", "requires": { - "find-up": "^2.1.0" + "find-up": "^3.0.0" } }, "pn": { @@ -9890,13 +9590,13 @@ "integrity": "sha512-Wb4p1J4zyFTbM+u6WuO4XstYx4Ky9Cewe4DWrel7B0w6VVICvPwdOpotjzcf6eD8TsckVnIMNONQyPIUFOUbCQ==" }, "portfinder": { - "version": "1.0.25", - "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.25.tgz", - "integrity": "sha512-6ElJnHBbxVA1XSLgBp7G1FiCkQdlqGzuF7DswL5tcea+E8UpuvPU7beVAjjRwCioTS9ZluNbu+ZyRvgTsmqEBg==", + "version": "1.0.28", + "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.28.tgz", + "integrity": "sha512-Se+2isanIcEqf2XMHjyUKskczxbPH7dQnlMjXX6+dybayyHvAf/TCgyMRlzf/B6QDhAEFOGes0pzRo3by4AbMA==", "requires": { "async": "^2.6.2", "debug": "^3.1.1", - "mkdirp": "^0.5.1" + "mkdirp": "^0.5.5" }, "dependencies": { "debug": { @@ -9915,9 +9615,9 @@ "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=" }, "postcss": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", - "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", + "version": "7.0.32", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.32.tgz", + "integrity": "sha512-03eXong5NLnNCD05xscnGKGDZ98CyzoqPSMjOe6SuoQY7Z2hIj0Ld1g/O/UQRuOle2aRtiIRDg9tDcTGAkLfKw==", "requires": { "chalk": "^2.4.2", "source-map": "^0.6.1", @@ -9952,9 +9652,9 @@ } }, "postcss-calc": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-7.0.2.tgz", - "integrity": "sha512-rofZFHUg6ZIrvRwPeFktv06GdbDYLcGqh9EwiMutZg+a0oePCCw1zHOEiji6LCpyRcjTREtPASuUqeAvYlEVvQ==", + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-7.0.3.tgz", + "integrity": "sha512-IB/EAEmZhIMEIhG7Ov4x+l47UaXOS1n2f4FBUk/aKllQhtSCxWhTzn0nJgkqN7fo/jcWySvWTSB6Syk9L+31bA==", "requires": { "postcss": "^7.0.27", "postcss-selector-parser": "^6.0.2", @@ -10407,14 +10107,14 @@ } }, "postcss-modules-local-by-default": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-3.0.2.tgz", - "integrity": "sha512-jM/V8eqM4oJ/22j0gx4jrp63GSvDH6v86OqyTHHUvk4/k1vceipZsaymiZ5PvocqZOl5SFHiFJqjs3la0wnfIQ==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-3.0.3.tgz", + "integrity": "sha512-e3xDq+LotiGesympRlKNgaJ0PCzoUIdpH0dj47iWAui/kyTgh3CiAr1qP54uodmJhl6p9rN6BoNcdEDVJx9RDw==", "requires": { "icss-utils": "^4.1.1", - "postcss": "^7.0.16", + "postcss": "^7.0.32", "postcss-selector-parser": "^6.0.2", - "postcss-value-parser": "^4.0.0" + "postcss-value-parser": "^4.1.0" } }, "postcss-modules-scope": { @@ -10820,9 +10520,9 @@ } }, "postcss-value-parser": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.0.3.tgz", - "integrity": "sha512-N7h4pG+Nnu5BEIzyeaaIYWs0LI5XC40OrRh5L60z0QjFsqGWcHcbkBvpe1WYpcIS9yQ8sOi/vIPt1ejQCrMVrg==" + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.1.0.tgz", + "integrity": "sha512-97DXOFbQJhk71ne5/Mt6cOu6yxsSfM0QGQyl0L25Gca4yGWEGJaig7l7gbCX623VqTBNGLRLaVUCnNkcedlRSQ==" }, "postcss-values-parser": { "version": "2.0.1", @@ -10876,11 +10576,6 @@ } } }, - "private": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/private/-/private-0.1.8.tgz", - "integrity": "sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg==" - }, "process": { "version": "0.11.10", "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", @@ -10972,6 +10667,13 @@ "parse-asn1": "^5.0.0", "randombytes": "^2.0.1", "safe-buffer": "^5.1.2" + }, + "dependencies": { + "bn.js": { + "version": "4.11.9", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", + "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==" + } } }, "pump": { @@ -11044,9 +10746,9 @@ "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=" }, "querystringify": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.1.1.tgz", - "integrity": "sha512-w7fLxIRCRT7U8Qu53jQnJyPkYZIaR4n5151KMfcJlO/A9397Wxb1amJvROTK6TOnp7PfoAmg/qXiNHI+08jRfA==" + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", + "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==" }, "raf": { "version": "3.4.1", @@ -11258,9 +10960,9 @@ } }, "regenerator-runtime": { - "version": "0.13.5", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.5.tgz", - "integrity": "sha512-ZS5w8CpKFinUzOwW3c83oPeVXoNsrLsaCoLtJvAClH135j/R77RuymhiSErhm2lKcwSCIpmvIWSbDkIfAqKQlA==" + "version": "0.13.7", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz", + "integrity": "sha512-a54FxoJDIr27pgf7IgeQGxmqUNYrcV338lf/6gH456HZ/PhX+5BcwHXG9ajESmwe6WRO0tAzRUrRmNONWgkrew==" } } }, @@ -11276,9 +10978,9 @@ } }, "react-bootstrap": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/react-bootstrap/-/react-bootstrap-1.2.2.tgz", - "integrity": "sha512-G+QcEyBqFtakBNghdDugie+yU/ABDeqw3n+SOeRGxEn1m0dbIyHTroZpectcQk6FB3aS4RJGkZTuLVYH86Cu2A==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/react-bootstrap/-/react-bootstrap-1.3.0.tgz", + "integrity": "sha512-GYj0c6FO9mx7DaO8Xyz2zs0IcQ6CGCtM3O6/feIoCaG4N8B0+l4eqL7stlMcLpqO4d8NG2PoMO/AbUOD+MO7mg==", "requires": { "@babel/runtime": "^7.4.2", "@restart/context": "^2.1.4", @@ -11294,20 +10996,25 @@ "invariant": "^2.2.4", "prop-types": "^15.7.2", "prop-types-extra": "^1.1.0", - "react-overlays": "^4.0.0", - "react-transition-group": "^4.0.0", + "react-overlays": "^4.1.0", + "react-transition-group": "^4.4.1", "uncontrollable": "^7.0.0", "warning": "^4.0.3" }, "dependencies": { "@types/react": { - "version": "16.9.43", - "resolved": "https://registry.npmjs.org/@types/react/-/react-16.9.43.tgz", - "integrity": "sha512-PxshAFcnJqIWYpJbLPriClH53Z2WlJcVZE+NP2etUtWQs2s7yIMj3/LDKZT/5CHJ/F62iyjVCDu2H3jHEXIxSg==", + "version": "16.9.46", + "resolved": "https://registry.npmjs.org/@types/react/-/react-16.9.46.tgz", + "integrity": "sha512-dbHzO3aAq1lB3jRQuNpuZ/mnu+CdD3H0WVaaBQA8LTT3S33xhVBUj232T8M3tAhSWJs/D/UqORYUlJNl/8VQZg==", "requires": { "@types/prop-types": "*", - "csstype": "^2.2.0" + "csstype": "^3.0.2" } + }, + "csstype": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.0.2.tgz", + "integrity": "sha512-ofovWglpqoqbfLNOTBNZLSbMuGrblAf1efvvArGKOZMBrIoJeu5UsAipQolkijtyQx5MtAzT/J9IHj/CEY1mJw==" } } }, @@ -11365,6 +11072,14 @@ "text-table": "0.2.0" }, "dependencies": { + "@babel/code-frame": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.3.tgz", + "integrity": "sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g==", + "requires": { + "@babel/highlight": "^7.8.3" + } + }, "ansi-regex": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", @@ -11381,6 +11096,11 @@ "pkg-up": "^3.1.0" } }, + "cli-width": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.1.tgz", + "integrity": "sha512-GRMWDxpOB6Dgk2E5Uo+3eEBvtOOlimMmpbFiKuLFnQzYDavtLFY3K5ona41jgN/WdRZtG7utuVSVTL4HbZHGkw==" + }, "cross-spawn": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.1.tgz", @@ -11408,29 +11128,6 @@ "requires": { "locate-path": "^5.0.0", "path-exists": "^4.0.0" - }, - "dependencies": { - "locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "requires": { - "p-locate": "^4.1.0" - } - }, - "p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "requires": { - "p-limit": "^2.2.0" - } - }, - "path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==" - } } }, "inquirer": { @@ -11482,58 +11179,31 @@ } }, "locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", "requires": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - } - }, - "p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "requires": { - "p-try": "^2.0.0" + "p-locate": "^4.1.0" } }, "p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", "requires": { - "p-limit": "^2.0.0" + "p-limit": "^2.2.0" } }, - "p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==" + "path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==" }, "path-key": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==" }, - "pkg-up": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-3.1.0.tgz", - "integrity": "sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA==", - "requires": { - "find-up": "^3.0.0" - }, - "dependencies": { - "find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", - "requires": { - "locate-path": "^3.0.0" - } - } - } - }, "shebang-command": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", @@ -11632,9 +11302,9 @@ } }, "react-draggable": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/react-draggable/-/react-draggable-4.2.0.tgz", - "integrity": "sha512-5wFq//gEoeTYprnd4ze8GrFc+Rbnx+9RkOMR3vk4EbWxj02U6L6T3yrlKeiw4X5CtjD2ma2+b3WujghcXNRzkw==", + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/react-draggable/-/react-draggable-4.4.3.tgz", + "integrity": "sha512-jV4TE59MBuWm7gb6Ns3Q1mxX8Azffb7oTtDtBgFkxRvhDp38YAARmRplrj0+XGkhOJB5XziArX+4HUUABtyZ0w==", "requires": { "classnames": "^2.2.5", "prop-types": "^15.6.0" @@ -11694,9 +11364,9 @@ } }, "react-overlays": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/react-overlays/-/react-overlays-4.0.0.tgz", - "integrity": "sha512-LpznWocwgeB5oWKg6cDdkqKP7MbX4ClKbJqgZGUMXPRBBYcqrgM6TjjZ/8DeurNU//GuqwQMjhmo/JVma4XEWw==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/react-overlays/-/react-overlays-4.1.0.tgz", + "integrity": "sha512-vdRpnKe0ckWOOD9uWdqykLUPHLPndIiUV7XfEKsi5008xiyHCfL8bxsx4LbMrfnxW1LzRthLyfy50XYRFNQqqw==", "requires": { "@babel/runtime": "^7.4.5", "@popperjs/core": "^2.0.0", @@ -11709,13 +11379,20 @@ } }, "react-rnd": { - "version": "10.1.10", - "resolved": "https://registry.npmjs.org/react-rnd/-/react-rnd-10.1.10.tgz", - "integrity": "sha512-xR+CasLBGXJUJQpds2CHocKp/Wze8/VKOf7KaaVDEy2MFzDJKcxPQ0J4QCAGSIaN20cTDmpfTyCzdTfwVGxN8A==", + "version": "10.2.2", + "resolved": "https://registry.npmjs.org/react-rnd/-/react-rnd-10.2.2.tgz", + "integrity": "sha512-UoQnNehseKEspimfPFaO0gN0vSVJ8uCZeG39nCibUVyGTjZ5d+bnY/zHEp9SObHQ9tKW4vFSa9+8Mf7QZrQrUw==", "requires": { "re-resizable": "6.3.2", - "react-draggable": "4.2.0", - "tslib": "1.11.1" + "react-draggable": "4.4.3", + "tslib": "2.0.0" + }, + "dependencies": { + "tslib": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.0.0.tgz", + "integrity": "sha512-lTqkx847PI7xEDYJntxZH89L2/aXInsyF2luSafe/+0fHOMjlBNXdH6th7f70qxLDhul7KZK0zC8V5ZIyHl0/g==" + } } }, "react-router": { @@ -11750,9 +11427,9 @@ } }, "react-scripts": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/react-scripts/-/react-scripts-3.4.1.tgz", - "integrity": "sha512-JpTdi/0Sfd31mZA6Ukx+lq5j1JoKItX7qqEK4OiACjVQletM1P38g49d9/D0yTxp9FrSF+xpJFStkGgKEIRjlQ==", + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/react-scripts/-/react-scripts-3.4.3.tgz", + "integrity": "sha512-oSnoWmii/iKdeQiwaO6map1lUaZLmG0xIUyb/HwCVFLT7gNbj8JZ9RmpvMCZ4fB98ZUMRfNmp/ft8uy/xD1RLA==", "requires": { "@babel/core": "7.9.0", "@svgr/webpack": "4.3.3", @@ -11800,11 +11477,11 @@ "sass-loader": "8.0.2", "semver": "6.3.0", "style-loader": "0.23.1", - "terser-webpack-plugin": "2.3.5", + "terser-webpack-plugin": "2.3.8", "ts-pnp": "1.1.6", "url-loader": "2.3.0", "webpack": "4.42.0", - "webpack-dev-server": "3.10.3", + "webpack-dev-server": "3.11.0", "webpack-manifest-plugin": "2.2.0", "workbox-webpack-plugin": "4.3.1" }, @@ -11864,46 +11541,6 @@ "requires": { "find-up": "^3.0.0", "read-pkg": "^3.0.0" - }, - "dependencies": { - "find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", - "requires": { - "locate-path": "^3.0.0" - } - }, - "locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", - "requires": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - } - }, - "p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "requires": { - "p-try": "^2.0.0" - } - }, - "p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", - "requires": { - "p-limit": "^2.0.0" - } - }, - "p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==" - } } }, "readable-stream": { @@ -11973,9 +11610,9 @@ } }, "regenerate": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.0.tgz", - "integrity": "sha512-1G6jJVDWrt0rK99kBjvEtziZNCICAuvIPkSiUFIQxVP06RCVpq3dmDo2oi6ABpYaDYaTRr67BEhL8r1wgEZZKg==" + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.1.tgz", + "integrity": "sha512-j2+C8+NtXQgEKWk49MMP5P/u2GhnahTtVkRIHr5R5lVRlbKvmQ+oS+A5aLKWp2ma5VkT8sh6v+v4hbH0YHR66A==" }, "regenerate-unicode-properties": { "version": "8.2.0", @@ -11991,26 +11628,25 @@ "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==" }, "regenerator-transform": { - "version": "0.14.4", - "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.14.4.tgz", - "integrity": "sha512-EaJaKPBI9GvKpvUz2mz4fhx7WPgvwRLY9v3hlNHWmAuJHI13T4nwKnNvm5RWJzEdnI5g5UwtOww+S8IdoUC2bw==", + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.14.5.tgz", + "integrity": "sha512-eOf6vka5IO151Jfsw2NO9WpGX58W6wWmefK3I1zEGr0lOD0u8rwPaNqQL1aRxUaxLeKO3ArNh3VYg1KbaD+FFw==", "requires": { - "@babel/runtime": "^7.8.4", - "private": "^0.1.8" + "@babel/runtime": "^7.8.4" }, "dependencies": { "@babel/runtime": { - "version": "7.9.2", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.9.2.tgz", - "integrity": "sha512-NE2DtOdufG7R5vnfQUTehdTfNycfUANEtCa9PssN9O/xmTzP4E08UI797ixaei6hBEVL9BI/PsdJS5x7mWoB9Q==", + "version": "7.11.2", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.11.2.tgz", + "integrity": "sha512-TeWkU52so0mPtDcaCTxNBI/IHiz0pZgr8VEFqXFtZWpYD08ZB6FaSwVAS8MKRQAP3bYKiVjwysOJgMFY28o6Tw==", "requires": { "regenerator-runtime": "^0.13.4" } }, "regenerator-runtime": { - "version": "0.13.5", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.5.tgz", - "integrity": "sha512-ZS5w8CpKFinUzOwW3c83oPeVXoNsrLsaCoLtJvAClH135j/R77RuymhiSErhm2lKcwSCIpmvIWSbDkIfAqKQlA==" + "version": "0.13.7", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz", + "integrity": "sha512-a54FxoJDIr27pgf7IgeQGxmqUNYrcV338lf/6gH456HZ/PhX+5BcwHXG9ajESmwe6WRO0tAzRUrRmNONWgkrew==" } } }, @@ -12056,9 +11692,9 @@ } }, "regjsgen": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.5.1.tgz", - "integrity": "sha512-5qxzGZjDs9w4tzT3TPhCJqWdCc3RLYwy9J2NB0nm5Lz+S273lvWcpjaTGHsT1dc6Hhfq41uSEOw8wBmxrKOuyg==" + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.5.2.tgz", + "integrity": "sha512-OFFT3MfrH90xIW8OOSyUrk6QHD5E9JOTeGodiJeBS3J6IwlgzJMNE/1bZklWz5oTg+9dCMyEetclvCVXOPoN3A==" }, "regjsparser": { "version": "0.6.4", @@ -12199,19 +11835,19 @@ } }, "request-promise-core": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/request-promise-core/-/request-promise-core-1.1.3.tgz", - "integrity": "sha512-QIs2+ArIGQVp5ZYbWD5ZLCY29D5CfWizP8eWnm8FoGD1TX61veauETVQbrV60662V0oFBkrDOuaBI8XgtuyYAQ==", + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/request-promise-core/-/request-promise-core-1.1.4.tgz", + "integrity": "sha512-TTbAfBBRdWD7aNNOoVOBH4pN/KigV6LyapYNNlAPA8JwbovRti1E88m3sYAwsLi5ryhPKsE9APwnjFTgdUjTpw==", "requires": { - "lodash": "^4.17.15" + "lodash": "^4.17.19" } }, "request-promise-native": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/request-promise-native/-/request-promise-native-1.0.8.tgz", - "integrity": "sha512-dapwLGqkHtwL5AEbfenuzjTYg35Jd6KPytsC2/TLkVMz8rm+tNt72MGUWT1RP/aYawMpN6HqbNGBQaRcBtjQMQ==", + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/request-promise-native/-/request-promise-native-1.0.9.tgz", + "integrity": "sha512-wcW+sIUiWnKgNY0dqCpOZkUbF/I+YPi+f09JZIDa39Ec+q82CpSYniDp+ISgTTbKmnpJWASeJBPZmoxH84wt3g==", "requires": { - "request-promise-core": "1.1.3", + "request-promise-core": "1.1.4", "stealthy-require": "^1.1.1", "tough-cookie": "^2.3.3" } @@ -12413,9 +12049,9 @@ } }, "rxjs": { - "version": "6.5.5", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.5.tgz", - "integrity": "sha512-WfQI+1gohdf0Dai/Bbmk5L5ItH5tYqm3ki2c5GdWhKjalzjg93N3avFjVStyZZz+A2Em+ZxKH5bNghw9UeylGQ==", + "version": "6.6.2", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.2.tgz", + "integrity": "sha512-BHdBMVoWC2sL26w//BCu3YzKT4s2jip/WhwsGEDmeKYBhKDZeYezVUnHatYB7L85v5xs0BAQmg6BEYJEKxBabg==", "requires": { "tslib": "^1.9.0" } @@ -12538,18 +12174,19 @@ } }, "schema-utils": { - "version": "2.6.6", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.6.6.tgz", - "integrity": "sha512-wHutF/WPSbIi9x6ctjGGk2Hvl0VOz5l3EKEuKbjPlB30mKZUzb9A5k9yEXRX3pwyqVLPvpfZZEllaFq/M718hA==", + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.0.tgz", + "integrity": "sha512-0ilKFI6QQF5nxDZLFn2dMjvc4hjg/Wkg7rHd3jK6/A4a1Hl9VFdQWvgB1UMGoU94pad1P/8N7fMcEnLnSiju8A==", "requires": { - "ajv": "^6.12.0", + "@types/json-schema": "^7.0.4", + "ajv": "^6.12.2", "ajv-keywords": "^3.4.1" }, "dependencies": { "ajv": { - "version": "6.12.2", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.2.tgz", - "integrity": "sha512-k+V+hzjm5q/Mr8ef/1Y9goCmlsK4I6Sm74teeyGvFk1XrOsbsKLjEdrvny42CZ+a8sXbk8KWpY/bDwS+FLL2UQ==", + "version": "6.12.4", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.4.tgz", + "integrity": "sha512-eienB2c9qVQs2KWexhkrdMLVDoIQCz5KSeLxwg9Lzk4DOfBtIK9PQwwufcsn1jjGuf9WZmqPMbGxOzfcuphJCQ==", "requires": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", @@ -12558,9 +12195,9 @@ } }, "fast-deep-equal": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.1.tgz", - "integrity": "sha512-8UEa58QDLauDNfpbrX55Q9jrGHThw2ZMdOky5Gl1CDtVeJDPVrG4Jxx1N8jw2gkWaff5UUuX1KJd+9zGe2B+ZA==" + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" } } }, @@ -12649,9 +12286,12 @@ } }, "serialize-javascript": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-2.1.2.tgz", - "integrity": "sha512-rs9OggEUF0V4jUSecXazOYsLfu7OGK2qIn3c7IPBiffz32XniEp/TX9Xmc9LQfK2nQ2QKHvZ2oygKUGU0lG4jQ==" + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-4.0.0.tgz", + "integrity": "sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==", + "requires": { + "randombytes": "^2.1.0" + } }, "serve-index": { "version": "1.9.1", @@ -12819,12 +12459,33 @@ "integrity": "sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww==" }, "side-channel": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.2.tgz", - "integrity": "sha512-7rL9YlPHg7Ancea1S96Pa8/QWb4BtXL/TZvS6B8XFetGBeuhAsfmUspK6DokBeZ64+Kj9TCNRD/30pVz1BvQNA==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.3.tgz", + "integrity": "sha512-A6+ByhlLkksFoUepsGxfj5x1gTSrs+OydsRptUxeNCabQpCFUvcwIczgOigI8vhY/OJCnPnyE9rGiwgvr9cS1g==", "requires": { - "es-abstract": "^1.17.0-next.1", - "object-inspect": "^1.7.0" + "es-abstract": "^1.18.0-next.0", + "object-inspect": "^1.8.0" + }, + "dependencies": { + "es-abstract": { + "version": "1.18.0-next.0", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.0-next.0.tgz", + "integrity": "sha512-elZXTZXKn51hUBdJjSZGYRujuzilgXo8vSPQzjGYXLvSlGiCo8VO8ZGV3kjo9a0WNJJ57hENagwbtlRuHuzkcQ==", + "requires": { + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1", + "is-callable": "^1.2.0", + "is-negative-zero": "^2.0.0", + "is-regex": "^1.1.1", + "object-inspect": "^1.8.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.0", + "string.prototype.trimend": "^1.0.1", + "string.prototype.trimstart": "^1.0.1" + } + } } }, "signal-exit": { @@ -12985,12 +12646,20 @@ } }, "sockjs": { - "version": "0.3.19", - "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.19.tgz", - "integrity": "sha512-V48klKZl8T6MzatbLlzzRNhMepEys9Y4oGFpypBFFn1gLI/QQ9HtLLyWJNbPlwGLelOVOEijUbTTJeLLI59jLw==", + "version": "0.3.20", + "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.20.tgz", + "integrity": "sha512-SpmVOVpdq0DJc0qArhF3E5xsxvaiqGNb73XfgBpK1y3UD5gs8DSo8aCTsuT5pX8rssdc2NDIzANwP9eCAiSdTA==", "requires": { "faye-websocket": "^0.10.0", - "uuid": "^3.0.1" + "uuid": "^3.4.0", + "websocket-driver": "0.6.5" + }, + "dependencies": { + "uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==" + } } }, "sockjs-client": { @@ -13324,26 +12993,6 @@ "es-abstract": "^1.17.5" } }, - "string.prototype.trimleft": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/string.prototype.trimleft/-/string.prototype.trimleft-2.1.2.tgz", - "integrity": "sha512-gCA0tza1JBvqr3bfAIFJGqfdRTyPae82+KTnm3coDXkZN9wnuW3HjGgN386D7hfv5CHQYCI022/rJPVlqXyHSw==", - "requires": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.5", - "string.prototype.trimstart": "^1.0.0" - } - }, - "string.prototype.trimright": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/string.prototype.trimright/-/string.prototype.trimright-2.1.2.tgz", - "integrity": "sha512-ZNRQ7sY3KroTaYjRS6EbNiiHrOkjihL9aQE/8gfQ4DtAC/aEBRHFJa44OmoWxGGqXuJlfKkZW4WcXErGr+9ZFg==", - "requires": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.5", - "string.prototype.trimend": "^1.0.0" - } - }, "string.prototype.trimstart": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.1.tgz", @@ -13421,9 +13070,9 @@ } }, "strip-json-comments": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.0.tgz", - "integrity": "sha512-e6/d0eBu7gHtdCqFt0xJr642LdToM5/cN4Qb9DbHjVx1CP5RyeM+zH7pbecEmDv/lBqb0QH+6Uqq75rxFPkM0w==" + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==" }, "style-loader": { "version": "0.23.1", @@ -13615,9 +13264,9 @@ } }, "terser": { - "version": "4.6.12", - "resolved": "https://registry.npmjs.org/terser/-/terser-4.6.12.tgz", - "integrity": "sha512-fnIwuaKjFPANG6MAixC/k1TDtnl1YlPLUlLVIxxGZUn1gfUx2+l3/zGNB72wya+lgsb50QBi2tUV75RiODwnww==", + "version": "4.8.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-4.8.0.tgz", + "integrity": "sha512-EAPipTNeWsb/3wLPeup1tVPaXfIaU68xMnVdPafIL1TV05OhASArYyIfFvnvJCNrR2NIOvDVNNTFRa+Re2MWyw==", "requires": { "commander": "^2.20.0", "source-map": "~0.6.1", @@ -13625,18 +13274,18 @@ } }, "terser-webpack-plugin": { - "version": "2.3.5", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-2.3.5.tgz", - "integrity": "sha512-WlWksUoq+E4+JlJ+h+U+QUzXpcsMSSNXkDy9lBVkSqDn1w23Gg29L/ary9GeJVYCGiNJJX7LnVc4bwL1N3/g1w==", + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-2.3.8.tgz", + "integrity": "sha512-/fKw3R+hWyHfYx7Bv6oPqmk4HGQcrWLtV3X6ggvPuwPNHSnzvVV51z6OaaCOus4YLjutYGOz3pEpbhe6Up2s1w==", "requires": { "cacache": "^13.0.1", - "find-cache-dir": "^3.2.0", - "jest-worker": "^25.1.0", - "p-limit": "^2.2.2", - "schema-utils": "^2.6.4", - "serialize-javascript": "^2.1.2", + "find-cache-dir": "^3.3.1", + "jest-worker": "^25.4.0", + "p-limit": "^2.3.0", + "schema-utils": "^2.6.6", + "serialize-javascript": "^4.0.0", "source-map": "^0.6.1", - "terser": "^4.4.3", + "terser": "^4.6.12", "webpack-sources": "^1.4.3" }, "dependencies": { @@ -13665,9 +13314,9 @@ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" }, "jest-worker": { - "version": "25.4.0", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-25.4.0.tgz", - "integrity": "sha512-ghAs/1FtfYpMmYQ0AHqxV62XPvKdUDIBBApMZfly+E9JEmYh2K45G0R5dWxx986RN12pRCxsViwQVtGl+N4whw==", + "version": "25.5.0", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-25.5.0.tgz", + "integrity": "sha512-/dsSmUkIy5EBGfv/IjjqmFxrNAUpBERfGs1oHROyD7yxjG/w+t0GOJDX8O1k32ySmd7+a5IhnJU2qQFcJ4n1vw==", "requires": { "merge-stream": "^2.0.0", "supports-color": "^7.0.0" @@ -13689,14 +13338,6 @@ "semver": "^6.0.0" } }, - "p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "requires": { - "p-try": "^2.0.0" - } - }, "p-locate": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", @@ -13705,11 +13346,6 @@ "p-limit": "^2.2.0" } }, - "p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==" - }, "path-exists": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", @@ -14208,9 +13844,9 @@ "integrity": "sha512-pW0No1RGHgzlpHJO1nsVrHKpOEIxkGg1xB+v0ZmdNH5OAeAwzAVrCnI2/6Mtx+Uys6iaylxa+D3g4j63IKKjSQ==" }, "v8-compile-cache": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.1.0.tgz", - "integrity": "sha512-usZBT3PW+LOjM25wbqIlZwPeJV+3OSz3M1k1Ws8snlW39dZyYL9lOGC5FgPVHfk0jKmjiDV8Z0mIbVQPiwFs7g==" + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.1.1.tgz", + "integrity": "sha512-8OQ9CL+VWyt3JStj7HX7/ciTL2V3Rl1Wf5OL+SNTm0yK1KvtReVulksyeRnCANHHuUxHlQig+JJDlUhBt1NQDQ==" }, "validate-npm-package-license": { "version": "3.0.4", @@ -14291,24 +13927,112 @@ } }, "watchpack": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.6.1.tgz", - "integrity": "sha512-+IF9hfUFOrYOOaKyfaI7h7dquUIOgyEMoQMLA7OP5FxegKA2+XdXThAZ9TU2kucfhDH7rfMHs1oPYziVGWRnZA==", + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.7.4.tgz", + "integrity": "sha512-aWAgTW4MoSJzZPAicljkO1hsi1oKj/RRq/OJQh2PKI2UKL04c2Bs+MBOB+BBABHTXJpf9mCwHN7ANCvYsvY2sg==", "requires": { - "chokidar": "^2.1.8", + "chokidar": "^3.4.1", "graceful-fs": "^4.1.2", - "neo-async": "^2.5.0" + "neo-async": "^2.5.0", + "watchpack-chokidar2": "^2.0.0" + }, + "dependencies": { + "anymatch": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz", + "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==", + "optional": true, + "requires": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + } + }, + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "optional": true, + "requires": { + "fill-range": "^7.0.1" + } + }, + "chokidar": { + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.4.2.tgz", + "integrity": "sha512-IZHaDeBeI+sZJRX7lGcXsdzgvZqKv6sECqsbErJA4mHWfpRrD8B97kSFN4cQz6nGBGiuFia1MKR4d6c1o8Cv7A==", + "optional": true, + "requires": { + "anymatch": "~3.1.1", + "braces": "~3.0.2", + "fsevents": "~2.1.2", + "glob-parent": "~5.1.0", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.4.0" + } + }, + "fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "optional": true, + "requires": { + "to-regex-range": "^5.0.1" + } + }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "optional": true + }, + "normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "optional": true + }, + "readdirp": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.4.0.tgz", + "integrity": "sha512-0xe001vZBnJEK+uKcj8qOhyAKPzIT+gStxWr3LCB0DwcXR5NZJ3IaC+yGnHCYzB/S7ov3m3EEbZI2zeNvX+hGQ==", + "optional": true, + "requires": { + "picomatch": "^2.2.1" + } + }, + "to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "optional": true, + "requires": { + "is-number": "^7.0.0" + } + } + } + }, + "watchpack-chokidar2": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/watchpack-chokidar2/-/watchpack-chokidar2-2.0.0.tgz", + "integrity": "sha512-9TyfOyN/zLUbA288wZ8IsMZ+6cbzvsNyEzSBp6e/zkifi6xxbl8SmQ/CxQq32k8NNqrdVEVUVSEf56L4rQ/ZxA==", + "optional": true, + "requires": { + "chokidar": "^2.1.8" }, "dependencies": { "binary-extensions": { "version": "1.13.1", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", - "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==" + "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==", + "optional": true }, "chokidar": { "version": "2.1.8", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==", + "optional": true, "requires": { "anymatch": "^2.0.0", "async-each": "^1.0.1", @@ -14325,492 +14049,19 @@ } }, "fsevents": { - "version": "1.2.12", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.12.tgz", - "integrity": "sha512-Ggd/Ktt7E7I8pxZRbGIs7vwqAPscSESMrCSkx2FtWeqmheJgCo2R74fTsZFCifr0VTPwqRpPv17+6b8Zp7th0Q==", + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.13.tgz", + "integrity": "sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==", "optional": true, "requires": { - "nan": "^2.12.1", - "node-pre-gyp": "*" - }, - "dependencies": { - "abbrev": { - "version": "1.1.1", - "bundled": true, - "optional": true - }, - "ansi-regex": { - "version": "2.1.1", - "bundled": true, - "optional": true - }, - "aproba": { - "version": "1.2.0", - "bundled": true, - "optional": true - }, - "are-we-there-yet": { - "version": "1.1.5", - "bundled": true, - "optional": true, - "requires": { - "delegates": "^1.0.0", - "readable-stream": "^2.0.6" - } - }, - "balanced-match": { - "version": "1.0.0", - "bundled": true, - "optional": true - }, - "brace-expansion": { - "version": "1.1.11", - "bundled": true, - "optional": true, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "chownr": { - "version": "1.1.4", - "bundled": true, - "optional": true - }, - "code-point-at": { - "version": "1.1.0", - "bundled": true, - "optional": true - }, - "concat-map": { - "version": "0.0.1", - "bundled": true, - "optional": true - }, - "console-control-strings": { - "version": "1.1.0", - "bundled": true, - "optional": true - }, - "core-util-is": { - "version": "1.0.2", - "bundled": true, - "optional": true - }, - "debug": { - "version": "3.2.6", - "bundled": true, - "optional": true, - "requires": { - "ms": "^2.1.1" - } - }, - "deep-extend": { - "version": "0.6.0", - "bundled": true, - "optional": true - }, - "delegates": { - "version": "1.0.0", - "bundled": true, - "optional": true - }, - "detect-libc": { - "version": "1.0.3", - "bundled": true, - "optional": true - }, - "fs-minipass": { - "version": "1.2.7", - "bundled": true, - "optional": true, - "requires": { - "minipass": "^2.6.0" - } - }, - "fs.realpath": { - "version": "1.0.0", - "bundled": true, - "optional": true - }, - "gauge": { - "version": "2.7.4", - "bundled": true, - "optional": true, - "requires": { - "aproba": "^1.0.3", - "console-control-strings": "^1.0.0", - "has-unicode": "^2.0.0", - "object-assign": "^4.1.0", - "signal-exit": "^3.0.0", - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1", - "wide-align": "^1.1.0" - } - }, - "glob": { - "version": "7.1.6", - "bundled": true, - "optional": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "has-unicode": { - "version": "2.0.1", - "bundled": true, - "optional": true - }, - "iconv-lite": { - "version": "0.4.24", - "bundled": true, - "optional": true, - "requires": { - "safer-buffer": ">= 2.1.2 < 3" - } - }, - "ignore-walk": { - "version": "3.0.3", - "bundled": true, - "optional": true, - "requires": { - "minimatch": "^3.0.4" - } - }, - "inflight": { - "version": "1.0.6", - "bundled": true, - "optional": true, - "requires": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "inherits": { - "version": "2.0.4", - "bundled": true, - "optional": true - }, - "ini": { - "version": "1.3.5", - "bundled": true, - "optional": true - }, - "is-fullwidth-code-point": { - "version": "1.0.0", - "bundled": true, - "optional": true, - "requires": { - "number-is-nan": "^1.0.0" - } - }, - "isarray": { - "version": "1.0.0", - "bundled": true, - "optional": true - }, - "minimatch": { - "version": "3.0.4", - "bundled": true, - "optional": true, - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "minimist": { - "version": "1.2.5", - "bundled": true, - "optional": true - }, - "minipass": { - "version": "2.9.0", - "bundled": true, - "optional": true, - "requires": { - "safe-buffer": "^5.1.2", - "yallist": "^3.0.0" - } - }, - "minizlib": { - "version": "1.3.3", - "bundled": true, - "optional": true, - "requires": { - "minipass": "^2.9.0" - } - }, - "mkdirp": { - "version": "0.5.3", - "bundled": true, - "optional": true, - "requires": { - "minimist": "^1.2.5" - } - }, - "ms": { - "version": "2.1.2", - "bundled": true, - "optional": true - }, - "needle": { - "version": "2.3.3", - "bundled": true, - "optional": true, - "requires": { - "debug": "^3.2.6", - "iconv-lite": "^0.4.4", - "sax": "^1.2.4" - } - }, - "node-pre-gyp": { - "version": "0.14.0", - "bundled": true, - "optional": true, - "requires": { - "detect-libc": "^1.0.2", - "mkdirp": "^0.5.1", - "needle": "^2.2.1", - "nopt": "^4.0.1", - "npm-packlist": "^1.1.6", - "npmlog": "^4.0.2", - "rc": "^1.2.7", - "rimraf": "^2.6.1", - "semver": "^5.3.0", - "tar": "^4.4.2" - } - }, - "nopt": { - "version": "4.0.3", - "bundled": true, - "optional": true, - "requires": { - "abbrev": "1", - "osenv": "^0.1.4" - } - }, - "npm-bundled": { - "version": "1.1.1", - "bundled": true, - "optional": true, - "requires": { - "npm-normalize-package-bin": "^1.0.1" - } - }, - "npm-normalize-package-bin": { - "version": "1.0.1", - "bundled": true, - "optional": true - }, - "npm-packlist": { - "version": "1.4.8", - "bundled": true, - "optional": true, - "requires": { - "ignore-walk": "^3.0.1", - "npm-bundled": "^1.0.1", - "npm-normalize-package-bin": "^1.0.1" - } - }, - "npmlog": { - "version": "4.1.2", - "bundled": true, - "optional": true, - "requires": { - "are-we-there-yet": "~1.1.2", - "console-control-strings": "~1.1.0", - "gauge": "~2.7.3", - "set-blocking": "~2.0.0" - } - }, - "number-is-nan": { - "version": "1.0.1", - "bundled": true, - "optional": true - }, - "object-assign": { - "version": "4.1.1", - "bundled": true, - "optional": true - }, - "once": { - "version": "1.4.0", - "bundled": true, - "optional": true, - "requires": { - "wrappy": "1" - } - }, - "os-homedir": { - "version": "1.0.2", - "bundled": true, - "optional": true - }, - "os-tmpdir": { - "version": "1.0.2", - "bundled": true, - "optional": true - }, - "osenv": { - "version": "0.1.5", - "bundled": true, - "optional": true, - "requires": { - "os-homedir": "^1.0.0", - "os-tmpdir": "^1.0.0" - } - }, - "path-is-absolute": { - "version": "1.0.1", - "bundled": true, - "optional": true - }, - "process-nextick-args": { - "version": "2.0.1", - "bundled": true, - "optional": true - }, - "rc": { - "version": "1.2.8", - "bundled": true, - "optional": true, - "requires": { - "deep-extend": "^0.6.0", - "ini": "~1.3.0", - "minimist": "^1.2.0", - "strip-json-comments": "~2.0.1" - } - }, - "readable-stream": { - "version": "2.3.7", - "bundled": true, - "optional": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "rimraf": { - "version": "2.7.1", - "bundled": true, - "optional": true, - "requires": { - "glob": "^7.1.3" - } - }, - "safe-buffer": { - "version": "5.1.2", - "bundled": true, - "optional": true - }, - "safer-buffer": { - "version": "2.1.2", - "bundled": true, - "optional": true - }, - "sax": { - "version": "1.2.4", - "bundled": true, - "optional": true - }, - "semver": { - "version": "5.7.1", - "bundled": true, - "optional": true - }, - "set-blocking": { - "version": "2.0.0", - "bundled": true, - "optional": true - }, - "signal-exit": { - "version": "3.0.2", - "bundled": true, - "optional": true - }, - "string-width": { - "version": "1.0.2", - "bundled": true, - "optional": true, - "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" - } - }, - "string_decoder": { - "version": "1.1.1", - "bundled": true, - "optional": true, - "requires": { - "safe-buffer": "~5.1.0" - } - }, - "strip-ansi": { - "version": "3.0.1", - "bundled": true, - "optional": true, - "requires": { - "ansi-regex": "^2.0.0" - } - }, - "strip-json-comments": { - "version": "2.0.1", - "bundled": true, - "optional": true - }, - "tar": { - "version": "4.4.13", - "bundled": true, - "optional": true, - "requires": { - "chownr": "^1.1.1", - "fs-minipass": "^1.2.5", - "minipass": "^2.8.6", - "minizlib": "^1.2.1", - "mkdirp": "^0.5.0", - "safe-buffer": "^5.1.2", - "yallist": "^3.0.3" - } - }, - "util-deprecate": { - "version": "1.0.2", - "bundled": true, - "optional": true - }, - "wide-align": { - "version": "1.1.3", - "bundled": true, - "optional": true, - "requires": { - "string-width": "^1.0.2 || 2" - } - }, - "wrappy": { - "version": "1.0.2", - "bundled": true, - "optional": true - }, - "yallist": { - "version": "3.1.1", - "bundled": true, - "optional": true - } + "nan": "^2.12.1" } }, "glob-parent": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", + "optional": true, "requires": { "is-glob": "^3.1.0", "path-dirname": "^1.0.0" @@ -14820,6 +14071,7 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "optional": true, "requires": { "is-extglob": "^2.1.0" } @@ -14830,6 +14082,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", + "optional": true, "requires": { "binary-extensions": "^1.0.0" } @@ -14837,12 +14090,14 @@ "normalize-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==" + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "optional": true }, "readdirp": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", + "optional": true, "requires": { "graceful-fs": "^4.1.11", "micromatch": "^3.1.10", @@ -14949,15 +14204,15 @@ } }, "terser-webpack-plugin": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-1.4.3.tgz", - "integrity": "sha512-QMxecFz/gHQwteWwSo5nTc6UaICqN1bMedC5sMtUc7y3Ha3Q8y6ZO0iCR8pq4RJC8Hjf0FEPEHZqcMB/+DFCrA==", + "version": "1.4.5", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-1.4.5.tgz", + "integrity": "sha512-04Rfe496lN8EYruwi6oPQkG0vo8C+HT49X687FZnpPF0qMAIHONI6HEXYPKDOE8e5HjXTyKfqRd/agHtH0kOtw==", "requires": { "cacache": "^12.0.2", "find-cache-dir": "^2.1.0", "is-wsl": "^1.1.0", "schema-utils": "^1.0.0", - "serialize-javascript": "^2.1.2", + "serialize-javascript": "^4.0.0", "source-map": "^0.6.1", "terser": "^4.1.2", "webpack-sources": "^1.4.0", @@ -14979,9 +14234,9 @@ } }, "webpack-dev-server": { - "version": "3.10.3", - "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-3.10.3.tgz", - "integrity": "sha512-e4nWev8YzEVNdOMcNzNeCN947sWJNd43E5XvsJzbAL08kGc2frm1tQ32hTJslRS+H65LCb/AaUCYU7fjHCpDeQ==", + "version": "3.11.0", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-3.11.0.tgz", + "integrity": "sha512-PUxZ+oSTxogFQgkTtFndEtJIPNmml7ExwufBZ9L2/Xyyd5PnOL5UreWe5ZT7IU25DSdykL9p1MLQzmLh2ljSeg==", "requires": { "ansi-html": "0.0.7", "bonjour": "^3.5.0", @@ -14991,31 +14246,31 @@ "debug": "^4.1.1", "del": "^4.1.1", "express": "^4.17.1", - "html-entities": "^1.2.1", + "html-entities": "^1.3.1", "http-proxy-middleware": "0.19.1", "import-local": "^2.0.0", "internal-ip": "^4.3.0", "ip": "^1.1.5", "is-absolute-url": "^3.0.3", "killable": "^1.0.1", - "loglevel": "^1.6.6", + "loglevel": "^1.6.8", "opn": "^5.5.0", "p-retry": "^3.0.1", - "portfinder": "^1.0.25", + "portfinder": "^1.0.26", "schema-utils": "^1.0.0", "selfsigned": "^1.10.7", "semver": "^6.3.0", "serve-index": "^1.9.1", - "sockjs": "0.3.19", + "sockjs": "0.3.20", "sockjs-client": "1.4.0", - "spdy": "^4.0.1", + "spdy": "^4.0.2", "strip-ansi": "^3.0.1", "supports-color": "^6.1.0", "url": "^0.11.0", "webpack-dev-middleware": "^3.7.2", "webpack-log": "^2.0.0", "ws": "^6.2.1", - "yargs": "12.0.5" + "yargs": "^13.3.2" }, "dependencies": { "ansi-regex": { @@ -15047,527 +14302,15 @@ "upath": "^1.1.1" } }, - "cliui": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-4.1.0.tgz", - "integrity": "sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ==", - "requires": { - "string-width": "^2.1.1", - "strip-ansi": "^4.0.0", - "wrap-ansi": "^2.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" - }, - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "requires": { - "ansi-regex": "^3.0.0" - } - } - } - }, - "find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", - "requires": { - "locate-path": "^3.0.0" - } - }, "fsevents": { - "version": "1.2.12", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.12.tgz", - "integrity": "sha512-Ggd/Ktt7E7I8pxZRbGIs7vwqAPscSESMrCSkx2FtWeqmheJgCo2R74fTsZFCifr0VTPwqRpPv17+6b8Zp7th0Q==", + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.13.tgz", + "integrity": "sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==", "optional": true, "requires": { - "nan": "^2.12.1", - "node-pre-gyp": "*" - }, - "dependencies": { - "abbrev": { - "version": "1.1.1", - "bundled": true, - "optional": true - }, - "ansi-regex": { - "version": "2.1.1", - "bundled": true, - "optional": true - }, - "aproba": { - "version": "1.2.0", - "bundled": true, - "optional": true - }, - "are-we-there-yet": { - "version": "1.1.5", - "bundled": true, - "optional": true, - "requires": { - "delegates": "^1.0.0", - "readable-stream": "^2.0.6" - } - }, - "balanced-match": { - "version": "1.0.0", - "bundled": true, - "optional": true - }, - "brace-expansion": { - "version": "1.1.11", - "bundled": true, - "optional": true, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "chownr": { - "version": "1.1.4", - "bundled": true, - "optional": true - }, - "code-point-at": { - "version": "1.1.0", - "bundled": true, - "optional": true - }, - "concat-map": { - "version": "0.0.1", - "bundled": true, - "optional": true - }, - "console-control-strings": { - "version": "1.1.0", - "bundled": true, - "optional": true - }, - "core-util-is": { - "version": "1.0.2", - "bundled": true, - "optional": true - }, - "debug": { - "version": "3.2.6", - "bundled": true, - "optional": true, - "requires": { - "ms": "^2.1.1" - } - }, - "deep-extend": { - "version": "0.6.0", - "bundled": true, - "optional": true - }, - "delegates": { - "version": "1.0.0", - "bundled": true, - "optional": true - }, - "detect-libc": { - "version": "1.0.3", - "bundled": true, - "optional": true - }, - "fs-minipass": { - "version": "1.2.7", - "bundled": true, - "optional": true, - "requires": { - "minipass": "^2.6.0" - } - }, - "fs.realpath": { - "version": "1.0.0", - "bundled": true, - "optional": true - }, - "gauge": { - "version": "2.7.4", - "bundled": true, - "optional": true, - "requires": { - "aproba": "^1.0.3", - "console-control-strings": "^1.0.0", - "has-unicode": "^2.0.0", - "object-assign": "^4.1.0", - "signal-exit": "^3.0.0", - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1", - "wide-align": "^1.1.0" - } - }, - "glob": { - "version": "7.1.6", - "bundled": true, - "optional": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "has-unicode": { - "version": "2.0.1", - "bundled": true, - "optional": true - }, - "iconv-lite": { - "version": "0.4.24", - "bundled": true, - "optional": true, - "requires": { - "safer-buffer": ">= 2.1.2 < 3" - } - }, - "ignore-walk": { - "version": "3.0.3", - "bundled": true, - "optional": true, - "requires": { - "minimatch": "^3.0.4" - } - }, - "inflight": { - "version": "1.0.6", - "bundled": true, - "optional": true, - "requires": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "inherits": { - "version": "2.0.4", - "bundled": true, - "optional": true - }, - "ini": { - "version": "1.3.5", - "bundled": true, - "optional": true - }, - "is-fullwidth-code-point": { - "version": "1.0.0", - "bundled": true, - "optional": true, - "requires": { - "number-is-nan": "^1.0.0" - } - }, - "isarray": { - "version": "1.0.0", - "bundled": true, - "optional": true - }, - "minimatch": { - "version": "3.0.4", - "bundled": true, - "optional": true, - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "minimist": { - "version": "1.2.5", - "bundled": true, - "optional": true - }, - "minipass": { - "version": "2.9.0", - "bundled": true, - "optional": true, - "requires": { - "safe-buffer": "^5.1.2", - "yallist": "^3.0.0" - } - }, - "minizlib": { - "version": "1.3.3", - "bundled": true, - "optional": true, - "requires": { - "minipass": "^2.9.0" - } - }, - "mkdirp": { - "version": "0.5.3", - "bundled": true, - "optional": true, - "requires": { - "minimist": "^1.2.5" - } - }, - "ms": { - "version": "2.1.2", - "bundled": true, - "optional": true - }, - "needle": { - "version": "2.3.3", - "bundled": true, - "optional": true, - "requires": { - "debug": "^3.2.6", - "iconv-lite": "^0.4.4", - "sax": "^1.2.4" - } - }, - "node-pre-gyp": { - "version": "0.14.0", - "bundled": true, - "optional": true, - "requires": { - "detect-libc": "^1.0.2", - "mkdirp": "^0.5.1", - "needle": "^2.2.1", - "nopt": "^4.0.1", - "npm-packlist": "^1.1.6", - "npmlog": "^4.0.2", - "rc": "^1.2.7", - "rimraf": "^2.6.1", - "semver": "^5.3.0", - "tar": "^4.4.2" - } - }, - "nopt": { - "version": "4.0.3", - "bundled": true, - "optional": true, - "requires": { - "abbrev": "1", - "osenv": "^0.1.4" - } - }, - "npm-bundled": { - "version": "1.1.1", - "bundled": true, - "optional": true, - "requires": { - "npm-normalize-package-bin": "^1.0.1" - } - }, - "npm-normalize-package-bin": { - "version": "1.0.1", - "bundled": true, - "optional": true - }, - "npm-packlist": { - "version": "1.4.8", - "bundled": true, - "optional": true, - "requires": { - "ignore-walk": "^3.0.1", - "npm-bundled": "^1.0.1", - "npm-normalize-package-bin": "^1.0.1" - } - }, - "npmlog": { - "version": "4.1.2", - "bundled": true, - "optional": true, - "requires": { - "are-we-there-yet": "~1.1.2", - "console-control-strings": "~1.1.0", - "gauge": "~2.7.3", - "set-blocking": "~2.0.0" - } - }, - "number-is-nan": { - "version": "1.0.1", - "bundled": true, - "optional": true - }, - "object-assign": { - "version": "4.1.1", - "bundled": true, - "optional": true - }, - "once": { - "version": "1.4.0", - "bundled": true, - "optional": true, - "requires": { - "wrappy": "1" - } - }, - "os-homedir": { - "version": "1.0.2", - "bundled": true, - "optional": true - }, - "os-tmpdir": { - "version": "1.0.2", - "bundled": true, - "optional": true - }, - "osenv": { - "version": "0.1.5", - "bundled": true, - "optional": true, - "requires": { - "os-homedir": "^1.0.0", - "os-tmpdir": "^1.0.0" - } - }, - "path-is-absolute": { - "version": "1.0.1", - "bundled": true, - "optional": true - }, - "process-nextick-args": { - "version": "2.0.1", - "bundled": true, - "optional": true - }, - "rc": { - "version": "1.2.8", - "bundled": true, - "optional": true, - "requires": { - "deep-extend": "^0.6.0", - "ini": "~1.3.0", - "minimist": "^1.2.0", - "strip-json-comments": "~2.0.1" - } - }, - "readable-stream": { - "version": "2.3.7", - "bundled": true, - "optional": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "rimraf": { - "version": "2.7.1", - "bundled": true, - "optional": true, - "requires": { - "glob": "^7.1.3" - } - }, - "safe-buffer": { - "version": "5.1.2", - "bundled": true, - "optional": true - }, - "safer-buffer": { - "version": "2.1.2", - "bundled": true, - "optional": true - }, - "sax": { - "version": "1.2.4", - "bundled": true, - "optional": true - }, - "semver": { - "version": "5.7.1", - "bundled": true, - "optional": true - }, - "set-blocking": { - "version": "2.0.0", - "bundled": true, - "optional": true - }, - "signal-exit": { - "version": "3.0.2", - "bundled": true, - "optional": true - }, - "string-width": { - "version": "1.0.2", - "bundled": true, - "optional": true, - "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" - } - }, - "string_decoder": { - "version": "1.1.1", - "bundled": true, - "optional": true, - "requires": { - "safe-buffer": "~5.1.0" - } - }, - "strip-ansi": { - "version": "3.0.1", - "bundled": true, - "optional": true, - "requires": { - "ansi-regex": "^2.0.0" - } - }, - "strip-json-comments": { - "version": "2.0.1", - "bundled": true, - "optional": true - }, - "tar": { - "version": "4.4.13", - "bundled": true, - "optional": true, - "requires": { - "chownr": "^1.1.1", - "fs-minipass": "^1.2.5", - "minipass": "^2.8.6", - "minizlib": "^1.2.1", - "mkdirp": "^0.5.0", - "safe-buffer": "^5.1.2", - "yallist": "^3.0.3" - } - }, - "util-deprecate": { - "version": "1.0.2", - "bundled": true, - "optional": true - }, - "wide-align": { - "version": "1.1.3", - "bundled": true, - "optional": true, - "requires": { - "string-width": "^1.0.2 || 2" - } - }, - "wrappy": { - "version": "1.0.2", - "bundled": true, - "optional": true - }, - "yallist": { - "version": "3.1.1", - "bundled": true, - "optional": true - } + "nan": "^2.12.1" } }, - "get-caller-file": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz", - "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==" - }, "glob-parent": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", @@ -15600,46 +14343,11 @@ "binary-extensions": "^1.0.0" } }, - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" - }, - "locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", - "requires": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - } - }, "normalize-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==" }, - "p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "requires": { - "p-try": "^2.0.0" - } - }, - "p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", - "requires": { - "p-limit": "^2.0.0" - } - }, - "p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==" - }, "readdirp": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", @@ -15650,11 +14358,6 @@ "readable-stream": "^2.0.2" } }, - "require-main-filename": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", - "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=" - }, "schema-utils": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", @@ -15665,30 +14368,6 @@ "ajv-keywords": "^3.1.0" } }, - "string-width": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", - "requires": { - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^4.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" - }, - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "requires": { - "ansi-regex": "^3.0.0" - } - } - } - }, "strip-ansi": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", @@ -15705,35 +14384,6 @@ "has-flag": "^3.0.0" } }, - "wrap-ansi": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", - "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", - "requires": { - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1" - }, - "dependencies": { - "is-fullwidth-code-point": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", - "requires": { - "number-is-nan": "^1.0.0" - } - }, - "string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", - "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" - } - } - } - }, "ws": { "version": "6.2.1", "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.1.tgz", @@ -15741,34 +14391,6 @@ "requires": { "async-limiter": "~1.0.0" } - }, - "yargs": { - "version": "12.0.5", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-12.0.5.tgz", - "integrity": "sha512-Lhz8TLaYnxq/2ObqHDql8dX8CJi97oHxrjUcYtzKbbykPtVW9WB+poxI+NM2UIzsMgNCZTIf0AQwsjK5yMAqZw==", - "requires": { - "cliui": "^4.0.0", - "decamelize": "^1.2.0", - "find-up": "^3.0.0", - "get-caller-file": "^1.0.1", - "os-locale": "^3.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": "^11.1.1" - } - }, - "yargs-parser": { - "version": "11.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-11.1.1.tgz", - "integrity": "sha512-C6kB/WJDiaxONLJQnF8ccx9SEeoTTLek8RVbaOIsrAUS8VrBEXfmeSnCZxygc+XC2sNMBIwOOnfcxiynjHsVSQ==", - "requires": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - } } } }, @@ -15814,19 +14436,17 @@ } }, "websocket-driver": { - "version": "0.7.3", - "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.3.tgz", - "integrity": "sha512-bpxWlvbbB459Mlipc5GBzzZwhoZgGEZLuqPaR0INBGnPAY1vdBX6hPnoFXiw+3yWxDuHyQjO2oXTMyS8A5haFg==", + "version": "0.6.5", + "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.6.5.tgz", + "integrity": "sha1-XLJVbOuF9Dc8bYI4qmkchFThOjY=", "requires": { - "http-parser-js": ">=0.4.0 <0.4.11", - "safe-buffer": ">=5.1.0", "websocket-extensions": ">=0.1.1" } }, "websocket-extensions": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.3.tgz", - "integrity": "sha512-nqHUnMXmBzT0w570r2JpJxfiSD1IzoI+HGVdd3aZ0yNi3ngvQ4jv1dtHt5VGxfI2yj5yqImPhOK4vmIh2xMbGg==" + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz", + "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==" }, "whatwg-encoding": { "version": "1.0.5", @@ -16190,27 +14810,9 @@ "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" }, "yaml": { - "version": "1.9.2", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.9.2.tgz", - "integrity": "sha512-HPT7cGGI0DuRcsO51qC1j9O16Dh1mZ2bnXwsi0jrSpsLz0WxOLSLXfkABVl6bZO629py3CU+OMJtpNHDLB97kg==", - "requires": { - "@babel/runtime": "^7.9.2" - }, - "dependencies": { - "@babel/runtime": { - "version": "7.9.2", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.9.2.tgz", - "integrity": "sha512-NE2DtOdufG7R5vnfQUTehdTfNycfUANEtCa9PssN9O/xmTzP4E08UI797ixaei6hBEVL9BI/PsdJS5x7mWoB9Q==", - "requires": { - "regenerator-runtime": "^0.13.4" - } - }, - "regenerator-runtime": { - "version": "0.13.5", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.5.tgz", - "integrity": "sha512-ZS5w8CpKFinUzOwW3c83oPeVXoNsrLsaCoLtJvAClH135j/R77RuymhiSErhm2lKcwSCIpmvIWSbDkIfAqKQlA==" - } - } + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.0.tgz", + "integrity": "sha512-yr2icI4glYaNG+KWONODapy2/jDdMSDnrONSjblABjD9B4Z5LgiircSt8m8sRZFNi08kG9Sm0uSHtEmP3zaEGg==" }, "yargs": { "version": "13.3.2", diff --git a/package.json b/package.json index acf1e4a..dcc18c3 100644 --- a/package.json +++ b/package.json @@ -7,15 +7,15 @@ "@fortawesome/free-solid-svg-icons": "^5.14.0", "@fortawesome/react-fontawesome": "^0.1.11", "babel-runtime": "^6.26.0", - "bootstrap": "^4.5.0", + "bootstrap": "^4.5.2", "classnames": "^2.2.6", - "d3-array": "^2.4.0", + "d3-array": "^2.6.0", "d3-axis": "^1.0.12", - "d3-scale": "^3.2.1", + "d3-scale": "^3.2.2", "d3-scale-chromatic": "^1.5.0", - "d3-selection": "^1.4.1", + "d3-selection": "^1.4.2", "d3-shape": "^1.3.7", - "d3-time-format": "^2.2.3", + "d3-time-format": "^2.3.0", "es6-promise": "^4.2.8", "file-saver": "^2.0.2", "flux": "^3.1.3", @@ -24,7 +24,7 @@ "jquery": "^3.5.1", "jszip": "^3.5.0", "libcimsvg": "git+https://git.rwth-aachen.de/acs/public/cim/pintura-npm-package.git", - "lodash": "^4.17.19", + "lodash": "^4.17.20", "moment": "^2.27.0", "multiselect-react-dropdown": "^1.5.7", "node-sass": "^4.14.1", @@ -32,7 +32,7 @@ "prop-types": "^15.7.2", "rc-slider": "^9.3.1", "react": "^16.13.1", - "react-bootstrap": "^1.2.2", + "react-bootstrap": "^1.3.0", "react-collapse": "^5.0.1", "react-contexify": "^4.1.1", "react-d3": "^0.4.0", @@ -43,10 +43,10 @@ "react-grid-system": "^6.4.2", "react-json-view": "^1.19.1", "react-notification-system": "^0.3.0", - "react-rnd": "^10.1.10", + "react-rnd": "^10.2.2", "react-router": "^5.2.0", "react-router-dom": "^5.2.0", - "react-scripts": "^3.4.1", + "react-scripts": "^3.4.3", "react-svg-pan-zoom": "^3.8.0", "sass": "^1.26.10", "superagent": "^5.3.1", From 8a6de4b8cf082bc9db62bd92cecc8a8bee4681f9 Mon Sep 17 00:00:00 2001 From: Sonja Happ Date: Mon, 24 Aug 2020 10:00:00 +0200 Subject: [PATCH 327/391] Check if ICs are already loaded before attempting to open websockets --- src/dashboard/dashboard.js | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/src/dashboard/dashboard.js b/src/dashboard/dashboard.js index ff3c135..d0708d8 100644 --- a/src/dashboard/dashboard.js +++ b/src/dashboard/dashboard.js @@ -169,16 +169,19 @@ class Dashboard extends Component { componentDidUpdate(prevProps: Readonly

    , prevState: Readonly, snapshot: SS) { // open web sockets if ICs are already known and sockets are not opened yet - if(!Dashboard.webSocketsOpened && this.state.ics.length > 0){ - console.log("Starting to open IC websockets:", this.state.ics); - AppDispatcher.dispatch({ - type: 'ics/open-sockets', - data: this.state.ics - }); + if(this.state.ics !== undefined && !Dashboard.webSocketsOpened){ + if(this.state.ics.length > 0){ + console.log("Starting to open IC websockets:", this.state.ics); + AppDispatcher.dispatch({ + type: 'ics/open-sockets', + data: this.state.ics + }); - Dashboard.webSocketsOpened = true; + Dashboard.webSocketsOpened = true; + } } + if(prevState.dashboard === undefined && this.state.dashboard !== undefined){ // the dashboard was loaded, so that the scenarioID is available From 536e87d29aa033a268c89410d1bdbb1eb291a468 Mon Sep 17 00:00:00 2001 From: Sonja Happ Date: Mon, 24 Aug 2020 10:01:32 +0200 Subject: [PATCH 328/391] remove some todos, fix error with notification (no host param provided) --- src/ic/ic-store.js | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/src/ic/ic-store.js b/src/ic/ic-store.js index 878fb4b..d653adf 100644 --- a/src/ic/ic-store.js +++ b/src/ic/ic-store.js @@ -42,19 +42,16 @@ class InfrastructureComponentStore extends ArrayStore { return super.reduce(state, action); case 'ics/open-sockets': // open websocket for each IC contained in array action.data - // TODO should be done when dashboard is loaded - // TODO action.data should contain only those IC used by the scenario + // action.data contains only those IC used by the scenario for (let ic of action.data) { if (ic.host != null && ic.host !== '') { - // TODO connection should be closed again when dashboard is closed - ICDataDataManager.open(ic.host, ic.id); } else { // TODO add to pool of notifications const IC_WEBSOCKET_HOST_ERROR = { - title: 'Host of websocket not available', - message: action.error.response.body.message, + title: 'Websocket connection warning', + message: "Websocket host parameter not available for IC " + ic.name + "(" + ic.uuid + "), connection not possible", level: 'warning' }; NotificationsDataManager.addNotification(IC_WEBSOCKET_HOST_ERROR); From 73c8f1733f1350657a05e46e9537806c54950990 Mon Sep 17 00:00:00 2001 From: Sonja Happ Date: Mon, 24 Aug 2020 10:21:09 +0200 Subject: [PATCH 329/391] set state of websockets to unopened upon dashboard mount --- src/dashboard/dashboard.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/dashboard/dashboard.js b/src/dashboard/dashboard.js index d0708d8..426b982 100644 --- a/src/dashboard/dashboard.js +++ b/src/dashboard/dashboard.js @@ -152,6 +152,8 @@ class Dashboard extends Component { componentDidMount() { + Dashboard.webSocketsOpened = false; + // load widgets of dashboard AppDispatcher.dispatch({ type: 'widgets/start-load', From 9d8e9c4364c60a72dda97ee021a583961e40f1c6 Mon Sep 17 00:00:00 2001 From: Sonja Happ Date: Mon, 31 Aug 2020 09:36:32 +0200 Subject: [PATCH 330/391] Fixes a bug in editing component configurations (closes #252, closes #257) --- src/componentconfig/edit-config.js | 259 ++++++++++++++++------------- src/scenario/scenario.js | 6 +- 2 files changed, 141 insertions(+), 124 deletions(-) diff --git a/src/componentconfig/edit-config.js b/src/componentconfig/edit-config.js index 2e277b1..51c4761 100644 --- a/src/componentconfig/edit-config.js +++ b/src/componentconfig/edit-config.js @@ -22,142 +22,163 @@ import Dialog from '../common/dialogs/dialog'; import ParametersEditor from '../common/parameters-editor'; class EditConfigDialog extends React.Component { - valid = false; + valid = false; - constructor(props) { - super(props); + constructor(props) { + super(props); + this.state = { + name: '', + icID: '', + startParameters: {}, + selectedFiles: [] // list of selected files {name, id}, this is not the fileIDs list of the config! + }; + } - this.state = { - name: '', - icID: '', - configuration: null, - startParameters: this.props.config.startParameters, - fileIDs: this.props.config.fileIDs - - }; - } - - - onClose(canceled) { - if (canceled === false) { - if (this.valid) { - let data = this.props.config; - if (this.state.name !== '' && this.props.config.name !== this.state.name) { - data.name = this.state.name; - } - if (this.state.icID !== '' && this.props.config.icID !== parseInt(this.state.icID)) { - data.icID = parseInt(this.state.icID, 10); - } - if(this.state.startParameters !== {} && JSON.stringify(this.props.config.startParameters) !== JSON.stringify(this.state.startParameters)){ - data.startParameters = this.state.startParameters; - } - - let IDs = [] - for(let e of this.state.fileIDs){ - IDs.push(e.id) - } - if (JSON.stringify(IDs) !== JSON.stringify(this.props.config.fileIDs)){ - data.fileIDs = IDs; - } - - //forward modified config to callback function - this.props.onClose(data) - } - } else { - this.props.onClose(); + onClose(canceled) { + if (canceled === false) { + if (this.valid) { + let data = this.props.config; + if (this.state.name !== '' && this.props.config.name !== this.state.name) { + data.name = this.state.name; + } + if (this.state.icID !== '' && this.props.config.icID !== parseInt(this.state.icID)) { + data.icID = parseInt(this.state.icID, 10); + } + if(this.state.startParameters !== {} && + JSON.stringify(this.props.config.startParameters) !== JSON.stringify(this.state.startParameters)){ + data.startParameters = this.state.startParameters; } - } - handleChange(e) { - this.setState({ [e.target.id]: e.target.value }); - this.valid = this.isValid() - } + let IDs = [] + for(let e of this.state.selectedFiles){ + IDs.push(e.id) + } + if (JSON.stringify(IDs) !== JSON.stringify(this.props.config.fileIDs)){ + data.fileIDs = IDs; + } - handleParameterChange(data) { - if (data) { - this.setState({startParameters: data}); + //forward modified config to callback function + this.props.onClose(data) } - - - this.valid = this.isValid() + } else { + this.props.onClose(); } + } - onFileSelect(selectedList, selectedItem) { + handleChange(e) { + this.setState({ [e.target.id]: e.target.value }); + this.valid = this.isValid() + } - this.setState({ - fileIDs: selectedList - }) - this.valid = this.isValid() + handleParameterChange(data) { + if (data) { + this.setState({startParameters: data}); } + this.valid = this.isValid() + } - onFileRemove(selectedList, removedItem) { + onFileChange(selectedList, changedItem) { + this.setState({ + selectedFiles: selectedList + }) + this.valid = this.isValid() + } - this.setState({ - fileIDs: selectedList - }) - this.valid = this.isValid() - } - isValid() { - // input is valid if at least one element has changed from its initial value - return this.state.name !== '' - || this.state.icID !== '' - || this.state.startParameters !== {} - || this.state.configuration != null - } + isValid() { + // input is valid if at least one element has changed from its initial value + return this.state.name !== '' + || this.state.icID !== '' + || this.state.startParameters !== {} + } - resetState() { - //this.setState({}); - } + resetState() { - render() { - const ICOptions = this.props.ics.map(s => - - ); - - let configFileOptions = []; - for(let file of this.props.files) { - configFileOptions.push( - {name: file.name, id: file.id} - ); + // determine list of selected files incl id and filename + let selectedFiles = [] + for(let selectedFileID of this.props.config.fileIDs){ + for (let file of this.props.files){ + if (file.id === selectedFileID){ + selectedFiles.push({name: file.name, id: file.id}) + } } - - - - return ( -

    this.onClose(c)} onReset={() => this.resetState()} valid={this.valid}> - - - Name - this.handleChange(e)} /> - - - - - Infrastructure Component - this.handleChange(e)}> - {ICOptions} - - - - this.onFileSelect(selectedList, selectedItem)} - onRemove={(selectedList, removedItem) => this.onFileRemove(selectedList, removedItem)} - displayValue={'name'} - placeholder={'Select file(s)...'} - /> - - - Start Parameters - this.handleParameterChange(data)} /> - - - - ); } + + this.setState({ + name: this.props.config.name, + icID: this.props.config.icID, + startParameters: this.props.config.startParameters, + selectedFiles: selectedFiles, + }); + } + + + render() { + const ICOptions = this.props.ics.map(s => + + ); + + let configFileOptions = []; + for(let file of this.props.files) { + configFileOptions.push( + {name: file.name, id: file.id} + ); + } + + return ( + this.onClose(c)} + onReset={() => this.resetState()} + valid={this.valid} + > +
    + + Name + this.handleChange(e)} + /> + + + + + Infrastructure Component + this.handleChange(e)} + > + {ICOptions} + + + + this.onFileChange(selectedList, selectedItem)} + onRemove={(selectedList, removedItem) => this.onFileChange(selectedList, removedItem)} + displayValue={'name'} + placeholder={'Select file(s)...'} + /> + + + Start Parameters + this.handleParameterChange(data)} + /> + + +
    + ); + } } export default EditConfigDialog; diff --git a/src/scenario/scenario.js b/src/scenario/scenario.js index fcd1300..564f63c 100644 --- a/src/scenario/scenario.js +++ b/src/scenario/scenario.js @@ -90,7 +90,7 @@ class Scenario extends React.Component { deleteConfigModal: false, importConfigModal: false, - editConfigModal: false, + editConfigModal: prevState.editConfigModal || false, modalConfigData: (prevState.modalConfigData !== {} && prevState.modalConfigData !== undefined )? prevState.modalConfigData : {}, selectedConfigs: [], modalConfigIndex: 0, @@ -453,10 +453,6 @@ class Scenario extends React.Component { } } } - - - - return fileList; } From 444a3c29ef94def37c66d43b054b3e71c2f0a713 Mon Sep 17 00:00:00 2001 From: Sonja Happ Date: Mon, 31 Aug 2020 09:51:21 +0200 Subject: [PATCH 331/391] Fixing a bug for component configs edit (no files selected before) --- src/componentconfig/edit-config.js | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/src/componentconfig/edit-config.js b/src/componentconfig/edit-config.js index 51c4761..2277331 100644 --- a/src/componentconfig/edit-config.js +++ b/src/componentconfig/edit-config.js @@ -53,8 +53,13 @@ class EditConfigDialog extends React.Component { for(let e of this.state.selectedFiles){ IDs.push(e.id) } - if (JSON.stringify(IDs) !== JSON.stringify(this.props.config.fileIDs)){ - data.fileIDs = IDs; + if(this.props.config.fileIDs !== null && this.props.config.fileIDs !== undefined) { + if (JSON.stringify(IDs) !== JSON.stringify(this.props.config.fileIDs)) { + data.fileIDs = IDs; + } + } + else{ + data.fileIDs = IDs } //forward modified config to callback function @@ -96,10 +101,12 @@ class EditConfigDialog extends React.Component { // determine list of selected files incl id and filename let selectedFiles = [] - for(let selectedFileID of this.props.config.fileIDs){ - for (let file of this.props.files){ - if (file.id === selectedFileID){ - selectedFiles.push({name: file.name, id: file.id}) + if(this.props.config.fileIDs !== null && this.props.config.fileIDs !== undefined) { + for (let selectedFileID of this.props.config.fileIDs) { + for (let file of this.props.files) { + if (file.id === selectedFileID) { + selectedFiles.push({name: file.name, id: file.id}) + } } } } From 7d32fa05f313f0ea750c2989d65de84ff3df8958 Mon Sep 17 00:00:00 2001 From: Sonja Happ Date: Mon, 31 Aug 2020 12:31:13 +0200 Subject: [PATCH 332/391] Attempting to fix fluctuating behavior of value widget --- src/widget/widgets/value.js | 17 +++++++---------- 1 file changed, 7 insertions(+), 10 deletions(-) diff --git a/src/widget/widgets/value.js b/src/widget/widgets/value.js index 22a1629..029192b 100644 --- a/src/widget/widgets/value.js +++ b/src/widget/widgets/value.js @@ -23,7 +23,7 @@ class WidgetValue extends Component { super(props); this.state = { - value: '', + value: NaN, unit: '', scalingFactor: 1.0 }; @@ -42,13 +42,12 @@ class WidgetValue extends Component { let icID = props.icIDs[signal[0].id]; // check if data available - let value = '' + let value = NaN if (props.data == null || props.data[icID] == null || props.data[icID].output == null || props.data[icID].output.values == null) { - value = ''; + // no data } else { - // check if value has changed const data = props.data[icID].output.values[signal[0].index - 1]; - if (data != null && Number(state.value) !== data[data.length - 1].y) { + if (data != null) { value = signal[0].scalingFactor * data[data.length - 1].y; } } @@ -56,10 +55,8 @@ class WidgetValue extends Component { // Update unit (assuming there is exactly one signal for this widget) let unit = ''; let scalingFactor = '' - if (signal !== undefined) { - unit = signal[0].unit; - scalingFactor = signal[0].scalingFactor - } + unit = signal[0].unit; + scalingFactor = signal[0].scalingFactor return { value: value, @@ -73,7 +70,7 @@ class WidgetValue extends Component { } render() { - let value_to_render = Number(this.state.value); + let value_to_render = this.state.value; let value_width = this.props.widget.customProperties.textSize*(Math.abs(value_to_render) < 1000 ? (5):(8)); let unit_width = this.props.widget.customProperties.textSize*(this.state.unit.length + 0.7); const showScalingFactor = (this.state.scalingFactor !== 1); From ddd4b29f1f20918f0d015b750ab3b8927e0f33a3 Mon Sep 17 00:00:00 2001 From: Sonja Happ Date: Mon, 31 Aug 2020 13:48:04 +0200 Subject: [PATCH 333/391] Improving user handling of ICs, use localStorage instead of LoginStore to get current user #259 --- src/ic/ics.js | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-) diff --git a/src/ic/ics.js b/src/ic/ics.js index 8ab77a3..43101d2 100644 --- a/src/ic/ics.js +++ b/src/ic/ics.js @@ -24,7 +24,6 @@ import moment from 'moment' import AppDispatcher from '../common/app-dispatcher'; import InfrastructureComponentStore from './ic-store'; -import LoginStore from '../user/login-store'; import Icon from '../common/icon'; import Table from '../common/table'; @@ -38,7 +37,7 @@ import DeleteDialog from '../common/dialogs/delete-dialog'; class InfrastructureComponents extends Component { static getStores() { - return [ LoginStore, InfrastructureComponentStore ]; + return [ InfrastructureComponentStore ]; } static statePrio(state) { @@ -73,16 +72,14 @@ class InfrastructureComponents extends Component { return a.stateUpdatedAt < b.stateUpdatedAt; } }); - const currentUser = LoginStore.getState().currentUser; return { sessionToken: localStorage.getItem("token"), ics: ics, modalIC: {}, deleteModal: false, - selectedICs: [], - currentUser: currentUser + currentUser: JSON.parse(localStorage.getItem("currentUser")) }; } @@ -284,7 +281,7 @@ class InfrastructureComponents extends Component { {/* */} this.stateUpdateModifier(stateUpdateAt)} /> - {this.state.currentUser.role === "Admin" ? + {this.state.currentUser.role === "Admin" ? this.setState({ editModal: true, modalIC: this.state.ics[index], modalIndex: index })} onExport={index => this.exportIC(index)} onDelete={index => this.setState({ deleteModal: true, modalIC: this.state.ics[index], modalIndex: index })} - /> + /> : this.exportIC(index)} - /> + /> } {this.state.currentUser.role === "Admin" ? From 969905bc6334946da24ecd4b4944d880664e2151 Mon Sep 17 00:00:00 2001 From: Sonja Happ Date: Mon, 31 Aug 2020 13:53:05 +0200 Subject: [PATCH 334/391] cast NaN to string in value widget --- src/widget/widgets/value.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/widget/widgets/value.js b/src/widget/widgets/value.js index 029192b..e83c06f 100644 --- a/src/widget/widgets/value.js +++ b/src/widget/widgets/value.js @@ -77,7 +77,7 @@ class WidgetValue extends Component { return (
    {this.props.widget.name} - {Number.isNaN(value_to_render) ? NaN : format('.3f')(value_to_render)} + {Number.isNaN(value_to_render) ? String(NaN) : format('.3f')(value_to_render)} {this.props.widget.customProperties.showUnit && [{this.state.unit}] } From d644854e1f328600721cbb59146a9636a779e50c Mon Sep 17 00:00:00 2001 From: irismarie Date: Tue, 1 Sep 2020 16:56:33 +0200 Subject: [PATCH 335/391] display line widget properly, fixes #206 --- src/styles/widgets.css | 13 +---- src/widget/editable-widget-container.js | 62 ++++++++++++++++---- src/widget/widget-factory.js | 5 +- src/widget/widgets/line.js | 78 +++++++++++++++++++++---- 4 files changed, 123 insertions(+), 35 deletions(-) diff --git a/src/styles/widgets.css b/src/styles/widgets.css index 78996ab..7919fe3 100644 --- a/src/styles/widgets.css +++ b/src/styles/widgets.css @@ -394,15 +394,4 @@ div[class*="-widget"] label { height: 100%; border: 2px solid lightgray; } -/* End box widget */ - -/* Begin line widget */ -.line-widget { - width: 100%; - height: 1%; - border: 2px solid red; - transform: rotate(0deg); -} - - -/* End line widget */ +/* End box widget */ \ No newline at end of file diff --git a/src/widget/editable-widget-container.js b/src/widget/editable-widget-container.js index 91f691d..b5fb964 100644 --- a/src/widget/editable-widget-container.js +++ b/src/widget/editable-widget-container.js @@ -47,7 +47,7 @@ class EditableWidgetContainer extends React.Component { if (widget.x !== data.x || widget.y !== data.y) { - this.rnd.updatePosition({ x: widget.x, y: widget.y}); + this.rnd.updatePosition({ x: widget.x, y: widget.y }); } if (this.props.onWidgetChange != null) { @@ -55,7 +55,7 @@ class EditableWidgetContainer extends React.Component { } }; - resizeStop = (event, direction, ref,delta, position) => { + resizeStop = (event, direction, ref, delta, position) => { const widget = this.props.widget; // resize depends on direction @@ -73,19 +73,40 @@ class EditableWidgetContainer extends React.Component { if (this.props.onWidgetChange != null) { this.props.onWidgetChange(widget, this.props.index); } + + /* hand over new dimensions to child element so that the rotation is displayed correctly + * already before the dashboard changes are saved + */ + if (this.props.widget.type === 'Line') { + this.refs.child0.illustrateDuringEdit(widget.width, widget.height); + } }; render() { const widget = this.props.widget; + let isLine = false; + let children = null; + + // clone WidgetLine child element so that it can be referenced while resizing + if (widget.type === 'Line') { + isLine = true; + + children = React.Children.map(this.props.children, + (child, index) => React.cloneElement(child, { + ref: `child${index}` + }) + ); + } + let resizingRestricted = false; - if(widget.customProperties.resizeRightLeftLock || widget.customProperties.resizeTopBottomLock){ + if (widget.customProperties.resizeRightLeftLock || widget.customProperties.resizeTopBottomLock) { resizingRestricted = true; } - + const resizing = { bottom: !(widget.customProperties.resizeTopBottomLock || widget.isLocked), - bottomLeft: !(resizingRestricted|| widget.isLocked), + bottomLeft: !(resizingRestricted || widget.isLocked), bottomRight: !(resizingRestricted || widget.isLocked), left: !(widget.customProperties.resizeRightLeftLock || widget.isLocked), right: !(widget.customProperties.resizeRightLeftLock || widget.isLocked), @@ -94,19 +115,42 @@ class EditableWidgetContainer extends React.Component { topRight: !(resizingRestricted || widget.isLocked) }; - const gridArray = [ this.props.grid, this.props.grid ]; + const gridArray = [this.props.grid, this.props.grid]; const widgetClasses = classNames({ 'editing-widget': true, 'locked': widget.isLocked }); + if (isLine) { + return { this.rnd = c; }} + default={{ x: Number(widget.x), y: Number(widget.y), width: widget.width, height: widget.height }} + minWidth={widget.minWidth} + minHeight={widget.minHeight} + maxWidth={widget.customProperties.maxWidth || '100%'} + lockAspectRatio={Boolean(widget.customProperties.lockAspect)} + bounds={'parent'} + className={widgetClasses} + onResizeStart={this.borderWasClicked} + onResizeStop={this.resizeStop} + onDragStop={this.dragStop} + dragGrid={gridArray} + resizeGrid={gridArray} + zindex={widget.z} + enableResizing={resizing} + disableDragging={widget.isLocked} + > + {children} + ; + } + return { this.rnd = c; }} default={{ x: Number(widget.x), y: Number(widget.y), width: widget.width, height: widget.height }} minWidth={widget.minWidth} minHeight={widget.minHeight} - maxWidth ={widget.customProperties.maxWidth || '100%' } + maxWidth={widget.customProperties.maxWidth || '100%'} lockAspectRatio={Boolean(widget.customProperties.lockAspect)} bounds={'parent'} className={widgetClasses} @@ -119,9 +163,7 @@ class EditableWidgetContainer extends React.Component { enableResizing={resizing} disableDragging={widget.isLocked} > - - {this.props.children} - + {this.props.children} ; } } diff --git a/src/widget/widget-factory.js b/src/widget/widget-factory.js index 3fe95e6..55e1aaf 100644 --- a/src/widget/widget-factory.js +++ b/src/widget/widget-factory.js @@ -181,11 +181,10 @@ class WidgetFactory { widget.customProperties.file = -1; // ID of file, -1 means non selected break; case 'Line': - widget.height = 30; - widget.width = 150; + widget.height = 100; + widget.width = 100; widget.customProperties.border_color = 0; widget.customProperties.border_width = 2; - widget.customProperties.margin_top = 15; widget.customProperties.rotation = 0; break; diff --git a/src/widget/widgets/line.js b/src/widget/widgets/line.js index 680ca03..242122c 100644 --- a/src/widget/widgets/line.js +++ b/src/widget/widgets/line.js @@ -20,19 +20,77 @@ import React, { Component } from 'react'; import EditWidgetColorControl from '../edit-widget/edit-widget-color-control'; class WidgetLine extends Component { + // WidgetLine is newly created when widget props are changed and saved + constructor(props) { + super(props); + this.illustrateDuringEdit = this.illustrateDuringEdit.bind(this); + + this.state = { + width: 0, + height: 0, + editing: false + } + } + + // needed to update the looks of the line in edit mode + illustrateDuringEdit(newwidth, newheight) { + this.setState({width: newwidth, height: newheight, editing: true}); + } + render() { - const lineStyle = { - borderColor: EditWidgetColorControl.ColorPalette[this.props.widget.customProperties.border_color], - transform: 'rotate(' + this.props.widget.customProperties.rotation + 'deg)', - borderWidth: '' + this.props.widget.customProperties.border_width + 'px' + let rotation = this.props.widget.customProperties.rotation; + let rad = rotation * (Math.PI / 180); + + // get the dimensions either from props (saved widget) + // or from the state (widget in edit mode) + let width = this.props.widget.width; + let height = this.props.widget.height; + + if (this.state.editing) { + width = this.state.width; + height = this.state.height; + } + + // calculate the length of the line + let length = 0; + if (width <= height) { + if (rotation > 0) { + length = width / Math.abs(Math.cos(rad)); + } + else { + length = width + } + } else { // height < width + if (rotation > 0) { + length = height / Math.abs(Math.sin(rad)); + } else { + length = height; + } + } + + // calculate line coordinates (in percent) + const x1 = width * 0.5 - 0.5 * Math.cos(rad) * length; + const x1p = '' + Math.round(100 * x1 / width) + '%'; + + const x2 = width * 0.5 + 0.5 * Math.cos(rad) * length; + const x2p = '' + Math.round(100 * x2/width) + '%'; + + const y1 = height * 0.5 + 0.5 * Math.sin(rad) * length; + const y1p = '' + Math.round(100 * y1/height) + '%'; + + const y2 = height * 0.5 - 0.5 * Math.sin(rad) * length; + const y2p = '' + Math.round(100 * y2/height) + '%'; + + + const lineStyle = { + stroke: EditWidgetColorControl.ColorPalette[this.props.widget.customProperties.border_color], + strokeWidth: '' + this.props.widget.customProperties.border_width + 'px' }; - return ( -
    - { } -
    - ); + return + + ; } } -export default WidgetLine; +export default WidgetLine; \ No newline at end of file From e8fca667dcbbf736e2d4b1003eeb1bc13090a969 Mon Sep 17 00:00:00 2001 From: Laura Fuentes Grau Date: Sun, 13 Sep 2020 13:06:52 +0200 Subject: [PATCH 336/391] WIP: implementing new way to change Gauge colorzones #251 --- src/widget/edit-widget/color-picker.js | 29 +++- .../edit-widget-color-zones-control.js | 151 ++++++++++++++---- src/widget/widgets/gauge.js | 2 +- 3 files changed, 144 insertions(+), 38 deletions(-) diff --git a/src/widget/edit-widget/color-picker.js b/src/widget/edit-widget/color-picker.js index 81a08b2..2861333 100644 --- a/src/widget/edit-widget/color-picker.js +++ b/src/widget/edit-widget/color-picker.js @@ -49,15 +49,23 @@ class ColorPicker extends React.Component { } handleChangeComplete = (color) => { + + let temp = this.state.widget; + + if(this.props.controlId === 'strokeStyle'){ + temp.customProperties.zones[this.props.zoneIndex]['strokeStyle'] = color.hex; + } + else{ let parts = this.props.controlId.split('.'); let isCustomProperty = true; + if (parts.length === 1){ isCustomProperty = false; } - let temp = this.state.widget; isCustomProperty ? temp[parts[0]][parts[1]] = color.hex : temp[this.props.controlId] = color.hex; isCustomProperty ? temp[parts[0]][parts[1] + "_opacity"] = color.rgb.a : temp[this.props.controlId +"_opacity"] = color.rgb.a; + } this.setState({ widget: temp }); }; @@ -78,20 +86,33 @@ class ColorPicker extends React.Component { render() { let disableOpacity = false; + let hexColor; + let opacity = 1; let parts = this.props.controlId.split('.'); let isCustomProperty = true; if (parts.length === 1){ isCustomProperty = false; } - if(this.state.widget.type === "Box" && parts[1] === "border_color"){ + if((this.state.widget.type === "Box" && parts[1] === "border_color") || this.props.controlId === 'strokeStyle'){ disableOpacity = true; } + if(this.props.controlId === 'strokeStyle'){ + if(typeof this.state.widget.customProperties.zones[this.props.zoneIndex] !== 'undefined'){ + hexColor = this.state.widget.customProperties.zones[this.props.zoneIndex]['strokeStyle']; + } + } + else{ + hexColor = isCustomProperty ? this.state.widget[parts[0]][parts[1]]: this.state.widget[this.props.controlId]; + opacity = isCustomProperty ? this.state.widget[parts[0]][parts[1] + "_opacity"]: this.state.widget[this.props.controlId + "_opacity"]; - let hexColor = isCustomProperty ? this.state.widget[parts[0]][parts[1]]: this.state.widget[this.props.controlId]; - let opacity = isCustomProperty ? this.state.widget[parts[0]][parts[1] + "_opacity"]: this.state.widget[this.props.controlId + "_opacity"]; + } + + let rgbColor = this.hexToRgb(hexColor, opacity); + + return this.onClose(c)} valid={true}>
    { // add row const widget = this.state.widget; - widget.customProperties.zones.push({ strokeStyle: 'ffffff', min: 0, max: 100 }); + widget.customProperties.zones.push({ strokeStyle: '#d3cbcb', min: 0, max: 100 }); + + if(widget.customProperties.zones.length > 0){ + let length = widget.customProperties.zones.length + + for(let i= 0 ; i < length; i++){ + widget.customProperties.zones[i].min = i* 100/length; + widget.customProperties.zones[i].max = (i+1)* 100/length; + } + } this.setState({ widget }); @@ -57,11 +70,11 @@ class EditWidgetColorZonesControl extends React.Component { // remove zones const widget = this.state.widget; - this.state.selectedZones.forEach(row => { + /*this.state.selectedZones.forEach(row => { widget.customProperties.zones.splice(row, 1); }); - this.setState({ selectedZones: [], widget }); + this.setState({ selectedZones: [], widget });*/ this.sendEvent(widget); } @@ -83,6 +96,32 @@ class EditWidgetColorZonesControl extends React.Component { this.sendEvent(widget); } + editColorZone = (index) => { + this.setState({selectedZone: this.state.widget.customProperties.zones[index], selectedIndex: index , minValue: this.state.widget.customProperties.zones[index].min, maxValue: this.state.widget.customProperties.zones[index].max}); + + } + + openColorPicker = () =>{ + + let color = this.state.selectedZone.strokeStyle; + + this.setState({showColorPicker: true, originalColor: color}); + } + + closeEditModal = (data) => { + this.setState({showColorPicker: false}) + if(typeof data === 'undefined'){ + + let temp = this.state.selectedZone; + temp.strokeStyle = this.state.originalColor; + + this.setState({ selectedZone : temp }); + } + } + + handleMinMaxChange = () => { + } + sendEvent(widget) { // create event const event = { @@ -95,37 +134,83 @@ class EditWidgetColorZonesControl extends React.Component { this.props.handleChange(event); } - checkedCell = (row, event) => { - // update selected rows - const selectedZones = this.state.selectedZones; - - if (event.target.checked) { - if (selectedZones.indexOf(row) === -1) { - selectedZones.push(row); - } - } else { - let index = selectedZones.indexOf(row); - if (row > -1) { - selectedZones.splice(index, 1); - } - } - - this.setState({ selectedZones }); - } + render() { + + + let tempColor = 'FFFFFF'; + let collapse = false; + if(this.state.selectedZone !== null){ + collapse = true; + tempColor = this.state.selectedZone.strokeStyle; + } + + let pickerStyle = { + backgroundColor: tempColor, + width: '260px', + height: '40px', + marginTop: '20px' + } + return Color zones + - - - - - +
    + { + this.state.widget.customProperties.zones.map((zone, idx) => { + let color = zone.strokeStyle; + let width = (zone.max - zone.min)*(260/100); + let style = { + backgroundColor: color, + width: width, + height: '40px' + } + + + + return ( + ) + } + ) + + } +
    + + Change color} > + + +
    + + + + + +
    + Min: + this.handleMinMaxChange(e)} /> + + Max: + this.handleMinMaxChange(e)} /> +
    - - - + + + this.closeEditModal(data)} widget={this.state.widget} zoneIndex={this.state.selectedIndex} controlId={'strokeStyle'} />
    ; } } diff --git a/src/widget/widgets/gauge.js b/src/widget/widgets/gauge.js index e1f8bfc..b33494a 100644 --- a/src/widget/widgets/gauge.js +++ b/src/widget/widgets/gauge.js @@ -219,7 +219,7 @@ class WidgetGauge extends Component { const step = (maxValue - minValue) / 100; zones = zones.map(zone => { - return Object.assign({}, zone, { min: (zone.min * step) + +minValue, max: zone.max * step + +minValue, strokeStyle: '#' + zone.strokeStyle }); + return Object.assign({}, zone, { min: (zone.min * step) + +minValue, max: zone.max * step + +minValue, strokeStyle: zone.strokeStyle }); }); } From 0b84d3395705822c1d5e120d98552df9193872df Mon Sep 17 00:00:00 2001 From: Laura Fuentes Grau Date: Sun, 13 Sep 2020 15:34:12 +0200 Subject: [PATCH 337/391] Edit-Dialog now opens automatically after adding new component configuration --- src/scenario/scenario.js | 22 +++++++++++++++++----- 1 file changed, 17 insertions(+), 5 deletions(-) diff --git a/src/scenario/scenario.js b/src/scenario/scenario.js index 564f63c..442fdb2 100644 --- a/src/scenario/scenario.js +++ b/src/scenario/scenario.js @@ -54,7 +54,6 @@ class Scenario extends React.Component { if (prevState == null) { prevState = {}; } - // get selected scenario const sessionToken = localStorage.getItem("token"); @@ -72,6 +71,16 @@ class Scenario extends React.Component { // obtain all component configurations of a scenario let configs = ConfigStore.getState().filter(config => config.scenarioID === parseInt(props.match.params.scenario, 10)); + let editConfigModal = prevState.editConfigModal || false; + let modalConfigData = (prevState.modalConfigData !== {} && prevState.modalConfigData !== undefined )? prevState.modalConfigData : {}; + let modalConfigIndex = 0; + + if((typeof prevState.configs !== "undefined") && (prevState.newConfig === true ) && (configs.length !== prevState.configs.length)){ + let index = configs.length -1; + editConfigModal = true; + modalConfigData = configs[index]; + modalConfigIndex = index; + } // obtain all files of a scenario let files = FileStore.getState().filter(file => file.scenarioID === parseInt(props.match.params.scenario, 10)); @@ -86,14 +95,15 @@ class Scenario extends React.Component { dashboards, signals, files, + editConfigModal, + modalConfigData, + modalConfigIndex, ics: ICStore.getState(), deleteConfigModal: false, importConfigModal: false, - editConfigModal: prevState.editConfigModal || false, - modalConfigData: (prevState.modalConfigData !== {} && prevState.modalConfigData !== undefined )? prevState.modalConfigData : {}, + newConfig: prevState.newConfig || false, selectedConfigs: [], - modalConfigIndex: 0, filesEditModal: prevState.filesEditModal || false, filesEditSaveState: prevState.filesEditSaveState || [], @@ -183,10 +193,12 @@ class Scenario extends React.Component { token: this.state.sessionToken }); + this.setState({newConfig: true}); + } closeEditConfigModal(data) { - this.setState({ editConfigModal: false }); + this.setState({ editConfigModal: false, newConfig: false }); if (data) { AppDispatcher.dispatch({ From d1275ce1aad71d8b73434471a1099fe2994cb3c4 Mon Sep 17 00:00:00 2001 From: Laura Fuentes Grau Date: Tue, 15 Sep 2020 14:44:26 +0200 Subject: [PATCH 338/391] File content now changeable --- src/file/edit-file-content.js | 82 ++++++++++++++++++++++++++++++++++ src/file/edit-file-name.js | 79 -------------------------------- src/file/edit-files.js | 30 +++---------- src/file/file-store.js | 12 ++++- src/file/files-data-manager.js | 15 +++++++ src/widget/widgets/image.js | 7 +-- 6 files changed, 119 insertions(+), 106 deletions(-) create mode 100644 src/file/edit-file-content.js delete mode 100644 src/file/edit-file-name.js diff --git a/src/file/edit-file-content.js b/src/file/edit-file-content.js new file mode 100644 index 0000000..34a142e --- /dev/null +++ b/src/file/edit-file-content.js @@ -0,0 +1,82 @@ +/** + * This file is part of VILLASweb. + * + * VILLASweb is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * VILLASweb is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with VILLASweb. If not, see . + ******************************************************************************/ + +import React from 'react'; +import {FormGroup, FormControl, Button, Col} from 'react-bootstrap'; +import AppDispatcher from "../common/app-dispatcher"; +import Dialog from '../common/dialogs/dialog'; + +class EditFileContent extends React.Component { + valid = true; + + constructor(props) { + super(props); + + this.state = { + uploadFile: null, + + }; + } + + selectUploadFile(event) { + this.setState({ uploadFile: event.target.files[0] }); + }; + + startEditContent(){ + const formData = new FormData(); + formData.append("file", this.state.uploadFile); + + AppDispatcher.dispatch({ + type: 'files/start-edit', + data: formData, + token: this.props.sessionToken, + id: this.props.file.id + }); + + this.setState({ uploadFile: null }); + }; + + + onClose = () => { + this.props.onClose(); + }; + + + + + render() { + return this.onClose()} blendOutCancel = {true} valid={true}> + + this.selectUploadFile(event)} /> + + + + + + + ; + } +} + +export default EditFileContent; diff --git a/src/file/edit-file-name.js b/src/file/edit-file-name.js deleted file mode 100644 index 05481b3..0000000 --- a/src/file/edit-file-name.js +++ /dev/null @@ -1,79 +0,0 @@ -/** - * This file is part of VILLASweb. - * - * VILLASweb is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * VILLASweb is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with VILLASweb. If not, see . - ******************************************************************************/ - -import React from 'react'; -import {FormGroup, FormControl, FormLabel, Col} from 'react-bootstrap'; - -import Dialog from '../common/dialogs/dialog'; - -class EditFileName extends React.Component { - valid = true; - - constructor(props) { - super(props); - - this.state = { - file: {}, - - }; - } - - onClose = canceled => { - if (canceled) { - if (this.props.onClose != null) { - this.props.onClose(); - } - - return; - } - - if (this.valid && this.props.onClose != null) { - this.props.onClose(this.state.file); - } - }; - - handleChange = event => { - this.props.file.name = event.target.value; - this.setState({file: this.props.file}); - - let name = true; - - if (this.state.name === '') { - name = false; - } - - this.valid = name; - - }; - - - - render() { - return this.onClose(c)} valid={true}> - - - Name - - - - - - ; - } -} - -export default EditFileName; diff --git a/src/file/edit-files.js b/src/file/edit-files.js index 3e2e003..8cc3421 100644 --- a/src/file/edit-files.js +++ b/src/file/edit-files.js @@ -21,7 +21,7 @@ import Dialog from '../common/dialogs/dialog'; import AppDispatcher from "../common/app-dispatcher"; import Table from "../common/table"; import TableColumn from "../common/table-column"; -import EditFileName from "./edit-file-name"; +import EditFileContent from "./edit-file-content"; class EditFilesDialog extends React.Component { @@ -39,14 +39,9 @@ class EditFilesDialog extends React.Component { }; } - onClose(canceled) { - if (canceled === false) { - if (true) { - this.props.onClose(); - } - } else { - this.props.onClose(); - } + onClose() { + + this.props.onClose(); } selectUploadFile(event) { @@ -87,18 +82,7 @@ class EditFilesDialog extends React.Component { }; - closeEditModal(data){ - if(data !== {} || data !== "undefined"){ - const formData = new FormData(); - formData.append("object", data); - - AppDispatcher.dispatch({ - type: 'files/start-edit', - data: formData, - token: this.props.sessionToken, - id: data.id - }); - } + closeEditModal(){ this.setState({editModal: false}); } @@ -135,7 +119,7 @@ class EditFilesDialog extends React.Component { return ( - this.onClose(c)} blendOutCancel = {true} valid={true} size = 'lg'> + this.onClose()} blendOutCancel = {true} valid={true} size = 'lg'>
    @@ -178,7 +162,7 @@ class EditFilesDialog extends React.Component {
    - this.closeEditModal(data)} file={this.state.modalFile} /> + this.closeEditModal(data)} sessionToken={this.props.sessionToken} file={this.state.modalFile} />
    diff --git a/src/file/file-store.js b/src/file/file-store.js index ae6779d..306c2d6 100644 --- a/src/file/file-store.js +++ b/src/file/file-store.js @@ -67,7 +67,17 @@ class FileStore extends ArrayStore { case 'files/downloaded': // in this case a file is contained in the response (no JSON) - return this.saveFile(state, action) + return this.saveFile(state, action); + + case 'files/start-edit': + FilesDataManager.update(action.data, action.token, action.id); + return state; + + case 'files/edited': + return this.updateElements(state, [action.data]); + + case this.type + '/edit-error': + return state; default: return super.reduce(state, action); diff --git a/src/file/files-data-manager.js b/src/file/files-data-manager.js index cc5cf4b..b03f27a 100644 --- a/src/file/files-data-manager.js +++ b/src/file/files-data-manager.js @@ -65,6 +65,21 @@ class FilesDataManager extends RestDataManager { }); }); } + + update(file, token, id) { + + RestAPI.put(this.makeURL(this.url + '/' + id), file, token).then(response => { + AppDispatcher.dispatch({ + type: this.type + 's/edited', + data: response[this.type] + }); + }).catch(error => { + AppDispatcher.dispatch({ + type: this.type + 's/edit-error', + error: error + }); + }); + } } export default new FilesDataManager(); diff --git a/src/widget/widgets/image.js b/src/widget/widgets/image.js index 1f08fa3..d931cb2 100644 --- a/src/widget/widgets/image.js +++ b/src/widget/widgets/image.js @@ -26,6 +26,7 @@ class WidgetImage extends React.Component { this.state = { file: undefined, + fileDate: null } } @@ -45,8 +46,9 @@ class WidgetImage extends React.Component { let file = this.props.files.find(file => file.id === parseInt(this.props.widget.customProperties.file, 10)); + if (file !== undefined) { - if (this.state.file === undefined || (this.state.file.id !== file.id)) { + if (this.state.file === undefined || (this.state.file.id !== file.id) || this.state.fileDate !== file.date) { AppDispatcher.dispatch({ type: 'files/start-download', @@ -54,7 +56,7 @@ class WidgetImage extends React.Component { token: this.props.token }); - this.setState({ file: file }) + this.setState({ file: file, fileDate: file.date }); } } @@ -65,7 +67,6 @@ class WidgetImage extends React.Component { } render() { - let objectURL='' if(this.state.file !== undefined && this.state.file.objectURL !== undefined) { objectURL = this.state.file.objectURL From 6a22d5387c8e12a9fe6b8686ce2c0be7ae1df984 Mon Sep 17 00:00:00 2001 From: irismarie Date: Tue, 15 Sep 2020 19:10:17 +0200 Subject: [PATCH 339/391] delete own user from scenario, closes #249 --- src/common/array-store.js | 14 +++++++--- src/scenario/scenario-store.js | 3 +-- src/scenario/scenario.js | 37 ++++++++++++++++++++------ src/scenario/scenarios-data-manager.js | 22 ++++++++++----- 4 files changed, 55 insertions(+), 21 deletions(-) diff --git a/src/common/array-store.js b/src/common/array-store.js index 1c045e7..c2cdd27 100644 --- a/src/common/array-store.js +++ b/src/common/array-store.js @@ -110,10 +110,16 @@ class ArrayStore extends ReduceStore { return state; case this.type + '/removed': - return state.filter((item) => { - return (item !== action.original); - }); - + if (action.original) { + return state.filter((item) => { + return (item !== action.original); + }); + } else { + return state.filter((item) => { + return (item.id !== action.data); + }); + } + case this.type + '/remove-error': if (action.error && !action.error.handled && action.error.response) { diff --git a/src/scenario/scenario-store.js b/src/scenario/scenario-store.js index 8164229..24b04cf 100644 --- a/src/scenario/scenario-store.js +++ b/src/scenario/scenario-store.js @@ -37,7 +37,6 @@ class ScenarioStore extends ArrayStore{ }) this.__emitChange(); return state; - } reduce(state, action) { @@ -85,7 +84,7 @@ class ScenarioStore extends ArrayStore{ return super.reduce(state, action); case 'scenarios/remove-user': - this.dataManager.deleteUser(action.token, action.data, action.username) + this.dataManager.deleteUser(action.token, action.data, action.username, action.ownuser) return super.reduce(state, action); case 'scenarios/users-error': diff --git a/src/scenario/scenario.js b/src/scenario/scenario.js index 564f63c..d9ba88f 100644 --- a/src/scenario/scenario.js +++ b/src/scenario/scenario.js @@ -43,11 +43,13 @@ import EditConfigDialog from "../componentconfig/edit-config"; import EditSignalMapping from "../signal/edit-signal-mapping"; import FileStore from "../file/file-store" import WidgetStore from "../widget/widget-store"; +import LoginStore from "../user/login-store" +import { Redirect } from 'react-router-dom'; class Scenario extends React.Component { static getStores() { - return [ ScenarioStore, ConfigStore, DashboardStore, ICStore, SignalStore, FileStore, WidgetStore]; + return [ ScenarioStore, ConfigStore, DashboardStore, ICStore, SignalStore, FileStore, WidgetStore, LoginStore]; } static calculateState(prevState, props) { @@ -78,6 +80,7 @@ class Scenario extends React.Component { let signals = SignalStore.getState(); + let currentUser = LoginStore.getState().currentUser; return { scenario, @@ -85,6 +88,7 @@ class Scenario extends React.Component { configs, dashboards, signals, + currentUser, files, ics: ICStore.getState(), @@ -109,6 +113,7 @@ class Scenario extends React.Component { userToAdd: '', deleteUserName: '', deleteUserModal: false, + goToScenarios: false } } @@ -155,14 +160,26 @@ class Scenario extends React.Component { } closeDeleteUserModal() { + let scenarioID = this.state.scenario.id; + if (this.state.deleteUserName === this.state.currentUser.username) { + AppDispatcher.dispatch({ + type: 'scenarios/remove-user', + data: scenarioID, + username: this.state.deleteUserName, + token: this.state.sessionToken, + ownuser: true + }); + this.setState({ goToScenarios: true }); + } else { + AppDispatcher.dispatch({ + type: 'scenarios/remove-user', + data: scenarioID, + username: this.state.deleteUserName, + token: this.state.sessionToken, + ownuser: false + }); + } this.setState({ deleteUserModal: false }); - - AppDispatcher.dispatch({ - type: 'scenarios/remove-user', - data: this.state.scenario.id, - username: this.state.deleteUserName, - token: this.state.sessionToken - }); } /* ############################################## @@ -492,6 +509,10 @@ class Scenario extends React.Component { ############################################## */ render() { + if (this.state.goToScenarios) { + console.log("redirect to scenario overview") + return (); + } const buttonStyle = { marginLeft: '10px' diff --git a/src/scenario/scenarios-data-manager.js b/src/scenario/scenarios-data-manager.js index bd89f31..760493b 100644 --- a/src/scenario/scenarios-data-manager.js +++ b/src/scenario/scenarios-data-manager.js @@ -59,15 +59,23 @@ class ScenariosDataManager extends RestDataManager { }) } - deleteUser(token, id, username) { + deleteUser(token, id, username, ownuser=false) { let path = id + '/user'; RestAPI.delete(this.makeURL(this.url + '/' + path + '?username=' + username), token).then(response => { - AppDispatcher.dispatch({ - type: 'scenarios/start-load-users', - data: id, - token: token - }); - + if (!ownuser) { + AppDispatcher.dispatch({ + type: 'scenarios/start-load-users', + data: id, + token: token + }); + } else { + // delete scenario from scenariostore + AppDispatcher.dispatch({ + type: 'scenarios/removed', + data: id, + token: token + }); + } }).catch(error => { AppDispatcher.dispatch({ type: 'scenarios/users-error', From 493a57577d6406392713e04217103ac64f1195fb Mon Sep 17 00:00:00 2001 From: irismarie Date: Thu, 24 Sep 2020 14:59:22 +0200 Subject: [PATCH 340/391] login page layout, closes #255 --- src/styles/app.css | 2 +- src/user/login-form.js | 19 ++++++++++--------- 2 files changed, 11 insertions(+), 10 deletions(-) diff --git a/src/styles/app.css b/src/styles/app.css index 84d330e..cb7160e 100644 --- a/src/styles/app.css +++ b/src/styles/app.css @@ -224,7 +224,7 @@ body { * Login form */ .login-container { - max-width: 500px; + max-width: 400px; margin: 30px auto; padding: 15px 20px; diff --git a/src/user/login-form.js b/src/user/login-form.js index c2efaae..96df3b0 100644 --- a/src/user/login-form.js +++ b/src/user/login-form.js @@ -59,32 +59,33 @@ class LoginForm extends Component { return (
    - Username -
    + Username + this.handleChange(e)} /> - Password - + Password + this.handleChange(e)} /> {this.props.loginMessage && -
    -
    +
    +
    Error: {this.props.loginMessage} } - - - + + + + ); } From 39f9f793facb88b41baaa203c49d12ad5d1a3471 Mon Sep 17 00:00:00 2001 From: Laura Fuentes Grau Date: Sun, 27 Sep 2020 14:23:33 +0200 Subject: [PATCH 341/391] WIP: Improve layout of widget toolbar #254 --- src/styles/app.css | 6 +++ src/widget/widget-toolbox.js | 90 +++++++++++++++++++----------------- 2 files changed, 53 insertions(+), 43 deletions(-) diff --git a/src/styles/app.css b/src/styles/app.css index cb7160e..a2d887d 100644 --- a/src/styles/app.css +++ b/src/styles/app.css @@ -370,6 +370,12 @@ body { float: right; } +.section-buttons-group-left { + height: auto !important; + padding: 5px; + float: left; +} + .section-buttons-group-right .rc-slider { margin-left: 12px; } diff --git a/src/widget/widget-toolbox.js b/src/widget/widget-toolbox.js index 9e6838b..56e4e72 100644 --- a/src/widget/widget-toolbox.js +++ b/src/widget/widget-toolbox.js @@ -104,7 +104,47 @@ class WidgetToolbox extends React.Component { const thereIsTopologyWidget = this.props.widgets != null && Object.values(this.props.widgets).filter(w => w.type === 'Topology').length > 0; const topologyItemMsg = thereIsTopologyWidget? 'Currently only one is supported' : ''; - return
    + return ( + +
    +
    +
    + Show/ hide available Cosmetic Widgets } > + + + Show/ hide available Displaying Widgets } > + + + Show/ hide available Manipulation Widgets } > + + +
    +
    +
    +
    + Grid: { this.props.grid > 1 ? this.props.grid : 'Disabled' } + + Increase dashboard height } > + + + Decrease dashboard height } > + + + +
    +
    +

    +

    +

    +
    + @@ -142,52 +182,16 @@ class WidgetToolbox extends React.Component { - - -
    -
    - Grid: { this.props.grid > 1 ? this.props.grid : 'Disabled' } - - -
    +
    -
    -
    - Show/ hide available Cosmetic Widgets } > - - - Show/ hide available Displaying Widgets } > - - - Show/ hide available Manipulation Widgets } > - - - Increase dashboard height } > - - - Decrease dashboard height } > - - -
    -
    -
    ; + + +
    + ) }; } - + WidgetToolbox.propTypes = { widgets: PropTypes.array, grid: PropTypes.number, From 81351a1cdb03c63bdd91184cda03fe30c65965f0 Mon Sep 17 00:00:00 2001 From: Sonja Happ Date: Mon, 28 Sep 2020 10:18:27 +0200 Subject: [PATCH 342/391] Add link to swagger API doc on home page #258 --- src/common/home.js | 25 ++++++++++++++++++++++--- 1 file changed, 22 insertions(+), 3 deletions(-) diff --git a/src/common/home.js b/src/common/home.js index 4bf124f..c6169c5 100644 --- a/src/common/home.js +++ b/src/common/home.js @@ -25,10 +25,25 @@ class Home extends React.Component { constructor(props) { super(props); + + + // create url for API documentation, distinguish between localhost and production deployment + let docs_url = ""; + let docs_location = "/swagger/index.html"; + let base_url = window.location.origin; + if (base_url.search("localhost") === -1){ + docs_url = base_url + docs_location; + } else { + // useful for local testing, replace port 3000 with port 4000 (port of backend) + docs_url = base_url.replace("3000", "4000") + docs_location; + } + this.state = { currentUser: LoginStore.getState().currentUser, - token: LoginStore.getState().token + token: LoginStore.getState().token, + docs_url: docs_url }; + } getCounts(type) { @@ -51,13 +66,17 @@ class Home extends React.Component { Logo VILLASweb

    Home

    - Welcome to {config.instance}!
    - VILLASweb is a frontend for distributed real-time simulation hosted by {config.admin.name}. + Welcome to {config.instance} hosted by {config.admin.name}!

    You are logged in as user {currentUser.username} with ID {currentUser.id} and role {currentUser.role}.

    +

    + An interactive documentation of the VILLASweb API is available here. +

    + +

    Data Model

    Datamodel VILLASweb From 34822bb256702391c0146dec54032a58e9fcfb92 Mon Sep 17 00:00:00 2001 From: Sonja Happ Date: Mon, 28 Sep 2020 11:28:32 +0200 Subject: [PATCH 343/391] Remove HTML widget from available widgets, code not deleted, closes #226 --- .../edit-widget/edit-widget-control-creator.js | 6 +++--- src/widget/widget-factory.js | 4 ++-- src/widget/widget-toolbox.js | 7 +++---- src/widget/widget.js | 12 ++++++------ 4 files changed, 14 insertions(+), 15 deletions(-) diff --git a/src/widget/edit-widget/edit-widget-control-creator.js b/src/widget/edit-widget/edit-widget-control-creator.js index b26bc04..2434e7a 100644 --- a/src/widget/edit-widget/edit-widget-control-creator.js +++ b/src/widget/edit-widget/edit-widget-control-creator.js @@ -30,8 +30,8 @@ import EditWidgetTextSizeControl from './edit-widget-text-size-control'; import EditWidgetCheckboxControl from './edit-widget-checkbox-control'; import EditWidgetColorZonesControl from './edit-widget-color-zones-control'; import EditWidgetMinMaxControl from './edit-widget-min-max-control'; -import EditWidgetHTMLContent from './edit-widget-html-content'; import EditWidgetParametersControl from './edit-widget-parameters-control'; +//import EditWidgetHTMLContent from './edit-widget-html-content'; export default function CreateControls(widgetType = null, widget = null, sessionToken = null, files = null, signals, handleChange) { // Use a list to concatenate the controls according to the widget type @@ -132,11 +132,11 @@ export default function CreateControls(widgetType = null, widget = null, session handleChange(e)} /> ); break; - case 'HTML': + /*case 'HTML': DialogControls.push( handleChange(e)} /> ); - break; + break; */ case 'Topology': // Restrict to only xml files (MIME) //let topologyControlFiles = files == null? [] : files.filter( file => file.type.includes('xml')); diff --git a/src/widget/widget-factory.js b/src/widget/widget-factory.js index 55e1aaf..8f99c8a 100644 --- a/src/widget/widget-factory.js +++ b/src/widget/widget-factory.js @@ -172,9 +172,9 @@ class WidgetFactory { widget.customProperties.background_color_opacity = 0.5; widget.z = 0; break; - case 'HTML': + /*case 'HTML': widget.customProperties.content = 'Hello World'; - break; + break;*/ case 'Topology': widget.width = 600; widget.height = 400; diff --git a/src/widget/widget-toolbox.js b/src/widget/widget-toolbox.js index 56e4e72..9b057ec 100644 --- a/src/widget/widget-toolbox.js +++ b/src/widget/widget-toolbox.js @@ -105,7 +105,7 @@ class WidgetToolbox extends React.Component { const topologyItemMsg = thereIsTopologyWidget? 'Currently only one is supported' : ''; return ( - +
    @@ -164,7 +164,6 @@ class WidgetToolbox extends React.Component { - Drag and drop widgets onto the dashboard } >
    - +
    ) }; } - + WidgetToolbox.propTypes = { widgets: PropTypes.array, grid: PropTypes.number, diff --git a/src/widget/widget.js b/src/widget/widget.js index 7b647db..35f15ed 100644 --- a/src/widget/widget.js +++ b/src/widget/widget.js @@ -41,9 +41,9 @@ import WidgetInput from './widgets/input'; import WidgetSlider from './widgets/slider'; import WidgetGauge from './widgets/gauge'; import WidgetBox from './widgets/box'; -import WidgetHTML from './widgets/html'; import WidgetTopology from './widgets/topology'; import WidgetLine from './widgets/line'; +//import WidgetHTML from './widgets/html'; import '../styles/widgets.css'; @@ -211,11 +211,11 @@ class Widget extends React.Component { widget={widget} editing={this.props.editing} /> - } else if (widget.type === 'HTML') { - return + //} else if (widget.type === 'HTML') { + //return } else if (widget.type === 'Topology') { return Date: Wed, 30 Sep 2020 11:29:37 +0200 Subject: [PATCH 344/391] Clean up usage of login store, only use it for login, use the local storage in all other cases to get the token and current user. --- src/app.js | 39 +++++-------- src/common/home.js | 5 -- src/scenario/scenario.js | 23 +++----- src/user/edit-own-user.js | 1 - src/user/login-store.js | 28 ++------- src/user/login.js | 47 ++++----------- src/user/logout.js | 5 +- src/user/user.js | 91 ++++++++++++++++++----------- src/user/users-data-manager.js | 29 --------- src/widget/widget.js | 5 +- src/widget/widgets/custom-action.js | 5 +- 11 files changed, 104 insertions(+), 174 deletions(-) diff --git a/src/app.js b/src/app.js index cddc5de..1b0024a 100644 --- a/src/app.js +++ b/src/app.js @@ -16,7 +16,6 @@ ******************************************************************************/ import React from 'react'; -import { Container } from 'flux/utils'; import { DndProvider } from 'react-dnd'; import HTML5Backend from 'react-dnd-html5-backend'; import NotificationSystem from 'react-notification-system'; @@ -25,9 +24,6 @@ import { Col } from 'react-bootstrap'; import { Hidden } from 'react-grid-system' import AppDispatcher from './common/app-dispatcher'; -import ScenarioStore from './scenario/scenario-store'; -import ICStore from './ic/ic-store'; -import LoginStore from './user/login-store'; import NotificationsDataManager from './common/data-managers/notifications-data-manager'; import Home from './common/home'; @@ -47,29 +43,21 @@ import './styles/app.css'; class App extends React.Component { - static getStores() { - return [ ICStore, LoginStore, ScenarioStore]; - } - - static calculateState(prevState) { - - return { - ics: ICStore.getState(), - scenarios: ScenarioStore.getState(), - currentUser: LoginStore.getState().currentUser, - token: LoginStore.getState().token, - + constructor(props) { + super(props); + this.state = { showSidebarMenu: false, - }; + } } componentDidMount() { NotificationsDataManager.setSystem(this.refs.notificationSystem); - // if token stored locally, request user + // if token stored locally, we are already logged-in let token = localStorage.getItem("token"); - let currentUser = JSON.parse(localStorage.getItem("currentUser")); - if (token != null && token !== '' && currentUser != null) { + if (token != null && token !== '') { + let currentUser = JSON.parse(localStorage.getItem("currentUser")); + console.log("Already logged-in") AppDispatcher.dispatch({ type: 'users/logged-in', token: token, @@ -89,13 +77,15 @@ class App extends React.Component { render() { let token = localStorage.getItem("token"); - let currentUser = JSON.parse(localStorage.getItem("currentUser")); + let currentUserRaw = localStorage.getItem("currentUser"); - if (token == null || currentUser == null) { + if (token == null || token === "" || currentUserRaw == null || currentUserRaw === "") { console.log("APP redirecting to logout/ login") return (); } + let currentUser = JSON.parse(currentUserRaw); + return (
    @@ -138,6 +128,5 @@ class App extends React.Component { } } -let fluxContainerConverter = require('./common/FluxContainerConverter'); -export default Container.create(fluxContainerConverter.convert(App)); -//DragDropContext(HTML5Backend)(Container.create(App)); + +export default App diff --git a/src/common/home.js b/src/common/home.js index c6169c5..bc1c5b7 100644 --- a/src/common/home.js +++ b/src/common/home.js @@ -18,15 +18,12 @@ import React from 'react'; import config from '../config'; -import LoginStore from "../user/login-store"; import {Redirect} from "react-router-dom"; class Home extends React.Component { constructor(props) { super(props); - - // create url for API documentation, distinguish between localhost and production deployment let docs_url = ""; let docs_location = "/swagger/index.html"; @@ -39,8 +36,6 @@ class Home extends React.Component { } this.state = { - currentUser: LoginStore.getState().currentUser, - token: LoginStore.getState().token, docs_url: docs_url }; diff --git a/src/scenario/scenario.js b/src/scenario/scenario.js index 2789de9..7fd8f23 100644 --- a/src/scenario/scenario.js +++ b/src/scenario/scenario.js @@ -43,13 +43,12 @@ import EditConfigDialog from "../componentconfig/edit-config"; import EditSignalMapping from "../signal/edit-signal-mapping"; import FileStore from "../file/file-store" import WidgetStore from "../widget/widget-store"; -import LoginStore from "../user/login-store" import { Redirect } from 'react-router-dom'; class Scenario extends React.Component { static getStores() { - return [ ScenarioStore, ConfigStore, DashboardStore, ICStore, SignalStore, FileStore, WidgetStore, LoginStore]; + return [ ScenarioStore, ConfigStore, DashboardStore, ICStore, SignalStore, FileStore, WidgetStore]; } static calculateState(prevState, props) { @@ -68,8 +67,6 @@ class Scenario extends React.Component { }); } - // obtain all dashboards of a scenario - let dashboards = DashboardStore.getState().filter(dashb => dashb.scenarioID === parseInt(props.match.params.scenario, 10)); // obtain all component configurations of a scenario let configs = ConfigStore.getState().filter(config => config.scenarioID === parseInt(props.match.params.scenario, 10)); @@ -84,24 +81,18 @@ class Scenario extends React.Component { modalConfigIndex = index; } - // obtain all files of a scenario - let files = FileStore.getState().filter(file => file.scenarioID === parseInt(props.match.params.scenario, 10)); - - let signals = SignalStore.getState(); - - let currentUser = LoginStore.getState().currentUser; - return { scenario, sessionToken, configs, - dashboards, - signals, - currentUser, - files, editConfigModal, modalConfigData, modalConfigIndex, + dashboards: DashboardStore.getState().filter(dashb => dashb.scenarioID === parseInt(props.match.params.scenario, 10)), + signals: SignalStore.getState(), + currentUser: JSON.parse(localStorage.getItem("currentUser")), + files: FileStore.getState().filter(file => file.scenarioID === parseInt(props.match.params.scenario, 10)), + ics: ICStore.getState(), deleteConfigModal: false, @@ -171,7 +162,7 @@ class Scenario extends React.Component { closeDeleteUserModal() { let scenarioID = this.state.scenario.id; - if (this.state.deleteUserName === this.state.currentUser.username) { + if (this.state.deleteUserName === this.state.currentUser.username) { AppDispatcher.dispatch({ type: 'scenarios/remove-user', data: scenarioID, diff --git a/src/user/edit-own-user.js b/src/user/edit-own-user.js index d755e2d..4b7a639 100644 --- a/src/user/edit-own-user.js +++ b/src/user/edit-own-user.js @@ -19,7 +19,6 @@ import React from 'react'; import {FormGroup, FormControl, FormLabel, Col} from 'react-bootstrap'; import Dialog from '../common/dialogs/dialog'; -//import LoginStore from './login-store'; class EditOwnUserDialog extends React.Component { diff --git a/src/user/login-store.js b/src/user/login-store.js index 47e603d..aa69290 100644 --- a/src/user/login-store.js +++ b/src/user/login-store.js @@ -31,7 +31,6 @@ class LoginStore extends ReduceStore { currentUser: null, token: null, loginMessage: null, - scenarioUsers: null }; } @@ -47,31 +46,16 @@ class LoginStore extends ReduceStore { //remove token and current user from local storage localStorage.clear(); - // delete user and token - return Object.assign({}, state, { token: null, currentUser: null }); + // delete user, token and loginMessage + return Object.assign({}, state, { token: null, currentUser: null, loginMessage: null}); case 'users/logged-in': - // // request logged-in user data - UsersDataManager.getCurrentUser(action.token, action.currentUser.id); + // save login in local storage + localStorage.setItem('token', action.token); + localStorage.setItem('currentUser', JSON.stringify(action.currentUser)); + return Object.assign({}, state, { token: action.token, currentUser: action.currentUser}); - case 'users/current-user': - // // save logged-in user - return Object.assign({}, state, { currentUser: action.currentUser}); - - case 'users/start-edit-own-user': - // update the current user - UsersDataManager.updateCurrentUser(action.token, action.data); - return Object.assign({}, state, { token: action.token, currentUser: action.data}); - - case 'users/reload-current-user': - UsersDataManager.getCurrentUser(action.token, action.currentUser.id); - return Object.assign({}, state, { token: action.token, currentUser: action.currentUser}); - - case 'users/current-user-error': - // discard user token - return Object.assign({}, state, { currentUser: null, token: null }); - case 'users/login-error': if (action.error && !action.error.handled) { // If it was an error and hasn't been handled, the credentials must have been wrong. diff --git a/src/user/login.js b/src/user/login.js index c2791da..0a6fac8 100644 --- a/src/user/login.js +++ b/src/user/login.js @@ -25,54 +25,31 @@ import LoginForm from './login-form'; import Header from '../common/header'; import Footer from '../common/footer'; import NotificationsDataManager from '../common/data-managers/notifications-data-manager'; - -import AppDispatcher from '../common/app-dispatcher'; -import LoginStore from './login-store'; +import LoginStore from './login-store' class Login extends Component { - static getStores() { - return [ LoginStore ]; + + static getStores(){ + return [LoginStore] } - static calculateState() { + static calculateState(prevState, props) { + // We need to work with the login store here to trigger the re-render upon state change after login + // Upon successful login, the token and currentUser are stored in the local storage as strings return { - currentUser: LoginStore.getState().currentUser, - token: LoginStore.getState().token, loginMessage: LoginStore.getState().loginMessage, - }; + token: LoginStore.getState().token, + currentUser: LoginStore.getState().currentUser, + } } componentDidMount() { NotificationsDataManager.setSystem(this.refs.notificationSystem); } - componentDidUpdate(prevProps: Readonly

    , prevState: Readonly, snapshot: SS): void { - - // if token stored locally, request user - if (this.state.token == null) { - const token = localStorage.getItem('token'); - const currentUser = JSON.parse(localStorage.getItem('currentUser')); - - if (token != null && token !== '' && currentUser != null && this.state.currentUser == null) { - AppDispatcher.dispatch({ - type: 'users/logged-in', - token: token, - currentUser: currentUser - }); - } - } else { - // check if logged in - if (this.state.currentUser != null) { - // save login in local storage - localStorage.setItem('token', this.state.token); - localStorage.setItem('currentUser', JSON.stringify(this.state.currentUser)); - } - } - - } - render() { - if (this.state.currentUser != null) { + + if (this.state.currentUser !== null && this.state.currentUser !== "") { return (); } diff --git a/src/user/logout.js b/src/user/logout.js index cd1fab1..3179a45 100644 --- a/src/user/logout.js +++ b/src/user/logout.js @@ -26,8 +26,11 @@ class Logout extends React.Component { type: 'users/logout' }); - // discard login token + // The Login Store is deleted automatically + + // discard login token and current User localStorage.setItem('token', ''); + localStorage.setItem('currentUser', ''); } render() { diff --git a/src/user/user.js b/src/user/user.js index 6c7e0df..850b663 100644 --- a/src/user/user.js +++ b/src/user/user.js @@ -26,7 +26,6 @@ import Icon from '../common/icon'; import EditOwnUserDialog from './edit-own-user' import NotificationsDataManager from "../common/data-managers/notifications-data-manager" - class User extends Component { static getStores() { return [ UsersStore ]; @@ -35,32 +34,52 @@ class User extends Component { static calculateState(prevState, props) { prevState = prevState || {}; + let currentUserID = JSON.parse(localStorage.getItem("currentUser")).id; + let currentUser = UsersStore.getState().find(user => user.id === parseInt(currentUserID, 10)); + return { - currentUser: JSON.parse(localStorage.getItem("currentUser")), + currentUser, token: localStorage.getItem("token"), editModal: false, }; } + componentDidMount() { + + let currentUserID = JSON.parse(localStorage.getItem("currentUser")).id; + + AppDispatcher.dispatch({ + type: 'users/start-load', + data: parseInt(currentUserID, 10), + token: this.state.token + }); + + } + closeEditModal(data) { this.setState({ editModal: false }); - //this.setState({currentUser: data}); - let updatedData = {}; + let updatedData = {} + updatedData.id = this.state.currentUser.id; + let updatedUser = this.state.currentUser; + let hasChanged = false; + let pwChanged = false; if(data){ if (data.username !== ''){ - updatedData["id"] = data.id; - updatedData["username"] = data.username; + hasChanged = true; + updatedData.username = data.username; + updatedUser.username = data.username } if (data.mail !== ''){ - updatedData["id"] = data.id; - updatedData["mail"] = data.mail; + hasChanged = true; + updatedData.mail = data.mail; + updatedUser.mail = data.mail; } if (data.password !== '' && data.oldPassword !== '' && data.password === data.confirmpassword ){ - updatedData["id"] = data.id; - updatedData["password"] = data.password; - updatedData["oldPassword"] = data.oldPassword; + pwChanged = true; + updatedData.password = data.password; + updatedData.oldPassword = data.oldPassword; } else if (data.password !== '' && data.password !== data.confirmpassword) { const USER_UPDATE_ERROR_NOTIFICATION = { title: 'Update Error ', @@ -71,13 +90,15 @@ class User extends Component { return } - if (updatedData !== {}) { - let requestData = {}; - requestData["user"] = updatedData; + if (hasChanged || pwChanged) { + + if(hasChanged){ + this.setState({currentUser: updatedUser}) + } AppDispatcher.dispatch({ - type: 'users/start-edit-own-user', - data: requestData, + type: 'users/start-edit', + data: updatedData, token: this.state.token }); } else { @@ -100,35 +121,37 @@ class User extends Component { render() { - return (

    Your User Account

    -
    - -
    Username: - {this.state.currentUser.username} - + {this.state.currentUser !== undefined && this.state.currentUser !== null ? + + + + Username: + {this.state.currentUser.username} + - - E-mail: - {this.state.currentUser.mail} - + + E-mail: + {this.state.currentUser.mail} + - - Role: - {this.state.currentUser.role} - + + Role: + {this.state.currentUser.role} + - + - this.closeEditModal(data)} user={this.state.currentUser} /> - - + this.closeEditModal(data)} + user={this.state.currentUser}/> + : "Loading user data..." + } ); } diff --git a/src/user/users-data-manager.js b/src/user/users-data-manager.js index dac46d2..b5694a7 100644 --- a/src/user/users-data-manager.js +++ b/src/user/users-data-manager.js @@ -38,35 +38,6 @@ class UsersDataManager extends RestDataManager { }); }); } - - getCurrentUser(token, id) { - RestAPI.get(this.makeURL('/users/' + id), token).then(response => { - AppDispatcher.dispatch({ - type: 'users/current-user', - currentUser: response.user - }); - }).catch(error => { - AppDispatcher.dispatch({ - type: 'users/current-user-error', - error: error - }); - }); - } - - updateCurrentUser(token, userUpdate){ - RestAPI.put(this.makeURL('/users/' + userUpdate.user.id), userUpdate, token).then( response => { - AppDispatcher.dispatch({ - type: 'users/current-user', - currentUser: response.user - }); - }).catch(error => { - AppDispatcher.dispatch({ - type: 'users/current-user-error', - error: error - }); - }); - } - } export default new UsersDataManager(); diff --git a/src/widget/widget.js b/src/widget/widget.js index 35f15ed..98b1ce0 100644 --- a/src/widget/widget.js +++ b/src/widget/widget.js @@ -19,7 +19,6 @@ import React from 'react'; import { Container } from 'flux/utils'; import AppDispatcher from '../common/app-dispatcher'; -import LoginStore from '../user/login-store'; import ICDataStore from '../ic/ic-data-store'; import ConfigsStore from '../componentconfig/config-store'; import FileStore from '../file/file-store'; @@ -49,7 +48,7 @@ import '../styles/widgets.css'; class Widget extends React.Component { static getStores() { - return [ ICDataStore, ConfigsStore, FileStore, LoginStore, SignalStore]; + return [ ICDataStore, ConfigsStore, FileStore, SignalStore]; } static calculateState(prevState, props) { @@ -85,7 +84,7 @@ class Widget extends React.Component { signals: signals, icIDs: icIDs, files: FileStore.getState(), - sessionToken: LoginStore.getState().token + sessionToken: localStorage.getItem("token") }; } diff --git a/src/widget/widgets/custom-action.js b/src/widget/widgets/custom-action.js index 822121d..cdd8078 100644 --- a/src/widget/widgets/custom-action.js +++ b/src/widget/widgets/custom-action.js @@ -18,7 +18,6 @@ import React, { Component } from 'react'; import { Button } from 'react-bootstrap'; import Icon from '../../common/icon'; -import LoginStore from '../../user/login-store'; import ICStore from '../../ic/ic-store'; import AppDispatcher from '../../common/app-dispatcher'; @@ -32,7 +31,7 @@ class WidgetCustomAction extends Component { } static getStores() { - return [ ICStore, LoginStore ]; + return [ ICStore ]; } static getDerivedStateFromProps(props, state){ @@ -42,7 +41,7 @@ class WidgetCustomAction extends Component { return{ ic: ICStore.getState().find(s => s.id === props.icIDs[0]), - sessionToken: LoginStore.getState().token + sessionToken: localStorage.getItem("token") }; } From 08d2090087ec35ebdac1f01bfc715591ed210a9c Mon Sep 17 00:00:00 2001 From: Sonja Happ Date: Wed, 30 Sep 2020 13:46:38 +0200 Subject: [PATCH 345/391] Increase refresh interval for ICs to 10 sec --- src/ic/ics.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ic/ics.js b/src/ic/ics.js index 43101d2..7dc2057 100644 --- a/src/ic/ics.js +++ b/src/ic/ics.js @@ -90,7 +90,7 @@ class InfrastructureComponents extends Component { }); // Start timer for periodic refresh - this.timer = window.setInterval(() => this.refresh(), 1000); + this.timer = window.setInterval(() => this.refresh(), 10000); } componentWillUnmount() { From 98d27cbe59e8d0792dec6a380c9d9243224089ab Mon Sep 17 00:00:00 2001 From: Sonja Happ Date: Wed, 30 Sep 2020 14:56:33 +0200 Subject: [PATCH 346/391] add badges for missing states of ICs --- src/ic/ics.js | 55 +++++++++++++++++++++++++++++++++++++++------------ 1 file changed, 42 insertions(+), 13 deletions(-) diff --git a/src/ic/ics.js b/src/ic/ics.js index 7dc2057..218c212 100644 --- a/src/ic/ics.js +++ b/src/ic/ics.js @@ -229,28 +229,57 @@ class InfrastructureComponents extends Component { } switch (state) { - case 'running': - style.push('badge-success'); - break; - - case 'paused': - style.push('badge-info'); - break; - - case 'idle': - style.push('badge-primary'); - break; - case 'error': style.push('badge-danger'); break; - + case 'idle': + style.push('badge-primary'); + break; + case 'starting': + style.push('badge-info'); + break; + case 'running': + style.push('badge-success'); + break; + case 'pausing': + style.push('badge-info'); + break; + case 'paused': + style.push('badge-info'); + break; + case 'resuming': + style.push('badge-warning'); + break; + case 'stopping': + style.push('badge-warning'); + break; + case 'resetting': + style.push('badge-warning'); + break; + case 'shuttingdown': + style.push('badge-warning'); + break; case 'shutdown': style.push('badge-warning'); break; default: style.push('badge-default'); + + + /* Possible states of ICs + * 'error': ['resetting', 'error'], + 'idle': ['resetting', 'error', 'idle', 'starting', 'shuttingdown'], + 'starting': ['resetting', 'error', 'running'], + 'running': ['resetting', 'error', 'pausing', 'stopping'], + 'pausing': ['resetting', 'error', 'paused'], + 'paused': ['resetting', 'error', 'resuming', 'stopping'], + 'resuming': ['resetting', 'error', 'running'], + 'stopping': ['resetting', 'error', 'idle'], + 'resetting': ['resetting', 'error', 'idle'], + 'shuttingdown': ['shutdown', 'error'], + 'shutdown': ['starting', 'error'] + * */ } return style.join(' ') From 10fb7d2421c369d6361c7613285fd19505be188b Mon Sep 17 00:00:00 2001 From: Sonja Happ Date: Wed, 30 Sep 2020 17:00:13 +0200 Subject: [PATCH 347/391] remove debug output from table --- src/widget/widgets/table.js | 1 - 1 file changed, 1 deletion(-) diff --git a/src/widget/widgets/table.js b/src/widget/widgets/table.js index 2a31cc8..8058df7 100644 --- a/src/widget/widgets/table.js +++ b/src/widget/widgets/table.js @@ -45,7 +45,6 @@ class WidgetTable extends Component { if (sig.direction === "out") { if (props.data[icID] != null && props.data[icID].output != null && props.data[icID].output.values != null) { if (props.data[icID].output.values[sig.index-1] !== undefined) { - console.log("Table: sig", sig) let data = props.data[icID].output.values[sig.index-1]; rows.push({ name: sig.name, From 9c3c78cbf2476c5e69f193f8c29514291681418e Mon Sep 17 00:00:00 2001 From: Laura Fuentes Grau Date: Sat, 10 Oct 2020 21:27:23 +0200 Subject: [PATCH 348/391] WIP: Add option to recover forgotten password #260 --- src/user/login-form.js | 15 +++++++- src/user/recover-password.js | 72 ++++++++++++++++++++++++++++++++++++ 2 files changed, 86 insertions(+), 1 deletion(-) create mode 100644 src/user/recover-password.js diff --git a/src/user/login-form.js b/src/user/login-form.js index 96df3b0..1c2fc5e 100644 --- a/src/user/login-form.js +++ b/src/user/login-form.js @@ -17,7 +17,7 @@ import React, { Component } from 'react'; import { Form, Button, FormGroup, FormControl, FormLabel, Col } from 'react-bootstrap'; - +import RecoverPassword from './recover-password' import AppDispatcher from '../common/app-dispatcher'; class LoginForm extends Component { @@ -27,6 +27,7 @@ class LoginForm extends Component { this.state = { username: '', password: '', + forgottenPassword: false, disableLogin: true } } @@ -55,6 +56,14 @@ class LoginForm extends Component { this.setState({ [event.target.id]: event.target.value, disableLogin }); } + openRecoverPassword(){ + this.setState({forgottenPassword: true}); + } + + closeRecoverPassword(){ + this.setState({forgottenPassword: false}); + } + render() { return (
    @@ -83,10 +92,14 @@ class LoginForm extends Component {
    + + + this.closeRecoverPassword()} sessionToken={this.props.sessionToken} /> + ); } } diff --git a/src/user/recover-password.js b/src/user/recover-password.js new file mode 100644 index 0000000..c278b46 --- /dev/null +++ b/src/user/recover-password.js @@ -0,0 +1,72 @@ +/** + * This file is part of VILLASweb. + * + * VILLASweb is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * VILLASweb is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with VILLASweb. If not, see . + ******************************************************************************/ + +import React from 'react'; +import Dialog from '../common/dialogs/dialog'; +import {Col, Row} from 'react-bootstrap'; + + +class RecoverPassword extends React.Component { + constructor(props) { + super(props); + + this.state = { + admins: this.props.admins + } + } + + + onClose() { + this.props.onClose(); + } + + + + + + + render() { + return ( + this.onClose(c)} blendOutCancel = {true} valid={true}> +
    + Please contact an administrator +
    + {this.state.admins != null && this.state.admins.map(admin => ( +
    + +
    Admin: + {admin.username} + + + + + E-mail: + {admin.mail} + + + + ))} + + + + + + ); + } +} + +export default RecoverPassword; From 70d13c99483c6e947a8bd9e724ebc638c9559c83 Mon Sep 17 00:00:00 2001 From: Sonja Happ Date: Tue, 13 Oct 2020 15:22:51 +0200 Subject: [PATCH 349/391] Add timepicker to select delay for command execution, delay defaults to 0 (immediate execution), closes #173 --- package-lock.json | 28 +++++++++++++++++++------- package.json | 1 + src/ic/ic-action.js | 43 +++++++++++++++++++++++----------------- src/scenario/scenario.js | 10 ++++++++-- 4 files changed, 55 insertions(+), 27 deletions(-) diff --git a/package-lock.json b/package-lock.json index ba61ff2..43007e5 100644 --- a/package-lock.json +++ b/package-lock.json @@ -8772,9 +8772,9 @@ } }, "node-forge": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.9.0.tgz", - "integrity": "sha512-7ASaDa3pD+lJ3WvXFsxekJQelBKRpne+GOVbLbtHYdd7pFspyeuJHnWfLplGf3SwKGbfs/aYl5V/JCIaHVUKKQ==" + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.10.0.tgz", + "integrity": "sha512-PPmu8eEeG9saEUvI97fm4OYxXVB6bFvyNTyiUOBichBpFG8A1Ljw3bY62+5oOjDEMHRnd0Y7HQ+x7uzxOzC6JA==" }, "node-gyp": { "version": "3.8.0", @@ -11018,6 +11018,15 @@ } } }, + "react-bootstrap-time-picker": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/react-bootstrap-time-picker/-/react-bootstrap-time-picker-2.0.1.tgz", + "integrity": "sha512-hbZyoLWav9P6UPTQPQRoC7rQT5UYb0a4Cs/8Wiszs1Rda/cH3Ar1B2uM78GKJjXMK0VYGR9XKyza2BCnLJ+ZSA==", + "requires": { + "prop-types": "^15.7.2", + "time-number": "^1.1.0" + } + }, "react-collapse": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/react-collapse/-/react-collapse-5.0.1.tgz", @@ -12226,11 +12235,11 @@ "integrity": "sha1-Yl2GWPhlr0Psliv8N2o3NZpJlMo=" }, "selfsigned": { - "version": "1.10.7", - "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-1.10.7.tgz", - "integrity": "sha512-8M3wBCzeWIJnQfl43IKwOmC4H/RAp50S8DF60znzjW5GVqTcSe2vWclt7hmYVPkKPlHWOu5EaWOMZ2Y6W8ZXTA==", + "version": "1.10.8", + "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-1.10.8.tgz", + "integrity": "sha512-2P4PtieJeEwVgTU9QEcwIRDQ/mXJLX8/+I3ur+Pg16nS8oNbrGxEso9NyYWy8NAmXiNl4dlAp5MwoNeCWzON4w==", "requires": { - "node-forge": "0.9.0" + "node-forge": "^0.10.0" } }, "semver": { @@ -13409,6 +13418,11 @@ "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz", "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==" }, + "time-number": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/time-number/-/time-number-1.1.0.tgz", + "integrity": "sha1-k6ABk6Lk+EG/uodROYf02+PAmk4=" + }, "timers-browserify": { "version": "2.0.11", "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.11.tgz", diff --git a/package.json b/package.json index dcc18c3..1370a79 100644 --- a/package.json +++ b/package.json @@ -33,6 +33,7 @@ "rc-slider": "^9.3.1", "react": "^16.13.1", "react-bootstrap": "^1.3.0", + "react-bootstrap-time-picker": "^2.0.1", "react-collapse": "^5.0.1", "react-contexify": "^4.1.1", "react-d3": "^0.4.0", diff --git a/src/ic/ic-action.js b/src/ic/ic-action.js index 80c60e0..9eaabe0 100644 --- a/src/ic/ic-action.js +++ b/src/ic/ic-action.js @@ -16,14 +16,16 @@ ******************************************************************************/ import React from 'react'; -import { Button, ButtonToolbar, DropdownButton, Dropdown, Tooltip, OverlayTrigger } from 'react-bootstrap'; +import { Button, ButtonToolbar, DropdownButton, Dropdown } from 'react-bootstrap'; +import TimePicker from 'react-bootstrap-time-picker' class ICAction extends React.Component { constructor(props) { super(props); this.state = { - selectedAction: null + selectedAction: null, + selectedDelay: 0 }; } @@ -47,9 +49,15 @@ class ICAction extends React.Component { } }; + setDelayForAction = time => { + // time in int format: (hours * 3600 + minutes * 60 + seconds) + this.setState({selectedDelay: time}) + } + render() { - let showTooltip = this.state.selectedAction.id === '-1'; - + + let sendCommandDisabled = this.props.runDisabled || this.state.selectedAction == null || this.state.selectedAction.id === "-1" + const actionList = this.props.actions.map(action => ( {action.title} @@ -57,25 +65,24 @@ class ICAction extends React.Component { )); return
    - {showTooltip ? - - Select command for infrastructure component } > - - {actionList} - - - Send command to infrastructure component } > - - - - : + {"Select delay for command execution (Format hh:mm, max 1h):"} + {actionList} - + + + - }
    ; } } diff --git a/src/scenario/scenario.js b/src/scenario/scenario.js index 7fd8f23..cd8fe80 100644 --- a/src/scenario/scenario.js +++ b/src/scenario/scenario.js @@ -303,7 +303,8 @@ class Scenario extends React.Component { this.setState({ selectedConfigs: selectedConfigs }); } - runAction(action) { + runAction(action, delay) { + // delay in seconds if(action.data.action === 'none'){ console.warn("No command selected. Nothing was sent."); @@ -327,6 +328,11 @@ class Scenario extends React.Component { action.data.parameters = this.state.configs[index].startParameters; } + // Unix time stamp + delay + action.data.when = Date.now() / 1000.0 + delay + + console.log("Sending action: ", action.data) + AppDispatcher.dispatch({ type: 'ics/start-action', ic: ic, @@ -597,7 +603,7 @@ class Scenario extends React.Component {
    this.runAction(action)} + runAction={(action, delay) => this.runAction(action, delay)} actions={[ { id: '-1', title: 'Select command', data: { action: 'none' } }, { id: '0', title: 'Start', data: { action: 'start' } }, From 723af74e6db3fc2b3c97f7a57ad0d8d76f025e2a Mon Sep 17 00:00:00 2001 From: Sonja Happ Date: Tue, 13 Oct 2020 16:57:39 +0200 Subject: [PATCH 350/391] Fix for command selection in IC list --- src/ic/ics.js | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/ic/ics.js b/src/ic/ics.js index 218c212..49442d8 100644 --- a/src/ic/ics.js +++ b/src/ic/ics.js @@ -333,7 +333,12 @@ class InfrastructureComponents extends Component { + actions={[ + { id: '-1', title: 'Select command', data: { action: 'none' } }, + { id: '0', title: 'Reset', data: { action: 'reset' } }, + { id: '1', title: 'Shutdown', data: { action: 'shutdown' } }, + ]} + />
    :
    From 91be57fc068098c0821eaca4a7a148393502b950 Mon Sep 17 00:00:00 2001 From: Laura Fuentes Grau Date: Fri, 16 Oct 2020 21:31:15 +0200 Subject: [PATCH 351/391] added new way to change Gauge colorzones #251 --- .../edit-widget-color-zones-control.js | 66 +++++++++++++++---- src/widget/widgets/table.js | 1 - 2 files changed, 52 insertions(+), 15 deletions(-) diff --git a/src/widget/edit-widget/edit-widget-color-zones-control.js b/src/widget/edit-widget/edit-widget-color-zones-control.js index a4bdf7e..4ade39f 100644 --- a/src/widget/edit-widget/edit-widget-color-zones-control.js +++ b/src/widget/edit-widget/edit-widget-color-zones-control.js @@ -33,7 +33,7 @@ class EditWidgetColorZonesControl extends React.Component { } }, selectedZone: null, - selectedIndex: 0, + selectedIndex: null, showColorPicker: false, originalColor: null, minValue: 0, @@ -61,22 +61,28 @@ class EditWidgetColorZonesControl extends React.Component { } } - this.setState({ widget }); + this.setState({ widget, selectedZone: null, selectedIndex: null }); this.sendEvent(widget); } removeZones = () => { - // remove zones - const widget = this.state.widget; + + let temp = this.state.widget; - /*this.state.selectedZones.forEach(row => { - widget.customProperties.zones.splice(row, 1); - }); + temp.customProperties.zones.splice(this.state.selectedIndex, 1); - this.setState({ selectedZones: [], widget });*/ + if(temp.customProperties.zones.length > 0){ + let length = temp.customProperties.zones.length + + for(let i= 0 ; i < length; i++){ + temp.customProperties.zones[i].min = i* 100/length; + temp.customProperties.zones[i].max = (i+1)* 100/length; + } + } + + this.setState({widget: temp,selectedZone: null, selectedIndex: null}); - this.sendEvent(widget); } changeCell = (event, row, column) => { @@ -97,8 +103,12 @@ class EditWidgetColorZonesControl extends React.Component { } editColorZone = (index) => { + if(this.state.selectedIndex !== index){ this.setState({selectedZone: this.state.widget.customProperties.zones[index], selectedIndex: index , minValue: this.state.widget.customProperties.zones[index].min, maxValue: this.state.widget.customProperties.zones[index].max}); - + } + else{ + this.setState({selectedZone: null, selectedIndex: null}); + } } openColorPicker = () =>{ @@ -119,8 +129,35 @@ class EditWidgetColorZonesControl extends React.Component { } } - handleMinMaxChange = () => { - } + handleMinChange = (e) => { + + if(e.target.value < 0) return; + this.setState({minValue: e.target.value}); + + let temp = this.state.widget; + temp.customProperties.zones[this.state.selectedIndex]['min'] = e.target.value; + + if(this.state.selectedIndex !== 0){ + temp.customProperties.zones[this.state.selectedIndex - 1]['max'] = e.target.value + } + + this.setState({ widget: temp }); + } + + handleMaxChange = (e) => { + + if(e.target.value > 100) return; + this.setState({maxValue: e.target.value}); + + let temp = this.state.widget; + temp.customProperties.zones[this.state.selectedIndex]['max'] = e.target.value; + + if(this.state.selectedIndex !== this.state.widget.customProperties.zones.length -1){ + temp.customProperties.zones[this.state.selectedIndex + 1]['min'] = e.target.value + } + + this.setState({ widget: temp }); + } sendEvent(widget) { // create event @@ -194,7 +231,7 @@ class EditWidgetColorZonesControl extends React.Component { step="any" placeholder="Min" value={this.state.minValue} - onChange={e => this.handleMinMaxChange(e)} /> + onChange={e => this.handleMinChange(e)} />
    Max: @@ -203,11 +240,12 @@ class EditWidgetColorZonesControl extends React.Component { step="any" placeholder="Max" value={ this.state.maxValue} - onChange={e => this.handleMinMaxChange(e)} /> + onChange={e => this.handleMaxChange(e)} />
    + this.closeEditModal(data)} widget={this.state.widget} zoneIndex={this.state.selectedIndex} controlId={'strokeStyle'} /> diff --git a/src/widget/widgets/table.js b/src/widget/widgets/table.js index 2a31cc8..8058df7 100644 --- a/src/widget/widgets/table.js +++ b/src/widget/widgets/table.js @@ -45,7 +45,6 @@ class WidgetTable extends Component { if (sig.direction === "out") { if (props.data[icID] != null && props.data[icID].output != null && props.data[icID].output.values != null) { if (props.data[icID].output.values[sig.index-1] !== undefined) { - console.log("Table: sig", sig) let data = props.data[icID].output.values[sig.index-1]; rows.push({ name: sig.name, From 1307bd35fc58a24f7cf1fa2149190fcd73f8eeac Mon Sep 17 00:00:00 2001 From: Laura Fuentes Grau Date: Mon, 19 Oct 2020 14:30:00 +0200 Subject: [PATCH 352/391] Slider Widget: continuous update now works #261 --- src/widget/widgets/slider.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/widget/widgets/slider.js b/src/widget/widgets/slider.js index 8e7e2ff..36d1fe9 100644 --- a/src/widget/widgets/slider.js +++ b/src/widget/widgets/slider.js @@ -99,7 +99,7 @@ class WidgetSlider extends Component { valueIsChanging(newValue) { this.props.widget.customProperties.value = newValue; - if (this.props.widget.continous_update) + if (this.props.widget.customProperties.continous_update) this.valueChanged(newValue); this.setState({ value: newValue }); From 487fcc2bdd5b07e1d4b1fa4155c5e792872a6822 Mon Sep 17 00:00:00 2001 From: Laura Fuentes Grau Date: Mon, 19 Oct 2020 18:36:12 +0200 Subject: [PATCH 353/391] WIP: add edit signals button to dashboard #262 --- src/dashboard/dashboard-button-group.js | 16 +++++++++ src/dashboard/dashboard.js | 47 ++++++++++++++++++++++--- src/signal/edit-signal-mapping.js | 13 ++++++- 3 files changed, 71 insertions(+), 5 deletions(-) diff --git a/src/dashboard/dashboard-button-group.js b/src/dashboard/dashboard-button-group.js index 89289df..24a69e2 100644 --- a/src/dashboard/dashboard-button-group.js +++ b/src/dashboard/dashboard-button-group.js @@ -91,6 +91,22 @@ class DashboardButtonGroup extends React.Component { ); + buttons.push( + Add, edit or delete input signal } > + + + ); + + buttons.push( + Add, edit or delete output signals } > + + + ); + buttons.push( Add widgets and edit layout } >
    @@ -521,6 +541,25 @@ class Dashboard extends Component { scenarioID={this.state.dashboard.scenarioID} /> + this.closeEditSignalsModal(direction)} + direction="Output" + signals={this.state.signals} + configID={null} + configs={this.state.configs} + sessionToken={this.state.sessionToken} + /> + this.closeEditSignalsModal(direction)} + direction="Input" + signals={this.state.signals} + configID={null} + configs={this.state.configs} + sessionToken={this.state.sessionToken} + /> +
    ; diff --git a/src/signal/edit-signal-mapping.js b/src/signal/edit-signal-mapping.js index 59d2818..d1638be 100644 --- a/src/signal/edit-signal-mapping.js +++ b/src/signal/edit-signal-mapping.js @@ -47,9 +47,20 @@ class EditSignalMapping extends React.Component { static getDerivedStateFromProps(props, state){ // filter all signals by configID and direction - let signals = props.signals.filter((sig) => { + let signals = []; + if(props.signalID != null || typeof props.configs === "undefined"){ + signals = props.signals.filter((sig) => { return (sig.configID === props.configID) && (sig.direction === state.dir); }); + } + else{ + for(let i = 0; i < props.configs.length; i++){ + let temp = props.signals.filter((sig) => { + return (sig.configID === props.configs[i].id) && (sig.direction === state.dir); + }) + signals = signals.concat(temp); + } + } return { signals: signals, From ea524f677f80ce9334272d6d101e6b46f47ea067 Mon Sep 17 00:00:00 2001 From: Laura Fuentes Grau Date: Tue, 20 Oct 2020 17:52:56 +0200 Subject: [PATCH 354/391] Add option to recover forgotten password #260 --- src/user/recover-password.js | 33 +++++++-------------------------- 1 file changed, 7 insertions(+), 26 deletions(-) diff --git a/src/user/recover-password.js b/src/user/recover-password.js index c278b46..556f0d2 100644 --- a/src/user/recover-password.js +++ b/src/user/recover-password.js @@ -17,7 +17,7 @@ import React from 'react'; import Dialog from '../common/dialogs/dialog'; -import {Col, Row} from 'react-bootstrap'; +import Config from '../config.js'; class RecoverPassword extends React.Component { @@ -25,7 +25,7 @@ class RecoverPassword extends React.Component { super(props); this.state = { - admins: this.props.admins + admin: Config.admin } } @@ -36,33 +36,14 @@ class RecoverPassword extends React.Component { - - - render() { return ( - this.onClose(c)} blendOutCancel = {true} valid={true}> + this.onClose(c)} blendOutCancel = {true} valid={true} size = 'lg'>
    - Please contact an administrator -
    - {this.state.admins != null && this.state.admins.map(admin => ( -
    - - Admin: - {admin.username} - - - - - E-mail: - {admin.mail} - - -
    - ))} -
    - - +
    Please contact:
    +
    {this.state.admin.name}
    +
    E-Mail:
    + {this.state.admin.mail}
    ); From c5724e4195adcddcbfc4b9758e56d2eae06a3d63 Mon Sep 17 00:00:00 2001 From: irismarie Date: Thu, 22 Oct 2020 10:35:56 +0200 Subject: [PATCH 355/391] fix: calculate length of line correctly, #206 --- src/widget/widgets/line.js | 14 +++++--------- 1 file changed, 5 insertions(+), 9 deletions(-) diff --git a/src/widget/widgets/line.js b/src/widget/widgets/line.js index 94a33df..93249f6 100644 --- a/src/widget/widgets/line.js +++ b/src/widget/widgets/line.js @@ -51,19 +51,15 @@ class WidgetLine extends Component { // calculate the length of the line let length = 0; - if (width <= height) { - if (rotation > 0) { - length = width / Math.abs(Math.cos(rad)); + if (rotation > 0) { + if (width <= height) { + length = width / Math.abs(Math.cos(rad)); } else { - length = width - } - } else { // height < width - if (rotation > 0) { length = height / Math.abs(Math.sin(rad)); - } else { - length = height; } + } else { + length = width; } // calculate line coordinates (in percent) From de259acf458578efdaf09a3b2896ef7d2a5a800f Mon Sep 17 00:00:00 2001 From: Laura Fuentes Grau Date: Fri, 23 Oct 2020 12:52:35 +0200 Subject: [PATCH 356/391] Server not reachable notification displayed if server is down --- src/common/api/rest-api.js | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/src/common/api/rest-api.js b/src/common/api/rest-api.js index 3bb18d1..76eabe3 100644 --- a/src/common/api/rest-api.js +++ b/src/common/api/rest-api.js @@ -36,9 +36,9 @@ const REQUEST_TIMEOUT_NOTIFICATION = { // Can be used for the rest of requests function isNetworkError(err) { let result = false; - + // If not status nor response fields, it is a network error. TODO: Handle timeouts - if (err.status == null || err.response == null) { + if (err.status == null || err.status == 500 || err.response == null) { result = true; let notification = err.timeout? REQUEST_TIMEOUT_NOTIFICATION : SERVER_NOT_REACHABLE_NOTIFICATION; @@ -58,6 +58,7 @@ class RestAPI { req.end(function (error, res) { if (res == null || res.status !== 200) { + error.handled = isNetworkError(error); reject(error); } else { resolve(JSON.parse(res.text)); @@ -97,6 +98,7 @@ class RestAPI { req.end(function (error, res) { if (res == null || res.status !== 200) { + error.handled = isNetworkError(error); reject(error); } else { resolve(JSON.parse(res.text)); @@ -115,6 +117,7 @@ class RestAPI { req.end(function (error, res) { if (res == null || res.status !== 200) { + error.handled = isNetworkError(error); reject(error); } else { resolve(JSON.parse(res.text)); @@ -133,6 +136,7 @@ class RestAPI { req.end(function (error, res) { if (res == null || res.status !== 200) { + error.handled = isNetworkError(error); reject(error); } else { resolve(JSON.parse(res.text)); @@ -152,6 +156,7 @@ class RestAPI { req.end(function (error, res) { if (error !== null || res.status !== 200) { + error.handled = isNetworkError(error); reject(error); } else { // file data is contained in res.body (because of blob response type) From 7c459aef1a74a35df40504ea28f3a0a2ad66cb79 Mon Sep 17 00:00:00 2001 From: Laura Fuentes Grau Date: Fri, 23 Oct 2020 12:56:35 +0200 Subject: [PATCH 357/391] resolved warning --- src/common/api/rest-api.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/common/api/rest-api.js b/src/common/api/rest-api.js index 76eabe3..5667ead 100644 --- a/src/common/api/rest-api.js +++ b/src/common/api/rest-api.js @@ -36,9 +36,9 @@ const REQUEST_TIMEOUT_NOTIFICATION = { // Can be used for the rest of requests function isNetworkError(err) { let result = false; - + // If not status nor response fields, it is a network error. TODO: Handle timeouts - if (err.status == null || err.status == 500 || err.response == null) { + if (err.status == null || err.status === 500 || err.response == null) { result = true; let notification = err.timeout? REQUEST_TIMEOUT_NOTIFICATION : SERVER_NOT_REACHABLE_NOTIFICATION; From 6b21befcb92e5772b12440fe96f71a85bae40068 Mon Sep 17 00:00:00 2001 From: Laura Fuentes Grau Date: Fri, 23 Oct 2020 14:07:05 +0200 Subject: [PATCH 358/391] Show Server not reachable notification only once #68 --- src/common/api/rest-api.js | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/common/api/rest-api.js b/src/common/api/rest-api.js index 5667ead..084456c 100644 --- a/src/common/api/rest-api.js +++ b/src/common/api/rest-api.js @@ -47,6 +47,8 @@ function isNetworkError(err) { return result; } +let prevURL = null; + class RestAPI { get(url, token) { return new Promise(function (resolve, reject) { @@ -58,7 +60,8 @@ class RestAPI { req.end(function (error, res) { if (res == null || res.status !== 200) { - error.handled = isNetworkError(error); + if (req.url !== prevURL) error.handled = isNetworkError(error); + prevURL = req.url; reject(error); } else { resolve(JSON.parse(res.text)); From 95dd9330dba5498068395e2987983f16499b25aa Mon Sep 17 00:00:00 2001 From: Laura Fuentes Grau Date: Fri, 23 Oct 2020 21:26:23 +0200 Subject: [PATCH 359/391] Add edit signals button to dashboard #262 --- src/dashboard/dashboard-button-group.js | 2 +- src/dashboard/dashboard.js | 9 +++-- src/signal/edit-signal-mapping.js | 51 ++++++++++++++++++------- 3 files changed, 45 insertions(+), 17 deletions(-) diff --git a/src/dashboard/dashboard-button-group.js b/src/dashboard/dashboard-button-group.js index 24a69e2..7f49292 100644 --- a/src/dashboard/dashboard-button-group.js +++ b/src/dashboard/dashboard-button-group.js @@ -92,7 +92,7 @@ class DashboardButtonGroup extends React.Component { ); buttons.push( - Add, edit or delete input signal } > + Add, edit or delete input signals } > diff --git a/src/dashboard/dashboard.js b/src/dashboard/dashboard.js index 2fbc259..fc60d2b 100644 --- a/src/dashboard/dashboard.js +++ b/src/dashboard/dashboard.js @@ -90,7 +90,7 @@ class Dashboard extends Component { dashboard.height = maxHeight + 80; } } - + // filter signals to the ones belonging to the scenario at hand let signals = [] let allSignals = SignalStore.getState(); @@ -118,6 +118,9 @@ class Dashboard extends Component { }); } + let editOutputSignalsModal = prevState.editOutputSignalsModal; + let editInputSignalsModal = prevState.editInputSignalsModal; + return { dashboard, widgets, @@ -131,8 +134,8 @@ class Dashboard extends Component { paused: prevState.paused || false, editModal: prevState.editModal || false, - editOutputSignalsModal: prevState.editOutputSignals || false, - editInputSignalsModal: prevState.editInputSignals || false, + editOutputSignalsModal: editOutputSignalsModal, + editInputSignalsModal: editInputSignalsModal, filesEditModal: prevState.filesEditModal || false, filesEditSaveState: prevState.filesEditSaveState || [], modalData: null, diff --git a/src/signal/edit-signal-mapping.js b/src/signal/edit-signal-mapping.js index d1638be..82a8442 100644 --- a/src/signal/edit-signal-mapping.js +++ b/src/signal/edit-signal-mapping.js @@ -18,6 +18,7 @@ import React from 'react'; import PropTypes from 'prop-types'; import {Button, FormGroup, FormLabel, FormText} from 'react-bootstrap'; +import {Collapse} from 'react-collapse'; import Table from '../common/table'; import TableColumn from '../common/table-column'; import Dialog from "../common/dialogs/dialog"; @@ -40,7 +41,8 @@ class EditSignalMapping extends React.Component { this.state = { dir, signals: [], - modifiedSignalIDs : [] + modifiedSignalIDs : [], + openCollapse: false }; } @@ -49,15 +51,15 @@ class EditSignalMapping extends React.Component { // filter all signals by configID and direction let signals = []; if(props.signalID != null || typeof props.configs === "undefined"){ - signals = props.signals.filter((sig) => { - return (sig.configID === props.configID) && (sig.direction === state.dir); - }); - } - else{ - for(let i = 0; i < props.configs.length; i++){ - let temp = props.signals.filter((sig) => { - return (sig.configID === props.configs[i].id) && (sig.direction === state.dir); - }) + signals = props.signals.filter((sig) => { + return (sig.configID === props.configID) && (sig.direction === state.dir); + }); + } + else{ + for(let i = 0; i < props.configs.length; i++){ + let temp = props.signals.filter((sig) => { + return (sig.configID === props.configs[i].id) && (sig.direction === state.dir); + }) signals = signals.concat(temp); } } @@ -132,10 +134,20 @@ class EditSignalMapping extends React.Component { }; - handleAdd = () => { + handleAdd = (configID = null) => { + if(typeof this.props.configs !== "undefined"){ + + if(configID === null){ + this.setState({openCollapse: true}); + return + } + } + else{ + configID = this.props.configID; + } let newSignal = { - configID: this.props.configID, + configID: configID, direction: this.state.dir, name: "PlaceholderName", unit: "PlaceholderUnit", @@ -149,6 +161,7 @@ class EditSignalMapping extends React.Component { token: this.props.sessionToken }); + this.setState({openCollapse: false}); }; resetState() { @@ -190,7 +203,19 @@ class EditSignalMapping extends React.Component {
    - + +
    +
    + +
    Choose a Component Configuration to add the signal to:
    +
    + {typeof this.props.configs !== "undefined" && this.props.configs.map(config => ( + + + + ))} +
    +
    From edf1e51a21579683ba762646271674b312e2cce6 Mon Sep 17 00:00:00 2001 From: Laura Fuentes Grau Date: Sat, 24 Oct 2020 13:37:17 +0200 Subject: [PATCH 360/391] Add column for ManagedExternally parameter #266 --- src/ic/ics.js | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/src/ic/ics.js b/src/ic/ics.js index 49442d8..635b7a8 100644 --- a/src/ic/ics.js +++ b/src/ic/ics.js @@ -291,6 +291,16 @@ class InfrastructureComponents extends Component { return dateTime.toLocaleString('de-DE'); } + modifyManagedExternallyColumn(managedExternally){ + + if(managedExternally){ + return + } else { + return + } + + } + render() { const buttonStyle = { marginLeft: '10px' @@ -306,6 +316,7 @@ class InfrastructureComponents extends Component { this.stateLabelStyle(state, component)} /> + this.modifyManagedExternallyColumn(managedexternally)} width='105' /> {/* */} From c2d0378ee51eea263edc54631101e60504613abb Mon Sep 17 00:00:00 2001 From: Laura Fuentes Grau Date: Sat, 24 Oct 2020 19:01:05 +0200 Subject: [PATCH 361/391] Edit button disabled for externally managed ICs #266 --- src/common/table.js | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/common/table.js b/src/common/table.js index 87a52be..b1c32f5 100644 --- a/src/common/table.js +++ b/src/common/table.js @@ -103,8 +103,9 @@ class CustomTable extends Component { // add buttons if (child.props.editButton) { - cell.push( Edit } > - ); + let disable = (typeof data.managedexternally !== "undefined" && data.managedexternally); + cell.push({disable? "Externally managed ICs cannot be edited" : "edit"} } > + ); } if (child.props.deleteButton) { From 02d734238b95c1805f3e0edf50e75d97a7c5bbd9 Mon Sep 17 00:00:00 2001 From: Sonja Happ Date: Mon, 26 Oct 2020 13:54:58 +0100 Subject: [PATCH 362/391] Package updates --- package-lock.json | 10011 +++++++++++++++++++++++++++++--------------- package.json | 50 +- 2 files changed, 6753 insertions(+), 3308 deletions(-) diff --git a/package-lock.json b/package-lock.json index 7755096..38291bf 100644 --- a/package-lock.json +++ b/package-lock.json @@ -4,11 +4,6 @@ "lockfileVersion": 1, "requires": true, "dependencies": { - "@ant-design/css-animation": { - "version": "1.7.2", - "resolved": "https://registry.npmjs.org/@ant-design/css-animation/-/css-animation-1.7.2.tgz", - "integrity": "sha512-bvVOe7A+r7lws58B7r+fgnQDK90cV45AXuvGx6i5CCSX1W/M3AJnHsNggDANBxEtWdNdFWcDd5LorB+RdSIlBw==" - }, "@babel/code-frame": { "version": "7.10.4", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz", @@ -18,40 +13,28 @@ } }, "@babel/compat-data": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.11.0.tgz", - "integrity": "sha512-TPSvJfv73ng0pfnEOh17bYMPQbI95+nGWc71Ss4vZdRBHTDqmM9Z8ZV4rYz8Ks7sfzc95n30k6ODIq5UGnXcYQ==", - "requires": { - "browserslist": "^4.12.0", - "invariant": "^2.2.4", - "semver": "^5.5.0" - }, - "dependencies": { - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" - } - } + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.12.1.tgz", + "integrity": "sha512-725AQupWJZ8ba0jbKceeFblZTY90McUBWMwHhkFQ9q1zKPJ95GUktljFcgcsIVwRnTnRKlcYzfiNImg5G9m6ZQ==" }, "@babel/core": { - "version": "7.9.0", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.9.0.tgz", - "integrity": "sha512-kWc7L0fw1xwvI0zi8OKVBuxRVefwGOrKSQMvrQ3dW+bIIavBY3/NpXmpjMy7bQnLgwgzWQZ8TlM57YHpHNHz4w==", + "version": "7.12.3", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.12.3.tgz", + "integrity": "sha512-0qXcZYKZp3/6N2jKYVxZv0aNCsxTSVCiK72DTiTYZAu7sjg73W0/aynWjMbiGd87EQL4WyA8reiJVh92AVla9g==", "requires": { - "@babel/code-frame": "^7.8.3", - "@babel/generator": "^7.9.0", - "@babel/helper-module-transforms": "^7.9.0", - "@babel/helpers": "^7.9.0", - "@babel/parser": "^7.9.0", - "@babel/template": "^7.8.6", - "@babel/traverse": "^7.9.0", - "@babel/types": "^7.9.0", + "@babel/code-frame": "^7.10.4", + "@babel/generator": "^7.12.1", + "@babel/helper-module-transforms": "^7.12.1", + "@babel/helpers": "^7.12.1", + "@babel/parser": "^7.12.3", + "@babel/template": "^7.10.4", + "@babel/traverse": "^7.12.1", + "@babel/types": "^7.12.1", "convert-source-map": "^1.7.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.1", "json5": "^2.1.2", - "lodash": "^4.17.13", + "lodash": "^4.17.19", "resolve": "^1.3.2", "semver": "^5.4.1", "source-map": "^0.5.0" @@ -70,11 +53,11 @@ } }, "@babel/generator": { - "version": "7.11.4", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.11.4.tgz", - "integrity": "sha512-Rn26vueFx0eOoz7iifCN2UHT6rGtnkSGWSoDRIy8jZN3B91PzeSULbswfLoOWuTuAcNwpG/mxy+uCTDnZ9Mp1g==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.12.1.tgz", + "integrity": "sha512-DB+6rafIdc9o72Yc3/Ph5h+6hUjeOp66pF0naQBgUFFuPqzQwIlPTm3xZR7YNvduIMtkDIj2t21LSQwnbCrXvg==", "requires": { - "@babel/types": "^7.11.0", + "@babel/types": "^7.12.1", "jsesc": "^2.5.1", "source-map": "^0.5.0" }, @@ -113,24 +96,23 @@ } }, "@babel/helper-builder-react-jsx-experimental": { - "version": "7.10.5", - "resolved": "https://registry.npmjs.org/@babel/helper-builder-react-jsx-experimental/-/helper-builder-react-jsx-experimental-7.10.5.tgz", - "integrity": "sha512-Buewnx6M4ttG+NLkKyt7baQn7ScC/Td+e99G914fRU8fGIUivDDgVIQeDHFa5e4CRSJQt58WpNHhsAZgtzVhsg==", + "version": "7.12.4", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-react-jsx-experimental/-/helper-builder-react-jsx-experimental-7.12.4.tgz", + "integrity": "sha512-AjEa0jrQqNk7eDQOo0pTfUOwQBMF+xVqrausQwT9/rTKy0g04ggFNaJpaE09IQMn9yExluigWMJcj0WC7bq+Og==", "requires": { "@babel/helper-annotate-as-pure": "^7.10.4", - "@babel/helper-module-imports": "^7.10.4", - "@babel/types": "^7.10.5" + "@babel/helper-module-imports": "^7.12.1", + "@babel/types": "^7.12.1" } }, "@babel/helper-compilation-targets": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.10.4.tgz", - "integrity": "sha512-a3rYhlsGV0UHNDvrtOXBg8/OpfV0OKTkxKPzIplS1zpx7CygDcWWxckxZeDd3gzPzC4kUT0A4nVFDK0wGMh4MQ==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.12.1.tgz", + "integrity": "sha512-jtBEif7jsPwP27GPHs06v4WBV0KrE8a/P7n0N0sSvHn2hwUCYnolP/CLmz51IzAW4NlN+HuoBtb9QcwnRo9F/g==", "requires": { - "@babel/compat-data": "^7.10.4", + "@babel/compat-data": "^7.12.1", + "@babel/helper-validator-option": "^7.12.1", "browserslist": "^4.12.0", - "invariant": "^2.2.4", - "levenary": "^1.1.1", "semver": "^5.5.0" }, "dependencies": { @@ -142,26 +124,25 @@ } }, "@babel/helper-create-class-features-plugin": { - "version": "7.10.5", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.10.5.tgz", - "integrity": "sha512-0nkdeijB7VlZoLT3r/mY3bUkw3T8WG/hNw+FATs/6+pG2039IJWjTYL0VTISqsNHMUTEnwbVnc89WIJX9Qed0A==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.12.1.tgz", + "integrity": "sha512-hkL++rWeta/OVOBTRJc9a5Azh5mt5WgZUGAKMD8JM141YsE08K//bp1unBBieO6rUKkIPyUE0USQ30jAy3Sk1w==", "requires": { "@babel/helper-function-name": "^7.10.4", - "@babel/helper-member-expression-to-functions": "^7.10.5", + "@babel/helper-member-expression-to-functions": "^7.12.1", "@babel/helper-optimise-call-expression": "^7.10.4", - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/helper-replace-supers": "^7.10.4", + "@babel/helper-replace-supers": "^7.12.1", "@babel/helper-split-export-declaration": "^7.10.4" } }, "@babel/helper-create-regexp-features-plugin": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.10.4.tgz", - "integrity": "sha512-2/hu58IEPKeoLF45DBwx3XFqsbCXmkdAay4spVr2x0jYgRxrSNp+ePwvSsy9g6YSaNDcKIQVPXk1Ov8S2edk2g==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.12.1.tgz", + "integrity": "sha512-rsZ4LGvFTZnzdNZR5HZdmJVuXK8834R5QkF3WvcnBhrlVtF0HSIUC6zbreL9MgjTywhKokn8RIYRiq99+DLAxA==", "requires": { "@babel/helper-annotate-as-pure": "^7.10.4", "@babel/helper-regex": "^7.10.4", - "regexpu-core": "^4.7.0" + "regexpu-core": "^4.7.1" } }, "@babel/helper-define-map": { @@ -175,11 +156,11 @@ } }, "@babel/helper-explode-assignable-expression": { - "version": "7.11.4", - "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.11.4.tgz", - "integrity": "sha512-ux9hm3zR4WV1Y3xXxXkdG/0gxF9nvI0YVmKVhvK9AfMoaQkemL3sJpXw+Xbz65azo8qJiEz2XVDUpK3KYhH3ZQ==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.12.1.tgz", + "integrity": "sha512-dmUwH8XmlrUpVqgtZ737tK88v07l840z9j3OEhCLwKTkjlvKpfqXVIZ0wpK3aeOxspwGrf/5AP5qLx4rO3w5rA==", "requires": { - "@babel/types": "^7.10.4" + "@babel/types": "^7.12.1" } }, "@babel/helper-function-name": { @@ -209,32 +190,34 @@ } }, "@babel/helper-member-expression-to-functions": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.11.0.tgz", - "integrity": "sha512-JbFlKHFntRV5qKw3YC0CvQnDZ4XMwgzzBbld7Ly4Mj4cbFy3KywcR8NtNctRToMWJOVvLINJv525Gd6wwVEx/Q==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.12.1.tgz", + "integrity": "sha512-k0CIe3tXUKTRSoEx1LQEPFU9vRQfqHtl+kf8eNnDqb4AUJEy5pz6aIiog+YWtVm2jpggjS1laH68bPsR+KWWPQ==", "requires": { - "@babel/types": "^7.11.0" + "@babel/types": "^7.12.1" } }, "@babel/helper-module-imports": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.10.4.tgz", - "integrity": "sha512-nEQJHqYavI217oD9+s5MUBzk6x1IlvoS9WTPfgG43CbMEeStE0v+r+TucWdx8KFGowPGvyOkDT9+7DHedIDnVw==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.12.1.tgz", + "integrity": "sha512-ZeC1TlMSvikvJNy1v/wPIazCu3NdOwgYZLIkmIyAsGhqkNpiDoQQRmaCK8YP4Pq3GPTLPV9WXaPCJKvx06JxKA==", "requires": { - "@babel/types": "^7.10.4" + "@babel/types": "^7.12.1" } }, "@babel/helper-module-transforms": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.11.0.tgz", - "integrity": "sha512-02EVu8COMuTRO1TAzdMtpBPbe6aQ1w/8fePD2YgQmxZU4gpNWaL9gK3Jp7dxlkUlUCJOTaSeA+Hrm1BRQwqIhg==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.12.1.tgz", + "integrity": "sha512-QQzehgFAZ2bbISiCpmVGfiGux8YVFXQ0abBic2Envhej22DVXV9nCFaS5hIQbkyo1AdGb+gNME2TSh3hYJVV/w==", "requires": { - "@babel/helper-module-imports": "^7.10.4", - "@babel/helper-replace-supers": "^7.10.4", - "@babel/helper-simple-access": "^7.10.4", + "@babel/helper-module-imports": "^7.12.1", + "@babel/helper-replace-supers": "^7.12.1", + "@babel/helper-simple-access": "^7.12.1", "@babel/helper-split-export-declaration": "^7.11.0", + "@babel/helper-validator-identifier": "^7.10.4", "@babel/template": "^7.10.4", - "@babel/types": "^7.11.0", + "@babel/traverse": "^7.12.1", + "@babel/types": "^7.12.1", "lodash": "^4.17.19" } }, @@ -260,42 +243,40 @@ } }, "@babel/helper-remap-async-to-generator": { - "version": "7.11.4", - "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.11.4.tgz", - "integrity": "sha512-tR5vJ/vBa9wFy3m5LLv2faapJLnDFxNWff2SAYkSE4rLUdbp7CdObYFgI7wK4T/Mj4UzpjPwzR8Pzmr5m7MHGA==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.12.1.tgz", + "integrity": "sha512-9d0KQCRM8clMPcDwo8SevNs+/9a8yWVVmaE80FGJcEP8N1qToREmWEGnBn8BUlJhYRFz6fqxeRL1sl5Ogsed7A==", "requires": { "@babel/helper-annotate-as-pure": "^7.10.4", "@babel/helper-wrap-function": "^7.10.4", - "@babel/template": "^7.10.4", - "@babel/types": "^7.10.4" + "@babel/types": "^7.12.1" } }, "@babel/helper-replace-supers": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.10.4.tgz", - "integrity": "sha512-sPxZfFXocEymYTdVK1UNmFPBN+Hv5mJkLPsYWwGBxZAxaWfFu+xqp7b6qWD0yjNuNL2VKc6L5M18tOXUP7NU0A==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.12.1.tgz", + "integrity": "sha512-zJjTvtNJnCFsCXVi5rUInstLd/EIVNmIKA1Q9ynESmMBWPWd+7sdR+G4/wdu+Mppfep0XLyG2m7EBPvjCeFyrw==", "requires": { - "@babel/helper-member-expression-to-functions": "^7.10.4", + "@babel/helper-member-expression-to-functions": "^7.12.1", "@babel/helper-optimise-call-expression": "^7.10.4", - "@babel/traverse": "^7.10.4", - "@babel/types": "^7.10.4" + "@babel/traverse": "^7.12.1", + "@babel/types": "^7.12.1" } }, "@babel/helper-simple-access": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.10.4.tgz", - "integrity": "sha512-0fMy72ej/VEvF8ULmX6yb5MtHG4uH4Dbd6I/aHDb/JVg0bbivwt9Wg+h3uMvX+QSFtwr5MeItvazbrc4jtRAXw==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.12.1.tgz", + "integrity": "sha512-OxBp7pMrjVewSSC8fXDFrHrBcJATOOFssZwv16F3/6Xtc138GHybBfPbm9kfiqQHKhYQrlamWILwlDCeyMFEaA==", "requires": { - "@babel/template": "^7.10.4", - "@babel/types": "^7.10.4" + "@babel/types": "^7.12.1" } }, "@babel/helper-skip-transparent-expression-wrappers": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.11.0.tgz", - "integrity": "sha512-0XIdiQln4Elglgjbwo9wuJpL/K7AGCY26kmEt0+pRP0TAj4jjyNq1MjoRvikrTVqKcx4Gysxt4cXvVFXP/JO2Q==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.12.1.tgz", + "integrity": "sha512-Mf5AUuhG1/OCChOJ/HcADmvcHM42WJockombn8ATJG3OnyiSxBK/Mm5x78BQWvmtXZKHgbjdGL2kin/HOLlZGA==", "requires": { - "@babel/types": "^7.11.0" + "@babel/types": "^7.12.1" } }, "@babel/helper-split-export-declaration": { @@ -311,10 +292,15 @@ "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz", "integrity": "sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw==" }, + "@babel/helper-validator-option": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.12.1.tgz", + "integrity": "sha512-YpJabsXlJVWP0USHjnC/AQDTLlZERbON577YUVO/wLpqyj6HAtVYnWaQaN0iUN+1/tWn3c+uKKXjRut5115Y2A==" + }, "@babel/helper-wrap-function": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.10.4.tgz", - "integrity": "sha512-6py45WvEF0MhiLrdxtRjKjufwLL1/ob2qDJgg5JgNdojBAZSAKnAjkyOCNug6n+OBl4VW76XjvgSFTdaMcW0Ug==", + "version": "7.12.3", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.12.3.tgz", + "integrity": "sha512-Cvb8IuJDln3rs6tzjW3Y8UeelAOdnpB8xtQ4sme2MSZ9wOxrbThporC0y/EtE16VAtoyEfLM404Xr1e0OOp+ow==", "requires": { "@babel/helper-function-name": "^7.10.4", "@babel/template": "^7.10.4", @@ -323,13 +309,13 @@ } }, "@babel/helpers": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.10.4.tgz", - "integrity": "sha512-L2gX/XeUONeEbI78dXSrJzGdz4GQ+ZTA/aazfUsFaWjSe95kiCuOZ5HsXvkiw3iwF+mFHSRUfJU8t6YavocdXA==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.12.1.tgz", + "integrity": "sha512-9JoDSBGoWtmbay98efmT2+mySkwjzeFeAL9BuWNoVQpkPFQF8SIIFUfY5os9u8wVzglzoiPRSW7cuJmBDUt43g==", "requires": { "@babel/template": "^7.10.4", - "@babel/traverse": "^7.10.4", - "@babel/types": "^7.10.4" + "@babel/traverse": "^7.12.1", + "@babel/types": "^7.12.1" } }, "@babel/highlight": { @@ -343,137 +329,137 @@ } }, "@babel/parser": { - "version": "7.11.4", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.11.4.tgz", - "integrity": "sha512-MggwidiH+E9j5Sh8pbrX5sJvMcsqS5o+7iB42M9/k0CD63MjYbdP4nhSh7uB5wnv2/RVzTZFTxzF/kIa5mrCqA==" + "version": "7.12.3", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.12.3.tgz", + "integrity": "sha512-kFsOS0IbsuhO5ojF8Hc8z/8vEIOkylVBrjiZUbLTE3XFe0Qi+uu6HjzQixkFaqr0ZPAMZcBVxEwmsnsLPZ2Xsw==" }, "@babel/plugin-proposal-async-generator-functions": { - "version": "7.10.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.10.5.tgz", - "integrity": "sha512-cNMCVezQbrRGvXJwm9fu/1sJj9bHdGAgKodZdLqOQIpfoH3raqmRPBM17+lh7CzhiKRRBrGtZL9WcjxSoGYUSg==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.12.1.tgz", + "integrity": "sha512-d+/o30tJxFxrA1lhzJqiUcEJdI6jKlNregCv5bASeGf2Q4MXmnwH7viDo7nhx1/ohf09oaH8j1GVYG/e3Yqk6A==", "requires": { "@babel/helper-plugin-utils": "^7.10.4", - "@babel/helper-remap-async-to-generator": "^7.10.4", + "@babel/helper-remap-async-to-generator": "^7.12.1", "@babel/plugin-syntax-async-generators": "^7.8.0" } }, "@babel/plugin-proposal-class-properties": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.10.4.tgz", - "integrity": "sha512-vhwkEROxzcHGNu2mzUC0OFFNXdZ4M23ib8aRRcJSsW8BZK9pQMD7QB7csl97NBbgGZO7ZyHUyKDnxzOaP4IrCg==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.12.1.tgz", + "integrity": "sha512-cKp3dlQsFsEs5CWKnN7BnSHOd0EOW8EKpEjkoz1pO2E5KzIDNV9Ros1b0CnmbVgAGXJubOYVBOGCT1OmJwOI7w==", "requires": { - "@babel/helper-create-class-features-plugin": "^7.10.4", + "@babel/helper-create-class-features-plugin": "^7.12.1", "@babel/helper-plugin-utils": "^7.10.4" } }, "@babel/plugin-proposal-decorators": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.8.3.tgz", - "integrity": "sha512-e3RvdvS4qPJVTe288DlXjwKflpfy1hr0j5dz5WpIYYeP7vQZg2WfAEIp8k5/Lwis/m5REXEteIz6rrcDtXXG7w==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.12.1.tgz", + "integrity": "sha512-knNIuusychgYN8fGJHONL0RbFxLGawhXOJNLBk75TniTsZZeA+wdkDuv6wp4lGwzQEKjZi6/WYtnb3udNPmQmQ==", "requires": { - "@babel/helper-create-class-features-plugin": "^7.8.3", - "@babel/helper-plugin-utils": "^7.8.3", - "@babel/plugin-syntax-decorators": "^7.8.3" + "@babel/helper-create-class-features-plugin": "^7.12.1", + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-syntax-decorators": "^7.12.1" } }, "@babel/plugin-proposal-dynamic-import": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.10.4.tgz", - "integrity": "sha512-up6oID1LeidOOASNXgv/CFbgBqTuKJ0cJjz6An5tWD+NVBNlp3VNSBxv2ZdU7SYl3NxJC7agAQDApZusV6uFwQ==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.12.1.tgz", + "integrity": "sha512-a4rhUSZFuq5W8/OO8H7BL5zspjnc1FLd9hlOxIK/f7qG4a0qsqk8uvF/ywgBA8/OmjsapjpvaEOYItfGG1qIvQ==", "requires": { "@babel/helper-plugin-utils": "^7.10.4", "@babel/plugin-syntax-dynamic-import": "^7.8.0" } }, "@babel/plugin-proposal-export-namespace-from": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.10.4.tgz", - "integrity": "sha512-aNdf0LY6/3WXkhh0Fdb6Zk9j1NMD8ovj3F6r0+3j837Pn1S1PdNtcwJ5EG9WkVPNHPxyJDaxMaAOVq4eki0qbg==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.12.1.tgz", + "integrity": "sha512-6CThGf0irEkzujYS5LQcjBx8j/4aQGiVv7J9+2f7pGfxqyKh3WnmVJYW3hdrQjyksErMGBPQrCnHfOtna+WLbw==", "requires": { "@babel/helper-plugin-utils": "^7.10.4", "@babel/plugin-syntax-export-namespace-from": "^7.8.3" } }, "@babel/plugin-proposal-json-strings": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.10.4.tgz", - "integrity": "sha512-fCL7QF0Jo83uy1K0P2YXrfX11tj3lkpN7l4dMv9Y9VkowkhkQDwFHFd8IiwyK5MZjE8UpbgokkgtcReH88Abaw==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.12.1.tgz", + "integrity": "sha512-GoLDUi6U9ZLzlSda2Df++VSqDJg3CG+dR0+iWsv6XRw1rEq+zwt4DirM9yrxW6XWaTpmai1cWJLMfM8qQJf+yw==", "requires": { "@babel/helper-plugin-utils": "^7.10.4", "@babel/plugin-syntax-json-strings": "^7.8.0" } }, "@babel/plugin-proposal-logical-assignment-operators": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.11.0.tgz", - "integrity": "sha512-/f8p4z+Auz0Uaf+i8Ekf1iM7wUNLcViFUGiPxKeXvxTSl63B875YPiVdUDdem7hREcI0E0kSpEhS8tF5RphK7Q==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.12.1.tgz", + "integrity": "sha512-k8ZmVv0JU+4gcUGeCDZOGd0lCIamU/sMtIiX3UWnUc5yzgq6YUGyEolNYD+MLYKfSzgECPcqetVcJP9Afe/aCA==", "requires": { "@babel/helper-plugin-utils": "^7.10.4", "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" } }, "@babel/plugin-proposal-nullish-coalescing-operator": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.10.4.tgz", - "integrity": "sha512-wq5n1M3ZUlHl9sqT2ok1T2/MTt6AXE0e1Lz4WzWBr95LsAZ5qDXe4KnFuauYyEyLiohvXFMdbsOTMyLZs91Zlw==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.12.1.tgz", + "integrity": "sha512-nZY0ESiaQDI1y96+jk6VxMOaL4LPo/QDHBqL+SF3/vl6dHkTwHlOI8L4ZwuRBHgakRBw5zsVylel7QPbbGuYgg==", "requires": { "@babel/helper-plugin-utils": "^7.10.4", "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.0" } }, "@babel/plugin-proposal-numeric-separator": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.10.4.tgz", - "integrity": "sha512-73/G7QoRoeNkLZFxsoCCvlg4ezE4eM+57PnOqgaPOozd5myfj7p0muD1mRVJvbUWbOzD+q3No2bWbaKy+DJ8DA==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.12.1.tgz", + "integrity": "sha512-MR7Ok+Af3OhNTCxYVjJZHS0t97ydnJZt/DbR4WISO39iDnhiD8XHrY12xuSJ90FFEGjir0Fzyyn7g/zY6hxbxA==", "requires": { "@babel/helper-plugin-utils": "^7.10.4", "@babel/plugin-syntax-numeric-separator": "^7.10.4" } }, "@babel/plugin-proposal-object-rest-spread": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.11.0.tgz", - "integrity": "sha512-wzch41N4yztwoRw0ak+37wxwJM2oiIiy6huGCoqkvSTA9acYWcPfn9Y4aJqmFFJ70KTJUu29f3DQ43uJ9HXzEA==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.12.1.tgz", + "integrity": "sha512-s6SowJIjzlhx8o7lsFx5zmY4At6CTtDvgNQDdPzkBQucle58A6b/TTeEBYtyDgmcXjUTM+vE8YOGHZzzbc/ioA==", "requires": { "@babel/helper-plugin-utils": "^7.10.4", "@babel/plugin-syntax-object-rest-spread": "^7.8.0", - "@babel/plugin-transform-parameters": "^7.10.4" + "@babel/plugin-transform-parameters": "^7.12.1" } }, "@babel/plugin-proposal-optional-catch-binding": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.10.4.tgz", - "integrity": "sha512-LflT6nPh+GK2MnFiKDyLiqSqVHkQnVf7hdoAvyTnnKj9xB3docGRsdPuxp6qqqW19ifK3xgc9U5/FwrSaCNX5g==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.12.1.tgz", + "integrity": "sha512-hFvIjgprh9mMw5v42sJWLI1lzU5L2sznP805zeT6rySVRA0Y18StRhDqhSxlap0oVgItRsB6WSROp4YnJTJz0g==", "requires": { "@babel/helper-plugin-utils": "^7.10.4", "@babel/plugin-syntax-optional-catch-binding": "^7.8.0" } }, "@babel/plugin-proposal-optional-chaining": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.11.0.tgz", - "integrity": "sha512-v9fZIu3Y8562RRwhm1BbMRxtqZNFmFA2EG+pT2diuU8PT3H6T/KXoZ54KgYisfOFZHV6PfvAiBIZ9Rcz+/JCxA==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.12.1.tgz", + "integrity": "sha512-c2uRpY6WzaVDzynVY9liyykS+kVU+WRZPMPYpkelXH8KBt1oXoI89kPbZKKG/jDT5UK92FTW2fZkZaJhdiBabw==", "requires": { "@babel/helper-plugin-utils": "^7.10.4", - "@babel/helper-skip-transparent-expression-wrappers": "^7.11.0", + "@babel/helper-skip-transparent-expression-wrappers": "^7.12.1", "@babel/plugin-syntax-optional-chaining": "^7.8.0" } }, "@babel/plugin-proposal-private-methods": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.10.4.tgz", - "integrity": "sha512-wh5GJleuI8k3emgTg5KkJK6kHNsGEr0uBTDBuQUBJwckk9xs1ez79ioheEVVxMLyPscB0LfkbVHslQqIzWV6Bw==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.12.1.tgz", + "integrity": "sha512-mwZ1phvH7/NHK6Kf8LP7MYDogGV+DKB1mryFOEwx5EBNQrosvIczzZFTUmWaeujd5xT6G1ELYWUz3CutMhjE1w==", "requires": { - "@babel/helper-create-class-features-plugin": "^7.10.4", + "@babel/helper-create-class-features-plugin": "^7.12.1", "@babel/helper-plugin-utils": "^7.10.4" } }, "@babel/plugin-proposal-unicode-property-regex": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.10.4.tgz", - "integrity": "sha512-H+3fOgPnEXFL9zGYtKQe4IDOPKYlZdF1kqFDQRRb8PK4B8af1vAGK04tF5iQAAsui+mHNBQSAtd2/ndEDe9wuA==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.12.1.tgz", + "integrity": "sha512-MYq+l+PvHuw/rKUz1at/vb6nCnQ2gmJBNaM62z0OgH7B2W1D9pvkpYtlti9bGtizNIU1K3zm4bZF9F91efVY0w==", "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.10.4", + "@babel/helper-create-regexp-features-plugin": "^7.12.1", "@babel/helper-plugin-utils": "^7.10.4" } }, @@ -485,18 +471,26 @@ "@babel/helper-plugin-utils": "^7.8.0" } }, + "@babel/plugin-syntax-bigint": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", + "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, "@babel/plugin-syntax-class-properties": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.10.4.tgz", - "integrity": "sha512-GCSBF7iUle6rNugfURwNmCGG3Z/2+opxAMLs1nND4bhEG5PuxTIggDBoeYYSujAlLtsupzOHYJQgPS3pivwXIA==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.1.tgz", + "integrity": "sha512-U40A76x5gTwmESz+qiqssqmeEsKvcSyvtgktrm0uzcARAmM9I1jR221f6Oq+GmHrcD+LvZDag1UTOTe2fL3TeA==", "requires": { "@babel/helper-plugin-utils": "^7.10.4" } }, "@babel/plugin-syntax-decorators": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.10.4.tgz", - "integrity": "sha512-2NaoC6fAk2VMdhY1eerkfHV+lVYC1u8b+jmRJISqANCJlTxYy19HGdIkkQtix2UtkcPuPu+IlDgrVseZnU03bw==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.12.1.tgz", + "integrity": "sha512-ir9YW5daRrTYiy9UJ2TzdNIJEZu8KclVzDcfSt4iEmOtwQ4llPtWInNKJyKnVXp1vE4bbVd5S31M/im3mYMO1w==", "requires": { "@babel/helper-plugin-utils": "^7.10.4" } @@ -518,9 +512,17 @@ } }, "@babel/plugin-syntax-flow": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.12.1.tgz", + "integrity": "sha512-1lBLLmtxrwpm4VKmtVFselI/P3pX+G63fAtUUt6b2Nzgao77KNDwyuRt90Mj2/9pKobtt68FdvjfqohZjg/FCA==", + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-syntax-import-meta": { "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.10.4.tgz", - "integrity": "sha512-yxQsX1dJixF4qEEdzVbst3SZQ58Nrooz8NV9Z9GL4byTE25BvJgl5lf0RECUf0fh28rZBb/RYTWn/eeKwCMrZQ==", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", + "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", "requires": { "@babel/helper-plugin-utils": "^7.10.4" } @@ -534,9 +536,9 @@ } }, "@babel/plugin-syntax-jsx": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.10.4.tgz", - "integrity": "sha512-KCg9mio9jwiARCB7WAcQ7Y1q+qicILjoK8LP/VkPkEKaf5dkaZZK1EcTe91a3JJlZ3qy6L5s9X52boEYi8DM9g==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.12.1.tgz", + "integrity": "sha512-1yRi7yAtB0ETgxdY9ti/p2TivUxJkTdhu/ZbF9MshVGqOx1TdB3b7xCXs49Fupgg50N45KcAsRP/ZqWjs9SRjg==", "requires": { "@babel/helper-plugin-utils": "^7.10.4" } @@ -590,324 +592,322 @@ } }, "@babel/plugin-syntax-top-level-await": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.10.4.tgz", - "integrity": "sha512-ni1brg4lXEmWyafKr0ccFWkJG0CeMt4WV1oyeBW6EFObF4oOHclbkj5cARxAPQyAQ2UTuplJyK4nfkXIMMFvsQ==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.12.1.tgz", + "integrity": "sha512-i7ooMZFS+a/Om0crxZodrTzNEPJHZrlMVGMTEpFAj6rYY/bKCddB0Dk/YxfPuYXOopuhKk/e1jV6h+WUU9XN3A==", "requires": { "@babel/helper-plugin-utils": "^7.10.4" } }, "@babel/plugin-syntax-typescript": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.10.4.tgz", - "integrity": "sha512-oSAEz1YkBCAKr5Yiq8/BNtvSAPwkp/IyUnwZogd8p+F0RuYQQrLeRUzIQhueQTTBy/F+a40uS7OFKxnkRvmvFQ==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.12.1.tgz", + "integrity": "sha512-UZNEcCY+4Dp9yYRCAHrHDU+9ZXLYaY9MgBXSRLkB9WjYFRR6quJBumfVrEkUxrePPBwFcpWfNKXqVRQQtm7mMA==", "requires": { "@babel/helper-plugin-utils": "^7.10.4" } }, "@babel/plugin-transform-arrow-functions": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.10.4.tgz", - "integrity": "sha512-9J/oD1jV0ZCBcgnoFWFq1vJd4msoKb/TCpGNFyyLt0zABdcvgK3aYikZ8HjzB14c26bc7E3Q1yugpwGy2aTPNA==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.12.1.tgz", + "integrity": "sha512-5QB50qyN44fzzz4/qxDPQMBCTHgxg3n0xRBLJUmBlLoU/sFvxVWGZF/ZUfMVDQuJUKXaBhbupxIzIfZ6Fwk/0A==", "requires": { "@babel/helper-plugin-utils": "^7.10.4" } }, "@babel/plugin-transform-async-to-generator": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.10.4.tgz", - "integrity": "sha512-F6nREOan7J5UXTLsDsZG3DXmZSVofr2tGNwfdrVwkDWHfQckbQXnXSPfD7iO+c/2HGqycwyLST3DnZ16n+cBJQ==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.12.1.tgz", + "integrity": "sha512-SDtqoEcarK1DFlRJ1hHRY5HvJUj5kX4qmtpMAm2QnhOlyuMC4TMdCRgW6WXpv93rZeYNeLP22y8Aq2dbcDRM1A==", "requires": { - "@babel/helper-module-imports": "^7.10.4", + "@babel/helper-module-imports": "^7.12.1", "@babel/helper-plugin-utils": "^7.10.4", - "@babel/helper-remap-async-to-generator": "^7.10.4" + "@babel/helper-remap-async-to-generator": "^7.12.1" } }, "@babel/plugin-transform-block-scoped-functions": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.10.4.tgz", - "integrity": "sha512-WzXDarQXYYfjaV1szJvN3AD7rZgZzC1JtjJZ8dMHUyiK8mxPRahynp14zzNjU3VkPqPsO38CzxiWO1c9ARZ8JA==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.12.1.tgz", + "integrity": "sha512-5OpxfuYnSgPalRpo8EWGPzIYf0lHBWORCkj5M0oLBwHdlux9Ri36QqGW3/LR13RSVOAoUUMzoPI/jpE4ABcHoA==", "requires": { "@babel/helper-plugin-utils": "^7.10.4" } }, "@babel/plugin-transform-block-scoping": { - "version": "7.11.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.11.1.tgz", - "integrity": "sha512-00dYeDE0EVEHuuM+26+0w/SCL0BH2Qy7LwHuI4Hi4MH5gkC8/AqMN5uWFJIsoXZrAphiMm1iXzBw6L2T+eA0ew==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.12.1.tgz", + "integrity": "sha512-zJyAC9sZdE60r1nVQHblcfCj29Dh2Y0DOvlMkcqSo0ckqjiCwNiUezUKw+RjOCwGfpLRwnAeQ2XlLpsnGkvv9w==", "requires": { "@babel/helper-plugin-utils": "^7.10.4" } }, "@babel/plugin-transform-classes": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.10.4.tgz", - "integrity": "sha512-2oZ9qLjt161dn1ZE0Ms66xBncQH4In8Sqw1YWgBUZuGVJJS5c0OFZXL6dP2MRHrkU/eKhWg8CzFJhRQl50rQxA==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.12.1.tgz", + "integrity": "sha512-/74xkA7bVdzQTBeSUhLLJgYIcxw/dpEpCdRDiHgPJ3Mv6uC11UhjpOhl72CgqbBCmt1qtssCyB2xnJm1+PFjog==", "requires": { "@babel/helper-annotate-as-pure": "^7.10.4", "@babel/helper-define-map": "^7.10.4", "@babel/helper-function-name": "^7.10.4", "@babel/helper-optimise-call-expression": "^7.10.4", "@babel/helper-plugin-utils": "^7.10.4", - "@babel/helper-replace-supers": "^7.10.4", + "@babel/helper-replace-supers": "^7.12.1", "@babel/helper-split-export-declaration": "^7.10.4", "globals": "^11.1.0" } }, "@babel/plugin-transform-computed-properties": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.10.4.tgz", - "integrity": "sha512-JFwVDXcP/hM/TbyzGq3l/XWGut7p46Z3QvqFMXTfk6/09m7xZHJUN9xHfsv7vqqD4YnfI5ueYdSJtXqqBLyjBw==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.12.1.tgz", + "integrity": "sha512-vVUOYpPWB7BkgUWPo4C44mUQHpTZXakEqFjbv8rQMg7TC6S6ZhGZ3otQcRH6u7+adSlE5i0sp63eMC/XGffrzg==", "requires": { "@babel/helper-plugin-utils": "^7.10.4" } }, "@babel/plugin-transform-destructuring": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.10.4.tgz", - "integrity": "sha512-+WmfvyfsyF603iPa6825mq6Qrb7uLjTOsa3XOFzlYcYDHSS4QmpOWOL0NNBY5qMbvrcf3tq0Cw+v4lxswOBpgA==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.12.1.tgz", + "integrity": "sha512-fRMYFKuzi/rSiYb2uRLiUENJOKq4Gnl+6qOv5f8z0TZXg3llUwUhsNNwrwaT/6dUhJTzNpBr+CUvEWBtfNY1cw==", "requires": { "@babel/helper-plugin-utils": "^7.10.4" } }, "@babel/plugin-transform-dotall-regex": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.10.4.tgz", - "integrity": "sha512-ZEAVvUTCMlMFAbASYSVQoxIbHm2OkG2MseW6bV2JjIygOjdVv8tuxrCTzj1+Rynh7ODb8GivUy7dzEXzEhuPaA==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.12.1.tgz", + "integrity": "sha512-B2pXeRKoLszfEW7J4Hg9LoFaWEbr/kzo3teWHmtFCszjRNa/b40f9mfeqZsIDLLt/FjwQ6pz/Gdlwy85xNckBA==", "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.10.4", + "@babel/helper-create-regexp-features-plugin": "^7.12.1", "@babel/helper-plugin-utils": "^7.10.4" } }, "@babel/plugin-transform-duplicate-keys": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.10.4.tgz", - "integrity": "sha512-GL0/fJnmgMclHiBTTWXNlYjYsA7rDrtsazHG6mglaGSTh0KsrW04qml+Bbz9FL0LcJIRwBWL5ZqlNHKTkU3xAA==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.12.1.tgz", + "integrity": "sha512-iRght0T0HztAb/CazveUpUQrZY+aGKKaWXMJ4uf9YJtqxSUe09j3wteztCUDRHs+SRAL7yMuFqUsLoAKKzgXjw==", "requires": { "@babel/helper-plugin-utils": "^7.10.4" } }, "@babel/plugin-transform-exponentiation-operator": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.10.4.tgz", - "integrity": "sha512-S5HgLVgkBcRdyQAHbKj+7KyuWx8C6t5oETmUuwz1pt3WTWJhsUV0WIIXuVvfXMxl/QQyHKlSCNNtaIamG8fysw==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.12.1.tgz", + "integrity": "sha512-7tqwy2bv48q+c1EHbXK0Zx3KXd2RVQp6OC7PbwFNt/dPTAV3Lu5sWtWuAj8owr5wqtWnqHfl2/mJlUmqkChKug==", "requires": { "@babel/helper-builder-binary-assignment-operator-visitor": "^7.10.4", "@babel/helper-plugin-utils": "^7.10.4" } }, "@babel/plugin-transform-flow-strip-types": { - "version": "7.9.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.9.0.tgz", - "integrity": "sha512-7Qfg0lKQhEHs93FChxVLAvhBshOPQDtJUTVHr/ZwQNRccCm4O9D79r9tVSoV8iNwjP1YgfD+e/fgHcPkN1qEQg==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.12.1.tgz", + "integrity": "sha512-8hAtkmsQb36yMmEtk2JZ9JnVyDSnDOdlB+0nEGzIDLuK4yR3JcEjfuFPYkdEPSh8Id+rAMeBEn+X0iVEyho6Hg==", "requires": { - "@babel/helper-plugin-utils": "^7.8.3", - "@babel/plugin-syntax-flow": "^7.8.3" + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-syntax-flow": "^7.12.1" } }, "@babel/plugin-transform-for-of": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.10.4.tgz", - "integrity": "sha512-ItdQfAzu9AlEqmusA/65TqJ79eRcgGmpPPFvBnGILXZH975G0LNjP1yjHvGgfuCxqrPPueXOPe+FsvxmxKiHHQ==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.12.1.tgz", + "integrity": "sha512-Zaeq10naAsuHo7heQvyV0ptj4dlZJwZgNAtBYBnu5nNKJoW62m0zKcIEyVECrUKErkUkg6ajMy4ZfnVZciSBhg==", "requires": { "@babel/helper-plugin-utils": "^7.10.4" } }, "@babel/plugin-transform-function-name": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.10.4.tgz", - "integrity": "sha512-OcDCq2y5+E0dVD5MagT5X+yTRbcvFjDI2ZVAottGH6tzqjx/LKpgkUepu3hp/u4tZBzxxpNGwLsAvGBvQ2mJzg==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.12.1.tgz", + "integrity": "sha512-JF3UgJUILoFrFMEnOJLJkRHSk6LUSXLmEFsA23aR2O5CSLUxbeUX1IZ1YQ7Sn0aXb601Ncwjx73a+FVqgcljVw==", "requires": { "@babel/helper-function-name": "^7.10.4", "@babel/helper-plugin-utils": "^7.10.4" } }, "@babel/plugin-transform-literals": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.10.4.tgz", - "integrity": "sha512-Xd/dFSTEVuUWnyZiMu76/InZxLTYilOSr1UlHV+p115Z/Le2Fi1KXkJUYz0b42DfndostYlPub3m8ZTQlMaiqQ==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.12.1.tgz", + "integrity": "sha512-+PxVGA+2Ag6uGgL0A5f+9rklOnnMccwEBzwYFL3EUaKuiyVnUipyXncFcfjSkbimLrODoqki1U9XxZzTvfN7IQ==", "requires": { "@babel/helper-plugin-utils": "^7.10.4" } }, "@babel/plugin-transform-member-expression-literals": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.10.4.tgz", - "integrity": "sha512-0bFOvPyAoTBhtcJLr9VcwZqKmSjFml1iVxvPL0ReomGU53CX53HsM4h2SzckNdkQcHox1bpAqzxBI1Y09LlBSw==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.12.1.tgz", + "integrity": "sha512-1sxePl6z9ad0gFMB9KqmYofk34flq62aqMt9NqliS/7hPEpURUCMbyHXrMPlo282iY7nAvUB1aQd5mg79UD9Jg==", "requires": { "@babel/helper-plugin-utils": "^7.10.4" } }, "@babel/plugin-transform-modules-amd": { - "version": "7.10.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.10.5.tgz", - "integrity": "sha512-elm5uruNio7CTLFItVC/rIzKLfQ17+fX7EVz5W0TMgIHFo1zY0Ozzx+lgwhL4plzl8OzVn6Qasx5DeEFyoNiRw==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.12.1.tgz", + "integrity": "sha512-tDW8hMkzad5oDtzsB70HIQQRBiTKrhfgwC/KkJeGsaNFTdWhKNt/BiE8c5yj19XiGyrxpbkOfH87qkNg1YGlOQ==", "requires": { - "@babel/helper-module-transforms": "^7.10.5", + "@babel/helper-module-transforms": "^7.12.1", "@babel/helper-plugin-utils": "^7.10.4", "babel-plugin-dynamic-import-node": "^2.3.3" } }, "@babel/plugin-transform-modules-commonjs": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.10.4.tgz", - "integrity": "sha512-Xj7Uq5o80HDLlW64rVfDBhao6OX89HKUmb+9vWYaLXBZOma4gA6tw4Ni1O5qVDoZWUV0fxMYA0aYzOawz0l+1w==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.12.1.tgz", + "integrity": "sha512-dY789wq6l0uLY8py9c1B48V8mVL5gZh/+PQ5ZPrylPYsnAvnEMjqsUXkuoDVPeVK+0VyGar+D08107LzDQ6pag==", "requires": { - "@babel/helper-module-transforms": "^7.10.4", + "@babel/helper-module-transforms": "^7.12.1", "@babel/helper-plugin-utils": "^7.10.4", - "@babel/helper-simple-access": "^7.10.4", + "@babel/helper-simple-access": "^7.12.1", "babel-plugin-dynamic-import-node": "^2.3.3" } }, "@babel/plugin-transform-modules-systemjs": { - "version": "7.10.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.10.5.tgz", - "integrity": "sha512-f4RLO/OL14/FP1AEbcsWMzpbUz6tssRaeQg11RH1BP/XnPpRoVwgeYViMFacnkaw4k4wjRSjn3ip1Uw9TaXuMw==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.12.1.tgz", + "integrity": "sha512-Hn7cVvOavVh8yvW6fLwveFqSnd7rbQN3zJvoPNyNaQSvgfKmDBO9U1YL9+PCXGRlZD9tNdWTy5ACKqMuzyn32Q==", "requires": { "@babel/helper-hoist-variables": "^7.10.4", - "@babel/helper-module-transforms": "^7.10.5", + "@babel/helper-module-transforms": "^7.12.1", "@babel/helper-plugin-utils": "^7.10.4", + "@babel/helper-validator-identifier": "^7.10.4", "babel-plugin-dynamic-import-node": "^2.3.3" } }, "@babel/plugin-transform-modules-umd": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.10.4.tgz", - "integrity": "sha512-mohW5q3uAEt8T45YT7Qc5ws6mWgJAaL/8BfWD9Dodo1A3RKWli8wTS+WiQ/knF+tXlPirW/1/MqzzGfCExKECA==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.12.1.tgz", + "integrity": "sha512-aEIubCS0KHKM0zUos5fIoQm+AZUMt1ZvMpqz0/H5qAQ7vWylr9+PLYurT+Ic7ID/bKLd4q8hDovaG3Zch2uz5Q==", "requires": { - "@babel/helper-module-transforms": "^7.10.4", + "@babel/helper-module-transforms": "^7.12.1", "@babel/helper-plugin-utils": "^7.10.4" } }, "@babel/plugin-transform-named-capturing-groups-regex": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.10.4.tgz", - "integrity": "sha512-V6LuOnD31kTkxQPhKiVYzYC/Jgdq53irJC/xBSmqcNcqFGV+PER4l6rU5SH2Vl7bH9mLDHcc0+l9HUOe4RNGKA==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.12.1.tgz", + "integrity": "sha512-tB43uQ62RHcoDp9v2Nsf+dSM8sbNodbEicbQNA53zHz8pWUhsgHSJCGpt7daXxRydjb0KnfmB+ChXOv3oADp1Q==", "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.10.4" + "@babel/helper-create-regexp-features-plugin": "^7.12.1" } }, "@babel/plugin-transform-new-target": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.10.4.tgz", - "integrity": "sha512-YXwWUDAH/J6dlfwqlWsztI2Puz1NtUAubXhOPLQ5gjR/qmQ5U96DY4FQO8At33JN4XPBhrjB8I4eMmLROjjLjw==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.12.1.tgz", + "integrity": "sha512-+eW/VLcUL5L9IvJH7rT1sT0CzkdUTvPrXC2PXTn/7z7tXLBuKvezYbGdxD5WMRoyvyaujOq2fWoKl869heKjhw==", "requires": { "@babel/helper-plugin-utils": "^7.10.4" } }, "@babel/plugin-transform-object-super": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.10.4.tgz", - "integrity": "sha512-5iTw0JkdRdJvr7sY0vHqTpnruUpTea32JHmq/atIWqsnNussbRzjEDyWep8UNztt1B5IusBYg8Irb0bLbiEBCQ==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.12.1.tgz", + "integrity": "sha512-AvypiGJH9hsquNUn+RXVcBdeE3KHPZexWRdimhuV59cSoOt5kFBmqlByorAeUlGG2CJWd0U+4ZtNKga/TB0cAw==", "requires": { "@babel/helper-plugin-utils": "^7.10.4", - "@babel/helper-replace-supers": "^7.10.4" + "@babel/helper-replace-supers": "^7.12.1" } }, "@babel/plugin-transform-parameters": { - "version": "7.10.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.10.5.tgz", - "integrity": "sha512-xPHwUj5RdFV8l1wuYiu5S9fqWGM2DrYc24TMvUiRrPVm+SM3XeqU9BcokQX/kEUe+p2RBwy+yoiR1w/Blq6ubw==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.12.1.tgz", + "integrity": "sha512-xq9C5EQhdPK23ZeCdMxl8bbRnAgHFrw5EOC3KJUsSylZqdkCaFEXxGSBuTSObOpiiHHNyb82es8M1QYgfQGfNg==", "requires": { - "@babel/helper-get-function-arity": "^7.10.4", "@babel/helper-plugin-utils": "^7.10.4" } }, "@babel/plugin-transform-property-literals": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.10.4.tgz", - "integrity": "sha512-ofsAcKiUxQ8TY4sScgsGeR2vJIsfrzqvFb9GvJ5UdXDzl+MyYCaBj/FGzXuv7qE0aJcjWMILny1epqelnFlz8g==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.12.1.tgz", + "integrity": "sha512-6MTCR/mZ1MQS+AwZLplX4cEySjCpnIF26ToWo942nqn8hXSm7McaHQNeGx/pt7suI1TWOWMfa/NgBhiqSnX0cQ==", "requires": { "@babel/helper-plugin-utils": "^7.10.4" } }, "@babel/plugin-transform-react-constant-elements": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.10.4.tgz", - "integrity": "sha512-cYmQBW1pXrqBte1raMkAulXmi7rjg3VI6ZLg9QIic8Hq7BtYXaWuZSxsr2siOMI6SWwpxjWfnwhTUrd7JlAV7g==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.12.1.tgz", + "integrity": "sha512-KOHd0tIRLoER+J+8f9DblZDa1fLGPwaaN1DI1TVHuQFOpjHV22C3CUB3obeC4fexHY9nx+fH0hQNvLFFfA1mxA==", "requires": { "@babel/helper-plugin-utils": "^7.10.4" } }, "@babel/plugin-transform-react-display-name": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.10.4.tgz", - "integrity": "sha512-Zd4X54Mu9SBfPGnEcaGcOrVAYOtjT2on8QZkLKEq1S/tHexG39d9XXGZv19VfRrDjPJzFmPfTAqOQS1pfFOujw==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.12.1.tgz", + "integrity": "sha512-cAzB+UzBIrekfYxyLlFqf/OagTvHLcVBb5vpouzkYkBclRPraiygVnafvAoipErZLI8ANv8Ecn6E/m5qPXD26w==", "requires": { "@babel/helper-plugin-utils": "^7.10.4" } }, "@babel/plugin-transform-react-jsx": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.10.4.tgz", - "integrity": "sha512-L+MfRhWjX0eI7Js093MM6MacKU4M6dnCRa/QPDwYMxjljzSCzzlzKzj9Pk4P3OtrPcxr2N3znR419nr3Xw+65A==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.12.1.tgz", + "integrity": "sha512-RmKejwnT0T0QzQUzcbP5p1VWlpnP8QHtdhEtLG55ZDQnJNalbF3eeDyu3dnGKvGzFIQiBzFhBYTwvv435p9Xpw==", "requires": { "@babel/helper-builder-react-jsx": "^7.10.4", - "@babel/helper-builder-react-jsx-experimental": "^7.10.4", + "@babel/helper-builder-react-jsx-experimental": "^7.12.1", "@babel/helper-plugin-utils": "^7.10.4", - "@babel/plugin-syntax-jsx": "^7.10.4" + "@babel/plugin-syntax-jsx": "^7.12.1" } }, "@babel/plugin-transform-react-jsx-development": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.10.4.tgz", - "integrity": "sha512-RM3ZAd1sU1iQ7rI2dhrZRZGv0aqzNQMbkIUCS1txYpi9wHQ2ZHNjo5TwX+UD6pvFW4AbWqLVYvKy5qJSAyRGjQ==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.12.1.tgz", + "integrity": "sha512-IilcGWdN1yNgEGOrB96jbTplRh+V2Pz1EoEwsKsHfX1a/L40cUYuD71Zepa7C+ujv7kJIxnDftWeZbKNEqZjCQ==", "requires": { - "@babel/helper-builder-react-jsx-experimental": "^7.10.4", + "@babel/helper-builder-react-jsx-experimental": "^7.12.1", "@babel/helper-plugin-utils": "^7.10.4", - "@babel/plugin-syntax-jsx": "^7.10.4" + "@babel/plugin-syntax-jsx": "^7.12.1" } }, "@babel/plugin-transform-react-jsx-self": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.10.4.tgz", - "integrity": "sha512-yOvxY2pDiVJi0axdTWHSMi5T0DILN+H+SaeJeACHKjQLezEzhLx9nEF9xgpBLPtkZsks9cnb5P9iBEi21En3gg==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.12.1.tgz", + "integrity": "sha512-FbpL0ieNWiiBB5tCldX17EtXgmzeEZjFrix72rQYeq9X6nUK38HCaxexzVQrZWXanxKJPKVVIU37gFjEQYkPkA==", "requires": { - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/plugin-syntax-jsx": "^7.10.4" + "@babel/helper-plugin-utils": "^7.10.4" } }, "@babel/plugin-transform-react-jsx-source": { - "version": "7.10.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.10.5.tgz", - "integrity": "sha512-wTeqHVkN1lfPLubRiZH3o73f4rfon42HpgxUSs86Nc+8QIcm/B9s8NNVXu/gwGcOyd7yDib9ikxoDLxJP0UiDA==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.12.1.tgz", + "integrity": "sha512-keQ5kBfjJNRc6zZN1/nVHCd6LLIHq4aUKcVnvE/2l+ZZROSbqoiGFRtT5t3Is89XJxBQaP7NLZX2jgGHdZvvFQ==", "requires": { - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/plugin-syntax-jsx": "^7.10.4" + "@babel/helper-plugin-utils": "^7.10.4" } }, "@babel/plugin-transform-react-pure-annotations": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.10.4.tgz", - "integrity": "sha512-+njZkqcOuS8RaPakrnR9KvxjoG1ASJWpoIv/doyWngId88JoFlPlISenGXjrVacZUIALGUr6eodRs1vmPnF23A==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.12.1.tgz", + "integrity": "sha512-RqeaHiwZtphSIUZ5I85PEH19LOSzxfuEazoY7/pWASCAIBuATQzpSVD+eT6MebeeZT2F4eSL0u4vw6n4Nm0Mjg==", "requires": { "@babel/helper-annotate-as-pure": "^7.10.4", "@babel/helper-plugin-utils": "^7.10.4" } }, "@babel/plugin-transform-regenerator": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.10.4.tgz", - "integrity": "sha512-3thAHwtor39A7C04XucbMg17RcZ3Qppfxr22wYzZNcVIkPHfpM9J0SO8zuCV6SZa265kxBJSrfKTvDCYqBFXGw==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.12.1.tgz", + "integrity": "sha512-gYrHqs5itw6i4PflFX3OdBPMQdPbF4bj2REIUxlMRUFk0/ZOAIpDFuViuxPjUL7YC8UPnf+XG7/utJvqXdPKng==", "requires": { "regenerator-transform": "^0.14.2" } }, "@babel/plugin-transform-reserved-words": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.10.4.tgz", - "integrity": "sha512-hGsw1O6Rew1fkFbDImZIEqA8GoidwTAilwCyWqLBM9f+e/u/sQMQu7uX6dyokfOayRuuVfKOW4O7HvaBWM+JlQ==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.12.1.tgz", + "integrity": "sha512-pOnUfhyPKvZpVyBHhSBoX8vfA09b7r00Pmm1sH+29ae2hMTKVmSp4Ztsr8KBKjLjx17H0eJqaRC3bR2iThM54A==", "requires": { "@babel/helper-plugin-utils": "^7.10.4" } }, "@babel/plugin-transform-runtime": { - "version": "7.9.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.9.0.tgz", - "integrity": "sha512-pUu9VSf3kI1OqbWINQ7MaugnitRss1z533436waNXp+0N3ur3zfut37sXiQMxkuCF4VUjwZucen/quskCh7NHw==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.12.1.tgz", + "integrity": "sha512-Ac/H6G9FEIkS2tXsZjL4RAdS3L3WHxci0usAnz7laPWUmFiGtj7tIASChqKZMHTSQTQY6xDbOq+V1/vIq3QrWg==", "requires": { - "@babel/helper-module-imports": "^7.8.3", - "@babel/helper-plugin-utils": "^7.8.3", + "@babel/helper-module-imports": "^7.12.1", + "@babel/helper-plugin-utils": "^7.10.4", "resolve": "^1.8.1", "semver": "^5.5.1" }, @@ -920,99 +920,99 @@ } }, "@babel/plugin-transform-shorthand-properties": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.10.4.tgz", - "integrity": "sha512-AC2K/t7o07KeTIxMoHneyX90v3zkm5cjHJEokrPEAGEy3UCp8sLKfnfOIGdZ194fyN4wfX/zZUWT9trJZ0qc+Q==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.12.1.tgz", + "integrity": "sha512-GFZS3c/MhX1OusqB1MZ1ct2xRzX5ppQh2JU1h2Pnfk88HtFTM+TWQqJNfwkmxtPQtb/s1tk87oENfXJlx7rSDw==", "requires": { "@babel/helper-plugin-utils": "^7.10.4" } }, "@babel/plugin-transform-spread": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.11.0.tgz", - "integrity": "sha512-UwQYGOqIdQJe4aWNyS7noqAnN2VbaczPLiEtln+zPowRNlD+79w3oi2TWfYe0eZgd+gjZCbsydN7lzWysDt+gw==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.12.1.tgz", + "integrity": "sha512-vuLp8CP0BE18zVYjsEBZ5xoCecMK6LBMMxYzJnh01rxQRvhNhH1csMMmBfNo5tGpGO+NhdSNW2mzIvBu3K1fng==", "requires": { "@babel/helper-plugin-utils": "^7.10.4", - "@babel/helper-skip-transparent-expression-wrappers": "^7.11.0" + "@babel/helper-skip-transparent-expression-wrappers": "^7.12.1" } }, "@babel/plugin-transform-sticky-regex": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.10.4.tgz", - "integrity": "sha512-Ddy3QZfIbEV0VYcVtFDCjeE4xwVTJWTmUtorAJkn6u/92Z/nWJNV+mILyqHKrUxXYKA2EoCilgoPePymKL4DvQ==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.12.1.tgz", + "integrity": "sha512-CiUgKQ3AGVk7kveIaPEET1jNDhZZEl1RPMWdTBE1799bdz++SwqDHStmxfCtDfBhQgCl38YRiSnrMuUMZIWSUQ==", "requires": { "@babel/helper-plugin-utils": "^7.10.4", "@babel/helper-regex": "^7.10.4" } }, "@babel/plugin-transform-template-literals": { - "version": "7.10.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.10.5.tgz", - "integrity": "sha512-V/lnPGIb+KT12OQikDvgSuesRX14ck5FfJXt6+tXhdkJ+Vsd0lDCVtF6jcB4rNClYFzaB2jusZ+lNISDk2mMMw==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.12.1.tgz", + "integrity": "sha512-b4Zx3KHi+taXB1dVRBhVJtEPi9h1THCeKmae2qP0YdUHIFhVjtpqqNfxeVAa1xeHVhAy4SbHxEwx5cltAu5apw==", "requires": { - "@babel/helper-annotate-as-pure": "^7.10.4", "@babel/helper-plugin-utils": "^7.10.4" } }, "@babel/plugin-transform-typeof-symbol": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.10.4.tgz", - "integrity": "sha512-QqNgYwuuW0y0H+kUE/GWSR45t/ccRhe14Fs/4ZRouNNQsyd4o3PG4OtHiIrepbM2WKUBDAXKCAK/Lk4VhzTaGA==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.12.1.tgz", + "integrity": "sha512-EPGgpGy+O5Kg5pJFNDKuxt9RdmTgj5sgrus2XVeMp/ZIbOESadgILUbm50SNpghOh3/6yrbsH+NB5+WJTmsA7Q==", "requires": { "@babel/helper-plugin-utils": "^7.10.4" } }, "@babel/plugin-transform-typescript": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.11.0.tgz", - "integrity": "sha512-edJsNzTtvb3MaXQwj8403B7mZoGu9ElDJQZOKjGUnvilquxBA3IQoEIOvkX/1O8xfAsnHS/oQhe2w/IXrr+w0w==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.12.1.tgz", + "integrity": "sha512-VrsBByqAIntM+EYMqSm59SiMEf7qkmI9dqMt6RbD/wlwueWmYcI0FFK5Fj47pP6DRZm+3teXjosKlwcZJ5lIMw==", "requires": { - "@babel/helper-create-class-features-plugin": "^7.10.5", + "@babel/helper-create-class-features-plugin": "^7.12.1", "@babel/helper-plugin-utils": "^7.10.4", - "@babel/plugin-syntax-typescript": "^7.10.4" + "@babel/plugin-syntax-typescript": "^7.12.1" } }, "@babel/plugin-transform-unicode-escapes": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.10.4.tgz", - "integrity": "sha512-y5XJ9waMti2J+e7ij20e+aH+fho7Wb7W8rNuu72aKRwCHFqQdhkdU2lo3uZ9tQuboEJcUFayXdARhcxLQ3+6Fg==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.12.1.tgz", + "integrity": "sha512-I8gNHJLIc7GdApm7wkVnStWssPNbSRMPtgHdmH3sRM1zopz09UWPS4x5V4n1yz/MIWTVnJ9sp6IkuXdWM4w+2Q==", "requires": { "@babel/helper-plugin-utils": "^7.10.4" } }, "@babel/plugin-transform-unicode-regex": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.10.4.tgz", - "integrity": "sha512-wNfsc4s8N2qnIwpO/WP2ZiSyjfpTamT2C9V9FDH/Ljub9zw6P3SjkXcFmc0RQUt96k2fmIvtla2MMjgTwIAC+A==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.12.1.tgz", + "integrity": "sha512-SqH4ClNngh/zGwHZOOQMTD+e8FGWexILV+ePMyiDJttAWRh5dhDL8rcl5lSgU3Huiq6Zn6pWTMvdPAb21Dwdyg==", "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.10.4", + "@babel/helper-create-regexp-features-plugin": "^7.12.1", "@babel/helper-plugin-utils": "^7.10.4" } }, "@babel/preset-env": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.11.0.tgz", - "integrity": "sha512-2u1/k7rG/gTh02dylX2kL3S0IJNF+J6bfDSp4DI2Ma8QN6Y9x9pmAax59fsCk6QUQG0yqH47yJWA+u1I1LccAg==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.12.1.tgz", + "integrity": "sha512-H8kxXmtPaAGT7TyBvSSkoSTUK6RHh61So05SyEbpmr0MCZrsNYn7mGMzzeYoOUCdHzww61k8XBft2TaES+xPLg==", "requires": { - "@babel/compat-data": "^7.11.0", - "@babel/helper-compilation-targets": "^7.10.4", - "@babel/helper-module-imports": "^7.10.4", + "@babel/compat-data": "^7.12.1", + "@babel/helper-compilation-targets": "^7.12.1", + "@babel/helper-module-imports": "^7.12.1", "@babel/helper-plugin-utils": "^7.10.4", - "@babel/plugin-proposal-async-generator-functions": "^7.10.4", - "@babel/plugin-proposal-class-properties": "^7.10.4", - "@babel/plugin-proposal-dynamic-import": "^7.10.4", - "@babel/plugin-proposal-export-namespace-from": "^7.10.4", - "@babel/plugin-proposal-json-strings": "^7.10.4", - "@babel/plugin-proposal-logical-assignment-operators": "^7.11.0", - "@babel/plugin-proposal-nullish-coalescing-operator": "^7.10.4", - "@babel/plugin-proposal-numeric-separator": "^7.10.4", - "@babel/plugin-proposal-object-rest-spread": "^7.11.0", - "@babel/plugin-proposal-optional-catch-binding": "^7.10.4", - "@babel/plugin-proposal-optional-chaining": "^7.11.0", - "@babel/plugin-proposal-private-methods": "^7.10.4", - "@babel/plugin-proposal-unicode-property-regex": "^7.10.4", + "@babel/helper-validator-option": "^7.12.1", + "@babel/plugin-proposal-async-generator-functions": "^7.12.1", + "@babel/plugin-proposal-class-properties": "^7.12.1", + "@babel/plugin-proposal-dynamic-import": "^7.12.1", + "@babel/plugin-proposal-export-namespace-from": "^7.12.1", + "@babel/plugin-proposal-json-strings": "^7.12.1", + "@babel/plugin-proposal-logical-assignment-operators": "^7.12.1", + "@babel/plugin-proposal-nullish-coalescing-operator": "^7.12.1", + "@babel/plugin-proposal-numeric-separator": "^7.12.1", + "@babel/plugin-proposal-object-rest-spread": "^7.12.1", + "@babel/plugin-proposal-optional-catch-binding": "^7.12.1", + "@babel/plugin-proposal-optional-chaining": "^7.12.1", + "@babel/plugin-proposal-private-methods": "^7.12.1", + "@babel/plugin-proposal-unicode-property-regex": "^7.12.1", "@babel/plugin-syntax-async-generators": "^7.8.0", - "@babel/plugin-syntax-class-properties": "^7.10.4", + "@babel/plugin-syntax-class-properties": "^7.12.1", "@babel/plugin-syntax-dynamic-import": "^7.8.0", "@babel/plugin-syntax-export-namespace-from": "^7.8.3", "@babel/plugin-syntax-json-strings": "^7.8.0", @@ -1022,45 +1022,42 @@ "@babel/plugin-syntax-object-rest-spread": "^7.8.0", "@babel/plugin-syntax-optional-catch-binding": "^7.8.0", "@babel/plugin-syntax-optional-chaining": "^7.8.0", - "@babel/plugin-syntax-top-level-await": "^7.10.4", - "@babel/plugin-transform-arrow-functions": "^7.10.4", - "@babel/plugin-transform-async-to-generator": "^7.10.4", - "@babel/plugin-transform-block-scoped-functions": "^7.10.4", - "@babel/plugin-transform-block-scoping": "^7.10.4", - "@babel/plugin-transform-classes": "^7.10.4", - "@babel/plugin-transform-computed-properties": "^7.10.4", - "@babel/plugin-transform-destructuring": "^7.10.4", - "@babel/plugin-transform-dotall-regex": "^7.10.4", - "@babel/plugin-transform-duplicate-keys": "^7.10.4", - "@babel/plugin-transform-exponentiation-operator": "^7.10.4", - "@babel/plugin-transform-for-of": "^7.10.4", - "@babel/plugin-transform-function-name": "^7.10.4", - "@babel/plugin-transform-literals": "^7.10.4", - "@babel/plugin-transform-member-expression-literals": "^7.10.4", - "@babel/plugin-transform-modules-amd": "^7.10.4", - "@babel/plugin-transform-modules-commonjs": "^7.10.4", - "@babel/plugin-transform-modules-systemjs": "^7.10.4", - "@babel/plugin-transform-modules-umd": "^7.10.4", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.10.4", - "@babel/plugin-transform-new-target": "^7.10.4", - "@babel/plugin-transform-object-super": "^7.10.4", - "@babel/plugin-transform-parameters": "^7.10.4", - "@babel/plugin-transform-property-literals": "^7.10.4", - "@babel/plugin-transform-regenerator": "^7.10.4", - "@babel/plugin-transform-reserved-words": "^7.10.4", - "@babel/plugin-transform-shorthand-properties": "^7.10.4", - "@babel/plugin-transform-spread": "^7.11.0", - "@babel/plugin-transform-sticky-regex": "^7.10.4", - "@babel/plugin-transform-template-literals": "^7.10.4", - "@babel/plugin-transform-typeof-symbol": "^7.10.4", - "@babel/plugin-transform-unicode-escapes": "^7.10.4", - "@babel/plugin-transform-unicode-regex": "^7.10.4", + "@babel/plugin-syntax-top-level-await": "^7.12.1", + "@babel/plugin-transform-arrow-functions": "^7.12.1", + "@babel/plugin-transform-async-to-generator": "^7.12.1", + "@babel/plugin-transform-block-scoped-functions": "^7.12.1", + "@babel/plugin-transform-block-scoping": "^7.12.1", + "@babel/plugin-transform-classes": "^7.12.1", + "@babel/plugin-transform-computed-properties": "^7.12.1", + "@babel/plugin-transform-destructuring": "^7.12.1", + "@babel/plugin-transform-dotall-regex": "^7.12.1", + "@babel/plugin-transform-duplicate-keys": "^7.12.1", + "@babel/plugin-transform-exponentiation-operator": "^7.12.1", + "@babel/plugin-transform-for-of": "^7.12.1", + "@babel/plugin-transform-function-name": "^7.12.1", + "@babel/plugin-transform-literals": "^7.12.1", + "@babel/plugin-transform-member-expression-literals": "^7.12.1", + "@babel/plugin-transform-modules-amd": "^7.12.1", + "@babel/plugin-transform-modules-commonjs": "^7.12.1", + "@babel/plugin-transform-modules-systemjs": "^7.12.1", + "@babel/plugin-transform-modules-umd": "^7.12.1", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.12.1", + "@babel/plugin-transform-new-target": "^7.12.1", + "@babel/plugin-transform-object-super": "^7.12.1", + "@babel/plugin-transform-parameters": "^7.12.1", + "@babel/plugin-transform-property-literals": "^7.12.1", + "@babel/plugin-transform-regenerator": "^7.12.1", + "@babel/plugin-transform-reserved-words": "^7.12.1", + "@babel/plugin-transform-shorthand-properties": "^7.12.1", + "@babel/plugin-transform-spread": "^7.12.1", + "@babel/plugin-transform-sticky-regex": "^7.12.1", + "@babel/plugin-transform-template-literals": "^7.12.1", + "@babel/plugin-transform-typeof-symbol": "^7.12.1", + "@babel/plugin-transform-unicode-escapes": "^7.12.1", + "@babel/plugin-transform-unicode-regex": "^7.12.1", "@babel/preset-modules": "^0.1.3", - "@babel/types": "^7.11.0", - "browserslist": "^4.12.0", + "@babel/types": "^7.12.1", "core-js-compat": "^3.6.2", - "invariant": "^2.2.2", - "levenary": "^1.1.1", "semver": "^5.5.0" }, "dependencies": { @@ -1072,9 +1069,9 @@ } }, "@babel/preset-modules": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.3.tgz", - "integrity": "sha512-Ra3JXOHBq2xd56xSF7lMKXdjBn3T772Y1Wet3yWnkDly9zHvJki029tAFzvAAK5cf4YV3yoxuP61crYRol6SVg==", + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.4.tgz", + "integrity": "sha512-J36NhwnfdzpmH41M1DrnkkgAqhZaqr/NBdPfQ677mLzlaXo+oDiv1deyCDtgAhz8p328otdob0Du7+xgHGZbKg==", "requires": { "@babel/helper-plugin-utils": "^7.0.0", "@babel/plugin-proposal-unicode-property-regex": "^7.4.4", @@ -1084,26 +1081,26 @@ } }, "@babel/preset-react": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.10.4.tgz", - "integrity": "sha512-BrHp4TgOIy4M19JAfO1LhycVXOPWdDbTRep7eVyatf174Hff+6Uk53sDyajqZPu8W1qXRBiYOfIamek6jA7YVw==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.12.1.tgz", + "integrity": "sha512-euCExymHCi0qB9u5fKw7rvlw7AZSjw/NaB9h7EkdTt5+yHRrXdiRTh7fkG3uBPpJg82CqLfp1LHLqWGSCrab+g==", "requires": { "@babel/helper-plugin-utils": "^7.10.4", - "@babel/plugin-transform-react-display-name": "^7.10.4", - "@babel/plugin-transform-react-jsx": "^7.10.4", - "@babel/plugin-transform-react-jsx-development": "^7.10.4", - "@babel/plugin-transform-react-jsx-self": "^7.10.4", - "@babel/plugin-transform-react-jsx-source": "^7.10.4", - "@babel/plugin-transform-react-pure-annotations": "^7.10.4" + "@babel/plugin-transform-react-display-name": "^7.12.1", + "@babel/plugin-transform-react-jsx": "^7.12.1", + "@babel/plugin-transform-react-jsx-development": "^7.12.1", + "@babel/plugin-transform-react-jsx-self": "^7.12.1", + "@babel/plugin-transform-react-jsx-source": "^7.12.1", + "@babel/plugin-transform-react-pure-annotations": "^7.12.1" } }, "@babel/preset-typescript": { - "version": "7.9.0", - "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.9.0.tgz", - "integrity": "sha512-S4cueFnGrIbvYJgwsVFKdvOmpiL0XGw9MFW9D0vgRys5g36PBhZRL8NX8Gr2akz8XRtzq6HuDXPD/1nniagNUg==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.12.1.tgz", + "integrity": "sha512-hNK/DhmoJPsksdHuI/RVrcEws7GN5eamhi28JkO52MqIxU8Z0QpmiSOQxZHWOHV7I3P4UjHV97ay4TcamMA6Kw==", "requires": { - "@babel/helper-plugin-utils": "^7.8.3", - "@babel/plugin-transform-typescript": "^7.9.0" + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-transform-typescript": "^7.12.1" } }, "@babel/runtime": { @@ -1122,9 +1119,9 @@ } }, "@babel/runtime-corejs3": { - "version": "7.11.2", - "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.11.2.tgz", - "integrity": "sha512-qh5IR+8VgFz83VBa6OkaET6uN/mJOhHONuy3m1sgF0CV6mXdPSEBdA7e1eUbVvyNtANjMbg22JUv71BaDXLY6A==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.12.1.tgz", + "integrity": "sha512-umhPIcMrlBZ2aTWlWjUseW9LjQKxi1dpFlQS8DzsxB//5K+u6GLTC/JliPKHsd5kJVPIU6X/Hy0YvWOYPcMxBw==", "requires": { "core-js-pure": "^3.0.0", "regenerator-runtime": "^0.13.4" @@ -1148,31 +1145,36 @@ } }, "@babel/traverse": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.11.0.tgz", - "integrity": "sha512-ZB2V+LskoWKNpMq6E5UUCrjtDUh5IOTAyIl0dTjIEoXum/iKWkoIEKIRDnUucO6f+2FzNkE0oD4RLKoPIufDtg==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.12.1.tgz", + "integrity": "sha512-MA3WPoRt1ZHo2ZmoGKNqi20YnPt0B1S0GTZEPhhd+hw2KGUzBlHuVunj6K4sNuK+reEvyiPwtp0cpaqLzJDmAw==", "requires": { "@babel/code-frame": "^7.10.4", - "@babel/generator": "^7.11.0", + "@babel/generator": "^7.12.1", "@babel/helper-function-name": "^7.10.4", "@babel/helper-split-export-declaration": "^7.11.0", - "@babel/parser": "^7.11.0", - "@babel/types": "^7.11.0", + "@babel/parser": "^7.12.1", + "@babel/types": "^7.12.1", "debug": "^4.1.0", "globals": "^11.1.0", "lodash": "^4.17.19" } }, "@babel/types": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.11.0.tgz", - "integrity": "sha512-O53yME4ZZI0jO1EVGtF1ePGl0LHirG4P1ibcD80XyzZcKhcMFeCXmh4Xb1ifGBIV233Qg12x4rBfQgA+tmOukA==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.1.tgz", + "integrity": "sha512-BzSY3NJBKM4kyatSOWh3D/JJ2O3CVzBybHWxtgxnggaxEuaSTTDqeiSb/xk9lrkw2Tbqyivw5ZU4rT+EfznQsA==", "requires": { "@babel/helper-validator-identifier": "^7.10.4", "lodash": "^4.17.19", "to-fast-properties": "^2.0.0" } }, + "@bcoe/v8-coverage": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", + "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==" + }, "@cnakazawa/watch": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/@cnakazawa/watch/-/watch-1.0.4.tgz", @@ -1192,32 +1194,80 @@ "resolved": "https://registry.npmjs.org/@csstools/normalize.css/-/normalize.css-10.1.0.tgz", "integrity": "sha512-ij4wRiunFfaJxjB0BdrYHIH8FxBJpOwNPhhAcunlmPdXudL1WQV1qoP9un6JsEBAgQH+7UXyyjh0g7jTxXK6tg==" }, + "@eslint/eslintrc": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.2.0.tgz", + "integrity": "sha512-+cIGPCBdLCzqxdtwppswP+zTsH9BOIGzAeKfBIbtb4gW/giMlfMwP0HUSFfhzh20f9u8uZ8hOp62+4GPquTbwQ==", + "requires": { + "ajv": "^6.12.4", + "debug": "^4.1.1", + "espree": "^7.3.0", + "globals": "^12.1.0", + "ignore": "^4.0.6", + "import-fresh": "^3.2.1", + "js-yaml": "^3.13.1", + "lodash": "^4.17.19", + "minimatch": "^3.0.4", + "strip-json-comments": "^3.1.1" + }, + "dependencies": { + "ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" + }, + "globals": { + "version": "12.4.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-12.4.0.tgz", + "integrity": "sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg==", + "requires": { + "type-fest": "^0.8.1" + } + }, + "ignore": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", + "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==" + } + } + }, "@fortawesome/fontawesome-common-types": { - "version": "0.2.30", - "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-common-types/-/fontawesome-common-types-0.2.30.tgz", - "integrity": "sha512-TsRwpTuKwFNiPhk1UfKgw7zNPeV5RhNp2Uw3pws+9gDAkPGKrtjR1y2lI3SYn7+YzyfuNknflpBA1LRKjt7hMg==" + "version": "0.2.32", + "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-common-types/-/fontawesome-common-types-0.2.32.tgz", + "integrity": "sha512-ux2EDjKMpcdHBVLi/eWZynnPxs0BtFVXJkgHIxXRl+9ZFaHPvYamAfCzeeQFqHRjuJtX90wVnMRaMQAAlctz3w==" }, "@fortawesome/fontawesome-svg-core": { - "version": "1.2.30", - "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-svg-core/-/fontawesome-svg-core-1.2.30.tgz", - "integrity": "sha512-E3sAXATKCSVnT17HYmZjjbcmwihrNOCkoU7dVMlasrcwiJAHxSKeZ+4WN5O+ElgO/FaYgJmASl8p9N7/B/RttA==", + "version": "1.2.32", + "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-svg-core/-/fontawesome-svg-core-1.2.32.tgz", + "integrity": "sha512-XjqyeLCsR/c/usUpdWcOdVtWFVjPbDFBTQkn2fQRrWhhUoxriQohO2RWDxLyUM8XpD+Zzg5xwJ8gqTYGDLeGaQ==", "requires": { - "@fortawesome/fontawesome-common-types": "^0.2.30" + "@fortawesome/fontawesome-common-types": "^0.2.32" }, "dependencies": { "@fortawesome/fontawesome-common-types": { - "version": "0.2.30", - "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-common-types/-/fontawesome-common-types-0.2.30.tgz", - "integrity": "sha512-TsRwpTuKwFNiPhk1UfKgw7zNPeV5RhNp2Uw3pws+9gDAkPGKrtjR1y2lI3SYn7+YzyfuNknflpBA1LRKjt7hMg==" + "version": "0.2.32", + "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-common-types/-/fontawesome-common-types-0.2.32.tgz", + "integrity": "sha512-ux2EDjKMpcdHBVLi/eWZynnPxs0BtFVXJkgHIxXRl+9ZFaHPvYamAfCzeeQFqHRjuJtX90wVnMRaMQAAlctz3w==" } } }, "@fortawesome/free-solid-svg-icons": { - "version": "5.14.0", - "resolved": "https://registry.npmjs.org/@fortawesome/free-solid-svg-icons/-/free-solid-svg-icons-5.14.0.tgz", - "integrity": "sha512-M933RDM8cecaKMWDSk3FRYdnzWGW7kBBlGNGfvqLVwcwhUPNj9gcw+xZMrqBdRqxnSXdl3zWzTCNNGEtFUq67Q==", + "version": "5.15.1", + "resolved": "https://registry.npmjs.org/@fortawesome/free-solid-svg-icons/-/free-solid-svg-icons-5.15.1.tgz", + "integrity": "sha512-EFMuKtzRMNbvjab/SvJBaOOpaqJfdSap/Nl6hst7CgrJxwfORR1drdTV6q1Ib/JVzq4xObdTDcT6sqTaXMqfdg==", "requires": { - "@fortawesome/fontawesome-common-types": "^0.2.30" + "@fortawesome/fontawesome-common-types": "^0.2.32" } }, "@fortawesome/react-fontawesome": { @@ -1267,196 +1317,647 @@ "resolved": "https://registry.npmjs.org/@icons/material/-/material-0.2.4.tgz", "integrity": "sha512-QPcGmICAPbGLGb6F/yNf/KzKqvFx8z5qx3D1yFqVAjoFmXK35EgyW+cJ57Te3CNsmzblwtzakLGFqHPqrfb4Tw==" }, - "@jest/console": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-24.9.0.tgz", - "integrity": "sha512-Zuj6b8TnKXi3q4ymac8EQfc3ea/uhLeCGThFqXeC8H9/raaH8ARPUTdId+XyGd03Z4In0/VjD2OYFcBF09fNLQ==", + "@istanbuljs/load-nyc-config": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", + "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", "requires": { - "@jest/source-map": "^24.9.0", - "chalk": "^2.0.1", - "slash": "^2.0.0" + "camelcase": "^5.3.1", + "find-up": "^4.1.0", + "get-package-type": "^0.1.0", + "js-yaml": "^3.13.1", + "resolve-from": "^5.0.0" + }, + "dependencies": { + "resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==" + } + } + }, + "@istanbuljs/schema": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.2.tgz", + "integrity": "sha512-tsAQNx32a8CoFhjhijUIhI4kccIAgmGhy8LZMZgGfmXcpMbPRUqn5LWmgRttILi6yeGmBJd2xsPkFMs0PzgPCw==" + }, + "@jest/console": { + "version": "26.6.1", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-26.6.1.tgz", + "integrity": "sha512-cjqcXepwC5M+VeIhwT6Xpi/tT4AiNzlIx8SMJ9IihduHnsSrnWNvTBfKIpmqOOCNOPqtbBx6w2JqfoLOJguo8g==", + "requires": { + "@jest/types": "^26.6.1", + "@types/node": "*", + "chalk": "^4.0.0", + "jest-message-util": "^26.6.1", + "jest-util": "^26.6.1", + "slash": "^3.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "requires": { + "has-flag": "^4.0.0" + } + } } }, "@jest/core": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/@jest/core/-/core-24.9.0.tgz", - "integrity": "sha512-Fogg3s4wlAr1VX7q+rhV9RVnUv5tD7VuWfYy1+whMiWUrvl7U3QJSJyWcDio9Lq2prqYsZaeTv2Rz24pWGkJ2A==", + "version": "26.6.1", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-26.6.1.tgz", + "integrity": "sha512-p4F0pgK3rKnoS9olXXXOkbus1Bsu6fd8pcvLMPsUy4CVXZ8WSeiwQ1lK5hwkCIqJ+amZOYPd778sbPha/S8Srw==", "requires": { - "@jest/console": "^24.7.1", - "@jest/reporters": "^24.9.0", - "@jest/test-result": "^24.9.0", - "@jest/transform": "^24.9.0", - "@jest/types": "^24.9.0", - "ansi-escapes": "^3.0.0", - "chalk": "^2.0.1", + "@jest/console": "^26.6.1", + "@jest/reporters": "^26.6.1", + "@jest/test-result": "^26.6.1", + "@jest/transform": "^26.6.1", + "@jest/types": "^26.6.1", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", "exit": "^0.1.2", - "graceful-fs": "^4.1.15", - "jest-changed-files": "^24.9.0", - "jest-config": "^24.9.0", - "jest-haste-map": "^24.9.0", - "jest-message-util": "^24.9.0", - "jest-regex-util": "^24.3.0", - "jest-resolve": "^24.9.0", - "jest-resolve-dependencies": "^24.9.0", - "jest-runner": "^24.9.0", - "jest-runtime": "^24.9.0", - "jest-snapshot": "^24.9.0", - "jest-util": "^24.9.0", - "jest-validate": "^24.9.0", - "jest-watcher": "^24.9.0", - "micromatch": "^3.1.10", - "p-each-series": "^1.0.0", - "realpath-native": "^1.1.0", - "rimraf": "^2.5.4", - "slash": "^2.0.0", - "strip-ansi": "^5.0.0" + "graceful-fs": "^4.2.4", + "jest-changed-files": "^26.6.1", + "jest-config": "^26.6.1", + "jest-haste-map": "^26.6.1", + "jest-message-util": "^26.6.1", + "jest-regex-util": "^26.0.0", + "jest-resolve": "^26.6.1", + "jest-resolve-dependencies": "^26.6.1", + "jest-runner": "^26.6.1", + "jest-runtime": "^26.6.1", + "jest-snapshot": "^26.6.1", + "jest-util": "^26.6.1", + "jest-validate": "^26.6.1", + "jest-watcher": "^26.6.1", + "micromatch": "^4.0.2", + "p-each-series": "^2.1.0", + "rimraf": "^3.0.0", + "slash": "^3.0.0", + "strip-ansi": "^6.0.0" }, "dependencies": { - "ansi-escapes": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz", - "integrity": "sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==" + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "graceful-fs": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", + "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==" + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "jest-resolve": { + "version": "26.6.1", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-26.6.1.tgz", + "integrity": "sha512-hiHfQH6rrcpAmw9xCQ0vD66SDuU+7ZulOuKwc4jpbmFFsz0bQG/Ib92K+9/489u5rVw0btr/ZhiHqBpmkbCvuQ==", + "requires": { + "@jest/types": "^26.6.1", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.4", + "jest-pnp-resolver": "^1.2.2", + "jest-util": "^26.6.1", + "read-pkg-up": "^7.0.1", + "resolve": "^1.18.1", + "slash": "^3.0.0" + } + }, + "read-pkg": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", + "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", + "requires": { + "@types/normalize-package-data": "^2.4.0", + "normalize-package-data": "^2.5.0", + "parse-json": "^5.0.0", + "type-fest": "^0.6.0" + }, + "dependencies": { + "type-fest": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", + "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==" + } + } + }, + "read-pkg-up": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", + "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", + "requires": { + "find-up": "^4.1.0", + "read-pkg": "^5.2.0", + "type-fest": "^0.8.1" + } + }, + "resolve": { + "version": "1.18.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.18.1.tgz", + "integrity": "sha512-lDfCPaMKfOJXjy0dPayzPdF1phampNWr3qFCjAu+rw/qbQmr5jWH5xN2hwh9QKfw9E5v4hwV7A+jrCmL8yjjqA==", + "requires": { + "is-core-module": "^2.0.0", + "path-parse": "^1.0.6" + } + }, + "rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "requires": { + "glob": "^7.1.3" + } + }, + "strip-ansi": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "requires": { + "ansi-regex": "^5.0.0" + } + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "requires": { + "has-flag": "^4.0.0" + } } } }, "@jest/environment": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-24.9.0.tgz", - "integrity": "sha512-5A1QluTPhvdIPFYnO3sZC3smkNeXPVELz7ikPbhUj0bQjB07EoE9qtLrem14ZUYWdVayYbsjVwIiL4WBIMV4aQ==", + "version": "26.6.1", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-26.6.1.tgz", + "integrity": "sha512-GNvHwkOFJtNgSwdzH9flUPzF9AYAZhUg124CBoQcwcZCM9s5TLz8Y3fMtiaWt4ffbigoetjGk5PU2Dd8nLrSEw==", "requires": { - "@jest/fake-timers": "^24.9.0", - "@jest/transform": "^24.9.0", - "@jest/types": "^24.9.0", - "jest-mock": "^24.9.0" + "@jest/fake-timers": "^26.6.1", + "@jest/types": "^26.6.1", + "@types/node": "*", + "jest-mock": "^26.6.1" } }, "@jest/fake-timers": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-24.9.0.tgz", - "integrity": "sha512-eWQcNa2YSwzXWIMC5KufBh3oWRIijrQFROsIqt6v/NS9Io/gknw1jsAC9c+ih/RQX4A3O7SeWAhQeN0goKhT9A==", + "version": "26.6.1", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-26.6.1.tgz", + "integrity": "sha512-T/SkMLgOquenw/nIisBRD6XAYpFir0kNuclYLkse5BpzeDUukyBr+K31xgAo9M0hgjU9ORlekAYPSzc0DKfmKg==", "requires": { - "@jest/types": "^24.9.0", - "jest-message-util": "^24.9.0", - "jest-mock": "^24.9.0" + "@jest/types": "^26.6.1", + "@sinonjs/fake-timers": "^6.0.1", + "@types/node": "*", + "jest-message-util": "^26.6.1", + "jest-mock": "^26.6.1", + "jest-util": "^26.6.1" + } + }, + "@jest/globals": { + "version": "26.6.1", + "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-26.6.1.tgz", + "integrity": "sha512-acxXsSguuLV/CeMYmBseefw6apO7NuXqpE+v5r3yD9ye2PY7h1nS20vY7Obk2w6S7eJO4OIAJeDnoGcLC/McEQ==", + "requires": { + "@jest/environment": "^26.6.1", + "@jest/types": "^26.6.1", + "expect": "^26.6.1" } }, "@jest/reporters": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-24.9.0.tgz", - "integrity": "sha512-mu4X0yjaHrffOsWmVLzitKmmmWSQ3GGuefgNscUSWNiUNcEOSEQk9k3pERKEQVBb0Cnn88+UESIsZEMH3o88Gw==", + "version": "26.6.1", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-26.6.1.tgz", + "integrity": "sha512-J6OlXVFY3q1SXWJhjme5i7qT/BAZSikdOK2t8Ht5OS32BDo6KfG5CzIzzIFnAVd82/WWbc9Hb7SJ/jwSvVH9YA==", "requires": { - "@jest/environment": "^24.9.0", - "@jest/test-result": "^24.9.0", - "@jest/transform": "^24.9.0", - "@jest/types": "^24.9.0", - "chalk": "^2.0.1", + "@bcoe/v8-coverage": "^0.2.3", + "@jest/console": "^26.6.1", + "@jest/test-result": "^26.6.1", + "@jest/transform": "^26.6.1", + "@jest/types": "^26.6.1", + "chalk": "^4.0.0", + "collect-v8-coverage": "^1.0.0", "exit": "^0.1.2", "glob": "^7.1.2", - "istanbul-lib-coverage": "^2.0.2", - "istanbul-lib-instrument": "^3.0.1", - "istanbul-lib-report": "^2.0.4", - "istanbul-lib-source-maps": "^3.0.1", - "istanbul-reports": "^2.2.6", - "jest-haste-map": "^24.9.0", - "jest-resolve": "^24.9.0", - "jest-runtime": "^24.9.0", - "jest-util": "^24.9.0", - "jest-worker": "^24.6.0", - "node-notifier": "^5.4.2", - "slash": "^2.0.0", + "graceful-fs": "^4.2.4", + "istanbul-lib-coverage": "^3.0.0", + "istanbul-lib-instrument": "^4.0.3", + "istanbul-lib-report": "^3.0.0", + "istanbul-lib-source-maps": "^4.0.0", + "istanbul-reports": "^3.0.2", + "jest-haste-map": "^26.6.1", + "jest-resolve": "^26.6.1", + "jest-util": "^26.6.1", + "jest-worker": "^26.6.1", + "node-notifier": "^8.0.0", + "slash": "^3.0.0", "source-map": "^0.6.0", - "string-length": "^2.0.0" + "string-length": "^4.0.1", + "terminal-link": "^2.0.0", + "v8-to-istanbul": "^6.0.1" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "graceful-fs": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", + "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==" + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "jest-resolve": { + "version": "26.6.1", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-26.6.1.tgz", + "integrity": "sha512-hiHfQH6rrcpAmw9xCQ0vD66SDuU+7ZulOuKwc4jpbmFFsz0bQG/Ib92K+9/489u5rVw0btr/ZhiHqBpmkbCvuQ==", + "requires": { + "@jest/types": "^26.6.1", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.4", + "jest-pnp-resolver": "^1.2.2", + "jest-util": "^26.6.1", + "read-pkg-up": "^7.0.1", + "resolve": "^1.18.1", + "slash": "^3.0.0" + } + }, + "read-pkg": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", + "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", + "requires": { + "@types/normalize-package-data": "^2.4.0", + "normalize-package-data": "^2.5.0", + "parse-json": "^5.0.0", + "type-fest": "^0.6.0" + }, + "dependencies": { + "type-fest": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", + "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==" + } + } + }, + "read-pkg-up": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", + "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", + "requires": { + "find-up": "^4.1.0", + "read-pkg": "^5.2.0", + "type-fest": "^0.8.1" + } + }, + "resolve": { + "version": "1.18.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.18.1.tgz", + "integrity": "sha512-lDfCPaMKfOJXjy0dPayzPdF1phampNWr3qFCjAu+rw/qbQmr5jWH5xN2hwh9QKfw9E5v4hwV7A+jrCmL8yjjqA==", + "requires": { + "is-core-module": "^2.0.0", + "path-parse": "^1.0.6" + } + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "requires": { + "has-flag": "^4.0.0" + } + } } }, "@jest/source-map": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-24.9.0.tgz", - "integrity": "sha512-/Xw7xGlsZb4MJzNDgB7PW5crou5JqWiBQaz6xyPd3ArOg2nfn/PunV8+olXbbEZzNl591o5rWKE9BRDaFAuIBg==", + "version": "26.5.0", + "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-26.5.0.tgz", + "integrity": "sha512-jWAw9ZwYHJMe9eZq/WrsHlwF8E3hM9gynlcDpOyCb9bR8wEd9ZNBZCi7/jZyzHxC7t3thZ10gO2IDhu0bPKS5g==", "requires": { "callsites": "^3.0.0", - "graceful-fs": "^4.1.15", + "graceful-fs": "^4.2.4", "source-map": "^0.6.0" }, "dependencies": { - "callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==" + "graceful-fs": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", + "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==" } } }, "@jest/test-result": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-24.9.0.tgz", - "integrity": "sha512-XEFrHbBonBJ8dGp2JmF8kP/nQI/ImPpygKHwQ/SY+es59Z3L5PI4Qb9TQQMAEeYsThG1xF0k6tmG0tIKATNiiA==", + "version": "26.6.1", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-26.6.1.tgz", + "integrity": "sha512-wqAgIerIN2gSdT2A8WeA5+AFh9XQBqYGf8etK143yng3qYd0mF0ie2W5PVmgnjw4VDU6ammI9NdXrKgNhreawg==", "requires": { - "@jest/console": "^24.9.0", - "@jest/types": "^24.9.0", - "@types/istanbul-lib-coverage": "^2.0.0" + "@jest/console": "^26.6.1", + "@jest/types": "^26.6.1", + "@types/istanbul-lib-coverage": "^2.0.0", + "collect-v8-coverage": "^1.0.0" } }, "@jest/test-sequencer": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-24.9.0.tgz", - "integrity": "sha512-6qqsU4o0kW1dvA95qfNog8v8gkRN9ph6Lz7r96IvZpHdNipP2cBcb07J1Z45mz/VIS01OHJ3pY8T5fUY38tg4A==", + "version": "26.6.1", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-26.6.1.tgz", + "integrity": "sha512-0csqA/XApZiNeTIPYh6koIDCACSoR6hi29T61tKJMtCZdEC+tF3PoNt7MS0oK/zKC6daBgCbqXxia5ztr/NyCQ==", "requires": { - "@jest/test-result": "^24.9.0", - "jest-haste-map": "^24.9.0", - "jest-runner": "^24.9.0", - "jest-runtime": "^24.9.0" + "@jest/test-result": "^26.6.1", + "graceful-fs": "^4.2.4", + "jest-haste-map": "^26.6.1", + "jest-runner": "^26.6.1", + "jest-runtime": "^26.6.1" + }, + "dependencies": { + "graceful-fs": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", + "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==" + } } }, "@jest/transform": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-24.9.0.tgz", - "integrity": "sha512-TcQUmyNRxV94S0QpMOnZl0++6RMiqpbH/ZMccFB/amku6Uwvyb1cjYX7xkp5nGNkbX4QPH/FcB6q1HBTHynLmQ==", + "version": "26.6.1", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-26.6.1.tgz", + "integrity": "sha512-oNFAqVtqRxZRx6vXL3I4bPKUK0BIlEeaalkwxyQGGI8oXDQBtYQBpiMe5F7qPs4QdvvFYB42gPGIMMcxXaBBxQ==", "requires": { "@babel/core": "^7.1.0", - "@jest/types": "^24.9.0", - "babel-plugin-istanbul": "^5.1.0", - "chalk": "^2.0.1", + "@jest/types": "^26.6.1", + "babel-plugin-istanbul": "^6.0.0", + "chalk": "^4.0.0", "convert-source-map": "^1.4.0", "fast-json-stable-stringify": "^2.0.0", - "graceful-fs": "^4.1.15", - "jest-haste-map": "^24.9.0", - "jest-regex-util": "^24.9.0", - "jest-util": "^24.9.0", - "micromatch": "^3.1.10", + "graceful-fs": "^4.2.4", + "jest-haste-map": "^26.6.1", + "jest-regex-util": "^26.0.0", + "jest-util": "^26.6.1", + "micromatch": "^4.0.2", "pirates": "^4.0.1", - "realpath-native": "^1.1.0", - "slash": "^2.0.0", + "slash": "^3.0.0", "source-map": "^0.6.1", - "write-file-atomic": "2.4.1" + "write-file-atomic": "^3.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "graceful-fs": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", + "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==" + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "requires": { + "has-flag": "^4.0.0" + } + } } }, "@jest/types": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-24.9.0.tgz", - "integrity": "sha512-XKK7ze1apu5JWQ5eZjHITP66AX+QsLlbaJRBGYr8pNzwcAE2JVkwnf0yqjHTsDRcjR0mujy/NmZMXw5kl+kGBw==", + "version": "26.6.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.6.1.tgz", + "integrity": "sha512-ywHavIKNpAVrStiRY5wiyehvcktpijpItvGiK72RAn5ctqmzvPk8OvKnvHeBqa1XdQr959CTWAJMqxI8BTibyg==", "requires": { "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^1.1.1", - "@types/yargs": "^13.0.0" + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^15.0.0", + "chalk": "^4.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "requires": { + "has-flag": "^4.0.0" + } + } } }, - "@mrmlnc/readdir-enhanced": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/@mrmlnc/readdir-enhanced/-/readdir-enhanced-2.2.1.tgz", - "integrity": "sha512-bPHp6Ji8b41szTOcaP63VlnbbO5Ny6dwAATtY6JTjh5N2OLrb5Qk/Th5cRkRQhkWCt+EJsYrNB0MiL+Gpn6e3g==", + "@nodelib/fs.scandir": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.3.tgz", + "integrity": "sha512-eGmwYQn3gxo4r7jdQnkrrN6bY478C3P+a/y72IJukF8LjB6ZHeB3c+Ehacj3sYeSmUXGlnA67/PmbM9CVwL7Dw==", "requires": { - "call-me-maybe": "^1.0.1", - "glob-to-regexp": "^0.3.0" + "@nodelib/fs.stat": "2.0.3", + "run-parallel": "^1.1.9" } }, "@nodelib/fs.stat": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-1.1.3.tgz", - "integrity": "sha512-shAmDyaQC4H92APFoIaVDHCx5bStIocgvbwQyxPRrbUY20V1EYTbSDchWbuwlMG3V17cprZhA6+78JfB+3DTPw==" + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.3.tgz", + "integrity": "sha512-bQBFruR2TAwoevBEd/NWMoAAtNGzTRgdrqnYCc7dhzfoNvqPzLyqlEQnzZ3kVnNrSp25iyxE00/3h2fqGAGArA==" + }, + "@nodelib/fs.walk": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.4.tgz", + "integrity": "sha512-1V9XOY4rDW0rehzbrcqAmHnz8e7SKvX27gh8Gt2WgB0+pdzdiLV83p72kZPU+jvMbS1qU5mauP2iOvO8rhmurQ==", + "requires": { + "@nodelib/fs.scandir": "2.1.3", + "fastq": "^1.6.0" + } + }, + "@npmcli/move-file": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@npmcli/move-file/-/move-file-1.0.1.tgz", + "integrity": "sha512-Uv6h1sT+0DrblvIrolFtbvM1FgWm+/sy4B3pvLp67Zys+thcukzS5ekn7HsZFGpWP4Q3fYJCljbWQE/XivMRLw==", + "requires": { + "mkdirp": "^1.0.4" + }, + "dependencies": { + "mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==" + } + } + }, + "@pmmmwh/react-refresh-webpack-plugin": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/@pmmmwh/react-refresh-webpack-plugin/-/react-refresh-webpack-plugin-0.4.2.tgz", + "integrity": "sha512-Loc4UDGutcZ+Bd56hBInkm6JyjyCwWy4t2wcDXzN8EDPANgVRj0VP8Nxn0Zq2pc+WKauZwEivQgbDGg4xZO20A==", + "requires": { + "ansi-html": "^0.0.7", + "error-stack-parser": "^2.0.6", + "html-entities": "^1.2.1", + "native-url": "^0.2.6", + "schema-utils": "^2.6.5", + "source-map": "^0.7.3" + }, + "dependencies": { + "source-map": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", + "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==" + } + } }, "@popperjs/core": { - "version": "2.4.4", - "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.4.4.tgz", - "integrity": "sha512-1oO6+dN5kdIA3sKPZhRGJTfGVP4SWV6KqlMOwry4J3HfyD68sl/3KmG7DeYUzvN+RbhXDnv/D8vNNB8168tAMg==" + "version": "2.5.3", + "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.5.3.tgz", + "integrity": "sha512-RFwCobxsvZ6j7twS7dHIZQZituMIDJJNHS/qY6iuthVebxS3zhRY+jaC2roEKiAYaVuTcGmX6Luc6YBcf6zJVg==" }, "@react-dnd/asap": { "version": "4.0.0", @@ -1487,119 +1988,210 @@ "lodash-es": "^4.17.15" } }, + "@rollup/plugin-node-resolve": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-7.1.3.tgz", + "integrity": "sha512-RxtSL3XmdTAE2byxekYLnx+98kEUOrPHF/KRVjLH+DEIHy6kjIw7YINQzn+NXiH/NTrQLAwYs0GWB+csWygA9Q==", + "requires": { + "@rollup/pluginutils": "^3.0.8", + "@types/resolve": "0.0.8", + "builtin-modules": "^3.1.0", + "is-module": "^1.0.0", + "resolve": "^1.14.2" + }, + "dependencies": { + "resolve": { + "version": "1.18.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.18.1.tgz", + "integrity": "sha512-lDfCPaMKfOJXjy0dPayzPdF1phampNWr3qFCjAu+rw/qbQmr5jWH5xN2hwh9QKfw9E5v4hwV7A+jrCmL8yjjqA==", + "requires": { + "is-core-module": "^2.0.0", + "path-parse": "^1.0.6" + } + } + } + }, + "@rollup/plugin-replace": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/@rollup/plugin-replace/-/plugin-replace-2.3.3.tgz", + "integrity": "sha512-XPmVXZ7IlaoWaJLkSCDaa0Y6uVo5XQYHhiMFzOd5qSv5rE+t/UJToPIOE56flKIxBFQI27ONsxb7dqHnwSsjKQ==", + "requires": { + "@rollup/pluginutils": "^3.0.8", + "magic-string": "^0.25.5" + } + }, + "@rollup/pluginutils": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-3.1.0.tgz", + "integrity": "sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg==", + "requires": { + "@types/estree": "0.0.39", + "estree-walker": "^1.0.1", + "picomatch": "^2.2.2" + }, + "dependencies": { + "@types/estree": { + "version": "0.0.39", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.39.tgz", + "integrity": "sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==" + }, + "picomatch": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz", + "integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==" + } + } + }, + "@sinonjs/commons": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.1.tgz", + "integrity": "sha512-892K+kWUUi3cl+LlqEWIDrhvLgdL79tECi8JZUyq6IviKy/DNhuzCRlbHUjxK89f4ypPMMaFnFuR9Ie6DoIMsw==", + "requires": { + "type-detect": "4.0.8" + } + }, + "@sinonjs/fake-timers": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-6.0.1.tgz", + "integrity": "sha512-MZPUxrmFubI36XS1DI3qmI0YdN1gks62JtFZvxR67ljjSNCeK6U08Zx4msEWOXuofgqUt6zPHSi1H9fbjR/NRA==", + "requires": { + "@sinonjs/commons": "^1.7.0" + } + }, + "@surma/rollup-plugin-off-main-thread": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/@surma/rollup-plugin-off-main-thread/-/rollup-plugin-off-main-thread-1.4.1.tgz", + "integrity": "sha512-ZPBWYQDdO4JZiTmTP3DABsHhIPA7bEJk9Znk7tZsrbPGanoGo8YxMv//WLx5Cvb+lRgS42+6yiOIYYHCKDmkpQ==", + "requires": { + "ejs": "^2.6.1", + "magic-string": "^0.25.0" + } + }, "@svgr/babel-plugin-add-jsx-attribute": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-4.2.0.tgz", - "integrity": "sha512-j7KnilGyZzYr/jhcrSYS3FGWMZVaqyCG0vzMCwzvei0coIkczuYMcniK07nI0aHJINciujjH11T72ICW5eL5Ig==" + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-5.4.0.tgz", + "integrity": "sha512-ZFf2gs/8/6B8PnSofI0inYXr2SDNTDScPXhN7k5EqD4aZ3gi6u+rbmZHVB8IM3wDyx8ntKACZbtXSm7oZGRqVg==" }, "@svgr/babel-plugin-remove-jsx-attribute": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-attribute/-/babel-plugin-remove-jsx-attribute-4.2.0.tgz", - "integrity": "sha512-3XHLtJ+HbRCH4n28S7y/yZoEQnRpl0tvTZQsHqvaeNXPra+6vE5tbRliH3ox1yZYPCxrlqaJT/Mg+75GpDKlvQ==" + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-attribute/-/babel-plugin-remove-jsx-attribute-5.4.0.tgz", + "integrity": "sha512-yaS4o2PgUtwLFGTKbsiAy6D0o3ugcUhWK0Z45umJ66EPWunAz9fuFw2gJuje6wqQvQWOTJvIahUwndOXb7QCPg==" }, "@svgr/babel-plugin-remove-jsx-empty-expression": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-empty-expression/-/babel-plugin-remove-jsx-empty-expression-4.2.0.tgz", - "integrity": "sha512-yTr2iLdf6oEuUE9MsRdvt0NmdpMBAkgK8Bjhl6epb+eQWk6abBaX3d65UZ3E3FWaOwePyUgNyNCMVG61gGCQ7w==" + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-empty-expression/-/babel-plugin-remove-jsx-empty-expression-5.0.1.tgz", + "integrity": "sha512-LA72+88A11ND/yFIMzyuLRSMJ+tRKeYKeQ+mR3DcAZ5I4h5CPWN9AHyUzJbWSYp/u2u0xhmgOe0+E41+GjEueA==" }, "@svgr/babel-plugin-replace-jsx-attribute-value": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-replace-jsx-attribute-value/-/babel-plugin-replace-jsx-attribute-value-4.2.0.tgz", - "integrity": "sha512-U9m870Kqm0ko8beHawRXLGLvSi/ZMrl89gJ5BNcT452fAjtF2p4uRzXkdzvGJJJYBgx7BmqlDjBN/eCp5AAX2w==" + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-replace-jsx-attribute-value/-/babel-plugin-replace-jsx-attribute-value-5.0.1.tgz", + "integrity": "sha512-PoiE6ZD2Eiy5mK+fjHqwGOS+IXX0wq/YDtNyIgOrc6ejFnxN4b13pRpiIPbtPwHEc+NT2KCjteAcq33/F1Y9KQ==" }, "@svgr/babel-plugin-svg-dynamic-title": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-dynamic-title/-/babel-plugin-svg-dynamic-title-4.3.3.tgz", - "integrity": "sha512-w3Be6xUNdwgParsvxkkeZb545VhXEwjGMwExMVBIdPQJeyMQHqm9Msnb2a1teHBqUYL66qtwfhNkbj1iarCG7w==" + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-dynamic-title/-/babel-plugin-svg-dynamic-title-5.4.0.tgz", + "integrity": "sha512-zSOZH8PdZOpuG1ZVx/cLVePB2ibo3WPpqo7gFIjLV9a0QsuQAzJiwwqmuEdTaW2pegyBE17Uu15mOgOcgabQZg==" }, "@svgr/babel-plugin-svg-em-dimensions": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-em-dimensions/-/babel-plugin-svg-em-dimensions-4.2.0.tgz", - "integrity": "sha512-C0Uy+BHolCHGOZ8Dnr1zXy/KgpBOkEUYY9kI/HseHVPeMbluaX3CijJr7D4C5uR8zrc1T64nnq/k63ydQuGt4w==" + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-em-dimensions/-/babel-plugin-svg-em-dimensions-5.4.0.tgz", + "integrity": "sha512-cPzDbDA5oT/sPXDCUYoVXEmm3VIoAWAPT6mSPTJNbQaBNUuEKVKyGH93oDY4e42PYHRW67N5alJx/eEol20abw==" }, "@svgr/babel-plugin-transform-react-native-svg": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-react-native-svg/-/babel-plugin-transform-react-native-svg-4.2.0.tgz", - "integrity": "sha512-7YvynOpZDpCOUoIVlaaOUU87J4Z6RdD6spYN4eUb5tfPoKGSF9OG2NuhgYnq4jSkAxcpMaXWPf1cePkzmqTPNw==" + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-react-native-svg/-/babel-plugin-transform-react-native-svg-5.4.0.tgz", + "integrity": "sha512-3eYP/SaopZ41GHwXma7Rmxcv9uRslRDTY1estspeB1w1ueZWd/tPlMfEOoccYpEMZU3jD4OU7YitnXcF5hLW2Q==" }, "@svgr/babel-plugin-transform-svg-component": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-svg-component/-/babel-plugin-transform-svg-component-4.2.0.tgz", - "integrity": "sha512-hYfYuZhQPCBVotABsXKSCfel2slf/yvJY8heTVX1PCTaq/IgASq1IyxPPKJ0chWREEKewIU/JMSsIGBtK1KKxw==" + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-svg-component/-/babel-plugin-transform-svg-component-5.4.0.tgz", + "integrity": "sha512-zLl4Fl3NvKxxjWNkqEcpdSOpQ3LGVH2BNFQ6vjaK6sFo2IrSznrhURIPI0HAphKiiIwNYjAfE0TNoQDSZv0U9A==" }, "@svgr/babel-preset": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/@svgr/babel-preset/-/babel-preset-4.3.3.tgz", - "integrity": "sha512-6PG80tdz4eAlYUN3g5GZiUjg2FMcp+Wn6rtnz5WJG9ITGEF1pmFdzq02597Hn0OmnQuCVaBYQE1OVFAnwOl+0A==", + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-preset/-/babel-preset-5.4.0.tgz", + "integrity": "sha512-Gyx7cCxua04DBtyILTYdQxeO/pwfTBev6+eXTbVbxe4HTGhOUW6yo7PSbG2p6eJMl44j6XSequ0ZDP7bl0nu9A==", "requires": { - "@svgr/babel-plugin-add-jsx-attribute": "^4.2.0", - "@svgr/babel-plugin-remove-jsx-attribute": "^4.2.0", - "@svgr/babel-plugin-remove-jsx-empty-expression": "^4.2.0", - "@svgr/babel-plugin-replace-jsx-attribute-value": "^4.2.0", - "@svgr/babel-plugin-svg-dynamic-title": "^4.3.3", - "@svgr/babel-plugin-svg-em-dimensions": "^4.2.0", - "@svgr/babel-plugin-transform-react-native-svg": "^4.2.0", - "@svgr/babel-plugin-transform-svg-component": "^4.2.0" + "@svgr/babel-plugin-add-jsx-attribute": "^5.4.0", + "@svgr/babel-plugin-remove-jsx-attribute": "^5.4.0", + "@svgr/babel-plugin-remove-jsx-empty-expression": "^5.0.1", + "@svgr/babel-plugin-replace-jsx-attribute-value": "^5.0.1", + "@svgr/babel-plugin-svg-dynamic-title": "^5.4.0", + "@svgr/babel-plugin-svg-em-dimensions": "^5.4.0", + "@svgr/babel-plugin-transform-react-native-svg": "^5.4.0", + "@svgr/babel-plugin-transform-svg-component": "^5.4.0" } }, "@svgr/core": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/@svgr/core/-/core-4.3.3.tgz", - "integrity": "sha512-qNuGF1QON1626UCaZamWt5yedpgOytvLj5BQZe2j1k1B8DUG4OyugZyfEwBeXozCUwhLEpsrgPrE+eCu4fY17w==", + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@svgr/core/-/core-5.4.0.tgz", + "integrity": "sha512-hWGm1DCCvd4IEn7VgDUHYiC597lUYhFau2lwJBYpQWDirYLkX4OsXu9IslPgJ9UpP7wsw3n2Ffv9sW7SXJVfqQ==", "requires": { - "@svgr/plugin-jsx": "^4.3.3", - "camelcase": "^5.3.1", - "cosmiconfig": "^5.2.1" + "@svgr/plugin-jsx": "^5.4.0", + "camelcase": "^6.0.0", + "cosmiconfig": "^6.0.0" + }, + "dependencies": { + "camelcase": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.1.0.tgz", + "integrity": "sha512-WCMml9ivU60+8rEJgELlFp1gxFcEGxwYleE3bziHEDeqsqAWGHdimB7beBFGjLzVNgPGyDsfgXLQEYMpmIFnVQ==" + } } }, "@svgr/hast-util-to-babel-ast": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/@svgr/hast-util-to-babel-ast/-/hast-util-to-babel-ast-4.3.2.tgz", - "integrity": "sha512-JioXclZGhFIDL3ddn4Kiq8qEqYM2PyDKV0aYno8+IXTLuYt6TOgHUbUAAFvqtb0Xn37NwP0BTHglejFoYr8RZg==", + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@svgr/hast-util-to-babel-ast/-/hast-util-to-babel-ast-5.4.0.tgz", + "integrity": "sha512-+U0TZZpPsP2V1WvVhqAOSTk+N+CjYHdZx+x9UBa1eeeZDXwH8pt0CrQf2+SvRl/h2CAPRFkm+Ey96+jKP8Bsgg==", "requires": { - "@babel/types": "^7.4.4" + "@babel/types": "^7.9.5" } }, "@svgr/plugin-jsx": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/@svgr/plugin-jsx/-/plugin-jsx-4.3.3.tgz", - "integrity": "sha512-cLOCSpNWQnDB1/v+SUENHH7a0XY09bfuMKdq9+gYvtuwzC2rU4I0wKGFEp1i24holdQdwodCtDQdFtJiTCWc+w==", + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@svgr/plugin-jsx/-/plugin-jsx-5.4.0.tgz", + "integrity": "sha512-SGzO4JZQ2HvGRKDzRga9YFSqOqaNrgLlQVaGvpZ2Iht2gwRp/tq+18Pvv9kS9ZqOMYgyix2LLxZMY1LOe9NPqw==", "requires": { - "@babel/core": "^7.4.5", - "@svgr/babel-preset": "^4.3.3", - "@svgr/hast-util-to-babel-ast": "^4.3.2", - "svg-parser": "^2.0.0" + "@babel/core": "^7.7.5", + "@svgr/babel-preset": "^5.4.0", + "@svgr/hast-util-to-babel-ast": "^5.4.0", + "svg-parser": "^2.0.2" } }, "@svgr/plugin-svgo": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/@svgr/plugin-svgo/-/plugin-svgo-4.3.1.tgz", - "integrity": "sha512-PrMtEDUWjX3Ea65JsVCwTIXuSqa3CG9px+DluF1/eo9mlDrgrtFE7NE/DjdhjJgSM9wenlVBzkzneSIUgfUI/w==", + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@svgr/plugin-svgo/-/plugin-svgo-5.4.0.tgz", + "integrity": "sha512-3Cgv3aYi1l6SHyzArV9C36yo4kgwVdF3zPQUC6/aCDUeXAofDYwE5kk3e3oT5ZO2a0N3lB+lLGvipBG6lnG8EA==", "requires": { - "cosmiconfig": "^5.2.1", + "cosmiconfig": "^6.0.0", "merge-deep": "^3.0.2", "svgo": "^1.2.2" } }, "@svgr/webpack": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/@svgr/webpack/-/webpack-4.3.3.tgz", - "integrity": "sha512-bjnWolZ6KVsHhgyCoYRFmbd26p8XVbulCzSG53BDQqAr+JOAderYK7CuYrB3bDjHJuF6LJ7Wrr42+goLRV9qIg==", + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@svgr/webpack/-/webpack-5.4.0.tgz", + "integrity": "sha512-LjepnS/BSAvelnOnnzr6Gg0GcpLmnZ9ThGFK5WJtm1xOqdBE/1IACZU7MMdVzjyUkfFqGz87eRE4hFaSLiUwYg==", "requires": { - "@babel/core": "^7.4.5", - "@babel/plugin-transform-react-constant-elements": "^7.0.0", - "@babel/preset-env": "^7.4.5", - "@babel/preset-react": "^7.0.0", - "@svgr/core": "^4.3.3", - "@svgr/plugin-jsx": "^4.3.3", - "@svgr/plugin-svgo": "^4.3.1", - "loader-utils": "^1.2.3" + "@babel/core": "^7.9.0", + "@babel/plugin-transform-react-constant-elements": "^7.9.0", + "@babel/preset-env": "^7.9.5", + "@babel/preset-react": "^7.9.4", + "@svgr/core": "^5.4.0", + "@svgr/plugin-jsx": "^5.4.0", + "@svgr/plugin-svgo": "^5.4.0", + "loader-utils": "^2.0.0" } }, + "@types/anymatch": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/@types/anymatch/-/anymatch-1.3.1.tgz", + "integrity": "sha512-/+CRPXpBDpo2RK9C68N3b2cOvO0Cf5B9aPijHsoDQTHivnGSObdOF2BRQOYjojWTDy6nQvMjmqRXIxH55VjxxA==" + }, "@types/babel__core": { - "version": "7.1.9", - "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.9.tgz", - "integrity": "sha512-sY2RsIJ5rpER1u3/aQ8OFSI7qGIy8o1NEEbgb2UaJcvOtXOMpd39ko723NBpjQFg9SIX7TXtjejZVGeIMLhoOw==", + "version": "7.1.10", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.10.tgz", + "integrity": "sha512-x8OM8XzITIMyiwl5Vmo2B1cR1S1Ipkyv4mdlbJjMa1lmuKvKY9FrBbEANIaMlnWn5Rf7uO+rC/VgYabNkE17Hw==", "requires": { "@babel/parser": "^7.1.0", "@babel/types": "^7.0.0", @@ -1609,26 +2201,26 @@ } }, "@types/babel__generator": { - "version": "7.6.1", - "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.1.tgz", - "integrity": "sha512-bBKm+2VPJcMRVwNhxKu8W+5/zT7pwNEqeokFOmbvVSqGzFneNxYcEBro9Ac7/N9tlsaPYnZLK8J1LWKkMsLAew==", + "version": "7.6.2", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.2.tgz", + "integrity": "sha512-MdSJnBjl+bdwkLskZ3NGFp9YcXGx5ggLpQQPqtgakVhsWK0hTtNYhjpZLlWQTviGTvF8at+Bvli3jV7faPdgeQ==", "requires": { "@babel/types": "^7.0.0" } }, "@types/babel__template": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.0.2.tgz", - "integrity": "sha512-/K6zCpeW7Imzgab2bLkLEbz0+1JlFSrUMdw7KoIIu+IUdu51GWaBZpd3y1VXGVXzynvGa4DaIaxNZHiON3GXUg==", + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.0.3.tgz", + "integrity": "sha512-uCoznIPDmnickEi6D0v11SBpW0OuVqHJCa7syXqQHy5uktSCreIlt0iglsCnmvz8yCb38hGcWeseA8cWJSwv5Q==", "requires": { "@babel/parser": "^7.1.0", "@babel/types": "^7.0.0" } }, "@types/babel__traverse": { - "version": "7.0.13", - "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.0.13.tgz", - "integrity": "sha512-i+zS7t6/s9cdQvbqKDARrcbrPvtJGlbYsMkazo03nTAK3RX9FNrLllXys22uiTGJapPOTZTQ35nHh4ISph4SLQ==", + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.0.15.tgz", + "integrity": "sha512-Pzh9O3sTK8V6I1olsXpCfj2k/ygO2q1X0vhhnDrEQyYLHZesWz+zMZMVcwXLCYf0U36EtmyYaFGPfXlTtDHe3A==", "requires": { "@babel/types": "^7.3.0" } @@ -1638,15 +2230,19 @@ "resolved": "https://registry.npmjs.org/@types/classnames/-/classnames-2.2.10.tgz", "integrity": "sha512-1UzDldn9GfYYEsWWnn/P4wkTlkZDH7lDb0wBMGbtIQc9zXEQq7FlKBdZUn6OBqD8sKZZ2RQO2mAjGpXiDGoRmQ==" }, - "@types/color-name": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@types/color-name/-/color-name-1.1.1.tgz", - "integrity": "sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ==" + "@types/eslint": { + "version": "7.2.4", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-7.2.4.tgz", + "integrity": "sha512-YCY4kzHMsHoyKspQH+nwSe+70Kep7Vjt2X+dZe5Vs2vkRudqtoFoUIv1RlJmZB8Hbp7McneupoZij4PadxsK5Q==", + "requires": { + "@types/estree": "*", + "@types/json-schema": "*" + } }, - "@types/eslint-visitor-keys": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@types/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz", - "integrity": "sha512-OCutwjDZ4aFS6PB1UZ988C4YgwlBHJd6wCeQqaLdmadZ/7e+w79+hbMUFC1QXDNCmdyoRfAFdm0RypzwR+Qpag==" + "@types/estree": { + "version": "0.0.45", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.45.tgz", + "integrity": "sha512-jnqIUKDUqJbDIUxm0Uj7bnlMnRm1T/eZ9N+AVMqhPgzrba2GhGG5o/jCTwmdPK709nEZsGoMzXEDUjcXHa3W0g==" }, "@types/glob": { "version": "7.1.3", @@ -1657,6 +2253,14 @@ "@types/node": "*" } }, + "@types/graceful-fs": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.4.tgz", + "integrity": "sha512-mWA/4zFQhfvOA8zWkXobwJvBD7vzcxgrOQ0J5CH1votGqdq9m7+FwtGaqyCZqC3NyyBkc9z4m+iry4LlqcMWJg==", + "requires": { + "@types/node": "*" + } + }, "@types/hoist-non-react-statics": { "version": "3.3.1", "resolved": "https://registry.npmjs.org/@types/hoist-non-react-statics/-/hoist-non-react-statics-3.3.1.tgz", @@ -1666,10 +2270,15 @@ "hoist-non-react-statics": "^3.3.0" } }, + "@types/html-minifier-terser": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/@types/html-minifier-terser/-/html-minifier-terser-5.1.1.tgz", + "integrity": "sha512-giAlZwstKbmvMk1OO7WXSj4OZ0keXAcl2TQq4LWHiiPH2ByaH7WeUzng+Qej8UPxxv+8lRTuouo0iaNDBuzIBA==" + }, "@types/invariant": { - "version": "2.2.33", - "resolved": "https://registry.npmjs.org/@types/invariant/-/invariant-2.2.33.tgz", - "integrity": "sha512-/jUNmS8d4bCKdqslfxW6dg/9Gksfzxz67IYfqApHn+HvHlMVXwYv2zpTDnS/yaK9BB0i0GlBTaYci0EFE62Hmw==" + "version": "2.2.34", + "resolved": "https://registry.npmjs.org/@types/invariant/-/invariant-2.2.34.tgz", + "integrity": "sha512-lYUtmJ9BqUN688fGY1U1HZoWT1/Jrmgigx2loq4ZcJpICECm/Om3V314BxdzypO0u5PORKGMM6x0OXaljV1YFg==" }, "@types/istanbul-lib-coverage": { "version": "2.0.3", @@ -1685,18 +2294,22 @@ } }, "@types/istanbul-reports": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-1.1.2.tgz", - "integrity": "sha512-P/W9yOX/3oPZSpaYOCQzGqgCQRXn0FFO/V8bWrCQs+wLmvVVxk6CRBXALEvNs9OHIatlnlFokfhuDo2ug01ciw==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.0.tgz", + "integrity": "sha512-nwKNbvnwJ2/mndE9ItP/zc2TCzw6uuodnF4EHYWD+gCQDVBuRQL5UzbZD0/ezy1iKsFU2ZQiDqg4M9dN4+wZgA==", "requires": { - "@types/istanbul-lib-coverage": "*", "@types/istanbul-lib-report": "*" } }, "@types/json-schema": { - "version": "7.0.5", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.5.tgz", - "integrity": "sha512-7+2BITlgjgDhH0vvwZU/HZJVyk+2XUlvxXe8dFMedNX/aMkaOq++rMAFXc0tM7ij15QaWlbdQASBR9dihi+bDQ==" + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.6.tgz", + "integrity": "sha512-3c+yGKvVP5Y9TYBEibGNR+kLtijnj7mYrXRg+WpFb2X9xm04g/DXYkfg4hmzJQosc9snFNUPkbYIhu+KAm6jJw==" + }, + "@types/json5": { + "version": "0.0.29", + "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", + "integrity": "sha1-7ihweulOEdK4J7y+UnC86n8+ce4=" }, "@types/minimatch": { "version": "3.0.3", @@ -1704,15 +2317,25 @@ "integrity": "sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA==" }, "@types/node": { - "version": "14.6.0", - "resolved": "https://registry.npmjs.org/@types/node/-/node-14.6.0.tgz", - "integrity": "sha512-mikldZQitV94akrc4sCcSjtJfsTKt4p+e/s0AGscVA6XArQ9kFclP+ZiYUMnq987rc6QlYxXv/EivqlfSLxpKA==" + "version": "14.14.3", + "resolved": "https://registry.npmjs.org/@types/node/-/node-14.14.3.tgz", + "integrity": "sha512-33/L34xS7HVUx23e0wOT2V1qPF1IrHgQccdJVm9uXGTB9vFBrrzBtkQymT8VskeKOxjz55MSqMv0xuLq+u98WQ==" + }, + "@types/normalize-package-data": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.0.tgz", + "integrity": "sha512-f5j5b/Gf71L+dbqxIpQ4Z2WlmI/mPJ0fOkGGmFgtb6sAu97EPczzbS3/tJKxmcYDj55OX6ssqwDAWOHIYDRDGA==" }, "@types/parse-json": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz", "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==" }, + "@types/prettier": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.1.5.tgz", + "integrity": "sha512-UEyp8LwZ4Dg30kVU2Q3amHHyTn1jEdhCIE59ANed76GaT1Vp76DD3ZWSAxgCrw6wJ0TqeoBpqmfUHiUDPs//HQ==" + }, "@types/prop-types": { "version": "15.7.3", "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.3.tgz", @@ -1740,20 +2363,76 @@ "@types/react": "*" } }, + "@types/resolve": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-0.0.8.tgz", + "integrity": "sha512-auApPaJf3NPfe18hSoJkp8EbZzer2ISk7o8mCC3M9he/a04+gbMF97NkpD2S8riMGvm4BMRI59/SZQSaLTKpsQ==", + "requires": { + "@types/node": "*" + } + }, + "@types/source-list-map": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/@types/source-list-map/-/source-list-map-0.1.2.tgz", + "integrity": "sha512-K5K+yml8LTo9bWJI/rECfIPrGgxdpeNbj+d53lwN4QjW1MCwlkhUms+gtdzigTeUyBr09+u8BwOIY3MXvHdcsA==" + }, "@types/stack-utils": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-1.0.1.tgz", - "integrity": "sha512-l42BggppR6zLmpfU6fq9HEa2oGPEI8yrSPL3GITjfRInppYFahObbIQOQK3UGxEnyQpltZLaPe75046NOZQikw==" + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.0.tgz", + "integrity": "sha512-RJJrrySY7A8havqpGObOB4W92QXKJo63/jFLLgpvOtsGUqbQZ9Sbgl35KMm1DjC6j7AvmmU2bIno+3IyEaemaw==" + }, + "@types/tapable": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/@types/tapable/-/tapable-1.0.6.tgz", + "integrity": "sha512-W+bw9ds02rAQaMvaLYxAbJ6cvguW/iJXNT6lTssS1ps6QdrMKttqEAMEG/b5CR8TZl3/L7/lH0ZV5nNR1LXikA==" + }, + "@types/uglify-js": { + "version": "3.11.0", + "resolved": "https://registry.npmjs.org/@types/uglify-js/-/uglify-js-3.11.0.tgz", + "integrity": "sha512-I0Yd8TUELTbgRHq2K65j8rnDPAzAP+DiaF/syLem7yXwYLsHZhPd+AM2iXsWmf9P2F2NlFCgl5erZPQx9IbM9Q==", + "requires": { + "source-map": "^0.6.1" + } }, "@types/warning": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/@types/warning/-/warning-3.0.0.tgz", "integrity": "sha1-DSUBJorY+ZYrdA04fEZU9fjiPlI=" }, + "@types/webpack": { + "version": "4.41.23", + "resolved": "https://registry.npmjs.org/@types/webpack/-/webpack-4.41.23.tgz", + "integrity": "sha512-ojA4CupZg8RCzVJLugWlvqrHpT59GWhqFxbinlsnvk10MjQCWB+ot7XDACctbWhnhtdhYK7+HOH1JxkVLiZhMg==", + "requires": { + "@types/anymatch": "*", + "@types/node": "*", + "@types/tapable": "*", + "@types/uglify-js": "*", + "@types/webpack-sources": "*", + "source-map": "^0.6.0" + } + }, + "@types/webpack-sources": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@types/webpack-sources/-/webpack-sources-2.0.0.tgz", + "integrity": "sha512-a5kPx98CNFRKQ+wqawroFunvFqv7GHm/3KOI52NY9xWADgc8smu4R6prt4EU/M4QfVjvgBkMqU4fBhw3QfMVkg==", + "requires": { + "@types/node": "*", + "@types/source-list-map": "*", + "source-map": "^0.7.3" + }, + "dependencies": { + "source-map": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", + "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==" + } + } + }, "@types/yargs": { - "version": "13.0.10", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-13.0.10.tgz", - "integrity": "sha512-MU10TSgzNABgdzKvQVW1nuuT+sgBMWeXNc3XOs5YXV5SDAK+PPja2eUuBNB9iqElu03xyEDqlnGw0jgl4nbqGQ==", + "version": "15.0.9", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.9.tgz", + "integrity": "sha512-HmU8SeIRhZCWcnRskCs36Q1Q00KBV6Cqh/ora8WN1+22dY07AZdn6Gel8QZ3t26XYPImtcL8WV/eqjhVmMEw4g==", "requires": { "@types/yargs-parser": "*" } @@ -1764,214 +2443,235 @@ "integrity": "sha512-FA/BWv8t8ZWJ+gEOnLLd8ygxH/2UFbAvgEonyfN6yWGLKc7zVjbpl2Y4CTjid9h2RfgPP6SEt6uHwEOply00yw==" }, "@typescript-eslint/eslint-plugin": { - "version": "2.34.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-2.34.0.tgz", - "integrity": "sha512-4zY3Z88rEE99+CNvTbXSyovv2z9PNOVffTWD2W8QF5s2prBQtwN2zadqERcrHpcR7O/+KMI3fcTAmUUhK/iQcQ==", + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-4.5.0.tgz", + "integrity": "sha512-mjb/gwNcmDKNt+6mb7Aj/TjKzIJjOPcoCJpjBQC9ZnTRnBt1p4q5dJSSmIqAtsZ/Pff5N+hJlbiPc5bl6QN4OQ==", "requires": { - "@typescript-eslint/experimental-utils": "2.34.0", + "@typescript-eslint/experimental-utils": "4.5.0", + "@typescript-eslint/scope-manager": "4.5.0", + "debug": "^4.1.1", "functional-red-black-tree": "^1.0.1", "regexpp": "^3.0.0", + "semver": "^7.3.2", "tsutils": "^3.17.1" } }, "@typescript-eslint/experimental-utils": { - "version": "2.34.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-2.34.0.tgz", - "integrity": "sha512-eS6FTkq+wuMJ+sgtuNTtcqavWXqsflWcfBnlYhg/nS4aZ1leewkXGbvBhaapn1q6qf4M71bsR1tez5JTRMuqwA==", + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-4.5.0.tgz", + "integrity": "sha512-bW9IpSAKYvkqDGRZzayBXIgPsj2xmmVHLJ+flGSoN0fF98pGoKFhbunIol0VF2Crka7z984EEhFi623Rl7e6gg==", "requires": { "@types/json-schema": "^7.0.3", - "@typescript-eslint/typescript-estree": "2.34.0", + "@typescript-eslint/scope-manager": "4.5.0", + "@typescript-eslint/types": "4.5.0", + "@typescript-eslint/typescript-estree": "4.5.0", "eslint-scope": "^5.0.0", "eslint-utils": "^2.0.0" } }, "@typescript-eslint/parser": { - "version": "2.34.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-2.34.0.tgz", - "integrity": "sha512-03ilO0ucSD0EPTw2X4PntSIRFtDPWjrVq7C3/Z3VQHRC7+13YB55rcJI3Jt+YgeHbjUdJPcPa7b23rXCBokuyA==", + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-4.5.0.tgz", + "integrity": "sha512-xb+gmyhQcnDWe+5+xxaQk5iCw6KqXd8VQxGiTeELTMoYeRjpocZYYRP1gFVM2C8Yl0SpUvLa1lhprwqZ00w3Iw==", "requires": { - "@types/eslint-visitor-keys": "^1.0.0", - "@typescript-eslint/experimental-utils": "2.34.0", - "@typescript-eslint/typescript-estree": "2.34.0", - "eslint-visitor-keys": "^1.1.0" + "@typescript-eslint/scope-manager": "4.5.0", + "@typescript-eslint/types": "4.5.0", + "@typescript-eslint/typescript-estree": "4.5.0", + "debug": "^4.1.1" } }, - "@typescript-eslint/typescript-estree": { - "version": "2.34.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-2.34.0.tgz", - "integrity": "sha512-OMAr+nJWKdlVM9LOqCqh3pQQPwxHAN7Du8DR6dmwCrAmxtiXQnhHJ6tBNtf+cggqfo51SG/FCwnKhXCIM7hnVg==", + "@typescript-eslint/scope-manager": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-4.5.0.tgz", + "integrity": "sha512-C0cEO0cTMPJ/w4RA/KVe4LFFkkSh9VHoFzKmyaaDWAnPYIEzVCtJ+Un8GZoJhcvq+mPFXEsXa01lcZDHDG6Www==", "requires": { + "@typescript-eslint/types": "4.5.0", + "@typescript-eslint/visitor-keys": "4.5.0" + } + }, + "@typescript-eslint/types": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-4.5.0.tgz", + "integrity": "sha512-n2uQoXnyWNk0Les9MtF0gCK3JiWd987JQi97dMSxBOzVoLZXCNtxFckVqt1h8xuI1ix01t+iMY4h4rFMj/303g==" + }, + "@typescript-eslint/typescript-estree": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-4.5.0.tgz", + "integrity": "sha512-gN1mffq3zwRAjlYWzb5DanarOPdajQwx5MEWkWCk0XvqC8JpafDTeioDoow2L4CA/RkYZu7xEsGZRhqrTsAG8w==", + "requires": { + "@typescript-eslint/types": "4.5.0", + "@typescript-eslint/visitor-keys": "4.5.0", "debug": "^4.1.1", - "eslint-visitor-keys": "^1.1.0", - "glob": "^7.1.6", + "globby": "^11.0.1", "is-glob": "^4.0.1", "lodash": "^4.17.15", "semver": "^7.3.2", "tsutils": "^3.17.1" - }, - "dependencies": { - "semver": { - "version": "7.3.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz", - "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==" - } + } + }, + "@typescript-eslint/visitor-keys": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-4.5.0.tgz", + "integrity": "sha512-UHq4FSa55NDZqscRU//O5ROFhHa9Hqn9KWTEvJGTArtTQp5GKv9Zqf6d/Q3YXXcFv4woyBml7fJQlQ+OuqRcHA==", + "requires": { + "@typescript-eslint/types": "4.5.0", + "eslint-visitor-keys": "^2.0.0" } }, "@webassemblyjs/ast": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.8.5.tgz", - "integrity": "sha512-aJMfngIZ65+t71C3y2nBBg5FFG0Okt9m0XEgWZ7Ywgn1oMAT8cNwx00Uv1cQyHtidq0Xn94R4TAywO+LCQ+ZAQ==", + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.9.0.tgz", + "integrity": "sha512-C6wW5L+b7ogSDVqymbkkvuW9kruN//YisMED04xzeBBqjHa2FYnmvOlS6Xj68xWQRgWvI9cIglsjFowH/RJyEA==", "requires": { - "@webassemblyjs/helper-module-context": "1.8.5", - "@webassemblyjs/helper-wasm-bytecode": "1.8.5", - "@webassemblyjs/wast-parser": "1.8.5" + "@webassemblyjs/helper-module-context": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/wast-parser": "1.9.0" } }, "@webassemblyjs/floating-point-hex-parser": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.8.5.tgz", - "integrity": "sha512-9p+79WHru1oqBh9ewP9zW95E3XAo+90oth7S5Re3eQnECGq59ly1Ri5tsIipKGpiStHsUYmY3zMLqtk3gTcOtQ==" + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.9.0.tgz", + "integrity": "sha512-TG5qcFsS8QB4g4MhrxK5TqfdNe7Ey/7YL/xN+36rRjl/BlGE/NcBvJcqsRgCP6Z92mRE+7N50pRIi8SmKUbcQA==" }, "@webassemblyjs/helper-api-error": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.8.5.tgz", - "integrity": "sha512-Za/tnzsvnqdaSPOUXHyKJ2XI7PDX64kWtURyGiJJZKVEdFOsdKUCPTNEVFZq3zJ2R0G5wc2PZ5gvdTRFgm81zA==" + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.9.0.tgz", + "integrity": "sha512-NcMLjoFMXpsASZFxJ5h2HZRcEhDkvnNFOAKneP5RbKRzaWJN36NC4jqQHKwStIhGXu5mUWlUUk7ygdtrO8lbmw==" }, "@webassemblyjs/helper-buffer": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.8.5.tgz", - "integrity": "sha512-Ri2R8nOS0U6G49Q86goFIPNgjyl6+oE1abW1pS84BuhP1Qcr5JqMwRFT3Ah3ADDDYGEgGs1iyb1DGX+kAi/c/Q==" + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.9.0.tgz", + "integrity": "sha512-qZol43oqhq6yBPx7YM3m9Bv7WMV9Eevj6kMi6InKOuZxhw+q9hOkvq5e/PpKSiLfyetpaBnogSbNCfBwyB00CA==" }, "@webassemblyjs/helper-code-frame": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.8.5.tgz", - "integrity": "sha512-VQAadSubZIhNpH46IR3yWO4kZZjMxN1opDrzePLdVKAZ+DFjkGD/rf4v1jap744uPVU6yjL/smZbRIIJTOUnKQ==", + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.9.0.tgz", + "integrity": "sha512-ERCYdJBkD9Vu4vtjUYe8LZruWuNIToYq/ME22igL+2vj2dQ2OOujIZr3MEFvfEaqKoVqpsFKAGsRdBSBjrIvZA==", "requires": { - "@webassemblyjs/wast-printer": "1.8.5" + "@webassemblyjs/wast-printer": "1.9.0" } }, "@webassemblyjs/helper-fsm": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-fsm/-/helper-fsm-1.8.5.tgz", - "integrity": "sha512-kRuX/saORcg8se/ft6Q2UbRpZwP4y7YrWsLXPbbmtepKr22i8Z4O3V5QE9DbZK908dh5Xya4Un57SDIKwB9eow==" + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-fsm/-/helper-fsm-1.9.0.tgz", + "integrity": "sha512-OPRowhGbshCb5PxJ8LocpdX9Kl0uB4XsAjl6jH/dWKlk/mzsANvhwbiULsaiqT5GZGT9qinTICdj6PLuM5gslw==" }, "@webassemblyjs/helper-module-context": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-module-context/-/helper-module-context-1.8.5.tgz", - "integrity": "sha512-/O1B236mN7UNEU4t9X7Pj38i4VoU8CcMHyy3l2cV/kIF4U5KoHXDVqcDuOs1ltkac90IM4vZdHc52t1x8Yfs3g==", + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-module-context/-/helper-module-context-1.9.0.tgz", + "integrity": "sha512-MJCW8iGC08tMk2enck1aPW+BE5Cw8/7ph/VGZxwyvGbJwjktKkDK7vy7gAmMDx88D7mhDTCNKAW5tED+gZ0W8g==", "requires": { - "@webassemblyjs/ast": "1.8.5", - "mamacro": "^0.0.3" + "@webassemblyjs/ast": "1.9.0" } }, "@webassemblyjs/helper-wasm-bytecode": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.8.5.tgz", - "integrity": "sha512-Cu4YMYG3Ddl72CbmpjU/wbP6SACcOPVbHN1dI4VJNJVgFwaKf1ppeFJrwydOG3NDHxVGuCfPlLZNyEdIYlQ6QQ==" + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.9.0.tgz", + "integrity": "sha512-R7FStIzyNcd7xKxCZH5lE0Bqy+hGTwS3LJjuv1ZVxd9O7eHCedSdrId/hMOd20I+v8wDXEn+bjfKDLzTepoaUw==" }, "@webassemblyjs/helper-wasm-section": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.8.5.tgz", - "integrity": "sha512-VV083zwR+VTrIWWtgIUpqfvVdK4ff38loRmrdDBgBT8ADXYsEZ5mPQ4Nde90N3UYatHdYoDIFb7oHzMncI02tA==", + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.9.0.tgz", + "integrity": "sha512-XnMB8l3ek4tvrKUUku+IVaXNHz2YsJyOOmz+MMkZvh8h1uSJpSen6vYnw3IoQ7WwEuAhL8Efjms1ZWjqh2agvw==", "requires": { - "@webassemblyjs/ast": "1.8.5", - "@webassemblyjs/helper-buffer": "1.8.5", - "@webassemblyjs/helper-wasm-bytecode": "1.8.5", - "@webassemblyjs/wasm-gen": "1.8.5" + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-buffer": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/wasm-gen": "1.9.0" } }, "@webassemblyjs/ieee754": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.8.5.tgz", - "integrity": "sha512-aaCvQYrvKbY/n6wKHb/ylAJr27GglahUO89CcGXMItrOBqRarUMxWLJgxm9PJNuKULwN5n1csT9bYoMeZOGF3g==", + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.9.0.tgz", + "integrity": "sha512-dcX8JuYU/gvymzIHc9DgxTzUUTLexWwt8uCTWP3otys596io0L5aW02Gb1RjYpx2+0Jus1h4ZFqjla7umFniTg==", "requires": { "@xtuc/ieee754": "^1.2.0" } }, "@webassemblyjs/leb128": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.8.5.tgz", - "integrity": "sha512-plYUuUwleLIziknvlP8VpTgO4kqNaH57Y3JnNa6DLpu/sGcP6hbVdfdX5aHAV716pQBKrfuU26BJK29qY37J7A==", + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.9.0.tgz", + "integrity": "sha512-ENVzM5VwV1ojs9jam6vPys97B/S65YQtv/aanqnU7D8aSoHFX8GyhGg0CMfyKNIHBuAVjy3tlzd5QMMINa7wpw==", "requires": { "@xtuc/long": "4.2.2" } }, "@webassemblyjs/utf8": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.8.5.tgz", - "integrity": "sha512-U7zgftmQriw37tfD934UNInokz6yTmn29inT2cAetAsaU9YeVCveWEwhKL1Mg4yS7q//NGdzy79nlXh3bT8Kjw==" + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.9.0.tgz", + "integrity": "sha512-GZbQlWtopBTP0u7cHrEx+73yZKrQoBMpwkGEIqlacljhXCkVM1kMQge/Mf+csMJAjEdSwhOyLAS0AoR3AG5P8w==" }, "@webassemblyjs/wasm-edit": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.8.5.tgz", - "integrity": "sha512-A41EMy8MWw5yvqj7MQzkDjU29K7UJq1VrX2vWLzfpRHt3ISftOXqrtojn7nlPsZ9Ijhp5NwuODuycSvfAO/26Q==", + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.9.0.tgz", + "integrity": "sha512-FgHzBm80uwz5M8WKnMTn6j/sVbqilPdQXTWraSjBwFXSYGirpkSWE2R9Qvz9tNiTKQvoKILpCuTjBKzOIm0nxw==", "requires": { - "@webassemblyjs/ast": "1.8.5", - "@webassemblyjs/helper-buffer": "1.8.5", - "@webassemblyjs/helper-wasm-bytecode": "1.8.5", - "@webassemblyjs/helper-wasm-section": "1.8.5", - "@webassemblyjs/wasm-gen": "1.8.5", - "@webassemblyjs/wasm-opt": "1.8.5", - "@webassemblyjs/wasm-parser": "1.8.5", - "@webassemblyjs/wast-printer": "1.8.5" + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-buffer": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/helper-wasm-section": "1.9.0", + "@webassemblyjs/wasm-gen": "1.9.0", + "@webassemblyjs/wasm-opt": "1.9.0", + "@webassemblyjs/wasm-parser": "1.9.0", + "@webassemblyjs/wast-printer": "1.9.0" } }, "@webassemblyjs/wasm-gen": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.8.5.tgz", - "integrity": "sha512-BCZBT0LURC0CXDzj5FXSc2FPTsxwp3nWcqXQdOZE4U7h7i8FqtFK5Egia6f9raQLpEKT1VL7zr4r3+QX6zArWg==", + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.9.0.tgz", + "integrity": "sha512-cPE3o44YzOOHvlsb4+E9qSqjc9Qf9Na1OO/BHFy4OI91XDE14MjFN4lTMezzaIWdPqHnsTodGGNP+iRSYfGkjA==", "requires": { - "@webassemblyjs/ast": "1.8.5", - "@webassemblyjs/helper-wasm-bytecode": "1.8.5", - "@webassemblyjs/ieee754": "1.8.5", - "@webassemblyjs/leb128": "1.8.5", - "@webassemblyjs/utf8": "1.8.5" + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/ieee754": "1.9.0", + "@webassemblyjs/leb128": "1.9.0", + "@webassemblyjs/utf8": "1.9.0" } }, "@webassemblyjs/wasm-opt": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.8.5.tgz", - "integrity": "sha512-HKo2mO/Uh9A6ojzu7cjslGaHaUU14LdLbGEKqTR7PBKwT6LdPtLLh9fPY33rmr5wcOMrsWDbbdCHq4hQUdd37Q==", + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.9.0.tgz", + "integrity": "sha512-Qkjgm6Anhm+OMbIL0iokO7meajkzQD71ioelnfPEj6r4eOFuqm4YC3VBPqXjFyyNwowzbMD+hizmprP/Fwkl2A==", "requires": { - "@webassemblyjs/ast": "1.8.5", - "@webassemblyjs/helper-buffer": "1.8.5", - "@webassemblyjs/wasm-gen": "1.8.5", - "@webassemblyjs/wasm-parser": "1.8.5" + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-buffer": "1.9.0", + "@webassemblyjs/wasm-gen": "1.9.0", + "@webassemblyjs/wasm-parser": "1.9.0" } }, "@webassemblyjs/wasm-parser": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.8.5.tgz", - "integrity": "sha512-pi0SYE9T6tfcMkthwcgCpL0cM9nRYr6/6fjgDtL6q/ZqKHdMWvxitRi5JcZ7RI4SNJJYnYNaWy5UUrHQy998lw==", + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.9.0.tgz", + "integrity": "sha512-9+wkMowR2AmdSWQzsPEjFU7njh8HTO5MqO8vjwEHuM+AMHioNqSBONRdr0NQQ3dVQrzp0s8lTcYqzUdb7YgELA==", "requires": { - "@webassemblyjs/ast": "1.8.5", - "@webassemblyjs/helper-api-error": "1.8.5", - "@webassemblyjs/helper-wasm-bytecode": "1.8.5", - "@webassemblyjs/ieee754": "1.8.5", - "@webassemblyjs/leb128": "1.8.5", - "@webassemblyjs/utf8": "1.8.5" + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-api-error": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/ieee754": "1.9.0", + "@webassemblyjs/leb128": "1.9.0", + "@webassemblyjs/utf8": "1.9.0" } }, "@webassemblyjs/wast-parser": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-parser/-/wast-parser-1.8.5.tgz", - "integrity": "sha512-daXC1FyKWHF1i11obK086QRlsMsY4+tIOKgBqI1lxAnkp9xe9YMcgOxm9kLe+ttjs5aWV2KKE1TWJCN57/Btsg==", + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-parser/-/wast-parser-1.9.0.tgz", + "integrity": "sha512-qsqSAP3QQ3LyZjNC/0jBJ/ToSxfYJ8kYyuiGvtn/8MK89VrNEfwj7BPQzJVHi0jGTRK2dGdJ5PRqhtjzoww+bw==", "requires": { - "@webassemblyjs/ast": "1.8.5", - "@webassemblyjs/floating-point-hex-parser": "1.8.5", - "@webassemblyjs/helper-api-error": "1.8.5", - "@webassemblyjs/helper-code-frame": "1.8.5", - "@webassemblyjs/helper-fsm": "1.8.5", + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/floating-point-hex-parser": "1.9.0", + "@webassemblyjs/helper-api-error": "1.9.0", + "@webassemblyjs/helper-code-frame": "1.9.0", + "@webassemblyjs/helper-fsm": "1.9.0", "@xtuc/long": "4.2.2" } }, "@webassemblyjs/wast-printer": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.8.5.tgz", - "integrity": "sha512-w0U0pD4EhlnvRyeJzBqaVSJAo9w/ce7/WPogeXLzGkO6hzhr4GnQIZ4W4uUt5b9ooAaXPtnXlj0gzsXEOUNYMg==", + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.9.0.tgz", + "integrity": "sha512-2J0nE95rHXHyQ24cWjMKJ1tqB/ds8z/cyeOZxJhcb+rW+SQASVjuznUSmdz5GpVJTzU8JkhYut0D3siFDD6wsA==", "requires": { - "@webassemblyjs/ast": "1.8.5", - "@webassemblyjs/wast-parser": "1.8.5", + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/wast-parser": "1.9.0", "@xtuc/long": "4.2.2" } }, @@ -1986,9 +2686,9 @@ "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==" }, "abab": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.4.tgz", - "integrity": "sha512-Eu9ELJWCz/c1e9gTiCY+FceWxcqzjYEbqMgtndnuSqZSUCOL73TWNK2mHfIj4Cw2E/ongOp+JISVNCmovt2KYQ==" + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.5.tgz", + "integrity": "sha512-9IK9EadsbHo6jLWIpxpR6pL0sazTXV6+SQv25ZB+F7Bj9mJNaOc4nCRabwd5M/JwmUa8idz6Eci6eKfJryPs6Q==" }, "abbrev": { "version": "1.1.1", @@ -2005,35 +2705,28 @@ } }, "acorn": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.0.tgz", - "integrity": "sha512-+G7P8jJmCHr+S+cLfQxygbWhXy+8YTVGzAkpEbcLo2mLoL7tij/VG41QSHACSf5QgYRhMZYHuNc6drJaO0Da+w==" + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==" }, "acorn-globals": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-4.3.4.tgz", - "integrity": "sha512-clfQEh21R+D0leSbUdWf3OcfqyaCSAQ8Ryq00bofSekfr9W8u1jyYZo6ir0xu9Gtcf7BjcHJpnbZH7JOCpP60A==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-6.0.0.tgz", + "integrity": "sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg==", "requires": { - "acorn": "^6.0.1", - "acorn-walk": "^6.0.1" - }, - "dependencies": { - "acorn": { - "version": "6.4.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.1.tgz", - "integrity": "sha512-ZVA9k326Nwrj3Cj9jlh3wGFutC2ZornPNARZwsNYqQYgN0EsV2d53w5RN/co65Ohn4sUAUtb1rSUAOD6XN9idA==" - } + "acorn": "^7.1.1", + "acorn-walk": "^7.1.1" } }, "acorn-jsx": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.2.0.tgz", - "integrity": "sha512-HiUX/+K2YpkpJ+SzBffkM/AQ2YE03S0U1kjTLVpoJdhZMOWy8qvXVN9JdLqv2QsaQ6MPYQIuNmwD8zOiYUofLQ==" + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.1.tgz", + "integrity": "sha512-K0Ptm/47OKfQRpNQ2J/oIN/3QYiK6FwW+eJbILhsdxh2WTLdl+30o8aGdTbm5JbffpFFAg/g+zi1E+jvJha5ng==" }, "acorn-walk": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-6.2.0.tgz", - "integrity": "sha512-7evsyfH1cLOCdAzZAd43Cic04yKydNx0cF+7tiA19p1XnLLPU4dpCQOqpjqwokFe//vS0QqfqqjCS2JkiIs0cA==" + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz", + "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==" }, "add-event-listener": { "version": "0.0.1", @@ -2046,45 +2739,12 @@ "integrity": "sha512-aT6camzM4xEA54YVJYSqxz1kv4IHnQZRtThJJHhUMRExaU5spC7jX5ugSwTaTgJliIgs4VhZOk7htClvQ/LmRA==" }, "adjust-sourcemap-loader": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/adjust-sourcemap-loader/-/adjust-sourcemap-loader-2.0.0.tgz", - "integrity": "sha512-4hFsTsn58+YjrU9qKzML2JSSDqKvN8mUGQ0nNIrfPi8hmIONT4L3uUaT6MKdMsZ9AjsU6D2xDkZxCkbQPxChrA==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/adjust-sourcemap-loader/-/adjust-sourcemap-loader-3.0.0.tgz", + "integrity": "sha512-YBrGyT2/uVQ/c6Rr+t6ZJXniY03YtHGMJQYal368burRGYKqhx9qGTWqcBU5s1CwYY9E/ri63RYyG1IacMZtqw==", "requires": { - "assert": "1.4.1", - "camelcase": "5.0.0", - "loader-utils": "1.2.3", - "object-path": "0.11.4", - "regex-parser": "2.2.10" - }, - "dependencies": { - "camelcase": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.0.0.tgz", - "integrity": "sha512-faqwZqnWxbxn+F1d399ygeamQNy3lPp/H9H6rNrqYh4FSVCtcY+3cub1MxA8o9mDd55mM8Aghuu/kuyYA6VTsA==" - }, - "emojis-list": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz", - "integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k=" - }, - "json5": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", - "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", - "requires": { - "minimist": "^1.2.0" - } - }, - "loader-utils": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.2.3.tgz", - "integrity": "sha512-fkpz8ejdnEMG3s37wGL07iSBDg99O9D5yflE9RGNH3hRdx9SOwYfnGYdZOUIZitN8E+E2vkq3MUMYMvPYl5ZZA==", - "requires": { - "big.js": "^5.2.2", - "emojis-list": "^2.0.0", - "json5": "^1.0.1" - } - } + "loader-utils": "^2.0.0", + "regex-parser": "^2.2.11" } }, "aggregate-error": { @@ -2128,9 +2788,9 @@ "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=" }, "ansi-colors": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.4.tgz", - "integrity": "sha512-hHUXGagefjN2iRrID63xckIvotOXOojhQKWIPUZ4mNUZ9nLZW+7FMNoE1lOkEhNWYsx/7ysGIuJYCiMAA9FnrA==" + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", + "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==" }, "ansi-escapes": { "version": "4.3.1", @@ -2166,12 +2826,12 @@ } }, "anymatch": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", - "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz", + "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==", "requires": { - "micromatch": "^3.1.4", - "normalize-path": "^2.1.1" + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" } }, "aproba": { @@ -2197,12 +2857,27 @@ } }, "aria-query": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-3.0.0.tgz", - "integrity": "sha1-ZbP8wcoRVajJrmTW7uKX8V1RM8w=", + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-4.2.2.tgz", + "integrity": "sha512-o/HelwhuKpTj/frsOsbNLNgnNGVIFsVP/SW2BSF14gVl7kAfMOJ6/8wUAUvG1R1NHKrfG+2sHZTu0yauT1qBrA==", "requires": { - "ast-types-flow": "0.0.7", - "commander": "^2.11.0" + "@babel/runtime": "^7.10.2", + "@babel/runtime-corejs3": "^7.10.2" + }, + "dependencies": { + "@babel/runtime": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.12.1.tgz", + "integrity": "sha512-J5AIf3vPj3UwXaAzb5j1xM4WAQDX3EMgemF8rjCP3SoW09LfRKAXQKt6CoVYl230P6iWdRcBbnLDDdnqWxZSCA==", + "requires": { + "regenerator-runtime": "^0.13.4" + } + }, + "regenerator-runtime": { + "version": "0.13.7", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz", + "integrity": "sha512-a54FxoJDIr27pgf7IgeQGxmqUNYrcV338lf/6gH456HZ/PhX+5BcwHXG9ajESmwe6WRO0tAzRUrRmNONWgkrew==" + } } }, "arity-n": { @@ -2225,11 +2900,6 @@ "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=" }, - "array-equal": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/array-equal/-/array-equal-1.0.0.tgz", - "integrity": "sha1-jCpe8kcv2ep0KwTHenUJO6J1fJM=" - }, "array-find-index": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz", @@ -2248,15 +2918,32 @@ "define-properties": "^1.1.3", "es-abstract": "^1.17.0", "is-string": "^1.0.5" + }, + "dependencies": { + "es-abstract": { + "version": "1.17.7", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.7.tgz", + "integrity": "sha512-VBl/gnfcJ7OercKA9MVaegWsBHFjV492syMudcnQZvt/Dw8ezpcOHYZXa/J96O8vx+g4x65YKhxOwDUh63aS5g==", + "requires": { + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1", + "is-callable": "^1.2.2", + "is-regex": "^1.1.1", + "object-inspect": "^1.8.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.1", + "string.prototype.trimend": "^1.0.1", + "string.prototype.trimstart": "^1.0.1" + } + } } }, "array-union": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", - "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", - "requires": { - "array-uniq": "^1.0.1" - } + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==" }, "array-uniq": { "version": "1.0.3", @@ -2275,12 +2962,62 @@ "requires": { "define-properties": "^1.1.3", "es-abstract": "^1.17.0-next.1" + }, + "dependencies": { + "es-abstract": { + "version": "1.17.7", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.7.tgz", + "integrity": "sha512-VBl/gnfcJ7OercKA9MVaegWsBHFjV492syMudcnQZvt/Dw8ezpcOHYZXa/J96O8vx+g4x65YKhxOwDUh63aS5g==", + "requires": { + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1", + "is-callable": "^1.2.2", + "is-regex": "^1.1.1", + "object-inspect": "^1.8.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.1", + "string.prototype.trimend": "^1.0.1", + "string.prototype.trimstart": "^1.0.1" + } + } + } + }, + "array.prototype.flatmap": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.2.3.tgz", + "integrity": "sha512-OOEk+lkePcg+ODXIpvuU9PAryCikCJyo7GlDG1upleEpQRx6mzL9puEBkozQ5iAx20KV0l3DbyQwqciJtqe5Pg==", + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.0-next.1", + "function-bind": "^1.1.1" + }, + "dependencies": { + "es-abstract": { + "version": "1.17.7", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.7.tgz", + "integrity": "sha512-VBl/gnfcJ7OercKA9MVaegWsBHFjV492syMudcnQZvt/Dw8ezpcOHYZXa/J96O8vx+g4x65YKhxOwDUh63aS5g==", + "requires": { + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1", + "is-callable": "^1.2.2", + "is-regex": "^1.1.1", + "object-inspect": "^1.8.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.1", + "string.prototype.trimend": "^1.0.1", + "string.prototype.trimstart": "^1.0.1" + } + } } }, "arrify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", - "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=" + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-2.0.1.tgz", + "integrity": "sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==" }, "asap": { "version": "2.0.6", @@ -2314,11 +3051,27 @@ } }, "assert": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/assert/-/assert-1.4.1.tgz", - "integrity": "sha1-mZEtWRg2tab1s0XA8H7vwI/GXZE=", + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/assert/-/assert-1.5.0.tgz", + "integrity": "sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA==", "requires": { + "object-assign": "^4.1.1", "util": "0.10.3" + }, + "dependencies": { + "inherits": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", + "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=" + }, + "util": { + "version": "0.10.3", + "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", + "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=", + "requires": { + "inherits": "2.0.1" + } + } } }, "assert-plus": { @@ -2375,6 +3128,11 @@ "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" }, + "at-least-node": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", + "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==" + }, "atob": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", @@ -2404,63 +3162,16 @@ "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.9.0.tgz", "integrity": "sha512-Uvq6hVe90D0B2WEnUqtdgY1bATGz3mw33nH9Y+dmA+w5DHvUmBgkr5rM/KCHpCsiFNRUfokW/szpPPgMK2hm4A==" }, + "axe-core": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.0.2.tgz", + "integrity": "sha512-arU1h31OGFu+LPrOLGZ7nB45v940NMDMEJeNmbutu57P+UFDVnkZg3e+J1I2HJRZ9hT7gO8J91dn/PMrAiKakA==" + }, "axobject-query": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-2.2.0.tgz", "integrity": "sha512-Td525n+iPOOyUQIeBfcASuG6uJsDOITl7Mds5gFyerkWiX7qhUTdYUBlSgNMyVqtSJqwpt1kXGLdUt6SykLMRA==" }, - "babel-code-frame": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz", - "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=", - "requires": { - "chalk": "^1.1.3", - "esutils": "^2.0.2", - "js-tokens": "^3.0.2" - }, - "dependencies": { - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" - }, - "ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=" - }, - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "requires": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" - } - }, - "js-tokens": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", - "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=" - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "requires": { - "ansi-regex": "^2.0.0" - } - }, - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=" - } - } - }, "babel-eslint": { "version": "10.1.0", "resolved": "https://registry.npmjs.org/babel-eslint/-/babel-eslint-10.1.0.tgz", @@ -2472,6 +3183,13 @@ "@babel/types": "^7.7.0", "eslint-visitor-keys": "^1.0.0", "resolve": "^1.12.0" + }, + "dependencies": { + "eslint-visitor-keys": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==" + } } }, "babel-extract-comments": { @@ -2483,17 +3201,68 @@ } }, "babel-jest": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-24.9.0.tgz", - "integrity": "sha512-ntuddfyiN+EhMw58PTNL1ph4C9rECiQXjI4nMMBKBaNjXvqLdkXpPRcMSr4iyBrJg/+wz9brFUD6RhOAT6r4Iw==", + "version": "26.6.1", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-26.6.1.tgz", + "integrity": "sha512-duMWEOKrSBYRVTTNpL2SipNIWnZOjP77auOBMPQ3zXAdnDbyZQWU8r/RxNWpUf9N6cgPFecQYelYLytTVXVDtA==", "requires": { - "@jest/transform": "^24.9.0", - "@jest/types": "^24.9.0", - "@types/babel__core": "^7.1.0", - "babel-plugin-istanbul": "^5.1.0", - "babel-preset-jest": "^24.9.0", - "chalk": "^2.4.2", - "slash": "^2.0.0" + "@jest/transform": "^26.6.1", + "@jest/types": "^26.6.1", + "@types/babel__core": "^7.1.7", + "babel-plugin-istanbul": "^6.0.0", + "babel-preset-jest": "^26.5.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.4", + "slash": "^3.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "graceful-fs": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", + "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==" + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "requires": { + "has-flag": "^4.0.0" + } + } } }, "babel-loader": { @@ -2508,10 +3277,23 @@ "schema-utils": "^2.6.5" }, "dependencies": { - "pify": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", - "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==" + "json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "requires": { + "minimist": "^1.2.0" + } + }, + "loader-utils": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", + "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^1.0.1" + } } } }, @@ -2524,21 +3306,25 @@ } }, "babel-plugin-istanbul": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-5.2.0.tgz", - "integrity": "sha512-5LphC0USA8t4i1zCtjbbNb6jJj/9+X6P37Qfirc/70EQ34xKlMW+a1RHGwxGI+SwWpNwZ27HqvzAobeqaXwiZw==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.0.0.tgz", + "integrity": "sha512-AF55rZXpe7trmEylbaE1Gv54wn6rwU03aptvRoVIGP8YykoSxqdVLV1TfwflBCE/QtHmqtP8SWlTENqbK8GCSQ==", "requires": { "@babel/helper-plugin-utils": "^7.0.0", - "find-up": "^3.0.0", - "istanbul-lib-instrument": "^3.3.0", - "test-exclude": "^5.2.3" + "@istanbuljs/load-nyc-config": "^1.0.0", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-instrument": "^4.0.0", + "test-exclude": "^6.0.0" } }, "babel-plugin-jest-hoist": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-24.9.0.tgz", - "integrity": "sha512-2EMA2P8Vp7lG0RAzr4HXqtYwacfMErOuv1U3wrvxHX6rD1sV6xS3WXG3r8TRQ2r6w8OhvSdWt+z41hQNwNm3Xw==", + "version": "26.5.0", + "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-26.5.0.tgz", + "integrity": "sha512-ck17uZFD3CDfuwCLATWZxkkuGGFhMij8quP8CNhwj8ek1mqFgbFzRJ30xwC04LLscj/aKsVFfRST+b5PT7rSuw==", "requires": { + "@babel/template": "^7.3.3", + "@babel/types": "^7.3.3", + "@types/babel__core": "^7.0.0", "@types/babel__traverse": "^7.0.6" } }, @@ -2550,56 +3336,12 @@ "@babel/runtime": "^7.7.2", "cosmiconfig": "^6.0.0", "resolve": "^1.12.0" - }, - "dependencies": { - "cosmiconfig": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-6.0.0.tgz", - "integrity": "sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg==", - "requires": { - "@types/parse-json": "^4.0.0", - "import-fresh": "^3.1.0", - "parse-json": "^5.0.0", - "path-type": "^4.0.0", - "yaml": "^1.7.2" - } - }, - "import-fresh": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.2.1.tgz", - "integrity": "sha512-6e1q1cnWP2RXD9/keSkxHScg508CdXqXWgWBaETNhyuBFz+kUZlKboh+ISK+bU++DmbHimVBrOz/zzPe0sZ3sQ==", - "requires": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - } - }, - "parse-json": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.1.0.tgz", - "integrity": "sha512-+mi/lmVVNKFNVyLXV31ERiy2CY5E1/F6QtJFEzoChPRwwngMNXRDQ9GJ5WdE2Z2P4AujsOi0/+2qHID68KwfIQ==", - "requires": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-even-better-errors": "^2.3.0", - "lines-and-columns": "^1.1.6" - } - }, - "path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==" - }, - "resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==" - } } }, "babel-plugin-named-asset-import": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/babel-plugin-named-asset-import/-/babel-plugin-named-asset-import-0.3.6.tgz", - "integrity": "sha512-1aGDUfL1qOOIoqk9QKGIo2lANk+C7ko/fqH0uIyC71x3PEGz0uVP8ISgfEsFuG+FKmjHTvFK/nNM8dowpmUxLA==" + "version": "0.3.7", + "resolved": "https://registry.npmjs.org/babel-plugin-named-asset-import/-/babel-plugin-named-asset-import-0.3.7.tgz", + "integrity": "sha512-squySRkf+6JGnvjoUtDEjSREJEBirnXi9NqP6rjSYsylxQxqBTz+pkmf395i9E2zsvmYUaI40BHo6SqZUdydlw==" }, "babel-plugin-syntax-object-rest-spread": { "version": "6.13.0", @@ -2620,165 +3362,59 @@ "resolved": "https://registry.npmjs.org/babel-plugin-transform-react-remove-prop-types/-/babel-plugin-transform-react-remove-prop-types-0.4.24.tgz", "integrity": "sha512-eqj0hVcJUR57/Ug2zE1Yswsw4LhuqqHhD+8v120T1cl3kjg76QwtyBrdIk4WVwK+lAhBJVYCd/v+4nc4y+8JsA==" }, - "babel-preset-jest": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-24.9.0.tgz", - "integrity": "sha512-izTUuhE4TMfTRPF92fFwD2QfdXaZW08qvWTFCI51V8rW5x00UuPgc3ajRoWofXOuxjfcOM5zzSYsQS3H8KGCAg==", + "babel-preset-current-node-syntax": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-0.1.4.tgz", + "integrity": "sha512-5/INNCYhUGqw7VbVjT/hb3ucjgkVHKXY7lX3ZjlN4gm565VyFmJUrJ/h+h16ECVB38R/9SF6aACydpKMLZ/c9w==", "requires": { - "@babel/plugin-syntax-object-rest-spread": "^7.0.0", - "babel-plugin-jest-hoist": "^24.9.0" + "@babel/plugin-syntax-async-generators": "^7.8.4", + "@babel/plugin-syntax-bigint": "^7.8.3", + "@babel/plugin-syntax-class-properties": "^7.8.3", + "@babel/plugin-syntax-import-meta": "^7.8.3", + "@babel/plugin-syntax-json-strings": "^7.8.3", + "@babel/plugin-syntax-logical-assignment-operators": "^7.8.3", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-syntax-numeric-separator": "^7.8.3", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", + "@babel/plugin-syntax-optional-chaining": "^7.8.3" + } + }, + "babel-preset-jest": { + "version": "26.5.0", + "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-26.5.0.tgz", + "integrity": "sha512-F2vTluljhqkiGSJGBg/jOruA8vIIIL11YrxRcO7nviNTMbbofPSHwnm8mgP7d/wS7wRSexRoI6X1A6T74d4LQA==", + "requires": { + "babel-plugin-jest-hoist": "^26.5.0", + "babel-preset-current-node-syntax": "^0.1.3" } }, "babel-preset-react-app": { - "version": "9.1.2", - "resolved": "https://registry.npmjs.org/babel-preset-react-app/-/babel-preset-react-app-9.1.2.tgz", - "integrity": "sha512-k58RtQOKH21NyKtzptoAvtAODuAJJs3ZhqBMl456/GnXEQ/0La92pNmwgWoMn5pBTrsvk3YYXdY7zpY4e3UIxA==", + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/babel-preset-react-app/-/babel-preset-react-app-10.0.0.tgz", + "integrity": "sha512-itL2z8v16khpuKutx5IH8UdCdSTuzrOhRFTEdIhveZ2i1iBKDrVE0ATa4sFVy+02GLucZNVBWtoarXBy0Msdpg==", "requires": { - "@babel/core": "7.9.0", - "@babel/plugin-proposal-class-properties": "7.8.3", - "@babel/plugin-proposal-decorators": "7.8.3", - "@babel/plugin-proposal-nullish-coalescing-operator": "7.8.3", - "@babel/plugin-proposal-numeric-separator": "7.8.3", - "@babel/plugin-proposal-optional-chaining": "7.9.0", - "@babel/plugin-transform-flow-strip-types": "7.9.0", - "@babel/plugin-transform-react-display-name": "7.8.3", - "@babel/plugin-transform-runtime": "7.9.0", - "@babel/preset-env": "7.9.0", - "@babel/preset-react": "7.9.1", - "@babel/preset-typescript": "7.9.0", - "@babel/runtime": "7.9.0", + "@babel/core": "7.12.3", + "@babel/plugin-proposal-class-properties": "7.12.1", + "@babel/plugin-proposal-decorators": "7.12.1", + "@babel/plugin-proposal-nullish-coalescing-operator": "7.12.1", + "@babel/plugin-proposal-numeric-separator": "7.12.1", + "@babel/plugin-proposal-optional-chaining": "7.12.1", + "@babel/plugin-transform-flow-strip-types": "7.12.1", + "@babel/plugin-transform-react-display-name": "7.12.1", + "@babel/plugin-transform-runtime": "7.12.1", + "@babel/preset-env": "7.12.1", + "@babel/preset-react": "7.12.1", + "@babel/preset-typescript": "7.12.1", + "@babel/runtime": "7.12.1", "babel-plugin-macros": "2.8.0", "babel-plugin-transform-react-remove-prop-types": "0.4.24" }, "dependencies": { - "@babel/plugin-proposal-class-properties": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.8.3.tgz", - "integrity": "sha512-EqFhbo7IosdgPgZggHaNObkmO1kNUe3slaKu54d5OWvy+p9QIKOzK1GAEpAIsZtWVtPXUHSMcT4smvDrCfY4AA==", - "requires": { - "@babel/helper-create-class-features-plugin": "^7.8.3", - "@babel/helper-plugin-utils": "^7.8.3" - } - }, - "@babel/plugin-proposal-nullish-coalescing-operator": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.8.3.tgz", - "integrity": "sha512-TS9MlfzXpXKt6YYomudb/KU7nQI6/xnapG6in1uZxoxDghuSMZsPb6D2fyUwNYSAp4l1iR7QtFOjkqcRYcUsfw==", - "requires": { - "@babel/helper-plugin-utils": "^7.8.3", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.0" - } - }, - "@babel/plugin-proposal-numeric-separator": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.8.3.tgz", - "integrity": "sha512-jWioO1s6R/R+wEHizfaScNsAx+xKgwTLNXSh7tTC4Usj3ItsPEhYkEpU4h+lpnBwq7NBVOJXfO6cRFYcX69JUQ==", - "requires": { - "@babel/helper-plugin-utils": "^7.8.3", - "@babel/plugin-syntax-numeric-separator": "^7.8.3" - } - }, - "@babel/plugin-proposal-optional-chaining": { - "version": "7.9.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.9.0.tgz", - "integrity": "sha512-NDn5tu3tcv4W30jNhmc2hyD5c56G6cXx4TesJubhxrJeCvuuMpttxr0OnNCqbZGhFjLrg+NIhxxC+BK5F6yS3w==", - "requires": { - "@babel/helper-plugin-utils": "^7.8.3", - "@babel/plugin-syntax-optional-chaining": "^7.8.0" - } - }, - "@babel/plugin-transform-react-display-name": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.8.3.tgz", - "integrity": "sha512-3Jy/PCw8Fe6uBKtEgz3M82ljt+lTg+xJaM4og+eyu83qLT87ZUSckn0wy7r31jflURWLO83TW6Ylf7lyXj3m5A==", - "requires": { - "@babel/helper-plugin-utils": "^7.8.3" - } - }, - "@babel/preset-env": { - "version": "7.9.0", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.9.0.tgz", - "integrity": "sha512-712DeRXT6dyKAM/FMbQTV/FvRCms2hPCx+3weRjZ8iQVQWZejWWk1wwG6ViWMyqb/ouBbGOl5b6aCk0+j1NmsQ==", - "requires": { - "@babel/compat-data": "^7.9.0", - "@babel/helper-compilation-targets": "^7.8.7", - "@babel/helper-module-imports": "^7.8.3", - "@babel/helper-plugin-utils": "^7.8.3", - "@babel/plugin-proposal-async-generator-functions": "^7.8.3", - "@babel/plugin-proposal-dynamic-import": "^7.8.3", - "@babel/plugin-proposal-json-strings": "^7.8.3", - "@babel/plugin-proposal-nullish-coalescing-operator": "^7.8.3", - "@babel/plugin-proposal-numeric-separator": "^7.8.3", - "@babel/plugin-proposal-object-rest-spread": "^7.9.0", - "@babel/plugin-proposal-optional-catch-binding": "^7.8.3", - "@babel/plugin-proposal-optional-chaining": "^7.9.0", - "@babel/plugin-proposal-unicode-property-regex": "^7.8.3", - "@babel/plugin-syntax-async-generators": "^7.8.0", - "@babel/plugin-syntax-dynamic-import": "^7.8.0", - "@babel/plugin-syntax-json-strings": "^7.8.0", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.0", - "@babel/plugin-syntax-numeric-separator": "^7.8.0", - "@babel/plugin-syntax-object-rest-spread": "^7.8.0", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.0", - "@babel/plugin-syntax-optional-chaining": "^7.8.0", - "@babel/plugin-syntax-top-level-await": "^7.8.3", - "@babel/plugin-transform-arrow-functions": "^7.8.3", - "@babel/plugin-transform-async-to-generator": "^7.8.3", - "@babel/plugin-transform-block-scoped-functions": "^7.8.3", - "@babel/plugin-transform-block-scoping": "^7.8.3", - "@babel/plugin-transform-classes": "^7.9.0", - "@babel/plugin-transform-computed-properties": "^7.8.3", - "@babel/plugin-transform-destructuring": "^7.8.3", - "@babel/plugin-transform-dotall-regex": "^7.8.3", - "@babel/plugin-transform-duplicate-keys": "^7.8.3", - "@babel/plugin-transform-exponentiation-operator": "^7.8.3", - "@babel/plugin-transform-for-of": "^7.9.0", - "@babel/plugin-transform-function-name": "^7.8.3", - "@babel/plugin-transform-literals": "^7.8.3", - "@babel/plugin-transform-member-expression-literals": "^7.8.3", - "@babel/plugin-transform-modules-amd": "^7.9.0", - "@babel/plugin-transform-modules-commonjs": "^7.9.0", - "@babel/plugin-transform-modules-systemjs": "^7.9.0", - "@babel/plugin-transform-modules-umd": "^7.9.0", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.8.3", - "@babel/plugin-transform-new-target": "^7.8.3", - "@babel/plugin-transform-object-super": "^7.8.3", - "@babel/plugin-transform-parameters": "^7.8.7", - "@babel/plugin-transform-property-literals": "^7.8.3", - "@babel/plugin-transform-regenerator": "^7.8.7", - "@babel/plugin-transform-reserved-words": "^7.8.3", - "@babel/plugin-transform-shorthand-properties": "^7.8.3", - "@babel/plugin-transform-spread": "^7.8.3", - "@babel/plugin-transform-sticky-regex": "^7.8.3", - "@babel/plugin-transform-template-literals": "^7.8.3", - "@babel/plugin-transform-typeof-symbol": "^7.8.4", - "@babel/plugin-transform-unicode-regex": "^7.8.3", - "@babel/preset-modules": "^0.1.3", - "@babel/types": "^7.9.0", - "browserslist": "^4.9.1", - "core-js-compat": "^3.6.2", - "invariant": "^2.2.2", - "levenary": "^1.1.1", - "semver": "^5.5.0" - } - }, - "@babel/preset-react": { - "version": "7.9.1", - "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.9.1.tgz", - "integrity": "sha512-aJBYF23MPj0RNdp/4bHnAP0NVqqZRr9kl0NAOP4nJCex6OYVio59+dnQzsAWFuogdLyeaKA1hmfUIVZkY5J+TQ==", - "requires": { - "@babel/helper-plugin-utils": "^7.8.3", - "@babel/plugin-transform-react-display-name": "^7.8.3", - "@babel/plugin-transform-react-jsx": "^7.9.1", - "@babel/plugin-transform-react-jsx-development": "^7.9.0", - "@babel/plugin-transform-react-jsx-self": "^7.9.0", - "@babel/plugin-transform-react-jsx-source": "^7.9.0" - } - }, "@babel/runtime": { - "version": "7.9.0", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.9.0.tgz", - "integrity": "sha512-cTIudHnzuWLS56ik4DnRnqqNf8MkdUzV4iFFI1h7Jo9xvrpQROYaAnaSd2mHLQAzzZAPfATynX5ord6YlNYNMA==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.12.1.tgz", + "integrity": "sha512-J5AIf3vPj3UwXaAzb5j1xM4WAQDX3EMgemF8rjCP3SoW09LfRKAXQKt6CoVYl230P6iWdRcBbnLDDdnqWxZSCA==", "requires": { "regenerator-runtime": "^0.13.4" } @@ -2787,11 +3423,6 @@ "version": "0.13.7", "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz", "integrity": "sha512-a54FxoJDIr27pgf7IgeQGxmqUNYrcV338lf/6gH456HZ/PhX+5BcwHXG9ajESmwe6WRO0tAzRUrRmNONWgkrew==" - }, - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" } } }, @@ -2892,6 +3523,17 @@ "tweetnacl": "^0.14.3" } }, + "bfj": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/bfj/-/bfj-7.0.2.tgz", + "integrity": "sha512-+e/UqUzwmzJamNF50tBV6tZPTORow7gQ96iFow+8b562OdMpEK0BcJEq2OSPEDmAbSMBQ7PKZ87ubFkgxpYWgw==", + "requires": { + "bluebird": "^3.5.5", + "check-types": "^11.1.1", + "hoopy": "^0.1.4", + "tryer": "^1.0.1" + } + }, "big.js": { "version": "5.2.2", "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", @@ -2981,9 +3623,9 @@ "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24=" }, "bootstrap": { - "version": "4.5.2", - "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-4.5.2.tgz", - "integrity": "sha512-vlGn0bcySYl/iV+BGA544JkkZP5LB3jsmkeKLFQakCOwCM3AOk7VkldBz4jrzSe+Z0Ezn99NVXa1o45cQY4R6A==" + "version": "4.5.3", + "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-4.5.3.tgz", + "integrity": "sha512-o9ppKQioXGqhw8Z7mah6KdTYpNQY//tipnkxppWhPbiSWdD+1raYsnhwEZjkTHYbGee4cVQ0Rx65EhOY/HNLcQ==" }, "brace-expansion": { "version": "1.1.11", @@ -2995,30 +3637,11 @@ } }, "braces": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", - "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", "requires": { - "arr-flatten": "^1.1.0", - "array-unique": "^0.3.2", - "extend-shallow": "^2.0.1", - "fill-range": "^4.0.0", - "isobject": "^3.0.1", - "repeat-element": "^1.1.2", - "snapdragon": "^0.8.1", - "snapdragon-node": "^2.0.1", - "split-string": "^3.0.2", - "to-regex": "^3.0.1" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "requires": { - "is-extendable": "^0.1.0" - } - } + "fill-range": "^7.0.1" } }, "brorand": { @@ -3031,21 +3654,6 @@ "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz", "integrity": "sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==" }, - "browser-resolve": { - "version": "1.11.3", - "resolved": "https://registry.npmjs.org/browser-resolve/-/browser-resolve-1.11.3.tgz", - "integrity": "sha512-exDi1BYWB/6raKHmDTCicQfTkqwN5fioMFV4j8BsfMU4R2DK/QfZfK7kOVkmWCNANf0snkBzqGqAJBao9gZMdQ==", - "requires": { - "resolve": "1.1.7" - }, - "dependencies": { - "resolve": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", - "integrity": "sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs=" - } - } - }, "browserify-aes": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", @@ -3138,14 +3746,14 @@ } }, "browserslist": { - "version": "4.14.0", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.14.0.tgz", - "integrity": "sha512-pUsXKAF2lVwhmtpeA3LJrZ76jXuusrNyhduuQs7CDFf9foT4Y38aQOserd2lMe5DSSrjf3fx34oHwryuvxAUgQ==", + "version": "4.14.5", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.14.5.tgz", + "integrity": "sha512-Z+vsCZIvCBvqLoYkBFTwEYH3v5MCQbsAjp50ERycpOjnPmolg1Gjy4+KaWWpm8QOJt9GHkhdqAl14NpCX73CWA==", "requires": { - "caniuse-lite": "^1.0.30001111", - "electron-to-chromium": "^1.3.523", - "escalade": "^3.0.2", - "node-releases": "^1.1.60" + "caniuse-lite": "^1.0.30001135", + "electron-to-chromium": "^1.3.571", + "escalade": "^3.1.0", + "node-releases": "^1.1.61" } }, "bser": { @@ -3181,6 +3789,11 @@ "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=" }, + "builtin-modules": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.1.0.tgz", + "integrity": "sha512-k0KL0aWZuBt2lrxrcASWDfwOLMnodeQjodT/1SxEQAXsHANgo6ZC/VEaSEHCXt7aSTZ4/4H5LKa+tBXmW7Vtvw==" + }, "builtin-status-codes": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", @@ -3192,37 +3805,54 @@ "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=" }, "cacache": { - "version": "13.0.1", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-13.0.1.tgz", - "integrity": "sha512-5ZvAxd05HDDU+y9BVvcqYu2LLXmPnQ0hW62h32g4xBTgL/MppR4/04NHfj/ycM2y6lmTnbw6HVi+1eN0Psba6w==", + "version": "15.0.5", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-15.0.5.tgz", + "integrity": "sha512-lloiL22n7sOjEEXdL8NAjTgv9a1u43xICE9/203qonkZUCj5X1UEWIdf2/Y0d6QcCtMzbKQyhrcDbdvlZTs/+A==", "requires": { - "chownr": "^1.1.2", - "figgy-pudding": "^3.5.1", + "@npmcli/move-file": "^1.0.1", + "chownr": "^2.0.0", "fs-minipass": "^2.0.0", "glob": "^7.1.4", - "graceful-fs": "^4.2.2", "infer-owner": "^1.0.4", - "lru-cache": "^5.1.1", - "minipass": "^3.0.0", + "lru-cache": "^6.0.0", + "minipass": "^3.1.1", "minipass-collect": "^1.0.2", "minipass-flush": "^1.0.5", "minipass-pipeline": "^1.2.2", - "mkdirp": "^0.5.1", - "move-concurrently": "^1.0.1", - "p-map": "^3.0.0", + "mkdirp": "^1.0.3", + "p-map": "^4.0.0", "promise-inflight": "^1.0.1", - "rimraf": "^2.7.1", - "ssri": "^7.0.0", + "rimraf": "^3.0.2", + "ssri": "^8.0.0", + "tar": "^6.0.2", "unique-filename": "^1.1.1" }, "dependencies": { + "mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==" + }, "rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", "requires": { "glob": "^7.1.3" } + }, + "tar": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.0.5.tgz", + "integrity": "sha512-0b4HOimQHj9nXNEAA7zWwMM91Zhhba3pspja6sQbgTpynOJf+bkjBnfybNYzbpLbnwXnbyB4LOREvlyXLkCHSg==", + "requires": { + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "minipass": "^3.0.0", + "minizlib": "^2.1.1", + "mkdirp": "^1.0.3", + "yallist": "^4.0.0" + } } } }, @@ -3242,17 +3872,19 @@ "unset-value": "^1.0.0" } }, - "call-me-maybe": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/call-me-maybe/-/call-me-maybe-1.0.1.tgz", - "integrity": "sha1-JtII6onje1y95gJQoV8DHBak1ms=" - }, "caller-callsite": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/caller-callsite/-/caller-callsite-2.0.0.tgz", "integrity": "sha1-hH4PzgoiN1CpoCfFSzNzGtMVQTQ=", "requires": { "callsites": "^2.0.0" + }, + "dependencies": { + "callsites": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-2.0.0.tgz", + "integrity": "sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA=" + } } }, "caller-path": { @@ -3264,9 +3896,9 @@ } }, "callsites": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-2.0.0.tgz", - "integrity": "sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA=" + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==" }, "camel-case": { "version": "4.1.1", @@ -3310,9 +3942,9 @@ } }, "caniuse-lite": { - "version": "1.0.30001117", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001117.tgz", - "integrity": "sha512-4tY0Fatzdx59kYjQs+bNxUwZB03ZEBgVmJ1UkFPz/Q8OLiUUbjct2EdpnXj0fvFTPej2EkbPIG0w8BWsjAyk1Q==" + "version": "1.0.30001151", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001151.tgz", + "integrity": "sha512-Zh3sHqskX6mHNrqUerh+fkf0N72cMxrmflzje/JyVImfpknscMnkeJrlFGJcqTmaa0iszdYptGpWMJCRQDkBVw==" }, "capture-exit": { "version": "2.0.0", @@ -3356,6 +3988,11 @@ "supports-color": "^5.3.0" } }, + "char-regex": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", + "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==" + }, "chardet": { "version": "0.7.0", "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", @@ -3367,6 +4004,11 @@ "integrity": "sha1-V00xLt2Iu13YkS6Sht1sCu1KrII=", "dev": true }, + "check-types": { + "version": "11.1.2", + "resolved": "https://registry.npmjs.org/check-types/-/check-types-11.1.2.tgz", + "integrity": "sha512-tzWzvgePgLORb9/3a0YenggReLKAIb2owL03H2Xdoe5pKcUyWRSEQ8xfCar8t2SIAuEDwtmx2da1YB52YuHQMQ==" + }, "chokidar": { "version": "3.3.1", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.3.1.tgz", @@ -3428,9 +4070,9 @@ } }, "chownr": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", - "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==" + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", + "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==" }, "chrome-trace-event": { "version": "1.0.2", @@ -3454,6 +4096,11 @@ "safe-buffer": "^5.0.1" } }, + "cjs-module-lexer": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-0.4.3.tgz", + "integrity": "sha512-5RLK0Qfs0PNDpEyBXIr3bIT1Muw3ojSlvpw6dAmkUcO0+uTrsBn7GuEIgx40u+OzbCBLDta7nvmud85P4EmTsQ==" + }, "class-utils": { "version": "0.3.6", "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", @@ -3570,6 +4217,11 @@ "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=" }, + "collect-v8-coverage": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz", + "integrity": "sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg==" + }, "collection-visit": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", @@ -3580,12 +4232,12 @@ } }, "color": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/color/-/color-3.1.2.tgz", - "integrity": "sha512-vXTJhHebByxZn3lDvDJYw4lR5+uB3vuoHsuYA5AKuxRVn5wzzIfQKGLBmgdVRHKTJYeK5rvJcHnrd0Li49CFpg==", + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/color/-/color-3.1.3.tgz", + "integrity": "sha512-xgXAcTHa2HeFCGLE9Xs/R82hujGtu9Jd9x4NW3T34+OMs7VoPsjwzRczKHvTAHeJwWFwX5j15+MgAppE8ztObQ==", "requires": { "color-convert": "^1.9.1", - "color-string": "^1.5.2" + "color-string": "^1.5.4" } }, "color-convert": { @@ -3602,9 +4254,9 @@ "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" }, "color-string": { - "version": "1.5.3", - "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.5.3.tgz", - "integrity": "sha512-dC2C5qeWoYkxki5UAXapdjqO672AM4vZuPGRQfO8b5HKuKGBbKWpITyDYN7TOFKvRW7kOgAn3746clDBMDJyQw==", + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.5.4.tgz", + "integrity": "sha512-57yF5yt8Xa3czSEW1jfQDE79Idk0+AkN/4KWad6tbdxUmAs3MvjxlWSWD4deYytcRfoZ9nhKyFl1kj5tBvidbw==", "requires": { "color-name": "^1.0.0", "simple-swizzle": "^0.2.2" @@ -3705,9 +4357,9 @@ } }, "confusing-browser-globals": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/confusing-browser-globals/-/confusing-browser-globals-1.0.9.tgz", - "integrity": "sha512-KbS1Y0jMtyPgIxjO7ZzMAuUpAKMt1SzCL9fsrKsX6b0zJPTaT0SiSPmewwVZg9UAO83HVIlEhZF84LIjZ0lmAw==" + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/confusing-browser-globals/-/confusing-browser-globals-1.0.10.tgz", + "integrity": "sha512-gNld/3lySHwuhaVluJUKLePYirM3QNCKzVxqAdhJII9/WXKVX5PURzMVJspS1jTslSqjeuG4KMVTSouit5YPHA==" }, "connect-history-api-fallback": { "version": "1.6.0", @@ -3820,14 +4472,15 @@ "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" }, "cosmiconfig": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.2.1.tgz", - "integrity": "sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-6.0.0.tgz", + "integrity": "sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg==", "requires": { - "import-fresh": "^2.0.0", - "is-directory": "^0.3.1", - "js-yaml": "^3.13.1", - "parse-json": "^4.0.0" + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.1.0", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.7.2" } }, "create-ecdh": { @@ -3908,6 +4561,11 @@ "randomfill": "^1.0.3" } }, + "crypto-random-string": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-1.0.0.tgz", + "integrity": "sha1-ojD2T1aDEOFJgAmUB5DsmVRbyn4=" + }, "css": { "version": "2.2.4", "resolved": "https://registry.npmjs.org/css/-/css-2.2.4.tgz", @@ -3968,28 +4626,28 @@ } }, "css-loader": { - "version": "3.4.2", - "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-3.4.2.tgz", - "integrity": "sha512-jYq4zdZT0oS0Iykt+fqnzVLRIeiPWhka+7BqPn+oSIpWJAHak5tmB/WZrJ2a21JhCeFyNnnlroSl8c+MtVndzA==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-4.3.0.tgz", + "integrity": "sha512-rdezjCjScIrsL8BSYszgT4s476IcNKt6yX69t0pHjJVnPUTDpn4WfIpDQTN3wCJvUvfsz/mFjuGOekf3PY3NUg==", "requires": { - "camelcase": "^5.3.1", + "camelcase": "^6.0.0", "cssesc": "^3.0.0", "icss-utils": "^4.1.1", - "loader-utils": "^1.2.3", - "normalize-path": "^3.0.0", - "postcss": "^7.0.23", + "loader-utils": "^2.0.0", + "postcss": "^7.0.32", "postcss-modules-extract-imports": "^2.0.0", - "postcss-modules-local-by-default": "^3.0.2", - "postcss-modules-scope": "^2.1.1", + "postcss-modules-local-by-default": "^3.0.3", + "postcss-modules-scope": "^2.2.0", "postcss-modules-values": "^3.0.0", - "postcss-value-parser": "^4.0.2", - "schema-utils": "^2.6.0" + "postcss-value-parser": "^4.1.0", + "schema-utils": "^2.7.1", + "semver": "^7.3.2" }, "dependencies": { - "normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==" + "camelcase": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.1.0.tgz", + "integrity": "sha512-WCMml9ivU60+8rEJgELlFp1gxFcEGxwYleE3bziHEDeqsqAWGHdimB7beBFGjLzVNgPGyDsfgXLQEYMpmIFnVQ==" } } }, @@ -4027,9 +4685,9 @@ } }, "css-what": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/css-what/-/css-what-3.3.0.tgz", - "integrity": "sha512-pv9JPyatiPaQ6pf4OvD/dbfm0o5LviWmwxNWzblYf/1u9QZd0ihV+PMwy5jdQWQ3349kZmKEx9WXuSka2dM4cg==" + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-3.4.2.tgz", + "integrity": "sha512-ACUm3L0/jiZTqfzRM3Hi9Q8eZqd6IK37mMWPLz9PJxkLWllYeRf+EHUSHYEtFop2Eqytaq1FizFVh7XfBnXCDQ==" }, "cssdb": { "version": "4.4.0", @@ -4050,6 +4708,42 @@ "cssnano-preset-default": "^4.0.7", "is-resolvable": "^1.0.0", "postcss": "^7.0.0" + }, + "dependencies": { + "cosmiconfig": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.2.1.tgz", + "integrity": "sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA==", + "requires": { + "import-fresh": "^2.0.0", + "is-directory": "^0.3.1", + "js-yaml": "^3.13.1", + "parse-json": "^4.0.0" + } + }, + "import-fresh": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-2.0.0.tgz", + "integrity": "sha1-2BNVwVYS04bGH53dOSLUMEgipUY=", + "requires": { + "caller-path": "^2.0.0", + "resolve-from": "^3.0.0" + } + }, + "parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", + "requires": { + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" + } + }, + "resolve-from": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", + "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=" + } } }, "cssnano-preset-default": { @@ -4137,16 +4831,23 @@ } }, "cssom": { - "version": "0.3.8", - "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", - "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==" + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.4.4.tgz", + "integrity": "sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw==" }, "cssstyle": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-1.4.0.tgz", - "integrity": "sha512-GBrLZYZ4X4x6/QEoBnIrqb8B/f5l4+8me2dkom/j1Gtbxy0kBv6OGzKuAsGM75bkGwGAFkt56Iwg28S3XTZgSA==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-2.3.0.tgz", + "integrity": "sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==", "requires": { - "cssom": "0.3.x" + "cssom": "~0.3.6" + }, + "dependencies": { + "cssom": { + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", + "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==" + } } }, "csstype": { @@ -4182,14 +4883,14 @@ "integrity": "sha1-vEZ0gAQ3iyGjYMn8fPUjF5B2L7g=" }, "d3-array": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-2.6.0.tgz", - "integrity": "sha512-1TgzIGb6hrHKSCGccdL209Ibk41HCeyv5znFEvJfBsBGhD3qpoHt/2W2ECpyLxpG1k7aNJz0BYrmLpVs9hIGNQ==" + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-2.8.0.tgz", + "integrity": "sha512-6V272gsOeg7+9pTW1jSYOR1QE37g95I3my1hBmY+vOUNHRrk9yt4OTz/gK7PMkVAVDrYYq4mq3grTiZ8iJdNIw==" }, "d3-axis": { - "version": "1.0.12", - "resolved": "https://registry.npmjs.org/d3-axis/-/d3-axis-1.0.12.tgz", - "integrity": "sha512-ejINPfPSNdGFKEOAtnBtdkpr24c4d4jsei6Lg98mxf424ivoDP2956/5HDpIAtmHo85lqT4pruy+zEgvRUBqaQ==" + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/d3-axis/-/d3-axis-2.0.0.tgz", + "integrity": "sha512-9nzB0uePtb+u9+dWir+HTuEAKJOEUYJoEwbJPsZ1B4K3iZUgzJcSENQ05Nj7S4CIfbZZ8/jQGoUzGKFznBhiiQ==" }, "d3-color": { "version": "1.4.0", @@ -4210,16 +4911,16 @@ } }, "d3-path": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-1.0.9.tgz", - "integrity": "sha512-VLaYcn81dtHVTjEHd8B+pbe9yHWpXKZUC87PzoFmsFrJqgFwDe/qxfp5MlfsfM1V5E/iVt0MmEbWQ7FVIXh/bg==" + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-2.0.0.tgz", + "integrity": "sha512-ZwZQxKhBnv9yHaiWd6ZU4x5BtCQ7pXszEV9CU6kRgwIQVQGLMv1oiL4M+MK/n79sYzsj+gcgpPQSctJUsLN7fA==" }, "d3-scale": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-3.2.2.tgz", - "integrity": "sha512-3Mvi5HfqPFq0nlyeFlkskGjeqrR/790pINMHc4RXKJ2E6FraTd3juaRIRZZHyMAbi3LjAMW0EH4FB1WgoGyeXg==", + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-3.2.3.tgz", + "integrity": "sha512-8E37oWEmEzj57bHcnjPVOBS3n4jqakOeuv1EDdQSiSrYnMCBdMd3nc4HtKk7uia8DUHcY/CGuJ42xxgtEYrX0g==", "requires": { - "d3-array": "1.2.0 - 2", + "d3-array": "^2.3.0", "d3-format": "1 - 2", "d3-interpolate": "1.2.0 - 2", "d3-time": "1 - 2", @@ -4227,25 +4928,25 @@ } }, "d3-scale-chromatic": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/d3-scale-chromatic/-/d3-scale-chromatic-1.5.0.tgz", - "integrity": "sha512-ACcL46DYImpRFMBcpk9HhtIyC7bTBR4fNOPxwVSl0LfulDAwyiHyPOTqcDG1+t5d4P9W7t/2NAuWu59aKko/cg==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/d3-scale-chromatic/-/d3-scale-chromatic-2.0.0.tgz", + "integrity": "sha512-LLqy7dJSL8yDy7NRmf6xSlsFZ6zYvJ4BcWFE4zBrOPnQERv9zj24ohnXKRbyi9YHnYV+HN1oEO3iFK971/gkzA==", "requires": { - "d3-color": "1", - "d3-interpolate": "1" + "d3-color": "1 - 2", + "d3-interpolate": "1 - 2" } }, "d3-selection": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/d3-selection/-/d3-selection-1.4.2.tgz", - "integrity": "sha512-SJ0BqYihzOjDnnlfyeHT0e30k0K1+5sR3d5fNueCNeuhZTnGw4M4o8mqJchSwgKMXCNFo+e2VTChiSJ0vYtXkg==" + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/d3-selection/-/d3-selection-2.0.0.tgz", + "integrity": "sha512-XoGGqhLUN/W14NmaqcO/bb1nqjDAw5WtSYb2X8wiuQWvSZUsUVYsOSkOybUrNvcBjaywBdYPy03eXHMXjk9nZA==" }, "d3-shape": { - "version": "1.3.7", - "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-1.3.7.tgz", - "integrity": "sha512-EUkvKjqPFUAZyOlhY5gzCxCeI0Aep04LwIRpsZ/mLFelJiUfnK56jo5JMDSE7yyP2kLSb6LtF+S5chMk7uqPqw==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-2.0.0.tgz", + "integrity": "sha512-djpGlA779ua+rImicYyyjnOjeubyhql1Jyn1HK0bTyawuH76UQRWXd+pftr67H6Fa8hSwetkgb/0id3agKWykw==", "requires": { - "d3-path": "1" + "d3-path": "1 - 2" } }, "d3-time": { @@ -4254,11 +4955,11 @@ "integrity": "sha512-Xh0isrZ5rPYYdqhAVk8VLnMEidhz5aP7htAADH6MfzgmmicPkTo8LhkLxci61/lCB7n7UmE3bN0leRt+qvkLxA==" }, "d3-time-format": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/d3-time-format/-/d3-time-format-2.3.0.tgz", - "integrity": "sha512-guv6b2H37s2Uq/GefleCDtbe0XZAuy7Wa49VGkPVPMfLL9qObgBST3lEHJBMUp8S7NdLQAGIvr2KXk8Hc98iKQ==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-time-format/-/d3-time-format-3.0.0.tgz", + "integrity": "sha512-UXJh6EKsHBTjopVqZBhFysQcoXSv/5yLONZvkQ5Kk3qbwiUYkdX17Xa1PT6U1ZWXGGfB1ey5L8dKMlFq2DO0Ag==", "requires": { - "d3-time": "1" + "d3-time": "1 - 2" } }, "damerau-levenshtein": { @@ -4275,25 +4976,13 @@ } }, "data-urls": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-1.1.0.tgz", - "integrity": "sha512-YTWYI9se1P55u58gL5GkQHW4P6VJBJ5iBT+B5a7i2Tjadhv52paJG0qHX4A0OR6/t52odI64KP2YvFpkDOi3eQ==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-2.0.0.tgz", + "integrity": "sha512-X5eWTSXO/BJmpdIKCRuKUgSCgAN0OwliVK3yPKbwIWU1Tdw5BRajxlzMidvh+gwko9AfQ9zIj52pzF91Q3YAvQ==", "requires": { - "abab": "^2.0.0", - "whatwg-mimetype": "^2.2.0", - "whatwg-url": "^7.0.0" - }, - "dependencies": { - "whatwg-url": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-7.1.0.tgz", - "integrity": "sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==", - "requires": { - "lodash.sortby": "^4.7.0", - "tr46": "^1.0.1", - "webidl-conversions": "^4.0.2" - } - } + "abab": "^2.0.3", + "whatwg-mimetype": "^2.3.0", + "whatwg-url": "^8.0.0" } }, "debug": { @@ -4309,11 +4998,21 @@ "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=" }, + "decimal.js": { + "version": "10.2.1", + "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.2.1.tgz", + "integrity": "sha512-KaL7+6Fw6i5A2XSnsbhm/6B+NuEA7TZ4vqxnd5tXz9sbKtrN9Srj8ab4vKVdK8YAqZO9P1kg45Y6YLoduPf+kw==" + }, "decode-uri-component": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=" }, + "dedent": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz", + "integrity": "sha1-JJXduvbrh0q7Dhvp3yLS5aVEMmw=" + }, "deep-eql": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-3.0.1.tgz", @@ -4341,6 +5040,11 @@ "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=" }, + "deepmerge": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz", + "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==" + }, "default-gateway": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-4.2.0.tgz", @@ -4414,6 +5118,14 @@ "rimraf": "^2.6.3" }, "dependencies": { + "array-union": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", + "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", + "requires": { + "array-uniq": "^1.0.1" + } + }, "globby": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz", @@ -4437,11 +5149,6 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/p-map/-/p-map-2.1.0.tgz", "integrity": "sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==" - }, - "pify": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", - "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==" } } }, @@ -4475,9 +5182,9 @@ "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" }, "detect-newline": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-2.1.0.tgz", - "integrity": "sha1-9B8cEL5LAOh7XxPaaAdZ8sW/0+I=" + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", + "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==" }, "detect-node": { "version": "2.0.4", @@ -4509,9 +5216,9 @@ } }, "diff-sequences": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-24.9.0.tgz", - "integrity": "sha512-Dj6Wk3tWyTE+Fo1rW8v0Xhwk80um6yFYKbuAxc9c3EZxIHFDYwbi34Uk42u1CdnIiVorvt4RmlSDjIPyzGC2ew==" + "version": "26.5.0", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-26.5.0.tgz", + "integrity": "sha512-ZXx86srb/iYy6jG71k++wBN9P9J05UNQ5hQHQd9MtMPvcqXPx/vKU69jfHV637D00Q2gSgPk2D+jSx3l1lDW/Q==" }, "diffie-hellman": { "version": "5.0.3", @@ -4531,12 +5238,11 @@ } }, "dir-glob": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-2.0.0.tgz", - "integrity": "sha512-37qirFDz8cA5fimp9feo43fSuRo2gHwaIn6dXL8Ber1dGwUosDrGZeCCXq57WnIqE4aQ+u3eQZzsk1yOzhdwag==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", "requires": { - "arrify": "^1.0.1", - "path-type": "^3.0.0" + "path-type": "^4.0.0" } }, "dns-equal": { @@ -4592,17 +5298,17 @@ }, "dependencies": { "@babel/runtime": { - "version": "7.11.2", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.11.2.tgz", - "integrity": "sha512-TeWkU52so0mPtDcaCTxNBI/IHiz0pZgr8VEFqXFtZWpYD08ZB6FaSwVAS8MKRQAP3bYKiVjwysOJgMFY28o6Tw==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.12.1.tgz", + "integrity": "sha512-J5AIf3vPj3UwXaAzb5j1xM4WAQDX3EMgemF8rjCP3SoW09LfRKAXQKt6CoVYl230P6iWdRcBbnLDDdnqWxZSCA==", "requires": { "regenerator-runtime": "^0.13.4" } }, "csstype": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.0.2.tgz", - "integrity": "sha512-ofovWglpqoqbfLNOTBNZLSbMuGrblAf1efvvArGKOZMBrIoJeu5UsAipQolkijtyQx5MtAzT/J9IHj/CEY1mJw==" + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.0.4.tgz", + "integrity": "sha512-xc8DUsCLmjvCfoD7LTGE0ou2MIWLx0K9RCZwSHMOdynqRsP4MtUcLeqh1HcQ2dInwDTqn+3CE0/FZh1et+p4jA==" }, "regenerator-runtime": { "version": "0.13.7", @@ -4621,9 +5327,9 @@ }, "dependencies": { "domelementtype": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.0.1.tgz", - "integrity": "sha512-5HOHUDsYZWV8FGWN0Njbr/Rn7f/eWSQi1v7+HsUVwXgn8nWWlL64zKDkS0n8ZmQ3mlWOMuXOnR+7Nx/5tMO5AQ==" + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.0.2.tgz", + "integrity": "sha512-wFwTwCVebUrMgGeAwRL/NhZtHAUyT9n9yg4IMDwf10+6iCMxSkVq9MGCVEH+QZWo1nNidy8kNvwmv4zWHDTqvA==" } } }, @@ -4638,11 +5344,18 @@ "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==" }, "domexception": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/domexception/-/domexception-1.0.1.tgz", - "integrity": "sha512-raigMkn7CJNNo6Ihro1fzG7wr3fHuYVytzquZKX5n0yizGsTcYgzdIUwj1X9pK0VvjeihV+XiclP+DjwbsSKug==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/domexception/-/domexception-2.0.1.tgz", + "integrity": "sha512-yxJ2mFy/sibVQlu5qHjOkf9J3K6zgmCxgJ94u2EdvDOV09H+32LtRswEcUsmUWN72pVLOEnTSRaIVVzVQgS0dg==", "requires": { - "webidl-conversions": "^4.0.2" + "webidl-conversions": "^5.0.0" + }, + "dependencies": { + "webidl-conversions": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-5.0.0.tgz", + "integrity": "sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA==" + } } }, "domhandler": { @@ -4672,9 +5385,9 @@ } }, "dot-prop": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.2.0.tgz", - "integrity": "sha512-uEUyaDKoSQ1M4Oq8l45hSE26SnTxL6snNnqvK/VWx5wJhmff5z0FUVJDKDanor/6w3kzE3i7XZOk+7wC0EXr1A==", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz", + "integrity": "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==", "requires": { "is-obj": "^2.0.0" } @@ -4719,10 +5432,15 @@ "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" }, + "ejs": { + "version": "2.7.4", + "resolved": "https://registry.npmjs.org/ejs/-/ejs-2.7.4.tgz", + "integrity": "sha512-7vmuyh5+kuUyJKePhQfRQBhXV5Ce+RnaeeQArKu1EAMpL3WbgMt5WG6uQZpEVvYSSsxMXRKOewtDk9RaTKXRlA==" + }, "electron-to-chromium": { - "version": "1.3.544", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.544.tgz", - "integrity": "sha512-jx6H7M1db76Q/dI3MadZC4qwNTvpiq8tdYEJswxexrIm5bH+LKRdg+VAteMF1tJJbBLrcuogE9N3nxT3Dp1gag==" + "version": "1.3.583", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.583.tgz", + "integrity": "sha512-L9BwLwJohjZW9mQESI79HRzhicPk1DFgM+8hOCfGgGCFEcA3Otpv7QK6SGtYoZvfQfE3wKLh0Hd5ptqUFv3gvQ==" }, "elliptic": { "version": "6.5.3", @@ -4745,10 +5463,15 @@ } } }, + "emittery": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.7.2.tgz", + "integrity": "sha512-A8OG5SR/ij3SsJdWDJdkkSYUjQdCUx6APQXem0SaEePBSRg4eymGYwBkKo1Y6DU+af/Jn2dBQqDBvjnr9Vi8nQ==" + }, "emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==" }, "emojis-list": { "version": "3.0.0", @@ -4797,10 +5520,18 @@ } } }, + "enquirer": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz", + "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==", + "requires": { + "ansi-colors": "^4.1.1" + } + }, "entities": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/entities/-/entities-2.0.3.tgz", - "integrity": "sha512-MyoZ0jgnLvB2X3Lg5HqpFmn1kybDiIfEQmKzTb5apr51Rb+T3KdmMiqa70T+bhGnyv7bQ6WMj2QMHpGMmlrUYQ==" + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.1.0.tgz", + "integrity": "sha512-hCx1oky9PFrJ611mf0ifBLBRW8lUUVRlFolb5gWRfIELabBlbp9xZvrqZLZAs+NxFnbfQoeGd8wDkygjg7U85w==" }, "errno": { "version": "0.1.7", @@ -4818,20 +5549,29 @@ "is-arrayish": "^0.2.1" } }, + "error-stack-parser": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/error-stack-parser/-/error-stack-parser-2.0.6.tgz", + "integrity": "sha512-d51brTeqC+BHlwF0BhPtcYgF5nlzf9ZZ0ZIUQNZpc9ZB9qw5IJ2diTrBY9jlCJkTLITYPjmiX6OWCwH+fuyNgQ==", + "requires": { + "stackframe": "^1.1.1" + } + }, "es-abstract": { - "version": "1.17.6", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.6.tgz", - "integrity": "sha512-Fr89bON3WFyUi5EvAeI48QTWX0AyekGgLA8H+c+7fbfCkJwRWRMLd8CQedNEyJuoYYhmtEqY92pgte1FAhBlhw==", + "version": "1.18.0-next.1", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.0-next.1.tgz", + "integrity": "sha512-I4UGspA0wpZXWENrdA0uHbnhte683t3qT/1VFH9aX2dA5PPSf6QW5HHXf5HImaqPmjXaVeVk4RGWnaylmV7uAA==", "requires": { "es-to-primitive": "^1.2.1", "function-bind": "^1.1.1", "has": "^1.0.3", "has-symbols": "^1.0.1", - "is-callable": "^1.2.0", - "is-regex": "^1.1.0", - "object-inspect": "^1.7.0", + "is-callable": "^1.2.2", + "is-negative-zero": "^2.0.0", + "is-regex": "^1.1.1", + "object-inspect": "^1.8.0", "object-keys": "^1.1.1", - "object.assign": "^4.1.0", + "object.assign": "^4.1.1", "string.prototype.trimend": "^1.0.1", "string.prototype.trimstart": "^1.0.1" } @@ -4881,9 +5621,9 @@ } }, "escalade": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.0.2.tgz", - "integrity": "sha512-gPYAU37hYCUhW5euPeR+Y74F7BL+IBsV93j5cvGriSaD1aG6MGsqsV1yamRdrWrb2j3aiZvb0X+UBOWpx3JWtQ==" + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==" }, "escape-html": { "version": "1.0.3", @@ -4905,24 +5645,63 @@ "esutils": "^2.0.2", "optionator": "^0.8.1", "source-map": "~0.6.1" + }, + "dependencies": { + "levn": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", + "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", + "requires": { + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2" + } + }, + "optionator": { + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", + "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", + "requires": { + "deep-is": "~0.1.3", + "fast-levenshtein": "~2.0.6", + "levn": "~0.3.0", + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2", + "word-wrap": "~1.2.3" + } + }, + "prelude-ls": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", + "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=" + }, + "type-check": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", + "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", + "requires": { + "prelude-ls": "~1.1.2" + } + } } }, "eslint": { - "version": "6.8.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-6.8.0.tgz", - "integrity": "sha512-K+Iayyo2LtyYhDSYwz5D5QdWw0hCacNzyq1Y821Xna2xSJj7cijoLLYmLxTQgcgZ9mC61nryMy9S7GRbYpI5Ig==", + "version": "7.12.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.12.0.tgz", + "integrity": "sha512-n5pEU27DRxCSlOhJ2rO57GDLcNsxO0LPpAbpFdh7xmcDmjmlGUfoyrsB3I7yYdQXO5N3gkSTiDrPSPNFiiirXA==", "requires": { "@babel/code-frame": "^7.0.0", + "@eslint/eslintrc": "^0.2.0", "ajv": "^6.10.0", - "chalk": "^2.1.0", - "cross-spawn": "^6.0.5", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", "debug": "^4.0.1", "doctrine": "^3.0.0", - "eslint-scope": "^5.0.0", - "eslint-utils": "^1.4.3", - "eslint-visitor-keys": "^1.1.0", - "espree": "^6.1.2", - "esquery": "^1.0.1", + "enquirer": "^2.3.5", + "eslint-scope": "^5.1.1", + "eslint-utils": "^2.1.0", + "eslint-visitor-keys": "^2.0.0", + "espree": "^7.3.0", + "esquery": "^1.2.0", "esutils": "^2.0.2", "file-entry-cache": "^5.0.1", "functional-red-black-tree": "^1.0.1", @@ -4931,32 +5710,62 @@ "ignore": "^4.0.6", "import-fresh": "^3.0.0", "imurmurhash": "^0.1.4", - "inquirer": "^7.0.0", "is-glob": "^4.0.0", "js-yaml": "^3.13.1", "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.3.0", - "lodash": "^4.17.14", + "levn": "^0.4.1", + "lodash": "^4.17.19", "minimatch": "^3.0.4", - "mkdirp": "^0.5.1", "natural-compare": "^1.4.0", - "optionator": "^0.8.3", + "optionator": "^0.9.1", "progress": "^2.0.0", - "regexpp": "^2.0.1", - "semver": "^6.1.2", - "strip-ansi": "^5.2.0", - "strip-json-comments": "^3.0.1", + "regexpp": "^3.1.0", + "semver": "^7.2.1", + "strip-ansi": "^6.0.0", + "strip-json-comments": "^3.1.0", "table": "^5.2.3", "text-table": "^0.2.0", "v8-compile-cache": "^2.0.3" }, "dependencies": { - "eslint-utils": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-1.4.3.tgz", - "integrity": "sha512-fbBN5W2xdY45KulGXmLHZ3c3FHfVYmKg0IrAKGOkT/464PQsx2UeIzfz1RmEci+KLm1bBaAzZAh8+/E+XAeZ8Q==", + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "requires": { - "eslint-visitor-keys": "^1.1.0" + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "requires": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" } }, "globals": { @@ -4967,33 +5776,66 @@ "type-fest": "^0.8.1" } }, - "import-fresh": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.2.1.tgz", - "integrity": "sha512-6e1q1cnWP2RXD9/keSkxHScg508CdXqXWgWBaETNhyuBFz+kUZlKboh+ISK+bU++DmbHimVBrOz/zzPe0sZ3sQ==", + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "ignore": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", + "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==" + }, + "path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==" + }, + "shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", "requires": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" + "shebang-regex": "^3.0.0" } }, - "regexpp": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-2.0.1.tgz", - "integrity": "sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw==" + "shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==" }, - "resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==" + "strip-ansi": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "requires": { + "ansi-regex": "^5.0.0" + } + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "requires": { + "has-flag": "^4.0.0" + } + }, + "which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "requires": { + "isexe": "^2.0.0" + } } } }, "eslint-config-react-app": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/eslint-config-react-app/-/eslint-config-react-app-5.2.1.tgz", - "integrity": "sha512-pGIZ8t0mFLcV+6ZirRgYK6RVqUIKRIi9MmgzUEmrIknsn3AdO0I32asO86dJgloHq+9ZPl8UIg8mYrvgP5u2wQ==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/eslint-config-react-app/-/eslint-config-react-app-6.0.0.tgz", + "integrity": "sha512-bpoAAC+YRfzq0dsTk+6v9aHm/uqnDwayNAXleMypGl6CpxI9oXXscVHo4fk3eJPIn+rsbtNetB4r/ZIidFIE8A==", "requires": { - "confusing-browser-globals": "^1.0.9" + "confusing-browser-globals": "^1.0.10" } }, "eslint-import-resolver-node": { @@ -5019,27 +5861,16 @@ "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" }, "resolve": { - "version": "1.17.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz", - "integrity": "sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==", + "version": "1.18.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.18.1.tgz", + "integrity": "sha512-lDfCPaMKfOJXjy0dPayzPdF1phampNWr3qFCjAu+rw/qbQmr5jWH5xN2hwh9QKfw9E5v4hwV7A+jrCmL8yjjqA==", "requires": { + "is-core-module": "^2.0.0", "path-parse": "^1.0.6" } } } }, - "eslint-loader": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/eslint-loader/-/eslint-loader-3.0.3.tgz", - "integrity": "sha512-+YRqB95PnNvxNp1HEjQmvf9KNvCin5HXYYseOXVC2U0KEcw4IkQ2IQEBG46j7+gW39bMzeu0GsUhVbBY3Votpw==", - "requires": { - "fs-extra": "^8.1.0", - "loader-fs-cache": "^1.0.2", - "loader-utils": "^1.2.3", - "object-hash": "^2.0.1", - "schema-utils": "^2.6.1" - } - }, "eslint-module-utils": { "version": "2.6.0", "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.6.0.tgz", @@ -5111,30 +5942,32 @@ } }, "eslint-plugin-flowtype": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-flowtype/-/eslint-plugin-flowtype-4.6.0.tgz", - "integrity": "sha512-W5hLjpFfZyZsXfo5anlu7HM970JBDqbEshAJUkeczP6BFCIfJXuiIBQXyberLRtOStT0OGPF8efeTbxlHk4LpQ==", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-flowtype/-/eslint-plugin-flowtype-5.2.0.tgz", + "integrity": "sha512-z7ULdTxuhlRJcEe1MVljePXricuPOrsWfScRXFhNzVD5dmTHWjIF57AxD0e7AbEoLSbjSsaA5S+hCg43WvpXJQ==", "requires": { - "lodash": "^4.17.15" + "lodash": "^4.17.15", + "string-natural-compare": "^3.0.1" } }, "eslint-plugin-import": { - "version": "2.20.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.20.1.tgz", - "integrity": "sha512-qQHgFOTjguR+LnYRoToeZWT62XM55MBVXObHM6SKFd1VzDcX/vqT1kAz8ssqigh5eMj8qXcRoXXGZpPP6RfdCw==", + "version": "2.22.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.22.1.tgz", + "integrity": "sha512-8K7JjINHOpH64ozkAhpT3sd+FswIZTfMZTjdx052pnWrgRCVfp8op9tbjpAk3DdUeI/Ba4C8OjdC0r90erHEOw==", "requires": { - "array-includes": "^3.0.3", - "array.prototype.flat": "^1.2.1", + "array-includes": "^3.1.1", + "array.prototype.flat": "^1.2.3", "contains-path": "^0.1.0", "debug": "^2.6.9", "doctrine": "1.5.0", - "eslint-import-resolver-node": "^0.3.2", - "eslint-module-utils": "^2.4.1", + "eslint-import-resolver-node": "^0.3.4", + "eslint-module-utils": "^2.6.0", "has": "^1.0.3", "minimatch": "^3.0.4", - "object.values": "^1.1.0", + "object.values": "^1.1.1", "read-pkg-up": "^2.0.0", - "resolve": "^1.12.0" + "resolve": "^1.17.0", + "tsconfig-paths": "^3.9.0" }, "dependencies": { "debug": { @@ -5154,142 +5987,84 @@ "isarray": "^1.0.0" } }, - "find-up": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", - "requires": { - "locate-path": "^2.0.0" - } - }, - "load-json-file": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz", - "integrity": "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=", - "requires": { - "graceful-fs": "^4.1.2", - "parse-json": "^2.2.0", - "pify": "^2.0.0", - "strip-bom": "^3.0.0" - } - }, - "locate-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", - "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", - "requires": { - "p-locate": "^2.0.0", - "path-exists": "^3.0.0" - } - }, "ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" }, - "p-limit": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", - "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", + "resolve": { + "version": "1.18.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.18.1.tgz", + "integrity": "sha512-lDfCPaMKfOJXjy0dPayzPdF1phampNWr3qFCjAu+rw/qbQmr5jWH5xN2hwh9QKfw9E5v4hwV7A+jrCmL8yjjqA==", "requires": { - "p-try": "^1.0.0" - } - }, - "p-locate": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", - "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", - "requires": { - "p-limit": "^1.1.0" - } - }, - "p-try": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", - "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=" - }, - "parse-json": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", - "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", - "requires": { - "error-ex": "^1.2.0" - } - }, - "path-type": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz", - "integrity": "sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=", - "requires": { - "pify": "^2.0.0" - } - }, - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=" - }, - "read-pkg": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz", - "integrity": "sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=", - "requires": { - "load-json-file": "^2.0.0", - "normalize-package-data": "^2.3.2", - "path-type": "^2.0.0" - } - }, - "read-pkg-up": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-2.0.0.tgz", - "integrity": "sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4=", - "requires": { - "find-up": "^2.0.0", - "read-pkg": "^2.0.0" + "is-core-module": "^2.0.0", + "path-parse": "^1.0.6" } } } }, - "eslint-plugin-jsx-a11y": { - "version": "6.2.3", - "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.2.3.tgz", - "integrity": "sha512-CawzfGt9w83tyuVekn0GDPU9ytYtxyxyFZ3aSWROmnRRFQFT2BiPJd7jvRdzNDi6oLWaS2asMeYSNMjWTV4eNg==", + "eslint-plugin-jest": { + "version": "24.1.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-24.1.0.tgz", + "integrity": "sha512-827YJ+E8B9PvXu/0eiVSNFfxxndbKv+qE/3GSMhdorCaeaOehtqHGX2YDW9B85TEOre9n/zscledkFW/KbnyGg==", "requires": { - "@babel/runtime": "^7.4.5", - "aria-query": "^3.0.0", - "array-includes": "^3.0.3", + "@typescript-eslint/experimental-utils": "^4.0.1" + } + }, + "eslint-plugin-jsx-a11y": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.4.0.tgz", + "integrity": "sha512-zxAMaDw56XO4rg1nTbjGR/lXFamHNcaBLOhxklZdPNMO0yEfI7czmNi7j7CNU/rg8vLMQP6V+SpJaksITq5UIA==", + "requires": { + "@babel/runtime": "^7.11.2", + "aria-query": "^4.2.2", + "array-includes": "^3.1.1", "ast-types-flow": "^0.0.7", - "axobject-query": "^2.0.2", - "damerau-levenshtein": "^1.0.4", - "emoji-regex": "^7.0.2", + "axe-core": "^4.0.2", + "axobject-query": "^2.2.0", + "damerau-levenshtein": "^1.0.6", + "emoji-regex": "^9.0.0", "has": "^1.0.3", - "jsx-ast-utils": "^2.2.1" + "jsx-ast-utils": "^3.0.0", + "language-tags": "^1.0.5" }, "dependencies": { + "@babel/runtime": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.12.1.tgz", + "integrity": "sha512-J5AIf3vPj3UwXaAzb5j1xM4WAQDX3EMgemF8rjCP3SoW09LfRKAXQKt6CoVYl230P6iWdRcBbnLDDdnqWxZSCA==", + "requires": { + "regenerator-runtime": "^0.13.4" + } + }, "emoji-regex": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", - "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==" + "version": "9.2.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.0.tgz", + "integrity": "sha512-DNc3KFPK18bPdElMJnf/Pkv5TXhxFU3YFDEuGLDRtPmV4rkmCjBkCSEp22u6rBHdSN9Vlp/GK7k98prmE1Jgug==" + }, + "regenerator-runtime": { + "version": "0.13.7", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz", + "integrity": "sha512-a54FxoJDIr27pgf7IgeQGxmqUNYrcV338lf/6gH456HZ/PhX+5BcwHXG9ajESmwe6WRO0tAzRUrRmNONWgkrew==" } } }, "eslint-plugin-react": { - "version": "7.19.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.19.0.tgz", - "integrity": "sha512-SPT8j72CGuAP+JFbT0sJHOB80TX/pu44gQ4vXH/cq+hQTiY2PuZ6IHkqXJV6x1b28GDdo1lbInjKUrrdUf0LOQ==", + "version": "7.21.5", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.21.5.tgz", + "integrity": "sha512-8MaEggC2et0wSF6bUeywF7qQ46ER81irOdWS4QWxnnlAEsnzeBevk1sWh7fhpCghPpXb+8Ks7hvaft6L/xsR6g==", "requires": { "array-includes": "^3.1.1", + "array.prototype.flatmap": "^1.2.3", "doctrine": "^2.1.0", "has": "^1.0.3", - "jsx-ast-utils": "^2.2.3", - "object.entries": "^1.1.1", + "jsx-ast-utils": "^2.4.1 || ^3.0.0", + "object.entries": "^1.1.2", "object.fromentries": "^2.0.2", "object.values": "^1.1.1", "prop-types": "^15.7.2", - "resolve": "^1.15.1", - "semver": "^6.3.0", - "string.prototype.matchall": "^4.0.2", - "xregexp": "^4.3.0" + "resolve": "^1.18.1", + "string.prototype.matchall": "^4.0.2" }, "dependencies": { "doctrine": { @@ -5301,26 +6076,82 @@ } }, "resolve": { - "version": "1.17.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz", - "integrity": "sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==", + "version": "1.18.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.18.1.tgz", + "integrity": "sha512-lDfCPaMKfOJXjy0dPayzPdF1phampNWr3qFCjAu+rw/qbQmr5jWH5xN2hwh9QKfw9E5v4hwV7A+jrCmL8yjjqA==", "requires": { + "is-core-module": "^2.0.0", "path-parse": "^1.0.6" } } } }, "eslint-plugin-react-hooks": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-1.7.0.tgz", - "integrity": "sha512-iXTCFcOmlWvw4+TOE8CLWj6yX1GwzT0Y6cUfHHZqWnSk144VmVIRcVGtUAzrLES7C798lmvnt02C7rxaOX1HNA==" + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.2.0.tgz", + "integrity": "sha512-623WEiZJqxR7VdxFCKLI6d6LLpwJkGPYKODnkH3D7WpOG5KM8yWueBd8TLsNAetEJNF5iJmolaAKO3F8yzyVBQ==" + }, + "eslint-plugin-testing-library": { + "version": "3.9.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-testing-library/-/eslint-plugin-testing-library-3.9.2.tgz", + "integrity": "sha512-79oWT8dIPerbm4fdZj/QkeKB43P3XgSNbBWLnBi+Li0n+CFEvW078Q962VWeXXqHHofuXJeVOXg7grjiw849BQ==", + "requires": { + "@typescript-eslint/experimental-utils": "^3.10.1" + }, + "dependencies": { + "@typescript-eslint/experimental-utils": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-3.10.1.tgz", + "integrity": "sha512-DewqIgscDzmAfd5nOGe4zm6Bl7PKtMG2Ad0KG8CUZAHlXfAKTF9Ol5PXhiMh39yRL2ChRH1cuuUGOcVyyrhQIw==", + "requires": { + "@types/json-schema": "^7.0.3", + "@typescript-eslint/types": "3.10.1", + "@typescript-eslint/typescript-estree": "3.10.1", + "eslint-scope": "^5.0.0", + "eslint-utils": "^2.0.0" + } + }, + "@typescript-eslint/types": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-3.10.1.tgz", + "integrity": "sha512-+3+FCUJIahE9q0lDi1WleYzjCwJs5hIsbugIgnbB+dSCYUxl8L6PwmsyOPFZde2hc1DlTo/xnkOgiTLSyAbHiQ==" + }, + "@typescript-eslint/typescript-estree": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-3.10.1.tgz", + "integrity": "sha512-QbcXOuq6WYvnB3XPsZpIwztBoquEYLXh2MtwVU+kO8jgYCiv4G5xrSP/1wg4tkvrEE+esZVquIPX/dxPlePk1w==", + "requires": { + "@typescript-eslint/types": "3.10.1", + "@typescript-eslint/visitor-keys": "3.10.1", + "debug": "^4.1.1", + "glob": "^7.1.6", + "is-glob": "^4.0.1", + "lodash": "^4.17.15", + "semver": "^7.3.2", + "tsutils": "^3.17.1" + } + }, + "@typescript-eslint/visitor-keys": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-3.10.1.tgz", + "integrity": "sha512-9JgC82AaQeglebjZMgYR5wgmfUdUc+EitGUUMW8u2nDckaeimzW+VsoLV6FoimPv2id3VQzfjwBxEMVz08ameQ==", + "requires": { + "eslint-visitor-keys": "^1.1.0" + } + }, + "eslint-visitor-keys": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==" + } + } }, "eslint-scope": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.0.tgz", - "integrity": "sha512-iiGRvtxWqgtx5m8EyQUJihBloE4EnYeGE/bz1wSPwJE6tZuJUtHlhqDM4Xj2ukE8Dyy1+HCZ4hE0fzIVMzb58w==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", "requires": { - "esrecurse": "^4.1.0", + "esrecurse": "^4.3.0", "estraverse": "^4.1.1" } }, @@ -5330,21 +6161,47 @@ "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", "requires": { "eslint-visitor-keys": "^1.1.0" + }, + "dependencies": { + "eslint-visitor-keys": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==" + } } }, "eslint-visitor-keys": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", - "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==" + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.0.0.tgz", + "integrity": "sha512-QudtT6av5WXels9WjIM7qz1XD1cWGvX4gGXvp/zBn9nXG02D0utdU3Em2m/QjTnrsk6bBjmCygl3rmj118msQQ==" + }, + "eslint-webpack-plugin": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-webpack-plugin/-/eslint-webpack-plugin-2.1.0.tgz", + "integrity": "sha512-WZT1uoJXSwtEJTkS+81XBERFJzNh0xoZn8fUtQNQWri7++UiYaLJjxJTmwEEyI58NJ536upq9tjN9i3jMwkWQg==", + "requires": { + "@types/eslint": "^7.2.0", + "arrify": "^2.0.1", + "fs-extra": "^9.0.1", + "micromatch": "^4.0.2", + "schema-utils": "^2.7.0" + } }, "espree": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-6.2.1.tgz", - "integrity": "sha512-ysCxRQY3WaXJz9tdbWOwuWr5Y/XrPTGX9Kiz3yoUXwW0VZ4w30HTkQLaGx/+ttFjF8i+ACbArnB4ce68a9m5hw==", + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-7.3.0.tgz", + "integrity": "sha512-dksIWsvKCixn1yrEXO8UosNSxaDoSYpq9reEjZSbHLpT5hpaCAKTLBwq0RHtLrIr+c0ByiYzWT8KTMRzoRCNlw==", "requires": { - "acorn": "^7.1.1", + "acorn": "^7.4.0", "acorn-jsx": "^5.2.0", - "eslint-visitor-keys": "^1.1.0" + "eslint-visitor-keys": "^1.3.0" + }, + "dependencies": { + "eslint-visitor-keys": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==" + } } }, "esprima": { @@ -5368,11 +6225,18 @@ } }, "esrecurse": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz", - "integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", "requires": { - "estraverse": "^4.1.0" + "estraverse": "^5.2.0" + }, + "dependencies": { + "estraverse": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", + "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==" + } } }, "estraverse": { @@ -5380,6 +6244,11 @@ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==" }, + "estree-walker": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-1.0.1.tgz", + "integrity": "sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg==" + }, "esutils": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", @@ -5391,9 +6260,9 @@ "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=" }, "eventemitter3": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.5.tgz", - "integrity": "sha512-QR0rh0YiPuxuDQ6+T9GAO/xWTExXpxIes1Nl9RykNGTnE1HJmkuEfxJH9cubjIOQZ/GH4qNBR4u8VSHaKiWs4g==" + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", + "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==" }, "events": { "version": "3.2.0", @@ -5487,16 +6356,39 @@ } }, "expect": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/expect/-/expect-24.9.0.tgz", - "integrity": "sha512-wvVAx8XIol3Z5m9zvZXiyZOQ+sRJqNTIm6sGjdWlaZIeupQGO3WbYI+15D/AmEwZywL6wtJkbAbJtzkOfBuR0Q==", + "version": "26.6.1", + "resolved": "https://registry.npmjs.org/expect/-/expect-26.6.1.tgz", + "integrity": "sha512-BRfxIBHagghMmr1D2MRY0Qv5d3Nc8HCqgbDwNXw/9izmM5eBb42a2YjLKSbsqle76ozGkAEPELQX4IdNHAKRNA==", "requires": { - "@jest/types": "^24.9.0", - "ansi-styles": "^3.2.0", - "jest-get-type": "^24.9.0", - "jest-matcher-utils": "^24.9.0", - "jest-message-util": "^24.9.0", - "jest-regex-util": "^24.9.0" + "@jest/types": "^26.6.1", + "ansi-styles": "^4.0.0", + "jest-get-type": "^26.3.0", + "jest-matcher-utils": "^26.6.1", + "jest-message-util": "^26.6.1", + "jest-regex-util": "^26.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "color-convert": "^2.0.1" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + } } }, "express": { @@ -5690,37 +6582,16 @@ "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=" }, "fast-glob": { - "version": "2.2.7", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-2.2.7.tgz", - "integrity": "sha512-g1KuQwHOZAmOZMuBtHdxDtju+T2RT8jgCC9aANsbpdiDDTSnjgfuVsIBNKbUeJI3oKMRExcfNDtJl4OhbffMsw==", + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.4.tgz", + "integrity": "sha512-kr/Oo6PX51265qeuCYsyGypiO5uJFgBS0jksyG7FUeCyQzNwYnzrNIMR1NXfkZXsMYXYLRAHgISHBz8gQcxKHQ==", "requires": { - "@mrmlnc/readdir-enhanced": "^2.2.1", - "@nodelib/fs.stat": "^1.1.2", - "glob-parent": "^3.1.0", - "is-glob": "^4.0.0", - "merge2": "^1.2.3", - "micromatch": "^3.1.10" - }, - "dependencies": { - "glob-parent": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", - "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", - "requires": { - "is-glob": "^3.1.0", - "path-dirname": "^1.0.0" - }, - "dependencies": { - "is-glob": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", - "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", - "requires": { - "is-extglob": "^2.1.0" - } - } - } - } + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.0", + "merge2": "^1.3.0", + "micromatch": "^4.0.2", + "picomatch": "^2.2.1" } }, "fast-json-stable-stringify": { @@ -5743,6 +6614,14 @@ "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.0.7.tgz", "integrity": "sha512-Utm6CdzT+6xsDk2m8S6uL8VHxNwI6Jub+e9NYTcAms28T84pTa25GJQV9j0CY0N1rM8hK4x6grpF2BQf+2qwVA==" }, + "fastq": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.8.0.tgz", + "integrity": "sha512-SMIZoZdLh/fgofivvIkmknUXyPnvxRE3DhtZ5Me3Mrsk5gyPL42F0xr51TdRXskBxHfMp+07bcYzfsYEsSQA9Q==", + "requires": { + "reusify": "^1.0.4" + } + }, "faye-websocket": { "version": "0.10.0", "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.10.0.tgz", @@ -5810,12 +6689,40 @@ } }, "file-loader": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-4.3.0.tgz", - "integrity": "sha512-aKrYPYjF1yG3oX0kWRrqrSMfgftm7oJW5M+m4owoldH5C51C0RkIwB++JbRvEW3IU6/ZG5n8UvEcdgwOt2UOWA==", + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-6.1.1.tgz", + "integrity": "sha512-Klt8C4BjWSXYQAfhpYYkG4qHNTna4toMHEbWrI5IuVoxbU6uiDKeKAP99R8mmbJi3lvewn/jQBOgU4+NS3tDQw==", "requires": { - "loader-utils": "^1.2.3", - "schema-utils": "^2.5.0" + "loader-utils": "^2.0.0", + "schema-utils": "^3.0.0" + }, + "dependencies": { + "ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" + }, + "schema-utils": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.0.0.tgz", + "integrity": "sha512-6D82/xSzO094ajanoOSbe4YvXWMfn2A//8Y1+MUqFAJul5Bs+yn36xbK9OtNDcRVSBJ9jjeoXftM6CfztsjOAA==", + "requires": { + "@types/json-schema": "^7.0.6", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + } + } } }, "file-saver": { @@ -5824,29 +6731,16 @@ "integrity": "sha512-Wz3c3XQ5xroCxd1G8b7yL0Ehkf0TC9oYC6buPFkNnU9EnaPlifeAFCyCh+iewXTyFRcg0a6j3J7FmJsIhlhBdw==" }, "filesize": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/filesize/-/filesize-6.0.1.tgz", - "integrity": "sha512-u4AYWPgbI5GBhs6id1KdImZWn5yfyFrrQ8OWZdN7ZMfA8Bf4HcO0BGo9bmUIEV8yrp8I1xVfJ/dn90GtFNNJcg==" + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/filesize/-/filesize-6.1.0.tgz", + "integrity": "sha512-LpCHtPQ3sFx67z+uh2HnSyWSLLu5Jxo21795uRDuar/EOuYWXib5EmPaGIBuSnRqH2IODiKA2k5re/K9OnN/Yg==" }, "fill-range": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", - "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", "requires": { - "extend-shallow": "^2.0.1", - "is-number": "^3.0.0", - "repeat-string": "^1.6.1", - "to-regex-range": "^2.1.0" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "requires": { - "is-extendable": "^0.1.0" - } - } + "to-regex-range": "^5.0.1" } }, "finalhandler": { @@ -5889,11 +6783,19 @@ } }, "find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", "requires": { - "locate-path": "^3.0.0" + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "dependencies": { + "path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==" + } } }, "flat-cache": { @@ -5958,13 +6860,12 @@ "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=" }, "fork-ts-checker-webpack-plugin": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-3.1.1.tgz", - "integrity": "sha512-DuVkPNrM12jR41KM2e+N+styka0EgLkTnXmNcXdgOM37vtGeY+oCBK/Jx0hzSeEU6memFCtWb4htrHPMDfwwUQ==", + "version": "4.1.6", + "resolved": "https://registry.npmjs.org/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-4.1.6.tgz", + "integrity": "sha512-DUxuQaKoqfNne8iikd14SAkh5uw4+8vNifp6gmA73yYNS6ywLIWSLD/n/mBzHQRpW3J7rbATEakmiA8JvkTyZw==", "requires": { - "babel-code-frame": "^6.22.0", + "@babel/code-frame": "^7.5.5", "chalk": "^2.4.1", - "chokidar": "^3.3.0", "micromatch": "^3.1.10", "minimatch": "^3.0.4", "semver": "^5.6.0", @@ -5972,10 +6873,110 @@ "worker-rpc": "^0.1.0" }, "dependencies": { + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "requires": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "requires": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==" + }, + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + } + }, "semver": { "version": "5.7.1", "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" + }, + "to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "requires": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + } } } }, @@ -6022,13 +7023,14 @@ } }, "fs-extra": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", - "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.0.1.tgz", + "integrity": "sha512-h2iAoN838FqAFJY2/qVpzFXy+EBxfVE220PalAqQLDVsFOHLJrZvut5puAbCdNv6WJk+B8ihI+k0c7JK5erwqQ==", "requires": { + "at-least-node": "^1.0.0", "graceful-fs": "^4.2.0", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" + "jsonfile": "^6.0.1", + "universalify": "^1.0.0" } }, "fs-minipass": { @@ -6172,6 +7174,11 @@ "resolved": "https://registry.npmjs.org/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.2.tgz", "integrity": "sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g==" }, + "get-package-type": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", + "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==" + }, "get-stdin": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz", @@ -6219,11 +7226,6 @@ "is-glob": "^4.0.1" } }, - "glob-to-regexp": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.3.0.tgz", - "integrity": "sha1-jFoUlNIGbFcMw7/kSWF1rMTVAqs=" - }, "global-modules": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz", @@ -6255,29 +7257,16 @@ "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==" }, "globby": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/globby/-/globby-8.0.2.tgz", - "integrity": "sha512-yTzMmKygLp8RUpG1Ymu2VXPSJQZjNAZPD4ywgYEaG7e4tBJeUQBO8OpXrf1RCNcEs5alsoJYPAMiIHP0cmeC7w==", + "version": "11.0.1", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.0.1.tgz", + "integrity": "sha512-iH9RmgwCmUJHi2z5o2l3eTtGBtXek1OYlHrbcxOYugyHLmAsZrPj43OtHThd62Buh/Vv6VyCBD2bdyWcGNQqoQ==", "requires": { - "array-union": "^1.0.1", - "dir-glob": "2.0.0", - "fast-glob": "^2.0.2", - "glob": "^7.1.2", - "ignore": "^3.3.5", - "pify": "^3.0.0", - "slash": "^1.0.0" - }, - "dependencies": { - "ignore": { - "version": "3.3.10", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.10.tgz", - "integrity": "sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug==" - }, - "slash": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", - "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=" - } + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.1.1", + "ignore": "^5.1.4", + "merge2": "^1.3.0", + "slash": "^3.0.0" } }, "globule": { @@ -6298,7 +7287,8 @@ "growly": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/growly/-/growly-1.3.0.tgz", - "integrity": "sha1-8QdIy+dq+WS3yWyTxrzCivEgwIE=" + "integrity": "sha1-8QdIy+dq+WS3yWyTxrzCivEgwIE=", + "optional": true }, "gzip-size": { "version": "5.1.1", @@ -6307,13 +7297,6 @@ "requires": { "duplexer": "^0.1.1", "pify": "^4.0.1" - }, - "dependencies": { - "pify": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", - "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==" - } } }, "handle-thing": { @@ -6409,6 +7392,24 @@ "kind-of": "^4.0.0" }, "dependencies": { + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, "kind-of": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", @@ -6496,6 +7497,11 @@ "react-is": "^16.7.0" } }, + "hoopy": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/hoopy/-/hoopy-0.1.4.tgz", + "integrity": "sha512-HRcs+2mr52W0K+x8RzcLzuPPmVIKMSv97RGHy0Ea9y/mpcaK+xTrjICA04KAHi4GRzxliNqNJEFYWHghy3rSfQ==" + }, "hosted-git-info": { "version": "2.8.5", "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.5.tgz", @@ -6528,11 +7534,11 @@ "integrity": "sha512-P+M65QY2JQ5Y0G9KKdlDpo0zK+/OHptU5AaBwUfAIDJZk1MYf32Frm84EcOytfJE0t5JvkAnKlmjsXDnWzCJmQ==" }, "html-encoding-sniffer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-1.0.2.tgz", - "integrity": "sha512-71lZziiDnsuabfdYiUeWdCVyKuqwWi23L8YeIgV9jSSZHCtb6wB1BKWooH7L3tn4/FuZJMVWyNaIDr4RGmaSYw==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-2.0.1.tgz", + "integrity": "sha512-D5JbOMBIR/TVZkubHT+OyT2705QvogUW4IBn6nHd756OwieSF9aDYFj4dv6HHEVGYbHaLETa3WggZYWWMyy3ZQ==", "requires": { - "whatwg-encoding": "^1.0.1" + "whatwg-encoding": "^1.0.5" } }, "html-entities": { @@ -6567,10 +7573,13 @@ } }, "html-webpack-plugin": { - "version": "4.0.0-beta.11", - "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-4.0.0-beta.11.tgz", - "integrity": "sha512-4Xzepf0qWxf8CGg7/WQM5qBB2Lc/NFI7MhU59eUDTkuQp3skZczH4UA1d6oQyDEIoMDgERVhRyTdtUPZ5s5HBg==", + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-4.5.0.tgz", + "integrity": "sha512-MouoXEYSjTzCrjIxWwg8gxL5fE2X2WZJLmBYXlaJhQUH5K/b5OrqmV7T4dB7iu0xkmJ6JlUuV6fFVtnqbPopZw==", "requires": { + "@types/html-minifier-terser": "^5.0.0", + "@types/tapable": "^1.0.5", + "@types/webpack": "^4.41.8", "html-minifier-terser": "^5.0.1", "loader-utils": "^1.2.3", "lodash": "^4.17.15", @@ -6579,6 +7588,24 @@ "util.promisify": "1.0.0" }, "dependencies": { + "json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "requires": { + "minimist": "^1.2.0" + } + }, + "loader-utils": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", + "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^1.0.1" + } + }, "util.promisify": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.0.tgz", @@ -6663,6 +7690,108 @@ "is-glob": "^4.0.0", "lodash": "^4.17.11", "micromatch": "^3.1.10" + }, + "dependencies": { + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "requires": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "requires": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==" + }, + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + } + }, + "to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "requires": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + } + } } }, "http-signature": { @@ -6680,6 +7809,11 @@ "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=" }, + "human-signals": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-1.1.1.tgz", + "integrity": "sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==" + }, "iconv-lite": { "version": "0.4.24", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", @@ -6715,9 +7849,9 @@ "integrity": "sha1-xg7taebY/bazEEofy8ocGS3FtQE=" }, "ignore": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", - "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==" + "version": "5.1.8", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.8.tgz", + "integrity": "sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw==" }, "immediate": { "version": "3.0.6", @@ -6725,9 +7859,9 @@ "integrity": "sha1-nbHb0Pr43m++D13V5Wu2BigN5ps=" }, "immer": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/immer/-/immer-1.10.0.tgz", - "integrity": "sha512-O3sR1/opvCDGLEVcvrGTMtLac8GJ5IwZC4puPrLuRj3l7ICKvkmA0vGuU9OW8mV9WIBRnaxp5GJh9IEAaNOoYg==" + "version": "7.0.9", + "resolved": "https://registry.npmjs.org/immer/-/immer-7.0.9.tgz", + "integrity": "sha512-Vs/gxoM4DqNAYR7pugIxi0Xc8XAun/uy7AQu4fLLqaTBHxjOP9pJ266Q9MWA/ly4z6rAFZbvViOtihxUZ7O28A==" }, "import-cwd": { "version": "2.1.0", @@ -6738,12 +7872,12 @@ } }, "import-fresh": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-2.0.0.tgz", - "integrity": "sha1-2BNVwVYS04bGH53dOSLUMEgipUY=", + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.2.1.tgz", + "integrity": "sha512-6e1q1cnWP2RXD9/keSkxHScg508CdXqXWgWBaETNhyuBFz+kUZlKboh+ISK+bU++DmbHimVBrOz/zzPe0sZ3sQ==", "requires": { - "caller-path": "^2.0.0", - "resolve-from": "^3.0.0" + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" } }, "import-from": { @@ -6752,15 +7886,32 @@ "integrity": "sha1-M1238qev/VOqpHHUuAId7ja387E=", "requires": { "resolve-from": "^3.0.0" + }, + "dependencies": { + "resolve-from": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", + "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=" + } } }, "import-local": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/import-local/-/import-local-2.0.0.tgz", - "integrity": "sha512-b6s04m3O+s3CGSbqDIyP4R6aAwAeYlVq9+WUWep6iHa8ETRf9yei1U48C5MmfJmV9AiLYYBKPMq/W+/WRpQmCQ==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.0.2.tgz", + "integrity": "sha512-vjL3+w0oulAVZ0hBHnxa/Nm5TAurf9YLQJDhqRZyqb+VKGOB6LU8t9H1Nr5CIo16vh9XfJTOoHwU0B71S557gA==", "requires": { - "pkg-dir": "^3.0.0", - "resolve-cwd": "^2.0.0" + "pkg-dir": "^4.2.0", + "resolve-cwd": "^3.0.0" + }, + "dependencies": { + "pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "requires": { + "find-up": "^4.0.0" + } + } } }, "imurmurhash": { @@ -6828,11 +7979,10 @@ }, "dependencies": { "ansi-styles": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", - "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "requires": { - "@types/color-name": "^1.1.1", "color-convert": "^2.0.1" } }, @@ -6858,11 +8008,31 @@ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" }, + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, "has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" }, + "is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" + }, + "string-width": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", + "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==", + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.0" + } + }, "strip-ansi": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", @@ -6872,9 +8042,9 @@ } }, "supports-color": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", - "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "requires": { "has-flag": "^4.0.0" } @@ -6898,6 +8068,26 @@ "es-abstract": "^1.17.0-next.1", "has": "^1.0.3", "side-channel": "^1.0.2" + }, + "dependencies": { + "es-abstract": { + "version": "1.17.7", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.7.tgz", + "integrity": "sha512-VBl/gnfcJ7OercKA9MVaegWsBHFjV492syMudcnQZvt/Dw8ezpcOHYZXa/J96O8vx+g4x65YKhxOwDUh63aS5g==", + "requires": { + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1", + "is-callable": "^1.2.2", + "is-regex": "^1.1.1", + "object-inspect": "^1.8.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.1", + "string.prototype.trimend": "^1.0.1", + "string.prototype.trimstart": "^1.0.1" + } + } } }, "invariant": { @@ -6960,9 +8150,9 @@ "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" }, "is-callable": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.0.tgz", - "integrity": "sha512-pyVD9AaGLxtg6srb2Ng6ynWJqkHU9bEM087AKck0w8QwDarTfNcpIYoU8x8Hv2Icm8u6kFJM18Dag8lyqGkviw==" + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.2.tgz", + "integrity": "sha512-dnMqspv5nU3LoewK2N/y7KLtxtakvTuaCsU9FU50/QDmdbHNy/4/JuRtMHqRU22o3q+W89YQndQEeCVwK+3qrA==" }, "is-ci": { "version": "2.0.0", @@ -6985,6 +8175,14 @@ "rgba-regex": "^1.0.0" } }, + "is-core-module": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.0.0.tgz", + "integrity": "sha512-jq1AH6C8MuteOoBPwkxHafmByhL9j5q4OaPGdbuD+ZtQJVzH+i6E3BJDQcBA09k57i2Hh2yQbEG8yObZ0jdlWw==", + "requires": { + "has": "^1.0.3" + } + }, "is-data-descriptor": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", @@ -7041,9 +8239,9 @@ "integrity": "sha512-cdyMtqX/BOqqNBBiKlIVkytNHm49MtMlYyn1zxzvJKWmFMlGzm+ry5BBfYyeY9YmNKbRSo/o7OX9w9ale0wg3w==" }, "is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" }, "is-generator-fn": { "version": "2.1.0", @@ -7058,18 +8256,20 @@ "is-extglob": "^2.1.1" } }, + "is-module": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-module/-/is-module-1.0.0.tgz", + "integrity": "sha1-Mlj7afeMFNW4FdZkM2tM/7ZEFZE=" + }, "is-negative-zero": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.0.tgz", "integrity": "sha1-lVOxIbD6wohp2p7UWeIMdUN4hGE=" }, "is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "requires": { - "kind-of": "^3.0.2" - } + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" }, "is-obj": { "version": "2.0.0", @@ -7110,6 +8310,11 @@ "isobject": "^3.0.1" } }, + "is-potential-custom-element-name": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.0.tgz", + "integrity": "sha1-DFLlS8yjkbssSUsh6GJtczbG45c=" + }, "is-regex": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.1.tgz", @@ -7175,9 +8380,12 @@ "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==" }, "is-wsl": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", - "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=" + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", + "requires": { + "is-docker": "^2.0.0" + } }, "isarray": { "version": "1.0.0", @@ -7209,360 +8417,913 @@ "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=" }, "istanbul-lib-coverage": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.5.tgz", - "integrity": "sha512-8aXznuEPCJvGnMSRft4udDRDtb1V3pkQkMMI5LI+6HuQz5oQ4J2UFn1H82raA3qJtyOLkkwVqICBQkjnGtn5mA==" + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.0.0.tgz", + "integrity": "sha512-UiUIqxMgRDET6eR+o5HbfRYP1l0hqkWOs7vNxC/mggutCMUIhWMm8gAHb8tHlyfD3/l6rlgNA5cKdDzEAf6hEg==" }, "istanbul-lib-instrument": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-3.3.0.tgz", - "integrity": "sha512-5nnIN4vo5xQZHdXno/YDXJ0G+I3dAm4XgzfSVTPLQpj/zAV2dV6Juy0yaf10/zrJOJeHoN3fraFe+XRq2bFVZA==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.3.tgz", + "integrity": "sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ==", "requires": { - "@babel/generator": "^7.4.0", - "@babel/parser": "^7.4.3", - "@babel/template": "^7.4.0", - "@babel/traverse": "^7.4.3", - "@babel/types": "^7.4.0", - "istanbul-lib-coverage": "^2.0.5", - "semver": "^6.0.0" + "@babel/core": "^7.7.5", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.0.0", + "semver": "^6.3.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" + } } }, "istanbul-lib-report": { - "version": "2.0.8", - "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-2.0.8.tgz", - "integrity": "sha512-fHBeG573EIihhAblwgxrSenp0Dby6tJMFR/HvlerBsrCTD5bkUuoNtn3gVh29ZCS824cGGBPn7Sg7cNk+2xUsQ==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", + "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==", "requires": { - "istanbul-lib-coverage": "^2.0.5", - "make-dir": "^2.1.0", - "supports-color": "^6.1.0" + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^3.0.0", + "supports-color": "^7.1.0" }, "dependencies": { - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", "requires": { - "has-flag": "^3.0.0" + "semver": "^6.0.0" + } + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "requires": { + "has-flag": "^4.0.0" } } } }, "istanbul-lib-source-maps": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-3.0.6.tgz", - "integrity": "sha512-R47KzMtDJH6X4/YW9XTx+jrLnZnscW4VpNN+1PViSYTejLVPWv7oov+Duf8YQSPyVRUvueQqz1TcsC6mooZTXw==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.0.tgz", + "integrity": "sha512-c16LpFRkR8vQXyHZ5nLpY35JZtzj1PQY1iZmesUbf1FZHbIupcWfjgOXBY9YHkLEQ6puz1u4Dgj6qmU/DisrZg==", "requires": { "debug": "^4.1.1", - "istanbul-lib-coverage": "^2.0.5", - "make-dir": "^2.1.0", - "rimraf": "^2.6.3", + "istanbul-lib-coverage": "^3.0.0", "source-map": "^0.6.1" } }, "istanbul-reports": { - "version": "2.2.7", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-2.2.7.tgz", - "integrity": "sha512-uu1F/L1o5Y6LzPVSVZXNOoD/KXpJue9aeLRd0sM9uMXfZvzomB0WxVamWb5ue8kA2vVWEmW7EG+A5n3f1kqHKg==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.0.2.tgz", + "integrity": "sha512-9tZvz7AiR3PEDNGiV9vIouQ/EAcqMXFmkcA1CDFTwOB98OZVDL0PH9glHotf5Ugp6GCOTypfzGWI/OqjWNCRUw==", "requires": { - "html-escaper": "^2.0.0" + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" } }, "jest": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest/-/jest-24.9.0.tgz", - "integrity": "sha512-YvkBL1Zm7d2B1+h5fHEOdyjCG+sGMz4f8D86/0HiqJ6MB4MnDc8FgP5vdWsGnemOQro7lnYo8UakZ3+5A0jxGw==", + "version": "26.6.0", + "resolved": "https://registry.npmjs.org/jest/-/jest-26.6.0.tgz", + "integrity": "sha512-jxTmrvuecVISvKFFhOkjsWRZV7sFqdSUAd1ajOKY+/QE/aLBVstsJ/dX8GczLzwiT6ZEwwmZqtCUHLHHQVzcfA==", "requires": { - "import-local": "^2.0.0", - "jest-cli": "^24.9.0" + "@jest/core": "^26.6.0", + "import-local": "^3.0.2", + "jest-cli": "^26.6.0" }, "dependencies": { - "jest-cli": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-24.9.0.tgz", - "integrity": "sha512-+VLRKyitT3BWoMeSUIHRxV/2g8y9gw91Jh5z2UmXZzkZKpbC08CSehVxgHUwTpy+HwGcns/tqafQDJW7imYvGg==", + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "requires": { - "@jest/core": "^24.9.0", - "@jest/test-result": "^24.9.0", - "@jest/types": "^24.9.0", - "chalk": "^2.0.1", + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "cliui": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", + "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", + "requires": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^6.2.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "graceful-fs": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", + "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==" + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" + }, + "jest-cli": { + "version": "26.6.1", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-26.6.1.tgz", + "integrity": "sha512-aPLoEjlwFrCWhiPpW5NUxQA1X1kWsAnQcQ0SO/fHsCvczL3W75iVAcH9kP6NN+BNqZcHNEvkhxT5cDmBfEAh+w==", + "requires": { + "@jest/core": "^26.6.1", + "@jest/test-result": "^26.6.1", + "@jest/types": "^26.6.1", + "chalk": "^4.0.0", "exit": "^0.1.2", - "import-local": "^2.0.0", + "graceful-fs": "^4.2.4", + "import-local": "^3.0.2", "is-ci": "^2.0.0", - "jest-config": "^24.9.0", - "jest-util": "^24.9.0", - "jest-validate": "^24.9.0", + "jest-config": "^26.6.1", + "jest-util": "^26.6.1", + "jest-validate": "^26.6.1", "prompts": "^2.0.1", - "realpath-native": "^1.1.0", - "yargs": "^13.3.0" + "yargs": "^15.4.1" + } + }, + "string-width": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", + "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==", + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.0" + } + }, + "strip-ansi": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "requires": { + "ansi-regex": "^5.0.0" + } + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "requires": { + "has-flag": "^4.0.0" + } + }, + "wrap-ansi": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + } + }, + "yargs": { + "version": "15.4.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", + "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", + "requires": { + "cliui": "^6.0.0", + "decamelize": "^1.2.0", + "find-up": "^4.1.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^4.2.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^18.1.2" + } + }, + "yargs-parser": { + "version": "18.1.3", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", + "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" } } } }, "jest-changed-files": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-24.9.0.tgz", - "integrity": "sha512-6aTWpe2mHF0DhL28WjdkO8LyGjs3zItPET4bMSeXU6T3ub4FPMw+mcOcbdGXQOAfmLcxofD23/5Bl9Z4AkFwqg==", + "version": "26.6.1", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-26.6.1.tgz", + "integrity": "sha512-NhSdZ5F6b/rIN5V46x1l31vrmukD/bJUXgYAY8VtP1SknYdJwjYDRxuLt7Z8QryIdqCjMIn2C0Cd98EZ4umo8Q==", "requires": { - "@jest/types": "^24.9.0", - "execa": "^1.0.0", - "throat": "^4.0.0" - } - }, - "jest-config": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-24.9.0.tgz", - "integrity": "sha512-RATtQJtVYQrp7fvWg6f5y3pEFj9I+H8sWw4aKxnDZ96mob5i5SD6ZEGWgMLXQ4LE8UurrjbdlLWdUeo+28QpfQ==", - "requires": { - "@babel/core": "^7.1.0", - "@jest/test-sequencer": "^24.9.0", - "@jest/types": "^24.9.0", - "babel-jest": "^24.9.0", - "chalk": "^2.0.1", - "glob": "^7.1.1", - "jest-environment-jsdom": "^24.9.0", - "jest-environment-node": "^24.9.0", - "jest-get-type": "^24.9.0", - "jest-jasmine2": "^24.9.0", - "jest-regex-util": "^24.3.0", - "jest-resolve": "^24.9.0", - "jest-util": "^24.9.0", - "jest-validate": "^24.9.0", - "micromatch": "^3.1.10", - "pretty-format": "^24.9.0", - "realpath-native": "^1.1.0" - } - }, - "jest-diff": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-24.9.0.tgz", - "integrity": "sha512-qMfrTs8AdJE2iqrTp0hzh7kTd2PQWrsFyj9tORoKmu32xjPjeE4NyjVRDz8ybYwqS2ik8N4hsIpiVTyFeo2lBQ==", - "requires": { - "chalk": "^2.0.1", - "diff-sequences": "^24.9.0", - "jest-get-type": "^24.9.0", - "pretty-format": "^24.9.0" - } - }, - "jest-docblock": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-24.9.0.tgz", - "integrity": "sha512-F1DjdpDMJMA1cN6He0FNYNZlo3yYmOtRUnktrT9Q37njYzC5WEaDdmbynIgy0L/IvXvvgsG8OsqhLPXTpfmZAA==", - "requires": { - "detect-newline": "^2.1.0" - } - }, - "jest-each": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-24.9.0.tgz", - "integrity": "sha512-ONi0R4BvW45cw8s2Lrx8YgbeXL1oCQ/wIDwmsM3CqM/nlblNCPmnC3IPQlMbRFZu3wKdQ2U8BqM6lh3LJ5Bsog==", - "requires": { - "@jest/types": "^24.9.0", - "chalk": "^2.0.1", - "jest-get-type": "^24.9.0", - "jest-util": "^24.9.0", - "pretty-format": "^24.9.0" - } - }, - "jest-environment-jsdom": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-24.9.0.tgz", - "integrity": "sha512-Zv9FV9NBRzLuALXjvRijO2351DRQeLYXtpD4xNvfoVFw21IOKNhZAEUKcbiEtjTkm2GsJ3boMVgkaR7rN8qetA==", - "requires": { - "@jest/environment": "^24.9.0", - "@jest/fake-timers": "^24.9.0", - "@jest/types": "^24.9.0", - "jest-mock": "^24.9.0", - "jest-util": "^24.9.0", - "jsdom": "^11.5.1" - } - }, - "jest-environment-jsdom-fourteen": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/jest-environment-jsdom-fourteen/-/jest-environment-jsdom-fourteen-1.0.1.tgz", - "integrity": "sha512-DojMX1sY+at5Ep+O9yME34CdidZnO3/zfPh8UW+918C5fIZET5vCjfkegixmsi7AtdYfkr4bPlIzmWnlvQkP7Q==", - "requires": { - "@jest/environment": "^24.3.0", - "@jest/fake-timers": "^24.3.0", - "@jest/types": "^24.3.0", - "jest-mock": "^24.0.0", - "jest-util": "^24.0.0", - "jsdom": "^14.1.0" + "@jest/types": "^26.6.1", + "execa": "^4.0.0", + "throat": "^5.0.0" }, "dependencies": { - "acorn": { - "version": "6.4.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.1.tgz", - "integrity": "sha512-ZVA9k326Nwrj3Cj9jlh3wGFutC2ZornPNARZwsNYqQYgN0EsV2d53w5RN/co65Ohn4sUAUtb1rSUAOD6XN9idA==" - }, - "jsdom": { - "version": "14.1.0", - "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-14.1.0.tgz", - "integrity": "sha512-O901mfJSuTdwU2w3Sn+74T+RnDVP+FuV5fH8tcPWyqrseRAb0s5xOtPgCFiPOtLcyK7CLIJwPyD83ZqQWvA5ng==", + "cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", "requires": { - "abab": "^2.0.0", - "acorn": "^6.0.4", - "acorn-globals": "^4.3.0", - "array-equal": "^1.0.0", - "cssom": "^0.3.4", - "cssstyle": "^1.1.1", - "data-urls": "^1.1.0", - "domexception": "^1.0.1", - "escodegen": "^1.11.0", - "html-encoding-sniffer": "^1.0.2", - "nwsapi": "^2.1.3", - "parse5": "5.1.0", - "pn": "^1.1.0", - "request": "^2.88.0", - "request-promise-native": "^1.0.5", - "saxes": "^3.1.9", - "symbol-tree": "^3.2.2", - "tough-cookie": "^2.5.0", - "w3c-hr-time": "^1.0.1", - "w3c-xmlserializer": "^1.1.2", - "webidl-conversions": "^4.0.2", - "whatwg-encoding": "^1.0.5", - "whatwg-mimetype": "^2.3.0", - "whatwg-url": "^7.0.0", - "ws": "^6.1.2", - "xml-name-validator": "^3.0.0" + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" } }, - "parse5": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-5.1.0.tgz", - "integrity": "sha512-fxNG2sQjHvlVAYmzBZS9YlDp6PTSSDwa98vkD4QgVDDCAo84z5X1t5XyJQ62ImdLXx5NdIIfihey6xpum9/gRQ==" - }, - "whatwg-url": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-7.1.0.tgz", - "integrity": "sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==", + "execa": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/execa/-/execa-4.0.3.tgz", + "integrity": "sha512-WFDXGHckXPWZX19t1kCsXzOpqX9LWYNqn4C+HqZlk/V0imTkzJZqf87ZBhvpHaftERYknpk0fjSylnXVlVgI0A==", "requires": { - "lodash.sortby": "^4.7.0", - "tr46": "^1.0.1", - "webidl-conversions": "^4.0.2" + "cross-spawn": "^7.0.0", + "get-stream": "^5.0.0", + "human-signals": "^1.1.1", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.0", + "onetime": "^5.1.0", + "signal-exit": "^3.0.2", + "strip-final-newline": "^2.0.0" } }, - "ws": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.1.tgz", - "integrity": "sha512-GIyAXC2cB7LjvpgMt9EKS2ldqr0MTrORaleiOno6TweZ6r3TKtoFQWay/2PceJ3RuBasOHzXNn5Lrw1X0bEjqA==", + "get-stream": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", "requires": { - "async-limiter": "~1.0.0" + "pump": "^3.0.0" + } + }, + "is-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.0.tgz", + "integrity": "sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==" + }, + "npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "requires": { + "path-key": "^3.0.0" + } + }, + "path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==" + }, + "shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "requires": { + "shebang-regex": "^3.0.0" + } + }, + "shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==" + }, + "which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "requires": { + "isexe": "^2.0.0" } } } }, - "jest-environment-node": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-24.9.0.tgz", - "integrity": "sha512-6d4V2f4nxzIzwendo27Tr0aFm+IXWa0XEUnaH6nU0FMaozxovt+sfRvh4J47wL1OvF83I3SSTu0XK+i4Bqe7uA==", + "jest-circus": { + "version": "26.6.0", + "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-26.6.0.tgz", + "integrity": "sha512-L2/Y9szN6FJPWFK8kzWXwfp+FOR7xq0cUL4lIsdbIdwz3Vh6P1nrpcqOleSzr28zOtSHQNV9Z7Tl+KkuK7t5Ng==", "requires": { - "@jest/environment": "^24.9.0", - "@jest/fake-timers": "^24.9.0", - "@jest/types": "^24.9.0", - "jest-mock": "^24.9.0", - "jest-util": "^24.9.0" + "@babel/traverse": "^7.1.0", + "@jest/environment": "^26.6.0", + "@jest/test-result": "^26.6.0", + "@jest/types": "^26.6.0", + "@types/babel__traverse": "^7.0.4", + "@types/node": "*", + "chalk": "^4.0.0", + "co": "^4.6.0", + "dedent": "^0.7.0", + "expect": "^26.6.0", + "is-generator-fn": "^2.0.0", + "jest-each": "^26.6.0", + "jest-matcher-utils": "^26.6.0", + "jest-message-util": "^26.6.0", + "jest-runner": "^26.6.0", + "jest-runtime": "^26.6.0", + "jest-snapshot": "^26.6.0", + "jest-util": "^26.6.0", + "pretty-format": "^26.6.0", + "stack-utils": "^2.0.2", + "throat": "^5.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "jest-config": { + "version": "26.6.1", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-26.6.1.tgz", + "integrity": "sha512-mtJzIynIwW1d1nMlKCNCQiSgWaqFn8cH/fOSNY97xG7Y9tBCZbCSuW2GTX0RPmceSJGO7l27JgwC18LEg0Vg+g==", + "requires": { + "@babel/core": "^7.1.0", + "@jest/test-sequencer": "^26.6.1", + "@jest/types": "^26.6.1", + "babel-jest": "^26.6.1", + "chalk": "^4.0.0", + "deepmerge": "^4.2.2", + "glob": "^7.1.1", + "graceful-fs": "^4.2.4", + "jest-environment-jsdom": "^26.6.1", + "jest-environment-node": "^26.6.1", + "jest-get-type": "^26.3.0", + "jest-jasmine2": "^26.6.1", + "jest-regex-util": "^26.0.0", + "jest-resolve": "^26.6.1", + "jest-util": "^26.6.1", + "jest-validate": "^26.6.1", + "micromatch": "^4.0.2", + "pretty-format": "^26.6.1" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "graceful-fs": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", + "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==" + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "jest-resolve": { + "version": "26.6.1", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-26.6.1.tgz", + "integrity": "sha512-hiHfQH6rrcpAmw9xCQ0vD66SDuU+7ZulOuKwc4jpbmFFsz0bQG/Ib92K+9/489u5rVw0btr/ZhiHqBpmkbCvuQ==", + "requires": { + "@jest/types": "^26.6.1", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.4", + "jest-pnp-resolver": "^1.2.2", + "jest-util": "^26.6.1", + "read-pkg-up": "^7.0.1", + "resolve": "^1.18.1", + "slash": "^3.0.0" + } + }, + "read-pkg": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", + "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", + "requires": { + "@types/normalize-package-data": "^2.4.0", + "normalize-package-data": "^2.5.0", + "parse-json": "^5.0.0", + "type-fest": "^0.6.0" + }, + "dependencies": { + "type-fest": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", + "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==" + } + } + }, + "read-pkg-up": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", + "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", + "requires": { + "find-up": "^4.1.0", + "read-pkg": "^5.2.0", + "type-fest": "^0.8.1" + } + }, + "resolve": { + "version": "1.18.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.18.1.tgz", + "integrity": "sha512-lDfCPaMKfOJXjy0dPayzPdF1phampNWr3qFCjAu+rw/qbQmr5jWH5xN2hwh9QKfw9E5v4hwV7A+jrCmL8yjjqA==", + "requires": { + "is-core-module": "^2.0.0", + "path-parse": "^1.0.6" + } + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "jest-diff": { + "version": "26.6.1", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-26.6.1.tgz", + "integrity": "sha512-BBNy/zin2m4kG5In126O8chOBxLLS/XMTuuM2+YhgyHk87ewPzKTuTJcqj3lOWOi03NNgrl+DkMeV/exdvG9gg==", + "requires": { + "chalk": "^4.0.0", + "diff-sequences": "^26.5.0", + "jest-get-type": "^26.3.0", + "pretty-format": "^26.6.1" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "jest-docblock": { + "version": "26.0.0", + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-26.0.0.tgz", + "integrity": "sha512-RDZ4Iz3QbtRWycd8bUEPxQsTlYazfYn/h5R65Fc6gOfwozFhoImx+affzky/FFBuqISPTqjXomoIGJVKBWoo0w==", + "requires": { + "detect-newline": "^3.0.0" + } + }, + "jest-each": { + "version": "26.6.1", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-26.6.1.tgz", + "integrity": "sha512-gSn8eB3buchuq45SU7pLB7qmCGax1ZSxfaWuEFblCyNMtyokYaKFh9dRhYPujK6xYL57dLIPhLKatjmB5XWzGA==", + "requires": { + "@jest/types": "^26.6.1", + "chalk": "^4.0.0", + "jest-get-type": "^26.3.0", + "jest-util": "^26.6.1", + "pretty-format": "^26.6.1" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "jest-environment-jsdom": { + "version": "26.6.1", + "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-26.6.1.tgz", + "integrity": "sha512-A17RiXuHYNVlkM+3QNcQ6n5EZyAc6eld8ra9TW26luounGWpku4tj03uqRgHJCI1d4uHr5rJiuCH5JFRtdmrcA==", + "requires": { + "@jest/environment": "^26.6.1", + "@jest/fake-timers": "^26.6.1", + "@jest/types": "^26.6.1", + "@types/node": "*", + "jest-mock": "^26.6.1", + "jest-util": "^26.6.1", + "jsdom": "^16.4.0" + } + }, + "jest-environment-node": { + "version": "26.6.1", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-26.6.1.tgz", + "integrity": "sha512-YffaCp6h0j1kbcf1NVZ7umC6CPgD67YS+G1BeornfuSkx5s3xdhuwG0DCxSiHPXyT81FfJzA1L7nXvhq50OWIg==", + "requires": { + "@jest/environment": "^26.6.1", + "@jest/fake-timers": "^26.6.1", + "@jest/types": "^26.6.1", + "@types/node": "*", + "jest-mock": "^26.6.1", + "jest-util": "^26.6.1" } }, "jest-get-type": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-24.9.0.tgz", - "integrity": "sha512-lUseMzAley4LhIcpSP9Jf+fTrQ4a1yHQwLNeeVa2cEmbCGeoZAtYPOIv8JaxLD/sUpKxetKGP+gsHl8f8TSj8Q==" + "version": "26.3.0", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-26.3.0.tgz", + "integrity": "sha512-TpfaviN1R2pQWkIihlfEanwOXK0zcxrKEE4MlU6Tn7keoXdN6/3gK/xl0yEh8DOunn5pOVGKf8hB4R9gVh04ig==" }, "jest-haste-map": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-24.9.0.tgz", - "integrity": "sha512-kfVFmsuWui2Sj1Rp1AJ4D9HqJwE4uwTlS/vO+eRUaMmd54BFpli2XhMQnPC2k4cHFVbB2Q2C+jtI1AGLgEnCjQ==", + "version": "26.6.1", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-26.6.1.tgz", + "integrity": "sha512-9kPafkv0nX6ta1PrshnkiyhhoQoFWncrU/uUBt3/AP1r78WSCU5iLceYRTwDvJl67H3RrXqSlSVDDa/AsUB7OQ==", "requires": { - "@jest/types": "^24.9.0", - "anymatch": "^2.0.0", + "@jest/types": "^26.6.1", + "@types/graceful-fs": "^4.1.2", + "@types/node": "*", + "anymatch": "^3.0.3", "fb-watchman": "^2.0.0", - "fsevents": "^1.2.7", - "graceful-fs": "^4.1.15", - "invariant": "^2.2.4", - "jest-serializer": "^24.9.0", - "jest-util": "^24.9.0", - "jest-worker": "^24.9.0", - "micromatch": "^3.1.10", + "fsevents": "^2.1.2", + "graceful-fs": "^4.2.4", + "jest-regex-util": "^26.0.0", + "jest-serializer": "^26.5.0", + "jest-util": "^26.6.1", + "jest-worker": "^26.6.1", + "micromatch": "^4.0.2", "sane": "^4.0.3", "walker": "^1.0.7" }, "dependencies": { - "fsevents": { - "version": "1.2.13", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.13.tgz", - "integrity": "sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==", - "optional": true, - "requires": { - "nan": "^2.12.1" - } + "graceful-fs": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", + "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==" } } }, "jest-jasmine2": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-24.9.0.tgz", - "integrity": "sha512-Cq7vkAgaYKp+PsX+2/JbTarrk0DmNhsEtqBXNwUHkdlbrTBLtMJINADf2mf5FkowNsq8evbPc07/qFO0AdKTzw==", + "version": "26.6.1", + "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-26.6.1.tgz", + "integrity": "sha512-2uYdT32o/ZzSxYAPduAgokO8OlAL1YdG/9oxcEY138EDNpIK5XRRJDaGzTZdIBWSxk0aR8XxN44FvfXtHB+Fiw==", "requires": { "@babel/traverse": "^7.1.0", - "@jest/environment": "^24.9.0", - "@jest/test-result": "^24.9.0", - "@jest/types": "^24.9.0", - "chalk": "^2.0.1", + "@jest/environment": "^26.6.1", + "@jest/source-map": "^26.5.0", + "@jest/test-result": "^26.6.1", + "@jest/types": "^26.6.1", + "@types/node": "*", + "chalk": "^4.0.0", "co": "^4.6.0", - "expect": "^24.9.0", + "expect": "^26.6.1", "is-generator-fn": "^2.0.0", - "jest-each": "^24.9.0", - "jest-matcher-utils": "^24.9.0", - "jest-message-util": "^24.9.0", - "jest-runtime": "^24.9.0", - "jest-snapshot": "^24.9.0", - "jest-util": "^24.9.0", - "pretty-format": "^24.9.0", - "throat": "^4.0.0" + "jest-each": "^26.6.1", + "jest-matcher-utils": "^26.6.1", + "jest-message-util": "^26.6.1", + "jest-runtime": "^26.6.1", + "jest-snapshot": "^26.6.1", + "jest-util": "^26.6.1", + "pretty-format": "^26.6.1", + "throat": "^5.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "requires": { + "has-flag": "^4.0.0" + } + } } }, "jest-leak-detector": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-24.9.0.tgz", - "integrity": "sha512-tYkFIDsiKTGwb2FG1w8hX9V0aUb2ot8zY/2nFg087dUageonw1zrLMP4W6zsRO59dPkTSKie+D4rhMuP9nRmrA==", + "version": "26.6.1", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-26.6.1.tgz", + "integrity": "sha512-j9ZOtJSJKlHjrs4aIxWjiQUjyrffPdiAQn2Iw0916w7qZE5Lk0T2KhIH6E9vfhzP6sw0Q0jtnLLb4vQ71o1HlA==", "requires": { - "jest-get-type": "^24.9.0", - "pretty-format": "^24.9.0" + "jest-get-type": "^26.3.0", + "pretty-format": "^26.6.1" } }, "jest-matcher-utils": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-24.9.0.tgz", - "integrity": "sha512-OZz2IXsu6eaiMAwe67c1T+5tUAtQyQx27/EMEkbFAGiw52tB9em+uGbzpcgYVpA8wl0hlxKPZxrly4CXU/GjHA==", + "version": "26.6.1", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-26.6.1.tgz", + "integrity": "sha512-9iu3zrsYlUnl8pByhREF9rr5eYoiEb1F7ymNKg6lJr/0qD37LWS5FSW/JcoDl8UdMX2+zAzabDs7sTO+QFKjCg==", "requires": { - "chalk": "^2.0.1", - "jest-diff": "^24.9.0", - "jest-get-type": "^24.9.0", - "pretty-format": "^24.9.0" + "chalk": "^4.0.0", + "jest-diff": "^26.6.1", + "jest-get-type": "^26.3.0", + "pretty-format": "^26.6.1" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "requires": { + "has-flag": "^4.0.0" + } + } } }, "jest-message-util": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-24.9.0.tgz", - "integrity": "sha512-oCj8FiZ3U0hTP4aSui87P4L4jC37BtQwUMqk+zk/b11FR19BJDeZsZAvIHutWnmtw7r85UmR3CEWZ0HWU2mAlw==", + "version": "26.6.1", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-26.6.1.tgz", + "integrity": "sha512-cqM4HnqncIebBNdTKrBoWR/4ufHTll0pK/FWwX0YasK+TlBQEMqw3IEdynuuOTjDPFO3ONlFn37280X48beByw==", "requires": { "@babel/code-frame": "^7.0.0", - "@jest/test-result": "^24.9.0", - "@jest/types": "^24.9.0", - "@types/stack-utils": "^1.0.1", - "chalk": "^2.0.1", - "micromatch": "^3.1.10", - "slash": "^2.0.0", - "stack-utils": "^1.0.1" + "@jest/types": "^26.6.1", + "@types/stack-utils": "^2.0.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.4", + "micromatch": "^4.0.2", + "slash": "^3.0.0", + "stack-utils": "^2.0.2" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "graceful-fs": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", + "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==" + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "requires": { + "has-flag": "^4.0.0" + } + } } }, "jest-mock": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-24.9.0.tgz", - "integrity": "sha512-3BEYN5WbSq9wd+SyLDES7AHnjH9A/ROBwmz7l2y+ol+NtSFO8DYiEBzoO1CeFc9a8DYy10EO4dDFVv/wN3zl1w==", + "version": "26.6.1", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-26.6.1.tgz", + "integrity": "sha512-my0lPTBu1awY8iVG62sB2sx9qf8zxNDVX+5aFgoB8Vbqjb6LqIOsfyFA8P1z6H2IsqMbvOX9oCJnK67Y3yUIMA==", "requires": { - "@jest/types": "^24.9.0" + "@jest/types": "^26.6.1", + "@types/node": "*" } }, "jest-pnp-resolver": { @@ -7571,218 +9332,881 @@ "integrity": "sha512-olV41bKSMm8BdnuMsewT4jqlZ8+3TCARAXjZGT9jcoSnrfUnRCqnMoF9XEeoWjbzObpqF9dRhHQj0Xb9QdF6/w==" }, "jest-regex-util": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-24.9.0.tgz", - "integrity": "sha512-05Cmb6CuxaA+Ys6fjr3PhvV3bGQmO+2p2La4hFbU+W5uOc479f7FdLXUWXw4pYMAhhSZIuKHwSXSu6CsSBAXQA==" + "version": "26.0.0", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-26.0.0.tgz", + "integrity": "sha512-Gv3ZIs/nA48/Zvjrl34bf+oD76JHiGDUxNOVgUjh3j890sblXryjY4rss71fPtD/njchl6PSE2hIhvyWa1eT0A==" }, "jest-resolve": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-24.9.0.tgz", - "integrity": "sha512-TaLeLVL1l08YFZAt3zaPtjiVvyy4oSA6CRe+0AFPPVX3Q/VI0giIWWoAvoS5L96vj9Dqxj4fB5p2qrHCmTU/MQ==", + "version": "26.6.0", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-26.6.0.tgz", + "integrity": "sha512-tRAz2bwraHufNp+CCmAD8ciyCpXCs1NQxB5EJAmtCFy6BN81loFEGWKzYu26Y62lAJJe4X4jg36Kf+NsQyiStQ==", "requires": { - "@jest/types": "^24.9.0", - "browser-resolve": "^1.11.3", - "chalk": "^2.0.1", - "jest-pnp-resolver": "^1.2.1", - "realpath-native": "^1.1.0" + "@jest/types": "^26.6.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.4", + "jest-pnp-resolver": "^1.2.2", + "jest-util": "^26.6.0", + "read-pkg-up": "^7.0.1", + "resolve": "^1.17.0", + "slash": "^3.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "graceful-fs": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", + "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==" + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "read-pkg": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", + "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", + "requires": { + "@types/normalize-package-data": "^2.4.0", + "normalize-package-data": "^2.5.0", + "parse-json": "^5.0.0", + "type-fest": "^0.6.0" + }, + "dependencies": { + "type-fest": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", + "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==" + } + } + }, + "read-pkg-up": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", + "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", + "requires": { + "find-up": "^4.1.0", + "read-pkg": "^5.2.0", + "type-fest": "^0.8.1" + } + }, + "resolve": { + "version": "1.18.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.18.1.tgz", + "integrity": "sha512-lDfCPaMKfOJXjy0dPayzPdF1phampNWr3qFCjAu+rw/qbQmr5jWH5xN2hwh9QKfw9E5v4hwV7A+jrCmL8yjjqA==", + "requires": { + "is-core-module": "^2.0.0", + "path-parse": "^1.0.6" + } + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "requires": { + "has-flag": "^4.0.0" + } + } } }, "jest-resolve-dependencies": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-24.9.0.tgz", - "integrity": "sha512-Fm7b6AlWnYhT0BXy4hXpactHIqER7erNgIsIozDXWl5dVm+k8XdGVe1oTg1JyaFnOxarMEbax3wyRJqGP2Pq+g==", + "version": "26.6.1", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-26.6.1.tgz", + "integrity": "sha512-MN6lufbZJ3RBfTnJesZtHu3hUCBqPdHRe2+FhIt0yiqJ3fMgzWRqMRQyN/d/QwOE7KXwAG2ekZutbPhuD7s51A==", "requires": { - "@jest/types": "^24.9.0", - "jest-regex-util": "^24.3.0", - "jest-snapshot": "^24.9.0" + "@jest/types": "^26.6.1", + "jest-regex-util": "^26.0.0", + "jest-snapshot": "^26.6.1" } }, "jest-runner": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-24.9.0.tgz", - "integrity": "sha512-KksJQyI3/0mhcfspnxxEOBueGrd5E4vV7ADQLT9ESaCzz02WnbdbKWIf5Mkaucoaj7obQckYPVX6JJhgUcoWWg==", + "version": "26.6.1", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-26.6.1.tgz", + "integrity": "sha512-DmpNGdgsbl5s0FGkmsInmqnmqCtliCSnjWA2TFAJS1m1mL5atwfPsf+uoZ8uYQ2X0uDj4NM+nPcDnUpbNTRMBA==", "requires": { - "@jest/console": "^24.7.1", - "@jest/environment": "^24.9.0", - "@jest/test-result": "^24.9.0", - "@jest/types": "^24.9.0", - "chalk": "^2.4.2", + "@jest/console": "^26.6.1", + "@jest/environment": "^26.6.1", + "@jest/test-result": "^26.6.1", + "@jest/types": "^26.6.1", + "@types/node": "*", + "chalk": "^4.0.0", + "emittery": "^0.7.1", "exit": "^0.1.2", - "graceful-fs": "^4.1.15", - "jest-config": "^24.9.0", - "jest-docblock": "^24.3.0", - "jest-haste-map": "^24.9.0", - "jest-jasmine2": "^24.9.0", - "jest-leak-detector": "^24.9.0", - "jest-message-util": "^24.9.0", - "jest-resolve": "^24.9.0", - "jest-runtime": "^24.9.0", - "jest-util": "^24.9.0", - "jest-worker": "^24.6.0", + "graceful-fs": "^4.2.4", + "jest-config": "^26.6.1", + "jest-docblock": "^26.0.0", + "jest-haste-map": "^26.6.1", + "jest-leak-detector": "^26.6.1", + "jest-message-util": "^26.6.1", + "jest-resolve": "^26.6.1", + "jest-runtime": "^26.6.1", + "jest-util": "^26.6.1", + "jest-worker": "^26.6.1", "source-map-support": "^0.5.6", - "throat": "^4.0.0" + "throat": "^5.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "graceful-fs": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", + "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==" + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "jest-resolve": { + "version": "26.6.1", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-26.6.1.tgz", + "integrity": "sha512-hiHfQH6rrcpAmw9xCQ0vD66SDuU+7ZulOuKwc4jpbmFFsz0bQG/Ib92K+9/489u5rVw0btr/ZhiHqBpmkbCvuQ==", + "requires": { + "@jest/types": "^26.6.1", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.4", + "jest-pnp-resolver": "^1.2.2", + "jest-util": "^26.6.1", + "read-pkg-up": "^7.0.1", + "resolve": "^1.18.1", + "slash": "^3.0.0" + } + }, + "read-pkg": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", + "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", + "requires": { + "@types/normalize-package-data": "^2.4.0", + "normalize-package-data": "^2.5.0", + "parse-json": "^5.0.0", + "type-fest": "^0.6.0" + }, + "dependencies": { + "type-fest": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", + "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==" + } + } + }, + "read-pkg-up": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", + "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", + "requires": { + "find-up": "^4.1.0", + "read-pkg": "^5.2.0", + "type-fest": "^0.8.1" + } + }, + "resolve": { + "version": "1.18.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.18.1.tgz", + "integrity": "sha512-lDfCPaMKfOJXjy0dPayzPdF1phampNWr3qFCjAu+rw/qbQmr5jWH5xN2hwh9QKfw9E5v4hwV7A+jrCmL8yjjqA==", + "requires": { + "is-core-module": "^2.0.0", + "path-parse": "^1.0.6" + } + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "requires": { + "has-flag": "^4.0.0" + } + } } }, "jest-runtime": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-24.9.0.tgz", - "integrity": "sha512-8oNqgnmF3v2J6PVRM2Jfuj8oX3syKmaynlDMMKQ4iyzbQzIG6th5ub/lM2bCMTmoTKM3ykcUYI2Pw9xwNtjMnw==", + "version": "26.6.1", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-26.6.1.tgz", + "integrity": "sha512-7uOCNeezXDWgjEyzYbRN2ViY7xNZzusNVGAMmU0UHRUNXuY4j4GBHKGMqPo/cBPZA9bSYp+lwK2DRRBU5Dv6YQ==", "requires": { - "@jest/console": "^24.7.1", - "@jest/environment": "^24.9.0", - "@jest/source-map": "^24.3.0", - "@jest/transform": "^24.9.0", - "@jest/types": "^24.9.0", - "@types/yargs": "^13.0.0", - "chalk": "^2.0.1", + "@jest/console": "^26.6.1", + "@jest/environment": "^26.6.1", + "@jest/fake-timers": "^26.6.1", + "@jest/globals": "^26.6.1", + "@jest/source-map": "^26.5.0", + "@jest/test-result": "^26.6.1", + "@jest/transform": "^26.6.1", + "@jest/types": "^26.6.1", + "@types/yargs": "^15.0.0", + "chalk": "^4.0.0", + "cjs-module-lexer": "^0.4.2", + "collect-v8-coverage": "^1.0.0", "exit": "^0.1.2", "glob": "^7.1.3", - "graceful-fs": "^4.1.15", - "jest-config": "^24.9.0", - "jest-haste-map": "^24.9.0", - "jest-message-util": "^24.9.0", - "jest-mock": "^24.9.0", - "jest-regex-util": "^24.3.0", - "jest-resolve": "^24.9.0", - "jest-snapshot": "^24.9.0", - "jest-util": "^24.9.0", - "jest-validate": "^24.9.0", - "realpath-native": "^1.1.0", - "slash": "^2.0.0", - "strip-bom": "^3.0.0", - "yargs": "^13.3.0" + "graceful-fs": "^4.2.4", + "jest-config": "^26.6.1", + "jest-haste-map": "^26.6.1", + "jest-message-util": "^26.6.1", + "jest-mock": "^26.6.1", + "jest-regex-util": "^26.0.0", + "jest-resolve": "^26.6.1", + "jest-snapshot": "^26.6.1", + "jest-util": "^26.6.1", + "jest-validate": "^26.6.1", + "slash": "^3.0.0", + "strip-bom": "^4.0.0", + "yargs": "^15.4.1" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "cliui": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", + "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", + "requires": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^6.2.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "graceful-fs": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", + "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==" + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" + }, + "jest-resolve": { + "version": "26.6.1", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-26.6.1.tgz", + "integrity": "sha512-hiHfQH6rrcpAmw9xCQ0vD66SDuU+7ZulOuKwc4jpbmFFsz0bQG/Ib92K+9/489u5rVw0btr/ZhiHqBpmkbCvuQ==", + "requires": { + "@jest/types": "^26.6.1", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.4", + "jest-pnp-resolver": "^1.2.2", + "jest-util": "^26.6.1", + "read-pkg-up": "^7.0.1", + "resolve": "^1.18.1", + "slash": "^3.0.0" + } + }, + "read-pkg": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", + "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", + "requires": { + "@types/normalize-package-data": "^2.4.0", + "normalize-package-data": "^2.5.0", + "parse-json": "^5.0.0", + "type-fest": "^0.6.0" + }, + "dependencies": { + "type-fest": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", + "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==" + } + } + }, + "read-pkg-up": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", + "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", + "requires": { + "find-up": "^4.1.0", + "read-pkg": "^5.2.0", + "type-fest": "^0.8.1" + } + }, + "resolve": { + "version": "1.18.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.18.1.tgz", + "integrity": "sha512-lDfCPaMKfOJXjy0dPayzPdF1phampNWr3qFCjAu+rw/qbQmr5jWH5xN2hwh9QKfw9E5v4hwV7A+jrCmL8yjjqA==", + "requires": { + "is-core-module": "^2.0.0", + "path-parse": "^1.0.6" + } + }, + "string-width": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", + "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==", + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.0" + } + }, + "strip-ansi": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "requires": { + "ansi-regex": "^5.0.0" + } + }, + "strip-bom": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", + "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==" + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "requires": { + "has-flag": "^4.0.0" + } + }, + "wrap-ansi": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + } + }, + "yargs": { + "version": "15.4.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", + "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", + "requires": { + "cliui": "^6.0.0", + "decamelize": "^1.2.0", + "find-up": "^4.1.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^4.2.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^18.1.2" + } + }, + "yargs-parser": { + "version": "18.1.3", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", + "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + } } }, "jest-serializer": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-24.9.0.tgz", - "integrity": "sha512-DxYipDr8OvfrKH3Kel6NdED3OXxjvxXZ1uIY2I9OFbGg+vUkkg7AGvi65qbhbWNPvDckXmzMPbK3u3HaDO49bQ==" + "version": "26.5.0", + "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-26.5.0.tgz", + "integrity": "sha512-+h3Gf5CDRlSLdgTv7y0vPIAoLgX/SI7T4v6hy+TEXMgYbv+ztzbg5PSN6mUXAT/hXYHvZRWm+MaObVfqkhCGxA==", + "requires": { + "@types/node": "*", + "graceful-fs": "^4.2.4" + }, + "dependencies": { + "graceful-fs": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", + "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==" + } + } }, "jest-snapshot": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-24.9.0.tgz", - "integrity": "sha512-uI/rszGSs73xCM0l+up7O7a40o90cnrk429LOiK3aeTvfC0HHmldbd81/B7Ix81KSFe1lwkbl7GnBGG4UfuDew==", + "version": "26.6.1", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-26.6.1.tgz", + "integrity": "sha512-JA7bZp7HRTIJYAi85pJ/OZ2eur2dqmwIToA5/6d7Mn90isGEfeF9FvuhDLLEczgKP1ihreBzrJ6Vr7zteP5JNA==", "requires": { "@babel/types": "^7.0.0", - "@jest/types": "^24.9.0", - "chalk": "^2.0.1", - "expect": "^24.9.0", - "jest-diff": "^24.9.0", - "jest-get-type": "^24.9.0", - "jest-matcher-utils": "^24.9.0", - "jest-message-util": "^24.9.0", - "jest-resolve": "^24.9.0", - "mkdirp": "^0.5.1", + "@jest/types": "^26.6.1", + "@types/babel__traverse": "^7.0.4", + "@types/prettier": "^2.0.0", + "chalk": "^4.0.0", + "expect": "^26.6.1", + "graceful-fs": "^4.2.4", + "jest-diff": "^26.6.1", + "jest-get-type": "^26.3.0", + "jest-haste-map": "^26.6.1", + "jest-matcher-utils": "^26.6.1", + "jest-message-util": "^26.6.1", + "jest-resolve": "^26.6.1", "natural-compare": "^1.4.0", - "pretty-format": "^24.9.0", - "semver": "^6.2.0" + "pretty-format": "^26.6.1", + "semver": "^7.3.2" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "graceful-fs": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", + "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==" + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "jest-resolve": { + "version": "26.6.1", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-26.6.1.tgz", + "integrity": "sha512-hiHfQH6rrcpAmw9xCQ0vD66SDuU+7ZulOuKwc4jpbmFFsz0bQG/Ib92K+9/489u5rVw0btr/ZhiHqBpmkbCvuQ==", + "requires": { + "@jest/types": "^26.6.1", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.4", + "jest-pnp-resolver": "^1.2.2", + "jest-util": "^26.6.1", + "read-pkg-up": "^7.0.1", + "resolve": "^1.18.1", + "slash": "^3.0.0" + } + }, + "read-pkg": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", + "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", + "requires": { + "@types/normalize-package-data": "^2.4.0", + "normalize-package-data": "^2.5.0", + "parse-json": "^5.0.0", + "type-fest": "^0.6.0" + }, + "dependencies": { + "type-fest": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", + "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==" + } + } + }, + "read-pkg-up": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", + "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", + "requires": { + "find-up": "^4.1.0", + "read-pkg": "^5.2.0", + "type-fest": "^0.8.1" + } + }, + "resolve": { + "version": "1.18.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.18.1.tgz", + "integrity": "sha512-lDfCPaMKfOJXjy0dPayzPdF1phampNWr3qFCjAu+rw/qbQmr5jWH5xN2hwh9QKfw9E5v4hwV7A+jrCmL8yjjqA==", + "requires": { + "is-core-module": "^2.0.0", + "path-parse": "^1.0.6" + } + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "requires": { + "has-flag": "^4.0.0" + } + } } }, "jest-util": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-24.9.0.tgz", - "integrity": "sha512-x+cZU8VRmOJxbA1K5oDBdxQmdq0OIdADarLxk0Mq+3XS4jgvhG/oKGWcIDCtPG0HgjxOYvF+ilPJQsAyXfbNOg==", + "version": "26.6.1", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-26.6.1.tgz", + "integrity": "sha512-xCLZUqVoqhquyPLuDXmH7ogceGctbW8SMyQVjD9o+1+NPWI7t0vO08udcFLVPLgKWcvc+zotaUv/RuaR6l8HIA==", "requires": { - "@jest/console": "^24.9.0", - "@jest/fake-timers": "^24.9.0", - "@jest/source-map": "^24.9.0", - "@jest/test-result": "^24.9.0", - "@jest/types": "^24.9.0", - "callsites": "^3.0.0", - "chalk": "^2.0.1", - "graceful-fs": "^4.1.15", + "@jest/types": "^26.6.1", + "@types/node": "*", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.4", "is-ci": "^2.0.0", - "mkdirp": "^0.5.1", - "slash": "^2.0.0", - "source-map": "^0.6.0" + "micromatch": "^4.0.2" }, "dependencies": { - "callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==" + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "graceful-fs": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", + "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==" + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "requires": { + "has-flag": "^4.0.0" + } } } }, "jest-validate": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-24.9.0.tgz", - "integrity": "sha512-HPIt6C5ACwiqSiwi+OfSSHbK8sG7akG8eATl+IPKaeIjtPOeBUd/g3J7DghugzxrGjI93qS/+RPKe1H6PqvhRQ==", + "version": "26.6.1", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-26.6.1.tgz", + "integrity": "sha512-BEFpGbylKocnNPZULcnk+TGaz1oFZQH/wcaXlaXABbu0zBwkOGczuWgdLucUouuQqn7VadHZZeTvo8VSFDLMOA==", "requires": { - "@jest/types": "^24.9.0", - "camelcase": "^5.3.1", - "chalk": "^2.0.1", - "jest-get-type": "^24.9.0", + "@jest/types": "^26.6.1", + "camelcase": "^6.0.0", + "chalk": "^4.0.0", + "jest-get-type": "^26.3.0", "leven": "^3.1.0", - "pretty-format": "^24.9.0" + "pretty-format": "^26.6.1" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "color-convert": "^2.0.1" + } + }, + "camelcase": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.1.0.tgz", + "integrity": "sha512-WCMml9ivU60+8rEJgELlFp1gxFcEGxwYleE3bziHEDeqsqAWGHdimB7beBFGjLzVNgPGyDsfgXLQEYMpmIFnVQ==" + }, + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "requires": { + "has-flag": "^4.0.0" + } + } } }, "jest-watch-typeahead": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/jest-watch-typeahead/-/jest-watch-typeahead-0.4.2.tgz", - "integrity": "sha512-f7VpLebTdaXs81rg/oj4Vg/ObZy2QtGzAmGLNsqUS5G5KtSN68tFcIsbvNODfNyQxU78g7D8x77o3bgfBTR+2Q==", + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/jest-watch-typeahead/-/jest-watch-typeahead-0.6.1.tgz", + "integrity": "sha512-ITVnHhj3Jd/QkqQcTqZfRgjfyRhDFM/auzgVo2RKvSwi18YMvh0WvXDJFoFED6c7jd/5jxtu4kSOb9PTu2cPVg==", "requires": { - "ansi-escapes": "^4.2.1", - "chalk": "^2.4.1", - "jest-regex-util": "^24.9.0", - "jest-watcher": "^24.3.0", + "ansi-escapes": "^4.3.1", + "chalk": "^4.0.0", + "jest-regex-util": "^26.0.0", + "jest-watcher": "^26.3.0", "slash": "^3.0.0", - "string-length": "^3.1.0", - "strip-ansi": "^5.0.0" + "string-length": "^4.0.1", + "strip-ansi": "^6.0.0" }, "dependencies": { - "slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==" - }, - "string-length": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-length/-/string-length-3.1.0.tgz", - "integrity": "sha512-Ttp5YvkGm5v9Ijagtaz1BnN+k9ObpvS0eIBblPMp2YWL8FBmi9qblQ9fexc2k/CXFgrTIteU3jAw3payCnwSTA==", + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "requires": { - "astral-regex": "^1.0.0", - "strip-ansi": "^5.2.0" + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "strip-ansi": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "requires": { + "ansi-regex": "^5.0.0" + } + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "requires": { + "has-flag": "^4.0.0" } } } }, "jest-watcher": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-24.9.0.tgz", - "integrity": "sha512-+/fLOfKPXXYJDYlks62/4R4GoT+GU1tYZed99JSCOsmzkkF7727RqKrjNAxtfO4YpGv11wybgRvCjR73lK2GZw==", + "version": "26.6.1", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-26.6.1.tgz", + "integrity": "sha512-0LBIPPncNi9CaLKK15bnxyd2E8OMl4kJg0PTiNOI+MXztXw1zVdtX/x9Pr6pXaQYps+eS/ts43O4+HByZ7yJSw==", "requires": { - "@jest/test-result": "^24.9.0", - "@jest/types": "^24.9.0", - "@types/yargs": "^13.0.0", - "ansi-escapes": "^3.0.0", - "chalk": "^2.0.1", - "jest-util": "^24.9.0", - "string-length": "^2.0.0" + "@jest/test-result": "^26.6.1", + "@jest/types": "^26.6.1", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "jest-util": "^26.6.1", + "string-length": "^4.0.1" }, "dependencies": { - "ansi-escapes": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz", - "integrity": "sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==" + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "requires": { + "has-flag": "^4.0.0" + } } } }, "jest-worker": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-24.9.0.tgz", - "integrity": "sha512-51PE4haMSXcHohnSMdM42anbvZANYTqMrr52tVKPqqsPJMzoP6FYYDVqahX/HrAoKEKz3uUPzSvKs9A3qR4iVw==", + "version": "26.6.1", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-26.6.1.tgz", + "integrity": "sha512-R5IE3qSGz+QynJx8y+ICEkdI2OJ3RJjRQVEyCcFAd3yVhQSEtquziPO29Mlzgn07LOVE8u8jhJ1FqcwegiXWOw==", "requires": { + "@types/node": "*", "merge-stream": "^2.0.0", - "supports-color": "^6.1.0" + "supports-color": "^7.0.0" }, "dependencies": { + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "requires": { - "has-flag": "^3.0.0" + "has-flag": "^4.0.0" } } } @@ -7817,42 +10241,75 @@ "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=" }, "jsdom": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-11.12.0.tgz", - "integrity": "sha512-y8Px43oyiBM13Zc1z780FrfNLJCXTL40EWlty/LXUtcjykRBNgLlCjWXpfSPBl2iv+N7koQN+dvqszHZgT/Fjw==", + "version": "16.4.0", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-16.4.0.tgz", + "integrity": "sha512-lYMm3wYdgPhrl7pDcRmvzPhhrGVBeVhPIqeHjzeiHN3DFmD1RBpbExbi8vU7BJdH8VAZYovR8DMt0PNNDM7k8w==", "requires": { - "abab": "^2.0.0", - "acorn": "^5.5.3", - "acorn-globals": "^4.1.0", - "array-equal": "^1.0.0", - "cssom": ">= 0.3.2 < 0.4.0", - "cssstyle": "^1.0.0", - "data-urls": "^1.0.0", - "domexception": "^1.0.1", - "escodegen": "^1.9.1", - "html-encoding-sniffer": "^1.0.2", - "left-pad": "^1.3.0", - "nwsapi": "^2.0.7", - "parse5": "4.0.0", - "pn": "^1.1.0", - "request": "^2.87.0", - "request-promise-native": "^1.0.5", - "sax": "^1.2.4", - "symbol-tree": "^3.2.2", - "tough-cookie": "^2.3.4", - "w3c-hr-time": "^1.0.1", - "webidl-conversions": "^4.0.2", - "whatwg-encoding": "^1.0.3", - "whatwg-mimetype": "^2.1.0", - "whatwg-url": "^6.4.1", - "ws": "^5.2.0", + "abab": "^2.0.3", + "acorn": "^7.1.1", + "acorn-globals": "^6.0.0", + "cssom": "^0.4.4", + "cssstyle": "^2.2.0", + "data-urls": "^2.0.0", + "decimal.js": "^10.2.0", + "domexception": "^2.0.1", + "escodegen": "^1.14.1", + "html-encoding-sniffer": "^2.0.1", + "is-potential-custom-element-name": "^1.0.0", + "nwsapi": "^2.2.0", + "parse5": "5.1.1", + "request": "^2.88.2", + "request-promise-native": "^1.0.8", + "saxes": "^5.0.0", + "symbol-tree": "^3.2.4", + "tough-cookie": "^3.0.1", + "w3c-hr-time": "^1.0.2", + "w3c-xmlserializer": "^2.0.0", + "webidl-conversions": "^6.1.0", + "whatwg-encoding": "^1.0.5", + "whatwg-mimetype": "^2.3.0", + "whatwg-url": "^8.0.0", + "ws": "^7.2.3", "xml-name-validator": "^3.0.0" }, "dependencies": { - "acorn": { - "version": "5.7.4", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.7.4.tgz", - "integrity": "sha512-1D++VG7BhrtvQpNbBzovKNc1FLGGEE/oGe7b9xJm/RFHMBeUaUGpluV9RLjZa47YFdPcDAenEYuq9pQPcMdLJg==" + "request": { + "version": "2.88.2", + "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", + "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", + "requires": { + "aws-sign2": "~0.7.0", + "aws4": "^1.8.0", + "caseless": "~0.12.0", + "combined-stream": "~1.0.6", + "extend": "~3.0.2", + "forever-agent": "~0.6.1", + "form-data": "~2.3.2", + "har-validator": "~5.1.3", + "http-signature": "~1.2.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.19", + "oauth-sign": "~0.9.0", + "performance-now": "^2.1.0", + "qs": "~6.5.2", + "safe-buffer": "^5.1.2", + "tough-cookie": "~2.5.0", + "tunnel-agent": "^0.6.0", + "uuid": "^3.3.2" + }, + "dependencies": { + "tough-cookie": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", + "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", + "requires": { + "psl": "^1.1.28", + "punycode": "^2.1.1" + } + } + } } } }, @@ -7867,9 +10324,9 @@ "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==" }, "json-parse-even-better-errors": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.0.tgz", - "integrity": "sha512-o3aP+RsWDJZayj1SbHNQAI8x0v3T3SKiGoZlNYfbUP1S3omJQ6i9CnqADqkSPaOAxwua4/1YWx5CM7oiChJt2Q==" + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==" }, "json-schema": { "version": "0.2.3", @@ -7881,14 +10338,6 @@ "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" }, - "json-stable-stringify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz", - "integrity": "sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8=", - "requires": { - "jsonify": "~0.0.0" - } - }, "json-stable-stringify-without-jsonify": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", @@ -7913,18 +10362,14 @@ } }, "jsonfile": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", - "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.0.1.tgz", + "integrity": "sha512-jR2b5v7d2vIOust+w3wtFKZIfpC2pnRmFAhAC/BuweZFQR8qZzxH1OyrQ10HmdVYiXWkYUqPVsz91cG7EL2FBg==", "requires": { - "graceful-fs": "^4.1.6" + "graceful-fs": "^4.1.6", + "universalify": "^1.0.0" } }, - "jsonify": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz", - "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=" - }, "jsprim": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", @@ -7937,12 +10382,12 @@ } }, "jsx-ast-utils": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-2.4.1.tgz", - "integrity": "sha512-z1xSldJ6imESSzOjd3NNkieVJKRlKYSOtMG8SFyCj2FIrvSaSuli/WjpBkEzCBoR9bYYYFgqJw61Xhu7Lcgk+w==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.1.0.tgz", + "integrity": "sha512-d4/UOjg+mxAWxCiF0c5UTSwyqbchkbqCvK87aBovhnh8GtysTjWmgC63tY0cJx/HzGgm9qnA147jVBdpOiQ2RA==", "requires": { "array-includes": "^3.1.1", - "object.assign": "^4.1.0" + "object.assign": "^4.1.1" } }, "jszip": { @@ -7974,6 +10419,19 @@ "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==" }, + "language-subtag-registry": { + "version": "0.3.20", + "resolved": "https://registry.npmjs.org/language-subtag-registry/-/language-subtag-registry-0.3.20.tgz", + "integrity": "sha512-KPMwROklF4tEx283Xw0pNKtfTj1gZ4UByp4EsIFWLgBavJltF4TiYPc39k06zSTsLzxTVXXDSpbwaQXaFB4Qeg==" + }, + "language-tags": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/language-tags/-/language-tags-1.0.5.tgz", + "integrity": "sha1-0yHbxNowuovzAk4ED6XBRmH5GTo=", + "requires": { + "language-subtag-registry": "~0.3.2" + } + }, "last-call-webpack-plugin": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/last-call-webpack-plugin/-/last-call-webpack-plugin-3.0.0.tgz", @@ -7988,31 +10446,18 @@ "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz", "integrity": "sha1-odePw6UEdMuAhF07O24dpJpEbo4=" }, - "left-pad": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/left-pad/-/left-pad-1.3.0.tgz", - "integrity": "sha512-XI5MPzVNApjAyhQzphX8BkmKsKUxD4LdyK24iZeQGinBN9yTQT3bFlCBy/aVx2HrNcqQGsdot8ghrjyrvMCoEA==" - }, "leven": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==" }, - "levenary": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/levenary/-/levenary-1.1.1.tgz", - "integrity": "sha512-mkAdOIt79FD6irqjYSs4rdbnlT5vRonMEvBVPVb3XmevfS8kgRXwfes0dhPdEtzTWD/1eNE/Bm/G1iRt6DcnQQ==", - "requires": { - "leven": "^3.1.0" - } - }, "levn": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", - "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", "requires": { - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2" + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" } }, "libcimsvg": { @@ -8027,65 +10472,53 @@ "immediate": "~3.0.5" } }, + "line-column": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/line-column/-/line-column-1.0.2.tgz", + "integrity": "sha1-0lryk2tvSEkXKzEuR5LR2Ye8NKI=", + "requires": { + "isarray": "^1.0.0", + "isobject": "^2.0.0" + }, + "dependencies": { + "isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "requires": { + "isarray": "1.0.0" + } + } + } + }, "lines-and-columns": { "version": "1.1.6", "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.1.6.tgz", "integrity": "sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA=" }, "load-json-file": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", - "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz", + "integrity": "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=", "requires": { "graceful-fs": "^4.1.2", - "parse-json": "^4.0.0", - "pify": "^3.0.0", + "parse-json": "^2.2.0", + "pify": "^2.0.0", "strip-bom": "^3.0.0" - } - }, - "loader-fs-cache": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/loader-fs-cache/-/loader-fs-cache-1.0.3.tgz", - "integrity": "sha512-ldcgZpjNJj71n+2Mf6yetz+c9bM4xpKtNds4LbqXzU/PTdeAX0g3ytnU1AJMEcTk2Lex4Smpe3Q/eCTsvUBxbA==", - "requires": { - "find-cache-dir": "^0.1.1", - "mkdirp": "^0.5.1" }, "dependencies": { - "find-cache-dir": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-0.1.1.tgz", - "integrity": "sha1-yN765XyKUqinhPnjHFfHQumToLk=", + "parse-json": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", + "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", "requires": { - "commondir": "^1.0.1", - "mkdirp": "^0.5.1", - "pkg-dir": "^1.0.0" + "error-ex": "^1.2.0" } }, - "find-up": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", - "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", - "requires": { - "path-exists": "^2.0.0", - "pinkie-promise": "^2.0.0" - } - }, - "path-exists": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", - "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", - "requires": { - "pinkie-promise": "^2.0.0" - } - }, - "pkg-dir": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-1.0.0.tgz", - "integrity": "sha1-ektQio1bstYp1EcFb/TpyTFM89Q=", - "requires": { - "find-up": "^1.0.0" - } + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=" } } }, @@ -8095,32 +10528,21 @@ "integrity": "sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw==" }, "loader-utils": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", - "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.0.tgz", + "integrity": "sha512-rP4F0h2RaWSvPEkD7BLDFQnvSf+nK+wr3ESUjNTyAGobqrijmW92zc+SO6d4p4B1wh7+B/Jg1mkQe5NYUEHtHQ==", "requires": { "big.js": "^5.2.2", "emojis-list": "^3.0.0", - "json5": "^1.0.1" - }, - "dependencies": { - "json5": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", - "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", - "requires": { - "minimist": "^1.2.0" - } - } + "json5": "^2.1.2" } }, "locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", "requires": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" + "p-locate": "^4.1.0" } }, "lodash": { @@ -8181,9 +10603,9 @@ "integrity": "sha1-0CJTc662Uq3BvILklFM5qEJ1R3M=" }, "loglevel": { - "version": "1.6.8", - "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.6.8.tgz", - "integrity": "sha512-bsU7+gc9AJ2SqpzxwU3+1fedl8zAntbtC5XYlt3s2j1hJcn2PsXSmgN8TaLG/J1/2mod4+cE/3vNL70/c1RNCA==" + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.7.0.tgz", + "integrity": "sha512-i2sY04nal5jDcagM3FMfG++T69GEEM8CYuOfeOIvmXzOIcwE9a/CJPR0MFM97pYMj/u10lzz7/zd7+qwhrBTqQ==" }, "loose-envify": { "version": "1.4.0", @@ -8211,18 +10633,19 @@ } }, "lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", "requires": { - "yallist": "^3.0.2" - }, - "dependencies": { - "yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" - } + "yallist": "^4.0.0" + } + }, + "magic-string": { + "version": "0.25.7", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.7.tgz", + "integrity": "sha512-4CrMT5DOHTDk4HYDlzmwu4FVCcIYI8gauveasrdCu2IKIFOJ3f0v/8MDGJCDL9oD2ppz/Av1b0Nj345H9M+XIA==", + "requires": { + "sourcemap-codec": "^1.4.4" } }, "make-dir": { @@ -8234,11 +10657,6 @@ "semver": "^5.6.0" }, "dependencies": { - "pify": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", - "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==" - }, "semver": { "version": "5.7.1", "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", @@ -8254,11 +10672,6 @@ "tmpl": "1.0.x" } }, - "mamacro": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/mamacro/-/mamacro-0.0.3.tgz", - "integrity": "sha512-qMEwh+UujcQ+kbz3T6V+wAmO2U8veoq2w+3wY8MquqwVA3jChfwY+Tk52GZKDfACEPjuZ7r2oJLejwpt8jtwTA==" - }, "map-cache": { "version": "0.2.2", "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", @@ -8445,30 +10858,12 @@ "integrity": "sha512-jo1OfR4TaEwd5HOrt5+tAZ9mqT4jmpNAusXtyfNzqVm9uiSYFZlKM1wYL4oU7azZW/PxQW53wM0S6OR1JHNa2g==" }, "micromatch": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", - "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", + "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", "requires": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "braces": "^2.3.1", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "extglob": "^2.0.4", - "fragment-cache": "^0.2.1", - "kind-of": "^6.0.2", - "nanomatch": "^1.2.9", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==" - } + "braces": "^3.0.1", + "picomatch": "^2.0.5" } }, "miller-rabin": { @@ -8520,9 +10915,9 @@ } }, "mini-css-extract-plugin": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-0.9.0.tgz", - "integrity": "sha512-lp3GeY7ygcgAmVIcRPBVhIkf8Us7FZjA+ILpal44qLdSu11wmjKQ3d9k15lfD7pO4esu9eUIAW7qiYIBppv40A==", + "version": "0.11.3", + "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-0.11.3.tgz", + "integrity": "sha512-n9BA8LonkOkW1/zn+IbLPQmovsL0wMb9yx75fMJQZf2X1Zoec9yTZtyMePcyu19wPkmFbzZZA6fLTotpFhQsOA==", "requires": { "loader-utils": "^1.1.0", "normalize-url": "1.9.1", @@ -8530,6 +10925,24 @@ "webpack-sources": "^1.1.0" }, "dependencies": { + "json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "requires": { + "minimist": "^1.2.0" + } + }, + "loader-utils": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", + "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^1.0.1" + } + }, "schema-utils": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", @@ -8597,6 +11010,15 @@ "minipass": "^3.0.0" } }, + "minizlib": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", + "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", + "requires": { + "minipass": "^3.0.0", + "yallist": "^4.0.0" + } + }, "mississippi": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/mississippi/-/mississippi-3.0.0.tgz", @@ -8658,9 +11080,9 @@ } }, "moment": { - "version": "2.27.0", - "resolved": "https://registry.npmjs.org/moment/-/moment-2.27.0.tgz", - "integrity": "sha512-al0MUK7cpIcglMv3YF13qSgdAIqxHTO7brRtaz3DlSULbqfazqkc5kEjNrLDOM7fsjshoFIihnU8snrP7zUvhQ==" + "version": "2.29.1", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.1.tgz", + "integrity": "sha512-kHmoybcPV8Sqy59DwNDY3Jefr64lK/by/da0ViFcuA4DH0vQg5Q6Ze5VimxkfQNSC+Mls/Kx53s7TjP1RhFEDQ==" }, "move-concurrently": { "version": "1.0.1", @@ -8695,9 +11117,9 @@ "integrity": "sha1-iZ8R2WhuXgXLkbNdXw5jt3PPyQE=" }, "multiselect-react-dropdown": { - "version": "1.5.7", - "resolved": "https://registry.npmjs.org/multiselect-react-dropdown/-/multiselect-react-dropdown-1.5.7.tgz", - "integrity": "sha512-bDlXYEzpV/5p5G5nIFRrZ/Ndf8CSYWliZ62n/5imfjLy0K2/dNx6sFmk4W/Phq83bzPUDK/RI4553yCk6YzZwg==", + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/multiselect-react-dropdown/-/multiselect-react-dropdown-1.6.1.tgz", + "integrity": "sha512-jFCaK2CWu5SRbFiXKOzA89VajQulO/1hg0h6XfuGPZBtIyCkkWoQL2GFOfJUIHane8KfJxr+xA8Ld6iZ+WP2fA==", "requires": { "react": "^16.7.0", "react-dom": "^16.7.0" @@ -8713,6 +11135,11 @@ "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.0.tgz", "integrity": "sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg==" }, + "nanoid": { + "version": "3.1.16", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.1.16.tgz", + "integrity": "sha512-+AK8MN0WHji40lj8AEuwLOvLSbWYApQpre/aFJZD71r43wVRLrOYS4FmJOPQYon1TqB462RzrrxlfA74XRES8w==" + }, "nanomatch": { "version": "1.2.13", "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", @@ -8738,6 +11165,14 @@ } } }, + "native-url": { + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/native-url/-/native-url-0.2.6.tgz", + "integrity": "sha512-k4bDC87WtgrdD362gZz6zoiXQrl40kYlBmpfmSjwRO1VU0V5ccwJTlxuE72F6m3V0vc1xOf6n3UCP9QyerRqmA==", + "requires": { + "querystring": "^0.2.0" + } + }, "natural-compare": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", @@ -8847,23 +11282,10 @@ "vm-browserify": "^1.0.1" }, "dependencies": { - "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" - }, "punycode": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=" - }, - "util": { - "version": "0.11.1", - "resolved": "https://registry.npmjs.org/util/-/util-0.11.1.tgz", - "integrity": "sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ==", - "requires": { - "inherits": "2.0.3" - } } } }, @@ -8873,28 +11295,40 @@ "integrity": "sha1-jZ2+KJZKSsVxLpExZCEHxx6Q7EA=" }, "node-notifier": { - "version": "5.4.3", - "resolved": "https://registry.npmjs.org/node-notifier/-/node-notifier-5.4.3.tgz", - "integrity": "sha512-M4UBGcs4jeOK9CjTsYwkvH6/MzuUmGCyTW+kCY7uO+1ZVr0+FHGdPdIf5CCLqAaxnRrWidyoQlNkMIIVwbKB8Q==", + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/node-notifier/-/node-notifier-8.0.0.tgz", + "integrity": "sha512-46z7DUmcjoYdaWyXouuFNNfUo6eFa94t23c53c+lG/9Cvauk4a98rAUp9672X5dxGdQmLpPzTxzu8f/OeEPaFA==", + "optional": true, "requires": { "growly": "^1.3.0", - "is-wsl": "^1.1.0", - "semver": "^5.5.0", + "is-wsl": "^2.2.0", + "semver": "^7.3.2", "shellwords": "^0.1.1", - "which": "^1.3.0" + "uuid": "^8.3.0", + "which": "^2.0.2" }, "dependencies": { - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" + "uuid": { + "version": "8.3.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.1.tgz", + "integrity": "sha512-FOmRr+FmWEIG8uhZv6C2bTgEVXsHk08kE7mPlrBbEe+c3r9pjceVPgupIfNIhc4yx55H69OXANrUaSuu9eInKg==", + "optional": true + }, + "which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "optional": true, + "requires": { + "isexe": "^2.0.0" + } } } }, "node-releases": { - "version": "1.1.60", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.60.tgz", - "integrity": "sha512-gsO4vjEdQaTusZAEebUWp2a5d7dF5DYoIpDG7WySnk7BuZDW+GPpHXoXXuYawRBr/9t5q54tirPz79kFIWg4dA==" + "version": "1.1.64", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.64.tgz", + "integrity": "sha512-Iec8O9166/x2HRMJyLLLWkd0sFFLrFNy+Xf+JQfSQsdBJzPcHpNl3JQ9gD4j+aJxmCa25jNsIbM4bmACtSbkSg==" }, "node-sass": { "version": "4.14.1", @@ -9007,12 +11441,9 @@ } }, "normalize-path": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", - "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", - "requires": { - "remove-trailing-separator": "^1.0.1" - } + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==" }, "normalize-range": { "version": "0.1.2", @@ -9102,23 +11533,18 @@ } } }, - "object-hash": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-2.0.3.tgz", - "integrity": "sha512-JPKn0GMu+Fa3zt3Bmr66JhokJU5BaNBIh4ZeTlaCBzrBsOeXzwcKKAK1tbLiPKgvwmPXsDvvLHoWh5Bm7ofIYg==" - }, "object-inspect": { "version": "1.8.0", "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.8.0.tgz", "integrity": "sha512-jLdtEOB112fORuypAyl/50VRVIBIdVQOSUUGQHzJ4xBSbit81zRarz7GThkEFZy1RceYrWYcPcBFPQwHyAc1gA==" }, "object-is": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.2.tgz", - "integrity": "sha512-5lHCz+0uufF6wZ7CRFWJN3hp8Jqblpgve06U5CMQ3f//6iDjPr2PEo9MWCjEssDsa+UZEL4PkFpr+BMop6aKzQ==", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.3.tgz", + "integrity": "sha512-teyqLvFWzLkq5B9ki8FVWA902UER2qkxmdA4nLf+wjOLAWgxzCWZNCxpDq9MvE8MmhWNr+I8w3BN49Vx36Y6Xg==", "requires": { "define-properties": "^1.1.3", - "es-abstract": "^1.17.5" + "es-abstract": "^1.18.0-next.1" } }, "object-keys": { @@ -9126,11 +11552,6 @@ "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==" }, - "object-path": { - "version": "0.11.4", - "resolved": "https://registry.npmjs.org/object-path/-/object-path-0.11.4.tgz", - "integrity": "sha1-NwrnUvvzfePqcKhhwju6iRVpGUk=" - }, "object-visit": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", @@ -9140,14 +11561,14 @@ } }, "object.assign": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz", - "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.1.tgz", + "integrity": "sha512-VT/cxmx5yaoHSOTSyrCygIDFco+RsibY2NM0a4RdEeY/4KgqezwFtK1yr3U67xYhqJSlASm2pKhLVzPj2lr4bA==", "requires": { - "define-properties": "^1.1.2", - "function-bind": "^1.1.1", - "has-symbols": "^1.0.0", - "object-keys": "^1.0.11" + "define-properties": "^1.1.3", + "es-abstract": "^1.18.0-next.0", + "has-symbols": "^1.0.1", + "object-keys": "^1.1.1" } }, "object.entries": { @@ -9158,6 +11579,26 @@ "define-properties": "^1.1.3", "es-abstract": "^1.17.5", "has": "^1.0.3" + }, + "dependencies": { + "es-abstract": { + "version": "1.17.7", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.7.tgz", + "integrity": "sha512-VBl/gnfcJ7OercKA9MVaegWsBHFjV492syMudcnQZvt/Dw8ezpcOHYZXa/J96O8vx+g4x65YKhxOwDUh63aS5g==", + "requires": { + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1", + "is-callable": "^1.2.2", + "is-regex": "^1.1.1", + "object-inspect": "^1.8.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.1", + "string.prototype.trimend": "^1.0.1", + "string.prototype.trimstart": "^1.0.1" + } + } } }, "object.fromentries": { @@ -9169,6 +11610,26 @@ "es-abstract": "^1.17.0-next.1", "function-bind": "^1.1.1", "has": "^1.0.3" + }, + "dependencies": { + "es-abstract": { + "version": "1.17.7", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.7.tgz", + "integrity": "sha512-VBl/gnfcJ7OercKA9MVaegWsBHFjV492syMudcnQZvt/Dw8ezpcOHYZXa/J96O8vx+g4x65YKhxOwDUh63aS5g==", + "requires": { + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1", + "is-callable": "^1.2.2", + "is-regex": "^1.1.1", + "object-inspect": "^1.8.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.1", + "string.prototype.trimend": "^1.0.1", + "string.prototype.trimstart": "^1.0.1" + } + } } }, "object.getownpropertydescriptors": { @@ -9178,6 +11639,26 @@ "requires": { "define-properties": "^1.1.3", "es-abstract": "^1.17.0-next.1" + }, + "dependencies": { + "es-abstract": { + "version": "1.17.7", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.7.tgz", + "integrity": "sha512-VBl/gnfcJ7OercKA9MVaegWsBHFjV492syMudcnQZvt/Dw8ezpcOHYZXa/J96O8vx+g4x65YKhxOwDUh63aS5g==", + "requires": { + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1", + "is-callable": "^1.2.2", + "is-regex": "^1.1.1", + "object-inspect": "^1.8.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.1", + "string.prototype.trimend": "^1.0.1", + "string.prototype.trimstart": "^1.0.1" + } + } } }, "object.pick": { @@ -9197,6 +11678,26 @@ "es-abstract": "^1.17.0-next.1", "function-bind": "^1.1.1", "has": "^1.0.3" + }, + "dependencies": { + "es-abstract": { + "version": "1.17.7", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.7.tgz", + "integrity": "sha512-VBl/gnfcJ7OercKA9MVaegWsBHFjV492syMudcnQZvt/Dw8ezpcOHYZXa/J96O8vx+g4x65YKhxOwDUh63aS5g==", + "requires": { + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1", + "is-callable": "^1.2.2", + "is-regex": "^1.1.1", + "object-inspect": "^1.8.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.1", + "string.prototype.trimend": "^1.0.1", + "string.prototype.trimstart": "^1.0.1" + } + } } }, "obuf": { @@ -9234,22 +11735,12 @@ } }, "open": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/open/-/open-7.2.0.tgz", - "integrity": "sha512-4HeyhxCvBTI5uBePsAdi55C5fmqnWZ2e2MlmvWi5KW5tdH5rxoiv/aMtbeVxKZc3eWkT1GymMnLG8XC4Rq4TDQ==", + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/open/-/open-7.3.0.tgz", + "integrity": "sha512-mgLwQIx2F/ye9SmbrUkurZCnkoXyXyu9EbHtJZrICjVAJfyMArdHp3KkixGdZx1ZHFPNIwl0DDM1dFFqXbTLZw==", "requires": { "is-docker": "^2.0.0", "is-wsl": "^2.1.1" - }, - "dependencies": { - "is-wsl": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", - "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", - "requires": { - "is-docker": "^2.0.0" - } - } } }, "opn": { @@ -9258,28 +11749,35 @@ "integrity": "sha512-PqHpggC9bLV0VeWcdKhkpxY+3JTzetLSqTCWL/z/tFIbI6G8JCjondXklT1JinczLz2Xib62sSp0T/gKT4KksA==", "requires": { "is-wsl": "^1.1.0" + }, + "dependencies": { + "is-wsl": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", + "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=" + } } }, "optimize-css-assets-webpack-plugin": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/optimize-css-assets-webpack-plugin/-/optimize-css-assets-webpack-plugin-5.0.3.tgz", - "integrity": "sha512-q9fbvCRS6EYtUKKSwI87qm2IxlyJK5b4dygW1rKUBT6mMDhdG5e5bZT63v6tnJR9F9FB/H5a0HTmtw+laUBxKA==", + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/optimize-css-assets-webpack-plugin/-/optimize-css-assets-webpack-plugin-5.0.4.tgz", + "integrity": "sha512-wqd6FdI2a5/FdoiCNNkEvLeA//lHHfG24Ln2Xm2qqdIk4aOlsR18jwpyOihqQ8849W3qu2DX8fOYxpvTMj+93A==", "requires": { "cssnano": "^4.1.10", "last-call-webpack-plugin": "^3.0.0" } }, "optionator": { - "version": "0.8.3", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", - "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", + "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", "requires": { - "deep-is": "~0.1.3", - "fast-levenshtein": "~2.0.6", - "levn": "~0.3.0", - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2", - "word-wrap": "~1.2.3" + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.3" } }, "original": { @@ -9315,12 +11813,9 @@ } }, "p-each-series": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-each-series/-/p-each-series-1.0.0.tgz", - "integrity": "sha1-kw89Et0fUOdDRFeiLNbwSsatf3E=", - "requires": { - "p-reduce": "^1.0.0" - } + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/p-each-series/-/p-each-series-2.1.0.tgz", + "integrity": "sha512-ZuRs1miPT4HrjFa+9fRfOFXxGJfORgelKV9f9nNOWw2gl6gVsRaVDOQP0+MI0G0wGKns1Yacsu0GjOFbTK0JFQ==" }, "p-finally": { "version": "1.0.0", @@ -9336,26 +11831,21 @@ } }, "p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", "requires": { - "p-limit": "^2.0.0" + "p-limit": "^2.2.0" } }, "p-map": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-3.0.0.tgz", - "integrity": "sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", + "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", "requires": { "aggregate-error": "^3.0.0" } }, - "p-reduce": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-reduce/-/p-reduce-1.0.0.tgz", - "integrity": "sha1-GMKw3ZNqRpClKfgjH1ig/bakffo=" - }, "p-retry": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-3.0.1.tgz", @@ -9399,13 +11889,6 @@ "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", "requires": { "callsites": "^3.0.0" - }, - "dependencies": { - "callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==" - } } }, "parse-asn1": { @@ -9421,18 +11904,20 @@ } }, "parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.1.0.tgz", + "integrity": "sha512-+mi/lmVVNKFNVyLXV31ERiy2CY5E1/F6QtJFEzoChPRwwngMNXRDQ9GJ5WdE2Z2P4AujsOi0/+2qHID68KwfIQ==", "requires": { + "@babel/code-frame": "^7.0.0", "error-ex": "^1.3.1", - "json-parse-better-errors": "^1.0.1" + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" } }, "parse5": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-4.0.0.tgz", - "integrity": "sha512-VrZ7eOd3T1Fk4XWNXMgiGBK/z0MG48BWG2uQNU4I72fkQuKUTZpl+u9k+CxEG0twMVzSmXEEz12z5Fnw1jIQFA==" + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-5.1.1.tgz", + "integrity": "sha512-ugq4DFI0Ptb+WWjAdOK16+u/nHfiIrcE+sh8kZMaM0WllQKLI9rOUq6c2b7cwPkXdzfQESqvoqK6ug7U/Yyzug==" }, "parseurl": { "version": "1.3.3", @@ -9504,12 +11989,9 @@ } }, "path-type": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", - "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", - "requires": { - "pify": "^3.0.0" - } + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==" }, "pathval": { "version": "1.1.0", @@ -9540,9 +12022,9 @@ "integrity": "sha512-ISBaA8xQNmwELC7eOjqFKMESB2VIqt4PPDD0nsS95b/9dZXvVKOlz9keMSnoGGKcOHXfTvDD6WMaRoSc9UuhRA==" }, "pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=" + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==" }, "pinkie": { "version": "2.0.4", @@ -9571,6 +12053,33 @@ "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", "requires": { "find-up": "^3.0.0" + }, + "dependencies": { + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "requires": { + "locate-path": "^3.0.0" + } + }, + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "requires": { + "p-limit": "^2.0.0" + } + } } }, "pkg-up": { @@ -9579,13 +12088,35 @@ "integrity": "sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA==", "requires": { "find-up": "^3.0.0" + }, + "dependencies": { + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "requires": { + "locate-path": "^3.0.0" + } + }, + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "requires": { + "p-limit": "^2.0.0" + } + } } }, - "pn": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/pn/-/pn-1.1.0.tgz", - "integrity": "sha512-2qHaIQr2VLRFoxe2nASzsV6ef4yOOH+Fi9FBOVH6cqeSgUnoyySPZkxzLuzd+RYOQTRpROA0ztTMqxROKSb/nA==" - }, "pnp-webpack-plugin": { "version": "1.6.4", "resolved": "https://registry.npmjs.org/pnp-webpack-plugin/-/pnp-webpack-plugin-1.6.4.tgz", @@ -9625,9 +12156,9 @@ "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=" }, "postcss": { - "version": "7.0.32", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.32.tgz", - "integrity": "sha512-03eXong5NLnNCD05xscnGKGDZ98CyzoqPSMjOe6SuoQY7Z2hIj0Ld1g/O/UQRuOle2aRtiIRDg9tDcTGAkLfKw==", + "version": "7.0.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", + "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", "requires": { "chalk": "^2.4.2", "source-map": "^0.6.1", @@ -9662,9 +12193,9 @@ } }, "postcss-calc": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-7.0.3.tgz", - "integrity": "sha512-IB/EAEmZhIMEIhG7Ov4x+l47UaXOS1n2f4FBUk/aKllQhtSCxWhTzn0nJgkqN7fo/jcWySvWTSB6Syk9L+31bA==", + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-7.0.5.tgz", + "integrity": "sha512-1tKHutbGtLtEZF6PT4JSihCHfIVldU72mZ8SdZHIYriIZ9fh9k9aWSppaT8rHsyI3dX+KSR+W+Ix9BMY3AODrg==", "requires": { "postcss": "^7.0.27", "postcss-selector-parser": "^6.0.2", @@ -9873,11 +12404,11 @@ } }, "postcss-flexbugs-fixes": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/postcss-flexbugs-fixes/-/postcss-flexbugs-fixes-4.1.0.tgz", - "integrity": "sha512-jr1LHxQvStNNAHlgco6PzY308zvLklh7SJVYuWUwyUQncofaAlD2l+P/gxKHOdqWKe7xJSkVLFF/2Tp+JqMSZA==", + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/postcss-flexbugs-fixes/-/postcss-flexbugs-fixes-4.2.1.tgz", + "integrity": "sha512-9SiofaZ9CWpQWxOwRh1b/r85KD5y7GgvsNt1056k6OYLvWUun0czCvogfJgylC22uJTwW1KzY3Gz65NZRlvoiQ==", "requires": { - "postcss": "^7.0.0" + "postcss": "^7.0.26" } }, "postcss-focus-visible": { @@ -9941,12 +12472,48 @@ } }, "postcss-load-config": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-2.1.0.tgz", - "integrity": "sha512-4pV3JJVPLd5+RueiVVB+gFOAa7GWc25XQcMp86Zexzke69mKf6Nx9LRcQywdz7yZI9n1udOxmLuAwTBypypF8Q==", + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-2.1.2.tgz", + "integrity": "sha512-/rDeGV6vMUo3mwJZmeHfEDvwnTKKqQ0S7OHUi/kJvvtx3aWtyWG2/0ZWnzCt2keEclwN6Tf0DST2v9kITdOKYw==", "requires": { "cosmiconfig": "^5.0.0", "import-cwd": "^2.0.0" + }, + "dependencies": { + "cosmiconfig": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.2.1.tgz", + "integrity": "sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA==", + "requires": { + "import-fresh": "^2.0.0", + "is-directory": "^0.3.1", + "js-yaml": "^3.13.1", + "parse-json": "^4.0.0" + } + }, + "import-fresh": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-2.0.0.tgz", + "integrity": "sha1-2BNVwVYS04bGH53dOSLUMEgipUY=", + "requires": { + "caller-path": "^2.0.0", + "resolve-from": "^3.0.0" + } + }, + "parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", + "requires": { + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" + } + }, + "resolve-from": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", + "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=" + } } }, "postcss-loader": { @@ -9960,6 +12527,24 @@ "schema-utils": "^1.0.0" }, "dependencies": { + "json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "requires": { + "minimist": "^1.2.0" + } + }, + "loader-utils": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", + "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^1.0.1" + } + }, "schema-utils": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", @@ -10466,11 +13051,24 @@ } }, "postcss-safe-parser": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-safe-parser/-/postcss-safe-parser-4.0.1.tgz", - "integrity": "sha512-xZsFA3uX8MO3yAda03QrG3/Eg1LN3EPfjjf07vke/46HERLZyHrTsQ9E1r1w1W//fWEhtYNndo2hQplN2cVpCQ==", + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/postcss-safe-parser/-/postcss-safe-parser-5.0.2.tgz", + "integrity": "sha512-jDUfCPJbKOABhwpUKcqCVbbXiloe/QXMcbJ6Iipf3sDIihEzTqRCeMBfRaOHxhBuTYqtASrI1KJWxzztZU4qUQ==", "requires": { - "postcss": "^7.0.0" + "postcss": "^8.1.0" + }, + "dependencies": { + "postcss": { + "version": "8.1.4", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.1.4.tgz", + "integrity": "sha512-LfqcwgMq9LOd8pX7K2+r2HPitlIGC5p6PoZhVELlqhh2YGDVcXKpkCseqan73Hrdik6nBd2OvoDPUaP/oMj9hQ==", + "requires": { + "colorette": "^1.2.1", + "line-column": "^1.0.2", + "nanoid": "^3.1.15", + "source-map": "^0.6.1" + } + } } }, "postcss-selector-matches": { @@ -10492,13 +13090,14 @@ } }, "postcss-selector-parser": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.2.tgz", - "integrity": "sha512-36P2QR59jDTOAiIkqEprfJDsoNrvwFei3eCqKd1Y0tUsBimsq39BLp7RD+JWny3WgB1zGhJX8XVePwm9k4wdBg==", + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.4.tgz", + "integrity": "sha512-gjMeXBempyInaBqpp8gODmwZ52WaYsVOsfr4L4lDQ7n3ncD6mEyySiDtgzCT+NYC0mmeOLvtsF8iaEf0YT6dBw==", "requires": { "cssesc": "^3.0.0", "indexes-of": "^1.0.1", - "uniq": "^1.0.1" + "uniq": "^1.0.1", + "util-deprecate": "^1.0.2" } }, "postcss-svgo": { @@ -10545,9 +13144,9 @@ } }, "prelude-ls": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", - "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=" + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==" }, "prepend-http": { "version": "1.0.4", @@ -10555,34 +13154,55 @@ "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=" }, "pretty-bytes": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-5.3.0.tgz", - "integrity": "sha512-hjGrh+P926p4R4WbaB6OckyRtO0F0/lQBiT+0gnxjV+5kjPBrfVBFCsCLbMqVQeydvIoouYTCmmEURiH3R1Bdg==" + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-5.4.1.tgz", + "integrity": "sha512-s1Iam6Gwz3JI5Hweaz4GoCD1WUNUIyzePFy5+Js2hjwGVt2Z79wNN+ZKOZ2vB6C+Xs6njyB84Z1IthQg8d9LxA==" }, "pretty-error": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-2.1.1.tgz", - "integrity": "sha1-X0+HyPkeWuPzuoerTPXgOxoX8aM=", + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-2.1.2.tgz", + "integrity": "sha512-EY5oDzmsX5wvuynAByrmY0P0hcp+QpnAKbJng2A2MPjVKXCxrDSUkzghVJ4ZGPIv+JC4gX8fPUWscC0RtjsWGw==", "requires": { - "renderkid": "^2.0.1", - "utila": "~0.4" + "lodash": "^4.17.20", + "renderkid": "^2.0.4" } }, "pretty-format": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-24.9.0.tgz", - "integrity": "sha512-00ZMZUiHaJrNfk33guavqgvfJS30sLYf0f8+Srklv0AMPodGGHcoHgksZ3OThYnIvOd+8yMCn0YiEOogjlgsnA==", + "version": "26.6.1", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-26.6.1.tgz", + "integrity": "sha512-MeqqsP5PYcRBbGMvwzsyBdmAJ4EFX7pWFyl7x4+dMVg5pE0ZDdBIvEH2ergvIO+Gvwv1wh64YuOY9y5LuyY/GA==", "requires": { - "@jest/types": "^24.9.0", - "ansi-regex": "^4.0.0", - "ansi-styles": "^3.2.0", - "react-is": "^16.8.4" + "@jest/types": "^26.6.1", + "ansi-regex": "^5.0.0", + "ansi-styles": "^4.0.0", + "react-is": "^17.0.1" }, "dependencies": { - "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==" + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "color-convert": "^2.0.1" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "react-is": { + "version": "17.0.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.1.tgz", + "integrity": "sha512-NAnt2iGDXohE5LI7uBnLnqvLQMtzhkiAOLXTmv+qnF9Ky7xAPcX8Up/xWIhxvLVGJvuLiNc4xQLtuqDRzb4fSA==" } } }, @@ -10809,110 +13429,139 @@ } }, "rc-align": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/rc-align/-/rc-align-4.0.1.tgz", - "integrity": "sha512-RQ5Fhxl0LW+zsxbY8dxAcpXdaHkHH2jzRSSpvBTS7G9LMK3T+WRcn4ovjg/eqAESM6TdTx0hfqWF2S1pO75jxQ==", + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/rc-align/-/rc-align-4.0.8.tgz", + "integrity": "sha512-2sRUkmB8z4UEXzaS+lDHzXMoR8HrtKH9nn2yHlHVNyUTnaucjMFbdEoCk+hO1g7cpIgW0MphG8i0EH2scSesfw==", "requires": { "@babel/runtime": "^7.10.1", "classnames": "2.x", "dom-align": "^1.7.0", - "rc-util": "^5.0.1", + "rc-util": "^5.3.0", "resize-observer-polyfill": "^1.5.1" }, "dependencies": { "@babel/runtime": { - "version": "7.10.3", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.10.3.tgz", - "integrity": "sha512-RzGO0RLSdokm9Ipe/YD+7ww8X2Ro79qiXZF3HU9ljrM+qnJmH1Vqth+hbiQZy761LnMJTMitHDuKVYTk3k4dLw==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.12.1.tgz", + "integrity": "sha512-J5AIf3vPj3UwXaAzb5j1xM4WAQDX3EMgemF8rjCP3SoW09LfRKAXQKt6CoVYl230P6iWdRcBbnLDDdnqWxZSCA==", "requires": { "regenerator-runtime": "^0.13.4" } }, "regenerator-runtime": { - "version": "0.13.5", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.5.tgz", - "integrity": "sha512-ZS5w8CpKFinUzOwW3c83oPeVXoNsrLsaCoLtJvAClH135j/R77RuymhiSErhm2lKcwSCIpmvIWSbDkIfAqKQlA==" + "version": "0.13.7", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz", + "integrity": "sha512-a54FxoJDIr27pgf7IgeQGxmqUNYrcV338lf/6gH456HZ/PhX+5BcwHXG9ajESmwe6WRO0tAzRUrRmNONWgkrew==" } } }, - "rc-animate": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/rc-animate/-/rc-animate-3.1.0.tgz", - "integrity": "sha512-8FsM+3B1H+0AyTyGggY6JyVldHTs1CyYT8CfTmG/nGHHXlecvSLeICJhcKgRLjUiQlctNnRtB1rwz79cvBVmrw==", + "rc-motion": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/rc-motion/-/rc-motion-2.3.3.tgz", + "integrity": "sha512-eOpPDFz6Y+gX1Nd3/AZOhS+Cqv9CiyJ+hrfAinfemJv+fiiVLv/NkFYe2fqw0onNeGiTKJaDF5Ah4Hm006K5yw==", "requires": { - "@ant-design/css-animation": "^1.7.2", - "classnames": "^2.2.6", - "raf": "^3.4.0", - "rc-util": "^5.0.1" + "@babel/runtime": "^7.11.1", + "classnames": "^2.2.1", + "rc-util": "^5.2.1" + }, + "dependencies": { + "@babel/runtime": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.12.1.tgz", + "integrity": "sha512-J5AIf3vPj3UwXaAzb5j1xM4WAQDX3EMgemF8rjCP3SoW09LfRKAXQKt6CoVYl230P6iWdRcBbnLDDdnqWxZSCA==", + "requires": { + "regenerator-runtime": "^0.13.4" + } + }, + "regenerator-runtime": { + "version": "0.13.7", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz", + "integrity": "sha512-a54FxoJDIr27pgf7IgeQGxmqUNYrcV338lf/6gH456HZ/PhX+5BcwHXG9ajESmwe6WRO0tAzRUrRmNONWgkrew==" + } } }, "rc-slider": { - "version": "9.3.1", - "resolved": "https://registry.npmjs.org/rc-slider/-/rc-slider-9.3.1.tgz", - "integrity": "sha512-c52PWPyrfJWh28K6dixAm0906L3/4MUIxqrNQA4TLnC/Z+cBNycWJUZoJerpwSOE1HdM3XDwixCsmtFc/7aWlQ==", + "version": "9.5.4", + "resolved": "https://registry.npmjs.org/rc-slider/-/rc-slider-9.5.4.tgz", + "integrity": "sha512-24goJnWhmWi0ojNZMoPSMni2wh73IPqEK0TJh7rWn10hPLLKgG8x3KRR0g4uUdCS9APHyosqxGXUIJKGydJXVg==", "requires": { "@babel/runtime": "^7.10.1", "classnames": "^2.2.5", - "rc-tooltip": "^4.0.0", + "rc-tooltip": "^5.0.1", "rc-util": "^5.0.0", "shallowequal": "^1.1.0" }, "dependencies": { "@babel/runtime": { - "version": "7.10.3", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.10.3.tgz", - "integrity": "sha512-RzGO0RLSdokm9Ipe/YD+7ww8X2Ro79qiXZF3HU9ljrM+qnJmH1Vqth+hbiQZy761LnMJTMitHDuKVYTk3k4dLw==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.12.1.tgz", + "integrity": "sha512-J5AIf3vPj3UwXaAzb5j1xM4WAQDX3EMgemF8rjCP3SoW09LfRKAXQKt6CoVYl230P6iWdRcBbnLDDdnqWxZSCA==", "requires": { "regenerator-runtime": "^0.13.4" } }, "regenerator-runtime": { - "version": "0.13.5", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.5.tgz", - "integrity": "sha512-ZS5w8CpKFinUzOwW3c83oPeVXoNsrLsaCoLtJvAClH135j/R77RuymhiSErhm2lKcwSCIpmvIWSbDkIfAqKQlA==" + "version": "0.13.7", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz", + "integrity": "sha512-a54FxoJDIr27pgf7IgeQGxmqUNYrcV338lf/6gH456HZ/PhX+5BcwHXG9ajESmwe6WRO0tAzRUrRmNONWgkrew==" } } }, "rc-tooltip": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/rc-tooltip/-/rc-tooltip-4.2.1.tgz", - "integrity": "sha512-oykuaGsHg7RFvPUaxUpxo7ScEqtH61C66x4JUmjlFlSS8gSx2L8JFtfwM1D68SLBxUqGqJObtxj4TED75gQTiA==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/rc-tooltip/-/rc-tooltip-5.0.1.tgz", + "integrity": "sha512-3AnxhUS0j74xAV3khrKw8o6rg+Ima3nw09DJBezMPnX3ImQUAnayWsPSlN1mEnihjA43rcFkGM1emiKE+CXyMQ==", "requires": { - "rc-trigger": "^4.2.1" - } - }, - "rc-trigger": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/rc-trigger/-/rc-trigger-4.3.0.tgz", - "integrity": "sha512-jnGNzosXmDdivMBjPCYe/AfOXTpJU2/xQ9XukgoXDQEoZq/9lcI1r7eUIfq70WlWpLxlUEqQktiV3hwyy6Nw9g==", - "requires": { - "@babel/runtime": "^7.10.1", - "classnames": "^2.2.6", - "raf": "^3.4.1", - "rc-align": "^4.0.0", - "rc-animate": "^3.0.0", - "rc-util": "^5.0.1" + "@babel/runtime": "^7.11.2", + "rc-trigger": "^5.0.0" }, "dependencies": { "@babel/runtime": { - "version": "7.10.3", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.10.3.tgz", - "integrity": "sha512-RzGO0RLSdokm9Ipe/YD+7ww8X2Ro79qiXZF3HU9ljrM+qnJmH1Vqth+hbiQZy761LnMJTMitHDuKVYTk3k4dLw==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.12.1.tgz", + "integrity": "sha512-J5AIf3vPj3UwXaAzb5j1xM4WAQDX3EMgemF8rjCP3SoW09LfRKAXQKt6CoVYl230P6iWdRcBbnLDDdnqWxZSCA==", "requires": { "regenerator-runtime": "^0.13.4" } }, "regenerator-runtime": { - "version": "0.13.5", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.5.tgz", - "integrity": "sha512-ZS5w8CpKFinUzOwW3c83oPeVXoNsrLsaCoLtJvAClH135j/R77RuymhiSErhm2lKcwSCIpmvIWSbDkIfAqKQlA==" + "version": "0.13.7", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz", + "integrity": "sha512-a54FxoJDIr27pgf7IgeQGxmqUNYrcV338lf/6gH456HZ/PhX+5BcwHXG9ajESmwe6WRO0tAzRUrRmNONWgkrew==" + } + } + }, + "rc-trigger": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/rc-trigger/-/rc-trigger-5.0.8.tgz", + "integrity": "sha512-0bgFw39CKWRC4l3eQrqXe0O/e+XgZW68tXVewU/FI3qGs3PWXlPPbInes2ZvTIka/mS5oqOfF7wC1NPwPfo+9w==", + "requires": { + "@babel/runtime": "^7.11.2", + "classnames": "^2.2.6", + "rc-align": "^4.0.0", + "rc-motion": "^2.0.0", + "rc-util": "^5.3.4" + }, + "dependencies": { + "@babel/runtime": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.12.1.tgz", + "integrity": "sha512-J5AIf3vPj3UwXaAzb5j1xM4WAQDX3EMgemF8rjCP3SoW09LfRKAXQKt6CoVYl230P6iWdRcBbnLDDdnqWxZSCA==", + "requires": { + "regenerator-runtime": "^0.13.4" + } + }, + "regenerator-runtime": { + "version": "0.13.7", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz", + "integrity": "sha512-a54FxoJDIr27pgf7IgeQGxmqUNYrcV338lf/6gH456HZ/PhX+5BcwHXG9ajESmwe6WRO0tAzRUrRmNONWgkrew==" } } }, "rc-util": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/rc-util/-/rc-util-5.0.4.tgz", - "integrity": "sha512-cd19RCrE0DJH6UcJ9+V3eaXA/5sNWyVKOKkWl8ZM2OqgNzVb8fv0obf/TkuvSN43tmTsgqY8k7OqpFYHhmef8g==", + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/rc-util/-/rc-util-5.4.0.tgz", + "integrity": "sha512-kXDn1JyLJTAWLBFt+fjkTcUtXhxKkipQCobQmxIEVrX62iXgo24z8YKoWehWfMxPZFPE+RXqrmEu9j5kHz/Lrg==", "requires": { "react-is": "^16.12.0", "shallowequal": "^1.1.0" @@ -10926,17 +13575,17 @@ } }, "re-resizable": { - "version": "6.3.2", - "resolved": "https://registry.npmjs.org/re-resizable/-/re-resizable-6.3.2.tgz", - "integrity": "sha512-ngxe4XBSb46vfwXjAwpURacVDig/pPt1kHRhcKlRRIoGICmo4aQHr725jurezepp1pm5jSC6iQhyLYfx3zOC3w==", + "version": "6.6.1", + "resolved": "https://registry.npmjs.org/re-resizable/-/re-resizable-6.6.1.tgz", + "integrity": "sha512-ttWVasZ9X7c0ir0+4YK47tkmm9EAFssW07YLkeLzG5HCOuFgFAlSVzMlzAH0h3i6hDShQCHHJecVx5rk+snoFA==", "requires": { "fast-memoize": "^2.5.1" } }, "react": { - "version": "16.13.1", - "resolved": "https://registry.npmjs.org/react/-/react-16.13.1.tgz", - "integrity": "sha512-YMZQQq32xHLX0bz5Mnibv1/LHb3Sqzngu7xstSM+vrkE5Kzr9xE0yMByK5kMoTK30YVJE61WfbxIFFvfeDKT1w==", + "version": "16.14.0", + "resolved": "https://registry.npmjs.org/react/-/react-16.14.0.tgz", + "integrity": "sha512-0X2CImDkJGApiAlcf0ODKIneSwBPhqJawOa5wCtKbu7ZECrmS26NvtSILynQ66cgkT/RJ4LidJOc3bUESwmU8g==", "requires": { "loose-envify": "^1.1.0", "object-assign": "^4.1.1", @@ -10944,16 +13593,16 @@ } }, "react-app-polyfill": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/react-app-polyfill/-/react-app-polyfill-1.0.6.tgz", - "integrity": "sha512-OfBnObtnGgLGfweORmdZbyEz+3dgVePQBb3zipiaDsMHV1NpWm0rDFYIVXFV/AK+x4VIIfWHhrdMIeoTLyRr2g==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/react-app-polyfill/-/react-app-polyfill-2.0.0.tgz", + "integrity": "sha512-0sF4ny9v/B7s6aoehwze9vJNWcmCemAUYBVasscVr92+UYiEqDXOxfKjXN685mDaMRNF3WdhHQs76oTODMocFA==", "requires": { - "core-js": "^3.5.0", + "core-js": "^3.6.5", "object-assign": "^4.1.1", - "promise": "^8.0.3", + "promise": "^8.1.0", "raf": "^3.4.1", - "regenerator-runtime": "^0.13.3", - "whatwg-fetch": "^3.0.0" + "regenerator-runtime": "^0.13.7", + "whatwg-fetch": "^3.4.1" }, "dependencies": { "core-js": { @@ -10973,6 +13622,11 @@ "version": "0.13.7", "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz", "integrity": "sha512-a54FxoJDIr27pgf7IgeQGxmqUNYrcV338lf/6gH456HZ/PhX+5BcwHXG9ajESmwe6WRO0tAzRUrRmNONWgkrew==" + }, + "whatwg-fetch": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-3.4.1.tgz", + "integrity": "sha512-sofZVzE1wKwO+EYPbWfiwzaKovWiZXf4coEzjGP9b2GBVgQRLQUZ2QcuPpQExGDAW5GItpEm6Tl4OU5mywnAoQ==" } } }, @@ -10988,9 +13642,9 @@ } }, "react-bootstrap": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/react-bootstrap/-/react-bootstrap-1.3.0.tgz", - "integrity": "sha512-GYj0c6FO9mx7DaO8Xyz2zs0IcQ6CGCtM3O6/feIoCaG4N8B0+l4eqL7stlMcLpqO4d8NG2PoMO/AbUOD+MO7mg==", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/react-bootstrap/-/react-bootstrap-1.4.0.tgz", + "integrity": "sha512-0BMzgeUAxH126v7VYDzIXbHxQVHSnniPVKpz9fblumdQpWaiElMnnzk+u8h8DoELX0nCXwPlcUzgXqmpncdc2Q==", "requires": { "@babel/runtime": "^7.4.2", "@restart/context": "^2.1.4", @@ -11013,18 +13667,18 @@ }, "dependencies": { "@types/react": { - "version": "16.9.46", - "resolved": "https://registry.npmjs.org/@types/react/-/react-16.9.46.tgz", - "integrity": "sha512-dbHzO3aAq1lB3jRQuNpuZ/mnu+CdD3H0WVaaBQA8LTT3S33xhVBUj232T8M3tAhSWJs/D/UqORYUlJNl/8VQZg==", + "version": "16.9.53", + "resolved": "https://registry.npmjs.org/@types/react/-/react-16.9.53.tgz", + "integrity": "sha512-4nW60Sd4L7+WMXH1D6jCdVftuW7j4Za6zdp6tJ33Rqv0nk1ZAmQKML9ZLD4H0dehA3FZxXR/GM8gXplf82oNGw==", "requires": { "@types/prop-types": "*", "csstype": "^3.0.2" } }, "csstype": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.0.2.tgz", - "integrity": "sha512-ofovWglpqoqbfLNOTBNZLSbMuGrblAf1efvvArGKOZMBrIoJeu5UsAipQolkijtyQx5MtAzT/J9IHj/CEY1mJw==" + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.0.4.tgz", + "integrity": "sha512-xc8DUsCLmjvCfoD7LTGE0ou2MIWLx0K9RCZwSHMOdynqRsP4MtUcLeqh1HcQ2dInwDTqn+3CE0/FZh1et+p4jA==" } } }, @@ -11074,163 +13728,62 @@ } }, "react-dev-utils": { - "version": "10.2.1", - "resolved": "https://registry.npmjs.org/react-dev-utils/-/react-dev-utils-10.2.1.tgz", - "integrity": "sha512-XxTbgJnYZmxuPtY3y/UV0D8/65NKkmaia4rXzViknVnZeVlklSh8u6TnaEYPfAi/Gh1TP4mEOXHI6jQOPbeakQ==", + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/react-dev-utils/-/react-dev-utils-11.0.0.tgz", + "integrity": "sha512-uIZTUZXB5tbiM/0auUkLVjWhZGM7DSI304iGunyhA9m985iIDVXd9I4z6MkNa9jeLzeUJbU9A7TUNrcbXAahxw==", "requires": { - "@babel/code-frame": "7.8.3", + "@babel/code-frame": "7.10.4", "address": "1.1.2", - "browserslist": "4.10.0", + "browserslist": "4.14.2", "chalk": "2.4.2", - "cross-spawn": "7.0.1", + "cross-spawn": "7.0.3", "detect-port-alt": "1.1.6", "escape-string-regexp": "2.0.0", - "filesize": "6.0.1", + "filesize": "6.1.0", "find-up": "4.1.0", - "fork-ts-checker-webpack-plugin": "3.1.1", + "fork-ts-checker-webpack-plugin": "4.1.6", "global-modules": "2.0.0", - "globby": "8.0.2", + "globby": "11.0.1", "gzip-size": "5.1.1", - "immer": "1.10.0", - "inquirer": "7.0.4", + "immer": "7.0.9", + "inquirer": "7.3.3", "is-root": "2.1.0", - "loader-utils": "1.2.3", + "loader-utils": "2.0.0", "open": "^7.0.2", "pkg-up": "3.1.0", - "react-error-overlay": "^6.0.7", + "react-error-overlay": "^6.0.8", "recursive-readdir": "2.2.2", "shell-quote": "1.7.2", "strip-ansi": "6.0.0", "text-table": "0.2.0" }, "dependencies": { - "@babel/code-frame": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.3.tgz", - "integrity": "sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g==", - "requires": { - "@babel/highlight": "^7.8.3" - } - }, - "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==" - }, "browserslist": { - "version": "4.10.0", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.10.0.tgz", - "integrity": "sha512-TpfK0TDgv71dzuTsEAlQiHeWQ/tiPqgNZVdv046fvNtBZrjbv2O3TsWCDU0AWGJJKCF/KsjNdLzR9hXOsh/CfA==", + "version": "4.14.2", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.14.2.tgz", + "integrity": "sha512-HI4lPveGKUR0x2StIz+2FXfDk9SfVMrxn6PLh1JeGUwcuoDkdKZebWiyLRJ68iIPDpMI4JLVDf7S7XzslgWOhw==", "requires": { - "caniuse-lite": "^1.0.30001035", - "electron-to-chromium": "^1.3.378", - "node-releases": "^1.1.52", - "pkg-up": "^3.1.0" + "caniuse-lite": "^1.0.30001125", + "electron-to-chromium": "^1.3.564", + "escalade": "^3.0.2", + "node-releases": "^1.1.61" } }, - "cli-width": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.1.tgz", - "integrity": "sha512-GRMWDxpOB6Dgk2E5Uo+3eEBvtOOlimMmpbFiKuLFnQzYDavtLFY3K5ona41jgN/WdRZtG7utuVSVTL4HbZHGkw==" - }, "cross-spawn": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.1.tgz", - "integrity": "sha512-u7v4o84SwFpD32Z8IIcPZ6z1/ie24O6RU3RbtL5Y316l3KuHVPx9ItBgWQ6VlfAFnRnTtMUrsQ9MUUTuEZjogg==", + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", "requires": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", "which": "^2.0.1" } }, - "emojis-list": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz", - "integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k=" - }, "escape-string-regexp": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==" }, - "find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "requires": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - } - }, - "inquirer": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-7.0.4.tgz", - "integrity": "sha512-Bu5Td5+j11sCkqfqmUTiwv+tWisMtP0L7Q8WrqA2C/BbBhy1YTdFrvjjlrKq8oagA/tLQBski2Gcx/Sqyi2qSQ==", - "requires": { - "ansi-escapes": "^4.2.1", - "chalk": "^2.4.2", - "cli-cursor": "^3.1.0", - "cli-width": "^2.0.0", - "external-editor": "^3.0.3", - "figures": "^3.0.0", - "lodash": "^4.17.15", - "mute-stream": "0.0.8", - "run-async": "^2.2.0", - "rxjs": "^6.5.3", - "string-width": "^4.1.0", - "strip-ansi": "^5.1.0", - "through": "^2.3.6" - }, - "dependencies": { - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "requires": { - "ansi-regex": "^4.1.0" - } - } - } - }, - "json5": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", - "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", - "requires": { - "minimist": "^1.2.0" - } - }, - "loader-utils": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.2.3.tgz", - "integrity": "sha512-fkpz8ejdnEMG3s37wGL07iSBDg99O9D5yflE9RGNH3hRdx9SOwYfnGYdZOUIZitN8E+E2vkq3MUMYMvPYl5ZZA==", - "requires": { - "big.js": "^5.2.2", - "emojis-list": "^2.0.0", - "json5": "^1.0.1" - } - }, - "locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "requires": { - "p-locate": "^4.1.0" - } - }, - "p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "requires": { - "p-limit": "^2.2.0" - } - }, - "path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==" - }, "path-key": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", @@ -11255,13 +13808,6 @@ "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", "requires": { "ansi-regex": "^5.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==" - } } }, "which": { @@ -11323,9 +13869,9 @@ } }, "react-dom": { - "version": "16.13.1", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-16.13.1.tgz", - "integrity": "sha512-81PIMmVLnCNLO/fFOQxdQkvEq/+Hfpv24XNJfpyZhTRfO0QcmQIF/PgCa1zCOj2w1hrn12MFLyaJ/G0+Mxtfag==", + "version": "16.14.0", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-16.14.0.tgz", + "integrity": "sha512-1gCeQXDLoIqMgqD3IO2Ah9bnf0w9kzhwN5q4FGnHZ67hBm9yePzB5JJAIQCc8x3pFnNlwFq4RidZggNAAkzWWw==", "requires": { "loose-envify": "^1.1.0", "object-assign": "^4.1.1", @@ -11343,9 +13889,9 @@ } }, "react-error-overlay": { - "version": "6.0.7", - "resolved": "https://registry.npmjs.org/react-error-overlay/-/react-error-overlay-6.0.7.tgz", - "integrity": "sha512-TAv1KJFh3RhqxNvhzxj6LeT5NWklP6rDr2a0jaTfsZ5wSZWHOGeqQyejUp3xxLfPt2UpyJEcVQB/zyPcmonNFA==" + "version": "6.0.8", + "resolved": "https://registry.npmjs.org/react-error-overlay/-/react-error-overlay-6.0.8.tgz", + "integrity": "sha512-HvPuUQnLp5H7TouGq3kzBeioJmXms1wHy9EGjz2OURWBp4qZO6AfGEcnxts1D/CbwPLRAgTMPCEgYhA3sEM4vw==" }, "react-fullscreenable": { "version": "2.5.1-0", @@ -11358,9 +13904,9 @@ } }, "react-grid-system": { - "version": "6.4.2", - "resolved": "https://registry.npmjs.org/react-grid-system/-/react-grid-system-6.4.2.tgz", - "integrity": "sha512-zQxczLIAUyFfXJOySQlQEptwZj65hxyoEvS+siTupFW76a3AKUhqrhMJ90xKDcSCF9jb9D71zjoPw13Xe1+EKA==", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/react-grid-system/-/react-grid-system-7.1.1.tgz", + "integrity": "sha512-ttKTdme+eW0fyFX7LKQmc9M/ujHfs99Kiv5zgid7htdEPxUbjuBbEDgi1FaWwcciCgkRgBJguQ+WYqsGGJdGRw==", "requires": { "prop-types": "^15.7.2" } @@ -11387,9 +13933,9 @@ "integrity": "sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA==" }, "react-notification-system": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/react-notification-system/-/react-notification-system-0.3.0.tgz", - "integrity": "sha512-4+3Z0I/5/gi9ZOQUOeFaKy2Uw2i3d3S4kWu0x+dUvGRuvezY+WuF21fDg3B2FL0Hx+bJPy/qn6CwMQwc0g0wdA==", + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/react-notification-system/-/react-notification-system-0.4.0.tgz", + "integrity": "sha512-5WhXnjkYC07zqXruCiUXDU9iHjVxZlL1zgHpNgXk91A5ghV1AHrWVrJYo1XM4SnwlKy5NLdftkaTl+pTuVFAqw==", "requires": { "object-assign": "^4.0.1", "prop-types": "^15.5.6" @@ -11410,12 +13956,17 @@ "warning": "^4.0.3" } }, + "react-refresh": { + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.8.3.tgz", + "integrity": "sha512-X8jZHc7nCMjaCqoU+V2I0cOhNW+QMBwSUkeXnTi8IPe6zaRWfn60ZzvFDZqWPfmSJfjub7dDW1SP0jaHWLu/hg==" + }, "react-rnd": { - "version": "10.2.2", - "resolved": "https://registry.npmjs.org/react-rnd/-/react-rnd-10.2.2.tgz", - "integrity": "sha512-UoQnNehseKEspimfPFaO0gN0vSVJ8uCZeG39nCibUVyGTjZ5d+bnY/zHEp9SObHQ9tKW4vFSa9+8Mf7QZrQrUw==", + "version": "10.2.3", + "resolved": "https://registry.npmjs.org/react-rnd/-/react-rnd-10.2.3.tgz", + "integrity": "sha512-bdoEk899vuOSzpp8zJkAaybpr2mn5rH1TXd0ARrdBXJcv8oNoEogXEGGsL2Q3y+lG1KwUkDZ4HUcXpX8AqESBA==", "requires": { - "re-resizable": "6.3.2", + "re-resizable": "6.6.1", "react-draggable": "4.4.3", "tslib": "2.0.0" }, @@ -11459,79 +14010,96 @@ } }, "react-scripts": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/react-scripts/-/react-scripts-3.4.3.tgz", - "integrity": "sha512-oSnoWmii/iKdeQiwaO6map1lUaZLmG0xIUyb/HwCVFLT7gNbj8JZ9RmpvMCZ4fB98ZUMRfNmp/ft8uy/xD1RLA==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/react-scripts/-/react-scripts-4.0.0.tgz", + "integrity": "sha512-icJ/ctwV5XwITUOupBP9TUVGdWOqqZ0H08tbJ1kVC5VpNWYzEZ3e/x8axhV15ZXRsixLo27snwQE7B6Zd9J2Tg==", "requires": { - "@babel/core": "7.9.0", - "@svgr/webpack": "4.3.3", - "@typescript-eslint/eslint-plugin": "^2.10.0", - "@typescript-eslint/parser": "^2.10.0", - "babel-eslint": "10.1.0", - "babel-jest": "^24.9.0", + "@babel/core": "7.12.3", + "@pmmmwh/react-refresh-webpack-plugin": "0.4.2", + "@svgr/webpack": "5.4.0", + "@typescript-eslint/eslint-plugin": "^4.5.0", + "@typescript-eslint/parser": "^4.5.0", + "babel-eslint": "^10.1.0", + "babel-jest": "^26.6.0", "babel-loader": "8.1.0", - "babel-plugin-named-asset-import": "^0.3.6", - "babel-preset-react-app": "^9.1.2", - "camelcase": "^5.3.1", + "babel-plugin-named-asset-import": "^0.3.7", + "babel-preset-react-app": "^10.0.0", + "bfj": "^7.0.2", + "camelcase": "^6.1.0", "case-sensitive-paths-webpack-plugin": "2.3.0", - "css-loader": "3.4.2", + "css-loader": "4.3.0", "dotenv": "8.2.0", "dotenv-expand": "5.1.0", - "eslint": "^6.6.0", - "eslint-config-react-app": "^5.2.1", - "eslint-loader": "3.0.3", - "eslint-plugin-flowtype": "4.6.0", - "eslint-plugin-import": "2.20.1", - "eslint-plugin-jsx-a11y": "6.2.3", - "eslint-plugin-react": "7.19.0", - "eslint-plugin-react-hooks": "^1.6.1", - "file-loader": "4.3.0", - "fs-extra": "^8.1.0", - "fsevents": "2.1.2", - "html-webpack-plugin": "4.0.0-beta.11", + "eslint": "^7.11.0", + "eslint-config-react-app": "^6.0.0", + "eslint-plugin-flowtype": "^5.2.0", + "eslint-plugin-import": "^2.22.1", + "eslint-plugin-jest": "^24.1.0", + "eslint-plugin-jsx-a11y": "^6.3.1", + "eslint-plugin-react": "^7.21.5", + "eslint-plugin-react-hooks": "^4.2.0", + "eslint-plugin-testing-library": "^3.9.2", + "eslint-webpack-plugin": "^2.1.0", + "file-loader": "6.1.1", + "fs-extra": "^9.0.1", + "fsevents": "^2.1.3", + "html-webpack-plugin": "4.5.0", "identity-obj-proxy": "3.0.0", - "jest": "24.9.0", - "jest-environment-jsdom-fourteen": "1.0.1", - "jest-resolve": "24.9.0", - "jest-watch-typeahead": "0.4.2", - "mini-css-extract-plugin": "0.9.0", - "optimize-css-assets-webpack-plugin": "5.0.3", + "jest": "26.6.0", + "jest-circus": "26.6.0", + "jest-resolve": "26.6.0", + "jest-watch-typeahead": "0.6.1", + "mini-css-extract-plugin": "0.11.3", + "optimize-css-assets-webpack-plugin": "5.0.4", "pnp-webpack-plugin": "1.6.4", - "postcss-flexbugs-fixes": "4.1.0", + "postcss-flexbugs-fixes": "4.2.1", "postcss-loader": "3.0.0", "postcss-normalize": "8.0.1", "postcss-preset-env": "6.7.0", - "postcss-safe-parser": "4.0.1", - "react-app-polyfill": "^1.0.6", - "react-dev-utils": "^10.2.1", - "resolve": "1.15.0", - "resolve-url-loader": "3.1.1", + "postcss-safe-parser": "5.0.2", + "react-app-polyfill": "^2.0.0", + "react-dev-utils": "^11.0.0", + "react-refresh": "^0.8.3", + "resolve": "1.18.1", + "resolve-url-loader": "^3.1.2", "sass-loader": "8.0.2", - "semver": "6.3.0", - "style-loader": "0.23.1", - "terser-webpack-plugin": "2.3.8", - "ts-pnp": "1.1.6", - "url-loader": "2.3.0", - "webpack": "4.42.0", + "semver": "7.3.2", + "style-loader": "1.3.0", + "terser-webpack-plugin": "4.2.3", + "ts-pnp": "1.2.0", + "url-loader": "4.1.1", + "webpack": "4.44.2", "webpack-dev-server": "3.11.0", "webpack-manifest-plugin": "2.2.0", - "workbox-webpack-plugin": "4.3.1" + "workbox-webpack-plugin": "5.1.4" }, "dependencies": { + "camelcase": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.1.0.tgz", + "integrity": "sha512-WCMml9ivU60+8rEJgELlFp1gxFcEGxwYleE3bziHEDeqsqAWGHdimB7beBFGjLzVNgPGyDsfgXLQEYMpmIFnVQ==" + }, + "fsevents": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.3.tgz", + "integrity": "sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==", + "optional": true + }, "resolve": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.15.0.tgz", - "integrity": "sha512-+hTmAldEGE80U2wJJDC1lebb5jWqvTYAfm3YZ1ckk1gBr0MnCqUKlwK1e+anaFljIl+F5tR5IoZcm4ZDA1zMQw==", + "version": "1.18.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.18.1.tgz", + "integrity": "sha512-lDfCPaMKfOJXjy0dPayzPdF1phampNWr3qFCjAu+rw/qbQmr5jWH5xN2hwh9QKfw9E5v4hwV7A+jrCmL8yjjqA==", "requires": { + "is-core-module": "^2.0.0", "path-parse": "^1.0.6" } } } }, "react-svg-pan-zoom": { - "version": "3.8.0", - "resolved": "https://registry.npmjs.org/react-svg-pan-zoom/-/react-svg-pan-zoom-3.8.0.tgz", - "integrity": "sha512-s92QDFJuRrp784aQZKX8qxukMY/85IpOXO5Bjbn1G/CoNapdHCRVAHynPP6Ea9cyMmycSmu6paPqUIAW3i5s9Q==", + "version": "3.8.1", + "resolved": "https://registry.npmjs.org/react-svg-pan-zoom/-/react-svg-pan-zoom-3.8.1.tgz", + "integrity": "sha512-DjhBTlwO+aS9KCerWqbTMaYoQodhz64Ej9pg3ihobabO+AtO2ZOQ0OZ9Gep9+YcDWGwhck//r3tUlcMvBdRmJQ==", "requires": { "prop-types": "^15.7.2", "transformation-matrix": "^2.2.0" @@ -11565,22 +14133,77 @@ } }, "read-pkg": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", - "integrity": "sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k=", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz", + "integrity": "sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=", "requires": { - "load-json-file": "^4.0.0", + "load-json-file": "^2.0.0", "normalize-package-data": "^2.3.2", - "path-type": "^3.0.0" + "path-type": "^2.0.0" + }, + "dependencies": { + "path-type": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz", + "integrity": "sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=", + "requires": { + "pify": "^2.0.0" + } + }, + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=" + } } }, "read-pkg-up": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-4.0.0.tgz", - "integrity": "sha512-6etQSH7nJGsK0RbG/2TeDzZFa8shjQ1um+SwQQ5cwKy0dhSXdOncEhb1CPpvQG4h7FyOV6EB6YlV0yJvZQNAkA==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-2.0.0.tgz", + "integrity": "sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4=", "requires": { - "find-up": "^3.0.0", - "read-pkg": "^3.0.0" + "find-up": "^2.0.0", + "read-pkg": "^2.0.0" + }, + "dependencies": { + "find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "requires": { + "locate-path": "^2.0.0" + } + }, + "locate-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", + "requires": { + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" + } + }, + "p-limit": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", + "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", + "requires": { + "p-try": "^1.0.0" + } + }, + "p-locate": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", + "requires": { + "p-limit": "^1.1.0" + } + }, + "p-try": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", + "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=" + } } }, "readable-stream": { @@ -11605,14 +14228,6 @@ "picomatch": "^2.0.7" } }, - "realpath-native": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/realpath-native/-/realpath-native-1.1.0.tgz", - "integrity": "sha512-wlgPA6cCIIg9gKz0fgAPjnzh4yR/LnXovwuo9hvyGvx3h8nX4+/iLZplfUWasXpqD8BdnGnP5njOFjkUwPzvjA==", - "requires": { - "util.promisify": "^1.0.0" - } - }, "recursive-readdir": { "version": "2.2.2", "resolved": "https://registry.npmjs.org/recursive-readdir/-/recursive-readdir-2.2.2.tgz", @@ -11676,9 +14291,9 @@ }, "dependencies": { "@babel/runtime": { - "version": "7.11.2", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.11.2.tgz", - "integrity": "sha512-TeWkU52so0mPtDcaCTxNBI/IHiz0pZgr8VEFqXFtZWpYD08ZB6FaSwVAS8MKRQAP3bYKiVjwysOJgMFY28o6Tw==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.12.1.tgz", + "integrity": "sha512-J5AIf3vPj3UwXaAzb5j1xM4WAQDX3EMgemF8rjCP3SoW09LfRKAXQKt6CoVYl230P6iWdRcBbnLDDdnqWxZSCA==", "requires": { "regenerator-runtime": "^0.13.4" } @@ -11700,9 +14315,9 @@ } }, "regex-parser": { - "version": "2.2.10", - "resolved": "https://registry.npmjs.org/regex-parser/-/regex-parser-2.2.10.tgz", - "integrity": "sha512-8t6074A68gHfU8Neftl0Le6KTDwfGAj7IyjPIMSfikI2wJUTHDMaIq42bUsfVnj8mhx0R+45rdUXHGpN164avA==" + "version": "2.2.11", + "resolved": "https://registry.npmjs.org/regex-parser/-/regex-parser-2.2.11.tgz", + "integrity": "sha512-jbD/FT0+9MBU2XAZluI7w2OBs1RBi6p9M83nkoZayQXXU9e8Robt69FcZc7wU4eJD/YFTjn1JdCk3rbMJajz8Q==" }, "regexp.prototype.flags": { "version": "1.3.0", @@ -11711,6 +14326,26 @@ "requires": { "define-properties": "^1.1.3", "es-abstract": "^1.17.0-next.1" + }, + "dependencies": { + "es-abstract": { + "version": "1.17.7", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.7.tgz", + "integrity": "sha512-VBl/gnfcJ7OercKA9MVaegWsBHFjV492syMudcnQZvt/Dw8ezpcOHYZXa/J96O8vx+g4x65YKhxOwDUh63aS5g==", + "requires": { + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1", + "is-callable": "^1.2.2", + "is-regex": "^1.1.1", + "object-inspect": "^1.8.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.1", + "string.prototype.trimend": "^1.0.1", + "string.prototype.trimstart": "^1.0.1" + } + } } }, "regexpp": { @@ -11719,9 +14354,9 @@ "integrity": "sha512-ZOIzd8yVsQQA7j8GCSlPGXwg5PfmA1mrq0JP4nGhh54LaKN3xdai/vHUDu74pKwV8OxseMS65u2NImosQcSD0Q==" }, "regexpu-core": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.7.0.tgz", - "integrity": "sha512-TQ4KXRnIn6tz6tjnrXEkD/sshygKH/j5KzK86X8MkeHyZ8qst/LZ89j3X4/8HEIfHANTFIP/AbXakeRhWIl5YQ==", + "version": "4.7.1", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.7.1.tgz", + "integrity": "sha512-ywH2VUraA44DZQuRKzARmw6S66mr48pQVva4LBeRhcOltJ6hExvWly5ZjFLYo67xbIxb6W1q4bAGtgfEl20zfQ==", "requires": { "regenerate": "^1.4.0", "regenerate-unicode-properties": "^8.2.0", @@ -11762,15 +14397,15 @@ "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=" }, "renderkid": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-2.0.3.tgz", - "integrity": "sha512-z8CLQp7EZBPCwCnncgf9C4XAi3WR0dv+uWu/PjIyhhAb5d6IJ/QZqlHFprHeKT+59//V6BNUsLbvN8+2LarxGA==", + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-2.0.4.tgz", + "integrity": "sha512-K2eXrSOJdq+HuKzlcjOlGoOarUu5SDguDEhE7+Ah4zuOWL40j8A/oHvLlLob9PSTNvVnBd+/q0Er1QfpEuem5g==", "requires": { "css-select": "^1.1.0", "dom-converter": "^0.2", "htmlparser2": "^3.3.0", - "strip-ansi": "^3.0.0", - "utila": "^0.4.0" + "lodash": "^4.17.20", + "strip-ansi": "^3.0.0" }, "dependencies": { "ansi-regex": { @@ -11890,6 +14525,17 @@ "request-promise-core": "1.1.4", "stealthy-require": "^1.1.1", "tough-cookie": "^2.3.3" + }, + "dependencies": { + "tough-cookie": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", + "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", + "requires": { + "psl": "^1.1.28", + "punycode": "^2.1.1" + } + } } }, "require-directory": { @@ -11921,17 +14567,24 @@ } }, "resolve-cwd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-2.0.0.tgz", - "integrity": "sha1-AKn3OHVW4nA46uIyyqNypqWbZlo=", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", + "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", "requires": { - "resolve-from": "^3.0.0" + "resolve-from": "^5.0.0" + }, + "dependencies": { + "resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==" + } } }, "resolve-from": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", - "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=" + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==" }, "resolve-pathname": { "version": "3.0.0", @@ -11944,11 +14597,11 @@ "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=" }, "resolve-url-loader": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/resolve-url-loader/-/resolve-url-loader-3.1.1.tgz", - "integrity": "sha512-K1N5xUjj7v0l2j/3Sgs5b8CjrrgtC70SmdCuZiJ8tSyb5J+uk3FoeZ4b7yTnH6j7ngI+Bc5bldHJIa8hYdu2gQ==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/resolve-url-loader/-/resolve-url-loader-3.1.2.tgz", + "integrity": "sha512-QEb4A76c8Mi7I3xNKXlRKQSlLBwjUV/ULFMP+G7n3/7tJZ8MG5wsZ3ucxP1Jz8Vevn6fnJsxDx9cIls+utGzPQ==", "requires": { - "adjust-sourcemap-loader": "2.0.0", + "adjust-sourcemap-loader": "3.0.0", "camelcase": "5.3.1", "compose-function": "3.0.3", "convert-source-map": "1.7.0", @@ -12022,6 +14675,11 @@ "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", "integrity": "sha1-G0KmJmoh8HQh0bC1S33BZ7AcATs=" }, + "reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==" + }, "rework": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/rework/-/rework-1.0.1.tgz", @@ -12070,6 +14728,79 @@ "inherits": "^2.0.1" } }, + "rollup": { + "version": "1.32.1", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-1.32.1.tgz", + "integrity": "sha512-/2HA0Ec70TvQnXdzynFffkjA6XN+1e2pEv/uKS5Ulca40g2L7KuOE3riasHoNVHOsFD5KKZgDsMk1CP3Tw9s+A==", + "requires": { + "@types/estree": "*", + "@types/node": "*", + "acorn": "^7.1.0" + } + }, + "rollup-plugin-babel": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/rollup-plugin-babel/-/rollup-plugin-babel-4.4.0.tgz", + "integrity": "sha512-Lek/TYp1+7g7I+uMfJnnSJ7YWoD58ajo6Oarhlex7lvUce+RCKRuGRSgztDO3/MF/PuGKmUL5iTHKf208UNszw==", + "requires": { + "@babel/helper-module-imports": "^7.0.0", + "rollup-pluginutils": "^2.8.1" + } + }, + "rollup-plugin-terser": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/rollup-plugin-terser/-/rollup-plugin-terser-5.3.1.tgz", + "integrity": "sha512-1pkwkervMJQGFYvM9nscrUoncPwiKR/K+bHdjv6PFgRo3cgPHoRT83y2Aa3GvINj4539S15t/tpFPb775TDs6w==", + "requires": { + "@babel/code-frame": "^7.5.5", + "jest-worker": "^24.9.0", + "rollup-pluginutils": "^2.8.2", + "serialize-javascript": "^4.0.0", + "terser": "^4.6.2" + }, + "dependencies": { + "jest-worker": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-24.9.0.tgz", + "integrity": "sha512-51PE4haMSXcHohnSMdM42anbvZANYTqMrr52tVKPqqsPJMzoP6FYYDVqahX/HrAoKEKz3uUPzSvKs9A3qR4iVw==", + "requires": { + "merge-stream": "^2.0.0", + "supports-color": "^6.1.0" + } + }, + "serialize-javascript": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-4.0.0.tgz", + "integrity": "sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==", + "requires": { + "randombytes": "^2.1.0" + } + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "rollup-pluginutils": { + "version": "2.8.2", + "resolved": "https://registry.npmjs.org/rollup-pluginutils/-/rollup-pluginutils-2.8.2.tgz", + "integrity": "sha512-EEp9NhnUkwY8aif6bxgovPHMoMoNr2FulJziTndpt5H9RdwC47GSGuII9XxpSdzVGM0GWrNPHV6ie1LTNJPaLQ==", + "requires": { + "estree-walker": "^0.6.1" + }, + "dependencies": { + "estree-walker": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-0.6.1.tgz", + "integrity": "sha512-SqmZANLWS0mnatqbSfRP5g8OXZC12Fgg1IwNtLsyHDzJizORW4khDfjPqJZsemPWBB2uqykUah5YpQ6epsqC/w==" + } + } + }, "rsvp": { "version": "4.8.5", "resolved": "https://registry.npmjs.org/rsvp/-/rsvp-4.8.5.tgz", @@ -12080,6 +14811,11 @@ "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==" }, + "run-parallel": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.1.9.tgz", + "integrity": "sha512-DEqnSRTDw/Tc3FXf49zedI638Z9onwUotBMiUFKmrO2sdFKIbXamXGQ3Axd4qgphxKB4kw/qP1w5kTxnfU1B9Q==" + }, "run-queue": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/run-queue/-/run-queue-1.0.3.tgz", @@ -12089,9 +14825,9 @@ } }, "rxjs": { - "version": "6.6.2", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.2.tgz", - "integrity": "sha512-BHdBMVoWC2sL26w//BCu3YzKT4s2jip/WhwsGEDmeKYBhKDZeYezVUnHatYB7L85v5xs0BAQmg6BEYJEKxBabg==", + "version": "6.6.3", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.3.tgz", + "integrity": "sha512-trsQc+xYYXZ3urjOiJOuCOa5N3jAZ3eiSpQB5hIT8zGlL2QfnHLJ2r7GMkBGuIausdJN1OneaI6gQlsqNHHmZQ==", "requires": { "tslib": "^1.9.0" } @@ -12128,6 +14864,125 @@ "micromatch": "^3.1.4", "minimist": "^1.1.1", "walker": "~1.0.5" + }, + "dependencies": { + "anymatch": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", + "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", + "requires": { + "micromatch": "^3.1.4", + "normalize-path": "^2.1.1" + } + }, + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "requires": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "requires": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==" + }, + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + } + }, + "normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "requires": { + "remove-trailing-separator": "^1.0.1" + } + }, + "to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "requires": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + } + } } }, "sanitize.css": { @@ -12136,9 +14991,9 @@ "integrity": "sha512-vTxrZz4dX5W86M6oVWVdOVe72ZiPs41Oi7Z6Km4W5Turyz28mrXSJhhEBZoRtzJWIv3833WKVwLSDWWkEfupMg==" }, "sass": { - "version": "1.26.10", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.26.10.tgz", - "integrity": "sha512-bzN0uvmzfsTvjz0qwccN1sPm2HxxpNI/Xa+7PlUEMS+nQvbyuEK7Y0qFqxlPHhiNHb1Ze8WQJtU31olMObkAMw==", + "version": "1.27.0", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.27.0.tgz", + "integrity": "sha512-0gcrER56OkzotK/GGwgg4fPrKuiFlPNitO7eUJ18Bs+/NBlofJfMxmxqpqJxjae9vu0Wq8TZzrSyxZal00WDig==", "requires": { "chokidar": ">=2.0.0 <4.0.0" } @@ -12176,11 +15031,34 @@ "shallow-clone": "^3.0.0" } }, + "json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "requires": { + "minimist": "^1.2.0" + } + }, "kind-of": { "version": "6.0.3", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==" }, + "loader-utils": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", + "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^1.0.1" + } + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" + }, "shallow-clone": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", @@ -12197,11 +15075,11 @@ "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==" }, "saxes": { - "version": "3.1.11", - "resolved": "https://registry.npmjs.org/saxes/-/saxes-3.1.11.tgz", - "integrity": "sha512-Ydydq3zC+WYDJK1+gRxRapLIED9PWeSuuS41wqyoRmzvhhh9nc+QQrVMKJYzJFULazeGhzSV0QleN2wD3boh2g==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/saxes/-/saxes-5.0.1.tgz", + "integrity": "sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw==", "requires": { - "xmlchars": "^2.1.1" + "xmlchars": "^2.2.0" } }, "scheduler": { @@ -12214,19 +15092,19 @@ } }, "schema-utils": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.0.tgz", - "integrity": "sha512-0ilKFI6QQF5nxDZLFn2dMjvc4hjg/Wkg7rHd3jK6/A4a1Hl9VFdQWvgB1UMGoU94pad1P/8N7fMcEnLnSiju8A==", + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.1.tgz", + "integrity": "sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg==", "requires": { - "@types/json-schema": "^7.0.4", - "ajv": "^6.12.2", - "ajv-keywords": "^3.4.1" + "@types/json-schema": "^7.0.5", + "ajv": "^6.12.4", + "ajv-keywords": "^3.5.2" }, "dependencies": { "ajv": { - "version": "6.12.4", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.4.tgz", - "integrity": "sha512-eienB2c9qVQs2KWexhkrdMLVDoIQCz5KSeLxwg9Lzk4DOfBtIK9PQwwufcsn1jjGuf9WZmqPMbGxOzfcuphJCQ==", + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", "requires": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", @@ -12274,9 +15152,9 @@ } }, "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" + "version": "7.3.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz", + "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==" }, "send": { "version": "0.17.1", @@ -12326,9 +15204,9 @@ } }, "serialize-javascript": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-4.0.0.tgz", - "integrity": "sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-5.0.1.tgz", + "integrity": "sha512-SaaNal9imEO737H2c05Og0/8LUXG7EnsZyMa8MzkmuHoELfT6txuj0cMqRj6zfPKnmQ1yasR4PCJc8x+M4JSPA==", "requires": { "randombytes": "^2.1.0" } @@ -12496,7 +15374,8 @@ "shellwords": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/shellwords/-/shellwords-0.1.1.tgz", - "integrity": "sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww==" + "integrity": "sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww==", + "optional": true }, "side-channel": { "version": "1.0.3", @@ -12505,27 +15384,6 @@ "requires": { "es-abstract": "^1.18.0-next.0", "object-inspect": "^1.8.0" - }, - "dependencies": { - "es-abstract": { - "version": "1.18.0-next.0", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.0-next.0.tgz", - "integrity": "sha512-elZXTZXKn51hUBdJjSZGYRujuzilgXo8vSPQzjGYXLvSlGiCo8VO8ZGV3kjo9a0WNJJ57hENagwbtlRuHuzkcQ==", - "requires": { - "es-to-primitive": "^1.2.1", - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.1", - "is-callable": "^1.2.0", - "is-negative-zero": "^2.0.0", - "is-regex": "^1.1.1", - "object-inspect": "^1.8.0", - "object-keys": "^1.1.1", - "object.assign": "^4.1.0", - "string.prototype.trimend": "^1.0.1", - "string.prototype.trimstart": "^1.0.1" - } - } } }, "signal-exit": { @@ -12554,9 +15412,9 @@ "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==" }, "slash": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz", - "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==" + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==" }, "slice-ansi": { "version": "2.1.0", @@ -12566,13 +15424,6 @@ "ansi-styles": "^3.2.0", "astral-regex": "^1.0.0", "is-fullwidth-code-point": "^2.0.0" - }, - "dependencies": { - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" - } } }, "snapdragon": { @@ -12777,6 +15628,11 @@ "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz", "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=" }, + "sourcemap-codec": { + "version": "1.4.8", + "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", + "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==" + }, "spdx-correct": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.0.tgz", @@ -12872,11 +15728,10 @@ } }, "ssri": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/ssri/-/ssri-7.1.0.tgz", - "integrity": "sha512-77/WrDZUWocK0mvA5NTRQyveUf+wsrIc6vyrxpS8tVvYBcX215QbafrJR3KtkpskIzoFLqqNuuYQvxaMjXJ/0g==", + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-8.0.0.tgz", + "integrity": "sha512-aq/pz989nxVYwn16Tsbj1TqFpD5LLrQxHf5zaHuieFV+R0Bbr4y8qUsOA45hXT/N4/9UNXTarBjnjVmjSOVaAA==", "requires": { - "figgy-pudding": "^3.5.1", "minipass": "^3.1.1" } }, @@ -12886,9 +15741,24 @@ "integrity": "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==" }, "stack-utils": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-1.0.2.tgz", - "integrity": "sha512-MTX+MeG5U994cazkjd/9KNAapsHnibjMLnfXodlkXw76JEea0UiNzrqidzo1emMwk7w5Qhc9jd4Bn9TBb1MFwA==" + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.2.tgz", + "integrity": "sha512-0H7QK2ECz3fyZMzQ8rH0j2ykpfbnd20BFtfg/SqVC2+sCTtcw0aDTGB7dk+de4U4uUeuz6nOtJcrkFFLG1B0Rg==", + "requires": { + "escape-string-regexp": "^2.0.0" + }, + "dependencies": { + "escape-string-regexp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", + "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==" + } + } + }, + "stackframe": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/stackframe/-/stackframe-1.2.0.tgz", + "integrity": "sha512-GrdeshiRmS1YLMYgzF16olf2jJ/IzxXY9lhKOskuVziubpTYcYqyOwYeJKzQkwy7uN0fYSsbsC4RQaXf9LCrYA==" }, "static-extend": { "version": "0.1.2", @@ -12968,36 +15838,11 @@ "integrity": "sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM=" }, "string-length": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/string-length/-/string-length-2.0.0.tgz", - "integrity": "sha1-1A27aGo6zpYMHP/KVivyxF+DY+0=", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.1.tgz", + "integrity": "sha512-PKyXUd0LK0ePjSOnWn34V2uD6acUWev9uy0Ft05k0E8xRW+SKcA0F7eMr7h5xlzfn+4O3N+55rduYyet3Jk+jw==", "requires": { - "astral-regex": "^1.0.0", - "strip-ansi": "^4.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" - }, - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "requires": { - "ansi-regex": "^3.0.0" - } - } - } - }, - "string-width": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", - "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==", - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", + "char-regex": "^1.0.2", "strip-ansi": "^6.0.0" }, "dependencies": { @@ -13011,6 +15856,21 @@ } } }, + "string-natural-compare": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/string-natural-compare/-/string-natural-compare-3.0.1.tgz", + "integrity": "sha512-n3sPwynL1nwKi3WJ6AIsClwBMa0zTi54fn2oLU6ndfTSIO05xaznjSf15PcBZU6FNWbmN5Q6cxT4V5hGvB4taw==" + }, + "string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "requires": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + } + }, "string.prototype.matchall": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.2.tgz", @@ -13022,24 +15882,44 @@ "internal-slot": "^1.0.2", "regexp.prototype.flags": "^1.3.0", "side-channel": "^1.0.2" + }, + "dependencies": { + "es-abstract": { + "version": "1.17.7", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.7.tgz", + "integrity": "sha512-VBl/gnfcJ7OercKA9MVaegWsBHFjV492syMudcnQZvt/Dw8ezpcOHYZXa/J96O8vx+g4x65YKhxOwDUh63aS5g==", + "requires": { + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1", + "is-callable": "^1.2.2", + "is-regex": "^1.1.1", + "object-inspect": "^1.8.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.1", + "string.prototype.trimend": "^1.0.1", + "string.prototype.trimstart": "^1.0.1" + } + } } }, "string.prototype.trimend": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.1.tgz", - "integrity": "sha512-LRPxFUaTtpqYsTeNKaFOw3R4bxIzWOnbQ837QfBylo8jIxtcbK/A/sMV7Q+OAV/vWo+7s25pOE10KYSjaSO06g==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.2.tgz", + "integrity": "sha512-8oAG/hi14Z4nOVP0z6mdiVZ/wqjDtWSLygMigTzAb+7aPEDTleeFf+WrF+alzecxIRkckkJVn+dTlwzJXORATw==", "requires": { "define-properties": "^1.1.3", - "es-abstract": "^1.17.5" + "es-abstract": "^1.18.0-next.1" } }, "string.prototype.trimstart": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.1.tgz", - "integrity": "sha512-XxZn+QpvrBI1FOcg6dIpxUPgWCPuNXvMD72aaRaUQv1eD4e/Qy8i/hFTe0BUmD60p/QA6bh1avmuPTfNjqVWRw==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.2.tgz", + "integrity": "sha512-7F6CdBTl5zyu30BJFdzSTlSlLPwODC23Od+iLoVH8X6+3fvDPPuBVVj9iaB1GOsSTSIgVfsfm27R2FGrAPznWg==", "requires": { "define-properties": "^1.1.3", - "es-abstract": "^1.17.5" + "es-abstract": "^1.18.0-next.1" } }, "string_decoder": { @@ -13101,6 +15981,11 @@ "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=" }, + "strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==" + }, "strip-indent": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz", @@ -13115,24 +16000,12 @@ "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==" }, "style-loader": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-0.23.1.tgz", - "integrity": "sha512-XK+uv9kWwhZMZ1y7mysB+zoihsEj4wneFWAS5qoiLwzW0WzSqMrrsIy+a3zkQJq0ipFtBpX5W3MqyRIBF/WFGg==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-1.3.0.tgz", + "integrity": "sha512-V7TCORko8rs9rIqkSrlMfkqA63DfoGBBJmK1kKGCcSi+BWb4cqz0SRsnp4l6rU5iwOEd0/2ePv68SV22VXon4Q==", "requires": { - "loader-utils": "^1.1.0", - "schema-utils": "^1.0.0" - }, - "dependencies": { - "schema-utils": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", - "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", - "requires": { - "ajv": "^6.1.0", - "ajv-errors": "^1.0.0", - "ajv-keywords": "^3.1.0" - } - } + "loader-utils": "^2.0.0", + "schema-utils": "^2.7.0" } }, "stylehacks": { @@ -13158,9 +16031,9 @@ } }, "superagent": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/superagent/-/superagent-5.3.1.tgz", - "integrity": "sha512-wjJ/MoTid2/RuGCOFtlacyGNxN9QLMgcpYLDQlWFIhhdJ93kNscFonGvrpAHSCVjRVj++DGCglocF7Aej1KHvQ==", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/superagent/-/superagent-6.1.0.tgz", + "integrity": "sha512-OUDHEssirmplo3F+1HWKUrUjvnQuA+nZI6i/JJBdXb5eq9IyEQwPyPpqND+SSsxf6TygpBEkUjISVRN4/VOpeg==", "requires": { "component-emitter": "^1.3.0", "cookiejar": "^2.1.2", @@ -13185,11 +16058,6 @@ "mime-types": "^2.1.12" } }, - "mime": { - "version": "2.4.6", - "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.6.tgz", - "integrity": "sha512-RZKhC3EmpBchfTGBVb8fb+RL2cWyw/32lshnsETttkBAyAUXSGHxbEJWWRXc751DrIxG1q04b8QwMbAwkRPpUA==" - }, "qs": { "version": "6.9.4", "resolved": "https://registry.npmjs.org/qs/-/qs-6.9.4.tgz", @@ -13220,6 +16088,30 @@ "has-flag": "^3.0.0" } }, + "supports-hyperlinks": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.1.0.tgz", + "integrity": "sha512-zoE5/e+dnEijk6ASB6/qrK+oYdm2do1hjoLWrqUC/8WEIW1gbxFcKuBof7sW8ArN6e+AYvsE8HBGiVRWL/F5CA==", + "requires": { + "has-flag": "^4.0.0", + "supports-color": "^7.0.0" + }, + "dependencies": { + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, "svg-parser": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/svg-parser/-/svg-parser-2.0.4.tgz", @@ -13264,28 +16156,6 @@ "lodash": "^4.17.14", "slice-ansi": "^2.1.0", "string-width": "^3.0.0" - }, - "dependencies": { - "emoji-regex": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", - "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==" - }, - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" - }, - "string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", - "requires": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - } - } } }, "tapable": { @@ -13303,6 +16173,37 @@ "inherits": "2" } }, + "temp-dir": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/temp-dir/-/temp-dir-1.0.0.tgz", + "integrity": "sha1-CnwOom06Oa+n4OvqnB/AvE2qAR0=" + }, + "tempy": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/tempy/-/tempy-0.3.0.tgz", + "integrity": "sha512-WrH/pui8YCwmeiAoxV+lpRH9HpRtgBhSR2ViBPgpGb/wnYDzp21R4MN45fsCGvLROvY67o3byhJRYRONJyImVQ==", + "requires": { + "temp-dir": "^1.0.0", + "type-fest": "^0.3.1", + "unique-string": "^1.0.0" + }, + "dependencies": { + "type-fest": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.3.1.tgz", + "integrity": "sha512-cUGJnCdr4STbePCgqNFbpVNCepa+kAVohJs1sLhxzdH+gnEoOd8VhbYa7pD3zZYGiURWM2xzEII3fQcRizDkYQ==" + } + } + }, + "terminal-link": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/terminal-link/-/terminal-link-2.1.1.tgz", + "integrity": "sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ==", + "requires": { + "ansi-escapes": "^4.2.1", + "supports-hyperlinks": "^2.0.0" + } + }, "terser": { "version": "4.8.0", "resolved": "https://registry.npmjs.org/terser/-/terser-4.8.0.tgz", @@ -13314,21 +16215,37 @@ } }, "terser-webpack-plugin": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-2.3.8.tgz", - "integrity": "sha512-/fKw3R+hWyHfYx7Bv6oPqmk4HGQcrWLtV3X6ggvPuwPNHSnzvVV51z6OaaCOus4YLjutYGOz3pEpbhe6Up2s1w==", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-4.2.3.tgz", + "integrity": "sha512-jTgXh40RnvOrLQNgIkwEKnQ8rmHjHK4u+6UBEi+W+FPmvb+uo+chJXntKe7/3lW5mNysgSWD60KyesnhW8D6MQ==", "requires": { - "cacache": "^13.0.1", + "cacache": "^15.0.5", "find-cache-dir": "^3.3.1", - "jest-worker": "^25.4.0", - "p-limit": "^2.3.0", - "schema-utils": "^2.6.6", - "serialize-javascript": "^4.0.0", + "jest-worker": "^26.5.0", + "p-limit": "^3.0.2", + "schema-utils": "^3.0.0", + "serialize-javascript": "^5.0.1", "source-map": "^0.6.1", - "terser": "^4.6.12", + "terser": "^5.3.4", "webpack-sources": "^1.4.3" }, "dependencies": { + "ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" + }, "find-cache-dir": { "version": "3.3.1", "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.1.tgz", @@ -13339,37 +16256,6 @@ "pkg-dir": "^4.1.0" } }, - "find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "requires": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - } - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" - }, - "jest-worker": { - "version": "25.5.0", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-25.5.0.tgz", - "integrity": "sha512-/dsSmUkIy5EBGfv/IjjqmFxrNAUpBERfGs1oHROyD7yxjG/w+t0GOJDX8O1k32ySmd7+a5IhnJU2qQFcJ4n1vw==", - "requires": { - "merge-stream": "^2.0.0", - "supports-color": "^7.0.0" - } - }, - "locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "requires": { - "p-locate": "^4.1.0" - } - }, "make-dir": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", @@ -13378,19 +16264,14 @@ "semver": "^6.0.0" } }, - "p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "p-limit": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.0.2.tgz", + "integrity": "sha512-iwqZSOoWIW+Ew4kAGUlN16J4M7OB3ysMLSZtnhmqx7njIHFPlxWBX8xo3lVTyFVq6mI/lL9qt2IsN1sHwaxJkg==", "requires": { - "p-limit": "^2.2.0" + "p-try": "^2.0.0" } }, - "path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==" - }, "pkg-dir": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", @@ -13399,25 +16280,48 @@ "find-up": "^4.0.0" } }, - "supports-color": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", - "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "schema-utils": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.0.0.tgz", + "integrity": "sha512-6D82/xSzO094ajanoOSbe4YvXWMfn2A//8Y1+MUqFAJul5Bs+yn36xbK9OtNDcRVSBJ9jjeoXftM6CfztsjOAA==", "requires": { - "has-flag": "^4.0.0" + "@types/json-schema": "^7.0.6", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + } + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" + }, + "terser": { + "version": "5.3.8", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.3.8.tgz", + "integrity": "sha512-zVotuHoIfnYjtlurOouTazciEfL7V38QMAOhGqpXDEg6yT13cF4+fEP9b0rrCEQTn+tT46uxgFsTZzhygk+CzQ==", + "requires": { + "commander": "^2.20.0", + "source-map": "~0.7.2", + "source-map-support": "~0.5.19" + }, + "dependencies": { + "source-map": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", + "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==" + } } } } }, "test-exclude": { - "version": "5.2.3", - "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-5.2.3.tgz", - "integrity": "sha512-M+oxtseCFO3EDtAaGH7iiej3CBkzXqFMbzqYAACdzKui4eZA+pq3tZEwChvOdNfa7xxy8BfbmgJSIr43cC/+2g==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", + "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", "requires": { - "glob": "^7.1.3", - "minimatch": "^3.0.4", - "read-pkg-up": "^4.0.0", - "require-main-filename": "^2.0.0" + "@istanbuljs/schema": "^0.1.2", + "glob": "^7.1.4", + "minimatch": "^3.0.4" } }, "text-table": { @@ -13426,9 +16330,9 @@ "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=" }, "throat": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/throat/-/throat-4.1.0.tgz", - "integrity": "sha1-iQN8vJLFarGJJua6TLsgDhVnKmo=" + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/throat/-/throat-5.0.0.tgz", + "integrity": "sha512-fcwX4mndzpLQKBS1DVYhGAcYaYt7vsHNIvQV+WXMvnow5cgjPphq5CaayLaGsjRdSCKZFNGt7/GYAuXaNOiYCA==" }, "through": { "version": "2.3.8", @@ -13525,12 +16429,11 @@ } }, "to-regex-range": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", - "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", "requires": { - "is-number": "^3.0.0", - "repeat-string": "^1.6.1" + "is-number": "^7.0.0" } }, "toidentifier": { @@ -13539,26 +16442,27 @@ "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==" }, "tough-cookie": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", - "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-3.0.1.tgz", + "integrity": "sha512-yQyJ0u4pZsv9D4clxO69OEjLWYw+jbgspjTue4lTQZLfV0c5l1VmK2y1JK8E9ahdpltPOaAThPcp5nKPUgSnsg==", "requires": { + "ip-regex": "^2.1.0", "psl": "^1.1.28", "punycode": "^2.1.1" } }, "tr46": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-1.0.1.tgz", - "integrity": "sha1-qLE/1r/SSJUZZ0zN5VujaTtwbQk=", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-2.0.2.tgz", + "integrity": "sha512-3n1qG+/5kg+jrbTzwAykB5yRYtQCTqOGKq5U5PE3b0a1/mzo6snDhjGS0zJVJunO0NrT3Dg1MLy5TjWP/UJppg==", "requires": { - "punycode": "^2.1.0" + "punycode": "^2.1.1" } }, "transformation-matrix": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/transformation-matrix/-/transformation-matrix-2.2.0.tgz", - "integrity": "sha512-cxs7k1YT05BgY03PZg8P4MJUcLCqYdG+web+rXdTpyCYfyu6u6CS+X0hSMkHHdFrWpe5gsIQwwPAik+K6UnuMw==" + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/transformation-matrix/-/transformation-matrix-2.5.0.tgz", + "integrity": "sha512-Z9UotSHOWMcqYYKwQUts49CjCH8H51HBbPN4uiQIwNpGMZs70LpugThBmLpUy2LFdrbfXGhdlu4WJ3yILK6kcw==" }, "trim-newlines": { "version": "1.0.0", @@ -13573,15 +16477,41 @@ "glob": "^7.1.2" } }, + "tryer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/tryer/-/tryer-1.0.1.tgz", + "integrity": "sha512-c3zayb8/kWWpycWYg87P71E1S1ZL6b6IJxfb5fvsUgsf0S2MVGaDhDXXjDMpdCpfWXqptc+4mXwmiy1ypXqRAA==" + }, "ts-pnp": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/ts-pnp/-/ts-pnp-1.1.6.tgz", - "integrity": "sha512-CrG5GqAAzMT7144Cl+UIFP7mz/iIhiy+xQ6GGcnjTezhALT02uPMRw7tgDSESgB5MsfKt55+GPWw4ir1kVtMIQ==" + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/ts-pnp/-/ts-pnp-1.2.0.tgz", + "integrity": "sha512-csd+vJOb/gkzvcCHgTGSChYpy5f1/XKNsmvBGO4JXS+z1v2HobugDz4s1IeFXM3wZB44uczs+eazB5Q/ccdhQw==" + }, + "tsconfig-paths": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.9.0.tgz", + "integrity": "sha512-dRcuzokWhajtZWkQsDVKbWyY+jgcLC5sqJhg2PSgf4ZkH2aHPvaOY8YWGhmjb68b5qqTfasSsDO9k7RUiEmZAw==", + "requires": { + "@types/json5": "^0.0.29", + "json5": "^1.0.1", + "minimist": "^1.2.0", + "strip-bom": "^3.0.0" + }, + "dependencies": { + "json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "requires": { + "minimist": "^1.2.0" + } + } + } }, "tslib": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.11.1.tgz", - "integrity": "sha512-aZW88SY8kQbU7gpV19lN24LtXh/yD4ZZg6qieAJDDg+YBsJcSmLGK9QpnUjAKVG/xefmvJGd1WUmfpT/g6AJGA==" + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" }, "tsutils": { "version": "3.17.1", @@ -13615,18 +16545,17 @@ "integrity": "sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==" }, "type-check": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", - "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", "requires": { - "prelude-ls": "~1.1.2" + "prelude-ls": "^1.2.1" } }, "type-detect": { "version": "4.0.8", "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", - "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", - "dev": true + "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==" }, "type-fest": { "version": "0.8.1", @@ -13647,10 +16576,18 @@ "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=" }, + "typedarray-to-buffer": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", + "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", + "requires": { + "is-typedarray": "^1.0.0" + } + }, "typescript": { - "version": "3.9.7", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.9.7.tgz", - "integrity": "sha512-BLbiRkiBzAwsjut4x/dsibSTB6yWpwT5qWmC2OfuCg3GgVQCSgMs4vEctYPhsaGtd0AeuuHMkjZ2h2WG8MSzRw==" + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.0.3.tgz", + "integrity": "sha512-tEu6DGxGgRJPb/mVPIZ48e69xCn2yRmCgYmDugAVwmJ6o+0u1RI18eO7E7WBTLYLaEVVOhwQmcdhQHweux/WPg==" }, "ua-parser-js": { "version": "0.7.20", @@ -13738,10 +16675,18 @@ "imurmurhash": "^0.1.4" } }, + "unique-string": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-1.0.0.tgz", + "integrity": "sha1-nhBXzKhRq7kzmPizOuGHuZyuwRo=", + "requires": { + "crypto-random-string": "^1.0.0" + } + }, "universalify": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", - "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==" + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-1.0.0.tgz", + "integrity": "sha512-rb6X1W158d7pRQBg5gkR8uPaSfiids68LTJQYOtEUhoJUWBdaQHsuT/EUduxXYxcrt4r5PJ4fuHW1MHT6p0qug==" }, "unpipe": { "version": "1.0.0", @@ -13824,13 +16769,54 @@ } }, "url-loader": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/url-loader/-/url-loader-2.3.0.tgz", - "integrity": "sha512-goSdg8VY+7nPZKUEChZSEtW5gjbS66USIGCeSJ1OVOJ7Yfuh/36YxCwMi5HVEJh6mqUYOoy3NJ0vlOMrWsSHog==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/url-loader/-/url-loader-4.1.1.tgz", + "integrity": "sha512-3BTV812+AVHHOJQO8O5MkWgZ5aosP7GnROJwvzLS9hWDj00lZ6Z0wNak423Lp9PBZN05N+Jk/N5Si8jRAlGyWA==", "requires": { - "loader-utils": "^1.2.3", - "mime": "^2.4.4", - "schema-utils": "^2.5.0" + "loader-utils": "^2.0.0", + "mime-types": "^2.1.27", + "schema-utils": "^3.0.0" + }, + "dependencies": { + "ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" + }, + "mime-db": { + "version": "1.44.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.44.0.tgz", + "integrity": "sha512-/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg==" + }, + "mime-types": { + "version": "2.1.27", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.27.tgz", + "integrity": "sha512-JIhqnCasI9yD+SsmkquHBxTSEuZdQX5BuQnS2Vc7puQQQ+8yiP5AY5uWhpdv4YL4VM5c6iliiYWPgJ/nJQLp7w==", + "requires": { + "mime-db": "1.44.0" + } + }, + "schema-utils": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.0.0.tgz", + "integrity": "sha512-6D82/xSzO094ajanoOSbe4YvXWMfn2A//8Y1+MUqFAJul5Bs+yn36xbK9OtNDcRVSBJ9jjeoXftM6CfztsjOAA==", + "requires": { + "@types/json-schema": "^7.0.6", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + } + } } }, "url-parse": { @@ -13848,17 +16834,17 @@ "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==" }, "util": { - "version": "0.10.3", - "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", - "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=", + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/util/-/util-0.11.1.tgz", + "integrity": "sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ==", "requires": { - "inherits": "2.0.1" + "inherits": "2.0.3" }, "dependencies": { "inherits": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", - "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=" + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" } } }, @@ -13876,6 +16862,26 @@ "es-abstract": "^1.17.2", "has-symbols": "^1.0.1", "object.getownpropertydescriptors": "^2.1.0" + }, + "dependencies": { + "es-abstract": { + "version": "1.17.7", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.7.tgz", + "integrity": "sha512-VBl/gnfcJ7OercKA9MVaegWsBHFjV492syMudcnQZvt/Dw8ezpcOHYZXa/J96O8vx+g4x65YKhxOwDUh63aS5g==", + "requires": { + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1", + "is-callable": "^1.2.2", + "is-regex": "^1.1.1", + "object-inspect": "^1.8.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.1", + "string.prototype.trimend": "^1.0.1", + "string.prototype.trimstart": "^1.0.1" + } + } } }, "utila": { @@ -13898,6 +16904,23 @@ "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.1.1.tgz", "integrity": "sha512-8OQ9CL+VWyt3JStj7HX7/ciTL2V3Rl1Wf5OL+SNTm0yK1KvtReVulksyeRnCANHHuUxHlQig+JJDlUhBt1NQDQ==" }, + "v8-to-istanbul": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-6.0.1.tgz", + "integrity": "sha512-PzM1WlqquhBvsV+Gco6WSFeg1AGdD53ccMRkFeyHRE/KRZaVacPOmQYP3EeVgDBtKD2BJ8kgynBQ5OtKiHCH+w==", + "requires": { + "@types/istanbul-lib-coverage": "^2.0.1", + "convert-source-map": "^1.6.0", + "source-map": "^0.7.3" + }, + "dependencies": { + "source-map": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", + "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==" + } + } + }, "validate-npm-package-license": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", @@ -13908,9 +16931,9 @@ } }, "validator": { - "version": "12.2.0", - "resolved": "https://registry.npmjs.org/validator/-/validator-12.2.0.tgz", - "integrity": "sha512-jJfE/DW6tIK1Ek8nCfNFqt8Wb3nzMoAbocBF6/Icgg1ZFSBpObdnwVY2jQj6qUqzhx5jc71fpvBWyLGO7Xl+nQ==" + "version": "13.1.17", + "resolved": "https://registry.npmjs.org/validator/-/validator-13.1.17.tgz", + "integrity": "sha512-zL5QBoemJ3jYFb2/j38y7ljhwYGXVLUp8H6W1nVxadnAOvUOytec+L7BHh1oBQ82/TzWXHd+GSaxUWp4lROkLg==" }, "value-equal": { "version": "1.0.1", @@ -13951,12 +16974,10 @@ } }, "w3c-xmlserializer": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-1.1.2.tgz", - "integrity": "sha512-p10l/ayESzrBMYWRID6xbuCKh2Fp77+sA0doRuGn4tTIMrrZVeqfpKjXHY+oDh3K4nLdPgNwMTVP6Vp4pvqbNg==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-2.0.0.tgz", + "integrity": "sha512-4tzD0mF8iSiMiNs30BiLO3EpfGLZUT2MSX/G+o7ZywDzliWQ3OPtTZ0PTC3B3ca1UAf4cJMHB+2Bf56EriJuRA==", "requires": { - "domexception": "^1.0.1", - "webidl-conversions": "^4.0.2", "xml-name-validator": "^3.0.0" } }, @@ -13987,29 +17008,10 @@ "watchpack-chokidar2": "^2.0.0" }, "dependencies": { - "anymatch": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz", - "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==", - "optional": true, - "requires": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - } - }, - "braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "optional": true, - "requires": { - "fill-range": "^7.0.1" - } - }, "chokidar": { - "version": "3.4.2", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.4.2.tgz", - "integrity": "sha512-IZHaDeBeI+sZJRX7lGcXsdzgvZqKv6sECqsbErJA4mHWfpRrD8B97kSFN4cQz6nGBGiuFia1MKR4d6c1o8Cv7A==", + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.4.3.tgz", + "integrity": "sha512-DtM3g7juCXQxFVSNPNByEC2+NImtBuxQQvWlHunpJIS5Ocr0lG306cC7FCi7cEA0fzmybPUIl4txBIobk1gGOQ==", "optional": true, "requires": { "anymatch": "~3.1.1", @@ -14019,47 +17021,17 @@ "is-binary-path": "~2.1.0", "is-glob": "~4.0.1", "normalize-path": "~3.0.0", - "readdirp": "~3.4.0" + "readdirp": "~3.5.0" } }, - "fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "optional": true, - "requires": { - "to-regex-range": "^5.0.1" - } - }, - "is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "optional": true - }, - "normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "optional": true - }, "readdirp": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.4.0.tgz", - "integrity": "sha512-0xe001vZBnJEK+uKcj8qOhyAKPzIT+gStxWr3LCB0DwcXR5NZJ3IaC+yGnHCYzB/S7ov3m3EEbZI2zeNvX+hGQ==", + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.5.0.tgz", + "integrity": "sha512-cMhu7c/8rdhkHXWsY+osBhfSy0JikwpHK/5+imo+LpeasTF8ouErHrlYkwT0++njiyuDvc7OFY5T3ukvZ8qmFQ==", "optional": true, "requires": { "picomatch": "^2.2.1" } - }, - "to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "optional": true, - "requires": { - "is-number": "^7.0.0" - } } } }, @@ -14072,12 +17044,62 @@ "chokidar": "^2.1.8" }, "dependencies": { + "anymatch": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", + "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", + "optional": true, + "requires": { + "micromatch": "^3.1.4", + "normalize-path": "^2.1.1" + }, + "dependencies": { + "normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "optional": true, + "requires": { + "remove-trailing-separator": "^1.0.1" + } + } + } + }, "binary-extensions": { "version": "1.13.1", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==", "optional": true }, + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "optional": true, + "requires": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "optional": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, "chokidar": { "version": "2.1.8", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", @@ -14098,6 +17120,29 @@ "upath": "^1.1.1" } }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "optional": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "optional": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, "fsevents": { "version": "1.2.13", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.13.tgz", @@ -14137,12 +17182,53 @@ "binary-extensions": "^1.0.0" } }, - "normalize-path": { + "is-number": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "optional": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "optional": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", "optional": true }, + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "optional": true, + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + } + }, "readdirp": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", @@ -14153,6 +17239,16 @@ "micromatch": "^3.1.10", "readable-stream": "^2.0.2" } + }, + "to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "optional": true, + "requires": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + } } } }, @@ -14165,44 +17261,71 @@ } }, "webidl-conversions": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz", - "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==" + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-6.1.0.tgz", + "integrity": "sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w==" }, "webpack": { - "version": "4.42.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.42.0.tgz", - "integrity": "sha512-EzJRHvwQyBiYrYqhyjW9AqM90dE4+s1/XtCfn7uWg6cS72zH+2VPFAlsnW0+W0cDi0XRjNKUMoJtpSi50+Ph6w==", + "version": "4.44.2", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.44.2.tgz", + "integrity": "sha512-6KJVGlCxYdISyurpQ0IPTklv+DULv05rs2hseIXer6D7KrUicRDLFb4IUM1S6LUAKypPM/nSiVSuv8jHu1m3/Q==", "requires": { - "@webassemblyjs/ast": "1.8.5", - "@webassemblyjs/helper-module-context": "1.8.5", - "@webassemblyjs/wasm-edit": "1.8.5", - "@webassemblyjs/wasm-parser": "1.8.5", - "acorn": "^6.2.1", + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-module-context": "1.9.0", + "@webassemblyjs/wasm-edit": "1.9.0", + "@webassemblyjs/wasm-parser": "1.9.0", + "acorn": "^6.4.1", "ajv": "^6.10.2", "ajv-keywords": "^3.4.1", "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^4.1.0", + "enhanced-resolve": "^4.3.0", "eslint-scope": "^4.0.3", "json-parse-better-errors": "^1.0.2", "loader-runner": "^2.4.0", "loader-utils": "^1.2.3", "memory-fs": "^0.4.1", "micromatch": "^3.1.10", - "mkdirp": "^0.5.1", + "mkdirp": "^0.5.3", "neo-async": "^2.6.1", "node-libs-browser": "^2.2.1", "schema-utils": "^1.0.0", "tapable": "^1.1.3", "terser-webpack-plugin": "^1.4.3", - "watchpack": "^1.6.0", + "watchpack": "^1.7.4", "webpack-sources": "^1.4.1" }, "dependencies": { "acorn": { - "version": "6.4.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.1.tgz", - "integrity": "sha512-ZVA9k326Nwrj3Cj9jlh3wGFutC2ZornPNARZwsNYqQYgN0EsV2d53w5RN/co65Ohn4sUAUtb1rSUAOD6XN9idA==" + "version": "6.4.2", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.2.tgz", + "integrity": "sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ==" + }, + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "requires": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "^0.1.0" + } + } + } }, "cacache": { "version": "12.0.4", @@ -14226,6 +17349,11 @@ "y18n": "^4.0.0" } }, + "chownr": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", + "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==" + }, "eslint-scope": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.3.tgz", @@ -14235,6 +17363,101 @@ "estraverse": "^4.1.1" } }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "requires": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-wsl": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", + "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=" + }, + "json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "requires": { + "minimist": "^1.2.0" + } + }, + "kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==" + }, + "loader-utils": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", + "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^1.0.1" + } + }, + "lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "requires": { + "yallist": "^3.0.2" + } + }, + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + } + }, "schema-utils": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", @@ -14245,6 +17468,14 @@ "ajv-keywords": "^3.1.0" } }, + "serialize-javascript": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-4.0.0.tgz", + "integrity": "sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==", + "requires": { + "randombytes": "^2.1.0" + } + }, "ssri": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/ssri/-/ssri-6.0.1.tgz", @@ -14268,6 +17499,20 @@ "webpack-sources": "^1.4.0", "worker-farm": "^1.7.0" } + }, + "to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "requires": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + } + }, + "yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" } } }, @@ -14328,11 +17573,57 @@ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" }, + "anymatch": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", + "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", + "requires": { + "micromatch": "^3.1.4", + "normalize-path": "^2.1.1" + }, + "dependencies": { + "normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "requires": { + "remove-trailing-separator": "^1.0.1" + } + } + } + }, "binary-extensions": { "version": "1.13.1", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==" }, + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "requires": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, "chokidar": { "version": "2.1.8", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", @@ -14352,6 +17643,27 @@ "upath": "^1.1.1" } }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "requires": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, "fsevents": { "version": "1.2.13", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.13.tgz", @@ -14380,6 +17692,15 @@ } } }, + "import-local": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-2.0.0.tgz", + "integrity": "sha512-b6s04m3O+s3CGSbqDIyP4R6aAwAeYlVq9+WUWep6iHa8ETRf9yei1U48C5MmfJmV9AiLYYBKPMq/W+/WRpQmCQ==", + "requires": { + "pkg-dir": "^3.0.0", + "resolve-cwd": "^2.0.0" + } + }, "is-absolute-url": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-3.0.3.tgz", @@ -14393,10 +17714,48 @@ "binary-extensions": "^1.0.0" } }, - "normalize-path": { + "is-number": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==" + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==" + }, + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + } }, "readdirp": { "version": "2.2.1", @@ -14408,6 +17767,19 @@ "readable-stream": "^2.0.2" } }, + "resolve-cwd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-2.0.0.tgz", + "integrity": "sha1-AKn3OHVW4nA46uIyyqNypqWbZlo=", + "requires": { + "resolve-from": "^3.0.0" + } + }, + "resolve-from": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", + "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=" + }, "schema-utils": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", @@ -14418,6 +17790,11 @@ "ajv-keywords": "^3.1.0" } }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" + }, "strip-ansi": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", @@ -14434,6 +17811,15 @@ "has-flag": "^3.0.0" } }, + "to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "requires": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + } + }, "ws": { "version": "6.2.1", "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.1.tgz", @@ -14451,6 +17837,13 @@ "requires": { "ansi-colors": "^3.0.0", "uuid": "^3.3.2" + }, + "dependencies": { + "ansi-colors": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.4.tgz", + "integrity": "sha512-hHUXGagefjN2iRrID63xckIvotOXOojhQKWIPUZ4mNUZ9nLZW+7FMNoE1lOkEhNWYsx/7ysGIuJYCiMAA9FnrA==" + } } }, "webpack-manifest-plugin": { @@ -14473,6 +17866,19 @@ "jsonfile": "^4.0.0", "universalify": "^0.1.0" } + }, + "jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", + "requires": { + "graceful-fs": "^4.1.6" + } + }, + "universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==" } } }, @@ -14517,13 +17923,13 @@ "integrity": "sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==" }, "whatwg-url": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-6.5.0.tgz", - "integrity": "sha512-rhRZRqx/TLJQWUpQ6bmrt2UV4f0HCQ463yQuONJqC6fO2VoEb1pTYddbe59SkYq87aoM5A3bdhMZiUiVws+fzQ==", + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-8.4.0.tgz", + "integrity": "sha512-vwTUFf6V4zhcPkWp/4CQPr1TW9Ml6SF4lVyaIMBdJw5i6qUUJ1QWM4Z6YYVkfka0OUIzVo/0aNtGVGk256IKWw==", "requires": { "lodash.sortby": "^4.7.0", - "tr46": "^1.0.1", - "webidl-conversions": "^4.0.2" + "tr46": "^2.0.2", + "webidl-conversions": "^6.1.0" } }, "which": { @@ -14587,164 +17993,213 @@ "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=" }, "workbox-background-sync": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/workbox-background-sync/-/workbox-background-sync-4.3.1.tgz", - "integrity": "sha512-1uFkvU8JXi7L7fCHVBEEnc3asPpiAL33kO495UMcD5+arew9IbKW2rV5lpzhoWcm/qhGB89YfO4PmB/0hQwPRg==", + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/workbox-background-sync/-/workbox-background-sync-5.1.4.tgz", + "integrity": "sha512-AH6x5pYq4vwQvfRDWH+vfOePfPIYQ00nCEB7dJRU1e0n9+9HMRyvI63FlDvtFT2AvXVRsXvUt7DNMEToyJLpSA==", "requires": { - "workbox-core": "^4.3.1" + "workbox-core": "^5.1.4" } }, "workbox-broadcast-update": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/workbox-broadcast-update/-/workbox-broadcast-update-4.3.1.tgz", - "integrity": "sha512-MTSfgzIljpKLTBPROo4IpKjESD86pPFlZwlvVG32Kb70hW+aob4Jxpblud8EhNb1/L5m43DUM4q7C+W6eQMMbA==", + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/workbox-broadcast-update/-/workbox-broadcast-update-5.1.4.tgz", + "integrity": "sha512-HTyTWkqXvHRuqY73XrwvXPud/FN6x3ROzkfFPsRjtw/kGZuZkPzfeH531qdUGfhtwjmtO/ZzXcWErqVzJNdXaA==", "requires": { - "workbox-core": "^4.3.1" + "workbox-core": "^5.1.4" } }, "workbox-build": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/workbox-build/-/workbox-build-4.3.1.tgz", - "integrity": "sha512-UHdwrN3FrDvicM3AqJS/J07X0KXj67R8Cg0waq1MKEOqzo89ap6zh6LmaLnRAjpB+bDIz+7OlPye9iii9KBnxw==", + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/workbox-build/-/workbox-build-5.1.4.tgz", + "integrity": "sha512-xUcZn6SYU8usjOlfLb9Y2/f86Gdo+fy1fXgH8tJHjxgpo53VVsqRX0lUDw8/JuyzNmXuo8vXX14pXX2oIm9Bow==", "requires": { - "@babel/runtime": "^7.3.4", - "@hapi/joi": "^15.0.0", + "@babel/core": "^7.8.4", + "@babel/preset-env": "^7.8.4", + "@babel/runtime": "^7.8.4", + "@hapi/joi": "^15.1.0", + "@rollup/plugin-node-resolve": "^7.1.1", + "@rollup/plugin-replace": "^2.3.1", + "@surma/rollup-plugin-off-main-thread": "^1.1.1", "common-tags": "^1.8.0", - "fs-extra": "^4.0.2", - "glob": "^7.1.3", - "lodash.template": "^4.4.0", - "pretty-bytes": "^5.1.0", + "fast-json-stable-stringify": "^2.1.0", + "fs-extra": "^8.1.0", + "glob": "^7.1.6", + "lodash.template": "^4.5.0", + "pretty-bytes": "^5.3.0", + "rollup": "^1.31.1", + "rollup-plugin-babel": "^4.3.3", + "rollup-plugin-terser": "^5.3.1", + "source-map": "^0.7.3", + "source-map-url": "^0.4.0", "stringify-object": "^3.3.0", "strip-comments": "^1.0.2", - "workbox-background-sync": "^4.3.1", - "workbox-broadcast-update": "^4.3.1", - "workbox-cacheable-response": "^4.3.1", - "workbox-core": "^4.3.1", - "workbox-expiration": "^4.3.1", - "workbox-google-analytics": "^4.3.1", - "workbox-navigation-preload": "^4.3.1", - "workbox-precaching": "^4.3.1", - "workbox-range-requests": "^4.3.1", - "workbox-routing": "^4.3.1", - "workbox-strategies": "^4.3.1", - "workbox-streams": "^4.3.1", - "workbox-sw": "^4.3.1", - "workbox-window": "^4.3.1" + "tempy": "^0.3.0", + "upath": "^1.2.0", + "workbox-background-sync": "^5.1.4", + "workbox-broadcast-update": "^5.1.4", + "workbox-cacheable-response": "^5.1.4", + "workbox-core": "^5.1.4", + "workbox-expiration": "^5.1.4", + "workbox-google-analytics": "^5.1.4", + "workbox-navigation-preload": "^5.1.4", + "workbox-precaching": "^5.1.4", + "workbox-range-requests": "^5.1.4", + "workbox-routing": "^5.1.4", + "workbox-strategies": "^5.1.4", + "workbox-streams": "^5.1.4", + "workbox-sw": "^5.1.4", + "workbox-window": "^5.1.4" }, "dependencies": { - "fs-extra": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-4.0.3.tgz", - "integrity": "sha512-q6rbdDd1o2mAnQreO7YADIxf/Whx4AHBiRf6d+/cVT8h44ss+lHgxf1FemcqDnQt9X3ct4McHr+JMGlYSsK7Cg==", + "@babel/runtime": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.12.1.tgz", + "integrity": "sha512-J5AIf3vPj3UwXaAzb5j1xM4WAQDX3EMgemF8rjCP3SoW09LfRKAXQKt6CoVYl230P6iWdRcBbnLDDdnqWxZSCA==", "requires": { - "graceful-fs": "^4.1.2", + "regenerator-runtime": "^0.13.4" + } + }, + "fs-extra": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", + "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", + "requires": { + "graceful-fs": "^4.2.0", "jsonfile": "^4.0.0", "universalify": "^0.1.0" } + }, + "jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", + "requires": { + "graceful-fs": "^4.1.6" + } + }, + "regenerator-runtime": { + "version": "0.13.7", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz", + "integrity": "sha512-a54FxoJDIr27pgf7IgeQGxmqUNYrcV338lf/6gH456HZ/PhX+5BcwHXG9ajESmwe6WRO0tAzRUrRmNONWgkrew==" + }, + "source-map": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", + "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==" + }, + "universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==" } } }, "workbox-cacheable-response": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/workbox-cacheable-response/-/workbox-cacheable-response-4.3.1.tgz", - "integrity": "sha512-Rp5qlzm6z8IOvnQNkCdO9qrDgDpoPNguovs0H8C+wswLuPgSzSp9p2afb5maUt9R1uTIwOXrVQMmPfPypv+npw==", + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/workbox-cacheable-response/-/workbox-cacheable-response-5.1.4.tgz", + "integrity": "sha512-0bfvMZs0Of1S5cdswfQK0BXt6ulU5kVD4lwer2CeI+03czHprXR3V4Y8lPTooamn7eHP8Iywi5QjyAMjw0qauA==", "requires": { - "workbox-core": "^4.3.1" + "workbox-core": "^5.1.4" } }, "workbox-core": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/workbox-core/-/workbox-core-4.3.1.tgz", - "integrity": "sha512-I3C9jlLmMKPxAC1t0ExCq+QoAMd0vAAHULEgRZ7kieCdUd919n53WC0AfvokHNwqRhGn+tIIj7vcb5duCjs2Kg==" + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/workbox-core/-/workbox-core-5.1.4.tgz", + "integrity": "sha512-+4iRQan/1D8I81nR2L5vcbaaFskZC2CL17TLbvWVzQ4qiF/ytOGF6XeV54pVxAvKUtkLANhk8TyIUMtiMw2oDg==" }, "workbox-expiration": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/workbox-expiration/-/workbox-expiration-4.3.1.tgz", - "integrity": "sha512-vsJLhgQsQouv9m0rpbXubT5jw0jMQdjpkum0uT+d9tTwhXcEZks7qLfQ9dGSaufTD2eimxbUOJfWLbNQpIDMPw==", + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/workbox-expiration/-/workbox-expiration-5.1.4.tgz", + "integrity": "sha512-oDO/5iC65h2Eq7jctAv858W2+CeRW5e0jZBMNRXpzp0ZPvuT6GblUiHnAsC5W5lANs1QS9atVOm4ifrBiYY7AQ==", "requires": { - "workbox-core": "^4.3.1" + "workbox-core": "^5.1.4" } }, "workbox-google-analytics": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/workbox-google-analytics/-/workbox-google-analytics-4.3.1.tgz", - "integrity": "sha512-xzCjAoKuOb55CBSwQrbyWBKqp35yg1vw9ohIlU2wTy06ZrYfJ8rKochb1MSGlnoBfXGWss3UPzxR5QL5guIFdg==", + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/workbox-google-analytics/-/workbox-google-analytics-5.1.4.tgz", + "integrity": "sha512-0IFhKoEVrreHpKgcOoddV+oIaVXBFKXUzJVBI+nb0bxmcwYuZMdteBTp8AEDJacENtc9xbR0wa9RDCnYsCDLjA==", "requires": { - "workbox-background-sync": "^4.3.1", - "workbox-core": "^4.3.1", - "workbox-routing": "^4.3.1", - "workbox-strategies": "^4.3.1" + "workbox-background-sync": "^5.1.4", + "workbox-core": "^5.1.4", + "workbox-routing": "^5.1.4", + "workbox-strategies": "^5.1.4" } }, "workbox-navigation-preload": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/workbox-navigation-preload/-/workbox-navigation-preload-4.3.1.tgz", - "integrity": "sha512-K076n3oFHYp16/C+F8CwrRqD25GitA6Rkd6+qAmLmMv1QHPI2jfDwYqrytOfKfYq42bYtW8Pr21ejZX7GvALOw==", + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/workbox-navigation-preload/-/workbox-navigation-preload-5.1.4.tgz", + "integrity": "sha512-Wf03osvK0wTflAfKXba//QmWC5BIaIZARU03JIhAEO2wSB2BDROWI8Q/zmianf54kdV7e1eLaIEZhth4K4MyfQ==", "requires": { - "workbox-core": "^4.3.1" + "workbox-core": "^5.1.4" } }, "workbox-precaching": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/workbox-precaching/-/workbox-precaching-4.3.1.tgz", - "integrity": "sha512-piSg/2csPoIi/vPpp48t1q5JLYjMkmg5gsXBQkh/QYapCdVwwmKlU9mHdmy52KsDGIjVaqEUMFvEzn2LRaigqQ==", + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/workbox-precaching/-/workbox-precaching-5.1.4.tgz", + "integrity": "sha512-gCIFrBXmVQLFwvAzuGLCmkUYGVhBb7D1k/IL7pUJUO5xacjLcFUaLnnsoVepBGAiKw34HU1y/YuqvTKim9qAZA==", "requires": { - "workbox-core": "^4.3.1" + "workbox-core": "^5.1.4" } }, "workbox-range-requests": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/workbox-range-requests/-/workbox-range-requests-4.3.1.tgz", - "integrity": "sha512-S+HhL9+iTFypJZ/yQSl/x2Bf5pWnbXdd3j57xnb0V60FW1LVn9LRZkPtneODklzYuFZv7qK6riZ5BNyc0R0jZA==", + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/workbox-range-requests/-/workbox-range-requests-5.1.4.tgz", + "integrity": "sha512-1HSujLjgTeoxHrMR2muDW2dKdxqCGMc1KbeyGcmjZZAizJTFwu7CWLDmLv6O1ceWYrhfuLFJO+umYMddk2XMhw==", "requires": { - "workbox-core": "^4.3.1" + "workbox-core": "^5.1.4" } }, "workbox-routing": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/workbox-routing/-/workbox-routing-4.3.1.tgz", - "integrity": "sha512-FkbtrODA4Imsi0p7TW9u9MXuQ5P4pVs1sWHK4dJMMChVROsbEltuE79fBoIk/BCztvOJ7yUpErMKa4z3uQLX+g==", + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/workbox-routing/-/workbox-routing-5.1.4.tgz", + "integrity": "sha512-8ljknRfqE1vEQtnMtzfksL+UXO822jJlHTIR7+BtJuxQ17+WPZfsHqvk1ynR/v0EHik4x2+826Hkwpgh4GKDCw==", "requires": { - "workbox-core": "^4.3.1" + "workbox-core": "^5.1.4" } }, "workbox-strategies": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/workbox-strategies/-/workbox-strategies-4.3.1.tgz", - "integrity": "sha512-F/+E57BmVG8dX6dCCopBlkDvvhg/zj6VDs0PigYwSN23L8hseSRwljrceU2WzTvk/+BSYICsWmRq5qHS2UYzhw==", + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/workbox-strategies/-/workbox-strategies-5.1.4.tgz", + "integrity": "sha512-VVS57LpaJTdjW3RgZvPwX0NlhNmscR7OQ9bP+N/34cYMDzXLyA6kqWffP6QKXSkca1OFo/v6v7hW7zrrguo6EA==", "requires": { - "workbox-core": "^4.3.1" + "workbox-core": "^5.1.4", + "workbox-routing": "^5.1.4" } }, "workbox-streams": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/workbox-streams/-/workbox-streams-4.3.1.tgz", - "integrity": "sha512-4Kisis1f/y0ihf4l3u/+ndMkJkIT4/6UOacU3A4BwZSAC9pQ9vSvJpIi/WFGQRH/uPXvuVjF5c2RfIPQFSS2uA==", + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/workbox-streams/-/workbox-streams-5.1.4.tgz", + "integrity": "sha512-xU8yuF1hI/XcVhJUAfbQLa1guQUhdLMPQJkdT0kn6HP5CwiPOGiXnSFq80rAG4b1kJUChQQIGPrq439FQUNVrw==", "requires": { - "workbox-core": "^4.3.1" + "workbox-core": "^5.1.4", + "workbox-routing": "^5.1.4" } }, "workbox-sw": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/workbox-sw/-/workbox-sw-4.3.1.tgz", - "integrity": "sha512-0jXdusCL2uC5gM3yYFT6QMBzKfBr2XTk0g5TPAV4y8IZDyVNDyj1a8uSXy3/XrvkVTmQvLN4O5k3JawGReXr9w==" + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/workbox-sw/-/workbox-sw-5.1.4.tgz", + "integrity": "sha512-9xKnKw95aXwSNc8kk8gki4HU0g0W6KXu+xks7wFuC7h0sembFnTrKtckqZxbSod41TDaGh+gWUA5IRXrL0ECRA==" }, "workbox-webpack-plugin": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/workbox-webpack-plugin/-/workbox-webpack-plugin-4.3.1.tgz", - "integrity": "sha512-gJ9jd8Mb8wHLbRz9ZvGN57IAmknOipD3W4XNE/Lk/4lqs5Htw4WOQgakQy/o/4CoXQlMCYldaqUg+EJ35l9MEQ==", + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/workbox-webpack-plugin/-/workbox-webpack-plugin-5.1.4.tgz", + "integrity": "sha512-PZafF4HpugZndqISi3rZ4ZK4A4DxO8rAqt2FwRptgsDx7NF8TVKP86/huHquUsRjMGQllsNdn4FNl8CD/UvKmQ==", "requires": { - "@babel/runtime": "^7.0.0", - "json-stable-stringify": "^1.0.1", - "workbox-build": "^4.3.1" + "@babel/runtime": "^7.5.5", + "fast-json-stable-stringify": "^2.0.0", + "source-map-url": "^0.4.0", + "upath": "^1.1.2", + "webpack-sources": "^1.3.0", + "workbox-build": "^5.1.4" } }, "workbox-window": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/workbox-window/-/workbox-window-4.3.1.tgz", - "integrity": "sha512-C5gWKh6I58w3GeSc0wp2Ne+rqVw8qwcmZnQGpjiek8A2wpbxSJb1FdCoQVO+jDJs35bFgo/WETgl1fqgsxN0Hg==", + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/workbox-window/-/workbox-window-5.1.4.tgz", + "integrity": "sha512-vXQtgTeMCUq/4pBWMfQX8Ee7N2wVC4Q7XYFqLnfbXJ2hqew/cU1uMTD2KqGEgEpE4/30luxIxgE+LkIa8glBYw==", "requires": { - "workbox-core": "^4.3.1" + "workbox-core": "^5.1.4" } }, "worker-farm": { @@ -14809,22 +18264,20 @@ } }, "write-file-atomic": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.4.1.tgz", - "integrity": "sha512-TGHFeZEZMnv+gBFRfjAcxL5bPHrsGKtnb4qsFAws7/vlh+QfwAaySIw4AXP9ZskTTh5GWu3FLuJhsWVdiJPGvg==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", + "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", "requires": { - "graceful-fs": "^4.1.11", "imurmurhash": "^0.1.4", - "signal-exit": "^3.0.2" + "is-typedarray": "^1.0.0", + "signal-exit": "^3.0.2", + "typedarray-to-buffer": "^3.1.5" } }, "ws": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/ws/-/ws-5.2.2.tgz", - "integrity": "sha512-jaHFD6PFv6UgoIVda6qZllptQsMlDEJkTQcybzzXDYM1XO9Y8em691FGMPmM46WGyLU4z9KMgQN+qrux/nhlHA==", - "requires": { - "async-limiter": "~1.0.0" - } + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.3.1.tgz", + "integrity": "sha512-D3RuNkynyHmEJIpD2qrgVkc9DQ23OrN/moAwZX4L8DfvszsJxpjQuUq3LMx6HoYji9fbIOBY18XWBsAux1ZZUA==" }, "xml-name-validator": { "version": "3.0.0", @@ -14836,14 +18289,6 @@ "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==" }, - "xregexp": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/xregexp/-/xregexp-4.3.0.tgz", - "integrity": "sha512-7jXDIFXh5yJ/orPn4SXjuVrWWoi4Cr8jfV1eHv9CixKSbU+jY4mxfrBwAuDvupPNKpMUY+FeIqsVw/JLT9+B8g==", - "requires": { - "@babel/runtime-corejs3": "^7.8.3" - } - }, "xtend": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", diff --git a/package.json b/package.json index 0c51a06..f213215 100644 --- a/package.json +++ b/package.json @@ -3,19 +3,19 @@ "version": "0.1.0", "private": true, "dependencies": { - "@fortawesome/fontawesome-svg-core": "^1.2.30", - "@fortawesome/free-solid-svg-icons": "^5.14.0", + "@fortawesome/fontawesome-svg-core": "^1.2.32", + "@fortawesome/free-solid-svg-icons": "^5.15.1", "@fortawesome/react-fontawesome": "^0.1.11", "babel-runtime": "^6.26.0", - "bootstrap": "^4.5.2", + "bootstrap": "^4.5.3", "classnames": "^2.2.6", - "d3-array": "^2.6.0", - "d3-axis": "^1.0.12", - "d3-scale": "^3.2.2", - "d3-scale-chromatic": "^1.5.0", - "d3-selection": "^1.4.2", - "d3-shape": "^1.3.7", - "d3-time-format": "^2.3.0", + "d3-array": "^2.8.0", + "d3-axis": "^2.0.0", + "d3-scale": "^3.2.3", + "d3-scale-chromatic": "^2.0.0", + "d3-selection": "^2.0.0", + "d3-shape": "^2.0.0", + "d3-time-format": "^3.0.0", "es6-promise": "^4.2.8", "file-saver": "^2.0.2", "flux": "^3.1.3", @@ -25,14 +25,14 @@ "jszip": "^3.5.0", "libcimsvg": "git+https://git.rwth-aachen.de/acs/public/cim/pintura-npm-package.git", "lodash": "^4.17.20", - "moment": "^2.27.0", - "multiselect-react-dropdown": "^1.5.7", + "moment": "^2.29.1", + "multiselect-react-dropdown": "^1.6.1", "node-sass": "^4.14.1", "popper.js": "^1.16.1", "prop-types": "^15.7.2", - "rc-slider": "^9.3.1", - "react": "^16.13.1", - "react-bootstrap": "^1.3.0", + "rc-slider": "^9.5.4", + "react": "^16.14.0", + "react-bootstrap": "^1.4.0", "react-bootstrap-time-picker": "^2.0.1", "react-collapse": "^5.0.1", "react-color": "^2.18.1", @@ -40,20 +40,20 @@ "react-d3": "^0.4.0", "react-dnd": "^10.0.2", "react-dnd-html5-backend": "^10.0.2", - "react-dom": "^16.13.1", + "react-dom": "^16.14.0", "react-fullscreenable": "^2.5.1-0", - "react-grid-system": "^6.4.2", + "react-grid-system": "^7.1.1", "react-json-view": "^1.19.1", - "react-notification-system": "^0.3.0", - "react-rnd": "^10.2.2", + "react-notification-system": "^0.4.0", + "react-rnd": "^10.2.3", "react-router": "^5.2.0", "react-router-dom": "^5.2.0", - "react-scripts": "^3.4.3", - "react-svg-pan-zoom": "^3.8.0", - "sass": "^1.26.10", - "superagent": "^5.3.1", - "typescript": "^3.9.7", - "validator": "^12.2.0" + "react-scripts": "^4.0.0", + "react-svg-pan-zoom": "^3.8.1", + "sass": "^1.27.0", + "superagent": "^6.1.0", + "typescript": "^4.0.3", + "validator": "^13.1.17" }, "devDependencies": { "chai": "^4.2.0" From a2c33301853704228cfe9c87c309c1a18dc2b816 Mon Sep 17 00:00:00 2001 From: Sonja Happ Date: Mon, 26 Oct 2020 15:38:50 +0100 Subject: [PATCH 363/391] add xxl format to hidden header menu cases --- src/app.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/app.js b/src/app.js index 1b0024a..bcaced0 100644 --- a/src/app.js +++ b/src/app.js @@ -92,7 +92,7 @@ class App extends React.Component { {/* */} - + From 9a7503608c213b0ff407370e6c4167b5cd38f1d7 Mon Sep 17 00:00:00 2001 From: Sonja Happ Date: Mon, 26 Oct 2020 15:39:30 +0100 Subject: [PATCH 364/391] make all images in home page show up after update of file-loader package --- src/common/home.js | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/src/common/home.js b/src/common/home.js index bc1c5b7..053c293 100644 --- a/src/common/home.js +++ b/src/common/home.js @@ -58,7 +58,7 @@ class Home extends React.Component { return (
    - Logo VILLASweb + Logo VILLASweb

    Home

    Welcome to {config.instance} hosted by {config.admin.name}!
    @@ -73,7 +73,7 @@ class Home extends React.Component {

    Data Model

    - Datamodel VILLASweb + Datamodel VILLASweb

    Terminology

    @@ -124,13 +124,13 @@ class Home extends React.Component {
  • RESERVE a European Union’s Horizon 2020 research and innovation programme under grant agreement No 727481
  • JARA-ENERGY. Jülich-Aachen Research Alliance (JARA) is an initiative of RWTH Aachen University and Forschungszentrum Jülich.
  • - Logo EU - Logo EU - Logo UEL OP EFRE NRW - Logo UEL - Logo ACS + Logo EU + Logo EU + Logo UEL OP EFRE NRW + Logo UEL + Logo ACS { - //Logo JARA + //Logo JARA }
    ); From 95680ca5b7d5b4b916dd9245736c600e778b5e7c Mon Sep 17 00:00:00 2001 From: Sonja Happ Date: Mon, 26 Oct 2020 16:27:32 +0100 Subject: [PATCH 365/391] work on image edit menu, still not working properly #267 --- src/widget/edit-widget/edit-widget.js | 40 ++++++++++----------------- src/widget/widgets/image.js | 6 +++- 2 files changed, 19 insertions(+), 27 deletions(-) diff --git a/src/widget/edit-widget/edit-widget.js b/src/widget/edit-widget/edit-widget.js index 01cffdb..03b6931 100644 --- a/src/widget/edit-widget/edit-widget.js +++ b/src/widget/edit-widget/edit-widget.js @@ -27,7 +27,7 @@ class EditWidgetDialog extends React.Component { super(props); this.state = { - temporal: {}, + temporal: props.widget, }; } @@ -38,12 +38,9 @@ class EditWidgetDialog extends React.Component { } - onClose(canceled) { if (canceled === false) { - if (this.validChanges()) { - this.props.onClose(this.state.temporal); - } + this.props.onClose(this.state.temporal); } else { this.props.onClose(); } @@ -117,23 +114,26 @@ class EditWidgetDialog extends React.Component { changeObject = this.assignAspectRatio(changeObject, this.state.temporal.customProperties.file); } } else if (e.target.id.includes('file')) { - - customProperty ? changeObject[parts[0]][parts[1]] = e.target.value : changeObject[e.target.id] = e.target.value; + if (e.target.value === "Select file") + { + customProperty ? changeObject[parts[0]][parts[1]] = -1 : changeObject[e.target.id] = -1; + } else { + customProperty ? changeObject[parts[0]][parts[1]] = e.target.value : changeObject[e.target.id] = e.target.value; + } // get file and update size (if it's an image) - if ((changeObject.customProperties.file !== -1)&&('lockAspect' in this.state.temporal && this.state.temporal.lockAspect)) { + /*if ((changeObject.customProperties.file !== -1)&&('lockAspect' in this.state.temporal && this.state.temporal.lockAspect)) { // TODO this if condition requires changes to work!!! changeObject = this.assignAspectRatio(changeObject, e.target.value); - } - }else if (parts[1] === 'textSize'){ + }*/ + } else if (parts[1] === 'textSize'){ changeObject[parts[0]][parts[1]] = Number(e.target.value); changeObject = this.setMaxWidth(changeObject); - }else if(parts[1] === 'orientation'){ + } else if(parts[1] === 'orientation'){ customProperty ? changeObject[parts[0]][parts[1]] = e.target.value : changeObject[e.target.id] = e.target.value ; changeObject = this.setNewLockRestrictions(changeObject); - } - else if (e.target.type === 'number') { + } else if (e.target.type === 'number') { customProperty ? changeObject[parts[0]][parts[1]] = Number(e.target.value) : changeObject[e.target.id] = Number(e.target.value); } else if(e.target.id === 'name'){ if(customProperty ? (changeObject[parts[0]][parts[1]] != null) : (changeObject[e.target.id] != null)){ @@ -145,7 +145,7 @@ class EditWidgetDialog extends React.Component { } else { customProperty ? changeObject[parts[0]][parts[1]] = e.target.value : changeObject[e.target.id] = e.target.value ; } - this.validChanges(); + this.setState({ temporal: changeObject}); } @@ -155,18 +155,6 @@ class EditWidgetDialog extends React.Component { this.setState({ temporal: widget_data }); } - validChanges() { - // check that widget has a name - var name = true; - - if (this.state.temporal[name] === '') { - name = false; - } - - this.valid = name; - return name; - } - render() { let controls = null; diff --git a/src/widget/widgets/image.js b/src/widget/widgets/image.js index d931cb2..1c2ba75 100644 --- a/src/widget/widgets/image.js +++ b/src/widget/widgets/image.js @@ -44,6 +44,7 @@ class WidgetImage extends React.Component { componentDidUpdate(prevProps: Readonly

    , prevState: Readonly, snapshot: SS) { + let file = this.props.files.find(file => file.id === parseInt(this.props.widget.customProperties.file, 10)); @@ -55,9 +56,12 @@ class WidgetImage extends React.Component { data: file.id, token: this.props.token }); - + this.setState({ file: file, fileDate: file.date }); } + } else if (this.setState.file !== undefined) { + console.log("file undefined", file) + this.setState({file:undefined}) } } From 02906c2eada1400dcf45cda413c81aa6a8ae850c Mon Sep 17 00:00:00 2001 From: irismarie Date: Tue, 27 Oct 2020 18:09:50 +0100 Subject: [PATCH 366/391] change nesting order of DOM elements --- src/dashboard/dashboard.js | 223 ++++++++++++++++-------------- src/widget/widget-context-menu.js | 1 - src/widget/widget.js | 15 +- 3 files changed, 119 insertions(+), 120 deletions(-) diff --git a/src/dashboard/dashboard.js b/src/dashboard/dashboard.js index 2fbc259..f3354cc 100644 --- a/src/dashboard/dashboard.js +++ b/src/dashboard/dashboard.js @@ -15,7 +15,7 @@ * along with VILLASweb. If not, see . ******************************************************************************/ -import React, {Component} from 'react'; +import React, { Component } from 'react'; import { Container } from 'flux/utils'; import Fullscreenable from 'react-fullscreenable'; import classNames from 'classnames'; @@ -38,13 +38,15 @@ import ConfigStore from '../componentconfig/config-store' import AppDispatcher from '../common/app-dispatcher'; import 'react-contexify/dist/ReactContexify.min.css'; +import WidgetContainer from '../widget/widget-container'; +import EditableWidgetContainer from '../widget/editable-widget-container'; class Dashboard extends Component { static lastWidgetKey = 0; static webSocketsOpened = false; static getStores() { - return [ DashboardStore, FileStore, WidgetStore, SignalStore, ConfigStore, ICStore]; + return [DashboardStore, FileStore, WidgetStore, SignalStore, ConfigStore, ICStore]; } static calculateState(prevState, props) { @@ -55,7 +57,7 @@ class Dashboard extends Component { const sessionToken = localStorage.getItem("token"); let dashboard = DashboardStore.getState().find(d => d.id === parseInt(props.match.params.dashboard, 10)); - if (dashboard == null){ + if (dashboard == null) { AppDispatcher.dispatch({ type: 'dashboards/start-load', data: props.match.params.dashboard, @@ -68,11 +70,11 @@ class Dashboard extends Component { // compute max y coordinate let maxHeight = null; - maxHeight = Object.keys(widgets).reduce( (maxHeightSoFar, widgetKey) => { + maxHeight = Object.keys(widgets).reduce((maxHeightSoFar, widgetKey) => { let thisWidget = widgets[widgetKey]; let thisWidgetHeight = thisWidget.y + thisWidget.height; - return thisWidgetHeight > maxHeightSoFar? thisWidgetHeight : maxHeightSoFar; + return thisWidgetHeight > maxHeightSoFar ? thisWidgetHeight : maxHeightSoFar; }, 0); @@ -82,11 +84,10 @@ class Dashboard extends Component { if (dashboard !== undefined) { configs = ConfigStore.getState().filter(config => config.scenarioID === dashboard.scenarioID); files = FileStore.getState().filter(file => file.scenarioID === dashboard.scenarioID); - if(dashboard.height === 0){ + if (dashboard.height === 0) { dashboard.height = 400; } - else if(maxHeight + 80 > dashboard.height) - { + else if (maxHeight + 80 > dashboard.height) { dashboard.height = maxHeight + 80; } } @@ -95,9 +96,9 @@ class Dashboard extends Component { let signals = [] let allSignals = SignalStore.getState(); let sig, con; - for (sig of allSignals){ - for (con of configs){ - if (sig.configID === con.id){ + for (sig of allSignals) { + for (con of configs) { + if (sig.configID === con.id) { signals.push(sig); } } @@ -105,11 +106,11 @@ class Dashboard extends Component { // filter ICs to the ones used by this scenario let ics = [] - if (configs.length > 0){ + if (configs.length > 0) { ics = ICStore.getState().filter(ic => { let ICused = false; - for (let config of configs){ - if (ic.id === config.icID){ + for (let config of configs) { + if (ic.id === config.icID) { ICused = true; break; } @@ -130,13 +131,13 @@ class Dashboard extends Component { editing: prevState.editing || false, paused: prevState.paused || false, - editModal: prevState.editModal || false, + editModal: prevState.editModal || false, editOutputSignalsModal: prevState.editOutputSignals || false, editInputSignalsModal: prevState.editInputSignals || false, filesEditModal: prevState.filesEditModal || false, filesEditSaveState: prevState.filesEditSaveState || [], - modalData: null, - modalIndex: null, + modalData: null, + modalIndex: null, widgetChangeData: [], widgetOrigIDs: prevState.widgetOrigIDs || [], @@ -172,9 +173,9 @@ class Dashboard extends Component { } componentDidUpdate(prevProps: Readonly

    , prevState: Readonly, snapshot: SS) { - // open web sockets if ICs are already known and sockets are not opened yet - if(this.state.ics !== undefined && !Dashboard.webSocketsOpened){ - if(this.state.ics.length > 0){ + // open web sockets if ICs are already known and sockets are not opened yet + if (this.state.ics !== undefined && !Dashboard.webSocketsOpened) { + if (this.state.ics.length > 0) { console.log("Starting to open IC websockets:", this.state.ics); AppDispatcher.dispatch({ type: 'ics/open-sockets', @@ -186,7 +187,7 @@ class Dashboard extends Component { } - if(prevState.dashboard === undefined && this.state.dashboard !== undefined){ + if (prevState.dashboard === undefined && this.state.dashboard !== undefined) { // the dashboard was loaded, so that the scenarioID is available // load configs of scenario @@ -231,7 +232,7 @@ class Dashboard extends Component { transformToWidgetsList(widgets) { - return Object.keys(widgets).map( (key) => widgets[key]); + return Object.keys(widgets).map((key) => widgets[key]); } handleDrop(widget) { @@ -252,35 +253,35 @@ class Dashboard extends Component { this.widgetChange(updated_widget, key, this.saveChanges); } - widgetChange(widget, index, callback = null){ + widgetChange(widget, index, callback = null) { let temp = this.state.widgetChangeData; temp.push(widget); - this.setState({widgetChangeData: temp}); + this.setState({ widgetChangeData: temp }); } - editWidget(widget, index){ + editWidget(widget, index) { this.setState({ editModal: true, modalData: widget, modalIndex: index }); }; - startEditFiles(){ + startEditFiles() { let tempFiles = []; - this.state.files.forEach( file => { + this.state.files.forEach(file => { tempFiles.push({ id: file.id, name: file.name }); }) - this.setState({filesEditModal: true, filesEditSaveState: tempFiles}); + this.setState({ filesEditModal: true, filesEditSaveState: tempFiles }); } - closeEditFiles(){ + closeEditFiles() { this.setState({ filesEditModal: false }); } - closeEdit(data){ + closeEdit(data) { if (data == null) { @@ -315,11 +316,11 @@ class Dashboard extends Component { }; - startEditing(){ + startEditing() { let originalIDs = []; - this.state.widgets.forEach( widget => { + this.state.widgets.forEach(widget => { originalIDs.push(widget.id); - if(widget.type === 'Slider' || widget.type === 'NumberInput' || widget.type === 'Button'){ + if (widget.type === 'Slider' || widget.type === 'NumberInput' || widget.type === 'Button') { AppDispatcher.dispatch({ type: 'widgets/start-edit', token: this.state.sessionToken, @@ -339,21 +340,21 @@ class Dashboard extends Component { token: this.state.sessionToken }); - this.state.widgetChangeData.forEach( widget => { + this.state.widgetChangeData.forEach(widget => { AppDispatcher.dispatch({ type: 'widgets/start-edit', token: this.state.sessionToken, data: widget }); }); - this.setState({ editing: false, widgetChangeData: []}); + this.setState({ editing: false, widgetChangeData: [] }); }; saveChanges() { // Transform to a list const dashboard = Object.assign({}, this.state.dashboard.toJS(), { - widgets: this.transformToWidgetsList(this.state.widgets) - }); + widgets: this.transformToWidgetsList(this.state.widgets) + }); AppDispatcher.dispatch({ type: 'dashboards/start-edit', @@ -364,16 +365,16 @@ class Dashboard extends Component { cancelEditing() { //raw widget has no id -> cannot be deleted in its original form - this.state.widgets.forEach(widget => { - let tempID = this.state.widgetOrigIDs.find(element => element === widget.id); - if(typeof tempID === 'undefined'){ - AppDispatcher.dispatch({ - type: 'widgets/start-remove', - data: widget, - token: this.state.sessionToken - }); - } - }) + this.state.widgets.forEach(widget => { + let tempID = this.state.widgetOrigIDs.find(element => element === widget.id); + if (typeof tempID === 'undefined') { + AppDispatcher.dispatch({ + type: 'widgets/start-remove', + data: widget, + token: this.state.sessionToken + }); + } + }) AppDispatcher.dispatch({ type: 'widgets/start-load', @@ -386,7 +387,7 @@ class Dashboard extends Component { data: this.props.match.params.dashboard, token: this.state.sessionToken }); - this.setState({ editing: false, widgetChangeData: []}); + this.setState({ editing: false, widgetChangeData: [] }); }; @@ -400,30 +401,30 @@ class Dashboard extends Component { setDashboardSize(value) { const maxHeight = Object.values(this.state.widgets).reduce((currentHeight, widget) => { - const absolutHeight = widget.y + widget.height; + const absolutHeight = widget.y + widget.height; - return absolutHeight > currentHeight ? absolutHeight : currentHeight; + return absolutHeight > currentHeight ? absolutHeight : currentHeight; }, 0); let dashboard = this.state.dashboard; - if(value === -1){ + if (value === -1) { let tempHeight = this.state.dashboard.height - 50; - if(tempHeight >= 400 && tempHeight >= (maxHeight + 80)){ + if (tempHeight >= 400 && tempHeight >= (maxHeight + 80)) { dashboard.height = tempHeight; - this.setState({dashboard}); + this.setState({ dashboard }); } } - else{ - dashboard.height = this.state.dashboard.height +50; - this.setState( {dashboard}); + else { + dashboard.height = this.state.dashboard.height + 50; + this.setState({ dashboard }); } this.forceUpdate(); } - pauseData(){ + pauseData() { this.setState({ paused: true }); }; @@ -431,25 +432,25 @@ class Dashboard extends Component { this.setState({ paused: false }); }; - editInputSignals(){ - this.setState({editInputSignalsModal: true}); + editInputSignals() { + this.setState({ editInputSignalsModal: true }); }; - editOutputSignals(){ - this.setState({editOutputSignalsModal: true}); + editOutputSignals() { + this.setState({ editOutputSignalsModal: true }); }; - closeEditSignalsModal(direction){ - if( direction === "in") { - this.setState({editInputSignalsModal: false}); - } else if( direction === "out"){ - this.setState({editOutputSignalsModal: false}); + closeEditSignalsModal(direction) { + if (direction === "in") { + this.setState({ editInputSignalsModal: false }); + } else if (direction === "out") { + this.setState({ editOutputSignalsModal: false }); } } render() { - if (this.state.dashboard === undefined){ + if (this.state.dashboard === undefined) { return

    {"Loading Dashboard..."}
    } @@ -473,55 +474,63 @@ class Dashboard extends Component { onFullscreen={this.props.toggleFullscreen} onPause={this.pauseData.bind(this)} onUnpause={this.unpauseData.bind(this)} - onEditFiles = {this.startEditFiles.bind(this)} - onEditOutputSignals = {this.editOutputSignals.bind(this)} - onEditInputSignals = {this.editInputSignals.bind(this)} + onEditFiles={this.startEditFiles.bind(this)} + onEditOutputSignals={this.editOutputSignals.bind(this)} + onEditInputSignals={this.editInputSignals.bind(this)} />
    -
    e.preventDefault() }> +
    e.preventDefault()}> {this.state.editing && - + } - {!draggable?( - - {this.state.widgets != null && Object.keys(this.state.widgets).map(widgetKey => ( - + {this.state.widgets != null && Object.keys(this.state.widgets).map(widgetKey => ( + + - - - ))} - + onWidgetChange={this.widgetChange.bind(this)} + onWidgetStatusChange={this.widgetStatusChange.bind(this)} + editing={this.state.editing} + grid={grid} + paused={this.state.paused} + /> + + ))} + ) : ( - - {this.state.widgets != null && Object.keys(this.state.widgets).map(widgetKey => ( - + + {this.state.widgets != null && Object.keys(this.state.widgets).map(widgetKey => ( + + + onWidgetChange={this.widgetChange.bind(this)} + onWidgetStatusChange={this.widgetStatusChange.bind(this)} + editing={this.state.editing} + paused={this.state.paused} + /> + + ))} + - )} + )} diff --git a/src/widget/widget.js b/src/widget/widget.js index 98b1ce0..fae7af2 100644 --- a/src/widget/widget.js +++ b/src/widget/widget.js @@ -44,6 +44,8 @@ import WidgetTopology from './widgets/topology'; import WidgetLine from './widgets/line'; //import WidgetHTML from './widgets/html'; +import WidgetEditMenu from '../widget/widget-edit-menu'; + import '../styles/widgets.css'; class Widget extends React.Component { @@ -230,20 +232,9 @@ class Widget extends React.Component { return null; } - rn render() { - const element = this.createWidget(this.props.data); - - if (this.props.editing) { - return - {element} - ; - } - - return - {element} - ; + return this.createWidget(this.props.data); } } From 7a76e5e71bb4d01ec65ebccd2f1456abd7032ee7 Mon Sep 17 00:00:00 2001 From: Laura Fuentes Grau Date: Wed, 28 Oct 2020 18:30:08 +0100 Subject: [PATCH 367/391] Adapt add, edit and delete dialogs #266 --- src/common/dialogs/delete-dialog.js | 6 +++++- src/ic/edit-ic.js | 22 ++++++++++++++++++++-- src/ic/ics.js | 2 +- src/ic/new-ic.js | 24 ++++++++++++++++++++---- 4 files changed, 46 insertions(+), 8 deletions(-) diff --git a/src/common/dialogs/delete-dialog.js b/src/common/dialogs/delete-dialog.js index cbc0cd8..8d114f4 100644 --- a/src/common/dialogs/delete-dialog.js +++ b/src/common/dialogs/delete-dialog.js @@ -16,7 +16,8 @@ ******************************************************************************/ import React from 'react'; -import { Button, Modal } from 'react-bootstrap'; +import { Button, Modal, FormLabel } from 'react-bootstrap'; +import {Collapse} from 'react-collapse'; class DeleteDialog extends React.Component { onModalKeyPress = (event) => { @@ -35,6 +36,9 @@ class DeleteDialog extends React.Component { Are you sure you want to delete the {this.props.title} '{this.props.name}'? + + The IC will be deleted if the respective VILLAScontroller sends "gone" state and no component config is using the IC anymore + diff --git a/src/ic/edit-ic.js b/src/ic/edit-ic.js index e5784e0..9e8fe4a 100644 --- a/src/ic/edit-ic.js +++ b/src/ic/edit-ic.js @@ -16,9 +16,9 @@ ******************************************************************************/ import React from 'react'; -import { FormGroup, FormControl, FormLabel } from 'react-bootstrap'; +import { FormGroup, FormControl, FormLabel, FormCheck } from 'react-bootstrap'; import _ from 'lodash'; - +import {Collapse} from 'react-collapse'; import Dialog from '../common/dialogs/dialog'; import ParametersEditor from '../common/parameters-editor'; @@ -33,6 +33,7 @@ class EditICDialog extends React.Component { host: '', type: '', category: '', + managedexternally: false, properties: {}, }; } @@ -61,16 +62,25 @@ class EditICDialog extends React.Component { data.properties = this.state.properties } + data.managedexternally = this.state.managedexternally; + this.props.onClose(data); + this.setState({managedexternally: false}); } } else { this.props.onClose(); + this.setState({managedexternally: false}); } } handleChange(e) { + if(e.target.id === "managedexternally"){ + this.setState({ managedexternally : !this.state.managedexternally}); + } + else{ this.setState({ [e.target.id]: e.target.value }); + } } handlePropertiesChange(data) { @@ -83,6 +93,7 @@ class EditICDialog extends React.Component { host: this.props.ic.host, type: this.props.ic.type, category: this.props.ic.category, + managedexternally: false, properties: _.merge({}, _.get(this.props.ic, 'rawProperties'), _.get(this.props.ic, 'properties')) }); } @@ -100,6 +111,13 @@ class EditICDialog extends React.Component { >
    UUID: {this.props.ic.uuid} + + this.handleChange(e)}> + + + + Externally managed ICs cannot be edited by users + Name this.handleChange(e)} /> diff --git a/src/ic/ics.js b/src/ic/ics.js index 635b7a8..44173e7 100644 --- a/src/ic/ics.js +++ b/src/ic/ics.js @@ -370,7 +370,7 @@ class InfrastructureComponents extends Component { this.closeEditModal(data)} ic={this.state.modalIC} /> this.closeImportModal(data)} /> - this.closeDeleteModal(e)} /> + this.closeDeleteModal(e)} />
    ); } diff --git a/src/ic/new-ic.js b/src/ic/new-ic.js index 93f1e83..78c67a8 100644 --- a/src/ic/new-ic.js +++ b/src/ic/new-ic.js @@ -16,8 +16,8 @@ ******************************************************************************/ import React from 'react'; -import { FormGroup, FormControl, FormLabel } from 'react-bootstrap'; - +import { FormGroup, FormControl, FormLabel, FormCheck } from 'react-bootstrap'; +import {Collapse} from 'react-collapse'; import Dialog from '../common/dialogs/dialog'; class NewICDialog extends React.Component { @@ -32,6 +32,7 @@ class NewICDialog extends React.Component { uuid: '', type: '', category: '', + managedexternally: false, }; } @@ -42,7 +43,8 @@ class NewICDialog extends React.Component { name: this.state.name, type: this.state.type, category: this.state.category, - uuid: this.state.uuid + uuid: this.state.uuid, + managedexternally: this.state.managedexternally, }; if (this.state.host != null && this.state.host !== "" && this.state.host !== 'http://') { @@ -50,18 +52,25 @@ class NewICDialog extends React.Component { } this.props.onClose(data); + this.setState({managedexternally: false}); } } else { this.props.onClose(); + this.setState({managedexternally: false}); } } handleChange(e) { + if(e.target.id === "managedexternally"){ + this.setState({ managedexternally : !this.state.managedexternally}); + } + else{ this.setState({ [e.target.id]: e.target.value }); + } } resetState() { - this.setState({ name: '', host: 'http://', uuid: this.uuidv4(), type: '', category: ''}); + this.setState({ name: '', host: 'http://', uuid: this.uuidv4(), type: '', category: '', managedexternally: false}); } validateForm(target) { @@ -110,6 +119,13 @@ class NewICDialog extends React.Component { return ( this.onClose(c)} onReset={() => this.resetState()} valid={this.valid}> + + this.handleChange(e)}> + + + + the component will show up in the list only after a VILLAScontroller for the component type has created the component and cannot be edited by users + Name this.handleChange(e)} /> From 0deec453833654da2a5370599e83984239b6eaf8 Mon Sep 17 00:00:00 2001 From: Laura Fuentes Grau Date: Wed, 28 Oct 2020 20:35:39 +0100 Subject: [PATCH 368/391] Category and type of IC (in edit and add) are now selectable via drop down menu #266 --- src/ic/edit-ic.js | 41 +++++++++++++++++++++++++++++++++++------ src/ic/new-ic.js | 42 ++++++++++++++++++++++++++++++++++++------ 2 files changed, 71 insertions(+), 12 deletions(-) diff --git a/src/ic/edit-ic.js b/src/ic/edit-ic.js index 9e8fe4a..7386131 100644 --- a/src/ic/edit-ic.js +++ b/src/ic/edit-ic.js @@ -99,6 +99,26 @@ class EditICDialog extends React.Component { } render() { + let typeOptions = []; + switch(this.state.category){ + case "Simulator": + typeOptions = ["Dummy","Generic","DPsim","RTLAB","RSCAD"]; + break; + case "Controller": + typeOptions = ["Kubernetes","VILLAS-controller"]; + break; + case "Gateway": + typeOptions = ["VILLAS-node","VILLAS-relay"]; + break; + case "Service": + typeOptions = ["EMS","Custom"]; + break; + case "Equipment": + typeOptions = ["Chroma-emulator","Chroma-loads","SMA-sunnyboy","FLEPS","Sonnenbatterie"]; + break; + default: + typeOptions =[]; + } return ( - Category (e.g. Simulator, Gateway, ...) - this.handleChange(e)} /> - + Category + this.handleChange(e)}> + + + + + + - Type (e.g. RTDS, VILLASnode, ...) - this.handleChange(e)} /> - + Type + this.handleChange(e)}> + + {typeOptions.map((name,index) => ( + + ))} + Properties diff --git a/src/ic/new-ic.js b/src/ic/new-ic.js index 78c67a8..466ead5 100644 --- a/src/ic/new-ic.js +++ b/src/ic/new-ic.js @@ -116,6 +116,26 @@ class NewICDialog extends React.Component { } render() { + let typeOptions = []; + switch(this.state.category){ + case "Simulator": + typeOptions = ["Dummy","Generic","DPsim","RTLAB","RSCAD"]; + break; + case "Controller": + typeOptions = ["Kubernetes","VILLAS-controller"]; + break; + case "Gateway": + typeOptions = ["VILLAS-node","VILLAS-relay"]; + break; + case "Service": + typeOptions = ["EMS","Custom"]; + break; + case "Equipment": + typeOptions = ["Chroma-emulator","Chroma-loads","SMA-sunnyboy","FLEPS","Sonnenbatterie"]; + break; + default: + typeOptions =[]; + } return ( this.onClose(c)} onReset={() => this.resetState()} valid={this.valid}> @@ -137,14 +157,24 @@ class NewICDialog extends React.Component { - Category of component (e.g. Simulator, Gateway, ...) - this.handleChange(e)} /> - + Category of component + this.handleChange(e)}> + + + + + + + - Type of component (e.g. RTDS, VILLASnode, ...) - this.handleChange(e)} /> - + Type of component + this.handleChange(e)}> + + {typeOptions.map((name,index) => ( + + ))} + UUID From 8ce2ba11612b34ecf1701435875c0b0cb27fbc8d Mon Sep 17 00:00:00 2001 From: Laura Fuentes Grau Date: Sun, 1 Nov 2020 15:27:05 +0100 Subject: [PATCH 369/391] Add column for IC uptime, WIP: add IC infos and controls dialog #266 --- src/ic/ic-dialog.js | 45 +++++++++++++++++++++++++++++++++++++++++++++ src/ic/ics.js | 29 ++++++++++++++++++++++++----- 2 files changed, 69 insertions(+), 5 deletions(-) create mode 100644 src/ic/ic-dialog.js diff --git a/src/ic/ic-dialog.js b/src/ic/ic-dialog.js new file mode 100644 index 0000000..b134f95 --- /dev/null +++ b/src/ic/ic-dialog.js @@ -0,0 +1,45 @@ +import React from 'react'; +import {FormLabel} from 'react-bootstrap'; +import Dialog from '../common/dialogs/dialog'; + + +class ICDialog extends React.Component { + valid = true; + + constructor(props) { + super(props); + + this.state = { + ic: props.ic + }; + } + + onClose(canceled) { + this.props.onClose(); + } + + handleChange(e) { + + } + + + render() { + + return ( + this.onClose(c)} + valid={true} + size='lg' + > + + Infos and Controls + + + ); + } +} + +export default ICDialog; diff --git a/src/ic/ics.js b/src/ic/ics.js index 44173e7..e873f2b 100644 --- a/src/ic/ics.js +++ b/src/ic/ics.js @@ -17,7 +17,7 @@ import React, { Component } from 'react'; import { Container } from 'flux/utils'; -import { Button } from 'react-bootstrap'; +import { Button, Badge } from 'react-bootstrap'; import FileSaver from 'file-saver'; import _ from 'lodash'; import moment from 'moment' @@ -31,6 +31,7 @@ import TableColumn from '../common/table-column'; import NewICDialog from './new-ic'; import EditICDialog from './edit-ic'; import ImportICDialog from './import-ic'; +import ICDialog from './ic-dialog'; import ICAction from './ic-action'; import DeleteDialog from '../common/dialogs/delete-dialog'; @@ -78,6 +79,7 @@ class InfrastructureComponents extends Component { ics: ics, modalIC: {}, deleteModal: false, + icModal: false, selectedICs: [], currentUser: JSON.parse(localStorage.getItem("currentUser")) }; @@ -99,7 +101,7 @@ class InfrastructureComponents extends Component { refresh() { - if (this.state.editModal || this.state.deleteModal){ + if (this.state.editModal || this.state.deleteModal || this.state.icModal){ // do nothing since a dialog is open at the moment } else { @@ -139,6 +141,10 @@ class InfrastructureComponents extends Component { } } + closeICModal(data){ + this.setState({ icModal : false }); + } + closeDeleteModal(confirmDelete){ this.setState({ deleteModal: false }); @@ -200,7 +206,7 @@ class InfrastructureComponents extends Component { this.setState({ selectedICs: selectedICs }); } - runAction = action => { + runAction(action) { for (let index of this.state.selectedICs) { AppDispatcher.dispatch({ type: 'ics/start-action', @@ -301,6 +307,16 @@ class InfrastructureComponents extends Component { } + modifyUptimeColumn(uptime){ + if(uptime >= 0){ + return {uptime + "s"} + } + else{ + return Unknown + } + } + + render() { const buttonStyle = { marginLeft: '10px' @@ -312,11 +328,12 @@ class InfrastructureComponents extends Component { this.onICChecked(index, event)} width='30' /> - + this.setState({ icModal: true, modalIC: this.state.ics[index], modalIndex: index })}/> this.stateLabelStyle(state, component)} /> this.modifyManagedExternallyColumn(managedexternally)} width='105' /> + this.modifyUptimeColumn(uptime)}/> {/* */} @@ -343,7 +360,7 @@ class InfrastructureComponents extends Component {
    this.runAction(action)} actions={[ { id: '-1', title: 'Select command', data: { action: 'none' } }, { id: '0', title: 'Reset', data: { action: 'reset' } }, @@ -369,6 +386,8 @@ class InfrastructureComponents extends Component { this.closeNewModal(data)} /> this.closeEditModal(data)} ic={this.state.modalIC} /> this.closeImportModal(data)} /> + this.closeICModal(data)} ic={this.state.modalIC} token={this.state.sessionToken} /> + this.closeDeleteModal(e)} />
    From c37a8d067fbe29b653f45af2b2cefad2f9cd0bd3 Mon Sep 17 00:00:00 2001 From: Laura Fuentes Grau Date: Sun, 1 Nov 2020 20:57:24 +0100 Subject: [PATCH 370/391] WIP: fix image widget edit menu #267 --- src/dashboard/dashboard.js | 5 +++++ src/widget/widget-factory.js | 1 + src/widget/widgets/image.js | 16 +++++++--------- 3 files changed, 13 insertions(+), 9 deletions(-) diff --git a/src/dashboard/dashboard.js b/src/dashboard/dashboard.js index fc60d2b..073c5fe 100644 --- a/src/dashboard/dashboard.js +++ b/src/dashboard/dashboard.js @@ -298,6 +298,11 @@ class Dashboard extends Component { return; } + if(data.type === "Image") + { + data.customProperties.update = true; + } + AppDispatcher.dispatch({ type: 'widgets/start-edit', token: this.state.sessionToken, diff --git a/src/widget/widget-factory.js b/src/widget/widget-factory.js index 59ebedf..b13255e 100644 --- a/src/widget/widget-factory.js +++ b/src/widget/widget-factory.js @@ -115,6 +115,7 @@ class WidgetFactory { widget.height = 200; widget.customProperties.lockAspect = true; widget.customProperties.file = -1; // ID of image file, -1 means non selected + widget.customProperties.update = false; break; case 'Button': widget.minWidth = 100; diff --git a/src/widget/widgets/image.js b/src/widget/widgets/image.js index 1c2ba75..f289324 100644 --- a/src/widget/widgets/image.js +++ b/src/widget/widgets/image.js @@ -26,7 +26,6 @@ class WidgetImage extends React.Component { this.state = { file: undefined, - fileDate: null } } @@ -44,24 +43,23 @@ class WidgetImage extends React.Component { componentDidUpdate(prevProps: Readonly

    , prevState: Readonly, snapshot: SS) { + if(this.props.widget.customProperties.file === -1){ + this.props.widget.customProperties.update = false; + if(this.state.file !== undefined) this.setState({ file: undefined }) + } let file = this.props.files.find(file => file.id === parseInt(this.props.widget.customProperties.file, 10)); - if (file !== undefined) { - if (this.state.file === undefined || (this.state.file.id !== file.id) || this.state.fileDate !== file.date) { - + if (this.props.widget.customProperties.update) { + this.props.widget.customProperties.update = false; AppDispatcher.dispatch({ type: 'files/start-download', data: file.id, token: this.props.token }); - - this.setState({ file: file, fileDate: file.date }); + this.setState({ file: file }) } - } else if (this.setState.file !== undefined) { - console.log("file undefined", file) - this.setState({file:undefined}) } } From fb2807a98c3da49c61467f8863a091713491adac Mon Sep 17 00:00:00 2001 From: irismarie Date: Wed, 4 Nov 2020 18:17:28 +0100 Subject: [PATCH 371/391] lock aspect ratio, fixes #206 --- src/widget/widget-factory.js | 1 + src/widget/widgets/line.js | 13 +------------ 2 files changed, 2 insertions(+), 12 deletions(-) diff --git a/src/widget/widget-factory.js b/src/widget/widget-factory.js index b13255e..00dd41e 100644 --- a/src/widget/widget-factory.js +++ b/src/widget/widget-factory.js @@ -192,6 +192,7 @@ class WidgetFactory { widget.customProperties.border_color_opacity = 1; widget.customProperties.border_width = 2; widget.customProperties.rotation = 0; + widget.customProperties.lockAspect = true; break; default: diff --git a/src/widget/widgets/line.js b/src/widget/widgets/line.js index 93249f6..bfdbe9c 100644 --- a/src/widget/widgets/line.js +++ b/src/widget/widgets/line.js @@ -49,18 +49,7 @@ class WidgetLine extends Component { height = this.state.height; } - // calculate the length of the line - let length = 0; - if (rotation > 0) { - if (width <= height) { - length = width / Math.abs(Math.cos(rad)); - } - else { - length = height / Math.abs(Math.sin(rad)); - } - } else { - length = width; - } + let length = width; // calculate line coordinates (in percent) const x1 = width * 0.5 - 0.5 * Math.cos(rad) * length; From 4d2b12c292e464d0dd3792aa4b542159230c1e2a Mon Sep 17 00:00:00 2001 From: irismarie Date: Thu, 5 Nov 2020 10:21:49 +0100 Subject: [PATCH 372/391] Rnd has multiple children now, ref can point to sth. else --- src/widget/editable-widget-container.js | 39 ++----------------------- src/widget/widget-context-menu.js | 6 ++-- 2 files changed, 5 insertions(+), 40 deletions(-) diff --git a/src/widget/editable-widget-container.js b/src/widget/editable-widget-container.js index b5fb964..65770ab 100644 --- a/src/widget/editable-widget-container.js +++ b/src/widget/editable-widget-container.js @@ -76,28 +76,16 @@ class EditableWidgetContainer extends React.Component { /* hand over new dimensions to child element so that the rotation is displayed correctly * already before the dashboard changes are saved - */ + if (this.props.widget.type === 'Line') { this.refs.child0.illustrateDuringEdit(widget.width, widget.height); - } + }*/ }; render() { const widget = this.props.widget; - let isLine = false; let children = null; - // clone WidgetLine child element so that it can be referenced while resizing - if (widget.type === 'Line') { - isLine = true; - - children = React.Children.map(this.props.children, - (child, index) => React.cloneElement(child, { - ref: `child${index}` - }) - ); - } - let resizingRestricted = false; if (widget.customProperties.resizeRightLeftLock || widget.customProperties.resizeTopBottomLock) { resizingRestricted = true; @@ -122,29 +110,6 @@ class EditableWidgetContainer extends React.Component { 'locked': widget.isLocked }); - if (isLine) { - return { this.rnd = c; }} - default={{ x: Number(widget.x), y: Number(widget.y), width: widget.width, height: widget.height }} - minWidth={widget.minWidth} - minHeight={widget.minHeight} - maxWidth={widget.customProperties.maxWidth || '100%'} - lockAspectRatio={Boolean(widget.customProperties.lockAspect)} - bounds={'parent'} - className={widgetClasses} - onResizeStart={this.borderWasClicked} - onResizeStop={this.resizeStop} - onDragStop={this.dragStop} - dragGrid={gridArray} - resizeGrid={gridArray} - zindex={widget.z} - enableResizing={resizing} - disableDragging={widget.isLocked} - > - {children} - ; - } - return { this.rnd = c; }} default={{ x: Number(widget.x), y: Number(widget.y), width: widget.width, height: widget.height }} diff --git a/src/widget/widget-context-menu.js b/src/widget/widget-context-menu.js index 5bb1357..d79f869 100644 --- a/src/widget/widget-context-menu.js +++ b/src/widget/widget-context-menu.js @@ -90,7 +90,7 @@ class WidgetContextMenu extends React.Component { render() { const isLocked = this.props.widget.locked; const ContextMenu = () => ( -

    + Edit Delete @@ -108,8 +108,8 @@ class WidgetContextMenu extends React.Component { ); - return
    - + return
    + Date: Thu, 5 Nov 2020 11:26:08 +0100 Subject: [PATCH 373/391] removed imports --- src/dashboard/dashboard.js | 1 - src/widget/editable-widget-container.js | 1 - src/widget/widget.js | 4 ---- 3 files changed, 6 deletions(-) diff --git a/src/dashboard/dashboard.js b/src/dashboard/dashboard.js index 74fb29a..2204bb0 100644 --- a/src/dashboard/dashboard.js +++ b/src/dashboard/dashboard.js @@ -20,7 +20,6 @@ import { Container } from 'flux/utils'; import Fullscreenable from 'react-fullscreenable'; import classNames from 'classnames'; -import Widget from '../widget/widget'; import EditWidget from '../widget/edit-widget/edit-widget'; import EditFiles from '../file/edit-files'; import EditSignalMapping from "../signal/edit-signal-mapping"; diff --git a/src/widget/editable-widget-container.js b/src/widget/editable-widget-container.js index 65770ab..a926f5f 100644 --- a/src/widget/editable-widget-container.js +++ b/src/widget/editable-widget-container.js @@ -84,7 +84,6 @@ class EditableWidgetContainer extends React.Component { render() { const widget = this.props.widget; - let children = null; let resizingRestricted = false; if (widget.customProperties.resizeRightLeftLock || widget.customProperties.resizeTopBottomLock) { diff --git a/src/widget/widget.js b/src/widget/widget.js index fae7af2..e2eb782 100644 --- a/src/widget/widget.js +++ b/src/widget/widget.js @@ -24,9 +24,6 @@ import ConfigsStore from '../componentconfig/config-store'; import FileStore from '../file/file-store'; import SignalStore from '../signal/signal-store' -import EditableWidgetContainer from './editable-widget-container'; -import WidgetContainer from './widget-container'; - import WidgetCustomAction from './widgets/custom-action'; import WidgetAction from './widgets/action'; import WidgetLamp from './widgets/lamp'; @@ -44,7 +41,6 @@ import WidgetTopology from './widgets/topology'; import WidgetLine from './widgets/line'; //import WidgetHTML from './widgets/html'; -import WidgetEditMenu from '../widget/widget-edit-menu'; import '../styles/widgets.css'; From 0c3878490759ba69f37bb05d738851f87e57b513 Mon Sep 17 00:00:00 2001 From: irismarie Date: Thu, 5 Nov 2020 12:28:24 +0100 Subject: [PATCH 374/391] widgets work with context menu in edit mode, can be resized, look ugly in edit (db mode: ok) --- src/widget/widget-context-menu.js | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/src/widget/widget-context-menu.js b/src/widget/widget-context-menu.js index d79f869..a8ee86f 100644 --- a/src/widget/widget-context-menu.js +++ b/src/widget/widget-context-menu.js @@ -108,8 +108,13 @@ class WidgetContextMenu extends React.Component {
    ); - return
    - + let dim = { + width: this.props.widget.width, + height: this.props.widget.height + }; + + return
    + Date: Sun, 8 Nov 2020 22:02:59 +0100 Subject: [PATCH 375/391] WIP: fix image widget edit menu #267 --- src/dashboard/dashboard.js | 5 ++++ .../edit-widget/edit-widget-file-control.js | 2 +- src/widget/edit-widget/edit-widget.js | 25 +++++++++++++------ src/widget/widgets/image.js | 3 +++ 4 files changed, 26 insertions(+), 9 deletions(-) diff --git a/src/dashboard/dashboard.js b/src/dashboard/dashboard.js index 073c5fe..10db62c 100644 --- a/src/dashboard/dashboard.js +++ b/src/dashboard/dashboard.js @@ -280,6 +280,11 @@ class Dashboard extends Component { } closeEditFiles(){ + this.state.widgets.map(widget => { + if(widget.type === "Image"){ + widget.customProperties.update = true; + } + }) this.setState({ filesEditModal: false }); } diff --git a/src/widget/edit-widget/edit-widget-file-control.js b/src/widget/edit-widget/edit-widget-file-control.js index 21868ce..b55afe5 100644 --- a/src/widget/edit-widget/edit-widget-file-control.js +++ b/src/widget/edit-widget/edit-widget-file-control.js @@ -55,7 +55,7 @@ class EditFileWidgetControl extends React.Component { ))) } else { - fileOptions = + fileOptions = } return
    diff --git a/src/widget/edit-widget/edit-widget.js b/src/widget/edit-widget/edit-widget.js index 03b6931..ef6e09b 100644 --- a/src/widget/edit-widget/edit-widget.js +++ b/src/widget/edit-widget/edit-widget.js @@ -50,13 +50,21 @@ class EditWidgetDialog extends React.Component { fileId = parseInt(fileId, 10) // get aspect ratio of file const file = this.props.files.find(element => element.id === fileId); - // scale width to match aspect - if(file.dimensions){ - const aspectRatio = file.dimensions.width / file.dimensions.height; - changeObject.width = this.state.temporal.height * aspectRatio; - } + if (file) { + let img = new Image(); + img.src = file.objectURL; + + + img.onload = function () { + let height = img.height; + let width = img.width; + + const aspectRatio = width / height; + changeObject.width = Math.round(changeObject.height * aspectRatio); + } + } return changeObject; } @@ -106,6 +114,7 @@ class EditWidgetDialog extends React.Component { } if (parts[1] === 'lockAspect') { + console.log("pats[1} === lockaspect"); //not a customProperty customProperty ? changeObject[parts[0]][parts[1]] = e.target.checked : changeObject[e.target.id] = e.target.checked; @@ -122,11 +131,11 @@ class EditWidgetDialog extends React.Component { } // get file and update size (if it's an image) - /*if ((changeObject.customProperties.file !== -1)&&('lockAspect' in this.state.temporal && this.state.temporal.lockAspect)) { + if ((changeObject.customProperties.file !== -1)&&(this.props.widget.customProperties.lockAspect)) { // TODO this if condition requires changes to work!!! changeObject = this.assignAspectRatio(changeObject, e.target.value); - }*/ - } else if (parts[1] === 'textSize'){ + + }} else if (parts[1] === 'textSize'){ changeObject[parts[0]][parts[1]] = Number(e.target.value); changeObject = this.setMaxWidth(changeObject); diff --git a/src/widget/widgets/image.js b/src/widget/widgets/image.js index f289324..21f11ec 100644 --- a/src/widget/widgets/image.js +++ b/src/widget/widgets/image.js @@ -60,6 +60,9 @@ class WidgetImage extends React.Component { }); this.setState({ file: file }) } + else if (this.state.file === undefined || (this.state.file.id !== file.id) ){ + this.setState({ file: file}) + } } } From 052193e501bfb44b13eb6efd7d5826bb76f6eb88 Mon Sep 17 00:00:00 2001 From: irismarie Date: Thu, 12 Nov 2020 11:42:13 +0100 Subject: [PATCH 376/391] adapt children sizes to parents --- src/widget/widget-context-menu.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/widget/widget-context-menu.js b/src/widget/widget-context-menu.js index a8ee86f..197abf0 100644 --- a/src/widget/widget-context-menu.js +++ b/src/widget/widget-context-menu.js @@ -109,8 +109,8 @@ class WidgetContextMenu extends React.Component { ); let dim = { - width: this.props.widget.width, - height: this.props.widget.height + width: '100%', + height: '100%' }; return
    From 464b09a58ac6e666127fc648de5eaf4f1333cad9 Mon Sep 17 00:00:00 2001 From: Sonja Happ Date: Thu, 12 Nov 2020 11:51:10 +0100 Subject: [PATCH 377/391] Refactor "host" to "websocketurl" and "apihost" to "apiurl" #266 --- REACT.md | 12 +- doc/Production.md | 2 +- package-lock.json | 1005 +++++++++++++++++++++++++--- package.json | 20 +- src/common/api/websocket-api.js | 24 +- src/ic/edit-ic.js | 28 +- src/ic/ic-data-data-manager.js | 10 +- src/ic/ic-store.js | 14 +- src/ic/ics.js | 6 +- src/ic/import-ic.js | 16 +- src/ic/new-ic.js | 25 +- src/scenario/scenario.js | 12 +- src/signal/signals-data-manager.js | 2 +- 13 files changed, 1019 insertions(+), 157 deletions(-) diff --git a/REACT.md b/REACT.md index e290b93..430d5fa 100644 --- a/REACT.md +++ b/REACT.md @@ -538,7 +538,7 @@ Inside `index.html`, you can use it like this: Only files inside the `public` folder will be accessible by `%PUBLIC_URL%` prefix. If you need to use a file from `src` or `node_modules`, you’ll have to copy it there to explicitly specify your intention to make this file a part of the build. -When you run `npm run build`, Create React App will substitute `%PUBLIC_URL%` with a correct absolute path so your project works even if you use client-side routing or host it at a non-root URL. +When you run `npm run build`, Create React App will substitute `%PUBLIC_URL%` with a correct absolute path so your project works even if you use client-side routing or websocketurl it at a non-root URL. In JavaScript code, you can use `process.env.PUBLIC_URL` for similar purposes: @@ -789,7 +789,7 @@ You can find the companion GitHub repository [here](https://github.com/fullstack >Note: this feature is available with `react-scripts@0.2.3` and higher. -People often serve the front-end React app from the same host and port as their backend implementation.
    +People often serve the front-end React app from the same websocketurl and port as their backend implementation.
    For example, a production setup might look like this after the app is deployed: ``` @@ -798,7 +798,7 @@ For example, a production setup might look like this after the app is deployed: /api/todos - server handles any /api/* requests using the backend implementation ``` -Such setup is **not** required. However, if you **do** have a setup like this, it is convenient to write requests like `fetch('/api/todos')` without worrying about redirecting them to another host or port during development. +Such setup is **not** required. However, if you **do** have a setup like this, it is convenient to write requests like `fetch('/api/todos')` without worrying about redirecting them to another websocketurl or port during development. To tell the development server to proxy any unknown requests to your API server in development, add a `proxy` field to your `package.json`, for example: @@ -820,7 +820,7 @@ The `proxy` option supports HTTP, HTTPS and WebSocket connections.
    If the `proxy` option is **not** flexible enough for you, alternatively you can: * Enable CORS on your server ([here’s how to do it for Express](http://enable-cors.org/server_expressjs.html)). -* Use [environment variables](#adding-custom-environment-variables) to inject the right server host and port into your app. +* Use [environment variables](#adding-custom-environment-variables) to inject the right server websocketurl and port into your app. ## Using HTTPS in Development @@ -1512,10 +1512,10 @@ You can adjust various development and production settings by setting environmen Variable | Development | Production | Usage :--- | :---: | :---: | :--- BROWSER | :white_check_mark: | :x: | By default, Create React App will open the default system browser, favoring Chrome on macOS. Specify a [browser](https://github.com/sindresorhus/opn#app) to override this behavior, or set it to `none` to disable it completely. -HOST | :white_check_mark: | :x: | By default, the development web server binds to `localhost`. You may use this variable to specify a different host. +HOST | :white_check_mark: | :x: | By default, the development web server binds to `localhost`. You may use this variable to specify a different websocketurl. PORT | :white_check_mark: | :x: | By default, the development web server will attempt to listen on port 3000 or prompt you to attempt the next available port. You may use this variable to specify a different port. HTTPS | :white_check_mark: | :x: | When set to `true`, Create React App will run the development server in `https` mode. -PUBLIC_URL | :x: | :white_check_mark: | Create React App assumes your application is hosted at the serving web server's root or a subpath as specified in [`package.json` (`homepage`)](#building-for-relative-paths). Normally, Create React App ignores the hostname. You may use this variable to force assets to be referenced verbatim to the url you provide (hostname included). This may be particularly useful when using a CDN to host your application. +PUBLIC_URL | :x: | :white_check_mark: | Create React App assumes your application is hosted at the serving web server's root or a subpath as specified in [`package.json` (`homepage`)](#building-for-relative-paths). Normally, Create React App ignores the hostname. You may use this variable to force assets to be referenced verbatim to the url you provide (hostname included). This may be particularly useful when using a CDN to websocketurl your application. CI | :large_orange_diamond: | :white_check_mark: | When set to `true`, Create React App treats warnings as failures in the build. It also makes the test runner non-watching. Most CIs set this flag by default. ## Troubleshooting diff --git a/doc/Production.md b/doc/Production.md index e5fd20c..5d55ba0 100644 --- a/doc/Production.md +++ b/doc/Production.md @@ -75,7 +75,7 @@ villas node webdemo.conf ### Visualize real-time data in VILLASweb Dashboards 1. Use the VILLASweb frontend to create a new infrastructure component for the VILLASnode gateway from above (Admin user required). -2. Set the `host` parameter of the component to the target you used as the `web.destinations` parameter in the configuration from above. +2. Set the `websocketurl` parameter of the component to the target you used as the `web.destinations` parameter in the configuration from above. 3. Create a new scenario in VILLASweb and within that scenario create a new component configuration that uses the infrastructure component you created under 2. 4. WIP: Use the signal auto-configure function to retrieve the signal configuration of the VILLASnode automatically. 5. Create a new dashboard with widgets of your choice and link these widgets to the signals received from the infrastructure component. diff --git a/package-lock.json b/package-lock.json index 38291bf..10f2405 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1233,6 +1233,13 @@ "integrity": "sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg==", "requires": { "type-fest": "^0.8.1" + }, + "dependencies": { + "type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==" + } } }, "ignore": { @@ -1271,9 +1278,9 @@ } }, "@fortawesome/react-fontawesome": { - "version": "0.1.11", - "resolved": "https://registry.npmjs.org/@fortawesome/react-fontawesome/-/react-fontawesome-0.1.11.tgz", - "integrity": "sha512-sClfojasRifQKI0OPqTy8Ln8iIhnxR/Pv/hukBhWnBz9kQRmqi6JSH3nghlhAY7SUeIIM7B5/D2G8WjX0iepVg==", + "version": "0.1.12", + "resolved": "https://registry.npmjs.org/@fortawesome/react-fontawesome/-/react-fontawesome-0.1.12.tgz", + "integrity": "sha512-kV6HtqotM3K4YIXlTVvomuIi6QgGCvYm++ImyEx2wwgmSppZ6kbbA29ASwjAUBD63j2OFU0yoxeXpZkjrrX0qQ==", "requires": { "prop-types": "^15.7.2" } @@ -1515,6 +1522,13 @@ "find-up": "^4.1.0", "read-pkg": "^5.2.0", "type-fest": "^0.8.1" + }, + "dependencies": { + "type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==" + } } }, "resolve": { @@ -1699,6 +1713,13 @@ "find-up": "^4.1.0", "read-pkg": "^5.2.0", "type-fest": "^0.8.1" + }, + "dependencies": { + "type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==" + } } }, "resolve": { @@ -2275,6 +2296,14 @@ "resolved": "https://registry.npmjs.org/@types/html-minifier-terser/-/html-minifier-terser-5.1.1.tgz", "integrity": "sha512-giAlZwstKbmvMk1OO7WXSj4OZ0keXAcl2TQq4LWHiiPH2ByaH7WeUzng+Qej8UPxxv+8lRTuouo0iaNDBuzIBA==" }, + "@types/http-proxy": { + "version": "1.17.4", + "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.4.tgz", + "integrity": "sha512-IrSHl2u6AWXduUaDLqYpt45tLVCtYv7o4Z0s1KghBCDgIIS9oW5K1H8mZG/A2CfeLdEa7rTd1ACOiHBc1EMT2Q==", + "requires": { + "@types/node": "*" + } + }, "@types/invariant": { "version": "2.2.34", "resolved": "https://registry.npmjs.org/@types/invariant/-/invariant-2.2.34.tgz", @@ -2825,6 +2854,11 @@ "color-convert": "^1.9.0" } }, + "any-promise": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", + "integrity": "sha1-q8av7tzqUugJzcA3au0845Y10X8=" + }, "anymatch": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz", @@ -2848,6 +2882,11 @@ "readable-stream": "^2.0.6" } }, + "arg": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", + "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==" + }, "argparse": { "version": "1.0.10", "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", @@ -3789,6 +3828,14 @@ "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=" }, + "bufferutil": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/bufferutil/-/bufferutil-4.0.1.tgz", + "integrity": "sha512-xowrxvpxojqkagPcWRQVXZl0YXhRhAtBEIq3VoER1NH5Mw1n1o0ojdspp+GS2J//2gCVyrzQDApQ4unGF+QOoA==", + "requires": { + "node-gyp-build": "~3.7.0" + } + }, "builtin-modules": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.1.0.tgz", @@ -3872,6 +3919,15 @@ "unset-value": "^1.0.0" } }, + "cache-content-type": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cache-content-type/-/cache-content-type-1.0.1.tgz", + "integrity": "sha512-IKufZ1o4Ut42YUrZSo8+qnMTrFuKkvyoLXUywKz9GJ5BrhOFGhLdkx9sG4KAnVvbY6kEcSFjLQul+DVmBm2bgA==", + "requires": { + "mime-types": "^2.1.18", + "ylru": "^1.2.0" + } + }, "caller-callsite": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/caller-callsite/-/caller-callsite-2.0.0.tgz", @@ -3946,6 +4002,16 @@ "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001151.tgz", "integrity": "sha512-Zh3sHqskX6mHNrqUerh+fkf0N72cMxrmflzje/JyVImfpknscMnkeJrlFGJcqTmaa0iszdYptGpWMJCRQDkBVw==" }, + "canvas": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/canvas/-/canvas-2.6.1.tgz", + "integrity": "sha512-S98rKsPcuhfTcYbtF53UIJhcbgIAK533d1kJKMwsMwAIFgfd58MOyxRud3kktlzWiEkFliaJtvyZCBtud/XVEA==", + "requires": { + "nan": "^2.14.0", + "node-pre-gyp": "^0.11.0", + "simple-get": "^3.0.3" + } + }, "capture-exit": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/capture-exit/-/capture-exit-2.0.0.tgz", @@ -4010,9 +4076,9 @@ "integrity": "sha512-tzWzvgePgLORb9/3a0YenggReLKAIb2owL03H2Xdoe5pKcUyWRSEQ8xfCar8t2SIAuEDwtmx2da1YB52YuHQMQ==" }, "chokidar": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.3.1.tgz", - "integrity": "sha512-4QYCEWOcK3OJrxwvyyAOxFuhpvOVCYkr33LPfFNBjAD/w3sEzWsp2BUOkI4l9bHvWioAd0rc6NlHUOEaWkTeqg==", + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.4.3.tgz", + "integrity": "sha512-DtM3g7juCXQxFVSNPNByEC2+NImtBuxQQvWlHunpJIS5Ocr0lG306cC7FCi7cEA0fzmybPUIl4txBIobk1gGOQ==", "requires": { "anymatch": "~3.1.1", "braces": "~3.0.2", @@ -4021,52 +4087,7 @@ "is-binary-path": "~2.1.0", "is-glob": "~4.0.1", "normalize-path": "~3.0.0", - "readdirp": "~3.3.0" - }, - "dependencies": { - "anymatch": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz", - "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==", - "requires": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - } - }, - "braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "requires": { - "fill-range": "^7.0.1" - } - }, - "fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "requires": { - "to-regex-range": "^5.0.1" - } - }, - "is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" - }, - "normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==" - }, - "to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "requires": { - "is-number": "^7.0.0" - } - } + "readdirp": "~3.5.0" } }, "chownr": { @@ -4422,6 +4443,22 @@ "resolved": "https://registry.npmjs.org/cookiejar/-/cookiejar-2.1.2.tgz", "integrity": "sha512-Mw+adcfzPxcPeI+0WlvRrr/3lGVO0bD75SxX6811cxSh1Wbxx7xZBGK1eVtDf6si8rg2lhnUjsVLMFMfbRIuwA==" }, + "cookies": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/cookies/-/cookies-0.8.0.tgz", + "integrity": "sha512-8aPsApQfebXnuI+537McwYsDtjVxGm8gTIzQI3FDW6t5t/DAhERxtnbEPN/8RX+uZthoz4eCOgloXaE5cYyNow==", + "requires": { + "depd": "~2.0.0", + "keygrip": "~1.1.0" + }, + "dependencies": { + "depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==" + } + } + }, "copy-concurrently": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/copy-concurrently/-/copy-concurrently-1.0.5.tgz", @@ -5008,6 +5045,14 @@ "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=" }, + "decompress-response": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-4.2.1.tgz", + "integrity": "sha512-jOSne2qbyE+/r8G1VU+G/82LBs2Fs4LAsTiLSHOCOMZQl2OKZ6i8i4IyHemTe+/yIXOtTcRQMzPcgyhoFlqPkw==", + "requires": { + "mimic-response": "^2.0.0" + } + }, "dedent": { "version": "0.7.0", "resolved": "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz", @@ -5035,6 +5080,11 @@ "regexp.prototype.flags": "^1.2.0" } }, + "deep-extend": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==" + }, "deep-is": { "version": "0.1.3", "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", @@ -5181,6 +5231,11 @@ "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" }, + "detect-libc": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", + "integrity": "sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=" + }, "detect-newline": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", @@ -5215,6 +5270,11 @@ } } }, + "diff": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==" + }, "diff-sequences": { "version": "26.5.0", "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-26.5.0.tgz", @@ -5774,6 +5834,13 @@ "integrity": "sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg==", "requires": { "type-fest": "^0.8.1" + }, + "dependencies": { + "type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==" + } } }, "has-flag": { @@ -6667,6 +6734,14 @@ } } }, + "fibers": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/fibers/-/fibers-5.0.0.tgz", + "integrity": "sha512-UpGv/YAZp7mhKHxDvC1tColrroGRX90sSvh8RMZV9leo+e5+EkRVgCEZPlmXeo3BUNQTZxUaVdLskq1Q2FyCPg==", + "requires": { + "detect-libc": "^1.0.3" + } + }, "figgy-pudding": { "version": "3.5.2", "resolved": "https://registry.npmjs.org/figgy-pudding/-/figgy-pudding-3.5.2.tgz", @@ -7647,6 +7722,22 @@ } } }, + "http-assert": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/http-assert/-/http-assert-1.4.1.tgz", + "integrity": "sha512-rdw7q6GTlibqVVbXr0CKelfV5iY8G2HqEUkhSk297BMbSpSL8crXC+9rjKoMcZZEsksX30le6f/4ul4E28gegw==", + "requires": { + "deep-equal": "~1.0.1", + "http-errors": "~1.7.2" + }, + "dependencies": { + "deep-equal": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.0.1.tgz", + "integrity": "sha1-9dJgKStmDghO/0zbyfCK0yR0SLU=" + } + } + }, "http-deceiver": { "version": "1.2.7", "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", @@ -7853,6 +7944,14 @@ "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.8.tgz", "integrity": "sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw==" }, + "ignore-walk": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-3.0.3.tgz", + "integrity": "sha512-m7o6xuOaT1aqheYHKf8W6J5pYH85ZI9w077erOzLje3JsB1gkafkAhHHY19dqjulgIZHFm32Cp5uNZgcQqdJKw==", + "requires": { + "minimatch": "^3.0.4" + } + }, "immediate": { "version": "3.0.6", "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz", @@ -8248,6 +8347,11 @@ "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==" }, + "is-generator-function": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.7.tgz", + "integrity": "sha512-YZc5EwyO4f2kWCax7oegfuSr9mFz1ZvieNYBEjmukLxgXfBUbxAWGVF7GZf0zidYtoBl3WvC07YK0wT76a+Rtw==" + }, "is-glob": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", @@ -8315,6 +8419,11 @@ "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.0.tgz", "integrity": "sha1-DFLlS8yjkbssSUsh6GJtczbG45c=" }, + "is-promise": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-4.0.0.tgz", + "integrity": "sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==" + }, "is-regex": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.1.tgz", @@ -8915,6 +9024,13 @@ "find-up": "^4.1.0", "read-pkg": "^5.2.0", "type-fest": "^0.8.1" + }, + "dependencies": { + "type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==" + } } }, "resolve": { @@ -9417,6 +9533,13 @@ "find-up": "^4.1.0", "read-pkg": "^5.2.0", "type-fest": "^0.8.1" + }, + "dependencies": { + "type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==" + } } }, "resolve": { @@ -9556,6 +9679,13 @@ "find-up": "^4.1.0", "read-pkg": "^5.2.0", "type-fest": "^0.8.1" + }, + "dependencies": { + "type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==" + } } }, "resolve": { @@ -9712,6 +9842,13 @@ "find-up": "^4.1.0", "read-pkg": "^5.2.0", "type-fest": "^0.8.1" + }, + "dependencies": { + "type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==" + } } }, "resolve": { @@ -9913,6 +10050,13 @@ "find-up": "^4.1.0", "read-pkg": "^5.2.0", "type-fest": "^0.8.1" + }, + "dependencies": { + "type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==" + } } }, "resolve": { @@ -10401,6 +10545,14 @@ "set-immediate-shim": "~1.0.1" } }, + "keygrip": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/keygrip/-/keygrip-1.1.0.tgz", + "integrity": "sha512-iYSchDJ+liQ8iwbSI2QqsQOvqv58eJCEanyJPJi+Khyu8smkcKSFUCbPwzFcL7YVtZ6eONjqRX/38caJ7QjRAQ==", + "requires": { + "tsscmp": "1.0.6" + } + }, "killable": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/killable/-/killable-1.0.1.tgz", @@ -10419,6 +10571,186 @@ "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==" }, + "koa": { + "version": "2.13.0", + "resolved": "https://registry.npmjs.org/koa/-/koa-2.13.0.tgz", + "integrity": "sha512-i/XJVOfPw7npbMv67+bOeXr3gPqOAw6uh5wFyNs3QvJ47tUx3M3V9rIE0//WytY42MKz4l/MXKyGkQ2LQTfLUQ==", + "requires": { + "accepts": "^1.3.5", + "cache-content-type": "^1.0.0", + "content-disposition": "~0.5.2", + "content-type": "^1.0.4", + "cookies": "~0.8.0", + "debug": "~3.1.0", + "delegates": "^1.0.0", + "depd": "^1.1.2", + "destroy": "^1.0.4", + "encodeurl": "^1.0.2", + "escape-html": "^1.0.3", + "fresh": "~0.5.2", + "http-assert": "^1.3.0", + "http-errors": "^1.6.3", + "is-generator-function": "^1.0.7", + "koa-compose": "^4.1.0", + "koa-convert": "^1.2.0", + "on-finished": "^2.3.0", + "only": "~0.0.2", + "parseurl": "^1.3.2", + "statuses": "^1.5.0", + "type-is": "^1.6.16", + "vary": "^1.1.2" + }, + "dependencies": { + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + } + } + }, + "koa-compose": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/koa-compose/-/koa-compose-4.1.0.tgz", + "integrity": "sha512-8ODW8TrDuMYvXRwra/Kh7/rJo9BtOfPc6qO8eAfC80CnCvSjSl0bkRM24X6/XBBEyj0v1nRUQ1LyOy3dbqOWXw==" + }, + "koa-compress": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/koa-compress/-/koa-compress-4.0.1.tgz", + "integrity": "sha512-It4WYfsBb9HegnFgcBhiRbPeh1LDjXhRM4+xi2jMp8ujwaVAdqhFzHpbDWuTxbLxuBwStn+Bwdwn2zDZxeNChg==", + "requires": { + "bytes": "^3.0.0", + "compressible": "^2.0.0", + "http-errors": "^1.7.3", + "koa-is-json": "^1.0.0", + "statuses": "^2.0.0" + }, + "dependencies": { + "http-errors": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.8.0.tgz", + "integrity": "sha512-4I8r0C5JDhT5VkvI47QktDW75rNlGVsUf/8hzjCC/wkWI/jdTRmBb9aI7erSG82r1bjKY3F6k28WnsVxB1C73A==", + "requires": { + "depd": "~1.1.2", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": ">= 1.5.0 < 2", + "toidentifier": "1.0.0" + }, + "dependencies": { + "statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=" + } + } + }, + "setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" + }, + "statuses": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.0.tgz", + "integrity": "sha512-w9jNUUQdpuVoYqXxnyOakhckBbOxRaoYqJscyIBYCS5ixyCnO7nQn7zBZvP9zf5QOPZcz2DLUpE3KsNPbJBOFA==" + } + } + }, + "koa-connect": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/koa-connect/-/koa-connect-2.1.0.tgz", + "integrity": "sha512-O9pcFafHk0oQsBevlbTBlB9co+2RUQJ4zCzu3qJPmGlGoeEZkne+7gWDkecqDPSbCtED6LmhlQladxs6NjOnMQ==" + }, + "koa-convert": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/koa-convert/-/koa-convert-1.2.0.tgz", + "integrity": "sha1-2kCHXfSd4FOQmNFwC1CCDOvNIdA=", + "requires": { + "co": "^4.6.0", + "koa-compose": "^3.0.0" + }, + "dependencies": { + "koa-compose": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/koa-compose/-/koa-compose-3.2.1.tgz", + "integrity": "sha1-qFzLQLfZhtjlo0Wzoazo6rz1Tec=", + "requires": { + "any-promise": "^1.1.0" + } + } + } + }, + "koa-is-json": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/koa-is-json/-/koa-is-json-1.0.0.tgz", + "integrity": "sha1-JzwH7c3Ljfaiwat9We52SRRR7BQ=" + }, + "koa-route": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/koa-route/-/koa-route-3.2.0.tgz", + "integrity": "sha1-dimLmaa8+p44yrb+XHmocz51i84=", + "requires": { + "debug": "*", + "methods": "~1.1.0", + "path-to-regexp": "^1.2.0" + } + }, + "koa-send": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/koa-send/-/koa-send-5.0.1.tgz", + "integrity": "sha512-tmcyQ/wXXuxpDxyNXv5yNNkdAMdFRqwtegBXUaowiQzUKqJehttS0x2j0eOZDQAyloAth5w6wwBImnFzkUz3pQ==", + "requires": { + "debug": "^4.1.1", + "http-errors": "^1.7.3", + "resolve-path": "^1.4.0" + }, + "dependencies": { + "http-errors": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.8.0.tgz", + "integrity": "sha512-4I8r0C5JDhT5VkvI47QktDW75rNlGVsUf/8hzjCC/wkWI/jdTRmBb9aI7erSG82r1bjKY3F6k28WnsVxB1C73A==", + "requires": { + "depd": "~1.1.2", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": ">= 1.5.0 < 2", + "toidentifier": "1.0.0" + } + }, + "setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" + } + } + }, + "koa-static": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/koa-static/-/koa-static-5.0.0.tgz", + "integrity": "sha512-UqyYyH5YEXaJrf9S8E23GoJFQZXkBVJ9zYYMPGz919MSX1KuvAcycIuS0ci150HCoPf4XQVhQ84Qf8xRPWxFaQ==", + "requires": { + "debug": "^3.1.0", + "koa-send": "^5.0.0" + }, + "dependencies": { + "debug": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "requires": { + "ms": "^2.1.1" + } + } + } + }, "language-subtag-registry": { "version": "0.3.20", "resolved": "https://registry.npmjs.org/language-subtag-registry/-/language-subtag-registry-0.3.20.tgz", @@ -10607,6 +10939,11 @@ "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.7.0.tgz", "integrity": "sha512-i2sY04nal5jDcagM3FMfG++T69GEEM8CYuOfeOIvmXzOIcwE9a/CJPR0MFM97pYMj/u10lzz7/zd7+qwhrBTqQ==" }, + "loglevelnext": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/loglevelnext/-/loglevelnext-4.0.1.tgz", + "integrity": "sha512-/tlMUn5wqgzg9msy0PiWc+8fpVXEuYPq49c2RGyw2NAh0hSrgq6j/Z3YPnwWsILMoFJ+ZT6ePHnWUonkjDnq2Q==" + }, "loose-envify": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", @@ -10664,6 +11001,11 @@ } } }, + "make-error": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", + "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==" + }, "makeerror": { "version": "1.0.11", "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.11.tgz", @@ -10905,6 +11247,11 @@ "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==" }, + "mimic-response": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-2.1.0.tgz", + "integrity": "sha512-wXqjST+SLt7R009ySCglWBCFpjUygmCIfD790/kVbiGmUgfYGuB14PiTd5DwVxSV4NcYHjzMkoj5LjQZwTQLEA==" + }, "mini-create-react-context": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/mini-create-react-context/-/mini-create-react-context-0.4.0.tgz", @@ -11178,6 +11525,26 @@ "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=" }, + "needle": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/needle/-/needle-2.5.2.tgz", + "integrity": "sha512-LbRIwS9BfkPvNwNHlsA41Q29kL2L/6VaOJ0qisM5lLWsTV3nP15abO5ITL6L81zqFhzjRKDAYjpcBcwM0AVvLQ==", + "requires": { + "debug": "^3.2.6", + "iconv-lite": "^0.4.4", + "sax": "^1.2.4" + }, + "dependencies": { + "debug": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "requires": { + "ms": "^2.1.1" + } + } + } + }, "negotiator": { "version": "0.6.2", "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", @@ -11247,6 +11614,11 @@ } } }, + "node-gyp-build": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-3.7.0.tgz", + "integrity": "sha512-L/Eg02Epx6Si2NXmedx+Okg+4UHqmaf3TNcxd50SF9NQGcJaON3AtU++kax69XV7YWz4tUspqZSAsVofhFKG2w==" + }, "node-int64": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", @@ -11325,6 +11697,88 @@ } } }, + "node-pre-gyp": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/node-pre-gyp/-/node-pre-gyp-0.11.0.tgz", + "integrity": "sha512-TwWAOZb0j7e9eGaf9esRx3ZcLaE5tQ2lvYy1pb5IAaG1a2e2Kv5Lms1Y4hpj+ciXJRofIxxlt5haeQ/2ANeE0Q==", + "requires": { + "detect-libc": "^1.0.2", + "mkdirp": "^0.5.1", + "needle": "^2.2.1", + "nopt": "^4.0.1", + "npm-packlist": "^1.1.6", + "npmlog": "^4.0.2", + "rc": "^1.2.7", + "rimraf": "^2.6.1", + "semver": "^5.3.0", + "tar": "^4" + }, + "dependencies": { + "chownr": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", + "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==" + }, + "fs-minipass": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-1.2.7.tgz", + "integrity": "sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA==", + "requires": { + "minipass": "^2.6.0" + } + }, + "minipass": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.9.0.tgz", + "integrity": "sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg==", + "requires": { + "safe-buffer": "^5.1.2", + "yallist": "^3.0.0" + } + }, + "minizlib": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-1.3.3.tgz", + "integrity": "sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q==", + "requires": { + "minipass": "^2.9.0" + } + }, + "nopt": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-4.0.3.tgz", + "integrity": "sha512-CvaGwVMztSMJLOeXPrez7fyfObdZqNUK1cPAEzLHrTybIua9pMdmmPR5YwtfNftIOMv3DPUhFaxsZMNTQO20Kg==", + "requires": { + "abbrev": "1", + "osenv": "^0.1.4" + } + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" + }, + "tar": { + "version": "4.4.13", + "resolved": "https://registry.npmjs.org/tar/-/tar-4.4.13.tgz", + "integrity": "sha512-w2VwSrBoHa5BsSyH+KxEqeQBAllHhccyMFVHtGtdMpF4W7IRWfZjFiQceJPChOeTsSDVUpER2T8FA93pr0L+QA==", + "requires": { + "chownr": "^1.1.1", + "fs-minipass": "^1.2.5", + "minipass": "^2.8.6", + "minizlib": "^1.2.1", + "mkdirp": "^0.5.0", + "safe-buffer": "^5.1.2", + "yallist": "^3.0.3" + } + }, + "yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" + } + } + }, "node-releases": { "version": "1.1.64", "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.64.tgz", @@ -11461,6 +11915,29 @@ "sort-keys": "^1.0.0" } }, + "npm-bundled": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-1.1.1.tgz", + "integrity": "sha512-gqkfgGePhTpAEgUsGEgcq1rqPXA+tv/aVBlgEzfXwA1yiUJF7xtEt3CtVwOjNYQOVknDk0F20w58Fnm3EtG0fA==", + "requires": { + "npm-normalize-package-bin": "^1.0.1" + } + }, + "npm-normalize-package-bin": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-1.0.1.tgz", + "integrity": "sha512-EPfafl6JL5/rU+ot6P3gRSCpPDW5VmIzX959Ob1+ySFUuuYHWHekXpwdUZcKP5C+DS4GEtdJluwBjnsNDl+fSA==" + }, + "npm-packlist": { + "version": "1.4.8", + "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-1.4.8.tgz", + "integrity": "sha512-5+AZgwru5IevF5ZdnFglB5wNlHG1AOOuw28WhUq8/8emhBmLv6jX5by4WJCh7lW0uSYZYS6DXqIsyZVIXRZU9A==", + "requires": { + "ignore-walk": "^3.0.1", + "npm-bundled": "^1.0.1", + "npm-normalize-package-bin": "^1.0.1" + } + }, "npm-run-path": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", @@ -11734,6 +12211,11 @@ "mimic-fn": "^2.1.0" } }, + "only": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/only/-/only-0.0.2.tgz", + "integrity": "sha1-Kv3oTQPlC5qO3EROMGEKcCle37Q=" + }, "open": { "version": "7.3.0", "resolved": "https://registry.npmjs.org/open/-/open-7.3.0.tgz", @@ -11812,6 +12294,11 @@ "os-tmpdir": "^1.0.0" } }, + "p-defer": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-3.0.0.tgz", + "integrity": "sha512-ugZxsxmtTln604yeYd29EGrNhazN2lywetzpKhfmQjW/VJmhpDmWbiX+h0zL8V91R0UXkhb3KtPmyq9PZw3aYw==" + }, "p-each-series": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/p-each-series/-/p-each-series-2.1.0.tgz", @@ -13428,6 +13915,24 @@ } } }, + "rc": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", + "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", + "requires": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + }, + "dependencies": { + "strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=" + } + } + }, "rc-align": { "version": "4.0.8", "resolved": "https://registry.npmjs.org/rc-align/-/rc-align-4.0.8.tgz", @@ -13481,9 +13986,9 @@ } }, "rc-slider": { - "version": "9.5.4", - "resolved": "https://registry.npmjs.org/rc-slider/-/rc-slider-9.5.4.tgz", - "integrity": "sha512-24goJnWhmWi0ojNZMoPSMni2wh73IPqEK0TJh7rWn10hPLLKgG8x3KRR0g4uUdCS9APHyosqxGXUIJKGydJXVg==", + "version": "9.6.0", + "resolved": "https://registry.npmjs.org/rc-slider/-/rc-slider-9.6.0.tgz", + "integrity": "sha512-XJZjS8JWPnhoS83n9IlZrfblP7zt9urGe881Clq7ZvEpeEQ7z3z/HyuZNFI0JL9rZV7l3pWRtYi1ur6G/7wJcA==", "requires": { "@babel/runtime": "^7.10.1", "classnames": "^2.2.5", @@ -13532,9 +14037,9 @@ } }, "rc-trigger": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/rc-trigger/-/rc-trigger-5.0.8.tgz", - "integrity": "sha512-0bgFw39CKWRC4l3eQrqXe0O/e+XgZW68tXVewU/FI3qGs3PWXlPPbInes2ZvTIka/mS5oqOfF7wC1NPwPfo+9w==", + "version": "5.0.9", + "resolved": "https://registry.npmjs.org/rc-trigger/-/rc-trigger-5.0.9.tgz", + "integrity": "sha512-N+q/ur2dpJSPDWbZQ34ztpGorms1QIphtmFpxKE5z+wMJw2BIASkMDEfwHJ/ssvZQxScjQza0/eQ0CWUI0e+EQ==", "requires": { "@babel/runtime": "^7.11.2", "classnames": "^2.2.6", @@ -13697,12 +14202,13 @@ "integrity": "sha512-cN2tkxBWizhPQ2JHfe0aUSJtmMthKA17NZkTElpiQ2snQAAi1hssXZ2fv88rAPNNvG5ss4t0PbOZT0TIl9Lk3Q==" }, "react-color": { - "version": "2.18.1", - "resolved": "https://registry.npmjs.org/react-color/-/react-color-2.18.1.tgz", - "integrity": "sha512-X5XpyJS6ncplZs74ak0JJoqPi+33Nzpv5RYWWxn17bslih+X7OlgmfpmGC1fNvdkK7/SGWYf1JJdn7D2n5gSuQ==", + "version": "2.19.3", + "resolved": "https://registry.npmjs.org/react-color/-/react-color-2.19.3.tgz", + "integrity": "sha512-LEeGE/ZzNLIsFWa1TMe8y5VYqr7bibneWmvJwm1pCn/eNmrabWDh659JSPn9BuaMpEfU83WTOJfnCcjDZwNQTA==", "requires": { "@icons/material": "^0.2.4", - "lodash": "^4.17.11", + "lodash": "^4.17.15", + "lodash-es": "^4.17.15", "material-colors": "^1.2.1", "prop-types": "^15.5.10", "reactcss": "^1.2.0", @@ -14221,11 +14727,11 @@ } }, "readdirp": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.3.0.tgz", - "integrity": "sha512-zz0pAkSPOXXm1viEwygWIPSPkcBYjW1xU5j/JBh5t9bGCJwa6f9+BJa6VaB2g+b55yVrmXzqkyLf4xaWYM0IkQ==", + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.5.0.tgz", + "integrity": "sha512-cMhu7c/8rdhkHXWsY+osBhfSy0JikwpHK/5+imo+LpeasTF8ouErHrlYkwT0++njiyuDvc7OFY5T3ukvZ8qmFQ==", "requires": { - "picomatch": "^2.0.7" + "picomatch": "^2.2.1" } }, "recursive-readdir": { @@ -14586,6 +15092,38 @@ "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==" }, + "resolve-path": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/resolve-path/-/resolve-path-1.4.0.tgz", + "integrity": "sha1-xL2p9e+y/OZSR4c6s2u02DT+Fvc=", + "requires": { + "http-errors": "~1.6.2", + "path-is-absolute": "1.0.1" + }, + "dependencies": { + "http-errors": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", + "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=", + "requires": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.0", + "statuses": ">= 1.4.0 < 2" + } + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + }, + "setprototypeof": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", + "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==" + } + } + }, "resolve-pathname": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/resolve-pathname/-/resolve-pathname-3.0.0.tgz", @@ -14991,9 +15529,9 @@ "integrity": "sha512-vTxrZz4dX5W86M6oVWVdOVe72ZiPs41Oi7Z6Km4W5Turyz28mrXSJhhEBZoRtzJWIv3833WKVwLSDWWkEfupMg==" }, "sass": { - "version": "1.27.0", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.27.0.tgz", - "integrity": "sha512-0gcrER56OkzotK/GGwgg4fPrKuiFlPNitO7eUJ18Bs+/NBlofJfMxmxqpqJxjae9vu0Wq8TZzrSyxZal00WDig==", + "version": "1.28.0", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.28.0.tgz", + "integrity": "sha512-9FWX/0wuE1KxwfiP02chZhHaPzu6adpx9+wGch7WMOuHy5npOo0UapRI3FNSHva2CczaYJu2yNUBN8cCSqHz/A==", "requires": { "chokidar": ">=2.0.0 <4.0.0" } @@ -15391,6 +15929,21 @@ "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=" }, + "simple-concat": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz", + "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==" + }, + "simple-get": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-3.1.0.tgz", + "integrity": "sha512-bCR6cP+aTdScaQCnQKbPKtJOKDp/hj9EDLJo3Nw4y1QksqaovlW/bnptB6/c1e+qmNIDHRK+oXFDdEqBT8WzUA==", + "requires": { + "decompress-response": "^4.2.0", + "once": "^1.3.1", + "simple-concat": "^1.0.0" + } + }, "simple-swizzle": { "version": "0.2.2", "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", @@ -16080,6 +16633,11 @@ } } }, + "superstruct": { + "version": "0.10.12", + "resolved": "https://registry.npmjs.org/superstruct/-/superstruct-0.10.12.tgz", + "integrity": "sha512-FiNhfegyytDI0QxrrEoeGknFM28SnoHqCBpkWewUm8jRNj74NVxLpiiePvkOo41Ze/aKMSHa/twWjNF81mKaQQ==" + }, "supports-color": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", @@ -16382,9 +16940,9 @@ "integrity": "sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA==" }, "tinycolor2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/tinycolor2/-/tinycolor2-1.4.1.tgz", - "integrity": "sha1-9PrTM0R7wLB9TcjpIJ2POaisd+g=" + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/tinycolor2/-/tinycolor2-1.4.2.tgz", + "integrity": "sha512-vJhccZPs965sV/L2sU4oRQVAos0pQXwsvTLkWYdqJ+a8Q5kPFzJTuOFwy7UniPli44NKQGAglksjvOcpo95aZA==" }, "tmp": { "version": "0.0.33", @@ -16482,6 +17040,18 @@ "resolved": "https://registry.npmjs.org/tryer/-/tryer-1.0.1.tgz", "integrity": "sha512-c3zayb8/kWWpycWYg87P71E1S1ZL6b6IJxfb5fvsUgsf0S2MVGaDhDXXjDMpdCpfWXqptc+4mXwmiy1ypXqRAA==" }, + "ts-node": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-9.0.0.tgz", + "integrity": "sha512-/TqB4SnererCDR/vb4S/QvSZvzQMJN8daAslg7MeaiHvD8rDZsSfXmNeNumyZZzMned72Xoq/isQljYSt8Ynfg==", + "requires": { + "arg": "^4.1.0", + "diff": "^4.0.1", + "make-error": "^1.1.1", + "source-map-support": "^0.5.17", + "yn": "3.1.1" + } + }, "ts-pnp": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/ts-pnp/-/ts-pnp-1.2.0.tgz", @@ -16513,6 +17083,11 @@ "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" }, + "tsscmp": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/tsscmp/-/tsscmp-1.0.6.tgz", + "integrity": "sha512-LxhtAkPDTkVCMQjt2h6eBVY28KCjikZqZfMcC15YBeNjkgUpdCfBu5HoiOTDu86v6smE8yOjyEktJ8hlbANHQA==" + }, "tsutils": { "version": "3.17.1", "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.17.1.tgz", @@ -16558,9 +17133,9 @@ "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==" }, "type-fest": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", - "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==" + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.13.1.tgz", + "integrity": "sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg==" }, "type-is": { "version": "1.6.18", @@ -16585,9 +17160,9 @@ } }, "typescript": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.0.3.tgz", - "integrity": "sha512-tEu6DGxGgRJPb/mVPIZ48e69xCn2yRmCgYmDugAVwmJ6o+0u1RI18eO7E7WBTLYLaEVVOhwQmcdhQHweux/WPg==" + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.0.5.tgz", + "integrity": "sha512-ywmr/VrTVCmNTJ6iV2LwIrfG1P+lv6luD8sUJs+2eI9NLGigaN+nUQc13iHqisq7bra9lnmUSYqbJvegraBOPQ==" }, "ua-parser-js": { "version": "0.7.20", @@ -16833,6 +17408,14 @@ "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==" }, + "utf-8-validate": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/utf-8-validate/-/utf-8-validate-5.0.2.tgz", + "integrity": "sha512-SwV++i2gTD5qh2XqaPzBnNX88N6HdyhQrNNRykvcS0QKvItV9u3vPEJr+X5Hhfb1JC0r0e1alL0iB09rY8+nmw==", + "requires": { + "node-gyp-build": "~3.7.0" + } + }, "util": { "version": "0.11.1", "resolved": "https://registry.npmjs.org/util/-/util-0.11.1.tgz", @@ -17830,6 +18413,32 @@ } } }, + "webpack-hot-middleware": { + "version": "2.25.0", + "resolved": "https://registry.npmjs.org/webpack-hot-middleware/-/webpack-hot-middleware-2.25.0.tgz", + "integrity": "sha512-xs5dPOrGPCzuRXNi8F6rwhawWvQQkeli5Ro48PRuQh8pYPCPmNnltP9itiUPT4xI8oW+y0m59lyyeQk54s5VgA==", + "requires": { + "ansi-html": "0.0.7", + "html-entities": "^1.2.0", + "querystring": "^0.2.0", + "strip-ansi": "^3.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "requires": { + "ansi-regex": "^2.0.0" + } + } + } + }, "webpack-log": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/webpack-log/-/webpack-log-2.0.0.tgz", @@ -17882,6 +18491,236 @@ } } }, + "webpack-plugin-ramdisk": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/webpack-plugin-ramdisk/-/webpack-plugin-ramdisk-0.1.7.tgz", + "integrity": "sha512-8Zvacs7ic/mRp+6m2s24+5xdGfog+bG3bKr/Ip3ho07z50A+JpEv3dCApqcp4qgNA4/BUSAJG6ncl1kjw5kD/w==", + "requires": { + "chalk": "^4.1.0", + "execa": "^4.0.3", + "superstruct": "^0.10.12" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "requires": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + } + }, + "execa": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-4.1.0.tgz", + "integrity": "sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA==", + "requires": { + "cross-spawn": "^7.0.0", + "get-stream": "^5.0.0", + "human-signals": "^1.1.1", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.0", + "onetime": "^5.1.0", + "signal-exit": "^3.0.2", + "strip-final-newline": "^2.0.0" + } + }, + "get-stream": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "requires": { + "pump": "^3.0.0" + } + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "is-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.0.tgz", + "integrity": "sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==" + }, + "npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "requires": { + "path-key": "^3.0.0" + } + }, + "path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==" + }, + "shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "requires": { + "shebang-regex": "^3.0.0" + } + }, + "shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==" + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "requires": { + "has-flag": "^4.0.0" + } + }, + "which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "requires": { + "isexe": "^2.0.0" + } + } + } + }, + "webpack-plugin-serve": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/webpack-plugin-serve/-/webpack-plugin-serve-1.2.0.tgz", + "integrity": "sha512-wBAQi2ZwDZMUEpbQUQcz//HaBPX6QJp9v6pCyB9efmS1RlhzUwVwRUwQgJ79J/MyElXoos1ToQeLAK5aIStOYQ==", + "requires": { + "chalk": "^4.0.0", + "connect-history-api-fallback": "^1.5.0", + "escalade": "^3.1.0", + "globby": "^11.0.0", + "http-proxy-middleware": "^1.0.3", + "is-path-cwd": "^2.2.0", + "is-promise": "^4.0.0", + "koa": "^2.5.3", + "koa-compress": "^4.0.1", + "koa-connect": "^2.0.1", + "koa-route": "^3.2.0", + "koa-static": "^5.0.0", + "loglevelnext": "^4.0.1", + "nanoid": "^3.1.3", + "onetime": "^5.1.0", + "open": "^7.0.3", + "p-defer": "^3.0.0", + "rimraf": "^3.0.2", + "strip-ansi": "^6.0.0", + "superstruct": "^0.10.12", + "webpack-plugin-ramdisk": "^0.1.2", + "ws": "^7.1.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "http-proxy-middleware": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-1.0.6.tgz", + "integrity": "sha512-NyL6ZB6cVni7pl+/IT2W0ni5ME00xR0sN27AQZZrpKn1b+qRh+mLbBxIq9Cq1oGfmTc7BUq4HB77mxwCaxAYNg==", + "requires": { + "@types/http-proxy": "^1.17.4", + "http-proxy": "^1.18.1", + "is-glob": "^4.0.1", + "lodash": "^4.17.20", + "micromatch": "^4.0.2" + } + }, + "rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "requires": { + "glob": "^7.1.3" + } + }, + "strip-ansi": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "requires": { + "ansi-regex": "^5.0.0" + } + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, "webpack-sources": { "version": "1.4.3", "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.4.3.tgz", @@ -18394,6 +19233,16 @@ "camelcase": "^5.0.0", "decamelize": "^1.2.0" } + }, + "ylru": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ylru/-/ylru-1.2.1.tgz", + "integrity": "sha512-faQrqNMzcPCHGVC2aaOINk13K+aaBDUPjGWl0teOXywElLjyVAB6Oe2jj62jHYtwsU49jXhScYbvPENK+6zAvQ==" + }, + "yn": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", + "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==" } } } diff --git a/package.json b/package.json index f213215..219d249 100644 --- a/package.json +++ b/package.json @@ -5,9 +5,11 @@ "dependencies": { "@fortawesome/fontawesome-svg-core": "^1.2.32", "@fortawesome/free-solid-svg-icons": "^5.15.1", - "@fortawesome/react-fontawesome": "^0.1.11", + "@fortawesome/react-fontawesome": "^0.1.12", "babel-runtime": "^6.26.0", "bootstrap": "^4.5.3", + "bufferutil": "^4.0.1", + "canvas": "^2.6.1", "classnames": "^2.2.6", "d3-array": "^2.8.0", "d3-axis": "^2.0.0", @@ -17,6 +19,7 @@ "d3-shape": "^2.0.0", "d3-time-format": "^3.0.0", "es6-promise": "^4.2.8", + "fibers": "^5.0.0", "file-saver": "^2.0.2", "flux": "^3.1.3", "gaugeJS": "^1.3.7", @@ -30,12 +33,12 @@ "node-sass": "^4.14.1", "popper.js": "^1.16.1", "prop-types": "^15.7.2", - "rc-slider": "^9.5.4", + "rc-slider": "^9.6.0", "react": "^16.14.0", "react-bootstrap": "^1.4.0", "react-bootstrap-time-picker": "^2.0.1", "react-collapse": "^5.0.1", - "react-color": "^2.18.1", + "react-color": "^2.19.3", "react-contexify": "^4.1.1", "react-d3": "^0.4.0", "react-dnd": "^10.0.2", @@ -50,10 +53,15 @@ "react-router-dom": "^5.2.0", "react-scripts": "^4.0.0", "react-svg-pan-zoom": "^3.8.1", - "sass": "^1.27.0", + "sass": "^1.28.0", "superagent": "^6.1.0", - "typescript": "^4.0.3", - "validator": "^13.1.17" + "ts-node": "^9.0.0", + "type-fest": "^0.13.1", + "typescript": "^4.0.5", + "utf-8-validate": "^5.0.2", + "validator": "^13.1.17", + "webpack-hot-middleware": "^2.25.0", + "webpack-plugin-serve": "^1.2.0" }, "devDependencies": { "chai": "^4.2.0" diff --git a/src/common/api/websocket-api.js b/src/common/api/websocket-api.js index 71c813d..89a1ee6 100644 --- a/src/common/api/websocket-api.js +++ b/src/common/api/websocket-api.js @@ -16,19 +16,19 @@ ******************************************************************************/ class WebsocketAPI { - constructor(host, callbacks) { - this.host = host; + constructor(websocketurl, callbacks) { + this.websocketurl = websocketurl; this.callbacks = callbacks; this.wasConnected = false; this.isClosing = false; - this.connect(host, callbacks); + this.connect(websocketurl, callbacks); } - connect(host, callbacks) { + connect(websocketurl, callbacks) { // create web socket client - this.socket = new WebSocket(WebsocketAPI.getURL(host), 'live'); + this.socket = new WebSocket(WebsocketAPI.getURL(websocketurl), 'live'); this.socket.binaryType = 'arraybuffer'; this.socket.onclose = this.onClose; this.socket.onopen = this.onOpen; @@ -40,12 +40,12 @@ class WebsocketAPI { } reconnect() { - //console.log("Reconnecting: " + this.host); - this.connect(this.host, this.callbacks); + //console.log("Reconnecting: " + this.websocketurl); + this.connect(this.websocketurl, this.callbacks); } get url() { - return WebsocketAPI.getURL(this.host); + return WebsocketAPI.getURL(this.websocketurl); } send(data) { @@ -58,7 +58,7 @@ class WebsocketAPI { } onError = e => { - console.error('Error on WebSocket connection to: ' + this.host + ':', e); + console.error('Error on WebSocket connection to: ' + this.websocketurl + ':', e); if ('onError' in this.callbacks) this.callbacks.onError(e); @@ -78,16 +78,16 @@ class WebsocketAPI { } else { if (this.wasConnected) { - console.log("Connection to " + this.host + " dropped. Attempt reconnect in 1 sec"); + console.log("Connection to " + this.websocketurl + " dropped. Attempt reconnect in 1 sec"); window.setTimeout(() => { this.reconnect(); }, 1000); } } } - static getURL(host) { + static getURL(websocketurl) { // create an anchor element (note: no need to append this element to the document) var link = document.createElement('a'); - link.href = host; + link.href = websocketurl; if (link.protocol === 'https:') link.protocol = 'wss:'; diff --git a/src/ic/edit-ic.js b/src/ic/edit-ic.js index 1bc6f0d..e9adf0a 100644 --- a/src/ic/edit-ic.js +++ b/src/ic/edit-ic.js @@ -30,8 +30,8 @@ class EditICDialog extends React.Component { this.state = { name: '', - host: '', - apihost: '', + websocketurl: '', + apiurl: '', type: '', category: '', managedexternally: false, @@ -48,12 +48,12 @@ class EditICDialog extends React.Component { data.name = this.state.name; } - if (this.state.host != null && this.state.host !== "" && this.state.host !== "http://" && this.state.host !== this.props.ic.host) { - data.host = this.state.host; + if (this.state.websocketurl != null && this.state.websocketurl !== "" && this.state.websocketurl !== "http://" && this.state.websocketurl !== this.props.ic.websocketurl) { + data.websocketurl = this.state.websocketurl; } - if (this.state.apihost != null && this.state.apihost !== "" && this.state.apihost !== "http://" && this.state.apihost !== this.props.ic.apihost) { - data.apihost = this.state.apihost; + if (this.state.apiurl != null && this.state.apiurl !== "" && this.state.apiurl !== "http://" && this.state.apiurl !== this.props.ic.apiurl) { + data.apiurl = this.state.apiurl; } if (this.state.type != null && this.state.type !== "" && this.state.type !== this.props.ic.type) { @@ -95,8 +95,8 @@ class EditICDialog extends React.Component { resetState() { this.setState({ name: this.props.ic.name, - host: this.props.ic.host, - apihost: this.props.ic.apihost, + websocketurl: this.props.ic.websocketurl, + apiurl: this.props.ic.apiurl, type: this.props.ic.type, category: this.props.ic.category, managedexternally: false, @@ -149,14 +149,14 @@ class EditICDialog extends React.Component { this.handleChange(e)} /> - - Host - this.handleChange(e)} /> + + Websocket URL + this.handleChange(e)} /> - - API Host - this.handleChange(e)} /> + + API URL + this.handleChange(e)} /> diff --git a/src/ic/ic-data-data-manager.js b/src/ic/ic-data-data-manager.js index 2e09a7c..0dcc853 100644 --- a/src/ic/ic-data-data-manager.js +++ b/src/ic/ic-data-data-manager.js @@ -26,19 +26,19 @@ class IcDataDataManager { this._sockets = {}; } - open(host, identifier) { + open(websocketurl, identifier) { // pass signals to onOpen callback if (this._sockets[identifier] != null) return; // already open? - this._sockets[identifier] = new WebsocketAPI(host, { onOpen: (event) => this.onOpen(event, identifier, true), onClose: (event) => this.onClose(event, identifier), onMessage: (event) => this.onMessage(event, identifier) }); + this._sockets[identifier] = new WebsocketAPI(websocketurl, { onOpen: (event) => this.onOpen(event, identifier, true), onClose: (event) => this.onClose(event, identifier), onMessage: (event) => this.onMessage(event, identifier) }); } - update(host, identifier) { + update(websocketurl, identifier) { if (this._sockets[identifier] != null) { - if (this._sockets[identifier].host !== host) { + if (this._sockets[identifier].websocketurl !== websocketurl) { this._sockets[identifier].close(); - this._sockets[identifier] = new WebsocketAPI(host, { onOpen: (event) => this.onOpen(event, identifier, false), onClose: (event) => this.onClose(event, identifier), onMessage: (event) => this.onMessage(event, identifier), onError: (error) => this.onError(error, identifier) }); + this._sockets[identifier] = new WebsocketAPI(websocketurl, { onOpen: (event) => this.onOpen(event, identifier, false), onClose: (event) => this.onClose(event, identifier), onMessage: (event) => this.onMessage(event, identifier), onError: (error) => this.onError(error, identifier) }); } } } diff --git a/src/ic/ic-store.js b/src/ic/ic-store.js index d653adf..d73e555 100644 --- a/src/ic/ic-store.js +++ b/src/ic/ic-store.js @@ -35,8 +35,8 @@ class InfrastructureComponentStore extends ArrayStore { // connect to each infrastructure component const ic = action.data; - if (ic.host != null && ic.host !== '') { - ICDataDataManager.update(ic.host, ic.id); + if (ic.websocketurl != null && ic.websocketurl !== '') { + ICDataDataManager.update(ic.websocketurl, ic.id); } return super.reduce(state, action); @@ -44,17 +44,17 @@ class InfrastructureComponentStore extends ArrayStore { // open websocket for each IC contained in array action.data // action.data contains only those IC used by the scenario for (let ic of action.data) { - if (ic.host != null && ic.host !== '') { - ICDataDataManager.open(ic.host, ic.id); + if (ic.websocketurl != null && ic.websocketurl !== '') { + ICDataDataManager.open(ic.websocketurl, ic.id); } else { // TODO add to pool of notifications - const IC_WEBSOCKET_HOST_ERROR = { + const IC_WEBSOCKET_URL_ERROR = { title: 'Websocket connection warning', - message: "Websocket host parameter not available for IC " + ic.name + "(" + ic.uuid + "), connection not possible", + message: "Websocket URL parameter not available for IC " + ic.name + "(" + ic.uuid + "), connection not possible", level: 'warning' }; - NotificationsDataManager.addNotification(IC_WEBSOCKET_HOST_ERROR); + NotificationsDataManager.addNotification(IC_WEBSOCKET_URL_ERROR); } } return super.reduce(state, action); diff --git a/src/ic/ics.js b/src/ic/ics.js index 4696ef6..5e0017a 100644 --- a/src/ic/ics.js +++ b/src/ic/ics.js @@ -334,10 +334,10 @@ class InfrastructureComponents extends Component { this.modifyManagedExternallyColumn(managedexternally)} width='105' /> this.modifyUptimeColumn(uptime)}/> - + {/* */} - - + + this.stateUpdateModifier(stateUpdateAt)} /> {this.state.currentUser.role === "Admin" ? this.handleChange(e)} /> - - Host - this.handleChange(e)} /> + + Websocket URL + this.handleChange(e)} /> diff --git a/src/ic/new-ic.js b/src/ic/new-ic.js index 466ead5..8e35a10 100644 --- a/src/ic/new-ic.js +++ b/src/ic/new-ic.js @@ -28,7 +28,7 @@ class NewICDialog extends React.Component { this.state = { name: '', - host: '', + websocketurl: '', uuid: '', type: '', category: '', @@ -47,8 +47,8 @@ class NewICDialog extends React.Component { managedexternally: this.state.managedexternally, }; - if (this.state.host != null && this.state.host !== "" && this.state.host !== 'http://') { - data.host = this.state.host; + if (this.state.websocketurl != null && this.state.websocketurl !== "" && this.state.websocketurl !== 'http://') { + data.websocketurl = this.state.websocketurl; } this.props.onClose(data); @@ -70,14 +70,14 @@ class NewICDialog extends React.Component { } resetState() { - this.setState({ name: '', host: 'http://', uuid: this.uuidv4(), type: '', category: '', managedexternally: false}); + this.setState({ name: '', websocketurl: 'http://', uuid: this.uuidv4(), type: '', category: '', managedexternally: false}); } validateForm(target) { // check all controls let name = true; let uuid = true; - let host = true; + let websocketurl = true; let type = true; let category = true; @@ -97,12 +97,12 @@ class NewICDialog extends React.Component { category = false; } - this.valid = name && uuid && host && type && category; + this.valid = name && uuid && websocketurl && type && category; // return state to control if (target === 'name') return name ? "success" : "error"; if (target === 'uuid') return uuid ? "success" : "error"; - if (target === 'host') return host ? "success" : "error"; + if (target === 'websocketurl') return websocketurl ? "success" : "error"; if (target === 'type') return type ? "success" : "error"; if (target === 'category') return category ? "success" : "error"; } @@ -151,9 +151,14 @@ class NewICDialog extends React.Component { this.handleChange(e)} /> - - Host - this.handleChange(e)} /> + + Websocket URL + this.handleChange(e)} /> + + + + API URL + this.handleChange(e)} /> diff --git a/src/scenario/scenario.js b/src/scenario/scenario.js index 858a7a6..43e33e0 100644 --- a/src/scenario/scenario.js +++ b/src/scenario/scenario.js @@ -463,7 +463,7 @@ class Scenario extends React.Component { signalsAutoConf(index){ let componentConfig = this.state.configs[index]; - // determine host of infrastructure component + // determine apiurl of infrastructure component let ic = this.state.ics.find(ic => ic.id === componentConfig.icID) if(!ic.type.includes("VILLASnode") && !ic.type.includes("villasnode") && !ic.type.includes("VILLASNODE")){ let message = "Cannot autoconfigure signals for IC type " + ic.type + " of category " + ic.category + ". This is only possible for gateway ICs of type 'VILLASnode'." @@ -478,7 +478,7 @@ class Scenario extends React.Component { return; } - let splitHost = ic.host.split("/") + let splitWebsocketURL = ic.websocketurl.split("/") let request = {}; request["id"] = this.uuidv4(); request["action"] = "nodes" @@ -486,8 +486,8 @@ class Scenario extends React.Component { AppDispatcher.dispatch({ type: 'signals/start-autoconfig', data: request, - url: ic.apihost, - socketname: splitHost[splitHost.length -1], + url: ic.apiurl, + socketname: splitWebsocketURL[splitWebsocketURL.length -1], token: this.state.sessionToken, configID: componentConfig.id }); @@ -542,12 +542,12 @@ class Scenario extends React.Component { console.warn("There is more than one CIM file selected in this component configuration. I will open them all in a separate tab.") } - let base_host = 'aaa.bbb.ccc.ddd/api/v2/files/' + let baseURL = 'aaa.bbb.ccc.ddd/api/v2/files/' for (let file of files) { // endpoint param serves for download and upload of CIM file, token is required for authentication let params = { token: this.state.sessionToken, - endpoint: base_host + String(file.id), + endpoint: baseURL + String(file.id), } // TODO start Pintura for editing CIM/ XML file from here diff --git a/src/signal/signals-data-manager.js b/src/signal/signals-data-manager.js index c8f7127..83d9a9e 100644 --- a/src/signal/signals-data-manager.js +++ b/src/signal/signals-data-manager.js @@ -39,7 +39,7 @@ class SignalsDataManager extends RestDataManager{ startAutoConfig(data, url, socketname, token, configID){ // This function queries the VILLASnode API to obtain the configuration of the VILLASnode located at url - // Endpoint: http[s]://server:port/api/v1 (to be generated based on IC host, port 4000) + // Endpoint: http[s]://server:port/api/v1 (to be generated based on IC API URL, port 4000) // data contains the request data: { action, id, (request)} // See documentation of VILLASnode API: https://villas.fein-aachen.org/doc/node-dev-api-node.html From f110a9c5e7806c29e41b7ac411e26ba35764ad58 Mon Sep 17 00:00:00 2001 From: Sonja Happ Date: Thu, 12 Nov 2020 12:05:27 +0100 Subject: [PATCH 378/391] Improve edit and add IC dialogs #266 --- src/ic/edit-ic.js | 71 ++++++++++++++++++++++++++++------------------- src/ic/new-ic.js | 22 +++++++-------- 2 files changed, 54 insertions(+), 39 deletions(-) diff --git a/src/ic/edit-ic.js b/src/ic/edit-ic.js index e9adf0a..49ffd79 100644 --- a/src/ic/edit-ic.js +++ b/src/ic/edit-ic.js @@ -32,10 +32,12 @@ class EditICDialog extends React.Component { name: '', websocketurl: '', apiurl: '', + location: '', + description: '', type: '', category: '', managedexternally: false, - properties: {}, + startParameterScheme: {}, }; } @@ -56,6 +58,14 @@ class EditICDialog extends React.Component { data.apiurl = this.state.apiurl; } + if (this.state.location != null && this.state.location !== this.props.ic.location) { + data.location = this.state.location; + } + + if (this.state.description != null && this.state.description !== this.props.ic.description) { + data.description = this.state.description; + } + if (this.state.type != null && this.state.type !== "" && this.state.type !== this.props.ic.type) { data.type = this.state.type; } @@ -63,8 +73,8 @@ class EditICDialog extends React.Component { if (this.state.category != null && this.state.category !== "" && this.state.category !== this.props.ic.category) { data.category = this.state.category; } - if (this.state.properties !== {}) { - data.properties = this.state.properties + if (this.state.startParameterScheme !== {}) { + data.startParameterScheme = this.state.startParameterScheme } data.managedexternally = this.state.managedexternally; @@ -88,8 +98,8 @@ class EditICDialog extends React.Component { } } - handlePropertiesChange(data) { - this.setState({ properties: data }); + handleStartParameterSchemeChange(data) { + this.setState({ startParameterScheme: data }); } resetState() { @@ -98,9 +108,11 @@ class EditICDialog extends React.Component { websocketurl: this.props.ic.websocketurl, apiurl: this.props.ic.apiurl, type: this.props.ic.type, + location: this.props.ic.location, + description: this.props.ic.description, category: this.props.ic.category, managedexternally: false, - properties: _.merge({}, _.get(this.props.ic, 'rawProperties'), _.get(this.props.ic, 'properties')) + startParameterScheme: this.props.ic.startParameterScheme, }); } @@ -114,7 +126,7 @@ class EditICDialog extends React.Component { typeOptions = ["Kubernetes","VILLAS-controller"]; break; case "Gateway": - typeOptions = ["VILLAS-node","VILLAS-relay"]; + typeOptions = ["VILLASnode","VILLASrelay"]; break; case "Service": typeOptions = ["EMS","Custom"]; @@ -137,28 +149,11 @@ class EditICDialog extends React.Component { >
    UUID: {this.props.ic.uuid} - - this.handleChange(e)}> - - - - Externally managed ICs cannot be edited by users - Name this.handleChange(e)} /> - - Websocket URL - this.handleChange(e)} /> - - - - API URL - this.handleChange(e)} /> - - Category this.handleChange(e)}> @@ -178,12 +173,32 @@ class EditICDialog extends React.Component { ))} - - Properties + + Websocket URL + this.handleChange(e)} /> + + + + API URL + this.handleChange(e)} /> + + + + Location + this.handleChange(e)} /> + + + + Description + this.handleChange(e)} /> + + + + Start parameter scheme of IC this.handlePropertiesChange(data)} + onChange={(data) => this.handleStartParameterSchemeChange(data)} /> diff --git a/src/ic/new-ic.js b/src/ic/new-ic.js index 8e35a10..b5848bd 100644 --- a/src/ic/new-ic.js +++ b/src/ic/new-ic.js @@ -85,7 +85,7 @@ class NewICDialog extends React.Component { name = false; } - if (this.state.uuid === '') { + if (!this.state.managedexternally && this.state.uuid === '') { uuid = false; } @@ -151,16 +151,6 @@ class NewICDialog extends React.Component { this.handleChange(e)} /> - - Websocket URL - this.handleChange(e)} /> - - - - API URL - this.handleChange(e)} /> - - Category of component this.handleChange(e)}> @@ -181,6 +171,16 @@ class NewICDialog extends React.Component { ))} + + Websocket URL + this.handleChange(e)} /> + + + + API URL + this.handleChange(e)} /> + + UUID this.handleChange(e)} /> From a94722677857f45ddec2e543f8616e5968f2098f Mon Sep 17 00:00:00 2001 From: Sonja Happ Date: Thu, 12 Nov 2020 15:11:50 +0100 Subject: [PATCH 379/391] Adapt naming of type and category to VILLAScontroller protocol; make signal auto config usable #224 --- src/ic/edit-ic.js | 32 +++++++++++++++--------------- src/ic/new-ic.js | 30 ++++++++++++++-------------- src/scenario/scenario.js | 8 ++------ src/signal/signal-store.js | 3 +-- src/signal/signals-data-manager.js | 25 +++++++++++++---------- 5 files changed, 48 insertions(+), 50 deletions(-) diff --git a/src/ic/edit-ic.js b/src/ic/edit-ic.js index 49ffd79..f2bd679 100644 --- a/src/ic/edit-ic.js +++ b/src/ic/edit-ic.js @@ -119,20 +119,20 @@ class EditICDialog extends React.Component { render() { let typeOptions = []; switch(this.state.category){ - case "Simulator": - typeOptions = ["Dummy","Generic","DPsim","RTLAB","RSCAD"]; - break; - case "Controller": - typeOptions = ["Kubernetes","VILLAS-controller"]; + case "simulator": + typeOptions = ["dummy","generic","dpsim","rtlab","rscad"]; break; - case "Gateway": - typeOptions = ["VILLASnode","VILLASrelay"]; + case "controller": + typeOptions = ["kubernetes","villas-controller"]; break; - case "Service": - typeOptions = ["EMS","Custom"]; + case "gateway": + typeOptions = ["villas-node","villas-relay"]; break; - case "Equipment": - typeOptions = ["Chroma-emulator","Chroma-loads","SMA-sunnyboy","FLEPS","Sonnenbatterie"]; + case "service": + typeOptions = ["ems","custom"]; + break; + case "equipment": + typeOptions = ["chroma-emulator","chroma-loads","sma-sunnyboy","fleps","sonnenbatterie"]; break; default: typeOptions =[]; @@ -157,11 +157,11 @@ class EditICDialog extends React.Component { Category this.handleChange(e)}> - - - - - + + + + + diff --git a/src/ic/new-ic.js b/src/ic/new-ic.js index b5848bd..45ccc91 100644 --- a/src/ic/new-ic.js +++ b/src/ic/new-ic.js @@ -118,20 +118,20 @@ class NewICDialog extends React.Component { render() { let typeOptions = []; switch(this.state.category){ - case "Simulator": - typeOptions = ["Dummy","Generic","DPsim","RTLAB","RSCAD"]; + case "simulator": + typeOptions = ["dummy","generic","dpsim","rtlab","rscad"]; break; - case "Controller": - typeOptions = ["Kubernetes","VILLAS-controller"]; + case "controller": + typeOptions = ["kubernetes","villas-controller"]; break; - case "Gateway": - typeOptions = ["VILLAS-node","VILLAS-relay"]; + case "gateway": + typeOptions = ["villas-node","villas-relay"]; break; - case "Service": - typeOptions = ["EMS","Custom"]; + case "service": + typeOptions = ["ems","custom"]; break; - case "Equipment": - typeOptions = ["Chroma-emulator","Chroma-loads","SMA-sunnyboy","FLEPS","Sonnenbatterie"]; + case "equipment": + typeOptions = ["chroma-emulator","chroma-loads","sma-sunnyboy","fleps","sonnenbatterie"]; break; default: typeOptions =[]; @@ -155,11 +155,11 @@ class NewICDialog extends React.Component { Category of component this.handleChange(e)}> - - - - - + + + + + diff --git a/src/scenario/scenario.js b/src/scenario/scenario.js index 43e33e0..33f1edd 100644 --- a/src/scenario/scenario.js +++ b/src/scenario/scenario.js @@ -465,7 +465,7 @@ class Scenario extends React.Component { let componentConfig = this.state.configs[index]; // determine apiurl of infrastructure component let ic = this.state.ics.find(ic => ic.id === componentConfig.icID) - if(!ic.type.includes("VILLASnode") && !ic.type.includes("villasnode") && !ic.type.includes("VILLASNODE")){ + if(!ic.type.includes("villas-node")){ let message = "Cannot autoconfigure signals for IC type " + ic.type + " of category " + ic.category + ". This is only possible for gateway ICs of type 'VILLASnode'." console.warn(message); @@ -479,14 +479,10 @@ class Scenario extends React.Component { } let splitWebsocketURL = ic.websocketurl.split("/") - let request = {}; - request["id"] = this.uuidv4(); - request["action"] = "nodes" AppDispatcher.dispatch({ type: 'signals/start-autoconfig', - data: request, - url: ic.apiurl, + url: ic.apiurl+"/nodes", socketname: splitWebsocketURL[splitWebsocketURL.length -1], token: this.state.sessionToken, configID: componentConfig.id diff --git a/src/signal/signal-store.js b/src/signal/signal-store.js index ff4d228..82ce6bf 100644 --- a/src/signal/signal-store.js +++ b/src/signal/signal-store.js @@ -34,12 +34,11 @@ class SignalStore extends ArrayStore{ return super.reduce(state, action); case 'signals/start-autoconfig': - this.dataManager.startAutoConfig(action.data, action.url, action.socketname, action.token, action.configID) + this.dataManager.startAutoConfig(action.url, action.socketname, action.token, action.configID) return super.reduce(state, action); case 'signals/autoconfig-loaded': console.log("AutoConfig Loaded: ", action.data) - // TODO save signal config contained in action.data this.dataManager.saveSignals(action.data, action.token, action.configID, action.socketname); return super.reduce(state, action); diff --git a/src/signal/signals-data-manager.js b/src/signal/signals-data-manager.js index 83d9a9e..9d61584 100644 --- a/src/signal/signals-data-manager.js +++ b/src/signal/signals-data-manager.js @@ -37,13 +37,13 @@ class SignalsDataManager extends RestDataManager{ } - startAutoConfig(data, url, socketname, token, configID){ + startAutoConfig(url, socketname, token, configID){ // This function queries the VILLASnode API to obtain the configuration of the VILLASnode located at url // Endpoint: http[s]://server:port/api/v1 (to be generated based on IC API URL, port 4000) // data contains the request data: { action, id, (request)} // See documentation of VILLASnode API: https://villas.fein-aachen.org/doc/node-dev-api-node.html - RestAPI.post(url, data).then(response => { + RestAPI.get(url, null).then(response => { AppDispatcher.dispatch({ type: 'signals/autoconfig-loaded', data: response, @@ -59,13 +59,12 @@ class SignalsDataManager extends RestDataManager{ }) } - saveSignals(data, token, configID, socketname){ - // data.response contains the response from the VILLASnode API, an array of node configurations + saveSignals(nodes, token, configID, socketname){ - if(!data.hasOwnProperty("response")){ + if(nodes.length === 0){ const SIGNAL_AUTOCONF_ERROR_NOTIFICATION = { - title: 'Failed to load signal config ', - message: 'VILLASnode returned no response field.', + title: 'Failed to load nodes ', + message: 'VILLASnode returned empty response', level: 'error' }; NotificationsDataManager.addNotification(SIGNAL_AUTOCONF_ERROR_NOTIFICATION); @@ -74,7 +73,8 @@ class SignalsDataManager extends RestDataManager{ let configured = false; let error = false; - for(let nodeConfig of data.response){ + for(let nodeConfig of nodes){ + console.log("parsing node config: ", nodeConfig) if(!nodeConfig.hasOwnProperty("name")){ console.warn("Could not parse the following node config because it lacks a name parameter:", nodeConfig); } else if(nodeConfig.name === socketname){ @@ -88,7 +88,6 @@ class SignalsDataManager extends RestDataManager{ continue; } // signals are not yet configured: - console.log("Adding signals of websocket: ", nodeConfig); let index_in = 1 let index_out = 1 @@ -104,9 +103,10 @@ class SignalsDataManager extends RestDataManager{ // add all in signals for(let inSig of nodeConfig.in.signals) { - console.log("adding input signal:", inSig); if (inSig.enabled) { + console.log("adding input signal:", inSig); + let newSignal = { configID: configID, direction: 'in', @@ -140,9 +140,9 @@ class SignalsDataManager extends RestDataManager{ // add all out signals for (let outSig of nodeConfig.out.signals) { - console.log("adding output signal:", outSig); if (outSig.enabled) { + console.log("adding output signal:", outSig); let newSignal = { configID: configID, direction: 'out', @@ -165,8 +165,11 @@ class SignalsDataManager extends RestDataManager{ console.log("Configured", index_in-1, "input signals and", index_out-1, "output signals"); configured=true; + } else { + console.log("ignoring node with name ",nodeConfig.name, " expecting ", socketname ) } + } if(!error) { From 7eca59bc7c7cec7eb295fe269341b2ea342ae11b Mon Sep 17 00:00:00 2001 From: irismarie Date: Fri, 13 Nov 2020 13:12:15 +0100 Subject: [PATCH 380/391] duplicate scenario, #263 --- src/common/table-column.js | 1 + src/common/table.js | 5 ++++ src/scenario/scenarios.js | 52 ++++++++++++++++++++++++++++---------- 3 files changed, 45 insertions(+), 13 deletions(-) diff --git a/src/common/table-column.js b/src/common/table-column.js index 53b99e5..df68140 100644 --- a/src/common/table-column.js +++ b/src/common/table-column.js @@ -25,6 +25,7 @@ class TableColumn extends Component { editButton: false, deleteButton: false, exportButton: false, + duplicateButton: false, link: '/', linkKey: '', dataIndex: false, diff --git a/src/common/table.js b/src/common/table.js index 87a52be..05680aa 100644 --- a/src/common/table.js +++ b/src/common/table.js @@ -123,6 +123,11 @@ class CustomTable extends Component { ); } + if (child.props.duplicateButton) { + cell.push( Duplicate } > + ); + } + return cell; } // addCell diff --git a/src/scenario/scenarios.js b/src/scenario/scenarios.js index f093d7a..d176d0f 100644 --- a/src/scenario/scenarios.js +++ b/src/scenario/scenarios.js @@ -52,6 +52,7 @@ class Scenarios extends Component { sessionToken: localStorage.getItem("token"), newModal: false, + duplicateModal: false, deleteModal: false, editModal: false, importModal: false, @@ -148,17 +149,8 @@ class Scenarios extends Component { } }; - exportScenario(index) { - // copy by value by converting to JSON and back - // otherwise, IDs of state objects will be deleted - let scenario = JSON.parse(JSON.stringify(this.state.scenarios[index])); - let configs = JSON.parse(JSON.stringify(this.state.configs.filter(config => config.scenarioID === scenario.id))); - let dashboards = JSON.parse(JSON.stringify(this.state.dashboards.filter(dashb => dashb.scenarioID === scenario.id))); - - // create JSON object and add component configs - delete scenario.id; - let jsonObj = scenario; - + getConfigs(scenarioID) { + let configs = JSON.parse(JSON.stringify(this.state.configs.filter(config => config.scenarioID === scenarioID))); configs.forEach((config) => { let signals = JSON.parse(JSON.stringify(SignalStore.getState().filter(s => s.configID === parseInt(config.id, 10)))); signals.forEach((signal) => { @@ -179,8 +171,12 @@ class Scenarios extends Component { delete config.inputLength; delete config.outputLength; }) - jsonObj["configs"] = configs; + return configs; + } + + getDashboards(scenarioID) { + let dashboards = JSON.parse(JSON.stringify(this.state.dashboards.filter(dashb => dashb.scenarioID === scenarioID))); // add Dashboards and Widgets to JSON object dashboards.forEach((dboard) => { let widgets = JSON.parse(JSON.stringify(WidgetStore.getState().filter(w => w.dashboardID === parseInt(dboard.id, 10)))); @@ -192,14 +188,42 @@ class Scenarios extends Component { delete dboard.scenarioID; delete dboard.id; }); - jsonObj["dashboards"] = dashboards; + return dashboards; + } + exportScenario(index) { + // copy by value by converting to JSON and back + // otherwise, IDs of state objects will be deleted + let scenario = JSON.parse(JSON.stringify(this.state.scenarios[index])); + let scenarioID = scenario.id; + delete scenario.id; + + let jsonObj = scenario; + jsonObj["configs"] = this.getConfigs(scenarioID); + jsonObj["dashboards"] = this.getDashboards(scenarioID); // create JSON string and show save dialog const blob = new Blob([JSON.stringify(jsonObj, null, 2)], { type: 'application/json' }); FileSaver.saveAs(blob, 'scenario - ' + scenario.name + '.json'); } + duplicateScenario(index) { + let scenario = JSON.parse(JSON.stringify(this.state.scenarios[index])); + scenario.name = scenario.name + '_copy'; + let jsonObj = scenario; + + jsonObj["configs"] = this.getConfigs(scenario.id); + jsonObj["dashboards"] = this.getDashboards(scenario.id); + + if(jsonObj) { + AppDispatcher.dispatch({ + type: 'scenarios/start-add', + data: jsonObj, + token: this.state.sessionToken, + }); + } + } + modifyRunningColumn(running){ if(running){ @@ -228,9 +252,11 @@ class Scenarios extends Component { editButton deleteButton exportButton + duplicateButton onEdit={index => this.setState({ editModal: true, modalScenario: this.state.scenarios[index] })} onDelete={index => this.setState({ deleteModal: true, modalScenario: this.state.scenarios[index] })} onExport={index => this.exportScenario(index)} + onDuplicate={index => this.duplicateScenario(index)} />
    From 62b78c5822d019e73a2bab05871a73926baa1d17 Mon Sep 17 00:00:00 2001 From: Laura Fuentes Grau Date: Fri, 13 Nov 2020 14:18:12 +0100 Subject: [PATCH 381/391] New Ic Dialog: add location and description fields #266 --- src/ic/new-ic.js | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/ic/new-ic.js b/src/ic/new-ic.js index 45ccc91..5e8a49a 100644 --- a/src/ic/new-ic.js +++ b/src/ic/new-ic.js @@ -181,6 +181,16 @@ class NewICDialog extends React.Component { this.handleChange(e)} />
    + + Location + this.handleChange(e)} /> + + + + Description + this.handleChange(e)} /> + + UUID this.handleChange(e)} /> From f096b8d3e0a05d1d6f28fe671d3b73dd26e67fa0 Mon Sep 17 00:00:00 2001 From: Laura Fuentes Grau Date: Fri, 13 Nov 2020 16:43:02 +0100 Subject: [PATCH 382/391] externally managed ICs don't appear immediately in IC list, add button activates as soon as all required fields are filled #266 --- src/common/array-store.js | 1 + src/ic/new-ic.js | 8 +++++--- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/src/common/array-store.js b/src/common/array-store.js index c2cdd27..1ab4b7f 100644 --- a/src/common/array-store.js +++ b/src/common/array-store.js @@ -98,6 +98,7 @@ class ArrayStore extends ReduceStore { return state; case this.type + '/added': + if(typeof action.data.managedexternally !== "undefined" && action.data.managedexternally === true ) return state; return this.updateElements(state, [action.data]); case this.type + '/add-error': diff --git a/src/ic/new-ic.js b/src/ic/new-ic.js index 5e8a49a..514055a 100644 --- a/src/ic/new-ic.js +++ b/src/ic/new-ic.js @@ -105,6 +105,8 @@ class NewICDialog extends React.Component { if (target === 'websocketurl') return websocketurl ? "success" : "error"; if (target === 'type') return type ? "success" : "error"; if (target === 'category') return category ? "success" : "error"; + + return this.valid; } uuidv4() { @@ -137,7 +139,7 @@ class NewICDialog extends React.Component { typeOptions =[]; } return ( - this.onClose(c)} onReset={() => this.resetState()} valid={this.valid}> + this.onClose(c)} onReset={() => this.resetState()} valid={this.validateForm()}>
    this.handleChange(e)}> @@ -151,7 +153,7 @@ class NewICDialog extends React.Component { this.handleChange(e)} /> - + Category of component this.handleChange(e)}> @@ -162,7 +164,7 @@ class NewICDialog extends React.Component { - + Type of component this.handleChange(e)}> From 9b602348ec7b2cdfb3c995a7d90eefb4d007e86a Mon Sep 17 00:00:00 2001 From: Laura Fuentes Grau Date: Fri, 13 Nov 2020 18:58:50 +0100 Subject: [PATCH 383/391] Cosmetic changes to new IC dialog / mark required fields #266 --- src/ic/new-ic.js | 24 ++++++++++++++---------- 1 file changed, 14 insertions(+), 10 deletions(-) diff --git a/src/ic/new-ic.js b/src/ic/new-ic.js index 514055a..134c62b 100644 --- a/src/ic/new-ic.js +++ b/src/ic/new-ic.js @@ -16,8 +16,7 @@ ******************************************************************************/ import React from 'react'; -import { FormGroup, FormControl, FormLabel, FormCheck } from 'react-bootstrap'; -import {Collapse} from 'react-collapse'; +import { FormGroup, FormControl, FormLabel, FormCheck, OverlayTrigger, Tooltip} from 'react-bootstrap'; import Dialog from '../common/dialogs/dialog'; class NewICDialog extends React.Component { @@ -142,19 +141,22 @@ class NewICDialog extends React.Component { this.onClose(c)} onReset={() => this.resetState()} valid={this.validateForm()}> - this.handleChange(e)}> - + An externally managed component will show up in the list only after a VILLAScontroller for the component type has created the component and cannot be edited by users} > + this.handleChange(e)}> + + - - the component will show up in the list only after a VILLAScontroller for the component type has created the component and cannot be edited by users - - Name + Required field } > + Name * + this.handleChange(e)} /> - Category of component + Required field } > + Category of component * + this.handleChange(e)}> @@ -165,7 +167,9 @@ class NewICDialog extends React.Component { - Type of component + Required field } > + Type of component * + this.handleChange(e)}> {typeOptions.map((name,index) => ( From c7281835d3ef9377d8bc5eeec387bb7867dd6b78 Mon Sep 17 00:00:00 2001 From: irismarie Date: Fri, 13 Nov 2020 19:07:02 +0100 Subject: [PATCH 384/391] duplicate configs, dashboards, (formatting), closes #263 --- src/scenario/scenario.js | 120 ++++++++++++++++++++++++++------------- 1 file changed, 79 insertions(+), 41 deletions(-) diff --git a/src/scenario/scenario.js b/src/scenario/scenario.js index cd8fe80..9a11cdf 100644 --- a/src/scenario/scenario.js +++ b/src/scenario/scenario.js @@ -48,7 +48,7 @@ import { Redirect } from 'react-router-dom'; class Scenario extends React.Component { static getStores() { - return [ ScenarioStore, ConfigStore, DashboardStore, ICStore, SignalStore, FileStore, WidgetStore]; + return [ScenarioStore, ConfigStore, DashboardStore, ICStore, SignalStore, FileStore, WidgetStore]; } static calculateState(prevState, props) { @@ -71,11 +71,11 @@ class Scenario extends React.Component { // obtain all component configurations of a scenario let configs = ConfigStore.getState().filter(config => config.scenarioID === parseInt(props.match.params.scenario, 10)); let editConfigModal = prevState.editConfigModal || false; - let modalConfigData = (prevState.modalConfigData !== {} && prevState.modalConfigData !== undefined )? prevState.modalConfigData : {}; + let modalConfigData = (prevState.modalConfigData !== {} && prevState.modalConfigData !== undefined) ? prevState.modalConfigData : {}; let modalConfigIndex = 0; - if((typeof prevState.configs !== "undefined") && (prevState.newConfig === true ) && (configs.length !== prevState.configs.length)){ - let index = configs.length -1; + if ((typeof prevState.configs !== "undefined") && (prevState.newConfig === true) && (configs.length !== prevState.configs.length)) { + let index = configs.length - 1; editConfigModal = true; modalConfigData = configs[index]; modalConfigIndex = index; @@ -146,7 +146,7 @@ class Scenario extends React.Component { ############################################## */ onUserInputChange(e) { - this.setState({userToAdd: e.target.value}); + this.setState({ userToAdd: e.target.value }); } addUser() { @@ -157,7 +157,7 @@ class Scenario extends React.Component { token: this.state.sessionToken }); - this.setState({userToAdd: ''}); + this.setState({ userToAdd: '' }); } closeDeleteUserModal() { @@ -201,7 +201,7 @@ class Scenario extends React.Component { token: this.state.sessionToken }); - this.setState({newConfig: true}); + this.setState({ newConfig: true }); } @@ -250,8 +250,7 @@ class Scenario extends React.Component { }); } - exportConfig(index) { - // filter properties + copyConfig(index) { let config = JSON.parse(JSON.stringify(this.state.configs[index])); let signals = JSON.parse(JSON.stringify(SignalStore.getState().filter(s => s.configID === parseInt(config.id, 10)))); @@ -273,11 +272,29 @@ class Scenario extends React.Component { delete config.inputLength; delete config.outputLength; + return config; + } + + exportConfig(index) { + let config = this.copyConfig(index); + // show save dialog const blob = new Blob([JSON.stringify(config, null, 2)], { type: 'application/json' }); FileSaver.saveAs(blob, 'config-' + config.name + '.json'); } + duplicateConfig(index) { + let newConfig = this.copyConfig(index); + newConfig["scenarioID"] = this.state.scenario.id; + newConfig.name = newConfig.name + '_copy'; + + AppDispatcher.dispatch({ + type: 'configs/start-add', + data: newConfig, + token: this.state.sessionToken + }); + } + onConfigChecked(index, event) { const selectedConfigs = Object.assign([], this.state.selectedConfigs); for (let key in selectedConfigs) { @@ -306,7 +323,7 @@ class Scenario extends React.Component { runAction(action, delay) { // delay in seconds - if(action.data.action === 'none'){ + if (action.data.action === 'none') { console.warn("No command selected. Nothing was sent."); return; } @@ -414,8 +431,7 @@ class Scenario extends React.Component { } } - exportDashboard(index) { - // filter properties + copyDashboard(index) { let dashboard = JSON.parse(JSON.stringify(this.state.dashboards[index])); let widgets = JSON.parse(JSON.stringify(WidgetStore.getState().filter(w => w.dashboardID === parseInt(dashboard.id, 10)))); @@ -427,35 +443,53 @@ class Scenario extends React.Component { delete dashboard.scenarioID; delete dashboard.id; + return dashboard; + } + + exportDashboard(index) { + let dashboard = this.copyDashboard(index); + // show save dialog const blob = new Blob([JSON.stringify(dashboard, null, 2)], { type: 'application/json' }); FileSaver.saveAs(blob, 'dashboard - ' + dashboard.name + '.json'); } + duplicateDashboard(index) { + let newDashboard = this.copyDashboard(index); + newDashboard.scenarioID = this.state.scenario.id; + newDashboard.name = newDashboard.name + '_copy'; + + AppDispatcher.dispatch({ + type: 'dashboards/start-add', + data: newDashboard, + token: this.state.sessionToken, + }); + } + /* ############################################## * Signal modification methods ############################################## */ - closeEditSignalsModal(direction){ - if( direction === "in") { - this.setState({editInputSignalsModal: false}); - } else if( direction === "out"){ - this.setState({editOutputSignalsModal: false}); + closeEditSignalsModal(direction) { + if (direction === "in") { + this.setState({ editInputSignalsModal: false }); + } else if (direction === "out") { + this.setState({ editOutputSignalsModal: false }); } } - onEditFiles(){ + onEditFiles() { let tempFiles = []; - this.state.files.forEach( file => { + this.state.files.forEach(file => { tempFiles.push({ id: file.id, name: file.name }); }) - this.setState({filesEditModal: true, filesEditSaveState: tempFiles}); + this.setState({ filesEditModal: true, filesEditSaveState: tempFiles }); } - closeEditFiles(){ + closeEditFiles() { this.setState({ filesEditModal: false }); // TODO do we need this if the dispatches happen in the dialog? } @@ -468,10 +502,10 @@ class Scenario extends React.Component { let fileList = ''; - for (let id of fileIDs){ + for (let id of fileIDs) { for (let file of this.state.files) { if (file.id === id && types.some(e => file.type.includes(e))) { - if (fileList === ''){ + if (fileList === '') { fileList = file.name } else { fileList = fileList + ';' + file.name; @@ -482,12 +516,12 @@ class Scenario extends React.Component { return fileList; } - startPintura(configIndex){ + startPintura(configIndex) { let config = this.state.configs[configIndex]; // get xml / CIM file let files = [] - for (let id of config.fileIDs){ + for (let id of config.fileIDs) { for (let file of this.state.files) { if (file.id === id && ['xml'].some(e => file.type.includes(e))) { files.push(file); @@ -495,7 +529,7 @@ class Scenario extends React.Component { } } - if(files.length > 1){ + if (files.length > 1) { // more than one CIM file... console.warn("There is more than one CIM file selected in this component configuration. I will open them all in a separate tab.") } @@ -534,31 +568,31 @@ class Scenario extends React.Component { const iconStyle = { color: '#007bff', height: '25px', - width : '25px' + width: '25px' } - if(this.state.scenario === undefined){ + if (this.state.scenario === undefined) { return

    Loading Scenario...

    ; } return
    - Add, edit or delete files of scenario } > - + Add, edit or delete files of scenario } > +

    {this.state.scenario.name}

    + sessionToken={this.state.sessionToken} + show={this.state.filesEditModal} + onClose={this.closeEditFiles.bind(this)} + signals={this.state.signals} + files={this.state.files} + scenarioID={this.state.scenario.id} + /> @@ -594,9 +628,11 @@ class Scenario extends React.Component { editButton deleteButton exportButton + duplicateButton onEdit={index => this.setState({ editConfigModal: true, modalConfigData: this.state.configs[index], modalConfigIndex: index })} onDelete={(index) => this.setState({ deleteConfigModal: true, modalConfigData: this.state.configs[index], modalConfigIndex: index })} onExport={index => this.exportConfig(index)} + onDuplicate={index => this.duplicateConfig(index)} /> @@ -660,9 +696,11 @@ class Scenario extends React.Component { editButton deleteButton exportButton + duplicateButton onEdit={index => this.setState({ dashboardEditModal: true, modalDashboardData: this.state.dashboards[index] })} onDelete={(index) => this.setState({ deleteDashboardModal: true, modalDashboardData: this.state.dashboards[index], modalDashboardIndex: index })} onExport={index => this.exportDashboard(index)} + onDuplicate={index => this.duplicateDashboard(index)} /> @@ -684,7 +722,7 @@ class Scenario extends React.Component {

    Users sharing this scenario

    - + -

    +

    this.closeDeleteUserModal(c)} /> From 162ea6a8f63ce786c41f9fc3add5c27dfc7da23d Mon Sep 17 00:00:00 2001 From: Laura Fuentes Grau Date: Sun, 15 Nov 2020 15:07:11 +0100 Subject: [PATCH 385/391] Edit image widget: show 'No files found' if no image files are available #267 --- src/widget/edit-widget/edit-widget-file-control.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/widget/edit-widget/edit-widget-file-control.js b/src/widget/edit-widget/edit-widget-file-control.js index 21868ce..7185f16 100644 --- a/src/widget/edit-widget/edit-widget-file-control.js +++ b/src/widget/edit-widget/edit-widget-file-control.js @@ -55,7 +55,7 @@ class EditFileWidgetControl extends React.Component { ))) } else { - fileOptions = + fileOptions = } return
    From 295c4ada163094fcb6c31e4959ffab7e6e81774d Mon Sep 17 00:00:00 2001 From: Laura Fuentes Grau Date: Sun, 15 Nov 2020 15:58:42 +0100 Subject: [PATCH 386/391] Control/Info dialog only available for ICs of type 'villas-node' or 'villas-relay' #265 --- src/ic/ics.js | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/src/ic/ics.js b/src/ic/ics.js index 5e0017a..5d21299 100644 --- a/src/ic/ics.js +++ b/src/ic/ics.js @@ -316,6 +316,15 @@ class InfrastructureComponents extends Component { } } + modifyNameColumn(name){ + let ic = this.state.ics.find(ic => ic.name === name); + let index = this.state.ics.indexOf(ic); + if(ic.type === "villas-node" || ic.type === "villas-relay"){ + return } + else{ + return {name} + } + } render() { const buttonStyle = { @@ -328,7 +337,7 @@ class InfrastructureComponents extends Component {
    this.onICChecked(index, event)} width='30' /> - this.setState({ icModal: true, modalIC: this.state.ics[index], modalIndex: index })}/> + this.modifyNameColumn(name)}/> this.stateLabelStyle(state, component)} /> From 6d43f8fae77b3d737a38b5f7358621788ef3cbc2 Mon Sep 17 00:00:00 2001 From: Laura Fuentes Grau Date: Sun, 15 Nov 2020 16:09:14 +0100 Subject: [PATCH 387/391] Delete IC dialog now displays IC name --- src/ic/ics.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ic/ics.js b/src/ic/ics.js index 49442d8..7bbb08d 100644 --- a/src/ic/ics.js +++ b/src/ic/ics.js @@ -359,7 +359,7 @@ class InfrastructureComponents extends Component { this.closeEditModal(data)} ic={this.state.modalIC} /> this.closeImportModal(data)} /> - this.closeDeleteModal(e)} /> + this.closeDeleteModal(e)} /> ); } From 86b1b2d5a5ecd0be7fb58781e2a08c69a646096a Mon Sep 17 00:00:00 2001 From: Sonja Happ Date: Mon, 16 Nov 2020 15:01:24 +0100 Subject: [PATCH 388/391] continue merge --- REACT.md | 12 +- doc/Production.md | 2 +- package-lock.json | 1005 ++++++++++++++++++++++++--- package.json | 20 +- src/common/api/websocket-api.js | 24 +- src/common/array-store.js | 1 + src/common/dialogs/delete-dialog.js | 6 +- src/common/table.js | 5 +- src/ic/edit-ic.js | 125 +++- src/ic/ic-data-data-manager.js | 10 +- src/ic/ic-store.js | 14 +- src/ic/import-ic.js | 16 +- src/ic/new-ic.js | 111 ++- src/scenario/scenario.js | 47 +- src/signal/signal-store.js | 28 +- src/signal/signals-data-manager.js | 147 ++++ 16 files changed, 1395 insertions(+), 178 deletions(-) diff --git a/REACT.md b/REACT.md index e290b93..430d5fa 100644 --- a/REACT.md +++ b/REACT.md @@ -538,7 +538,7 @@ Inside `index.html`, you can use it like this: Only files inside the `public` folder will be accessible by `%PUBLIC_URL%` prefix. If you need to use a file from `src` or `node_modules`, you’ll have to copy it there to explicitly specify your intention to make this file a part of the build. -When you run `npm run build`, Create React App will substitute `%PUBLIC_URL%` with a correct absolute path so your project works even if you use client-side routing or host it at a non-root URL. +When you run `npm run build`, Create React App will substitute `%PUBLIC_URL%` with a correct absolute path so your project works even if you use client-side routing or websocketurl it at a non-root URL. In JavaScript code, you can use `process.env.PUBLIC_URL` for similar purposes: @@ -789,7 +789,7 @@ You can find the companion GitHub repository [here](https://github.com/fullstack >Note: this feature is available with `react-scripts@0.2.3` and higher. -People often serve the front-end React app from the same host and port as their backend implementation.
    +People often serve the front-end React app from the same websocketurl and port as their backend implementation.
    For example, a production setup might look like this after the app is deployed: ``` @@ -798,7 +798,7 @@ For example, a production setup might look like this after the app is deployed: /api/todos - server handles any /api/* requests using the backend implementation ``` -Such setup is **not** required. However, if you **do** have a setup like this, it is convenient to write requests like `fetch('/api/todos')` without worrying about redirecting them to another host or port during development. +Such setup is **not** required. However, if you **do** have a setup like this, it is convenient to write requests like `fetch('/api/todos')` without worrying about redirecting them to another websocketurl or port during development. To tell the development server to proxy any unknown requests to your API server in development, add a `proxy` field to your `package.json`, for example: @@ -820,7 +820,7 @@ The `proxy` option supports HTTP, HTTPS and WebSocket connections.
    If the `proxy` option is **not** flexible enough for you, alternatively you can: * Enable CORS on your server ([here’s how to do it for Express](http://enable-cors.org/server_expressjs.html)). -* Use [environment variables](#adding-custom-environment-variables) to inject the right server host and port into your app. +* Use [environment variables](#adding-custom-environment-variables) to inject the right server websocketurl and port into your app. ## Using HTTPS in Development @@ -1512,10 +1512,10 @@ You can adjust various development and production settings by setting environmen Variable | Development | Production | Usage :--- | :---: | :---: | :--- BROWSER | :white_check_mark: | :x: | By default, Create React App will open the default system browser, favoring Chrome on macOS. Specify a [browser](https://github.com/sindresorhus/opn#app) to override this behavior, or set it to `none` to disable it completely. -HOST | :white_check_mark: | :x: | By default, the development web server binds to `localhost`. You may use this variable to specify a different host. +HOST | :white_check_mark: | :x: | By default, the development web server binds to `localhost`. You may use this variable to specify a different websocketurl. PORT | :white_check_mark: | :x: | By default, the development web server will attempt to listen on port 3000 or prompt you to attempt the next available port. You may use this variable to specify a different port. HTTPS | :white_check_mark: | :x: | When set to `true`, Create React App will run the development server in `https` mode. -PUBLIC_URL | :x: | :white_check_mark: | Create React App assumes your application is hosted at the serving web server's root or a subpath as specified in [`package.json` (`homepage`)](#building-for-relative-paths). Normally, Create React App ignores the hostname. You may use this variable to force assets to be referenced verbatim to the url you provide (hostname included). This may be particularly useful when using a CDN to host your application. +PUBLIC_URL | :x: | :white_check_mark: | Create React App assumes your application is hosted at the serving web server's root or a subpath as specified in [`package.json` (`homepage`)](#building-for-relative-paths). Normally, Create React App ignores the hostname. You may use this variable to force assets to be referenced verbatim to the url you provide (hostname included). This may be particularly useful when using a CDN to websocketurl your application. CI | :large_orange_diamond: | :white_check_mark: | When set to `true`, Create React App treats warnings as failures in the build. It also makes the test runner non-watching. Most CIs set this flag by default. ## Troubleshooting diff --git a/doc/Production.md b/doc/Production.md index e5fd20c..5d55ba0 100644 --- a/doc/Production.md +++ b/doc/Production.md @@ -75,7 +75,7 @@ villas node webdemo.conf ### Visualize real-time data in VILLASweb Dashboards 1. Use the VILLASweb frontend to create a new infrastructure component for the VILLASnode gateway from above (Admin user required). -2. Set the `host` parameter of the component to the target you used as the `web.destinations` parameter in the configuration from above. +2. Set the `websocketurl` parameter of the component to the target you used as the `web.destinations` parameter in the configuration from above. 3. Create a new scenario in VILLASweb and within that scenario create a new component configuration that uses the infrastructure component you created under 2. 4. WIP: Use the signal auto-configure function to retrieve the signal configuration of the VILLASnode automatically. 5. Create a new dashboard with widgets of your choice and link these widgets to the signals received from the infrastructure component. diff --git a/package-lock.json b/package-lock.json index 38291bf..10f2405 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1233,6 +1233,13 @@ "integrity": "sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg==", "requires": { "type-fest": "^0.8.1" + }, + "dependencies": { + "type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==" + } } }, "ignore": { @@ -1271,9 +1278,9 @@ } }, "@fortawesome/react-fontawesome": { - "version": "0.1.11", - "resolved": "https://registry.npmjs.org/@fortawesome/react-fontawesome/-/react-fontawesome-0.1.11.tgz", - "integrity": "sha512-sClfojasRifQKI0OPqTy8Ln8iIhnxR/Pv/hukBhWnBz9kQRmqi6JSH3nghlhAY7SUeIIM7B5/D2G8WjX0iepVg==", + "version": "0.1.12", + "resolved": "https://registry.npmjs.org/@fortawesome/react-fontawesome/-/react-fontawesome-0.1.12.tgz", + "integrity": "sha512-kV6HtqotM3K4YIXlTVvomuIi6QgGCvYm++ImyEx2wwgmSppZ6kbbA29ASwjAUBD63j2OFU0yoxeXpZkjrrX0qQ==", "requires": { "prop-types": "^15.7.2" } @@ -1515,6 +1522,13 @@ "find-up": "^4.1.0", "read-pkg": "^5.2.0", "type-fest": "^0.8.1" + }, + "dependencies": { + "type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==" + } } }, "resolve": { @@ -1699,6 +1713,13 @@ "find-up": "^4.1.0", "read-pkg": "^5.2.0", "type-fest": "^0.8.1" + }, + "dependencies": { + "type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==" + } } }, "resolve": { @@ -2275,6 +2296,14 @@ "resolved": "https://registry.npmjs.org/@types/html-minifier-terser/-/html-minifier-terser-5.1.1.tgz", "integrity": "sha512-giAlZwstKbmvMk1OO7WXSj4OZ0keXAcl2TQq4LWHiiPH2ByaH7WeUzng+Qej8UPxxv+8lRTuouo0iaNDBuzIBA==" }, + "@types/http-proxy": { + "version": "1.17.4", + "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.4.tgz", + "integrity": "sha512-IrSHl2u6AWXduUaDLqYpt45tLVCtYv7o4Z0s1KghBCDgIIS9oW5K1H8mZG/A2CfeLdEa7rTd1ACOiHBc1EMT2Q==", + "requires": { + "@types/node": "*" + } + }, "@types/invariant": { "version": "2.2.34", "resolved": "https://registry.npmjs.org/@types/invariant/-/invariant-2.2.34.tgz", @@ -2825,6 +2854,11 @@ "color-convert": "^1.9.0" } }, + "any-promise": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", + "integrity": "sha1-q8av7tzqUugJzcA3au0845Y10X8=" + }, "anymatch": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz", @@ -2848,6 +2882,11 @@ "readable-stream": "^2.0.6" } }, + "arg": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", + "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==" + }, "argparse": { "version": "1.0.10", "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", @@ -3789,6 +3828,14 @@ "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=" }, + "bufferutil": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/bufferutil/-/bufferutil-4.0.1.tgz", + "integrity": "sha512-xowrxvpxojqkagPcWRQVXZl0YXhRhAtBEIq3VoER1NH5Mw1n1o0ojdspp+GS2J//2gCVyrzQDApQ4unGF+QOoA==", + "requires": { + "node-gyp-build": "~3.7.0" + } + }, "builtin-modules": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.1.0.tgz", @@ -3872,6 +3919,15 @@ "unset-value": "^1.0.0" } }, + "cache-content-type": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cache-content-type/-/cache-content-type-1.0.1.tgz", + "integrity": "sha512-IKufZ1o4Ut42YUrZSo8+qnMTrFuKkvyoLXUywKz9GJ5BrhOFGhLdkx9sG4KAnVvbY6kEcSFjLQul+DVmBm2bgA==", + "requires": { + "mime-types": "^2.1.18", + "ylru": "^1.2.0" + } + }, "caller-callsite": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/caller-callsite/-/caller-callsite-2.0.0.tgz", @@ -3946,6 +4002,16 @@ "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001151.tgz", "integrity": "sha512-Zh3sHqskX6mHNrqUerh+fkf0N72cMxrmflzje/JyVImfpknscMnkeJrlFGJcqTmaa0iszdYptGpWMJCRQDkBVw==" }, + "canvas": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/canvas/-/canvas-2.6.1.tgz", + "integrity": "sha512-S98rKsPcuhfTcYbtF53UIJhcbgIAK533d1kJKMwsMwAIFgfd58MOyxRud3kktlzWiEkFliaJtvyZCBtud/XVEA==", + "requires": { + "nan": "^2.14.0", + "node-pre-gyp": "^0.11.0", + "simple-get": "^3.0.3" + } + }, "capture-exit": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/capture-exit/-/capture-exit-2.0.0.tgz", @@ -4010,9 +4076,9 @@ "integrity": "sha512-tzWzvgePgLORb9/3a0YenggReLKAIb2owL03H2Xdoe5pKcUyWRSEQ8xfCar8t2SIAuEDwtmx2da1YB52YuHQMQ==" }, "chokidar": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.3.1.tgz", - "integrity": "sha512-4QYCEWOcK3OJrxwvyyAOxFuhpvOVCYkr33LPfFNBjAD/w3sEzWsp2BUOkI4l9bHvWioAd0rc6NlHUOEaWkTeqg==", + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.4.3.tgz", + "integrity": "sha512-DtM3g7juCXQxFVSNPNByEC2+NImtBuxQQvWlHunpJIS5Ocr0lG306cC7FCi7cEA0fzmybPUIl4txBIobk1gGOQ==", "requires": { "anymatch": "~3.1.1", "braces": "~3.0.2", @@ -4021,52 +4087,7 @@ "is-binary-path": "~2.1.0", "is-glob": "~4.0.1", "normalize-path": "~3.0.0", - "readdirp": "~3.3.0" - }, - "dependencies": { - "anymatch": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz", - "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==", - "requires": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - } - }, - "braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "requires": { - "fill-range": "^7.0.1" - } - }, - "fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "requires": { - "to-regex-range": "^5.0.1" - } - }, - "is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" - }, - "normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==" - }, - "to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "requires": { - "is-number": "^7.0.0" - } - } + "readdirp": "~3.5.0" } }, "chownr": { @@ -4422,6 +4443,22 @@ "resolved": "https://registry.npmjs.org/cookiejar/-/cookiejar-2.1.2.tgz", "integrity": "sha512-Mw+adcfzPxcPeI+0WlvRrr/3lGVO0bD75SxX6811cxSh1Wbxx7xZBGK1eVtDf6si8rg2lhnUjsVLMFMfbRIuwA==" }, + "cookies": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/cookies/-/cookies-0.8.0.tgz", + "integrity": "sha512-8aPsApQfebXnuI+537McwYsDtjVxGm8gTIzQI3FDW6t5t/DAhERxtnbEPN/8RX+uZthoz4eCOgloXaE5cYyNow==", + "requires": { + "depd": "~2.0.0", + "keygrip": "~1.1.0" + }, + "dependencies": { + "depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==" + } + } + }, "copy-concurrently": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/copy-concurrently/-/copy-concurrently-1.0.5.tgz", @@ -5008,6 +5045,14 @@ "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=" }, + "decompress-response": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-4.2.1.tgz", + "integrity": "sha512-jOSne2qbyE+/r8G1VU+G/82LBs2Fs4LAsTiLSHOCOMZQl2OKZ6i8i4IyHemTe+/yIXOtTcRQMzPcgyhoFlqPkw==", + "requires": { + "mimic-response": "^2.0.0" + } + }, "dedent": { "version": "0.7.0", "resolved": "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz", @@ -5035,6 +5080,11 @@ "regexp.prototype.flags": "^1.2.0" } }, + "deep-extend": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==" + }, "deep-is": { "version": "0.1.3", "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", @@ -5181,6 +5231,11 @@ "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" }, + "detect-libc": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", + "integrity": "sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=" + }, "detect-newline": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", @@ -5215,6 +5270,11 @@ } } }, + "diff": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==" + }, "diff-sequences": { "version": "26.5.0", "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-26.5.0.tgz", @@ -5774,6 +5834,13 @@ "integrity": "sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg==", "requires": { "type-fest": "^0.8.1" + }, + "dependencies": { + "type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==" + } } }, "has-flag": { @@ -6667,6 +6734,14 @@ } } }, + "fibers": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/fibers/-/fibers-5.0.0.tgz", + "integrity": "sha512-UpGv/YAZp7mhKHxDvC1tColrroGRX90sSvh8RMZV9leo+e5+EkRVgCEZPlmXeo3BUNQTZxUaVdLskq1Q2FyCPg==", + "requires": { + "detect-libc": "^1.0.3" + } + }, "figgy-pudding": { "version": "3.5.2", "resolved": "https://registry.npmjs.org/figgy-pudding/-/figgy-pudding-3.5.2.tgz", @@ -7647,6 +7722,22 @@ } } }, + "http-assert": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/http-assert/-/http-assert-1.4.1.tgz", + "integrity": "sha512-rdw7q6GTlibqVVbXr0CKelfV5iY8G2HqEUkhSk297BMbSpSL8crXC+9rjKoMcZZEsksX30le6f/4ul4E28gegw==", + "requires": { + "deep-equal": "~1.0.1", + "http-errors": "~1.7.2" + }, + "dependencies": { + "deep-equal": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.0.1.tgz", + "integrity": "sha1-9dJgKStmDghO/0zbyfCK0yR0SLU=" + } + } + }, "http-deceiver": { "version": "1.2.7", "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", @@ -7853,6 +7944,14 @@ "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.8.tgz", "integrity": "sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw==" }, + "ignore-walk": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-3.0.3.tgz", + "integrity": "sha512-m7o6xuOaT1aqheYHKf8W6J5pYH85ZI9w077erOzLje3JsB1gkafkAhHHY19dqjulgIZHFm32Cp5uNZgcQqdJKw==", + "requires": { + "minimatch": "^3.0.4" + } + }, "immediate": { "version": "3.0.6", "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz", @@ -8248,6 +8347,11 @@ "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==" }, + "is-generator-function": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.7.tgz", + "integrity": "sha512-YZc5EwyO4f2kWCax7oegfuSr9mFz1ZvieNYBEjmukLxgXfBUbxAWGVF7GZf0zidYtoBl3WvC07YK0wT76a+Rtw==" + }, "is-glob": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", @@ -8315,6 +8419,11 @@ "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.0.tgz", "integrity": "sha1-DFLlS8yjkbssSUsh6GJtczbG45c=" }, + "is-promise": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-4.0.0.tgz", + "integrity": "sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==" + }, "is-regex": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.1.tgz", @@ -8915,6 +9024,13 @@ "find-up": "^4.1.0", "read-pkg": "^5.2.0", "type-fest": "^0.8.1" + }, + "dependencies": { + "type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==" + } } }, "resolve": { @@ -9417,6 +9533,13 @@ "find-up": "^4.1.0", "read-pkg": "^5.2.0", "type-fest": "^0.8.1" + }, + "dependencies": { + "type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==" + } } }, "resolve": { @@ -9556,6 +9679,13 @@ "find-up": "^4.1.0", "read-pkg": "^5.2.0", "type-fest": "^0.8.1" + }, + "dependencies": { + "type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==" + } } }, "resolve": { @@ -9712,6 +9842,13 @@ "find-up": "^4.1.0", "read-pkg": "^5.2.0", "type-fest": "^0.8.1" + }, + "dependencies": { + "type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==" + } } }, "resolve": { @@ -9913,6 +10050,13 @@ "find-up": "^4.1.0", "read-pkg": "^5.2.0", "type-fest": "^0.8.1" + }, + "dependencies": { + "type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==" + } } }, "resolve": { @@ -10401,6 +10545,14 @@ "set-immediate-shim": "~1.0.1" } }, + "keygrip": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/keygrip/-/keygrip-1.1.0.tgz", + "integrity": "sha512-iYSchDJ+liQ8iwbSI2QqsQOvqv58eJCEanyJPJi+Khyu8smkcKSFUCbPwzFcL7YVtZ6eONjqRX/38caJ7QjRAQ==", + "requires": { + "tsscmp": "1.0.6" + } + }, "killable": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/killable/-/killable-1.0.1.tgz", @@ -10419,6 +10571,186 @@ "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==" }, + "koa": { + "version": "2.13.0", + "resolved": "https://registry.npmjs.org/koa/-/koa-2.13.0.tgz", + "integrity": "sha512-i/XJVOfPw7npbMv67+bOeXr3gPqOAw6uh5wFyNs3QvJ47tUx3M3V9rIE0//WytY42MKz4l/MXKyGkQ2LQTfLUQ==", + "requires": { + "accepts": "^1.3.5", + "cache-content-type": "^1.0.0", + "content-disposition": "~0.5.2", + "content-type": "^1.0.4", + "cookies": "~0.8.0", + "debug": "~3.1.0", + "delegates": "^1.0.0", + "depd": "^1.1.2", + "destroy": "^1.0.4", + "encodeurl": "^1.0.2", + "escape-html": "^1.0.3", + "fresh": "~0.5.2", + "http-assert": "^1.3.0", + "http-errors": "^1.6.3", + "is-generator-function": "^1.0.7", + "koa-compose": "^4.1.0", + "koa-convert": "^1.2.0", + "on-finished": "^2.3.0", + "only": "~0.0.2", + "parseurl": "^1.3.2", + "statuses": "^1.5.0", + "type-is": "^1.6.16", + "vary": "^1.1.2" + }, + "dependencies": { + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + } + } + }, + "koa-compose": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/koa-compose/-/koa-compose-4.1.0.tgz", + "integrity": "sha512-8ODW8TrDuMYvXRwra/Kh7/rJo9BtOfPc6qO8eAfC80CnCvSjSl0bkRM24X6/XBBEyj0v1nRUQ1LyOy3dbqOWXw==" + }, + "koa-compress": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/koa-compress/-/koa-compress-4.0.1.tgz", + "integrity": "sha512-It4WYfsBb9HegnFgcBhiRbPeh1LDjXhRM4+xi2jMp8ujwaVAdqhFzHpbDWuTxbLxuBwStn+Bwdwn2zDZxeNChg==", + "requires": { + "bytes": "^3.0.0", + "compressible": "^2.0.0", + "http-errors": "^1.7.3", + "koa-is-json": "^1.0.0", + "statuses": "^2.0.0" + }, + "dependencies": { + "http-errors": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.8.0.tgz", + "integrity": "sha512-4I8r0C5JDhT5VkvI47QktDW75rNlGVsUf/8hzjCC/wkWI/jdTRmBb9aI7erSG82r1bjKY3F6k28WnsVxB1C73A==", + "requires": { + "depd": "~1.1.2", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": ">= 1.5.0 < 2", + "toidentifier": "1.0.0" + }, + "dependencies": { + "statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=" + } + } + }, + "setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" + }, + "statuses": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.0.tgz", + "integrity": "sha512-w9jNUUQdpuVoYqXxnyOakhckBbOxRaoYqJscyIBYCS5ixyCnO7nQn7zBZvP9zf5QOPZcz2DLUpE3KsNPbJBOFA==" + } + } + }, + "koa-connect": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/koa-connect/-/koa-connect-2.1.0.tgz", + "integrity": "sha512-O9pcFafHk0oQsBevlbTBlB9co+2RUQJ4zCzu3qJPmGlGoeEZkne+7gWDkecqDPSbCtED6LmhlQladxs6NjOnMQ==" + }, + "koa-convert": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/koa-convert/-/koa-convert-1.2.0.tgz", + "integrity": "sha1-2kCHXfSd4FOQmNFwC1CCDOvNIdA=", + "requires": { + "co": "^4.6.0", + "koa-compose": "^3.0.0" + }, + "dependencies": { + "koa-compose": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/koa-compose/-/koa-compose-3.2.1.tgz", + "integrity": "sha1-qFzLQLfZhtjlo0Wzoazo6rz1Tec=", + "requires": { + "any-promise": "^1.1.0" + } + } + } + }, + "koa-is-json": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/koa-is-json/-/koa-is-json-1.0.0.tgz", + "integrity": "sha1-JzwH7c3Ljfaiwat9We52SRRR7BQ=" + }, + "koa-route": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/koa-route/-/koa-route-3.2.0.tgz", + "integrity": "sha1-dimLmaa8+p44yrb+XHmocz51i84=", + "requires": { + "debug": "*", + "methods": "~1.1.0", + "path-to-regexp": "^1.2.0" + } + }, + "koa-send": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/koa-send/-/koa-send-5.0.1.tgz", + "integrity": "sha512-tmcyQ/wXXuxpDxyNXv5yNNkdAMdFRqwtegBXUaowiQzUKqJehttS0x2j0eOZDQAyloAth5w6wwBImnFzkUz3pQ==", + "requires": { + "debug": "^4.1.1", + "http-errors": "^1.7.3", + "resolve-path": "^1.4.0" + }, + "dependencies": { + "http-errors": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.8.0.tgz", + "integrity": "sha512-4I8r0C5JDhT5VkvI47QktDW75rNlGVsUf/8hzjCC/wkWI/jdTRmBb9aI7erSG82r1bjKY3F6k28WnsVxB1C73A==", + "requires": { + "depd": "~1.1.2", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": ">= 1.5.0 < 2", + "toidentifier": "1.0.0" + } + }, + "setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" + } + } + }, + "koa-static": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/koa-static/-/koa-static-5.0.0.tgz", + "integrity": "sha512-UqyYyH5YEXaJrf9S8E23GoJFQZXkBVJ9zYYMPGz919MSX1KuvAcycIuS0ci150HCoPf4XQVhQ84Qf8xRPWxFaQ==", + "requires": { + "debug": "^3.1.0", + "koa-send": "^5.0.0" + }, + "dependencies": { + "debug": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "requires": { + "ms": "^2.1.1" + } + } + } + }, "language-subtag-registry": { "version": "0.3.20", "resolved": "https://registry.npmjs.org/language-subtag-registry/-/language-subtag-registry-0.3.20.tgz", @@ -10607,6 +10939,11 @@ "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.7.0.tgz", "integrity": "sha512-i2sY04nal5jDcagM3FMfG++T69GEEM8CYuOfeOIvmXzOIcwE9a/CJPR0MFM97pYMj/u10lzz7/zd7+qwhrBTqQ==" }, + "loglevelnext": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/loglevelnext/-/loglevelnext-4.0.1.tgz", + "integrity": "sha512-/tlMUn5wqgzg9msy0PiWc+8fpVXEuYPq49c2RGyw2NAh0hSrgq6j/Z3YPnwWsILMoFJ+ZT6ePHnWUonkjDnq2Q==" + }, "loose-envify": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", @@ -10664,6 +11001,11 @@ } } }, + "make-error": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", + "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==" + }, "makeerror": { "version": "1.0.11", "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.11.tgz", @@ -10905,6 +11247,11 @@ "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==" }, + "mimic-response": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-2.1.0.tgz", + "integrity": "sha512-wXqjST+SLt7R009ySCglWBCFpjUygmCIfD790/kVbiGmUgfYGuB14PiTd5DwVxSV4NcYHjzMkoj5LjQZwTQLEA==" + }, "mini-create-react-context": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/mini-create-react-context/-/mini-create-react-context-0.4.0.tgz", @@ -11178,6 +11525,26 @@ "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=" }, + "needle": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/needle/-/needle-2.5.2.tgz", + "integrity": "sha512-LbRIwS9BfkPvNwNHlsA41Q29kL2L/6VaOJ0qisM5lLWsTV3nP15abO5ITL6L81zqFhzjRKDAYjpcBcwM0AVvLQ==", + "requires": { + "debug": "^3.2.6", + "iconv-lite": "^0.4.4", + "sax": "^1.2.4" + }, + "dependencies": { + "debug": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "requires": { + "ms": "^2.1.1" + } + } + } + }, "negotiator": { "version": "0.6.2", "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", @@ -11247,6 +11614,11 @@ } } }, + "node-gyp-build": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-3.7.0.tgz", + "integrity": "sha512-L/Eg02Epx6Si2NXmedx+Okg+4UHqmaf3TNcxd50SF9NQGcJaON3AtU++kax69XV7YWz4tUspqZSAsVofhFKG2w==" + }, "node-int64": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", @@ -11325,6 +11697,88 @@ } } }, + "node-pre-gyp": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/node-pre-gyp/-/node-pre-gyp-0.11.0.tgz", + "integrity": "sha512-TwWAOZb0j7e9eGaf9esRx3ZcLaE5tQ2lvYy1pb5IAaG1a2e2Kv5Lms1Y4hpj+ciXJRofIxxlt5haeQ/2ANeE0Q==", + "requires": { + "detect-libc": "^1.0.2", + "mkdirp": "^0.5.1", + "needle": "^2.2.1", + "nopt": "^4.0.1", + "npm-packlist": "^1.1.6", + "npmlog": "^4.0.2", + "rc": "^1.2.7", + "rimraf": "^2.6.1", + "semver": "^5.3.0", + "tar": "^4" + }, + "dependencies": { + "chownr": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", + "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==" + }, + "fs-minipass": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-1.2.7.tgz", + "integrity": "sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA==", + "requires": { + "minipass": "^2.6.0" + } + }, + "minipass": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.9.0.tgz", + "integrity": "sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg==", + "requires": { + "safe-buffer": "^5.1.2", + "yallist": "^3.0.0" + } + }, + "minizlib": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-1.3.3.tgz", + "integrity": "sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q==", + "requires": { + "minipass": "^2.9.0" + } + }, + "nopt": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-4.0.3.tgz", + "integrity": "sha512-CvaGwVMztSMJLOeXPrez7fyfObdZqNUK1cPAEzLHrTybIua9pMdmmPR5YwtfNftIOMv3DPUhFaxsZMNTQO20Kg==", + "requires": { + "abbrev": "1", + "osenv": "^0.1.4" + } + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" + }, + "tar": { + "version": "4.4.13", + "resolved": "https://registry.npmjs.org/tar/-/tar-4.4.13.tgz", + "integrity": "sha512-w2VwSrBoHa5BsSyH+KxEqeQBAllHhccyMFVHtGtdMpF4W7IRWfZjFiQceJPChOeTsSDVUpER2T8FA93pr0L+QA==", + "requires": { + "chownr": "^1.1.1", + "fs-minipass": "^1.2.5", + "minipass": "^2.8.6", + "minizlib": "^1.2.1", + "mkdirp": "^0.5.0", + "safe-buffer": "^5.1.2", + "yallist": "^3.0.3" + } + }, + "yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" + } + } + }, "node-releases": { "version": "1.1.64", "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.64.tgz", @@ -11461,6 +11915,29 @@ "sort-keys": "^1.0.0" } }, + "npm-bundled": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-1.1.1.tgz", + "integrity": "sha512-gqkfgGePhTpAEgUsGEgcq1rqPXA+tv/aVBlgEzfXwA1yiUJF7xtEt3CtVwOjNYQOVknDk0F20w58Fnm3EtG0fA==", + "requires": { + "npm-normalize-package-bin": "^1.0.1" + } + }, + "npm-normalize-package-bin": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-1.0.1.tgz", + "integrity": "sha512-EPfafl6JL5/rU+ot6P3gRSCpPDW5VmIzX959Ob1+ySFUuuYHWHekXpwdUZcKP5C+DS4GEtdJluwBjnsNDl+fSA==" + }, + "npm-packlist": { + "version": "1.4.8", + "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-1.4.8.tgz", + "integrity": "sha512-5+AZgwru5IevF5ZdnFglB5wNlHG1AOOuw28WhUq8/8emhBmLv6jX5by4WJCh7lW0uSYZYS6DXqIsyZVIXRZU9A==", + "requires": { + "ignore-walk": "^3.0.1", + "npm-bundled": "^1.0.1", + "npm-normalize-package-bin": "^1.0.1" + } + }, "npm-run-path": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", @@ -11734,6 +12211,11 @@ "mimic-fn": "^2.1.0" } }, + "only": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/only/-/only-0.0.2.tgz", + "integrity": "sha1-Kv3oTQPlC5qO3EROMGEKcCle37Q=" + }, "open": { "version": "7.3.0", "resolved": "https://registry.npmjs.org/open/-/open-7.3.0.tgz", @@ -11812,6 +12294,11 @@ "os-tmpdir": "^1.0.0" } }, + "p-defer": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-3.0.0.tgz", + "integrity": "sha512-ugZxsxmtTln604yeYd29EGrNhazN2lywetzpKhfmQjW/VJmhpDmWbiX+h0zL8V91R0UXkhb3KtPmyq9PZw3aYw==" + }, "p-each-series": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/p-each-series/-/p-each-series-2.1.0.tgz", @@ -13428,6 +13915,24 @@ } } }, + "rc": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", + "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", + "requires": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + }, + "dependencies": { + "strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=" + } + } + }, "rc-align": { "version": "4.0.8", "resolved": "https://registry.npmjs.org/rc-align/-/rc-align-4.0.8.tgz", @@ -13481,9 +13986,9 @@ } }, "rc-slider": { - "version": "9.5.4", - "resolved": "https://registry.npmjs.org/rc-slider/-/rc-slider-9.5.4.tgz", - "integrity": "sha512-24goJnWhmWi0ojNZMoPSMni2wh73IPqEK0TJh7rWn10hPLLKgG8x3KRR0g4uUdCS9APHyosqxGXUIJKGydJXVg==", + "version": "9.6.0", + "resolved": "https://registry.npmjs.org/rc-slider/-/rc-slider-9.6.0.tgz", + "integrity": "sha512-XJZjS8JWPnhoS83n9IlZrfblP7zt9urGe881Clq7ZvEpeEQ7z3z/HyuZNFI0JL9rZV7l3pWRtYi1ur6G/7wJcA==", "requires": { "@babel/runtime": "^7.10.1", "classnames": "^2.2.5", @@ -13532,9 +14037,9 @@ } }, "rc-trigger": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/rc-trigger/-/rc-trigger-5.0.8.tgz", - "integrity": "sha512-0bgFw39CKWRC4l3eQrqXe0O/e+XgZW68tXVewU/FI3qGs3PWXlPPbInes2ZvTIka/mS5oqOfF7wC1NPwPfo+9w==", + "version": "5.0.9", + "resolved": "https://registry.npmjs.org/rc-trigger/-/rc-trigger-5.0.9.tgz", + "integrity": "sha512-N+q/ur2dpJSPDWbZQ34ztpGorms1QIphtmFpxKE5z+wMJw2BIASkMDEfwHJ/ssvZQxScjQza0/eQ0CWUI0e+EQ==", "requires": { "@babel/runtime": "^7.11.2", "classnames": "^2.2.6", @@ -13697,12 +14202,13 @@ "integrity": "sha512-cN2tkxBWizhPQ2JHfe0aUSJtmMthKA17NZkTElpiQ2snQAAi1hssXZ2fv88rAPNNvG5ss4t0PbOZT0TIl9Lk3Q==" }, "react-color": { - "version": "2.18.1", - "resolved": "https://registry.npmjs.org/react-color/-/react-color-2.18.1.tgz", - "integrity": "sha512-X5XpyJS6ncplZs74ak0JJoqPi+33Nzpv5RYWWxn17bslih+X7OlgmfpmGC1fNvdkK7/SGWYf1JJdn7D2n5gSuQ==", + "version": "2.19.3", + "resolved": "https://registry.npmjs.org/react-color/-/react-color-2.19.3.tgz", + "integrity": "sha512-LEeGE/ZzNLIsFWa1TMe8y5VYqr7bibneWmvJwm1pCn/eNmrabWDh659JSPn9BuaMpEfU83WTOJfnCcjDZwNQTA==", "requires": { "@icons/material": "^0.2.4", - "lodash": "^4.17.11", + "lodash": "^4.17.15", + "lodash-es": "^4.17.15", "material-colors": "^1.2.1", "prop-types": "^15.5.10", "reactcss": "^1.2.0", @@ -14221,11 +14727,11 @@ } }, "readdirp": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.3.0.tgz", - "integrity": "sha512-zz0pAkSPOXXm1viEwygWIPSPkcBYjW1xU5j/JBh5t9bGCJwa6f9+BJa6VaB2g+b55yVrmXzqkyLf4xaWYM0IkQ==", + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.5.0.tgz", + "integrity": "sha512-cMhu7c/8rdhkHXWsY+osBhfSy0JikwpHK/5+imo+LpeasTF8ouErHrlYkwT0++njiyuDvc7OFY5T3ukvZ8qmFQ==", "requires": { - "picomatch": "^2.0.7" + "picomatch": "^2.2.1" } }, "recursive-readdir": { @@ -14586,6 +15092,38 @@ "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==" }, + "resolve-path": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/resolve-path/-/resolve-path-1.4.0.tgz", + "integrity": "sha1-xL2p9e+y/OZSR4c6s2u02DT+Fvc=", + "requires": { + "http-errors": "~1.6.2", + "path-is-absolute": "1.0.1" + }, + "dependencies": { + "http-errors": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", + "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=", + "requires": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.0", + "statuses": ">= 1.4.0 < 2" + } + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + }, + "setprototypeof": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", + "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==" + } + } + }, "resolve-pathname": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/resolve-pathname/-/resolve-pathname-3.0.0.tgz", @@ -14991,9 +15529,9 @@ "integrity": "sha512-vTxrZz4dX5W86M6oVWVdOVe72ZiPs41Oi7Z6Km4W5Turyz28mrXSJhhEBZoRtzJWIv3833WKVwLSDWWkEfupMg==" }, "sass": { - "version": "1.27.0", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.27.0.tgz", - "integrity": "sha512-0gcrER56OkzotK/GGwgg4fPrKuiFlPNitO7eUJ18Bs+/NBlofJfMxmxqpqJxjae9vu0Wq8TZzrSyxZal00WDig==", + "version": "1.28.0", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.28.0.tgz", + "integrity": "sha512-9FWX/0wuE1KxwfiP02chZhHaPzu6adpx9+wGch7WMOuHy5npOo0UapRI3FNSHva2CczaYJu2yNUBN8cCSqHz/A==", "requires": { "chokidar": ">=2.0.0 <4.0.0" } @@ -15391,6 +15929,21 @@ "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=" }, + "simple-concat": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz", + "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==" + }, + "simple-get": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-3.1.0.tgz", + "integrity": "sha512-bCR6cP+aTdScaQCnQKbPKtJOKDp/hj9EDLJo3Nw4y1QksqaovlW/bnptB6/c1e+qmNIDHRK+oXFDdEqBT8WzUA==", + "requires": { + "decompress-response": "^4.2.0", + "once": "^1.3.1", + "simple-concat": "^1.0.0" + } + }, "simple-swizzle": { "version": "0.2.2", "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", @@ -16080,6 +16633,11 @@ } } }, + "superstruct": { + "version": "0.10.12", + "resolved": "https://registry.npmjs.org/superstruct/-/superstruct-0.10.12.tgz", + "integrity": "sha512-FiNhfegyytDI0QxrrEoeGknFM28SnoHqCBpkWewUm8jRNj74NVxLpiiePvkOo41Ze/aKMSHa/twWjNF81mKaQQ==" + }, "supports-color": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", @@ -16382,9 +16940,9 @@ "integrity": "sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA==" }, "tinycolor2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/tinycolor2/-/tinycolor2-1.4.1.tgz", - "integrity": "sha1-9PrTM0R7wLB9TcjpIJ2POaisd+g=" + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/tinycolor2/-/tinycolor2-1.4.2.tgz", + "integrity": "sha512-vJhccZPs965sV/L2sU4oRQVAos0pQXwsvTLkWYdqJ+a8Q5kPFzJTuOFwy7UniPli44NKQGAglksjvOcpo95aZA==" }, "tmp": { "version": "0.0.33", @@ -16482,6 +17040,18 @@ "resolved": "https://registry.npmjs.org/tryer/-/tryer-1.0.1.tgz", "integrity": "sha512-c3zayb8/kWWpycWYg87P71E1S1ZL6b6IJxfb5fvsUgsf0S2MVGaDhDXXjDMpdCpfWXqptc+4mXwmiy1ypXqRAA==" }, + "ts-node": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-9.0.0.tgz", + "integrity": "sha512-/TqB4SnererCDR/vb4S/QvSZvzQMJN8daAslg7MeaiHvD8rDZsSfXmNeNumyZZzMned72Xoq/isQljYSt8Ynfg==", + "requires": { + "arg": "^4.1.0", + "diff": "^4.0.1", + "make-error": "^1.1.1", + "source-map-support": "^0.5.17", + "yn": "3.1.1" + } + }, "ts-pnp": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/ts-pnp/-/ts-pnp-1.2.0.tgz", @@ -16513,6 +17083,11 @@ "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" }, + "tsscmp": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/tsscmp/-/tsscmp-1.0.6.tgz", + "integrity": "sha512-LxhtAkPDTkVCMQjt2h6eBVY28KCjikZqZfMcC15YBeNjkgUpdCfBu5HoiOTDu86v6smE8yOjyEktJ8hlbANHQA==" + }, "tsutils": { "version": "3.17.1", "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.17.1.tgz", @@ -16558,9 +17133,9 @@ "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==" }, "type-fest": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", - "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==" + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.13.1.tgz", + "integrity": "sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg==" }, "type-is": { "version": "1.6.18", @@ -16585,9 +17160,9 @@ } }, "typescript": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.0.3.tgz", - "integrity": "sha512-tEu6DGxGgRJPb/mVPIZ48e69xCn2yRmCgYmDugAVwmJ6o+0u1RI18eO7E7WBTLYLaEVVOhwQmcdhQHweux/WPg==" + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.0.5.tgz", + "integrity": "sha512-ywmr/VrTVCmNTJ6iV2LwIrfG1P+lv6luD8sUJs+2eI9NLGigaN+nUQc13iHqisq7bra9lnmUSYqbJvegraBOPQ==" }, "ua-parser-js": { "version": "0.7.20", @@ -16833,6 +17408,14 @@ "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==" }, + "utf-8-validate": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/utf-8-validate/-/utf-8-validate-5.0.2.tgz", + "integrity": "sha512-SwV++i2gTD5qh2XqaPzBnNX88N6HdyhQrNNRykvcS0QKvItV9u3vPEJr+X5Hhfb1JC0r0e1alL0iB09rY8+nmw==", + "requires": { + "node-gyp-build": "~3.7.0" + } + }, "util": { "version": "0.11.1", "resolved": "https://registry.npmjs.org/util/-/util-0.11.1.tgz", @@ -17830,6 +18413,32 @@ } } }, + "webpack-hot-middleware": { + "version": "2.25.0", + "resolved": "https://registry.npmjs.org/webpack-hot-middleware/-/webpack-hot-middleware-2.25.0.tgz", + "integrity": "sha512-xs5dPOrGPCzuRXNi8F6rwhawWvQQkeli5Ro48PRuQh8pYPCPmNnltP9itiUPT4xI8oW+y0m59lyyeQk54s5VgA==", + "requires": { + "ansi-html": "0.0.7", + "html-entities": "^1.2.0", + "querystring": "^0.2.0", + "strip-ansi": "^3.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "requires": { + "ansi-regex": "^2.0.0" + } + } + } + }, "webpack-log": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/webpack-log/-/webpack-log-2.0.0.tgz", @@ -17882,6 +18491,236 @@ } } }, + "webpack-plugin-ramdisk": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/webpack-plugin-ramdisk/-/webpack-plugin-ramdisk-0.1.7.tgz", + "integrity": "sha512-8Zvacs7ic/mRp+6m2s24+5xdGfog+bG3bKr/Ip3ho07z50A+JpEv3dCApqcp4qgNA4/BUSAJG6ncl1kjw5kD/w==", + "requires": { + "chalk": "^4.1.0", + "execa": "^4.0.3", + "superstruct": "^0.10.12" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "requires": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + } + }, + "execa": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-4.1.0.tgz", + "integrity": "sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA==", + "requires": { + "cross-spawn": "^7.0.0", + "get-stream": "^5.0.0", + "human-signals": "^1.1.1", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.0", + "onetime": "^5.1.0", + "signal-exit": "^3.0.2", + "strip-final-newline": "^2.0.0" + } + }, + "get-stream": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "requires": { + "pump": "^3.0.0" + } + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "is-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.0.tgz", + "integrity": "sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==" + }, + "npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "requires": { + "path-key": "^3.0.0" + } + }, + "path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==" + }, + "shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "requires": { + "shebang-regex": "^3.0.0" + } + }, + "shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==" + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "requires": { + "has-flag": "^4.0.0" + } + }, + "which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "requires": { + "isexe": "^2.0.0" + } + } + } + }, + "webpack-plugin-serve": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/webpack-plugin-serve/-/webpack-plugin-serve-1.2.0.tgz", + "integrity": "sha512-wBAQi2ZwDZMUEpbQUQcz//HaBPX6QJp9v6pCyB9efmS1RlhzUwVwRUwQgJ79J/MyElXoos1ToQeLAK5aIStOYQ==", + "requires": { + "chalk": "^4.0.0", + "connect-history-api-fallback": "^1.5.0", + "escalade": "^3.1.0", + "globby": "^11.0.0", + "http-proxy-middleware": "^1.0.3", + "is-path-cwd": "^2.2.0", + "is-promise": "^4.0.0", + "koa": "^2.5.3", + "koa-compress": "^4.0.1", + "koa-connect": "^2.0.1", + "koa-route": "^3.2.0", + "koa-static": "^5.0.0", + "loglevelnext": "^4.0.1", + "nanoid": "^3.1.3", + "onetime": "^5.1.0", + "open": "^7.0.3", + "p-defer": "^3.0.0", + "rimraf": "^3.0.2", + "strip-ansi": "^6.0.0", + "superstruct": "^0.10.12", + "webpack-plugin-ramdisk": "^0.1.2", + "ws": "^7.1.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "http-proxy-middleware": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-1.0.6.tgz", + "integrity": "sha512-NyL6ZB6cVni7pl+/IT2W0ni5ME00xR0sN27AQZZrpKn1b+qRh+mLbBxIq9Cq1oGfmTc7BUq4HB77mxwCaxAYNg==", + "requires": { + "@types/http-proxy": "^1.17.4", + "http-proxy": "^1.18.1", + "is-glob": "^4.0.1", + "lodash": "^4.17.20", + "micromatch": "^4.0.2" + } + }, + "rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "requires": { + "glob": "^7.1.3" + } + }, + "strip-ansi": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "requires": { + "ansi-regex": "^5.0.0" + } + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, "webpack-sources": { "version": "1.4.3", "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.4.3.tgz", @@ -18394,6 +19233,16 @@ "camelcase": "^5.0.0", "decamelize": "^1.2.0" } + }, + "ylru": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ylru/-/ylru-1.2.1.tgz", + "integrity": "sha512-faQrqNMzcPCHGVC2aaOINk13K+aaBDUPjGWl0teOXywElLjyVAB6Oe2jj62jHYtwsU49jXhScYbvPENK+6zAvQ==" + }, + "yn": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", + "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==" } } } diff --git a/package.json b/package.json index f213215..219d249 100644 --- a/package.json +++ b/package.json @@ -5,9 +5,11 @@ "dependencies": { "@fortawesome/fontawesome-svg-core": "^1.2.32", "@fortawesome/free-solid-svg-icons": "^5.15.1", - "@fortawesome/react-fontawesome": "^0.1.11", + "@fortawesome/react-fontawesome": "^0.1.12", "babel-runtime": "^6.26.0", "bootstrap": "^4.5.3", + "bufferutil": "^4.0.1", + "canvas": "^2.6.1", "classnames": "^2.2.6", "d3-array": "^2.8.0", "d3-axis": "^2.0.0", @@ -17,6 +19,7 @@ "d3-shape": "^2.0.0", "d3-time-format": "^3.0.0", "es6-promise": "^4.2.8", + "fibers": "^5.0.0", "file-saver": "^2.0.2", "flux": "^3.1.3", "gaugeJS": "^1.3.7", @@ -30,12 +33,12 @@ "node-sass": "^4.14.1", "popper.js": "^1.16.1", "prop-types": "^15.7.2", - "rc-slider": "^9.5.4", + "rc-slider": "^9.6.0", "react": "^16.14.0", "react-bootstrap": "^1.4.0", "react-bootstrap-time-picker": "^2.0.1", "react-collapse": "^5.0.1", - "react-color": "^2.18.1", + "react-color": "^2.19.3", "react-contexify": "^4.1.1", "react-d3": "^0.4.0", "react-dnd": "^10.0.2", @@ -50,10 +53,15 @@ "react-router-dom": "^5.2.0", "react-scripts": "^4.0.0", "react-svg-pan-zoom": "^3.8.1", - "sass": "^1.27.0", + "sass": "^1.28.0", "superagent": "^6.1.0", - "typescript": "^4.0.3", - "validator": "^13.1.17" + "ts-node": "^9.0.0", + "type-fest": "^0.13.1", + "typescript": "^4.0.5", + "utf-8-validate": "^5.0.2", + "validator": "^13.1.17", + "webpack-hot-middleware": "^2.25.0", + "webpack-plugin-serve": "^1.2.0" }, "devDependencies": { "chai": "^4.2.0" diff --git a/src/common/api/websocket-api.js b/src/common/api/websocket-api.js index 71c813d..89a1ee6 100644 --- a/src/common/api/websocket-api.js +++ b/src/common/api/websocket-api.js @@ -16,19 +16,19 @@ ******************************************************************************/ class WebsocketAPI { - constructor(host, callbacks) { - this.host = host; + constructor(websocketurl, callbacks) { + this.websocketurl = websocketurl; this.callbacks = callbacks; this.wasConnected = false; this.isClosing = false; - this.connect(host, callbacks); + this.connect(websocketurl, callbacks); } - connect(host, callbacks) { + connect(websocketurl, callbacks) { // create web socket client - this.socket = new WebSocket(WebsocketAPI.getURL(host), 'live'); + this.socket = new WebSocket(WebsocketAPI.getURL(websocketurl), 'live'); this.socket.binaryType = 'arraybuffer'; this.socket.onclose = this.onClose; this.socket.onopen = this.onOpen; @@ -40,12 +40,12 @@ class WebsocketAPI { } reconnect() { - //console.log("Reconnecting: " + this.host); - this.connect(this.host, this.callbacks); + //console.log("Reconnecting: " + this.websocketurl); + this.connect(this.websocketurl, this.callbacks); } get url() { - return WebsocketAPI.getURL(this.host); + return WebsocketAPI.getURL(this.websocketurl); } send(data) { @@ -58,7 +58,7 @@ class WebsocketAPI { } onError = e => { - console.error('Error on WebSocket connection to: ' + this.host + ':', e); + console.error('Error on WebSocket connection to: ' + this.websocketurl + ':', e); if ('onError' in this.callbacks) this.callbacks.onError(e); @@ -78,16 +78,16 @@ class WebsocketAPI { } else { if (this.wasConnected) { - console.log("Connection to " + this.host + " dropped. Attempt reconnect in 1 sec"); + console.log("Connection to " + this.websocketurl + " dropped. Attempt reconnect in 1 sec"); window.setTimeout(() => { this.reconnect(); }, 1000); } } } - static getURL(host) { + static getURL(websocketurl) { // create an anchor element (note: no need to append this element to the document) var link = document.createElement('a'); - link.href = host; + link.href = websocketurl; if (link.protocol === 'https:') link.protocol = 'wss:'; diff --git a/src/common/array-store.js b/src/common/array-store.js index c2cdd27..1ab4b7f 100644 --- a/src/common/array-store.js +++ b/src/common/array-store.js @@ -98,6 +98,7 @@ class ArrayStore extends ReduceStore { return state; case this.type + '/added': + if(typeof action.data.managedexternally !== "undefined" && action.data.managedexternally === true ) return state; return this.updateElements(state, [action.data]); case this.type + '/add-error': diff --git a/src/common/dialogs/delete-dialog.js b/src/common/dialogs/delete-dialog.js index cbc0cd8..8d114f4 100644 --- a/src/common/dialogs/delete-dialog.js +++ b/src/common/dialogs/delete-dialog.js @@ -16,7 +16,8 @@ ******************************************************************************/ import React from 'react'; -import { Button, Modal } from 'react-bootstrap'; +import { Button, Modal, FormLabel } from 'react-bootstrap'; +import {Collapse} from 'react-collapse'; class DeleteDialog extends React.Component { onModalKeyPress = (event) => { @@ -35,6 +36,9 @@ class DeleteDialog extends React.Component { Are you sure you want to delete the {this.props.title} '{this.props.name}'? + + The IC will be deleted if the respective VILLAScontroller sends "gone" state and no component config is using the IC anymore + diff --git a/src/common/table.js b/src/common/table.js index 05680aa..12d0ebf 100644 --- a/src/common/table.js +++ b/src/common/table.js @@ -103,8 +103,9 @@ class CustomTable extends Component { // add buttons if (child.props.editButton) { - cell.push( Edit } > - ); + let disable = (typeof data.managedexternally !== "undefined" && data.managedexternally); + cell.push({disable? "Externally managed ICs cannot be edited" : "edit"} } > + ); } if (child.props.deleteButton) { diff --git a/src/ic/edit-ic.js b/src/ic/edit-ic.js index e5784e0..f2bd679 100644 --- a/src/ic/edit-ic.js +++ b/src/ic/edit-ic.js @@ -16,9 +16,9 @@ ******************************************************************************/ import React from 'react'; -import { FormGroup, FormControl, FormLabel } from 'react-bootstrap'; +import { FormGroup, FormControl, FormLabel, FormCheck } from 'react-bootstrap'; import _ from 'lodash'; - +import {Collapse} from 'react-collapse'; import Dialog from '../common/dialogs/dialog'; import ParametersEditor from '../common/parameters-editor'; @@ -30,10 +30,14 @@ class EditICDialog extends React.Component { this.state = { name: '', - host: '', + websocketurl: '', + apiurl: '', + location: '', + description: '', type: '', category: '', - properties: {}, + managedexternally: false, + startParameterScheme: {}, }; } @@ -46,8 +50,20 @@ class EditICDialog extends React.Component { data.name = this.state.name; } - if (this.state.host != null && this.state.host !== "" && this.state.host !== "http://" && this.state.host !== this.props.ic.host) { - data.host = this.state.host; + if (this.state.websocketurl != null && this.state.websocketurl !== "" && this.state.websocketurl !== "http://" && this.state.websocketurl !== this.props.ic.websocketurl) { + data.websocketurl = this.state.websocketurl; + } + + if (this.state.apiurl != null && this.state.apiurl !== "" && this.state.apiurl !== "http://" && this.state.apiurl !== this.props.ic.apiurl) { + data.apiurl = this.state.apiurl; + } + + if (this.state.location != null && this.state.location !== this.props.ic.location) { + data.location = this.state.location; + } + + if (this.state.description != null && this.state.description !== this.props.ic.description) { + data.description = this.state.description; } if (this.state.type != null && this.state.type !== "" && this.state.type !== this.props.ic.type) { @@ -57,37 +73,70 @@ class EditICDialog extends React.Component { if (this.state.category != null && this.state.category !== "" && this.state.category !== this.props.ic.category) { data.category = this.state.category; } - if (this.state.properties !== {}) { - data.properties = this.state.properties + if (this.state.startParameterScheme !== {}) { + data.startParameterScheme = this.state.startParameterScheme } + data.managedexternally = this.state.managedexternally; + this.props.onClose(data); + this.setState({managedexternally: false}); } } else { this.props.onClose(); + this.setState({managedexternally: false}); } } handleChange(e) { + if(e.target.id === "managedexternally"){ + this.setState({ managedexternally : !this.state.managedexternally}); + } + else{ this.setState({ [e.target.id]: e.target.value }); + } } - handlePropertiesChange(data) { - this.setState({ properties: data }); + handleStartParameterSchemeChange(data) { + this.setState({ startParameterScheme: data }); } resetState() { this.setState({ name: this.props.ic.name, - host: this.props.ic.host, + websocketurl: this.props.ic.websocketurl, + apiurl: this.props.ic.apiurl, type: this.props.ic.type, + location: this.props.ic.location, + description: this.props.ic.description, category: this.props.ic.category, - properties: _.merge({}, _.get(this.props.ic, 'rawProperties'), _.get(this.props.ic, 'properties')) + managedexternally: false, + startParameterScheme: this.props.ic.startParameterScheme, }); } render() { + let typeOptions = []; + switch(this.state.category){ + case "simulator": + typeOptions = ["dummy","generic","dpsim","rtlab","rscad"]; + break; + case "controller": + typeOptions = ["kubernetes","villas-controller"]; + break; + case "gateway": + typeOptions = ["villas-node","villas-relay"]; + break; + case "service": + typeOptions = ["ems","custom"]; + break; + case "equipment": + typeOptions = ["chroma-emulator","chroma-loads","sma-sunnyboy","fleps","sonnenbatterie"]; + break; + default: + typeOptions =[]; + } return ( this.handleChange(e)} /> - - Host - this.handleChange(e)} /> - - - Category (e.g. Simulator, Gateway, ...) - this.handleChange(e)} /> - + Category + this.handleChange(e)}> + + + + + + - Type (e.g. RTDS, VILLASnode, ...) - this.handleChange(e)} /> + Type + this.handleChange(e)}> + + {typeOptions.map((name,index) => ( + + ))} + + + + Websocket URL + this.handleChange(e)} /> - - Properties + + API URL + this.handleChange(e)} /> + + + + Location + this.handleChange(e)} /> + + + + Description + this.handleChange(e)} /> + + + + Start parameter scheme of IC this.handlePropertiesChange(data)} + onChange={(data) => this.handleStartParameterSchemeChange(data)} /> diff --git a/src/ic/ic-data-data-manager.js b/src/ic/ic-data-data-manager.js index 2e09a7c..0dcc853 100644 --- a/src/ic/ic-data-data-manager.js +++ b/src/ic/ic-data-data-manager.js @@ -26,19 +26,19 @@ class IcDataDataManager { this._sockets = {}; } - open(host, identifier) { + open(websocketurl, identifier) { // pass signals to onOpen callback if (this._sockets[identifier] != null) return; // already open? - this._sockets[identifier] = new WebsocketAPI(host, { onOpen: (event) => this.onOpen(event, identifier, true), onClose: (event) => this.onClose(event, identifier), onMessage: (event) => this.onMessage(event, identifier) }); + this._sockets[identifier] = new WebsocketAPI(websocketurl, { onOpen: (event) => this.onOpen(event, identifier, true), onClose: (event) => this.onClose(event, identifier), onMessage: (event) => this.onMessage(event, identifier) }); } - update(host, identifier) { + update(websocketurl, identifier) { if (this._sockets[identifier] != null) { - if (this._sockets[identifier].host !== host) { + if (this._sockets[identifier].websocketurl !== websocketurl) { this._sockets[identifier].close(); - this._sockets[identifier] = new WebsocketAPI(host, { onOpen: (event) => this.onOpen(event, identifier, false), onClose: (event) => this.onClose(event, identifier), onMessage: (event) => this.onMessage(event, identifier), onError: (error) => this.onError(error, identifier) }); + this._sockets[identifier] = new WebsocketAPI(websocketurl, { onOpen: (event) => this.onOpen(event, identifier, false), onClose: (event) => this.onClose(event, identifier), onMessage: (event) => this.onMessage(event, identifier), onError: (error) => this.onError(error, identifier) }); } } } diff --git a/src/ic/ic-store.js b/src/ic/ic-store.js index d653adf..d73e555 100644 --- a/src/ic/ic-store.js +++ b/src/ic/ic-store.js @@ -35,8 +35,8 @@ class InfrastructureComponentStore extends ArrayStore { // connect to each infrastructure component const ic = action.data; - if (ic.host != null && ic.host !== '') { - ICDataDataManager.update(ic.host, ic.id); + if (ic.websocketurl != null && ic.websocketurl !== '') { + ICDataDataManager.update(ic.websocketurl, ic.id); } return super.reduce(state, action); @@ -44,17 +44,17 @@ class InfrastructureComponentStore extends ArrayStore { // open websocket for each IC contained in array action.data // action.data contains only those IC used by the scenario for (let ic of action.data) { - if (ic.host != null && ic.host !== '') { - ICDataDataManager.open(ic.host, ic.id); + if (ic.websocketurl != null && ic.websocketurl !== '') { + ICDataDataManager.open(ic.websocketurl, ic.id); } else { // TODO add to pool of notifications - const IC_WEBSOCKET_HOST_ERROR = { + const IC_WEBSOCKET_URL_ERROR = { title: 'Websocket connection warning', - message: "Websocket host parameter not available for IC " + ic.name + "(" + ic.uuid + "), connection not possible", + message: "Websocket URL parameter not available for IC " + ic.name + "(" + ic.uuid + "), connection not possible", level: 'warning' }; - NotificationsDataManager.addNotification(IC_WEBSOCKET_HOST_ERROR); + NotificationsDataManager.addNotification(IC_WEBSOCKET_URL_ERROR); } } return super.reduce(state, action); diff --git a/src/ic/import-ic.js b/src/ic/import-ic.js index 5cd1f96..bde1d9a 100644 --- a/src/ic/import-ic.js +++ b/src/ic/import-ic.js @@ -30,7 +30,7 @@ class ImportICDialog extends React.Component { this.state = { name: '', - host: '', + websocketurl: '', uuid: '' }; } @@ -45,8 +45,8 @@ class ImportICDialog extends React.Component { uuid: this.state.uuid }; - if (this.state.host != null && this.state.host !== "" && this.state.host !== 'http://') { - data.host = this.state.host; + if (this.state.websocketurl != null && this.state.websocketurl !== "" && this.state.websocketurl !== 'http://') { + data.websocketurl = this.state.websocketurl; } this.props.onClose(data); @@ -61,7 +61,7 @@ class ImportICDialog extends React.Component { } resetState() { - this.setState({ name: '', host: 'http://', uuid: '' }); + this.setState({ name: '', websocketurl: 'http://', uuid: '' }); } loadFile(fileList) { @@ -81,7 +81,7 @@ class ImportICDialog extends React.Component { self.imported = true; self.setState({ name: _.get(ic, 'properties.name') || _.get(ic, 'rawProperties.name'), - host: _.get(ic, 'host'), + websocketurl: _.get(ic, 'websocketurl'), uuid: ic.uuid }); }; @@ -123,9 +123,9 @@ class ImportICDialog extends React.Component { this.handleChange(e)} /> - - Host - this.handleChange(e)} /> + + Websocket URL + this.handleChange(e)} /> diff --git a/src/ic/new-ic.js b/src/ic/new-ic.js index 93f1e83..134c62b 100644 --- a/src/ic/new-ic.js +++ b/src/ic/new-ic.js @@ -16,8 +16,7 @@ ******************************************************************************/ import React from 'react'; -import { FormGroup, FormControl, FormLabel } from 'react-bootstrap'; - +import { FormGroup, FormControl, FormLabel, FormCheck, OverlayTrigger, Tooltip} from 'react-bootstrap'; import Dialog from '../common/dialogs/dialog'; class NewICDialog extends React.Component { @@ -28,10 +27,11 @@ class NewICDialog extends React.Component { this.state = { name: '', - host: '', + websocketurl: '', uuid: '', type: '', category: '', + managedexternally: false, }; } @@ -42,33 +42,41 @@ class NewICDialog extends React.Component { name: this.state.name, type: this.state.type, category: this.state.category, - uuid: this.state.uuid + uuid: this.state.uuid, + managedexternally: this.state.managedexternally, }; - if (this.state.host != null && this.state.host !== "" && this.state.host !== 'http://') { - data.host = this.state.host; + if (this.state.websocketurl != null && this.state.websocketurl !== "" && this.state.websocketurl !== 'http://') { + data.websocketurl = this.state.websocketurl; } this.props.onClose(data); + this.setState({managedexternally: false}); } } else { this.props.onClose(); + this.setState({managedexternally: false}); } } handleChange(e) { + if(e.target.id === "managedexternally"){ + this.setState({ managedexternally : !this.state.managedexternally}); + } + else{ this.setState({ [e.target.id]: e.target.value }); + } } resetState() { - this.setState({ name: '', host: 'http://', uuid: this.uuidv4(), type: '', category: ''}); + this.setState({ name: '', websocketurl: 'http://', uuid: this.uuidv4(), type: '', category: '', managedexternally: false}); } validateForm(target) { // check all controls let name = true; let uuid = true; - let host = true; + let websocketurl = true; let type = true; let category = true; @@ -76,7 +84,7 @@ class NewICDialog extends React.Component { name = false; } - if (this.state.uuid === '') { + if (!this.state.managedexternally && this.state.uuid === '') { uuid = false; } @@ -88,14 +96,16 @@ class NewICDialog extends React.Component { category = false; } - this.valid = name && uuid && host && type && category; + this.valid = name && uuid && websocketurl && type && category; // return state to control if (target === 'name') return name ? "success" : "error"; if (target === 'uuid') return uuid ? "success" : "error"; - if (target === 'host') return host ? "success" : "error"; + if (target === 'websocketurl') return websocketurl ? "success" : "error"; if (target === 'type') return type ? "success" : "error"; if (target === 'category') return category ? "success" : "error"; + + return this.valid; } uuidv4() { @@ -107,27 +117,84 @@ class NewICDialog extends React.Component { } render() { + let typeOptions = []; + switch(this.state.category){ + case "simulator": + typeOptions = ["dummy","generic","dpsim","rtlab","rscad"]; + break; + case "controller": + typeOptions = ["kubernetes","villas-controller"]; + break; + case "gateway": + typeOptions = ["villas-node","villas-relay"]; + break; + case "service": + typeOptions = ["ems","custom"]; + break; + case "equipment": + typeOptions = ["chroma-emulator","chroma-loads","sma-sunnyboy","fleps","sonnenbatterie"]; + break; + default: + typeOptions =[]; + } return ( - this.onClose(c)} onReset={() => this.resetState()} valid={this.valid}> + this.onClose(c)} onReset={() => this.resetState()} valid={this.validateForm()}>
    + + An externally managed component will show up in the list only after a VILLAScontroller for the component type has created the component and cannot be edited by users} > + this.handleChange(e)}> + + + - Name + Required field } > + Name * + this.handleChange(e)} /> - - Host - this.handleChange(e)} /> + + Required field } > + Category of component * + + this.handleChange(e)}> + + + + + + + + + + Required field } > + Type of component * + + this.handleChange(e)}> + + {typeOptions.map((name,index) => ( + + ))} + + + + Websocket URL + this.handleChange(e)} /> - - Category of component (e.g. Simulator, Gateway, ...) - this.handleChange(e)} /> + + API URL + this.handleChange(e)} /> - - Type of component (e.g. RTDS, VILLASnode, ...) - this.handleChange(e)} /> + + Location + this.handleChange(e)} /> + + + + Description + this.handleChange(e)} /> diff --git a/src/scenario/scenario.js b/src/scenario/scenario.js index 9a11cdf..c19cfaa 100644 --- a/src/scenario/scenario.js +++ b/src/scenario/scenario.js @@ -44,6 +44,7 @@ import EditSignalMapping from "../signal/edit-signal-mapping"; import FileStore from "../file/file-store" import WidgetStore from "../widget/widget-store"; import { Redirect } from 'react-router-dom'; +import NotificationsDataManager from "../common/data-managers/notifications-data-manager"; class Scenario extends React.Component { @@ -494,6 +495,43 @@ class Scenario extends React.Component { // TODO do we need this if the dispatches happen in the dialog? } + signalsAutoConf(index){ + let componentConfig = this.state.configs[index]; + // determine apiurl of infrastructure component + let ic = this.state.ics.find(ic => ic.id === componentConfig.icID) + if(!ic.type.includes("villas-node")){ + let message = "Cannot autoconfigure signals for IC type " + ic.type + " of category " + ic.category + ". This is only possible for gateway ICs of type 'VILLASnode'." + console.warn(message); + + const SIGNAL_AUTOCONF_WARN_NOTIFICATION = { + title: 'Failed to load signal config for IC ' + ic.name, + message: message, + level: 'warning' + }; + NotificationsDataManager.addNotification(SIGNAL_AUTOCONF_WARN_NOTIFICATION); + return; + } + + let splitWebsocketURL = ic.websocketurl.split("/") + + AppDispatcher.dispatch({ + type: 'signals/start-autoconfig', + url: ic.apiurl+"/nodes", + socketname: splitWebsocketURL[splitWebsocketURL.length -1], + token: this.state.sessionToken, + configID: componentConfig.id + }); + + } + + uuidv4() { + return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) { + // eslint-disable-next-line + var r = Math.random() * 16 | 0, v = c === 'x' ? r : (r & 0x3 | 0x8); + return v.toString(16); + }); + } + /* ############################################## * File modification methods ############################################## */ @@ -534,12 +572,12 @@ class Scenario extends React.Component { console.warn("There is more than one CIM file selected in this component configuration. I will open them all in a separate tab.") } - let base_host = 'aaa.bbb.ccc.ddd/api/v2/files/' + let baseURL = 'aaa.bbb.ccc.ddd/api/v2/files/' for (let file of files) { // endpoint param serves for download and upload of CIM file, token is required for authentication let params = { token: this.state.sessionToken, - endpoint: base_host + String(file.id), + endpoint: baseURL + String(file.id), } // TODO start Pintura for editing CIM/ XML file from here @@ -621,6 +659,11 @@ class Scenario extends React.Component { editButton onEdit={index => this.setState({ editInputSignalsModal: true, modalConfigData: this.state.configs[index], modalConfigIndex: index })} /> + this.signalsAutoConf(index)} + /> this.getICName(icID)} /> { + AppDispatcher.dispatch({ + type: 'signals/autoconfig-loaded', + data: response, + token: token, + socketname: socketname, + configID: configID + }); + }).catch(error => { + AppDispatcher.dispatch({ + type: 'signals/autoconfig-error', + error: error + }) + }) + } + + saveSignals(nodes, token, configID, socketname){ + + if(nodes.length === 0){ + const SIGNAL_AUTOCONF_ERROR_NOTIFICATION = { + title: 'Failed to load nodes ', + message: 'VILLASnode returned empty response', + level: 'error' + }; + NotificationsDataManager.addNotification(SIGNAL_AUTOCONF_ERROR_NOTIFICATION); + return; + } + + let configured = false; + let error = false; + for(let nodeConfig of nodes){ + console.log("parsing node config: ", nodeConfig) + if(!nodeConfig.hasOwnProperty("name")){ + console.warn("Could not parse the following node config because it lacks a name parameter:", nodeConfig); + } else if(nodeConfig.name === socketname){ + if(configured){ + const SIGNAL_AUTOCONF_WARNING_NOTIFICATION = { + title: 'There might be a problem with the signal auto-config', + message: 'VILLASnode returned multiple node configurations for the websocket ' + socketname + '. This is a problem of the VILLASnode.', + level: 'warning' + }; + NotificationsDataManager.addNotification(SIGNAL_AUTOCONF_WARNING_NOTIFICATION); + continue; + } + // signals are not yet configured: + let index_in = 1 + let index_out = 1 + + if(!nodeConfig.in.hasOwnProperty("signals")){ + const SIGNAL_AUTOCONF_ERROR_NOTIFICATION = { + title: 'Failed to load in signal config ', + message: 'No field for in signals contained in response.', + level: 'error' + }; + NotificationsDataManager.addNotification(SIGNAL_AUTOCONF_ERROR_NOTIFICATION); + error = true; + } else{ + + // add all in signals + for(let inSig of nodeConfig.in.signals) { + + if (inSig.enabled) { + console.log("adding input signal:", inSig); + + let newSignal = { + configID: configID, + direction: 'in', + name: inSig.hasOwnProperty("name") ? inSig.name : "in_" + String(index_in), + unit: inSig.hasOwnProperty("unit") ? inSig.unit : '-', + index: index_in, + scalingFactor: 1.0 + }; + + AppDispatcher.dispatch({ + type: 'signals/start-add', + data: newSignal, + token: token + }); + + index_in++; + } + } + } + + if(!nodeConfig.out.hasOwnProperty("signals")){ + const SIGNAL_AUTOCONF_ERROR_NOTIFICATION = { + title: 'Failed to load out signal config ', + message: 'No field for out signals contained in response.', + level: 'error' + }; + NotificationsDataManager.addNotification(SIGNAL_AUTOCONF_ERROR_NOTIFICATION); + error=true; + }else { + + // add all out signals + + for (let outSig of nodeConfig.out.signals) { + + if (outSig.enabled) { + console.log("adding output signal:", outSig); + let newSignal = { + configID: configID, + direction: 'out', + name: outSig.hasOwnProperty("name") ? outSig.name : "out_" + String(index_out), + unit: outSig.hasOwnProperty("unit") ? outSig.unit : '-', + index: index_out, + scalingFactor: 1.0 + }; + + AppDispatcher.dispatch({ + type: 'signals/start-add', + data: newSignal, + token: token + }); + + index_out++; + } + } + } + + console.log("Configured", index_in-1, "input signals and", index_out-1, "output signals"); + configured=true; + } else { + console.log("ignoring node with name ",nodeConfig.name, " expecting ", socketname ) + } + + + } + + if(!error) { + const SIGNAL_AUTOCONF_INFO_NOTIFICATION = { + title: 'Signal configuration loaded successfully.', + message: '', + level: 'info' + }; + NotificationsDataManager.addNotification(SIGNAL_AUTOCONF_INFO_NOTIFICATION); + } + + } + } export default new SignalsDataManager() From 797300b2bcc1843b4da5b8756c9e3f2c8c16a3f9 Mon Sep 17 00:00:00 2001 From: irismarie Date: Tue, 17 Nov 2020 16:47:09 +0100 Subject: [PATCH 389/391] duplicate widget via context menu, closes #184 --- src/dashboard/dashboard.js | 14 ++++++++++++++ src/widget/widget-context-menu.js | 7 +++++++ 2 files changed, 21 insertions(+) diff --git a/src/dashboard/dashboard.js b/src/dashboard/dashboard.js index 60e271a..032791d 100644 --- a/src/dashboard/dashboard.js +++ b/src/dashboard/dashboard.js @@ -268,6 +268,19 @@ class Dashboard extends Component { this.setState({ editModal: true, modalData: widget, modalIndex: index }); }; + duplicateWidget(widget) { + let widgetCopy = JSON.parse(JSON.stringify(widget)); + delete widgetCopy.id; + widgetCopy.x = widgetCopy.x + 50; + widgetCopy.y = widgetCopy.y + 50; + + AppDispatcher.dispatch({ + type: 'widgets/start-add', + token: this.state.sessionToken, + data: widgetCopy + }); + }; + startEditFiles() { let tempFiles = []; this.state.files.forEach(file => { @@ -505,6 +518,7 @@ class Dashboard extends Component { index={parseInt(widgetKey, 10)} widget={this.state.widgets[widgetKey]} onEdit={this.editWidget.bind(this)} + onDuplicate={this.duplicateWidget.bind(this)} onDelete={this.deleteWidget.bind(this)} onChange={this.widgetChange.bind(this)} diff --git a/src/widget/widget-context-menu.js b/src/widget/widget-context-menu.js index 197abf0..fd8f5c5 100644 --- a/src/widget/widget-context-menu.js +++ b/src/widget/widget-context-menu.js @@ -27,6 +27,12 @@ class WidgetContextMenu extends React.Component { } }; + duplicateWidget = event => { + if (this.props.onDuplicate != null) { + this.props.onDuplicate(this.props.widget); + } + }; + deleteWidget = event => { if (this.props.onDelete != null) { this.props.onDelete(this.props.widget, this.props.index); @@ -92,6 +98,7 @@ class WidgetContextMenu extends React.Component { const ContextMenu = () => ( Edit + Duplicate Delete From efac5b163304325a3723eb4f7c48f96fbdb05e2e Mon Sep 17 00:00:00 2001 From: irismarie Date: Tue, 17 Nov 2020 16:52:08 +0100 Subject: [PATCH 390/391] fix: duplicate widget in edit mode too, #184 --- src/dashboard/dashboard.js | 1 + 1 file changed, 1 insertion(+) diff --git a/src/dashboard/dashboard.js b/src/dashboard/dashboard.js index 032791d..1bd4002 100644 --- a/src/dashboard/dashboard.js +++ b/src/dashboard/dashboard.js @@ -544,6 +544,7 @@ class Dashboard extends Component { index={parseInt(widgetKey, 10)} widget={this.state.widgets[widgetKey]} onEdit={this.editWidget.bind(this)} + onDuplicate={this.duplicateWidget.bind(this)} onDelete={this.deleteWidget.bind(this)} onChange={this.widgetChange.bind(this)} From b4a5217b162ebc9331a58dd3cb0b4de769453ba2 Mon Sep 17 00:00:00 2001 From: Sonja Happ Date: Thu, 19 Nov 2020 15:01:43 +0100 Subject: [PATCH 391/391] CI: use kaniko to build and deploy docker image --- .gitlab-ci.yml | 39 ++++++++++++++++----------------------- 1 file changed, 16 insertions(+), 23 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 056f91d..bd6b6e3 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1,7 +1,7 @@ variables: GIT_SUBMODULE_STRATEGY: normal - DOCKER_IMAGE_DEV: node:12.2 - DOCKER_IMAGE: ${CI_REGISTRY}/acs/public/villas/web + DOCKER_TAG: ${CI_COMMIT_SHORT_SHA} + DOCKER_IMAGE: ${CI_REGISTRY_IMAGE} cache: untracked: true @@ -18,39 +18,32 @@ stages: build: stage: build + image: node:12.2 before_script: - mkdir -p build script: - npm install - npm run build - image: ${DOCKER_IMAGE_DEV} artifacts: paths: - build/ expire_in: 1 week - tags: - - docker -#test: -# stage: test -# script: -# - npm test -# image: ${DOCKER_IMAGE_DEV} -# dependencies: -# - build -# tags: -# - docker - -deploy:docker: +deploy: stage: deploy - before_script: - - docker login -u ${CI_REGISTRY_USER} -p ${CI_REGISTRY_PASSWORD} ${CI_REGISTRY} + image: + name: gcr.io/kaniko-project/executor:debug + entrypoint: [ "" ] script: - - docker build -t ${DOCKER_IMAGE}:${CI_COMMIT_SHORT_SHA} . - - docker push ${DOCKER_IMAGE}:${CI_COMMIT_SHORT_SHA} - tags: - - shell - - linux + - mkdir -p /kaniko/.docker + - echo "{\"auths\":{\"${CI_REGISTRY}\":{\"username\":\"${CI_REGISTRY_USER}\",\"password\":\"${CI_REGISTRY_PASSWORD}\"}}}" > /kaniko/.docker/config.json + - /kaniko/executor + --context ${CI_PROJECT_DIR} + --dockerfile ${CI_PROJECT_DIR}/Dockerfile + --destination ${DOCKER_IMAGE}:${DOCKER_TAG} + --snapshotMode=redo + --cache=true + --cache-ttl=12h only: refs: - master